Страница 14 из 18

Новый редактор для создания пользовательских блоков.

Добавлено: 26 янв 2023, 22:08
CTAPuK
ecoins писал(а): 26 янв 2023, 21:29
CTAPuK писал(а): 26 янв 2023, 20:18 Phazz, да, совершенно верно. Вы всё правильно поняли.
Не вполне понял задачу, но возможно Вам могут оказаться полезными "приемчики", которые мы наработали при создании блоков FLProg средствами профессионального редактора.
1. ... в зависимости от настройки изменяются кол-во входов с выводимыми переменными с выбором типов этих переменных и выбора режима вывода(по изменению одной из переменных, периодически и т.п.)...
2....В главном блоке находится таблица указателей на объекты данных - обычно мы задаем 8-16 объектов - указатели на них занимают немного места - кол-во объектов х4(байт). Сами объекты данных могут быть весьма объемные, но создаются они в проекте ТОЛЬКО по мере необходимости. ...
Спасибо, у меня так и сделано, по первому варианту.

П.С. Я Вам в личку вопрос отправил, чтобы не захламлять тему. Если будет время, посмотрите.

Новый редактор для создания пользовательских блоков.

Добавлено: 26 янв 2023, 22:26
CTAPuK
Phazz писал(а): 26 янв 2023, 21:53 [ref]CTAPuK[/ref], порядок в каком размещается код в функции...
[ref=#808080]Phazz[/ref], порядок формируем мы сами и относительно вольны в его формировании. Единственное, он должен соответствовать правилам и логике.
Phazz писал(а): 26 янв 2023, 21:53 ... Ну в принципе пример который был приведен мной ранее вам подходит.
Если Вы имеете ввиду пример с 2-мя ядрами, то я не нашел там реализацию того, как можно вставлять в общую функцию код из функции экземпляра с переменными экземпляра. Вы сами на это обращали внимание: "каждый добавленный блок в проект дописывает в общую функцию свой кусочек кода?".

Или Вы про другое говорите?

Новый редактор для создания пользовательских блоков.

Добавлено: 27 янв 2023, 07:28
aidar_i
CTAPuK писал(а): 26 янв 2023, 21:27 Так как при генерации кода между кодом общей функции и кодом функции каждого экземпляра (то есть между этими фигурными скобками) вклиниваются функции из других ПБ.
Не давайте вклиниваться.
Все другие блоки располагайте вне этого ПБ, соединяйте с ним через клеммы, переменные.

Новый редактор для создания пользовательских блоков.

Добавлено: 27 янв 2023, 17:53
Dryundel
aidar_i писал(а): 25 янв 2023, 06:23 Вы хотите получить это?
...
Вставка функцию в функцию.flp
Это работать не будет. Даже не скомпилируется.

Внутри функции нельзя объявить другую функцию. Можно только вызвать.
Соответственно можно в главном блоке сделать вызовы других функций, а сами функции создать отдельно.

И да, не забывайте при объявлении функции указывать ее тип (int, float, ... или void)

Отправлено спустя 4 минуты 50 секунд:
CTAPuK писал(а): 26 янв 2023, 21:27 Так как при генерации кода между кодом общей функции и кодом функции каждого экземпляра (то есть между этими фигурными скобками) вклиниваются функции из других ПБ.
Очередность вставки блоков в проект влияет на очередность компиляции (в пределах платы), независимо от расположения блоков на плате. Включите нумерацию блоков.
Функции из других блоков не вклинятся если они размещены на других платах.

Отправлено спустя 11 минут 11 секунд:
Phazz писал(а): 26 янв 2023, 21:53 Ну в принципе пример который был приведен мной ранее вам подходит.
Не подходит, применительно к функции. Причина выше.

Новый редактор для создания пользовательских блоков.

Добавлено: 27 янв 2023, 18:52
rw6cm
Соглашусь с постом выше.
[ref]CTAPuK[/ref], Вы бы выложили реальный код, и блок в котором что то не получается.
Как вариант из того что понял из темы.
Вариант с функцией.flp

Новый редактор для создания пользовательских блоков.

Добавлено: 27 янв 2023, 19:37
artemka19
у меня так в jeeui2: искусственнно завершаем луп в первом блоке, подсовывая закрывающую скобку и теперь вытаскивая новые блоки на плату - мы наполняем кодом создаваемую функцию.


[spoiler]
void loop {
//тут начало loop
.
.
.
.
//эта функция должна крутиться в лупе чтобы работал остальной код находящийся на самодельной плате-функции
echo();
//т.к. мы искусственоо завершаем луп, то при использовании чужих блоков (в которых имеется код в секции "Конец секции Луп"),
//этот самый код попадает теперь в функцию empty(), поэтому чтоб этот чужлй код тоже работал мы помещаем empty() внутрь лупа
empty();
// искуственно заканчиваем loop
}
// и ниже собираем функции из блоков для веба
void echo()
{
if (test001)page001=ESPControllerWifi_tspWebServer.arg(0); // выясняем номер страницы с которой пришел запрос
if (test001)zpt=0; // это запятая при сборке json
if (test001)ESPControllerWifi_tspWebServer.setContentLength(CONTENT_LENGTH_UNKNOWN); // сообщаем браузеру что длина ответа неизвестна
if (test001)ESPControllerWifi_tspWebServer.chunkedResponseModeStart(200, "application/json");//шлем респонс ответ=200, сообщаем что тип контента "application/json"
if (test001)ESPControllerWifi_tspWebServer.sendContent(nachalo_json());//начало сборки json
/*---*/


//тут НИЖЕ коды блоков вытащенных на плату (т.е. этот код ВНУТРИ функции - вытаскивая новые блоки мы собираем код в этой функции)

//БЛОК1
if ((test001)&&(page001=="0"))ESPControllerWifi_tspWebServer.sendContent(nadpis(0, "59565207", 0, 16, (String("")),(String("")), "n", "n",0, 0));
/*---*/


//БЛОК2 передаем окончание json строки
if (test001)ESPControllerWifi_tspWebServer.sendContent(finish_make_json());
// сообщаем браузеру что закончили передачу фрагментированного ответа
if (test001)ESPControllerWifi_tspWebServer.sendContent("");
if (test001)test001=0;


/*
теперь лайфхаки :)
завершаем функцию по сборке общей функции
*/
}



// пустая функция - обманываем ардуино иде
void empty()
{
// подсовываем Ардуино IDE недостающую открывающую " { "
/*---*/



// это "Последний блок"
/*---*/
}
[/spoiler]

Отправлено спустя 5 минут 32 секунды:
по аналогии с незакрывающейся скобкой в сетапе (как сделано в гайвер веб)


ну и желательно это делать в конце проекта

Отправлено спустя 9 минут 5 секунд:
[ref=#ff8000]rw6cm[/ref],
твой вариант не прокатит: в проекте возникает хронологическая зависимость от порядка вытаскивания блоков.

в jeeui2 же, например, нет этой особенности хронологической зависимости при сборке функции)))

