Простейший вопрос загрузка config файла не имеет красивого решения?!?!

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
Здравствуйте,

Простейшая задача в ArduinoIDE2 - нужно загрузить значения переменных из конфиг файла расположенного на SD карте вида:

WiFissid=MegaNet
WiFipass=100500
ScreenRefreshRate=10
AutoSleepMode=1000
(и так до 30-50 переменных).
Все переменные объявлены в начале скетча в ArduinoIDE2. То-есть нужно прочитать каждую запись в конфиг файле и назначить значения соответствующим переменным. Самое логически верное решение в развитых языка программирования было бы:

C++:
for ( int i = 1; while configFile line i exist ; 1) {
  var_name = read text before symbol "=" from configFile line i;
  var(var_name) = read text after symbol "=" from configFile line i;
}
Пока в ArduinoIDE2 продвинуться дальше данного кода не могу:

C++:
File FileConfig = SD.open("/config.cfg", FILE_READ); 
while(FileConfig.available()) {
  String Config_Setting = FileConfig.readStringUntil('\n');
  var(Config_Setting.substring(0,'=')) = Config_Setting.substring('='+1);
}
Тк 4-я строка в ArduinoIDE2 не пашет тк не понимает "var()" и не ясно как переходить на следующую строку из файла 2,3,4,5...

Как это реализовать в ArduinoIDE2 посимпатичнее без жутких циклов с перебором по 1 char итп монструозных нагромождений?
 

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

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Весь конфиг засунуть в структуру, всю структуру записывать в файл в двоичном виде.
Весь конфиг хранить в json и сохранять или загружать родными методами. Но сильно затратнее по памяти.
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
Конфиг должен быть легко редактируемым и легко понятным простым текстовым файлом.
Вообще всё должно быть легко понятным, в том числе код. Варианты же, которые в интернете предлагаются под Arduino для подобной обработки текстовых конфиг файлов - это какая-то жуть через пень колоду.
 

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

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
То что легко отредактировать легко сломать по незнаию.
json хранит вот в таком виде, редактировать можно, не шибко сложно:
Код:
{"min_Ph_r":2,"max_Ph_r":82,"min_Br":0,"max_Br":255,"cell_m":[2,3,2,4,2,5,2,6,0,0],"cell_t":[3,2,3,2,3,2,3,2,0,0],"start_T":8,"stop_T":20,"effct_T":0,"effct_N":4,"dep_Time":true,"dep_Tmpr":true,"dep_Prss":true,"time_color":[0,100,0],"date_color":[255,66,230],"tmpr_color":[255,255,0],"prss_color":[0,0,255],"humm_color":[0,255,255]}
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
Вы же написали:
в двоичном виде.
Двоичный код легко не отредактировать.
Текстовый JSON мб сошёл бы. Но это наверно опять новые библиотеки, загрузка памяти, итд??
Вот поэтому я поражаюсь, неужели в ArduinoIDE2 нет красивого решения такой простой задачи??
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
@Borv, задача простая если её кто-то за вас уже сделал, написал кучу библиотек и обернул это все в "развитый язык программирования". Для того что бы создать развитый язык нужно сначала создать сильно недоразвитый язык и нагородить в нем простых вещей с помощью "жутких циклов с перебором по 1 char итп монструозных нагромождений".
Вам просто не подходит C/C++, посмотрите в сторону micropython.
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
@Borv, задача простая если её кто-то за вас уже сделал, написал кучу библиотек и обернул это все в "развитый язык программирования". Для того что бы создать развитый язык нужно сначала создать сильно недоразвитый язык и нагородить в нем простых вещей с помощью "жутких циклов с перебором по 1 char итп монструозных нагромождений".Вам просто не подходит C/C++, посмотрите в сторону micropython.
Это верно лишь частично, тк:
во-1 функция "readStringUntil('\n');" уже есть, но только для разового применения, а для следующих строк нет - почему?!
во-2 команда вроде "set cursor after '\n' #2" не требуют переборов, а лишь указывает установить курсор в массиве в нужном месте - такого тоже нет - и циклы для этого не нужны, нужна функция!
А то сейчас в AraduinoIDE2 нужно создавать циклы перебора всего файла конфига по каждому одиночному char или построчно. То-есть если со строкой #1 как-то разобрались при помощи команды "readStringUntil('\n');", то далее придётся в цикле искать символ '\n' опять самого начала перебирая все char и так каждый раз - в плане правильной работы с данными и правильного программирования - это жутко криво. Ладно, поиск строки циклом, не так много.

