Merge pull request #120 from TheOnePerson/alarm-face-fix-24h-check

alarm-face: fix occasional crash (while checking for active alarms)
This commit is contained in:
joeycastillo 2022-11-03 19:29:31 -05:00 committed by GitHub
commit c149fef92d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -72,7 +72,7 @@ static const uint8_t _blink_idx2[ALARM_SETTING_STATES] = {3, 1, 5, 7, 8, 9};
static const BuzzerNote _buzzer_notes[3] = {BUZZER_NOTE_B6, BUZZER_NOTE_C8, BUZZER_NOTE_A8}; static const BuzzerNote _buzzer_notes[3] = {BUZZER_NOTE_B6, BUZZER_NOTE_C8, BUZZER_NOTE_A8};
static const uint8_t _buzzer_segdata[3][2] = {{0, 3}, {1, 3}, {2, 2}}; static const uint8_t _buzzer_segdata[3][2] = {{0, 3}, {1, 3}, {2, 2}};
int8_t _wait_ticks; static int8_t _wait_ticks;
static uint8_t _get_weekday_idx(watch_date_time date_time) { static uint8_t _get_weekday_idx(watch_date_time date_time) {
date_time.unit.year += 20; date_time.unit.year += 20;
@ -103,11 +103,11 @@ static void _alarm_face_draw(movement_settings_t *settings, alarm_state_t *state
if (!settings->bit.clock_mode_24h) { if (!settings->bit.clock_mode_24h) {
if (h >= 12) { if (h >= 12) {
watch_set_indicator(WATCH_INDICATOR_PM); watch_set_indicator(WATCH_INDICATOR_PM);
h = h % 12; h %= 12;
h += h ? 0 : 12;
} else { } else {
watch_clear_indicator(WATCH_INDICATOR_PM); watch_clear_indicator(WATCH_INDICATOR_PM);
} }
if (h == 0) h = 12;
} }
sprintf(buf, "%c%c%2d%2d%02d ", sprintf(buf, "%c%c%2d%2d%02d ",
_dow_strings[i][0], _dow_strings[i][1], _dow_strings[i][0], _dow_strings[i][1],
@ -159,7 +159,8 @@ static void _alarm_resume_setting(movement_settings_t *settings, alarm_state_t *
static void _alarm_update_alarm_enabled(movement_settings_t *settings, alarm_state_t *state) { static void _alarm_update_alarm_enabled(movement_settings_t *settings, alarm_state_t *state) {
// save indication for active alarms to movement settings // save indication for active alarms to movement settings
bool active_alarms = false; bool active_alarms = false;
watch_date_time *now = NULL; watch_date_time now;
bool now_init = false;
uint8_t weekday_idx; uint8_t weekday_idx;
uint16_t now_minutes_of_day; uint16_t now_minutes_of_day;
uint16_t alarm_minutes_of_day; uint16_t alarm_minutes_of_day;
@ -170,10 +171,11 @@ static void _alarm_update_alarm_enabled(movement_settings_t *settings, alarm_sta
active_alarms = true; active_alarms = true;
break; break;
} else { } else {
if (now == NULL) { if (!now_init) {
*now = watch_rtc_get_date_time(); now = watch_rtc_get_date_time();
weekday_idx = _get_weekday_idx(*now); now_init = true;
now_minutes_of_day = now->unit.hour * 60 + now->unit.minute; weekday_idx = _get_weekday_idx(now);
now_minutes_of_day = now.unit.hour * 60 + now.unit.minute;
} }
alarm_minutes_of_day = state->alarm[i].hour * 60 + state->alarm[i].minute; alarm_minutes_of_day = state->alarm[i].hour * 60 + state->alarm[i].minute;
// no more shortcuts: check days and times for all possible cases... // no more shortcuts: check days and times for all possible cases...
@ -251,7 +253,6 @@ void alarm_face_resign(movement_settings_t *settings, void *context) {
state->is_setting = false; state->is_setting = false;
_alarm_update_alarm_enabled(settings, state); _alarm_update_alarm_enabled(settings, state);
watch_set_led_off(); watch_set_led_off();
watch_store_backup_data(settings->reg, 0);
state->alarm_quick_ticks = false; state->alarm_quick_ticks = false;
_wait_ticks = -1; _wait_ticks = -1;
movement_request_tick_frequency(1); movement_request_tick_frequency(1);
@ -270,15 +271,7 @@ bool alarm_face_wants_background_task(movement_settings_t *settings, void *conte
if (state->alarm[i].minute == now.unit.minute) { if (state->alarm[i].minute == now.unit.minute) {
if (state->alarm[i].hour == now.unit.hour) { if (state->alarm[i].hour == now.unit.hour) {
state->alarm_playing_idx = i; state->alarm_playing_idx = i;
if (state->alarm[i].day == ALARM_DAY_EACH_DAY) return true; if (state->alarm[i].day == ALARM_DAY_EACH_DAY || state->alarm[i].day == ALARM_DAY_ONE_TIME) return true;
if (state->alarm[i].day == ALARM_DAY_ONE_TIME) {
// erase this alarm
state->alarm[i].day = ALARM_DAY_EACH_DAY;
state->alarm[i].minute = state->alarm[i].hour = 0;
state->alarm[i].enabled = false;
_alarm_update_alarm_enabled(settings, state);
return true;
}
uint8_t weekday_idx = _get_weekday_idx(now); uint8_t weekday_idx = _get_weekday_idx(now);
if (state->alarm[i].day == weekday_idx) return true; if (state->alarm[i].day == weekday_idx) return true;
if (state->alarm[i].day == ALARM_DAY_WORKDAY && weekday_idx < 5) return true; if (state->alarm[i].day == ALARM_DAY_WORKDAY && weekday_idx < 5) return true;
@ -307,7 +300,7 @@ bool alarm_face_loop(movement_event_t event, movement_settings_t *settings, void
state->alarm[state->alarm_idx].minute = (state->alarm[state->alarm_idx].minute + 1) % 60; state->alarm[state->alarm_idx].minute = (state->alarm[state->alarm_idx].minute + 1) % 60;
} else _abort_quick_ticks(state); } else _abort_quick_ticks(state);
} else if (!state->is_setting) { } else if (!state->is_setting) {
if (_wait_ticks >= 0 && _wait_ticks <= INT8_MAX) _wait_ticks++; if (_wait_ticks >= 0) _wait_ticks++;
if (_wait_ticks == 2) { if (_wait_ticks == 2) {
// extra long press of alarm button // extra long press of alarm button
_wait_ticks = -1; _wait_ticks = -1;
@ -435,9 +428,18 @@ bool alarm_face_loop(movement_event_t event, movement_settings_t *settings, void
} }
} else { } else {
// regular alarm beeps // regular alarm beeps
movement_play_alarm_beeps((state->alarm[state->alarm_idx].beeps == (ALARM_MAX_BEEP_ROUNDS - 1) ? 20 : state->alarm[state->alarm_playing_idx].beeps), movement_play_alarm_beeps((state->alarm[state->alarm_playing_idx].beeps == (ALARM_MAX_BEEP_ROUNDS - 1) ? 20 : state->alarm[state->alarm_playing_idx].beeps),
_buzzer_notes[state->alarm[state->alarm_playing_idx].pitch]); _buzzer_notes[state->alarm[state->alarm_playing_idx].pitch]);
} }
// one time alarm? -> erase it
if (state->alarm[state->alarm_playing_idx].day == ALARM_DAY_ONE_TIME) {
state->alarm[state->alarm_playing_idx].day = ALARM_DAY_EACH_DAY;
state->alarm[state->alarm_playing_idx].minute = state->alarm[state->alarm_playing_idx].hour = 0;
state->alarm[state->alarm_playing_idx].beeps = 5;
state->alarm[state->alarm_playing_idx].pitch = 1;
state->alarm[state->alarm_playing_idx].enabled = false;
_alarm_update_alarm_enabled(settings, state);
}
break; break;
case EVENT_MODE_BUTTON_UP: case EVENT_MODE_BUTTON_UP:
movement_move_to_next_face(); movement_move_to_next_face();