Перейти к содержанию
    

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

Здравствуйте,

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

WiFissid=MegaNet
WiFipass=100500
ScreenRefreshRate=10
AutoSleepMode=1000
(и так до 30-50 переменных).

Все переменные объявлены в начале скетча в ArduinoIDE2. То-есть нужно прочитать каждую запись в конфиг файле и назначить значения соответствующим переменным. Самое логически верное решение в развитых языка программирования было бы:

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 продвинуться дальше данного кода не могу:

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 итп монструозных нагромождений?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ждите когда с++23 завезут рефлексию 🙂

мало ведь пока ещё там всякого RTTI говна в эмбед с десктопа притащено...

 

а пока массив нужен для соответствия названий и указателей на переменные, 

#define X(var) {#var,&var}

ну а чтобы не перебирать всё подряд через strcmp считайте хэш.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

58 минут назад, _pv сказал:

а пока массив нужен для соответствия названий и указателей на переменные, 

#define X(var) {#var,&var}

ну а чтобы не перебирать всё подряд через strcmp считайте хэш.

Наверно без толку, если всё равно назначать придётся по-1 переменной построчно точно указывая каждую переменную? 😕

Или переменные в массиве доступны всей прошивке как одиночные и могут быть назначены 1 переборов файла конфига?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, Bodr said:
var(var_name) = 

У меня более простой вопрос - какой язык программирования имелся ввиду ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, x893 сказал:

У меня более простой вопрос - какой язык программирования имелся ввиду ?

Те, которые могут всё - логика и Asm.

Изменено пользователем Bodr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, x893 сказал:

Без знаний - это путь в ад.

В такой формулировке важно уточнять - "без знаний долбанных ограничений и недоделок конкретной среды". 😉

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

 

Последние уточнения.

Я так понимаю, что создавая объект файла в коде ArduinoIDE2 вида:

File ConfigFile = SD.open(/tester.cfg, FILE_READ);

Реального считывания данных не происходит.

Тогда как в ArduinoIDE2 + SD.h лучше за раз быстро считать файл в память и потом перебирать его в памяти, а не запрашивая каждый раз SD-card??

Считать File в String или Stream? Вроде в Stream есть readString(). Или считывать 32битными блоками как двоичный код и потом его разбирать в памяти? Как это в данной среде правильнее, чтобы минимизировать нагрузку и кол-во обращений к SPI+SD?

И если загрузить в массив - в массиве здесь курсор строки есть или тоже нет?

Изменено пользователем Bodr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 06.10.2023 в 23:14, x893 сказал:

Без знаний - это путь в ад.

Вы слишком многого хотите от поколения "акей гугл"-а.  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

InlineIni.h

Spoiler
/*
    InlineIni ini;
    
    S<64> s("addr=0xFE; null=bit({stat},0); unit= °C");
    char* key;
    char* value;

    ini.iterate(s, key, value); // true, key = "addr", value = "0xFE"
    ini.iterate(s, key, value); // true, key = "null", value = "bit({stat},0)"
    ini.iterate(s, key, value); // true, key = "unit", value = " °C"
    ini.iterate(s, key, value); // false
*/
class InlineIni
{
  private:
    bool _started = false;
    bool _done = false;
    char* _nextKey = nullptr;
  public:
    bool started() const;
    void reset();

    struct IterateOptions
    {
      bool allowOnlyKeys;
      char additionalDelimiter;
    };

    bool iterate(char* buff, char* &key, char* &value, const IterateOptions &o = {});
};

 

InlineIni.cpp

Spoiler
#include "InlineIni.hpp"

bool InlineIni::started() const
{
  return _started;
}

void InlineIni::reset()
{
  _started = false;
  _done = false;
  _nextKey = nullptr;
}

// [key1 = value1; key2 = value2; ,,,]
bool InlineIni::iterate(char* buff, char* &key, char* &value, const IterateOptions &o)
{
  if (!buff || _done)
    return false;

  key = nullptr;
  char* akey = nullptr;
  if (!_started)
  {
    akey = buff;
    _started = true;
  }
  else
  {
    if (_nextKey == nullptr)
    {
      _done = true;
      return false;
    }

    akey = _nextKey;
  }

  bool eqFound = false;

  char* s = akey;
  while (char &c = *s)
  {
    s++;
    switch (c)
    {
      case '=':
        if (!eqFound)
        {
          eqFound = true;
          c = '\0';
          key = trim(akey, " ");
          value = s;
        }
        break;

      default:
        if (c != ';' && c != o.additionalDelimiter)
          continue;

        if (o.allowOnlyKeys && !eqFound)
          key = trim(akey, " ");

        c = '\0';
        _nextKey = s;
        return !str::empty(key);
    }
  }

  if (o.allowOnlyKeys && *s == '\0')
    key = trim(akey, " ");

  _nextKey = nullptr;
  return !str::empty(key);
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем примеры ? Такое пишется за час с перекурами. Надо учится
https://www.onlinegdb.com/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...