diff options
-rw-r--r-- | apps/pro-rainbow-test/app.c | 64 | ||||
-rwxr-xr-x | apps/pro-rainbow-test/make/Makefile | 10 | ||||
-rw-r--r-- | watch-library/hardware/watch/watch_led.c | 14 | ||||
-rw-r--r-- | watch-library/hardware/watch/watch_private.c | 20 | ||||
-rw-r--r-- | watch-library/shared/watch/watch_led.h | 10 | ||||
-rw-r--r-- | watch-library/simulator/watch/watch_led.c | 5 |
6 files changed, 120 insertions, 3 deletions
diff --git a/apps/pro-rainbow-test/app.c b/apps/pro-rainbow-test/app.c new file mode 100644 index 00000000..b26f39e6 --- /dev/null +++ b/apps/pro-rainbow-test/app.c @@ -0,0 +1,64 @@ +#include <stdio.h> +#include <string.h> +#include "watch.h" + +void app_init(void) { +} + +void app_wake_from_backup(void) { +} + +void app_setup(void) { + watch_enable_leds(); +} + +void app_prepare_for_standby(void) { +} + +void app_wake_from_standby(void) { +} + +bool app_loop(void) { + static uint8_t red = 0; + static uint8_t green = 0; + static uint8_t blue = 255; + static uint8_t phase = 0; + + switch (phase) { + case 0: + red++; + if (red == 255) phase = 1; + break; + case 1: + green++; + if (green == 255) phase = 2; + break; + case 2: + red--; + if (red == 0) phase = 3; + break; + case 3: + blue++; + if (blue == 255) phase = 4; + break; + case 4: + green--; + if (green == 0) phase = 5; + break; + case 5: + red++; + if (red == 255) phase = 6; + break; + case 6: + blue--; + if (blue == 0) { + phase = 1; + } + break; + } + + watch_set_led_color_rgb(red, green, blue); + delay_ms(2); + + return false; +} diff --git a/apps/pro-rainbow-test/make/Makefile b/apps/pro-rainbow-test/make/Makefile new file mode 100755 index 00000000..c66ad20c --- /dev/null +++ b/apps/pro-rainbow-test/make/Makefile @@ -0,0 +1,10 @@ +TOP = ../../.. +include $(TOP)/make.mk + +INCLUDES += \ + -I../ + +SRCS += \ + ../app.c + +include $(TOP)/rules.mk diff --git a/watch-library/hardware/watch/watch_led.c b/watch-library/hardware/watch/watch_led.c index 5e2d8ecf..ba5c043a 100644 --- a/watch-library/hardware/watch/watch_led.c +++ b/watch-library/hardware/watch/watch_led.c @@ -35,10 +35,24 @@ void watch_disable_leds(void) { } void watch_set_led_color(uint8_t red, uint8_t green) { +#ifdef WATCH_BLUE_TCC_CHANNEL + watch_set_led_color_rgb(red, green, 0); +#else + watch_set_led_color_rgb(red, green, green); +#endif +} + +void watch_set_led_color_rgb(uint8_t red, uint8_t green, uint8_t blue) { +#ifndef WATCH_BLUE_TCC_CHANNEL + (void) blue; // silence warning +#endif if (hri_tcc_get_CTRLA_reg(TCC0, TCC_CTRLA_ENABLE)) { uint32_t period = hri_tcc_get_PER_reg(TCC0, TCC_PER_MASK); hri_tcc_write_CCBUF_reg(TCC0, WATCH_RED_TCC_CHANNEL, ((period * red * 1000ull) / 255000ull)); hri_tcc_write_CCBUF_reg(TCC0, WATCH_GREEN_TCC_CHANNEL, ((period * green * 1000ull) / 255000ull)); +#ifdef WATCH_BLUE_TCC_CHANNEL + hri_tcc_write_CCBUF_reg(TCC0, WATCH_BLUE_TCC_CHANNEL, ((period * blue * 1000ull) / 255000ull)); +#endif } } diff --git a/watch-library/hardware/watch/watch_private.c b/watch-library/hardware/watch/watch_private.c index d6da4404..b6548a77 100644 --- a/watch-library/hardware/watch/watch_private.c +++ b/watch-library/hardware/watch/watch_private.c @@ -140,11 +140,14 @@ void _watch_enable_tcc(void) { // period (i.e. a square wave with a 50% duty cycle). // * LEDs on CC[2] and CC[3] can be set to any value from 0 (off) to PER (fully on). hri_tcc_write_WAVE_reg(TCC0, TCC_WAVE_WAVEGEN_NPWM); - #ifdef WATCH_INVERT_LED_POLARITY - // This is here for the dev board, which uses a common anode LED (instead of common cathode like the actual watch). +#ifdef WATCH_INVERT_LED_POLARITY + // This is here for the dev board and Pro, which use a common anode LED (instead of common cathode like the actual watch). hri_tcc_set_WAVE_reg(TCC0, (1 << (TCC_WAVE_POL0_Pos + WATCH_RED_TCC_CHANNEL)) | +#ifdef WATCH_BLUE_TCC_CHANNEL + (1 << (TCC_WAVE_POL0_Pos + WATCH_BLUE_TCC_CHANNEL)) | +#endif // WATCH_BLUE_TCC_CHANNEL (1 << (TCC_WAVE_POL0_Pos + WATCH_GREEN_TCC_CHANNEL))); - #endif +#endif // WATCH_INVERT_LED_POLARITY // The buzzer will set the period depending on the tone it wants to play, but we have to set some period here to // get the LED working. Almost any period will do, tho it should be below 20000 (i.e. 50 Hz) to avoid flickering. hri_tcc_write_PER_reg(TCC0, 1024); @@ -152,6 +155,9 @@ void _watch_enable_tcc(void) { hri_tcc_write_CC_reg(TCC0, WATCH_BUZZER_TCC_CHANNEL, 0); hri_tcc_write_CC_reg(TCC0, WATCH_RED_TCC_CHANNEL, 0); hri_tcc_write_CC_reg(TCC0, WATCH_GREEN_TCC_CHANNEL, 0); +#ifdef WATCH_BLUE_TCC_CHANNEL + hri_tcc_write_CC_reg(TCC0, WATCH_BLUE_TCC_CHANNEL, 0); +#endif // Enable the TCC hri_tcc_set_CTRLA_ENABLE_bit(TCC0); hri_tcc_wait_for_sync(TCC0, TCC_SYNCBUSY_ENABLE); @@ -161,6 +167,10 @@ void _watch_enable_tcc(void) { gpio_set_pin_function(RED, WATCH_RED_TCC_PINMUX); gpio_set_pin_direction(GREEN, GPIO_DIRECTION_OUT); gpio_set_pin_function(GREEN, WATCH_GREEN_TCC_PINMUX); +#ifdef WATCH_BLUE_TCC_CHANNEL + gpio_set_pin_direction(BLUE, GPIO_DIRECTION_OUT); + gpio_set_pin_function(BLUE, WATCH_BLUE_TCC_PINMUX); +#endif } void _watch_disable_tcc(void) { @@ -171,6 +181,10 @@ void _watch_disable_tcc(void) { gpio_set_pin_function(RED, GPIO_PIN_FUNCTION_OFF); gpio_set_pin_direction(GREEN, GPIO_DIRECTION_OFF); gpio_set_pin_function(GREEN, GPIO_PIN_FUNCTION_OFF); +#ifdef WATCH_BLUE_TCC_CHANNEL + gpio_set_pin_direction(BLUE, GPIO_DIRECTION_OFF); + gpio_set_pin_function(BLUE, GPIO_PIN_FUNCTION_OFF); +#endif // disable the TCC hri_tcc_clear_CTRLA_ENABLE_bit(TCC0); diff --git a/watch-library/shared/watch/watch_led.h b/watch-library/shared/watch/watch_led.h index 7e2dea2e..fcb8c5e7 100644 --- a/watch-library/shared/watch/watch_led.h +++ b/watch-library/shared/watch/watch_led.h @@ -63,6 +63,16 @@ void watch_disable_leds(void); */ void watch_set_led_color(uint8_t red, uint8_t green); +/** @brief On boards with an RGB LED, sets the LED to a custom color by modulating each output's duty cycle. + * @param red The red value from 0-255. + * @param green The green value from 0-255. + * @param blue The blue value from 0-255. + * @note If you are displaying a custom color, you will need to prevent your app from going to sleep + * while the LED is on; otherwise, the color will not display correctly. You can do this by + * returning false in your app_loop method. + */ +void watch_set_led_color_rgb(uint8_t red, uint8_t green, uint8_t blue); + /** @brief Sets the red LED to full brightness, and turns the green LED off. * @details Of the two LED's in the RG bi-color LED, the red LED is the less power-efficient one (~4.5 mA). */ diff --git a/watch-library/simulator/watch/watch_led.c b/watch-library/simulator/watch/watch_led.c index 636dc74f..584611fe 100644 --- a/watch-library/simulator/watch/watch_led.c +++ b/watch-library/simulator/watch/watch_led.c @@ -44,6 +44,11 @@ void watch_set_led_color(uint8_t red, uint8_t green) { }, red, green); } +void watch_set_led_color_rgb(uint8_t red, uint8_t green, uint8_t blue) { + (void) blue; + watch_set_led_color(red, green); +} + void watch_set_led_red(void) { watch_set_led_color(255, 0); } |