From: joeycastillo Date: Wed, 9 Oct 2024 00:27:42 +0000 (-0400) Subject: migrate temperature display to Second Movement X-Git-Url: https://git.earman.xyz/?a=commitdiff_plain;h=d9b5e209c85cdd0b93e9c501433c150f1822e76f;p=sensor-watch.git migrate temperature display to Second Movement --- diff --git a/Makefile b/Makefile index e42cb28..693341a 100644 --- a/Makefile +++ b/Makefile @@ -34,6 +34,7 @@ INCLUDES += \ -I./shell \ -I./movement/lib/sunriset \ -I./watch-library/shared/watch \ + -I./watch-library/shared/driver \ -I./watch-faces/clock \ -I./watch-faces/complication \ -I./watch-faces/demo \ @@ -50,6 +51,7 @@ SRCS += \ ./shell/shell.c \ ./shell/shell_cmd_list.c \ ./movement/lib/sunriset/sunriset.c \ + ./watch-library/shared/driver/thermistor_driver.c \ ./watch-library/shared/watch/watch_common_buzzer.c \ ./watch-library/shared/watch/watch_common_display.c \ ./watch-library/shared/watch/watch_utility.c \ diff --git a/gossamer b/gossamer index 7146786..8b401da 160000 --- a/gossamer +++ b/gossamer @@ -1 +1 @@ -Subproject commit 7146786f84898dfc465b6d5e1479a9bc52ebe8fd +Subproject commit 8b401da83a76df49012f2f093b96f8ed66773d5e diff --git a/movement/watch_faces/sensor/temperature_display_face.c b/movement/watch_faces/sensor/temperature_display_face.c deleted file mode 100644 index 3c81df9..0000000 --- a/movement/watch_faces/sensor/temperature_display_face.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2022 Joey Castillo - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include -#include -#include "temperature_display_face.h" -#include "thermistor_driver.h" -#include "watch.h" - -static void _temperature_display_face_update_display(bool in_fahrenheit) { - thermistor_driver_enable(); - float temperature_c = thermistor_driver_get_temperature(); - char buf[14]; - if (in_fahrenheit) { - sprintf(buf, "%4.1f#F", temperature_c * 1.8 + 32.0); - } else { - sprintf(buf, "%4.1f#C", temperature_c); - } - watch_display_string(buf, 4); - thermistor_driver_disable(); -} - -void temperature_display_face_setup(uint8_t watch_face_index, void ** context_ptr) { - (void) watch_face_index; - (void) context_ptr; -} - -void temperature_display_face_activate(void *context) { - (void) context; - watch_display_string("TE", 0); -} - -bool temperature_display_face_loop(movement_event_t event, void *context) { - (void) context; - watch_date_time_t date_time = watch_rtc_get_date_time(); - switch (event.event_type) { - case EVENT_ALARM_BUTTON_DOWN: - movement_set_use_imperial_units(!movement_use_imperial_units()); - _temperature_display_face_update_display(movement_use_imperial_units()); - break; - case EVENT_ACTIVATE: - // force a measurement to be taken immediately. - date_time.unit.second = 0; - // fall through - case EVENT_TICK: - if (date_time.unit.second % 5 == 4) { - // Not 100% on this, but I like the idea of using the signal indicator to indicate that we're sensing data. - // In this case we turn the indicator on a second before the reading is taken, and clear it when we're done. - // In reality the measurement takes a fraction of a second, but this is just to show something is happening. - watch_set_indicator(WATCH_INDICATOR_SIGNAL); - } else if (date_time.unit.second % 5 == 0) { - _temperature_display_face_update_display(movement_use_imperial_units()); - watch_clear_indicator(WATCH_INDICATOR_SIGNAL); - } - break; - case EVENT_LOW_ENERGY_UPDATE: - // clear seconds area and start tick animation if necessary - if (!watch_sleep_animation_is_running()) { - watch_display_string(" ", 8); - watch_start_sleep_animation(1000); - } - // update every 5 minutes - if (date_time.unit.minute % 5 == 0) { - watch_clear_indicator(WATCH_INDICATOR_SIGNAL); - _temperature_display_face_update_display(movement_use_imperial_units()); - watch_display_string(" ", 8); - } - break; - default: - movement_default_loop_handler(event); - break; - } - - return true; -} - -void temperature_display_face_resign(void *context) { - (void) context; -} diff --git a/movement/watch_faces/sensor/temperature_display_face.h b/movement/watch_faces/sensor/temperature_display_face.h deleted file mode 100644 index 1c5fb8d..0000000 --- a/movement/watch_faces/sensor/temperature_display_face.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2022 Joey Castillo - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef TEMPERATURE_DISPLAY_FACE_H_ -#define TEMPERATURE_DISPLAY_FACE_H_ - -/* - * THERMISTOR READOUT (aka Temperature Display) - * - * This watch face is designed to work with either the Temperature + GPIO - * sensor board or the Temperature + Light sensor board. It reads the current - * temperature from the thermistor voltage divider on the sensor board, and - * displays the current temperature in degrees Celsius. - * - * When the watch is on your wrist, your body heat interferes with an ambient - * temperature reading, but if you set it on a bedside table, strap it to your - * bike handlebars or place it outside of your tent while camping, this watch - * face can act as a digital thermometer for displaying ambient conditions. - * - * The temperature sensor watch face automatically samples the temperature - * once every five seconds, and it illuminates the Signal indicator just - * before taking a reading. - * - * Pressing the ALARM button toggles the unit display from Celsius to - * Fahrenheit. Technically this sets the global “Metric / Imperial” flag, so - * any other watch face that displays localizable units will display them in - * the system selected here. - */ - -#include "movement.h" - -void temperature_display_face_setup(uint8_t watch_face_index, void ** context_ptr); -void temperature_display_face_activate(void *context); -bool temperature_display_face_loop(movement_event_t event, void *context); -void temperature_display_face_resign(void *context); - -#define temperature_display_face ((const watch_face_t){ \ - temperature_display_face_setup, \ - temperature_display_face_activate, \ - temperature_display_face_loop, \ - temperature_display_face_resign, \ - NULL, \ -}) - -#endif // TEMPERATURE_DISPLAY_FACE_H_ diff --git a/movement_faces.h b/movement_faces.h index 45fab9d..a9226e9 100644 --- a/movement_faces.h +++ b/movement_faces.h @@ -34,6 +34,7 @@ #include "character_set_face.h" #include "all_segments_face.h" #include "float_demo_face.h" +#include "temperature_display_face.h" #include "voltage_face.h" #include "set_time_face.h" #include "preferences_face.h" diff --git a/watch-faces.mk b/watch-faces.mk index baaf6bc..608e82b 100644 --- a/watch-faces.mk +++ b/watch-faces.mk @@ -9,6 +9,7 @@ SRCS += \ ./watch-faces/demo/all_segments_face.c \ ./watch-faces/demo/character_set_face.c \ ./watch-faces/demo/float_demo_face.c \ + ./watch-faces/sensor/temperature_display_face.c \ ./watch-faces/sensor/voltage_face.c \ ./watch-faces/settings/set_time_face.c \ ./watch-faces/settings/preferences_face.c \ diff --git a/watch-faces/sensor/temperature_display_face.c b/watch-faces/sensor/temperature_display_face.c new file mode 100644 index 0000000..9ba21d1 --- /dev/null +++ b/watch-faces/sensor/temperature_display_face.c @@ -0,0 +1,96 @@ +/* + * MIT License + * + * Copyright (c) 2022 Joey Castillo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include "temperature_display_face.h" +#include "thermistor_driver.h" +#include "watch.h" + +static void _temperature_display_face_update_display(bool in_fahrenheit) { + thermistor_driver_enable(); + float temperature_c = thermistor_driver_get_temperature(); + if (in_fahrenheit) { + watch_display_float_with_best_effort(temperature_c * 1.8 + 32.0, "#F"); + } else { + watch_display_float_with_best_effort(temperature_c, "#C"); + } + thermistor_driver_disable(); +} + +void temperature_display_face_setup(uint8_t watch_face_index, void ** context_ptr) { + (void) watch_face_index; + (void) context_ptr; +} + +void temperature_display_face_activate(void *context) { + (void) context; + watch_display_text_with_fallback(WATCH_POSITION_TOP, "TEMP", "TE"); +} + +bool temperature_display_face_loop(movement_event_t event, void *context) { + (void) context; + watch_date_time_t date_time = watch_rtc_get_date_time(); + switch (event.event_type) { + case EVENT_ALARM_BUTTON_DOWN: + movement_set_use_imperial_units(!movement_use_imperial_units()); + _temperature_display_face_update_display(movement_use_imperial_units()); + break; + case EVENT_ACTIVATE: + // force a measurement to be taken immediately. + date_time.unit.second = 0; + // fall through + case EVENT_TICK: + if (date_time.unit.second % 5 == 4) { + // Not 100% on this, but I like the idea of using the signal indicator to indicate that we're sensing data. + // In this case we turn the indicator on a second before the reading is taken, and clear it when we're done. + // In reality the measurement takes a fraction of a second, but this is just to show something is happening. + watch_set_indicator(WATCH_INDICATOR_SIGNAL); + } else if (date_time.unit.second % 5 == 0) { + _temperature_display_face_update_display(movement_use_imperial_units()); + watch_clear_indicator(WATCH_INDICATOR_SIGNAL); + } + break; + case EVENT_LOW_ENERGY_UPDATE: + // clear seconds area and start tick animation if necessary + if (!watch_sleep_animation_is_running()) { + watch_start_sleep_animation(1000); + } + // update every 5 minutes + if (date_time.unit.minute % 5 == 0) { + watch_clear_indicator(WATCH_INDICATOR_SIGNAL); + _temperature_display_face_update_display(movement_use_imperial_units()); + } + break; + default: + movement_default_loop_handler(event); + break; + } + + return true; +} + +void temperature_display_face_resign(void *context) { + (void) context; +} diff --git a/watch-faces/sensor/temperature_display_face.h b/watch-faces/sensor/temperature_display_face.h new file mode 100644 index 0000000..1c5fb8d --- /dev/null +++ b/watch-faces/sensor/temperature_display_face.h @@ -0,0 +1,66 @@ +/* + * MIT License + * + * Copyright (c) 2022 Joey Castillo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef TEMPERATURE_DISPLAY_FACE_H_ +#define TEMPERATURE_DISPLAY_FACE_H_ + +/* + * THERMISTOR READOUT (aka Temperature Display) + * + * This watch face is designed to work with either the Temperature + GPIO + * sensor board or the Temperature + Light sensor board. It reads the current + * temperature from the thermistor voltage divider on the sensor board, and + * displays the current temperature in degrees Celsius. + * + * When the watch is on your wrist, your body heat interferes with an ambient + * temperature reading, but if you set it on a bedside table, strap it to your + * bike handlebars or place it outside of your tent while camping, this watch + * face can act as a digital thermometer for displaying ambient conditions. + * + * The temperature sensor watch face automatically samples the temperature + * once every five seconds, and it illuminates the Signal indicator just + * before taking a reading. + * + * Pressing the ALARM button toggles the unit display from Celsius to + * Fahrenheit. Technically this sets the global “Metric / Imperial” flag, so + * any other watch face that displays localizable units will display them in + * the system selected here. + */ + +#include "movement.h" + +void temperature_display_face_setup(uint8_t watch_face_index, void ** context_ptr); +void temperature_display_face_activate(void *context); +bool temperature_display_face_loop(movement_event_t event, void *context); +void temperature_display_face_resign(void *context); + +#define temperature_display_face ((const watch_face_t){ \ + temperature_display_face_setup, \ + temperature_display_face_activate, \ + temperature_display_face_loop, \ + temperature_display_face_resign, \ + NULL, \ +}) + +#endif // TEMPERATURE_DISPLAY_FACE_H_ diff --git a/watch-library/shared/driver/thermistor_driver.c b/watch-library/shared/driver/thermistor_driver.c index d9f1ae0..661f6f1 100644 --- a/watch-library/shared/driver/thermistor_driver.c +++ b/watch-library/shared/driver/thermistor_driver.c @@ -23,6 +23,7 @@ */ #include "thermistor_driver.h" +#include "sam.h" #include "watch.h" #include "watch_utility.h"