А что с назначением значений переменных загруженных из конфига вида - как это в ArduinoIDE2 правильно написать:
var(Config_Setting.substring(0,'=')) = Config_Setting.substring('='+1);
???

Спасибо за предложение micropython, а все библиотеки под ArduinoIDE для разных устройств подходят для micropython?
 
Изменено:

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Во-первых в Arduino-IDE нет никаких функций и циклов, Arduino-IDE это среда разработки. А то на чем вы пишете - это язык C++.
Это все равно что сказать в "телефоне самсунг нет красивого браузера сафари - это жутко криво".
Во-вторых вы оч странно рассуждаете - готовых функций вам не хватает, свои вы писать с помощью цилов не хотите, а на предложение воспользоваться подходящей библиотекой говорите "опять новые библиотеки, загрузка памяти, итд". Или вы думаете что готовые функции в языке не потребляют памяти и не содержат в себе циклов?

а все библиотеки под ArduinoIDE для разных устройств подходят для micropython
нет библиотек под "ардуино иде", есть библиотеки под конкретный чип и фреймворк Ардуино (по сути - набор низкоуровневых библиотек).
И нет, для микропитона они не подходят. В микропитоне есть свой набор удобных красивых функций, но он весьма ограниченный.
 

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

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
екстовый JSON мб сошёл бы. Но это наверно опять новые библиотеки, загрузка памяти, итд??
Ну всегда придется чем то жертвовать. Либо скоростью, либо удобством, либо памятью .
Если это ардуино нано, тут не до жиру, надо ужиматься по памяти обычно.
Если это esp , то там вполне можно выделить 20 кБ для хранения какого то конфига и не думать об этом (я же писал, что json памятливый).

Можно комбинировать, считывая json , переносить данные в структуру, а потом освобождая эту память для работы.
 

bort707

★★★★★★✩
21 Сен 2020
3,075
915
А что с назначением значений переменных загруженных из конфига
А ничего. В языке С/С++ то что вы хотите попросту НЕВОЗМОЖНО.
В С нельзя обратится к переменной, считав ее имя из файла как текстовую строку. И Ардуино тут вовсе не при чём.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
Конфиг должен быть легко редактируемым и легко понятным простым текстовым файлом.
Я не понимаю в чем проблема использовать в двоичном формате. Вы же все равно редактировать на компе будете. Сделать простейшую утилиту, которая из удобного для вас формата (JSON/XML/Text) преобразует в удобный двоичный формат для контроллера. Плюс меньше памяти будет использоваться в контроллере.
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
@Borv, что-то я не пойму: название переменной Вы уже выделили, сравните с массивом названий переменных, определите, в какую переменную и какого типа нужно сохранить часть после "=" и возвратитесь в цикл, читая следующую строку.
C/C++ - язык не интерпретирующий, в выполняющемся коде названия переменных отсутствуют, типы - тоже нигде не записаны, так что всё придётся делать самому.
 

Vaqtincha

★✩✩✩✩✩✩
14 Ноя 2022
156
21
Uzbekistan, Fergana
Ну заранее в структуру засунуть переменные
WiFissid,
WiFipass,
ScreenRefreshRate и.т.д деф значениями и обновить при чтении не пробовали? Или я что-то не понял?

