From f633b7634b80d0bf08e491606eab3f10f85d6ece Mon Sep 17 00:00:00 2001 From: Jonathan Glines Date: Sun, 24 Sep 2023 14:00:13 -0400 Subject: [PATCH] Support leading zero representation for 24h clock Toggle between default behavior and leading zero with long-press of alarm button on page with 24h setting. --- movement/movement.h | 3 ++- .../clock/repetition_minute_face.c | 7 ++++++- .../clock/simple_clock_bin_led_face.c | 7 ++++++- .../watch_faces/clock/simple_clock_face.c | 7 ++++++- .../watch_faces/clock/weeknumber_clock_face.c | 7 ++++++- .../watch_faces/clock/world_clock2_face.c | 9 +++++++-- movement/watch_faces/clock/world_clock_face.c | 7 ++++++- .../watch_faces/complication/activity_face.c | 11 ++++++++--- .../watch_faces/complication/alarm_face.c | 7 +++++++ .../complication/planetary_hours_face.c | 7 ++++++- .../complication/planetary_time_face.c | 8 +++++++- .../complication/sunrise_sunset_face.c | 12 +++++++++++- movement/watch_faces/complication/wake_face.c | 11 ++++++++--- .../watch_faces/demo/lis2dw_logging_face.c | 11 ++++++++--- .../sensor/thermistor_logging_face.c | 19 ++++++++++++------- .../watch_faces/settings/preferences_face.c | 14 ++++++++++++-- movement/watch_faces/settings/set_time_face.c | 8 +++++++- .../settings/set_time_hackwatch_face.c | 8 +++++++- 18 files changed, 132 insertions(+), 31 deletions(-) diff --git a/movement/movement.h b/movement/movement.h index 5f30dfb8c..c9e955cb3 100644 --- a/movement/movement.h +++ b/movement/movement.h @@ -60,9 +60,10 @@ typedef union { // time-oriented complication like a sunrise/sunset timer, and a simple locale preference could tell an // altimeter to display feet or meters as easily as it tells a thermometer to display degrees in F or C. bool clock_mode_24h : 1; // indicates whether clock should use 12 or 24 hour mode. + bool clock_24h_leading_zero : 1; // indicates whether clock should leading zero to indicate 24 hour mode. bool use_imperial_units : 1; // indicates whether to use metric units (the default) or imperial. bool alarm_enabled : 1; // indicates whether there is at least one alarm enabled. - uint8_t reserved : 6; // room for more preferences if needed. + uint8_t reserved : 5; // room for more preferences if needed. } bit; uint32_t reg; } movement_settings_t; diff --git a/movement/watch_faces/clock/repetition_minute_face.c b/movement/watch_faces/clock/repetition_minute_face.c index fc78b2d86..e992cdf6c 100644 --- a/movement/watch_faces/clock/repetition_minute_face.c +++ b/movement/watch_faces/clock/repetition_minute_face.c @@ -68,7 +68,7 @@ void repetition_minute_face_activate(movement_settings_t *settings, void *contex if (watch_tick_animation_is_running()) watch_stop_tick_animation(); - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); // handle chime indicator if (state->signal_enabled) watch_set_indicator(WATCH_INDICATOR_BELL); @@ -112,6 +112,7 @@ bool repetition_minute_face_loop(movement_event_t event, movement_settings_t *se // ...and set the LAP indicator if low. if (state->battery_low) watch_set_indicator(WATCH_INDICATOR_LAP); + bool set_leading_zero = false; if ((date_time.reg >> 6) == (previous_date_time >> 6) && event.event_type != EVENT_LOW_ENERGY_UPDATE) { // everything before seconds is the same, don't waste cycles setting those segments. watch_display_character_lp_seconds('0' + date_time.unit.second / 10, 8); @@ -132,6 +133,8 @@ bool repetition_minute_face_loop(movement_event_t event, movement_settings_t *se } date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; + } else if (settings->bit.clock_24h_leading_zero && date_time.unit.hour < 10) { + set_leading_zero = true; } pos = 0; if (event.event_type == EVENT_LOW_ENERGY_UPDATE) { @@ -142,6 +145,8 @@ bool repetition_minute_face_loop(movement_event_t event, movement_settings_t *se } } watch_display_string(buf, pos); + if (set_leading_zero) + watch_display_string("0", 4); // handle alarm indicator if (state->alarm_enabled != settings->bit.alarm_enabled) _update_alarm_indicator(settings->bit.alarm_enabled, state); break; diff --git a/movement/watch_faces/clock/simple_clock_bin_led_face.c b/movement/watch_faces/clock/simple_clock_bin_led_face.c index cf39c1886..371f1e1a2 100644 --- a/movement/watch_faces/clock/simple_clock_bin_led_face.c +++ b/movement/watch_faces/clock/simple_clock_bin_led_face.c @@ -60,7 +60,7 @@ void simple_clock_bin_led_face_activate(movement_settings_t *settings, void *con if (watch_tick_animation_is_running()) watch_stop_tick_animation(); - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); // handle chime indicator if (state->signal_enabled) watch_set_indicator(WATCH_INDICATOR_BELL); @@ -138,6 +138,7 @@ bool simple_clock_bin_led_face_loop(movement_event_t event, movement_settings_t // ...and set the LAP indicator if low. if (state->battery_low) watch_set_indicator(WATCH_INDICATOR_LAP); + bool set_leading_zero = false; if ((date_time.reg >> 6) == (previous_date_time >> 6) && event.event_type != EVENT_LOW_ENERGY_UPDATE) { // everything before seconds is the same, don't waste cycles setting those segments. watch_display_character_lp_seconds('0' + date_time.unit.second / 10, 8); @@ -158,6 +159,8 @@ bool simple_clock_bin_led_face_loop(movement_event_t event, movement_settings_t } date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; + } else if (settings->bit.clock_24h_leading_zero && date_time.unit.hour < 10) { + set_leading_zero = true; } pos = 0; if (event.event_type == EVENT_LOW_ENERGY_UPDATE) { @@ -168,6 +171,8 @@ bool simple_clock_bin_led_face_loop(movement_event_t event, movement_settings_t } } watch_display_string(buf, pos); + if (set_leading_zero) + watch_display_string("0", 4); // handle alarm indicator if (state->alarm_enabled != settings->bit.alarm_enabled) _update_alarm_indicator(settings->bit.alarm_enabled, state); } diff --git a/movement/watch_faces/clock/simple_clock_face.c b/movement/watch_faces/clock/simple_clock_face.c index ac9a97b21..6f67c369f 100644 --- a/movement/watch_faces/clock/simple_clock_face.c +++ b/movement/watch_faces/clock/simple_clock_face.c @@ -51,7 +51,7 @@ void simple_clock_face_activate(movement_settings_t *settings, void *context) { if (watch_tick_animation_is_running()) watch_stop_tick_animation(); - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); // handle chime indicator if (state->signal_enabled) watch_set_indicator(WATCH_INDICATOR_BELL); @@ -95,6 +95,7 @@ bool simple_clock_face_loop(movement_event_t event, movement_settings_t *setting // ...and set the LAP indicator if low. if (state->battery_low) watch_set_indicator(WATCH_INDICATOR_LAP); + bool set_leading_zero = false; if ((date_time.reg >> 6) == (previous_date_time >> 6) && event.event_type != EVENT_LOW_ENERGY_UPDATE) { // everything before seconds is the same, don't waste cycles setting those segments. watch_display_character_lp_seconds('0' + date_time.unit.second / 10, 8); @@ -115,6 +116,8 @@ bool simple_clock_face_loop(movement_event_t event, movement_settings_t *setting } date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; + } else if (settings->bit.clock_24h_leading_zero && date_time.unit.hour < 10) { + set_leading_zero = true; } pos = 0; if (event.event_type == EVENT_LOW_ENERGY_UPDATE) { @@ -125,6 +128,8 @@ bool simple_clock_face_loop(movement_event_t event, movement_settings_t *setting } } watch_display_string(buf, pos); + if (set_leading_zero) + watch_display_string("0", 4); // handle alarm indicator if (state->alarm_enabled != settings->bit.alarm_enabled) _update_alarm_indicator(settings->bit.alarm_enabled, state); break; diff --git a/movement/watch_faces/clock/weeknumber_clock_face.c b/movement/watch_faces/clock/weeknumber_clock_face.c index 81df58475..ed694e6fb 100644 --- a/movement/watch_faces/clock/weeknumber_clock_face.c +++ b/movement/watch_faces/clock/weeknumber_clock_face.c @@ -50,7 +50,7 @@ void weeknumber_clock_face_activate(movement_settings_t *settings, void *context if (watch_tick_animation_is_running()) watch_stop_tick_animation(); - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); // handle chime indicator if (state->signal_enabled) watch_set_indicator(WATCH_INDICATOR_BELL); @@ -94,6 +94,7 @@ bool weeknumber_clock_face_loop(movement_event_t event, movement_settings_t *set // ...and set the LAP indicator if low. if (state->battery_low) watch_set_indicator(WATCH_INDICATOR_LAP); + bool set_leading_zero = false; if ((date_time.reg >> 12) == (previous_date_time >> 12) && event.event_type != EVENT_LOW_ENERGY_UPDATE) { // everything before minutes is the same. pos = 6; @@ -109,6 +110,8 @@ bool weeknumber_clock_face_loop(movement_event_t event, movement_settings_t *set } date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; + } else if (settings->bit.clock_24h_leading_zero && date_time.unit.hour < 10) { + set_leading_zero = true; } pos = 0; if (event.event_type == EVENT_LOW_ENERGY_UPDATE) { @@ -119,6 +122,8 @@ bool weeknumber_clock_face_loop(movement_event_t event, movement_settings_t *set } } watch_display_string(buf, pos); + if (set_leading_zero) + watch_display_string("0", 4); // handle alarm indicator if (state->alarm_enabled != settings->bit.alarm_enabled) _update_alarm_indicator(settings->bit.alarm_enabled, state); break; diff --git a/movement/watch_faces/clock/world_clock2_face.c b/movement/watch_faces/clock/world_clock2_face.c index 0077f6394..0d4acd0ff 100644 --- a/movement/watch_faces/clock/world_clock2_face.c +++ b/movement/watch_faces/clock/world_clock2_face.c @@ -247,7 +247,7 @@ static bool mode_display(movement_event_t event, movement_settings_t *settings, if (refresh_face) { watch_clear_indicator(WATCH_INDICATOR_SIGNAL); watch_set_colon(); - if (settings->bit.clock_mode_24h) + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); state->previous_date_time = REFRESH_TIME; @@ -261,6 +261,7 @@ static bool mode_display(movement_event_t event, movement_settings_t *settings, previous_date_time = state->previous_date_time; state->previous_date_time = date_time.reg; + bool set_leading_zero = false; if ((date_time.reg >> 6) == (previous_date_time >> 6) && event.event_type != EVENT_LOW_ENERGY_UPDATE) { /* Everything before seconds is the same, don't waste cycles setting those segments. */ pos = 8; @@ -281,7 +282,9 @@ static bool mode_display(movement_event_t event, movement_settings_t *settings, date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; - } + } else if (settings->bit.clock_24h_leading_zero && date_time.unit.hour < 10) { + set_leading_zero = true; + } pos = 0; if (event.event_type == EVENT_LOW_ENERGY_UPDATE) { @@ -303,6 +306,8 @@ static bool mode_display(movement_event_t event, movement_settings_t *settings, } } watch_display_string(buf, pos); + if (set_leading_zero) + watch_display_string("0", 4); break; case EVENT_ALARM_BUTTON_UP: state->current_zone = find_selected_zone(state, FORWARD); diff --git a/movement/watch_faces/clock/world_clock_face.c b/movement/watch_faces/clock/world_clock_face.c index b12d9cdf2..6b731e8e0 100644 --- a/movement/watch_faces/clock/world_clock_face.c +++ b/movement/watch_faces/clock/world_clock_face.c @@ -60,7 +60,7 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se watch_date_time date_time; switch (event.event_type) { case EVENT_ACTIVATE: - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); watch_set_colon(); state->previous_date_time = 0xFFFFFFFF; // fall through @@ -72,6 +72,7 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se previous_date_time = state->previous_date_time; state->previous_date_time = date_time.reg; + bool set_leading_zero = false; if ((date_time.reg >> 6) == (previous_date_time >> 6) && event.event_type != EVENT_LOW_ENERGY_UPDATE) { // everything before seconds is the same, don't waste cycles setting those segments. pos = 8; @@ -91,6 +92,8 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se } date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; + } else if (settings->bit.clock_24h_leading_zero && date_time.unit.hour < 10) { + set_leading_zero = true; } pos = 0; if (event.event_type == EVENT_LOW_ENERGY_UPDATE) { @@ -112,6 +115,8 @@ static bool world_clock_face_do_display_mode(movement_event_t event, movement_se } } watch_display_string(buf, pos); + if (set_leading_zero) + watch_display_string("0", 4); break; case EVENT_ALARM_LONG_PRESS: movement_request_tick_frequency(4); diff --git a/movement/watch_faces/complication/activity_face.c b/movement/watch_faces/complication/activity_face.c index f92984cd9..b26fbeb0a 100644 --- a/movement/watch_faces/complication/activity_face.c +++ b/movement/watch_faces/complication/activity_face.c @@ -293,6 +293,7 @@ static void _activity_update_logging_screen(movement_settings_t *settings, activ } // Briefly, show time without seconds else { + bool set_leading_zero = false; watch_clear_indicator(WATCH_INDICATOR_LAP); watch_date_time now = watch_rtc_get_date_time(); uint8_t hour = now.unit.hour; @@ -304,14 +305,18 @@ static void _activity_update_logging_screen(movement_settings_t *settings, activ watch_set_indicator(WATCH_INDICATOR_PM); hour %= 12; if (hour == 0) hour = 12; - } - else { - watch_set_indicator(WATCH_INDICATOR_24H); + } else { watch_clear_indicator(WATCH_INDICATOR_PM); + if (!settings->bit.clock_24h_leading_zero) + watch_set_indicator(WATCH_INDICATOR_24H); + else if (hour < 10) + set_leading_zero = true; } sprintf(activity_buf, "%2d%02d ", hour, now.unit.minute); watch_set_colon(); watch_display_string(activity_buf, 4); + if (set_leading_zero) + watch_display_string("0", 4); } } diff --git a/movement/watch_faces/complication/alarm_face.c b/movement/watch_faces/complication/alarm_face.c index 3b7d1e35e..6817222e1 100644 --- a/movement/watch_faces/complication/alarm_face.c +++ b/movement/watch_faces/complication/alarm_face.c @@ -99,6 +99,7 @@ static void _alarm_face_draw(movement_settings_t *settings, alarm_state_t *state i = state->alarm[state->alarm_idx].day + 1; } //handle am/pm for hour display + bool set_leading_zero = false; uint8_t h = state->alarm[state->alarm_idx].hour; if (!settings->bit.clock_mode_24h) { if (h >= 12) { @@ -108,6 +109,10 @@ static void _alarm_face_draw(movement_settings_t *settings, alarm_state_t *state watch_clear_indicator(WATCH_INDICATOR_PM); } if (h == 0) h = 12; + } else if (!settings->bit.clock_24h_leading_zero) { + watch_set_indicator(WATCH_INDICATOR_24H); + } else if (h < 10) { + set_leading_zero = true; } sprintf(buf, "%c%c%2d%2d%02d ", _dow_strings[i][0], _dow_strings[i][1], @@ -119,6 +124,8 @@ static void _alarm_face_draw(movement_settings_t *settings, alarm_state_t *state buf[_blink_idx[state->setting_state]] = buf[_blink_idx2[state->setting_state]] = ' '; } watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); if (state->is_setting) { // draw pitch level indicator diff --git a/movement/watch_faces/complication/planetary_hours_face.c b/movement/watch_faces/complication/planetary_hours_face.c index acded9175..e13466b12 100644 --- a/movement/watch_faces/complication/planetary_hours_face.c +++ b/movement/watch_faces/complication/planetary_hours_face.c @@ -228,6 +228,7 @@ static void _planetary_hours(movement_settings_t *settings, planetary_hours_stat uint8_t weekday, planet, planetary_hour; uint32_t current_hour_epoch; watch_date_time scratch_time; + bool set_leading_zero = false; // check if we have a location. If not, display error if ( state->no_location ) { @@ -253,7 +254,7 @@ static void _planetary_hours(movement_settings_t *settings, planetary_hours_stat return; } - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); // roll over hour iterator if ( state->hour < 0 ) state->hour = 23; @@ -313,6 +314,8 @@ static void _planetary_hours(movement_settings_t *settings, planetary_hours_stat } scratch_time.unit.hour %= 12; if (scratch_time.unit.hour == 0) scratch_time.unit.hour = 12; + } else if (settings->bit.clock_24h_leading_zero && scratch_time.unit.hour < 10) { + set_leading_zero = true; } // planetary ruler of the hour @@ -328,6 +331,8 @@ static void _planetary_hours(movement_settings_t *settings, planetary_hours_stat watch_set_colon(); watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); if ( state->ruler == 2 ) _planetary_icon(planet); } diff --git a/movement/watch_faces/complication/planetary_time_face.c b/movement/watch_faces/complication/planetary_time_face.c index 56a18cf22..7e7ac6c7d 100644 --- a/movement/watch_faces/complication/planetary_time_face.c +++ b/movement/watch_faces/complication/planetary_time_face.c @@ -206,6 +206,7 @@ static void _planetary_time(movement_event_t event, movement_settings_t *setting double night_hour_count = 0.0; uint8_t weekday, planet, planetary_hour; double hour_duration, current_hour, current_minute, current_second; + bool set_leading_zero = false; watch_set_colon(); @@ -218,7 +219,7 @@ static void _planetary_time(movement_event_t event, movement_settings_t *setting return; } - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); // PM for night hours, otherwise the night hours are counted from 13 if ( state->night ) { @@ -246,6 +247,9 @@ static void _planetary_time(movement_event_t event, movement_settings_t *setting state->scratch.unit.minute = floor(current_minute); state->scratch.unit.second = (uint8_t)floor(current_second) % 60; + if (settings->bit.clock_mode_24h && settings->bit.clock_24h_leading_zero && state->scratch.unit.hour < 10) + set_leading_zero = true; + // what weekday is it (0 - 6) weekday = watch_utility_get_iso8601_weekday_number(state->scratch.unit.year, state->scratch.unit.month, state->scratch.unit.day) - 1; @@ -263,6 +267,8 @@ static void _planetary_time(movement_event_t event, movement_settings_t *setting else sprintf(buf, "%s h%2d%02d%02d", ruler, state->scratch.unit.hour, state->scratch.unit.minute, state->scratch.unit.second); watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); if ( state->ruler == 2 ) _planetary_icon(planet); diff --git a/movement/watch_faces/complication/sunrise_sunset_face.c b/movement/watch_faces/complication/sunrise_sunset_face.c index 82de9c6ec..65dbc553e 100644 --- a/movement/watch_faces/complication/sunrise_sunset_face.c +++ b/movement/watch_faces/complication/sunrise_sunset_face.c @@ -85,7 +85,7 @@ static void _sunrise_sunset_face_update(movement_settings_t *settings, sunrise_s } watch_set_colon(); - if (settings->bit.clock_mode_24h) watch_set_indicator(WATCH_INDICATOR_24H); + if (settings->bit.clock_mode_24h && !settings->bit.clock_24h_leading_zero) watch_set_indicator(WATCH_INDICATOR_24H); rise += hours_from_utc; set += hours_from_utc; @@ -105,12 +105,17 @@ static void _sunrise_sunset_face_update(movement_settings_t *settings, sunrise_s if (date_time.reg < scratch_time.reg || show_next_match) { if (state->rise_index == 0 || show_next_match) { + bool set_leading_zero = false; if (!settings->bit.clock_mode_24h) { if (watch_utility_convert_to_12_hour(&scratch_time)) watch_set_indicator(WATCH_INDICATOR_PM); else watch_clear_indicator(WATCH_INDICATOR_PM); + } else if (settings->bit.clock_24h_leading_zero && scratch_time.unit.hour < 10) { + set_leading_zero = true; } sprintf(buf, "rI%2d%2d%02d ", scratch_time.unit.day, scratch_time.unit.hour, scratch_time.unit.minute); watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); return; } else { show_next_match = true; @@ -132,12 +137,17 @@ static void _sunrise_sunset_face_update(movement_settings_t *settings, sunrise_s if (date_time.reg < scratch_time.reg || show_next_match) { if (state->rise_index == 0 || show_next_match) { + bool set_leading_zero = false; if (!settings->bit.clock_mode_24h) { if (watch_utility_convert_to_12_hour(&scratch_time)) watch_set_indicator(WATCH_INDICATOR_PM); else watch_clear_indicator(WATCH_INDICATOR_PM); + } else if (settings->bit.clock_24h_leading_zero && scratch_time.unit.hour < 10) { + set_leading_zero = true; } sprintf(buf, "SE%2d%2d%02d ", scratch_time.unit.day, scratch_time.unit.hour, scratch_time.unit.minute); watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); return; } else { show_next_match = true; diff --git a/movement/watch_faces/complication/wake_face.c b/movement/watch_faces/complication/wake_face.c index 5c5f86be5..99a7f946e 100644 --- a/movement/watch_faces/complication/wake_face.c +++ b/movement/watch_faces/complication/wake_face.c @@ -50,12 +50,15 @@ void _wake_face_update_display(movement_settings_t *settings, wake_face_state_t uint8_t hour = state->hour; watch_clear_display(); - if ( settings->bit.clock_mode_24h ) - watch_set_indicator(WATCH_INDICATOR_24H); - else { + bool set_leading_zero = false; + if ( !settings->bit.clock_mode_24h ) { if ( hour >= 12 ) watch_set_indicator(WATCH_INDICATOR_PM); hour = hour % 12 ? hour % 12 : 12; + } else if ( !settings->bit.clock_24h_leading_zero ) { + watch_set_indicator(WATCH_INDICATOR_24H); + } else if ( hour < 10 ) { + set_leading_zero = true; } if ( state->mode ) @@ -66,6 +69,8 @@ void _wake_face_update_display(movement_settings_t *settings, wake_face_state_t watch_set_colon(); watch_display_string(lcdbuf, 0); + if ( set_leading_zero ) + watch_display_string("0", 4); } // diff --git a/movement/watch_faces/demo/lis2dw_logging_face.c b/movement/watch_faces/demo/lis2dw_logging_face.c index 0a957bb49..cbae54bfd 100644 --- a/movement/watch_faces/demo/lis2dw_logging_face.c +++ b/movement/watch_faces/demo/lis2dw_logging_face.c @@ -41,6 +41,7 @@ static void _lis2dw_logging_face_update_display(movement_settings_t *settings, l char time_indication_character; int8_t pos; watch_date_time date_time; + bool set_leading_zero = false; if (logger_state->log_ticks) { pos = (logger_state->data_points - 1 - logger_state->display_index) % LIS2DW_LOGGING_NUM_DATA_POINTS; @@ -50,12 +51,14 @@ static void _lis2dw_logging_face_update_display(movement_settings_t *settings, l } else { date_time = logger_state->data[pos].timestamp; watch_set_colon(); - if (settings->bit.clock_mode_24h) { - watch_set_indicator(WATCH_INDICATOR_24H); - } else { + if (!settings->bit.clock_mode_24h) { if (date_time.unit.hour > 11) watch_set_indicator(WATCH_INDICATOR_PM); date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; + } else if (!settings->bit.clock_24h_leading_zero) { + watch_set_indicator(WATCH_INDICATOR_24H); + } else if (date_time.unit.hour < 10) { + set_leading_zero = true; } switch (logger_state->axis_index) { case 0: @@ -89,6 +92,8 @@ static void _lis2dw_logging_face_update_display(movement_settings_t *settings, l logger_state->interrupts[2]); } watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); } static void _lis2dw_logging_face_log_data(lis2dw_logger_state_t *logger_state) { diff --git a/movement/watch_faces/sensor/thermistor_logging_face.c b/movement/watch_faces/sensor/thermistor_logging_face.c index 64f605e9a..18625cce2 100644 --- a/movement/watch_faces/sensor/thermistor_logging_face.c +++ b/movement/watch_faces/sensor/thermistor_logging_face.c @@ -40,9 +40,10 @@ static void _thermistor_logging_face_log_data(thermistor_logger_state_t *logger_ thermistor_driver_disable(); } -static void _thermistor_logging_face_update_display(thermistor_logger_state_t *logger_state, bool in_fahrenheit, bool clock_mode_24h) { +static void _thermistor_logging_face_update_display(thermistor_logger_state_t *logger_state, bool in_fahrenheit, bool clock_mode_24h, bool clock_24h_leading_zero) { int8_t pos = (logger_state->data_points - 1 - logger_state->display_index) % THERMISTOR_LOGGING_NUM_DATA_POINTS; char buf[14]; + bool set_leading_zero = false; watch_clear_indicator(WATCH_INDICATOR_24H); watch_clear_indicator(WATCH_INDICATOR_PM); @@ -53,12 +54,14 @@ static void _thermistor_logging_face_update_display(thermistor_logger_state_t *l } else if (logger_state->ts_ticks) { watch_date_time date_time = logger_state->data[pos].timestamp; watch_set_colon(); - if (clock_mode_24h) { - watch_set_indicator(WATCH_INDICATOR_24H); - } else { + if (!clock_mode_24h) { if (date_time.unit.hour > 11) watch_set_indicator(WATCH_INDICATOR_PM); date_time.unit.hour %= 12; if (date_time.unit.hour == 0) date_time.unit.hour = 12; + } else if (!clock_24h_leading_zero) { + watch_set_indicator(WATCH_INDICATOR_24H); + } else if (date_time.unit.hour < 10) { + set_leading_zero = true; } sprintf(buf, "AT%2d%2d%02d%02d", date_time.unit.day, date_time.unit.hour, date_time.unit.minute, date_time.unit.second); } else { @@ -70,6 +73,8 @@ static void _thermistor_logging_face_update_display(thermistor_logger_state_t *l } watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); } void thermistor_logging_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { @@ -100,18 +105,18 @@ bool thermistor_logging_face_loop(movement_event_t event, movement_settings_t *s break; case EVENT_LIGHT_BUTTON_DOWN: logger_state->ts_ticks = 2; - _thermistor_logging_face_update_display(logger_state, settings->bit.use_imperial_units, settings->bit.clock_mode_24h); + _thermistor_logging_face_update_display(logger_state, settings->bit.use_imperial_units, settings->bit.clock_mode_24h, settings->bit.clock_24h_leading_zero); break; case EVENT_ALARM_BUTTON_DOWN: logger_state->display_index = (logger_state->display_index + 1) % THERMISTOR_LOGGING_NUM_DATA_POINTS; logger_state->ts_ticks = 0; // fall through case EVENT_ACTIVATE: - _thermistor_logging_face_update_display(logger_state, settings->bit.use_imperial_units, settings->bit.clock_mode_24h); + _thermistor_logging_face_update_display(logger_state, settings->bit.use_imperial_units, settings->bit.clock_mode_24h, settings->bit.clock_24h_leading_zero); break; case EVENT_TICK: if (logger_state->ts_ticks && --logger_state->ts_ticks == 0) { - _thermistor_logging_face_update_display(logger_state, settings->bit.use_imperial_units, settings->bit.clock_mode_24h); + _thermistor_logging_face_update_display(logger_state, settings->bit.use_imperial_units, settings->bit.clock_mode_24h, settings->bit.clock_24h_leading_zero); } break; case EVENT_BACKGROUND_TASK: diff --git a/movement/watch_faces/settings/preferences_face.c b/movement/watch_faces/settings/preferences_face.c index b0e328b3f..1cbffc1f2 100644 --- a/movement/watch_faces/settings/preferences_face.c +++ b/movement/watch_faces/settings/preferences_face.c @@ -93,6 +93,14 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings break; } break; + case EVENT_ALARM_LONG_PRESS: + switch (current_page) { + case 0: + if (settings->bit.clock_mode_24h) + settings->bit.clock_24h_leading_zero = !(settings->bit.clock_24h_leading_zero); + break; + } + break; case EVENT_TIMEOUT: movement_move_to_face(0); break; @@ -107,8 +115,10 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings char buf[8]; switch (current_page) { case 0: - if (settings->bit.clock_mode_24h) watch_display_string("24h", 4); - else watch_display_string("12h", 4); + if (settings->bit.clock_mode_24h) { + if (settings->bit.clock_24h_leading_zero) watch_display_string("024h", 4); + else watch_display_string("24h", 4); + } else watch_display_string("12h", 4); break; case 1: if (settings->bit.button_should_sound) watch_display_string("y", 9); diff --git a/movement/watch_faces/settings/set_time_face.c b/movement/watch_faces/settings/set_time_face.c index 84a4d18c1..930807121 100644 --- a/movement/watch_faces/settings/set_time_face.c +++ b/movement/watch_faces/settings/set_time_face.c @@ -131,10 +131,14 @@ bool set_time_face_loop(movement_event_t event, movement_settings_t *settings, v } char buf[11]; + bool set_leading_zero = false; if (current_page < 3) { watch_set_colon(); if (settings->bit.clock_mode_24h) { - watch_set_indicator(WATCH_INDICATOR_24H); + if (!settings->bit.clock_24h_leading_zero) + watch_set_indicator(WATCH_INDICATOR_24H); + else if (date_time.unit.hour < 10) + set_leading_zero = true; sprintf(buf, "%s %2d%02d%02d", set_time_face_titles[current_page], date_time.unit.hour, date_time.unit.minute, date_time.unit.second); } else { sprintf(buf, "%s %2d%02d%02d", set_time_face_titles[current_page], (date_time.unit.hour % 12) ? (date_time.unit.hour % 12) : 12, date_time.unit.minute, date_time.unit.second); @@ -175,6 +179,8 @@ bool set_time_face_loop(movement_event_t event, movement_settings_t *settings, v } watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); return true; } diff --git a/movement/watch_faces/settings/set_time_hackwatch_face.c b/movement/watch_faces/settings/set_time_hackwatch_face.c index c65e2ffc0..863dcc206 100644 --- a/movement/watch_faces/settings/set_time_hackwatch_face.c +++ b/movement/watch_faces/settings/set_time_hackwatch_face.c @@ -209,10 +209,14 @@ bool set_time_hackwatch_face_loop(movement_event_t event, movement_settings_t *s } char buf[11]; + bool set_leading_zero = false; if (current_page < 3) { watch_set_colon(); if (settings->bit.clock_mode_24h) { - watch_set_indicator(WATCH_INDICATOR_24H); + if (!settings->bit.clock_24h_leading_zero) + watch_set_indicator(WATCH_INDICATOR_24H); + else if (date_time_settings.unit.hour < 10) + set_leading_zero = true; sprintf(buf, "%s %2d%02d%02d", set_time_hackwatch_face_titles[current_page], @@ -278,6 +282,8 @@ bool set_time_hackwatch_face_loop(movement_event_t event, movement_settings_t *s } watch_display_string(buf, 0); + if (set_leading_zero) + watch_display_string("0", 4); return true; }