faces/totp: update watch face logic for new struct

Using the new structured TOTP record data structure
allows the TOTP watch face to statically and implicitly
compute the total number of defined TOTP records.

Users can now simply add new keys and records in the designated area
and the watch face will compile and automatically use them with no need
to maintain a separate array size variable. Less chance of mistakes.
This commit is contained in:
Matheus Afonso Martins Moreira 2024-02-20 23:20:21 -03:00
parent bbb920a5d8
commit 79cfe315ff

View File

@ -77,14 +77,15 @@ static void _update_display(totp_state_t *totp_state) {
char buf[14]; char buf[14];
div_t result; div_t result;
uint8_t valid_for; uint8_t valid_for;
totp_t *totp = _totp_current(totp_state);
result = div(totp_state->timestamp, timesteps[totp_state->current_index]); result = div(totp_state->timestamp, totp->period);
if (result.quot != totp_state->steps) { if (result.quot != totp_state->steps) {
totp_state->current_code = getCodeFromTimestamp(totp_state->timestamp); totp_state->current_code = getCodeFromTimestamp(totp_state->timestamp);
totp_state->steps = result.quot; totp_state->steps = result.quot;
} }
valid_for = timesteps[totp_state->current_index] - result.rem; valid_for = totp->period - result.rem;
sprintf(buf, "%c%c%2d%06lu", labels[totp_state->current_index][0], labels[totp_state->current_index][1], valid_for, totp_state->current_code); sprintf(buf, "%c%c%2d%06lu", totp->labels[0], totp->labels[1], valid_for, totp_state->current_code);
watch_display_string(buf, 0); watch_display_string(buf, 0);
} }
@ -99,7 +100,8 @@ void totp_face_activate(movement_settings_t *settings, void *context) {
(void) settings; (void) settings;
memset(context, 0, sizeof(totp_state_t)); memset(context, 0, sizeof(totp_state_t));
totp_state_t *totp_state = (totp_state_t *)context; totp_state_t *totp_state = (totp_state_t *)context;
TOTP(keys, key_sizes[0], timesteps[0], algorithms[0]); totp_t *totp = _totp_current(totp_state);
TOTP(totp->key, totp->key_length, totp->period, totp->algorithm);
totp_state->timestamp = watch_utility_date_time_to_unix_time(watch_rtc_get_date_time(), movement_timezone_offsets[settings->bit.time_zone] * 60); totp_state->timestamp = watch_utility_date_time_to_unix_time(watch_rtc_get_date_time(), movement_timezone_offsets[settings->bit.time_zone] * 60);
totp_state->current_code = getCodeFromTimestamp(totp_state->timestamp); totp_state->current_code = getCodeFromTimestamp(totp_state->timestamp);
} }
@ -119,15 +121,14 @@ bool totp_face_loop(movement_event_t event, movement_settings_t *settings, void
movement_move_to_face(0); movement_move_to_face(0);
break; break;
case EVENT_ALARM_BUTTON_UP: case EVENT_ALARM_BUTTON_UP:
if (totp_state->current_index + 1 < num_keys) { if (totp_state->current_index + 1 < _totp_num()) {
totp_state->current_key_offset += key_sizes[totp_state->current_index];
totp_state->current_index++; totp_state->current_index++;
} else { } else {
// wrap around to first key // wrap around to first key
totp_state->current_key_offset = 0;
totp_state->current_index = 0; totp_state->current_index = 0;
} }
TOTP(keys + totp_state->current_key_offset, key_sizes[totp_state->current_index], timesteps[totp_state->current_index], algorithms[totp_state->current_index]); totp_t *totp = _totp_current(totp_state);
TOTP(totp->key, totp->key_length, totp->period, totp->algorithm);
_update_display(totp_state); _update_display(totp_state);
break; break;
case EVENT_ALARM_BUTTON_DOWN: case EVENT_ALARM_BUTTON_DOWN: