☰ Содержание
Ветка «Элемент кода»




Данная ветка служит для непосредственного создания элемента кода блока.




Так же этой ветке задаются имя элемента кода и при необходимости условие его вставки в код проекта.

Для выбора условия вставки доступны три варианта.




В случае выбора варианта «Нет условия» код, безусловно, вставляется в скетч при необходимости.

В остальных двух случаях необходимо выбрать условие вставки кода в скетчь.

Это делается с помощью кнопки «Выбрать условие»(2). При этом открывается окно со списком условий доступных для данного элемента кода.




При выбранном условии с помощью кнопки «Перейти на условие»(1), можно напрямую перейти на ветку настройки выбранного условия.

При выборе варианта «Условие истинно» код будет вставляться в скетчь, только если логическое выражение условия возвращает True. Соответственно если выбран вариант «Условие ложно» код будет вставляться в скетчь, только если логическое выражение условия возвращает False.

Тоолбар редактора кода зависит от расположения данного элемента кода.

Рассмотрим возможные варианты.


Общий код мультиблока, общий код группы блоков, общий код блока - секция Declare.




При таком расположении элемента кода в тулбаре присутствуют кнопки «Вставить UUID»(1), «Вставить тэг параметра»(2) и чек бокс «Запретить компилятору видеть #Include»(3).

При нажатии на кнопку «Вставить UUID»(1) открывается окно выбора идентификатора.




«Уникальное число» - при каждом выборе данного идентификатора, будет генерироваться уникальное число, и вставляться в код в место расположения курсора.

«Идентификатор мультиблока» - при выборе этого идентификатора в код вставляется тэг . При компиляции проекта вместо него вставится ID мультиблока, который будет одинаков во всём коде, входящем в данный мультиблок.

При нажатии на кнопку «Вставить тэг параметра»(2) открывается окно выбора тэга.




После выбора тэга от вставляется в позицию курсора в редакторе.




Чек бокс «Запретить компилятору видеть #Include»(3) присутствует в тулбаре редактора элемента кода только при расположении этого элемента в секции Declare. Он предназначен для управления компилятором проекта. Если его не отметить то компилятор соберёт все строки #Include из секций Declare всех экземпляров блоков и вставит их в код скетча в том месте, которое посчитает нужным, подчиняясь своей логикой. Установка данного чек бокса сообщает компилятору, что в данном элементе кода нельзя трогать строку #Include и необходимо вставить её в скетчь в том месте, где её прописал разработчик блока. В некоторых случаях это необходимо. Например, где включение одной библиотеки должно производиться только после включения другой, от которой первая зависит. Но в этом случае возможно дублирование подключение библиотек. Это не страшно конечно, но как говорится – «не кошерно».

Общий код мультиблока, общий код группы блоков, общий код блока – остальные секции.




При таком расположении элемента кода в тулбаре присутствуют кнопки «Вставить UUID»(1), «Вставить тэг параметра»(2) и «Вставить тэг временной переменной»(3).

Работу кнопок «Вставить UUID»(1) и «Вставить тэг параметра»(2) мы рассмотрели выше.

При нажатии кнопки «Вставить тэг временной переменной»(3) открывается окно выбора типа временной переменной.




После выбора тега, он вставляется в редактор в месторасположение курсора.

Теперь рассмотрим что такое временная переменная. Это такая переменная, которая может использоваться блоком для промежуточных расчётов. При компиляции проекта компилятор спрашивает у всех блоков (как стандартных, так и пользовательских) временная переменная какого типа им нужна. После этого при необходимости он создаёт по ОДНОЙ переменной каждого запрошенного типа. Вот как раз имя этой переменной и вставится в скетчь при компиляции вместо этого тэга.

Обратите внимание, что работа с этой переменной должна начаться (запись в неё) и закончится в пределах одного участка кода. Поскольку блок, компилируемый после данного блока, может записать в эту переменную другие значения.


Пример использования временной переменной.

Блок вывода на экран значения из переменной.

