}
void float_demo_face_activate(void *context) {
- float *c = (float *)context;
- *c = 0;
+ float *value = (float *)context;
+ *value = -110;
watch_display_text_with_fallback(WATCH_POSITION_TOP, "FLOAT", "FL");
- movement_request_tick_frequency(32);
+ movement_request_tick_frequency(16);
}
bool float_demo_face_loop(movement_event_t event, void *context) {
- float *c = (float *)context;
+ float *value = (float *)context;
switch (event.event_type) {
case EVENT_TICK:
- *c = (*c) + 0.11;
+ *value = (*value) + 0.31;
// fall through
case EVENT_ACTIVATE:
- watch_display_float_with_best_effort(*c, "#F");
+ watch_display_float_with_best_effort(*value, "#F");
+ break;
+ case EVENT_ALARM_BUTTON_UP:
+ *value = -100;
+ movement_request_tick_frequency(16);
+ break;
+ case EVENT_ALARM_LONG_PRESS:
+ *value = -10.85;
+ movement_request_tick_frequency(1);
break;
default:
movement_default_loop_handler(event);
#include "watch_common_display.h"
#include <string.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
#ifdef USE_CUSTOM_LCD
static const uint32_t IndicatorSegments[] = {
char buf_fallback[8];
const char *blank_units = " ";
- if (value < 0.0) {
+ if (value < -99.9) {
watch_clear_decimal_if_available();
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "Undflo", " Unflo");
return;
return;
}
- uint16_t value_times_100 = (uint16_t)(value * 100.0);
- if (value_times_100 > 9999) {
+ uint16_t value_times_100 = abs((int)round(value * 100.0));
+ bool set_decimal = true;
+
+ if (value < 0 && value_times_100 != 0) {
+ if (value_times_100 > 999) {
+ // decimal point isn't in the right place for these numbers; use same format as classic.
+ set_decimal = false;
+ snprintf(buf, sizeof(buf), "-%4.1f%s", -value, units ? units : blank_units);
+ snprintf(buf_fallback, sizeof(buf_fallback), "%s", buf);
+ } else {
+ snprintf(buf, sizeof(buf), "-%03d%s", value_times_100 % 1000u, units ? units : blank_units);
+ snprintf(buf_fallback, sizeof(buf_fallback), "-%3.1f%s", -value, units ? units : blank_units);
+ }
+ } else 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) {
}
watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, buf, buf_fallback);
- watch_set_decimal_if_available();
+ if (set_decimal) {
+ watch_set_decimal_if_available();
+ } else {
+ watch_clear_decimal_if_available();
+ }
}
void watch_set_colon(void) {
/**
* @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.
+ * we can display numbers from -99.99 to 199.99 with one or two digits of precision, depending on the
+ * number and the LCD in use (classic LCD, usually 1 digit; custom LCD, usually 2). The original F-91W
+ * LCD has no decimal point, so we use a hyphen or underscore instead. For numbers <9.99, the decimal
+ * point will appear as an underscore on the custom LCD as well, since the position doesn't line up.
+ * Also note that sometimes, to offer at least one digit of precision, the second character of your
+ * units may be truncated (i.e. -12.4#F will become -12.4#).
+ * @param value A floating point number from -99.99 to 199.99 to display on the main line of the display.
* @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);