bring in battery voltage face, add new method and demo for displaying floats

This commit is contained in:
joeycastillo
2024-09-30 00:24:23 -04:00
parent 5b12491ebe
commit 996571967f
10 changed files with 167 additions and 8 deletions

View File

@@ -25,6 +25,7 @@
#include "watch_slcd.h"
#include "watch_common_display.h"
#include <string.h>
#include <stdio.h>
#ifdef USE_CUSTOM_LCD
static const uint32_t IndicatorSegments[] = {
@@ -267,6 +268,37 @@ void watch_display_text_with_fallback(watch_position_t location, const char *str
#endif
}
void watch_display_float_with_best_effort(float value, const char *units) {
char buf[8];
char buf_fallback[8];
const char *blank_units = " ";
if (value < 0.0) {
watch_clear_decimal_if_available();
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "Undflo", " Unflo");
return;
} else if (value > 199.99) {
watch_clear_decimal_if_available();
watch_display_text(WATCH_POSITION_BOTTOM, "Ovrflo");
return;
}
uint16_t value_times_100 = (uint16_t)(value * 100.0);
if (value_times_100 > 9999) {
snprintf(buf, sizeof(buf), "%5u%s", value_times_100, units ? units : blank_units);
snprintf(buf_fallback, sizeof(buf_fallback), "%4.1f%s", value, units ? units : blank_units);
} else if (value_times_100 > 999) {
snprintf(buf, sizeof(buf), "%4u%s", value_times_100, units ? units : blank_units);
snprintf(buf_fallback, sizeof(buf_fallback), "%4.1f%s", value, units ? units : blank_units);
} else {
snprintf(buf, sizeof(buf), " %03u%s", value_times_100 % 1000u, units ? units : blank_units);
snprintf(buf_fallback, sizeof(buf_fallback), "%4.2f%s", value, units ? units : blank_units);
}
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, buf, buf_fallback);
watch_set_decimal_if_available();
}
void watch_set_colon(void) {
#ifdef USE_CUSTOM_LCD
watch_set_pixel(0, 0);

View File

@@ -160,6 +160,19 @@ void watch_display_text(watch_position_t location, const char *string);
*/
void watch_display_text_with_fallback(watch_position_t location, const char *string, const char *fallback);
/**
* @brief Displays a floating point number as best we can on whatever LCD is available.
* @details The custom LCD can energize a decimal point in the same position as the colon. With the leading 1,
* we can display numbers from 0.00 to 199.99 with two digits of precision. The original F-91W LCD has
* no decimal point, so we use a hyphen to indicate the decimal point. For floats from 0.00 to 9.99,
* we can display the number with two digits after the "decimal point" (hyphen). For floats from 10.0
* to 99.9, you'll only get one digit after the hyphen. For floats from 100 to 199.9, we'll still give
* you one digit after the hyphen, but you'll lose the second character of your units.
* @param value A floating point number from 0.00 to 199.99 to display on the main clock digits.
* @param units A 1-2 character string to display in the seconds position. Second character may be truncated.
*/
void watch_display_float_with_best_effort(float value, const char *units);
/** @brief Turns the colon segment on.
*/
void watch_set_colon(void);