Новый редактор для создания пользовательских блоков.

Добавлено: 27 янв 2023, 21:39
CTAPuK
Благодарю всех, кто принял участие в обсуждении проблемы.
Наверное самый простой рабочий вариант - это вариант описанный [ref]artemka19[/ref].

В сухом остатке имеем.
Что называется правильного решения, то есть решения средствами самого редактора и внутри редактора, на сегодняшний день нет. Пока это объективная реальность, исходя из которой и пишем свои ПБ. Но есть метод "костыль", как его называют, который состоит в расположении закрывающего блока ПБ с "}" после основного ПБ. И лучше, если эта комбинация основной-закрывающий, располагается на отдельной плате, что собственно у меня и сделано.
Но задавая свой вопрос я исходил из того, что может быть кто-то реализовал это другими, более изящными способами.

Новый редактор для создания пользовательских блоков.

Добавлено: 27 янв 2023, 21:58
Phazz
[ref]CTAPuK[/ref], да, в редакторе это не сделать. Сергей вроде обещал решение, но видимо пока руки не доходят )

Новый редактор для создания пользовательских блоков.

Добавлено: 28 янв 2023, 13:35
aidar_i
Ещё раз обращусь Сергею.
support, в следующей версии программы, сделайте, пожалуйста, в обоих редакторах ПБ, чтобы очерёдность расположения кода в сетап, не зависела от порядка вытаскивания блоков, а зависела от расположения блоков в проекте, аналогично loop.

Новый редактор для создания пользовательских блоков.

Добавлено: 28 янв 2023, 14:00
Phazz
Это опять же костыль. Всё-таки нужна общая функция в которую каждый блок мультиблока мог дописывать свой код, а порядок кода зависел от расположения в проекте.

Новый редактор для создания пользовательских блоков.

Добавлено: 28 янв 2023, 14:33
Dryundel
aidar_i писал(а): 28 янв 2023, 13:35 Ещё раз обращусь Сергею.
support, в следующей версии программы, сделайте, пожалуйста, в обоих редакторах ПБ, чтобы очерёдность расположения кода в сетап, не зависела от порядка вытаскивания блоков, а зависела от расположения блоков в проекте, аналогично loop.
Предполагаю, что кому то удобней порядок компиляции в соответствии с порядком вытаскивания блоков.
Возможно была бы удобна возможность изменять нумерацию блоков в проекте.
Или перераспределение нумерации в соответствии с расположением. (дополнительная кнопка перераспределения нумерации).
Это в основном для кода в loop.

