ARDUINO Попеременный вывод значений куда либо.

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
В твоём варианте надо было использовать мою первую функцию, ты просто не так её вызывал, не думал что такое может быть....
C++:
void StrToArray(const String& str,uint8_t* outArr,int length){
    String s;
    s += str;
// Добавляем для упрощения алгоритма
    s += ", ";
// Наполняем целевой массив с 0 по препоследний
    for (int i=0;i<length-1;i++){
// Если в строке есть что запихать в массив - пихаем в массив
        if (s.length()>2){
            outArr[i]=(s.substring(0,s.indexOf(",")-1).toInt();
            s=s.substring(s.indexOf(",")+1);
// Если в строке нет данных, а целевой массив ещё не заполнен, пихаем в него маркеры конца
        } else {
            outArr[i]=255;
        }
    }
// Вне зависимости от того, что было раньше, в последний член массива пихаем маркер конца
    outArr[length-1]=255;
}
//Вызывать надо было так:
StrToArray(prd, c.periodDisplay,6); // 6 - это размер целевого массива, функция не знает какой длинны массив ты ей передаёшь
Не думал что тут могут возникнуть проблемы, это же азы...

Не знаю кто что о чём пишет, может и реализовано, тут надо идти и изучить пару пробелов в знаниях, тут нет ничего сложного, просто надо понять кто что хочет сделать. Я сам не так и давно этим занимаюсь, но в конкретно этой задачи всё просто и решение я дал уже давно.
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,542
296
я впервые сталкиваюсь с такой кашей)
обычно void() и пошел)
а тут аргументы какие-то...
получается тогда так?)
C++:
StrToArray(255, c.periodDisplay, 6);
или передаются две строки, одна пустая, другая из формы?

C++:
      String (value);
      portal.copyString("periodDisplay", value);
      c.periodDisplay = StrToArray(255, value, 6);
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Я же выше написал в коде как вызывать функцию
StrToArray(prd, c.periodDisplay,6); // 6 - это длинна целевого массива
Prd - строка с числами, разделённая запятыми.
И да, нечто похожее есть в портале, есть механизм парсера, для тебя должен подходить, но с ним тоже не просто.

Почитал переписку в ишью... Та функция выдёргивает подстроку из строки, то есть для парсинга данных средствами портала надо сперва создать цикл, потом дёргать.

for(i=0;i<6;i++)
c.periodDisplay=GPlistIdx(i,prd).toInt();

Однако прошу заметить тот факт, что у тебя структура и как я понимаю кому то надо 3, кому то 5, а может кто себе 2 режима сделает. Если использовать штатные средства, то не забывай о том, что у тебя массив заданной длины, не даром же придумали маркер конца. Почитай функции, просто прочти и пойми принцип 1 раз, с этим надо разобраться, без этого ну никак. Ещё познакомься с классами. Это очень рвёт шаблон по началу, зато потом всё становится в десятки раз проще. И да, думаю моё изначальное решение работает, думаю всё что тебе надо, просто применить как я описал. Ты передаешь указать на элемент структуры и его длинну, так же строку для парсинга, моя функция дёргает всё что может из строги и размещает это в массив по указателю. Если вдруг данные меньше чем длинна массива, то дописывает маркерами конца. Что ещё для счастья надо?
 
Изменено:

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
Таааак, здравствуйте молодые люди.
И тут эта дичь со списками байтов в стрингах?!? Я в issue уже пять раз спросил - на кой черт нужны эти костыли, какая задача решается? Может хоть тут мне ответят?)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Да я не могу понять что он забыл в ишью, вообще человек жил нормально, пока ты не изобрёл инструмент сохранения структуры в еепром
Задача, строка с данными через запятую, надо перетащить в структуру для дальнейшего сохранения твоим инструментом. Потом взять от туда и перевести в строку.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
А он не объяснил зачем ему это нужно? Механизм сохранения структуры в епром я не изобретал, он всегда был
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@AlexGyver, Где-то в ветке про портал объяснял, просто я не заморачивался, есть задача, есть решение, на 99 процентов уверен что предложенный мной вариант - рабочий, тут тот самый вариант, как со мной... когда дойдёт как это всё работает, то всё встанет на свои места, у Сергея немного в голове всё перепуталось. Но думаю в любом случае - это не тема для модернизации библиотеки портала.... Я припоминаю, что у наго в алгоритме есть несколько режимов работы, и как понимаю это сделано для того, чтобы пользователь его программы через портал мог выбирать те режимы, которые ему нужны, плюс ещё и последовательность перебора режимов. Это вводится в поле текст серез запятую, а сохрянять необходимо в структуру, которая пишется в eeprom. Как то так, вроде... могу ошибаться.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,542
296
@AlexGyver @DAK Всё так. Код попеременного вывода придумал @Старик Похабыч.
Задаётся в массиве порядок режимов и длительность каждого режима. Мне нужны все режимы. У кого-то нет датчика влажности, ему этот режим не нужен, или захочет другую последовательность. И время режима каждому своё. Вот чтобы не менять другим в коде и не перезагружать прошивку, хочу вынести на web эти поля. Структура не принципиальна) Можно и без неё)
 

Вложения

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@ASM, скажи мне, что не так в моей функции? Она не парсит строку в массив? Тебе надо просто передать указатель на массив, его длинну и строку для парсинга....
 

ASM

