Лучшая модель данных/концепция для хранения многодневного будильника для часов?
Я пишу многодневную программу дневной сигнализации для проекта.
Я не уверен, как я хочу сохранить формат каждого из 10 сигналов тревоги....Мне нужно хранить it...in СПИФЫ извлекают его (при загрузке), а затем сравнивают с текущим днем недели и временем, чтобы включить сигнализацию..Я думал о том, чтобы хранить его в массиве из 10 членов.
Первый будильник будет каждый день в 2 часа дня, а второй выключен, но будет с понедельника по четверг в 10 утра. собирался использовать strtok_r, чтобы извлечь все фрагменты и сравнивать их каждую минуту, чтобы увидеть, нужен ли сигнал тревоги.
Каждую минуту
{"1 |M|T|W|T|F|S|S|14|00", "0|M|T||T|||S|10|00"}
@BostonMacOSX, 👍2
Обсуждение2 ответа
Я бы предложил битовое поле для хранения дней недели, когда должна сработать сигнализация:
- бит 0: пожар по воскресеньям
- бит 1: пожар по понедельникам
- ...
Эта нумерация должна совпадать с нумерацией функции DateTime::DayOfTheWeek()
.
Упакуйте это вместе с часами и минутами будильника в структуру
(или класс
, если хотите). Возможно, добавить логическое значение, чтобы определить, активен ли сигнал
тревоги. Например:
struct Alarm {
bool is_on;
uint8_t days; // bitfield: 0 = воскресенье
uint8_t hour;
uint8_t minute;
bool matches(DateTime) const;
};
bool Alarm::matches(DateTime t) const {
bool day_matches = days & (1 << t.dayOfTheWeek());
return day_matches && t.hour() == hour && t.minute() == minute;
}
Затем, если (alarm.is_on && alarm.matches(rtc.now()))
, сработает сигнализация.
Это сработает. Хотя я чувствую, что ваше решение нелегко читается людьми, а также нелегко читается машинами.
Удаление |
s, придание данным фиксированной длины и помещение каждого сигнала тревоги в отдельную строку помогло бы и с тем, и с другим. Вы получите что-то вроде
ON MTWTFSS 14:00
OFF MT T S 10:00
Поскольку строка данных имеет фиксированную длину, вы знаете, где внутри строки находятся нужные вам данные. Таким образом, ваш код может, например, проверить 7-й символ, чтобы увидеть, нужно ли ему включаться / выключаться в среду. Или проверьте 13-й и 14-й символы, чтобы получить час. И так далее.
Но тебе придется решить, что для тебя важно. Человеческая читабельность, машинный разбор, компактность (хранение его в виде двоичных данных, как сказал Эдгар), стандартизированный формат (стиль Cron), расширяемость (например, возможность добавлять секунды где-то в будущем), простота реализации.
танск, это тоже хороший способ взглянуть на это.., @BostonMacOSX
- Загрузка данных SPIFFS в Arduino IDE 2.0.0-rc3 (ESP32 & TTGO) - Ubuntu
- ОТА-программа SPIFFS на ESP8266
- Как записать и прочитать из файла SPIFFS как данные объекта на ESP8266
- ESP32 - ошибка при использовании LITTLEFS.h после обновления ядра до 2.0.4
- ESP-32 Загрузка файлов в SPIFFS через браузер
- Чтение текста построчно с SD
- Arduino создает массив Json с двойными значениями и 2 десятичными знаками
- ESP32 AsyncWebServer SPIFFS проблема со страницей загрузки
может быть , использовать что - то похожее на linux cron ... https://linuxhandbook.com/crontab/, @jsotola
Вы спрашиваете о лучшем формате для вашего файла или о лучшем способе хранения данных в памяти?, @Majenko
Ну что ж, я пойду поищу замену будильника и просто в памяти, пока часы идут., @BostonMacOSX