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

Появился в версии 7.

Создаем свой блок. Вопросы, помощь знатоков.
JonyBest
Сержант
Сообщения: 161
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 19
Откуда: Близко к Ставрополю
Имя: Евгений

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

#261

Сообщение JonyBest » 14.01.2023{, 18:46}

Доброго времени!
Начал осваивать новый редактор для создания пользовательских блоков. Столкнулся с проблемой.
При создании блока со String входом
[/code]
В описании библиотеки:

Код: Выделить всё

setValue(constchar*value)
PARAMETERS
value – String representation of the sensor’s value.
Arduino IDE формирует код

Код: Выделить всё

valve190208383.setValue(_swi1);
Получаю ошибку:

Код: Выделить всё

error: no matching function for call to 'HASensor::setValue(String)'
             valve190208383.setValue(_swi1);
Если переменную входа _swi1 заменить на "любой текст", то компилируется без ошибок, блок работает.
При использовании других типов данных в других блоках - ошибок нет. Что делаю не так?

ecoins
Полковник
Сообщения: 2126
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 354
Откуда: Шатура
Имя: Энвер

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

#262

Сообщение ecoins » 14.01.2023{, 19:09}

Интересно. Выложите какой Ваш пользовательский блок порождает эту проблему и мы попробуем поисследовать.

JonyBest
Сержант
Сообщения: 161
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 19
Откуда: Близко к Ставрополю
Имя: Евгений

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

#263

Сообщение JonyBest » 14.01.2023{, 22:21}

ecoins писал(а):
14.01.2023{, 19:09}
попробуем поисследовать.
Благодарю! Поражаюсь, как Вас хватает и свои проекты вести и другим помогать :)

Не получается этот сенсор добавить.
Но думается дело в другом. Я уже через отдельную переменную пробовал

Код: Выделить всё

string ValueSensor<INS.UUID> = <Вход>;
, тоже ошибка компиляции.
Последний раз редактировалось JonyBest 15.01.2023{, 20:12}, всего редактировалось 2 раза.

Аватара пользователя
Phazz
Полковник
Сообщения: 2216
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 292
Откуда: Сургут
Имя: Анатолий

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

#264

Сообщение Phazz » 14.01.2023{, 22:23}

JonyBest, так там должен быть char а не string

Отправлено спустя 4 минуты 17 секунд:

Код: Выделить всё

valve190208383.setValue(_swi1.c_str()); 
Попробуйте так

Отправлено спустя 4 минуты 9 секунд:
JonyBest писал(а):
14.01.2023{, 22:21}
получается этот сенсор добавить

А вон оно что, вы задумали интегрировать с HA? Интересная тема.

JonyBest
Сержант
Сообщения: 161
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 19
Откуда: Близко к Ставрополю
Имя: Евгений

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

#265

Сообщение JonyBest » 14.01.2023{, 23:14}

Phazz писал(а):
14.01.2023{, 22:32}
так там должен быть char а не string
Спасибо! Всё получилось.
Phazz писал(а):
14.01.2023{, 22:32}
А вон оно что, вы задумали интегрировать с HA? Интересная тема.
Это здорово снизит порог входа для работы с HA. Получается легкого и просто пробросить свои значения в HA и управлять ими.
СпойлерПоказать
Скриншот 14-01-2023 230637.jpg

CTAPuK
Рядовой
Сообщения: 54
Зарегистрирован: 06.12.2020{, 20:41}
Репутация: 8
Имя: Михаил

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

#266

Сообщение CTAPuK » 21.01.2023{, 15:20}

Phazz писал(а):
27.02.2022{, 19:39}
А вот чего действительно иногда не хватает, так это вставки кода из блока в общую функцию в мультиблоке
Кто-нибудь решил эту проблему вставки кода из "функции каждого экземпляра" в "функцию общего блока", если заведомо неизвестно какое кол-во однотипных вставок потребуется (вставки различаются переменными индексами).

artemka19
Лейтенант
Сообщения: 471
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 194
Откуда: Питер
Имя: Артем

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