Данный блок в зависимости от типа выбранной переменной преобразует значение этой переменной в String и потом выводит ее на экран. В этом блоке в секции Loop кода каждого инстанса в месте вставки блока созданы 4 элемента кода.

Первые три – условные и вставляются в код в зависимости от типа выбранной переменной.

В этих элементах кода во временную переменную типа String записывается сконвертированное значение выбранной переменной.








В четвёртом элементе кода мы значение данной временной переменной выводим на экран. Данный элемент безусловный.




В результате компиляции при выбранной переменной типа Boolean получим такой код.

if (_gtv1)
 {
 _tempVariable_String = "Нет";
 }
else  {
 _tempVariable_String = "Да";   }
if ((0))
 {
 myOLED.print(_tempVariable_String, 0, 0);
  }




Код каждого экземпляра – секция Declare




При таком расположении элемента кода в тулбаре присутствуют кнопки «Вставить UUID»(4), «Вставить тэг параметра»(1) , «Вставить тэг входа»(5) , «Вставить тэг выхода»(6) и чек бокс «Запретить компилятору видеть #Include»(2).

Работу кнопки «Вставить тэг параметра»(1) и чек бокса «Запретить компилятору видеть #Include»(2) мы рассмотрели выше.

При нажатии кнопки «Вставить UUID»(4) при таком расположении элемента кода открывается расширенное окно выбора идентификатора.




В этом окне появился новый пункт - «Идентификатор экземпляра». При выборе этого пункта в место нахождения курсора в редакторе кода, вставляется тэг . При компиляции блока в проекте вместо него вставляется ID конкретного экземпляра блока.



Пример

В секции Declare кода каждого инстанса объявляем переменную.




А в секции Loop каждого инстанса в месте вставки блока записываем в неё значение.




В проект вставляем два экземпляра данного блока




В результате компиляции получаем код:

Секция Declare

int Var_176673836 ;
int Var_127258073 ;


Секция Loop место вставки первого экземпляра.

Var_176673836 =200;

Секция Loop место вставки второго экземпляра.

Var_127258073 =200;




При нажатии кнопок «Вставить тэг входа»(5) , «Вставить тэг выхода»(6) открывается окно выбора соответствующего тэга из списка входов или выходов данного блока.




После выбора необходимого тэга он вставляется в место положения курсора в редакторе кода.

Рассмотрим работу тэга входа.

В отличие от старого (Basic) редактора пользовательских блоков в этом редакторе для входов переменные не создаются. Это сделано для экономии памяти микроконтроллера. Вместо тэга входа в код вставляется логическое выражение, полученное с входа заключённое в скобки. В большинстве случаев это имя переменой выхода блока подключенного к данному входу.

Например, рассмотрим такой код




При подключении на вход константы получим следующий результат.




if ((50) ==20)
 {
 // Какой то код
 }


Если подадим на вход, выход блока с переменной выхода, получим следующее.




if (((_d18x2x1O)) ==20)
 {
 // Какой то код
  }


Но на входе возможна и математика, которая для экономии памяти рассчитывается на лету.

Например, при такой схеме получим более сложный вариант.




if ((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))) ==20)
 {
 // Какой то код
 }


При данном использовании входа в блоке это не критично. Но возможен вариант, когда вход используют в качестве параметра какой-то функции в библиотеке. Далеко не все библиотеки «любят» когда им в качестве параметра подсовывают выражение.

Например, перепишем код блока.




Получим результат

Out_238022926_164280164 = abstractCrazyFunction((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))));

Функция abstractCrazyFunction скорее всего, заругается, когда получит в качестве параметра вот такое: ((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))).

Поэтому когда Вы не уверены что использование входа будет корректно для любых данных приходящих на вход, рекомендую использовать такую конструкцию.




Тогда результат компиляции удовлетворит любую функцию.

_tempVariable_int = (((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L)));
Out_238022926_164280164 = abstractCrazyFunction(_tempVariable_int);
Out_142227144_164280164 = abstractCrazyFunction1(_tempVariable_int);


Код каждого блока – остальные секции.




Здесь присутствуют кнопки, работу которых мы рассмотрели ранее.