Теперь касаемо setup.
[ref=#ff8000]aidar_i[/ref], а что если требуется выполнение кода блока в loop согласно расположению блоков в проекте, а код блока setup вставлялся вначале?
Вообще для этого в редакторе Pro существуют разделы "Начало секции Setup", "Конец секции Setup". Кроме того, Есть общий код мультиблока, код блока и код каждого экземпляра, что тоже влияет на расположение кода. В принципе, мне этого всегда хватало.

По моему мнению, расположение кода setup блока, не должно зависеть от расположения блока в проекте, в отличии от кода loop. Это два независимых друг от друга момента.

Однако есть один нелогичный момент. Если код loop блока подчиняется очередности плат в проекте, то код setup блока компилируется в соответствии с очередностью вытаскивания блока и расположение плат на это не влияет. Возможно этот момент и стоило бы поправить.

Новый редактор для создания пользовательских блоков.

Добавлено: 28 янв 2023, 15:18
Naladchik
Dryundel писал(а): 28 янв 2023, 14:33 По моему мнению, расположение кода setup блока, не должно зависеть от расположения блока в проекте, в отличии от кода loop.
Есть случаи, когда порядок инициализации блоков (а она как раз и делается в Setup) так же имеет значение.
Если расположение кода будет зависеть от расположения блока - порядок инициализации будет контролируемым.
Сейчас же порядок инициализации можно определить или костылями или сносом блоков и добавлением их в проект в нужном порядке.
(в мультиблоке ESPUI реально поизвращаться пришлось чтоб обойти этот момент).
Dryundel писал(а): 28 янв 2023, 14:33 Возможно этот момент и стоило бы поправить.
Давно Сергея прошу об этом.
С Declare такая же ситуация.

Новый редактор для создания пользовательских блоков.

Добавлено: 28 янв 2023, 15:36
Dryundel
Naladchik писал(а): 28 янв 2023, 15:18 Есть случаи, когда порядок инициализации блоков (а она как раз и делается в Setup) так же имеет значение.
Это конечно факт. Однако порядок инициализации в setup и выполнение в loop не взаимосвязанные вещи и то что инициализируется в setup раньше, в loop может выполняться позже.

Новый редактор для создания пользовательских блоков.

Добавлено: 28 янв 2023, 20:35
Naladchik
Dryundel писал(а): 28 янв 2023, 15:36 ... и то что инициализируется в setup раньше, в loop может выполняться позже.
Да ради бога, лишь бы порядок выполнения участков кода, не важно где Setup или Loop, был бы прогнозируемым и поддавался изменениям без глобального перекраивания проекта, только смещением блоков. А это можно получить только если порядок добавления кода в секции зависит от порядка компиляции.

Новый редактор для создания пользовательских блоков.

Добавлено: 29 янв 2023, 10:11
Dryundel
Naladchik писал(а): 28 янв 2023, 20:35 Да ради бога, лишь бы порядок выполнения участков кода, не важно где Setup или Loop, был бы прогнозируемым и поддавался изменениям без глобального перекраивания проекта, только смещением блоков.
Вы даже не попытались понять что я написал.
Ок, Предположим я хочу чтобы в Loop код второго блока выполнялся после первого, а в setup надо чтобы код второго блока стоял раньше первого.
Вопрос - По вашей логике, куда в проекте я должен сместить второй блок относительно первого?

Новый редактор для создания пользовательских блоков.

Добавлено: 13 фев 2023, 22:59
JonyBest
Доброго времени! Подскажите как использовать вход String в редакторе, чтобы в setup в коде получилось ("Вход"), а не (String("Вход")).
Беда в том, что нужно значение типа constchar. А str.c_str() работает только в Loop.

Новый редактор для создания пользовательских блоков.

Добавлено: 14 фев 2023, 01:21
Dryundel
[ref]JonyBest[/ref], а что в итоге должно получиться? Какой код?

Вход блока это полюбому переменная, а не константа. Иначе зачем тогда вход.
Может через параметр сделать? Там это без проблем.

Новый редактор для создания пользовательских блоков.

Добавлено: 14 фев 2023, 05:50
ecoins
JonyBest писал(а): 13 фев 2023, 22:59 Доброго времени! Подскажите как использовать вход String в редакторе, чтобы в setup в коде получилось ("Вход"), а не (String("Вход")).
Беда в том, что нужно значение типа constchar. А str.c_str() работает только в Loop.
Действительно, блоки FLProg в режиме setup() не принимают входных данных.
Это обсуждалось как-то с разработчиком. Ведь в этом случае пришлось бы два раза вставлять один и тот же код в программу.
И наверное это правильно.
Вставлять код в setup не лучшая технология, это исключает возможность программного перезапуска программы.
Мы подобные присвоения всегда делаем в setup.
Для некоторых переменных это организовывается в первой плате которая запускается по условию переменной initParam.

Новый редактор для создания пользовательских блоков.

Добавлено: 14 фев 2023, 06:54
aidar_i
Я тоже в loop запускаю со входом.
Если в loop код выполняется только один раз, это равносильно setup. Для этого применяется переменная bool, так называемый "флаг".
Например:
В DeclareSection
bool flag = 1;
В LoopSection
if(flag) { flag = 0;
Код
}

Код будет выполняться при запуске программы один раз, и входы будут работать.

Новый редактор для создания пользовательских блоков.

Добавлено: 14 фев 2023, 07:22
JonyBest
Dryundel писал(а): 14 фев 2023, 01:21 а что в итоге должно получиться? Какой код?
Хотелось всего лишь в код device.setName("Name"); параметр char "Name" задать через вход. Через параметр всё работает, но не удобно...