#267

Сообщение artemka19 » 21.01.2023{, 16:00}

CTAPuK, только через костыли.
Пример реализации можно посмотреть в jeeui2

JonyBest
Сержант
Сообщения: 161
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 19
Откуда: Близко к Ставрополю
Имя: Евгений

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

#268

Сообщение JonyBest » 22.01.2023{, 21:49}

artemka19 писал(а):
21.01.2023{, 16:00}
Пример реализации можно посмотреть в jeeui2
Тоже столкнулся с данной проблемой. Можно чуть расписать алгоритм, не всё понял...

Аватара пользователя
Phazz
Полковник
Сообщения: 2216
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 292
Откуда: Сургут
Имя: Анатолий

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

#269

Сообщение Phazz » 22.01.2023{, 23:41}

viewtopic.php?p=116871#p116871
Вот тут конкретный пример

CTAPuK
Рядовой
Сообщения: 54
Зарегистрирован: 06.12.2020{, 20:41}
Репутация: 8
Имя: Михаил

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

#270

Сообщение CTAPuK » 24.01.2023{, 20:36}

Спасибо всем, кто откликнулся.
Но, к сожалению, я не нашел решение вставки кода из функции каждого экземпляра в функцию общего блока.

artemka19, пользуюсь Ваши блоками jeeui2 v.4.09. Не нашел в них методу реализации вышеописанной вставки. Допускаю, что плохо искал, поэтому прошу указать конкретный блок из Вашего мутиблокового пакета, где это реализовано.

Phazz, в Вашем примере использован старый редактор, а потому в нем нет кода для общего блока и кода для блока каждого экземпляра. Если не затруднит, поясните как увязать пример с моим вопросом о многократной вставки из кода экземпляра в общий код.

Допускаю, что я сформулировал свой вопрос не достаточно конкретно, поэтому повторюсь.
Другими словами я столкнулся с проблемой вставки из кода функции для блока каждого экземпляра в код функции для общего блока. Проблема решается тривиально, если ставка требуется только одна. Но если этих вставок 2-3 или 15, то проблема для меня на текущий момент не решена. Кроме словесного описания прилагаю графическую иллюстрацию своего вопроса для более детального описания.
Пока использую ручной перенос в IDE, что не сильно удобно.
Вложения
Блок-схема.jpg
Блок-схема.jpg (21.76 КБ) 243 просмотра

Аватара пользователя
Phazz
Полковник
Сообщения: 2216
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 292
Откуда: Сургут
Имя: Анатолий

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

#271

Сообщение Phazz » 24.01.2023{, 21:10}

CTAPuK, а тут не имеет значения какой редактор. Главное сам принцип реализации. Закрываем луп и открываем функцию

Отправлено спустя 1 минуту 17 секунд:
а покажите пример кода

ecoins
Полковник
Сообщения: 2126
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 354
Откуда: Шатура
Имя: Энвер

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

#272

Сообщение ecoins » 24.01.2023{, 21:40}

CTAPuK писал(а):
24.01.2023{, 20:36}
Кроме словесного описания прилагаю графическую иллюстрацию своего вопроса для более детального описания.
Пока использую ручной перенос в IDE, что не сильно удобно.
Путь реализации сформулированной задачи средствами FLProg не единственный.
Для разовых случаев да.
Можно (и так пожалуй правильнее) сделать функцию на C++, оформить её как библиотеку и обращаться из FLProg к ней.

CTAPuK
Рядовой
Сообщения: 54
Зарегистрирован: 06.12.2020{, 20:41}
Репутация: 8
Имя: Михаил

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

#273

Сообщение CTAPuK » 24.01.2023{, 23:57}

Phazz писал(а):
24.01.2023{, 21:11}
Закрываем луп и открываем функцию
В простейшем случае это понятно.
Phazz писал(а):
24.01.2023{, 21:11}
а покажите пример кода
Да собственно вот пример простейшего кода.
Крутится loop, который вызывает функцию общего блока FuncCommon().
В свою очередь FuncCommon() вызывает FuncSingle(), которая имеет следующий вид:

Код: Выделить всё

FuncSingle()
{
...
...
Index1=random(0, 25);
Index2=Index1 + random(25, 50);
Index3=Index2 * random(50, 75);
Index4=Index3 / random(75, 100);
...
...
}
Заведомо знать кол-во Index'ов невозможно, так как это задаваемый в пользовательском блоке параметр, который зависит от количества блоков, используемых в скетче. Поэтому функция общего блока FuncCommon() тоже не догадывается сколько этих Index'ов используется в каждом конкретном случае. Об этом знают только блоки каждого экземпляра, в том числе FuncSingle().

* Причём имена Index1...Index4 это имена переменных и ни не могут быть массивом.
** На арифметические действия в FuncSingle() не обращайте внимания они носят чисто декоративный характер.

CTAPuK
Рядовой
Сообщения: 54
Зарегистрирован: 06.12.2020{, 20:41}
Репутация: 8
Имя: Михаил

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

#274

Сообщение CTAPuK » 25.01.2023{, 00:08}

ecoins писал(а):
24.01.2023{, 21:40}
Путь реализации сформулированной задачи средствами FLProg не единственный.
Для разовых случаев да.
Можно (и так пожалуй правильнее) сделать функцию на C++, оформить её как библиотеку и обращаться из FLProg к ней.
Вы абсолютно правы.
Но, я уже написал ПБ в FLProg для реализации своей небольшой потребности. Поэтому хочется, по возможности, в FLProg и допилить.
А делать это на сиплюсах, честно говоря трудозатраты того не стóят. :-)

Аватара пользователя
Phazz
Полковник
Сообщения: 2216
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 292
Откуда: Сургут
Имя: Анатолий

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

#275

Сообщение Phazz » 25.01.2023{, 04:53}

CTAPuK, я правильно понимаю, что каждый добавленный блок в проект дописывает в общую функцию свой кусочек кода?

aidar_i
Полковник
Сообщения: 2720
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 533
Откуда: Уфа
Имя: Айдар
Контактная информация:

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

#276

Сообщение aidar_i » 25.01.2023{, 06:23}

CTAPuK писал(а):
24.01.2023{, 20:36}
решение вставки кода из функции каждого экземпляра в функцию общего блока.
Вы хотите получить это?

Код: Выделить всё

void setup()
{
}
void loop()
{
    //Плата:1
    FuncCommon();
  }
FuncCommon() 
{
     FuncSingle201012471();
     FuncSingle223914946();
     FuncSingle24947798();
}
FuncSingle201012471()
    {
        Index1=random(0, 25);
        Index2=Index1 + random(25, 50);
        Index3=Index2 * random(50, 75);
        Index4=Index3 / random(75, 100);
    }
    FuncSingle223914946()
    {
        Index1=random(0, 25);
        Index2=Index1 + random(25, 50);
        Index3=Index2 * random(50, 75);
        Index4=Index3 / random(75, 100);
    }
    FuncSingle24947798()
    {
        Index1=random(0, 25);
        Index2=Index1 + random(25, 50);
        Index3=Index2 * random(50, 75);
        Index4=Index3 / random(75, 100);
    }
В таком виде пойдет?

Код: Выделить всё

void setup()
{
}
void loop()
{
    //Плата:1
    FuncCommon();
}
FuncCommon() 
{
    FuncSingle201012471()
    {
        Index1=random(0, 25);
        Index2=Index1 + random(25, 50);
        Index3=Index2 * random(50, 75);
        Index4=Index3 / random(75, 100);
    }
    
   FuncSingle223914946()
    {
        Index1=random(0, 25);
        Index2=Index1 + random(25, 50);
        Index3=Index2 * random(50, 75);
        Index4=Index3 / random(75, 100);
    }
    
   FuncSingle24947798()
    {
        Index1=random(0, 25);
        Index2=Index1 + random(25, 50);
        Index3=Index2 * random(50, 75);
        Index4=Index3 / random(75, 100);
    }
}
Вставка функцию в функцию.flp
(224.15 КБ) 6 скачиваний