Чтение ini файла с/с++ это самое простое.
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
И нет, для микропитона они не подходят. В микропитоне есть свой набор удобных красивых функций, но он весьма ограниченный.
Тогда microphyton не подходит.
В языке С/С++ то что вы хотите попросту НЕВОЗМОЖНО. В С нельзя обратится к переменной, считав ее имя из файла как текстовую строку. И Ардуино тут вовсе не при чём.
Вроде 2023г а какие мучения. :( Ждём доработок к 3023г.
Я не понимаю в чем проблема использовать в двоичном формате. Вы же все равно редактировать на компе будете. Сделать простейшую утилиту, которая из удобного для вас формата (JSON/XML/Text) преобразует в удобный двоичный формат для контроллера. Плюс меньше памяти будет использоваться в контроллере.
Чтобы любой человек, в том числе с техническими знаниями уровня секретарша итп, мог легко подправить параметры работы и чтобы можно было открыть файл в браузере сервера и параметры проверить итп.
Вы уже выделили, сравните с массивом названий переменных, определите, в какую переменную и какого типа нужно сохранить часть после "=" и возвратитесь в цикл, читая следующую строку.
Каждую переменную придётся писать в коде 2 раза - определяя и назначая, а если их 50шт, это порядка 48 лишних строчек причём ужасно банальных, которые хорошо бы как-то укоротить-автоматизировать.
C/C++ - язык не интерпретирующий, в выполняющемся коде названия переменных отсутствуют, типы - тоже нигде не записаны, так что всё придётся делать самому.
яСССна понятна.

Лан, всем спасибо, будем циклить.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Ждём доработок к 3023г.
можете не ждать, C++ развивается таким какой он нужен для своих целей, а не таким каким выхотели бы его видеть для облегчения программирования секретаршам.

Каждую переменную придётся писать в коде 2 раза - определяя и назначая
This is the way!

хорошо бы как-то укоротить-автоматизировать
В С++ есть шаблоны и метапрограммирование, но, бось вам это понравится еще меньше.
 

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

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Чтобы любой человек, в том числе с техническими знаниями уровня секретарша итп, мог легко подправить параметры работы и чтобы можно было открыть файл в браузере сервера и параметры проверить итп.
Самый короткий путь к восстанию машин.
А что это за настройки такие, для чего надо инициировать 50 штук переменных ? Просто для справки. Я понимаю, что такие есть. и даже больше.
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
Нет, this is the outdated assholery!
В С++ есть шаблоны и метапрограммирование, но, бось вам это понравится еще меньше.
Не нужно выпендриваться, я когдато и на Asm писал коды, но так хоть понятно за что мучения - за аппаратную нативность, за минимальное использование памяти, за максимальную скорость, итд.
А какой смысл в C++ со всеми его громоздкими IDE ковыряться с примитивными циклами по-сути также как в Asm - смысла никакого!
Должно быть либо удобно и сильнофункционально, либо неудобно но аппаратно нативно, а С++ поулчается как говно в проруби - ни то, ни сё.

Самый короткий путь к восстанию машин.
:D
А что это за настройки такие, для чего надо инициировать 50 штук переменных ? Просто для справки. Я понимаю, что такие есть. и даже больше.
Универсальная прошивка для научных экспериментов со множеством данных и ещё всякой перефирией (экран, SD, WiFi, I2C, SPI, USB, итд) - в нескольких удалённых лабораториях - всё настроить выходит много конфигурационных параметров.
 
  • Ахах! +1
Реакции: vortigont

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
Универсальная прошивка для научных экспериментов со множеством данных и ещё всякой перефирией (экран, SD, WiFi, I2C, SPI, USB, итд)
в том числе с техническими знаниями уровня секретарша
Ок, что то не сходится.
 
  • Ахах! +1
Реакции: vortigont

poty

★★★★★★✩
19 Фев 2020
3,265
950
Каждую переменную придётся писать в коде 2 раза
Ну, не пишите 2 раза, используйте структуру, массивы, классы наконец. То, что интерпретирующие языки за вас сохраняют типы и названия переменных ещё не делает их лучше, учитывая то, сколько ресурсов они на это тратят. Да, с помощью них можно сделать кое-что, что с кровью делается на С/С++, но и выбрана микропроцессорная платформа, а не полноценный комп. А здесь уже в ряде случаев просто ничего невозможно написать, допустим, на какой-нибудь Java, код не влезет или по времени выполнения не подойдёт.
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
Ок, что то не сходится.
Вы думаете все физики, химики, биологи, итд знают бинарные редакторы?!
Ну, не пишите 2 раза, используйте структуру, массивы, классы наконец.\
Массивам переменных в ArduinoIDE2 (C++) можно как-то назначать значения из конфига за 1 проход без повторного перебора массива или конфига??? Если нет - то какой смысл???
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
нают бинарные редакторы?!
Зачем бинарные редакторы?
Сделать простейшую утилиту, которая из удобного для вас формата (JSON/XML/Text) преобразует в удобный двоичный формат для контроллера.
А чтобы не потерять, утилиту записать и запускать с SD-карты.

"Секретарши" же освоят простейшие шаги? Отредактировать текстовый файл, запустить утилиту - профит.

И особо продвинутый вариант: Сделать GUI-приложение со всякими свистоперделками.
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
Массивам переменных в ArduinoIDE2 (C++) можно как-то назначать значения из конфига за 1 проход без повторного перебора массива или конфига???
Во-первых, "ArduinoIDE2" и "С++" - не тождественные понятия. Совсем! Не стоит их смешивать. Ранее я не стал отвечать на то, что Вам приходится "ковыряться со всякими"
громоздкими IDE
С++ - это текстовый язык и на нём можно писать хоть в Блокноте, хоть в vi. Компилировать, линковать и получать бинарники также легко можно из командной строки.
Во-вторых, в качестве ответа на вопрос: это уж как Вы напишете, ведь как-то реализовали это в интерпретирующих языках! То, что Вы не видите вложенных циклов ещё не означает, что их нет. Напишите функцию (макро, класс...) с названием
C++:
var
и спите спокойно.
 

Брякомякс

★✩✩✩✩✩✩
14 Янв 2023
95
20
А микропитоне нет разве модуля json? Даже удивительно.

или в circuit python, он в целом даже более user friendly.
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
Ладно, уже флейм какой-то, что поделать, удобных вариантов нет, будем циклить и значение каждой переменной назначать вручную.

Последние уточнения.
Я так понимаю, что создавая объект файла в коде ArduinoIDE2 вида:
File ConfigFile = SD.open(/tester.cfg, FILE_READ);
Реального считывания данных не происходит.
Тогда как в ArduinoIDE2 + SD.h лучше за раз быстро считать файл в память и потом перебирать его в памяти, а не запрашивая каждый раз SD-card??
Считать File в String или Stream? Вроде в Stream есть readString(). Или считывать 32битными блоками как двоичный код и потом его разбирать в памяти? Как это в данной среде правильнее, чтобы минимизировать нагрузку и кол-во обращений к SPI+SD?
И если загрузить в массив - в массиве ArduinoIDE2 есть курсор текущей строки или тоже нет?
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@Borv, уже писали, что среда ArduinoIDE2 тут ни при чём. Это всё функции/возможности языка программирования С/С++. Начните учить язык, тогда большинство вопросов или отпадут или просто не появятся. Да и с микроконтроллерами поближе познакомится будет полезно. Иначе будут возникать вопросы буквально по каждой мелочи. Так ни к чему не прийти. Никто вас не будет постоянно консультировать по очевидным вещам, которые давно описаны и разжёваны в учебниках и соответствующей литературе.