★★★★✩✩✩
26 Окт 2018
1,542
296
@DAK, я проверю позже, что последнее написал, сейчас нет возможности)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
вот это пробуй
C++:
void StrToArray(const String& str,uint8_t* outArr,int length){
    String s;
    s += str;
// Добавляем для упрощения алгоритма
    s += ", ";
// Наполняем целевой массив с 0 по предпоследний
    for (int i=0;i<length-1;i++){
// Если в строке есть что запихать в массив - пихаем в массив
        if (s.length()>2){
            outArr[i]=(s.substring(0,s.indexOf(",")-1).toInt();
            s=s.substring(s.indexOf(",")+1);
        } else {
// Если в строке нет данных, а целевой массив ещё не заполнен, пихаем в него маркеры конца
            outArr[i]=255;
        }
    }
// Вне зависимости от того, что было раньше, в последний член массива пихаем маркер конца
    outArr[length-1]=255;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Вызываем таким образом:
StrToArray(prd, c.periodDisplay,6); // 6 - это размер целевого массива, функция не знает какой длинны массив по указателю, который ты ей передаёшь
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
У кого-то нет датчика влажности, ему этот режим не нужен, или захочет другую последовательность.
Зачем городить СТРОКОВЫЙ конфиг при наличии веб интерфейса с кучей возможностей для настройки и выбора? Может сразу CLI добавить, чтобы через консоль настраивать свой проект?) Ну бред же

это не тема для модернизации библиотеки портала
Серега88 уже больше месяца просит добавить в портал аналог поля текст, но для вывода массивов через запятую текстом. И не говорит зачем ему это нужно!
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
@AlexGyver,

Все таки хороший человек этот AlexGyver - ложку спер и не побрезговал следит за подопечными.
Когда предлагался такой вариант ( 2 соотв массива) ни о каком веб интерфейсе речи не шло, все было еще на нане. Нужен был вариант, который бы ASM при его малоопытности смог бы легко реализовать. И у него все получилось, проект даже пошел в народ. А база осталась.

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

Вопрос: в строковом формате можно вполне сделать чередование времени с другими данными. например (первый массив) 0,1,0,2,0,3 . Можешь предложить ребятам вариант как это проще сделать на твоей библиотеке портала ?
 
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,542
296
Зачем городить СТРОКОВЫЙ конфиг при наличии веб интерфейса с кучей возможностей для настройки и выбора?
Можно, но идей никаких нет. Если бы не было интервалов, то просто бы сделал чекбоксы, как в мониторинге)

И не говорит зачем ему это нужно!
Я даже скрины предоставлял, для чего нужно)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137

@ASM,
Делаешь отдельный пункт на выбор режима. Ставишь 5 селектора и кнопку применить. В каждом селекте 6 вариантов, 5 режимов и "не использовать", всё. В актионе ловишь это всё и вносить в массив. При этом селекты можно сделать через цикл, да и в актион ловить через цикл. Но я думаю эта идея тебе уже приходила в голову, не думаю что я открыл Америку.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
570
Можешь предложить ребятам вариант как это проще сделать на твоей библиотеке портала ?
Я бы написал как сделать ещё месяц назад, если бы мне описали задачу русскими словами, как я много раз просил. А не куском косо-кривого кода, который даже компилироваться не должен. Сейчас мне уже не интересно.
 
  • Лойс +1
Реакции: Старик Похабыч

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
@DAK, Почему именно 5? Как я понимаю именно что бы каждый режим мог появляться минимум 1 раз ?
Тогда то чередование, которое я показывал выше невозможно. Можно взять 10 селекторов, тогда вариантов куда больше, но все равно есть ограничение. Правда после какого то числа ограничение не будет иметь смысла.

@AlexGyver, Ну я же не сказал сделать за него - хотя бы дать пинка в возможном направлении - идею.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137

@Старик Похабыч,
Я просто не знаю сколько режимов. Я думал раз массив из 5ти, то максимум 5 режимов. Я бы просто сделал, один селект выбирает тип датчика одного, другой что нить другое, чтобы всё было понятно.... Я сам не видел этот проект, задача поставлена через одно место. Карты гадальные у меня сломались...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Чисто теоретически можно на скрипте сделать добавление в результат типа ардублока - добавить / убрать режим с определенным временем, формирую ту же строку неявно, в памяти. к примру может быть что то типа {0,6}{1,2}{2,2}. Но это все вариации строки.
Делать под это все отдельны элемент в библиотеке - не вижу смысла.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,542
296
@DAK, если замудрится кто-то, то может захочет так: 0,1,0,2,0,3,0,4. Как исключение) Может тогда сделать некий запас для определения массива) Вот под такие задачи и готовый список не подойдёт. И чтобы не городить сложный код, я и спросил у Алекса, но он что-то не мог понять, даже на картинках. Также я спросил, нужно ли это добавить в библиотеку и планируется ли? Он ответил всё уже есть... Но как видим, это всё не то. Теперь буду внедрять твой вариант)
Сегодня не знаю, доберусь ли.
П.С. Надо первой лампой заняться, что-то там не так...
П.П.С. Лампу сделал...
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Ну сделай кнопку добавить и при нажатию на кнопку будут селекты вываливаться, что тут сложного то? 20 раз тыкнул, 20 режимов, выбрал какой за каким и счёлкнул применить
 

ASM

★★★★✩✩✩
26 Окт 2018
1,542
296
@DAK, вот это уже интересный вариант, мысль понял.
А вот с продолжительностью как, делать список из 60, от 1 до 60 секунд?) Хотя много то тут и не надо, иначе стоять ждать, когда высветится нужный датчик. У меня 4,2,2,2 и то некоторые говорят, что так долго то)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
До 10 секунд кмк выше крыши. 10 сек время, 2 сек дата, и по кругу.
Опять же максимально число секунд можно зашить в define и передавать его в форму. А секунды надо вводит не селектором, а input number.
1667824922159.png
 

ASM

★★★★✩✩✩
26 Окт 2018
1,542
296
@Старик Похабыч, можно и так, если что просто задублируют) Ранее кто-то писал, что 30 секунд ставил на часы, если я не путаю...