Обращение к определенному строковому массиву в PROGMEM

itehno

✩✩✩✩✩✩✩
3 Мар 2023
4
1
Добрый день. Не могу понять, как решить данную задачу.
Имеется такой код...
В функцию Parse_Msg я передаю значение переменной по ссылке.
Данных переменных несколько и логика вывода комбинации сообщений одинакова.
Я могу создать несколько одинаковых функций и в каждую передавать разную переменную, для получения нужной комбинации сообщений, но это сильно утяжеляет код.
Подскажите, как сделать так, что бы я передавал дополнительную переменную в функцию, которая указывала бы на то, какой строковый массив использовать?

Например, функция выглядит так (void Parse_Msg(uint8_t& Message, uint8_t& Count)), где Count равен номеру необходимого строкового массива.
Если Count равен 10, значит FPSTR(Msg_10[0]);
Если Count равен 11, значит FPSTR(Msg_11[0]);
и. т.д.

C++:
#define FPSTR(pstr) (const __FlashStringHelper*)(pstr)  // Преобразование PGM-строк

const char Msg_10_1[]      PROGMEM = "Ворота открыты";
const char Msg_10_2[]      PROGMEM = "Ворота закрыты";
const char Msg_10_3[]      PROGMEM = "Нет связи с пультом";
const char Msg_10_4[]      PROGMEM = "Отсуствие обратной связи с мотором";
const char Msg_10_5[]      PROGMEM = "Ворота открыты не полностью";
const char Msg_10_6[]      PROGMEM = "Ворота закрыты не полностью";
const char Msg_10_7[]      PROGMEM = "Включение световой индикации";
const char Msg_10_8[]      PROGMEM = "Световая индикация выключена";
const char* const Msg_10[] PROGMEM = { Msg_10_1, Msg_10_2, Msg_10_3, Msg_10_4, Msg_10_5, Msg_10_6, Msg_10_7, Msg_10_8 };

const char Msg_11_1[]      PROGMEM = "Ролета 1 открыта";
const char Msg_11_2[]      PROGMEM = "Ролета 1 закрыта";
const char Msg_11_3[]      PROGMEM = "Ролета 2 открыта";
const char Msg_11_4[]      PROGMEM = "Ролета 2 закрыта";
const char Msg_11_5[]      PROGMEM = "Ролета 3 открыта";
const char Msg_11_6[]      PROGMEM = "Ролета 3 закрыта";
const char Msg_11_7[]      PROGMEM = "Ролета 4 открыта";
const char Msg_11_8[]      PROGMEM = "Ролета 4 закрыта";
const char* const Msg_11[] PROGMEM = { Msg_11_1, Msg_11_2, Msg_11_3, Msg_11_4, Msg_11_5, Msg_11_6, Msg_11_7, Msg_11_8 };

String Delimiter = " *** "; // Разделитель
uint8_t NumberOfMistakes = 0; // Количество сообщений

void Parse_Msg(uint8_t& Message) { // Передача с помощью указателя
  String Message_Count = "";

  switch (Message) {
    case 1:
      NumberOfMistakes += 1;
      Message_Count  = FPSTR(Msg_11[0]);
      break;
    case 2:
      NumberOfMistakes += 1;
      Message_Count  = FPSTR(Msg_11[1]);
      break;
    case 3:
      NumberOfMistakes += 2;
      Message_Count  = FPSTR(Msg_11[0]);
      Message_Count += Delimiter;
      Message_Count += FPSTR(Msg_11[3]);
      break;
    case 4:
      NumberOfMistakes += 2;
      Message_Count  = FPSTR(Msg_11[1]);
      Message_Count += Delimiter;
      Message_Count += FPSTR(Msg_11[3]);
      break;
    //default:
    //Serial.println("СООБЩЕНИЙ НЕТ");
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
464
134
@itehno,
Если я правильно понял ваш вопрос, то вам можно посоветовать почитать урок Гайвера по progmem
Ссылка на урок
Раздел Проблема с циклами (AVR)
 
  • Лойс +1
Реакции: itehno

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
где Count равен номеру необходимого строкового массива.
Может, я неправильно понял... Вы пытаетесь проиндексировать цифры в именах массивов. Из этого ничего не выйдет. Здесь нужно создать многомерный массив, а уж потом получать доступ к его элементам по индексам.
 
  • Лойс +1
Реакции: itehno

itehno

✩✩✩✩✩✩✩
3 Мар 2023
4
1
@PiratFox,
Спасибо, все стало на свои места. Не понятно, почему сам не додумался. Видимо тяжелая неделя. Еще раз спасибо.
 
  • Ахах! +1
Реакции: PiratFox