sunrise/sunset: beautify lat/lon settings on custom LCD
This commit is contained in:
parent
845d50fb34
commit
90bb34efd1
@ -31,6 +31,7 @@
|
|||||||
#include "sunrise_sunset_face.h"
|
#include "sunrise_sunset_face.h"
|
||||||
#include "watch.h"
|
#include "watch.h"
|
||||||
#include "watch_utility.h"
|
#include "watch_utility.h"
|
||||||
|
#include "watch_common_display.h"
|
||||||
#include "sunriset.h"
|
#include "sunriset.h"
|
||||||
|
|
||||||
#if __EMSCRIPTEN__
|
#if __EMSCRIPTEN__
|
||||||
@ -221,87 +222,185 @@ static void _sunrise_sunset_face_update_settings_display(movement_event_t event,
|
|||||||
return;
|
return;
|
||||||
case 1:
|
case 1:
|
||||||
watch_display_text_with_fallback(WATCH_POSITION_TOP_LEFT, "LAT", "LA");
|
watch_display_text_with_fallback(WATCH_POSITION_TOP_LEFT, "LAT", "LA");
|
||||||
sprintf(buf, "%c %04d", state->working_latitude.sign ? '-' : '+', abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)));
|
if (watch_get_lcd_type() == WATCH_LCD_TYPE_CUSTOM) {
|
||||||
if (event.subsecond % 2) buf[state->active_digit] = ' ';
|
watch_set_decimal_if_available();
|
||||||
watch_display_text(WATCH_POSITION_BOTTOM, buf);
|
watch_display_character('0' + state->working_latitude.tens, 4);
|
||||||
|
watch_display_character('0' + state->working_latitude.ones, 5);
|
||||||
|
watch_display_character('0' + state->working_latitude.tenths, 6);
|
||||||
|
watch_display_character('0' + state->working_latitude.hundredths, 7);
|
||||||
|
watch_display_character('#', 8);
|
||||||
|
if (state->working_latitude.sign) watch_display_character('S', 9);
|
||||||
|
else watch_display_character('N', 9);
|
||||||
|
|
||||||
|
if (event.subsecond % 2) {
|
||||||
|
watch_display_character(' ', 4 + state->active_digit);
|
||||||
|
// for degrees N or S, also flash the last character
|
||||||
|
if (state->active_digit == 4) watch_display_character(' ', 9);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "%c %04d", state->working_latitude.sign ? '-' : '+', abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)));
|
||||||
|
if (event.subsecond % 2) buf[state->active_digit] = ' ';
|
||||||
|
watch_display_text(WATCH_POSITION_BOTTOM, buf);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
watch_display_text_with_fallback(WATCH_POSITION_TOP_LEFT, "LON", "LO");
|
watch_display_text_with_fallback(WATCH_POSITION_TOP_LEFT, "LON", "LO");
|
||||||
sprintf(buf, "%c%05d", state->working_longitude.sign ? '-' : '+', abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)));
|
if (watch_get_lcd_type() == WATCH_LCD_TYPE_CUSTOM) {
|
||||||
if (event.subsecond % 2) buf[state->active_digit] = ' ';
|
watch_set_decimal_if_available();
|
||||||
watch_display_text(WATCH_POSITION_BOTTOM, buf);
|
// Handle leading 1 for longitudes >99
|
||||||
|
if (state->working_longitude.tens > 9) watch_set_pixel(0, 22);
|
||||||
|
watch_display_character('0' + state->working_longitude.tens % 10, 4);
|
||||||
|
watch_display_character('0' + state->working_longitude.ones, 5);
|
||||||
|
watch_display_character('0' + state->working_longitude.tenths, 6);
|
||||||
|
watch_display_character('0' + state->working_longitude.hundredths, 7);
|
||||||
|
watch_display_character('#', 8);
|
||||||
|
if (state->working_longitude.sign) watch_display_character('W', 9);
|
||||||
|
else watch_display_character('E', 9);
|
||||||
|
if (event.subsecond % 2) {
|
||||||
|
watch_display_character(' ', 4 + state->active_digit);
|
||||||
|
// for tens place, also flash leading 1 if present
|
||||||
|
if (state->active_digit == 0) watch_clear_pixel(0, 22);
|
||||||
|
// for degrees E or W, also flash the last character
|
||||||
|
if (state->active_digit == 4) watch_display_character(' ', 9);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "%c%05d", state->working_longitude.sign ? '-' : '+', abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)));
|
||||||
|
if (event.subsecond % 2) buf[state->active_digit] = ' ';
|
||||||
|
watch_display_text(WATCH_POSITION_BOTTOM, buf);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _sunrise_sunset_face_advance_digit(sunrise_sunset_state_t *state) {
|
static void _sunrise_sunset_face_advance_digit(sunrise_sunset_state_t *state) {
|
||||||
state->location_changed = true;
|
state->location_changed = true;
|
||||||
switch (state->page) {
|
if (watch_get_lcd_type() == WATCH_LCD_TYPE_CUSTOM) {
|
||||||
case 1: // latitude
|
switch (state->page) {
|
||||||
switch (state->active_digit) {
|
case 1: // latitude
|
||||||
case 0:
|
switch (state->active_digit) {
|
||||||
state->working_latitude.sign++;
|
case 0: // tens
|
||||||
break;
|
state->working_latitude.tens = (state->working_latitude.tens + 1) % 10;
|
||||||
case 1:
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) {
|
||||||
// we skip this digit
|
// prevent latitude from going over ±90.
|
||||||
break;
|
// TODO: perform these checks when advancing the digit?
|
||||||
case 2:
|
state->working_latitude.ones = 0;
|
||||||
state->working_latitude.tens = (state->working_latitude.tens + 1) % 10;
|
state->working_latitude.tenths = 0;
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) {
|
state->working_latitude.hundredths = 0;
|
||||||
// prevent latitude from going over ±90.
|
}
|
||||||
// TODO: perform these checks when advancing the digit?
|
break;
|
||||||
state->working_latitude.ones = 0;
|
case 1:
|
||||||
state->working_latitude.tenths = 0;
|
state->working_latitude.ones = (state->working_latitude.ones + 1) % 10;
|
||||||
state->working_latitude.hundredths = 0;
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.ones = 0;
|
||||||
}
|
break;
|
||||||
break;
|
case 2:
|
||||||
case 3:
|
state->working_latitude.tenths = (state->working_latitude.tenths + 1) % 10;
|
||||||
state->working_latitude.ones = (state->working_latitude.ones + 1) % 10;
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.tenths = 0;
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.ones = 0;
|
break;
|
||||||
break;
|
case 3:
|
||||||
case 4:
|
state->working_latitude.hundredths = (state->working_latitude.hundredths + 1) % 10;
|
||||||
state->working_latitude.tenths = (state->working_latitude.tenths + 1) % 10;
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.hundredths = 0;
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.tenths = 0;
|
break;
|
||||||
break;
|
case 4:
|
||||||
case 5:
|
state->working_latitude.sign++;
|
||||||
state->working_latitude.hundredths = (state->working_latitude.hundredths + 1) % 10;
|
break;
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.hundredths = 0;
|
}
|
||||||
break;
|
break;
|
||||||
}
|
case 2: // longitude
|
||||||
break;
|
switch (state->active_digit) {
|
||||||
case 2: // longitude
|
case 0:
|
||||||
switch (state->active_digit) {
|
state->working_longitude.tens = (state->working_longitude.tens + 1) % 18;
|
||||||
case 0:
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) {
|
||||||
state->working_longitude.sign++;
|
state->working_longitude.ones = 0;
|
||||||
break;
|
state->working_longitude.tenths = 0;
|
||||||
case 1:
|
state->working_longitude.hundredths = 0;
|
||||||
state->working_longitude.hundreds = (state->working_longitude.hundreds + 1) % 10;
|
}
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) {
|
break;
|
||||||
// prevent longitude from going over ±180
|
case 1:
|
||||||
state->working_longitude.tens = 8;
|
state->working_longitude.ones = (state->working_longitude.ones + 1) % 10;
|
||||||
state->working_longitude.ones = 0;
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.ones = 0;
|
||||||
state->working_longitude.tenths = 0;
|
break;
|
||||||
state->working_longitude.hundredths = 0;
|
case 2:
|
||||||
}
|
state->working_longitude.tenths = (state->working_longitude.tenths + 1) % 10;
|
||||||
break;
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.tenths = 0;
|
||||||
case 2:
|
break;
|
||||||
state->working_longitude.tens = (state->working_longitude.tens + 1) % 10;
|
case 3:
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.tens = 0;
|
state->working_longitude.hundredths = (state->working_longitude.hundredths + 1) % 10;
|
||||||
break;
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.hundredths = 0;
|
||||||
case 3:
|
break;
|
||||||
state->working_longitude.ones = (state->working_longitude.ones + 1) % 10;
|
case 4:
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.ones = 0;
|
state->working_longitude.sign++;
|
||||||
break;
|
break;
|
||||||
case 4:
|
}
|
||||||
state->working_longitude.tenths = (state->working_longitude.tenths + 1) % 10;
|
break;
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.tenths = 0;
|
}
|
||||||
break;
|
} else {
|
||||||
case 5:
|
switch (state->page) {
|
||||||
state->working_longitude.hundredths = (state->working_longitude.hundredths + 1) % 10;
|
case 1: // latitude
|
||||||
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.hundredths = 0;
|
switch (state->active_digit) {
|
||||||
break;
|
case 0:
|
||||||
}
|
state->working_latitude.sign++;
|
||||||
break;
|
break;
|
||||||
|
case 1:
|
||||||
|
// we skip this digit
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
state->working_latitude.tens = (state->working_latitude.tens + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) {
|
||||||
|
// prevent latitude from going over ±90.
|
||||||
|
// TODO: perform these checks when advancing the digit?
|
||||||
|
state->working_latitude.ones = 0;
|
||||||
|
state->working_latitude.tenths = 0;
|
||||||
|
state->working_latitude.hundredths = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
state->working_latitude.ones = (state->working_latitude.ones + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.ones = 0;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
state->working_latitude.tenths = (state->working_latitude.tenths + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.tenths = 0;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
state->working_latitude.hundredths = (state->working_latitude.hundredths + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_latitude)) > 9000) state->working_latitude.hundredths = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: // longitude
|
||||||
|
switch (state->active_digit) {
|
||||||
|
case 0:
|
||||||
|
state->working_longitude.sign++;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
state->working_longitude.hundreds = (state->working_longitude.hundreds + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) {
|
||||||
|
// prevent longitude from going over ±180
|
||||||
|
state->working_longitude.tens = 8;
|
||||||
|
state->working_longitude.ones = 0;
|
||||||
|
state->working_longitude.tenths = 0;
|
||||||
|
state->working_longitude.hundredths = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
state->working_longitude.tens = (state->working_longitude.tens + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.tens = 0;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
state->working_longitude.ones = (state->working_longitude.ones + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.ones = 0;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
state->working_longitude.tenths = (state->working_longitude.tenths + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.tenths = 0;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
state->working_longitude.hundredths = (state->working_longitude.hundredths + 1) % 10;
|
||||||
|
if (abs(_sunrise_sunset_face_latlon_from_struct(state->working_longitude)) > 18000) state->working_longitude.hundredths = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,12 +462,21 @@ bool sunrise_sunset_face_loop(movement_event_t event, void *context) {
|
|||||||
break;
|
break;
|
||||||
case EVENT_LIGHT_BUTTON_DOWN:
|
case EVENT_LIGHT_BUTTON_DOWN:
|
||||||
if (state->page) {
|
if (state->page) {
|
||||||
state->active_digit++;
|
if (watch_get_lcd_type() == WATCH_LCD_TYPE_CUSTOM) {
|
||||||
if (state->page == 1 && state->active_digit == 1) state->active_digit++; // max latitude is +- 90, no hundreds place
|
state->active_digit++;
|
||||||
if (state->active_digit > 5) {
|
if (state->active_digit > 4) {
|
||||||
state->active_digit = 0;
|
state->active_digit = 0;
|
||||||
state->page = (state->page + 1) % 3;
|
state->page = (state->page + 1) % 3;
|
||||||
_sunrise_sunset_face_update_location_register(state);
|
_sunrise_sunset_face_update_location_register(state);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
state->active_digit++;
|
||||||
|
if (state->page == 1 && state->active_digit == 1) state->active_digit++; // max latitude is +- 90, no hundreds place
|
||||||
|
if (state->active_digit > 5) {
|
||||||
|
state->active_digit = 0;
|
||||||
|
state->page = (state->page + 1) % 3;
|
||||||
|
_sunrise_sunset_face_update_location_register(state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_sunrise_sunset_face_update_settings_display(event, context);
|
_sunrise_sunset_face_update_settings_display(event, context);
|
||||||
} else if (_location_count <= 1) {
|
} else if (_location_count <= 1) {
|
||||||
|
|||||||
@ -40,8 +40,8 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t sign: 1; // 0-1
|
uint8_t sign: 1; // 0-1
|
||||||
uint8_t hundreds: 1; // 0-1, ignored for latitude
|
uint8_t hundreds: 5; // 0-1, ignored for latitude
|
||||||
uint8_t tens: 4; // 0-9 (must wrap at 10)
|
uint8_t tens: 5; // 0-18 (wraps at 10 on clasic LCD, 18 on custom LCD)
|
||||||
uint8_t ones: 4; // 0-9 (must wrap at 10)
|
uint8_t ones: 4; // 0-9 (must wrap at 10)
|
||||||
uint8_t tenths: 4; // 0-9 (must wrap at 10)
|
uint8_t tenths: 4; // 0-9 (must wrap at 10)
|
||||||
uint8_t hundredths: 4; // 0-9 (must wrap at 10)
|
uint8_t hundredths: 4; // 0-9 (must wrap at 10)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user