Лучшая модель данных/концепция для хранения многодневного будильника для часов?

Я пишу многодневную программу дневной сигнализации для проекта.

Я не уверен, как я хочу сохранить формат каждого из 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"}

, 👍2

Обсуждение

может быть , использовать что - то похожее на linux cron ... https://linuxhandbook.com/crontab/, @jsotola

Вы спрашиваете о лучшем формате для вашего файла или о лучшем способе хранения данных в памяти?, @Majenko

Ну что ж, я пойду поищу замену будильника и просто в памяти, пока часы идут., @BostonMacOSX


2 ответа


1

Я бы предложил битовое поле для хранения дней недели, когда должна сработать сигнализация:

  • бит 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())), сработает сигнализация.

,

1

Это сработает. Хотя я чувствую, что ваше решение нелегко читается людьми, а также нелегко читается машинами.

Удаление |s, придание данным фиксированной длины и помещение каждого сигнала тревоги в отдельную строку помогло бы и с тем, и с другим. Вы получите что-то вроде

ON  MTWTFSS 14:00
OFF MT T  S 10:00

Поскольку строка данных имеет фиксированную длину, вы знаете, где внутри строки находятся нужные вам данные. Таким образом, ваш код может, например, проверить 7-й символ, чтобы увидеть, нужно ли ему включаться / выключаться в среду. Или проверьте 13-й и 14-й символы, чтобы получить час. И так далее.

Но тебе придется решить, что для тебя важно. Человеческая читабельность, машинный разбор, компактность (хранение его в виде двоичных данных, как сказал Эдгар), стандартизированный формат (стиль Cron), расширяемость (например, возможность добавлять секунды где-то в будущем), простота реализации.

,

танск, это тоже хороший способ взглянуть на это.., @BostonMacOSX