CTAPuK
Рядовой
Сообщения: 54
Зарегистрирован: 06.12.2020{, 20:41}
Репутация: 8
Имя: Михаил

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

#277

Сообщение CTAPuK » 26.01.2023{, 20:18}

Phazz писал(а):
25.01.2023{, 04:53}
CTAPuK, я правильно понимаю, что каждый добавленный блок в проект дописывает в общую функцию свой кусочек кода?
Phazz, да, совершенно верно. Вы всё правильно поняли.

Аватара пользователя
Phazz
Полковник
Сообщения: 2216
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 292
Откуда: Сургут
Имя: Анатолий

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

#278

Сообщение Phazz » 26.01.2023{, 20:44}

CTAPuK, порядок имеет значение?

CTAPuK
Рядовой
Сообщения: 54
Зарегистрирован: 06.12.2020{, 20:41}
Репутация: 8
Имя: Михаил

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

#279

Сообщение CTAPuK » 26.01.2023{, 21:27}

aidar_i писал(а):
25.01.2023{, 06:23}
CTAPuK писал(а):
24.01.2023{, 20:36}
решение вставки кода из функции каждого экземпляра в функцию общего блока.
Вы хотите получить это?
...
aidar_i, спасибо за Вашу помощь, но чуть-чуть не так.

"Фокус" со разнесенными фигурными скобками (в начале общей функции "{" и в конце общей функции "}") в моем случае изначально не прошёл. Так как при генерации кода между кодом общей функции и кодом функции каждого экземпляра (то есть между этими фигурными скобками) вклиниваются функции из других ПБ. В результате чего компилятор перестает видеть функции из других ПБ, которые попадают в этот "разрыв" и обижается. Правда я это делал в одном едином блоке. Нужно будет попробовать так же сделать мультиблок и разместить на отдельной плате.

И потом, функция FuncCommon() ничего не знает об "идентификаторе экземпляра", а потому я не смогу ей объяснить как можно вызвать FuncSingle<INS.UUID>().
Пожалуйста поправьте меня, если где-то я ошибаюсь.

ecoins
Полковник
Сообщения: 2126
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 354
Откуда: Шатура
Имя: Энвер

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

#280

Сообщение ecoins » 26.01.2023{, 21:29}

CTAPuK писал(а):
26.01.2023{, 20:18}
Phazz, да, совершенно верно. Вы всё правильно поняли.
Не вполне понял задачу, но возможно Вам могут оказаться полезными "приемчики", которые мы наработали при создании блоков FLProg средствами профессионального редактора.
1.Один из подходов реализован в блоке вывода переменных на консоль. В нем в зависимости от настройки изменяются кол-во входов с выводимыми переменными с выбором типов этих переменных и выбора режима вывода(по изменению одной из переменных, периодически и т.п.). В итоге появляется функция которая и выполняет необходимые действия для изменяемого кол-ва и содержания параметров. Этот поход мы реализуем регулярно во многих блоках.
2.Второй подход реализован отчасти средствами профессионального редактора, отчасти средствами С++. Технологию создания можно подсмотреть в блоках LCD HD44780 и NEXTION. Функции находятся в библиотеке С+, в которую передается ссылка на объект с данными, определенной через структуру(или класс) данных. В главном блоке находится таблица указателей на объекты данных - обычно мы задаем 8-16 объектов - указатели на них занимают немного места - кол-во объектов х4(байт). Сами объекты данных могут быть весьма объемные, но создаются они в проекте ТОЛЬКО по мере необходимости. Такой подход обладает еще одним дополнительным свойством - можно "расщеплять" сложные блоки со многими входами/выходами на много мелких блоков, которые связываются со своим объектом данных по одному единственному байтовому параметру - номер объекта данных(присваивается автоматически и не требует запоминания). Понимаю, что в тексте воспринимается непросто, но при необходимости можно все это посмотреть в реализации.
------
Успехов.

Ответить

Вернуться в «Разработка пользовательских блоков»