From: Joey Castillo Date: Sun, 18 May 2025 11:40:47 +0000 (-0400) Subject: light sensor: back to demo with you X-Git-Url: https://git.earman.xyz/?a=commitdiff_plain;h=d72daf72bc9f70f440db8c901f18314e098daec9;p=sensor-watch.git light sensor: back to demo with you --- diff --git a/watch-faces.mk b/watch-faces.mk index d3c2159..1a909fa 100644 --- a/watch-faces.mk +++ b/watch-faces.mk @@ -11,8 +11,8 @@ SRCS += \ ./watch-faces/complication/days_since_face.c \ ./watch-faces/demo/all_segments_face.c \ ./watch-faces/demo/character_set_face.c \ + ./watch-faces/demo/light_sensor_face.c \ ./watch-faces/sensor/accelerometer_status_face.c \ - ./watch-faces/sensor/light_sensor_face.c \ ./watch-faces/sensor/temperature_display_face.c \ ./watch-faces/sensor/temperature_logging_face.c \ ./watch-faces/sensor/activity_logging_face.c \ diff --git a/watch-faces/demo/light_sensor_face.c b/watch-faces/demo/light_sensor_face.c new file mode 100644 index 0000000..8357b37 --- /dev/null +++ b/watch-faces/demo/light_sensor_face.c @@ -0,0 +1,93 @@ +/* + * MIT License + * + * Copyright (c) 2024 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 "light_sensor_face.h" +#include "tc.h" +#include "eic.h" +#include "usb.h" +#include "adc.h" + +#ifdef HAS_IR_SENSOR + +void light_sensor_face_setup(uint8_t watch_face_index, void ** context_ptr) { + (void) watch_face_index; + if (*context_ptr == NULL) { + *context_ptr = malloc(sizeof(light_sensor_state_t)); + memset(*context_ptr, 0, sizeof(light_sensor_state_t)); + // Do any one-time tasks in here; the inside of this conditional happens only at boot. + } +} + +void light_sensor_face_activate(void *context) { + light_sensor_state_t *state = (light_sensor_state_t *)context; + (void) state; + HAL_GPIO_IR_ENABLE_out(); + HAL_GPIO_IR_ENABLE_clr(); + HAL_GPIO_IRSENSE_pmuxen(HAL_GPIO_PMUX_ADC); + adc_init(); + adc_enable(); + movement_request_tick_frequency(8); +} + +bool light_sensor_face_loop(movement_event_t event, void *context) { + light_sensor_state_t *state = (light_sensor_state_t *)context; + (void) state; + + switch (event.event_type) { + case EVENT_NONE: + case EVENT_ACTIVATE: + case EVENT_TICK: + { + char buf[7]; + uint16_t light_level = adc_get_analog_value(HAL_GPIO_IRSENSE_pin()); + snprintf(buf, 7, "%-6d", light_level); + watch_display_text_with_fallback(WATCH_POSITION_TOP, "LIGHT", "LL"); + watch_display_text(WATCH_POSITION_BOTTOM, buf); + } + break; + case EVENT_LIGHT_BUTTON_UP: + // suppress LED, as it would interfere with light sensing + break; + case EVENT_TIMEOUT: + movement_move_to_face(0); + break; + default: + return movement_default_loop_handler(event); + } + + return false; +} + +void light_sensor_face_resign(void *context) { + (void) context; + + adc_disable(); + HAL_GPIO_IRSENSE_pmuxdis(); + HAL_GPIO_IRSENSE_off(); + HAL_GPIO_IR_ENABLE_off(); +} + +#endif // HAS_IR_SENSOR diff --git a/watch-faces/demo/light_sensor_face.h b/watch-faces/demo/light_sensor_face.h new file mode 100644 index 0000000..5032bdd --- /dev/null +++ b/watch-faces/demo/light_sensor_face.h @@ -0,0 +1,59 @@ +/* + * MIT License + * + * Copyright (c) 2024 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. + */ + +#pragma once + +#include "movement.h" + +#ifdef HAS_IR_SENSOR + +/* + * LIGHT SENSOR PLAYGROUND + * + * Temporary watch face for playing with the light sensor. + * WARNING: This watch face may not play nicely with watch faces that use the ADC in the background, + * such as the temperature logger. More improvement and testing needs to be done before this is can + * be considered a production-ready watch face. + * + */ + +typedef struct { + // Anything you need to keep track of, put it here! + uint8_t unused; +} light_sensor_state_t; + +void light_sensor_face_setup(uint8_t watch_face_index, void ** context_ptr); +void light_sensor_face_activate(void *context); +bool light_sensor_face_loop(movement_event_t event, void *context); +void light_sensor_face_resign(void *context); + +#define light_sensor_face ((const watch_face_t){ \ + light_sensor_face_setup, \ + light_sensor_face_activate, \ + light_sensor_face_loop, \ + light_sensor_face_resign, \ + NULL, \ +}) + +#endif // HAS_IR_SENSOR diff --git a/watch-faces/sensor/light_sensor_face.c b/watch-faces/sensor/light_sensor_face.c deleted file mode 100644 index 8357b37..0000000 --- a/watch-faces/sensor/light_sensor_face.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2024 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 "light_sensor_face.h" -#include "tc.h" -#include "eic.h" -#include "usb.h" -#include "adc.h" - -#ifdef HAS_IR_SENSOR - -void light_sensor_face_setup(uint8_t watch_face_index, void ** context_ptr) { - (void) watch_face_index; - if (*context_ptr == NULL) { - *context_ptr = malloc(sizeof(light_sensor_state_t)); - memset(*context_ptr, 0, sizeof(light_sensor_state_t)); - // Do any one-time tasks in here; the inside of this conditional happens only at boot. - } -} - -void light_sensor_face_activate(void *context) { - light_sensor_state_t *state = (light_sensor_state_t *)context; - (void) state; - HAL_GPIO_IR_ENABLE_out(); - HAL_GPIO_IR_ENABLE_clr(); - HAL_GPIO_IRSENSE_pmuxen(HAL_GPIO_PMUX_ADC); - adc_init(); - adc_enable(); - movement_request_tick_frequency(8); -} - -bool light_sensor_face_loop(movement_event_t event, void *context) { - light_sensor_state_t *state = (light_sensor_state_t *)context; - (void) state; - - switch (event.event_type) { - case EVENT_NONE: - case EVENT_ACTIVATE: - case EVENT_TICK: - { - char buf[7]; - uint16_t light_level = adc_get_analog_value(HAL_GPIO_IRSENSE_pin()); - snprintf(buf, 7, "%-6d", light_level); - watch_display_text_with_fallback(WATCH_POSITION_TOP, "LIGHT", "LL"); - watch_display_text(WATCH_POSITION_BOTTOM, buf); - } - break; - case EVENT_LIGHT_BUTTON_UP: - // suppress LED, as it would interfere with light sensing - break; - case EVENT_TIMEOUT: - movement_move_to_face(0); - break; - default: - return movement_default_loop_handler(event); - } - - return false; -} - -void light_sensor_face_resign(void *context) { - (void) context; - - adc_disable(); - HAL_GPIO_IRSENSE_pmuxdis(); - HAL_GPIO_IRSENSE_off(); - HAL_GPIO_IR_ENABLE_off(); -} - -#endif // HAS_IR_SENSOR diff --git a/watch-faces/sensor/light_sensor_face.h b/watch-faces/sensor/light_sensor_face.h deleted file mode 100644 index 5032bdd..0000000 --- a/watch-faces/sensor/light_sensor_face.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2024 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. - */ - -#pragma once - -#include "movement.h" - -#ifdef HAS_IR_SENSOR - -/* - * LIGHT SENSOR PLAYGROUND - * - * Temporary watch face for playing with the light sensor. - * WARNING: This watch face may not play nicely with watch faces that use the ADC in the background, - * such as the temperature logger. More improvement and testing needs to be done before this is can - * be considered a production-ready watch face. - * - */ - -typedef struct { - // Anything you need to keep track of, put it here! - uint8_t unused; -} light_sensor_state_t; - -void light_sensor_face_setup(uint8_t watch_face_index, void ** context_ptr); -void light_sensor_face_activate(void *context); -bool light_sensor_face_loop(movement_event_t event, void *context); -void light_sensor_face_resign(void *context); - -#define light_sensor_face ((const watch_face_t){ \ - light_sensor_face_setup, \ - light_sensor_face_activate, \ - light_sensor_face_loop, \ - light_sensor_face_resign, \ - NULL, \ -}) - -#endif // HAS_IR_SENSOR