Port of timer_face from legacy (#64)
- Closes https://github.com/joeycastillo/second-movement/issues/15 - Fixed issue with colon disappearing if exiting settings mode on the CLEAR or LOOP strings - Use newer print function with fallback for classic display
This commit is contained in:
parent
ad854fc9b8
commit
39d2c4499e
@ -63,6 +63,7 @@
|
|||||||
#include "tally_face.h"
|
#include "tally_face.h"
|
||||||
#include "probability_face.h"
|
#include "probability_face.h"
|
||||||
#include "ke_decimal_time_face.h"
|
#include "ke_decimal_time_face.h"
|
||||||
|
#include "timer_face.h"
|
||||||
#include "simple_coin_flip_face.h"
|
#include "simple_coin_flip_face.h"
|
||||||
#include "lis2dw_monitor_face.h"
|
#include "lis2dw_monitor_face.h"
|
||||||
#include "wareki_face.h"
|
#include "wareki_face.h"
|
||||||
|
|||||||
@ -38,6 +38,7 @@ SRCS += \
|
|||||||
./watch-faces/complication/kitchen_conversions_face.c \
|
./watch-faces/complication/kitchen_conversions_face.c \
|
||||||
./watch-faces/complication/periodic_table_face.c \
|
./watch-faces/complication/periodic_table_face.c \
|
||||||
./watch-faces/clock/ke_decimal_time_face.c \
|
./watch-faces/clock/ke_decimal_time_face.c \
|
||||||
|
./watch-faces/complication/timer_face.c \
|
||||||
./watch-faces/complication/simple_coin_flip_face.c \
|
./watch-faces/complication/simple_coin_flip_face.c \
|
||||||
./watch-faces/sensor/lis2dw_monitor_face.c \
|
./watch-faces/sensor/lis2dw_monitor_face.c \
|
||||||
./watch-faces/complication/wareki_face.c \
|
./watch-faces/complication/wareki_face.c \
|
||||||
|
|||||||
@ -62,7 +62,8 @@ static void _start(timer_state_t *state, bool with_beep) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void _draw(timer_state_t *state, uint8_t subsecond) {
|
static void _draw(timer_state_t *state, uint8_t subsecond) {
|
||||||
char buf[14];
|
char bottom_time[10];
|
||||||
|
char timer_id[3];
|
||||||
uint32_t delta;
|
uint32_t delta;
|
||||||
div_t result;
|
div_t result;
|
||||||
uint8_t h, min, sec;
|
uint8_t h, min, sec;
|
||||||
@ -84,37 +85,41 @@ static void _draw(timer_state_t *state, uint8_t subsecond) {
|
|||||||
result = div(result.quot, 60);
|
result = div(result.quot, 60);
|
||||||
min = result.rem;
|
min = result.rem;
|
||||||
h = result.quot;
|
h = result.quot;
|
||||||
sprintf(buf, " %02u%02u%02u", h, min, sec);
|
sprintf(bottom_time, "%02u%02u%02u", h, min, sec);
|
||||||
break;
|
break;
|
||||||
case setting:
|
case setting:
|
||||||
if (state->settings_state == 1) {
|
if (state->settings_state == 1) {
|
||||||
// ask it the current timer shall be erased
|
// ask it the current timer shall be erased
|
||||||
sprintf(buf, " CLEAR%c", state->erase_timer_flag ? 'y' : 'n');
|
sprintf(bottom_time, "CLEAR%c", state->erase_timer_flag ? 'y' : 'n');
|
||||||
watch_clear_colon();
|
watch_clear_colon();
|
||||||
} else if (state->settings_state == 5) {
|
} else if (state->settings_state == 5) {
|
||||||
sprintf(buf, " LOOP%c", state->timers[state->current_timer].unit.repeat ? 'y' : 'n');
|
sprintf(bottom_time, " LOOP%c", state->timers[state->current_timer].unit.repeat ? 'y' : 'n');
|
||||||
watch_clear_colon();
|
watch_clear_colon();
|
||||||
} else {
|
} else {
|
||||||
sprintf(buf, " %02u%02u%02u", state->timers[state->current_timer].unit.hours,
|
sprintf(bottom_time, "%02u%02u%02u", state->timers[state->current_timer].unit.hours,
|
||||||
state->timers[state->current_timer].unit.minutes,
|
state->timers[state->current_timer].unit.minutes,
|
||||||
state->timers[state->current_timer].unit.seconds);
|
state->timers[state->current_timer].unit.seconds);
|
||||||
watch_set_colon();
|
watch_set_colon();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case waiting:
|
case waiting:
|
||||||
sprintf(buf, " %02u%02u%02u", state->timers[state->current_timer].unit.hours,
|
sprintf(bottom_time, "%02u%02u%02u", state->timers[state->current_timer].unit.hours,
|
||||||
state->timers[state->current_timer].unit.minutes,
|
state->timers[state->current_timer].unit.minutes,
|
||||||
state->timers[state->current_timer].unit.seconds);
|
state->timers[state->current_timer].unit.seconds);
|
||||||
|
watch_set_colon();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
buf[0] = 49 + state->current_timer;
|
|
||||||
|
sprintf(timer_id, "%2u", state->current_timer + 1);
|
||||||
if (state->mode == setting && subsecond % 2) {
|
if (state->mode == setting && subsecond % 2) {
|
||||||
// blink the current settings value
|
// blink the current settings value
|
||||||
if (state->settings_state == 0) buf[0] = ' ';
|
if (state->settings_state == 0) timer_id[0] = timer_id[1] = ' ';
|
||||||
else if (state->settings_state == 1 || state->settings_state == 5) buf[6] = ' ';
|
else if (state->settings_state == 1 || state->settings_state == 5) bottom_time[5] = ' ';
|
||||||
else buf[(state->settings_state - 1) * 2 - 1] = buf[(state->settings_state - 1) * 2] = ' ';
|
else bottom_time[(state->settings_state - 1) * 2 - 2] = bottom_time[(state->settings_state - 1) * 2 - 1] = ' ';
|
||||||
}
|
}
|
||||||
watch_display_string(buf, 3);
|
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, bottom_time, bottom_time);
|
||||||
|
watch_display_text_with_fallback(WATCH_POSITION_TOP_RIGHT, timer_id, timer_id);
|
||||||
|
|
||||||
// set lap indicator when we have a looping timer
|
// set lap indicator when we have a looping timer
|
||||||
if (state->timers[state->current_timer].unit.repeat) watch_set_indicator(WATCH_INDICATOR_LAP);
|
if (state->timers[state->current_timer].unit.repeat) watch_set_indicator(WATCH_INDICATOR_LAP);
|
||||||
else watch_clear_indicator(WATCH_INDICATOR_LAP);
|
else watch_clear_indicator(WATCH_INDICATOR_LAP);
|
||||||
@ -200,7 +205,7 @@ void timer_face_setup(uint8_t watch_face_index, void ** context_ptr) {
|
|||||||
|
|
||||||
void timer_face_activate(void *context) {
|
void timer_face_activate(void *context) {
|
||||||
timer_state_t *state = (timer_state_t *)context;
|
timer_state_t *state = (timer_state_t *)context;
|
||||||
watch_display_string("TR", 0);
|
watch_display_text_with_fallback(WATCH_POSITION_TOP_LEFT, "TMR", "TR");
|
||||||
watch_set_colon();
|
watch_set_colon();
|
||||||
if(state->mode == running) {
|
if(state->mode == running) {
|
||||||
watch_date_time_t now = watch_rtc_get_date_time();
|
watch_date_time_t now = watch_rtc_get_date_time();
|
||||||
@ -265,14 +270,14 @@ bool timer_face_loop(movement_event_t event, void *context) {
|
|||||||
movement_cancel_background_task();
|
movement_cancel_background_task();
|
||||||
break;
|
break;
|
||||||
case pausing:
|
case pausing:
|
||||||
_start(statemovement_get_current_timezone_offset(), false);
|
_start(state, false);
|
||||||
break;
|
break;
|
||||||
case waiting: {
|
case waiting: {
|
||||||
uint8_t last_timer = state->current_timer;
|
uint8_t last_timer = state->current_timer;
|
||||||
state->current_timer = (state->current_timer + 1) % TIMER_SLOTS;
|
state->current_timer = (state->current_timer + 1) % TIMER_SLOTS;
|
||||||
_set_next_valid_timer(state);
|
_set_next_valid_timer(state);
|
||||||
// start the time immediately if there is only one valid timer slot
|
// start the time immediately if there is only one valid timer slot
|
||||||
if (last_timer == state->current_timer) _start(statemovement_get_current_timezone_offset(), true);
|
if (last_timer == state->current_timer) _start(state, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case setting:
|
case setting:
|
||||||
@ -299,7 +304,7 @@ bool timer_face_loop(movement_event_t event, void *context) {
|
|||||||
_beeps_to_play = 4;
|
_beeps_to_play = 4;
|
||||||
watch_buzzer_play_sequence((int8_t *)_sound_seq_beep, _signal_callback);
|
watch_buzzer_play_sequence((int8_t *)_sound_seq_beep, _signal_callback);
|
||||||
_reset(state);
|
_reset(state);
|
||||||
if (state->timers[state->current_timer].unit.repeat) _start(statemovement_get_current_timezone_offset(), false);
|
if (state->timers[state->current_timer].unit.repeat) _start(state, false);
|
||||||
break;
|
break;
|
||||||
case EVENT_ALARM_LONG_PRESS:
|
case EVENT_ALARM_LONG_PRESS:
|
||||||
switch(state->mode) {
|
switch(state->mode) {
|
||||||
@ -319,7 +324,7 @@ bool timer_face_loop(movement_event_t event, void *context) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case waiting:
|
case waiting:
|
||||||
_start(statemovement_get_current_timezone_offset(), true);
|
_start(state, true);
|
||||||
break;
|
break;
|
||||||
case pausing:
|
case pausing:
|
||||||
case running:
|
case running:
|
||||||
Loading…
x
Reference in New Issue
Block a user