[supervisor/shared/rgb_led_status.c] Initial support for RGB led as Status
This commit is contained in:
parent
c5a4e19d6f
commit
9de46f3edd
@ -50,10 +50,28 @@ busio_spi_obj_t status_apa102;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK))
|
#if defined(CP_RGB_STATUS_R) || defined(CP_RGB_STATUS_G) || defined(CP_RGB_STATUS_B)
|
||||||
|
#define CP_RGB_STATUS_LED
|
||||||
|
|
||||||
|
#include "shared-bindings/pulseio/PWMOut.h"
|
||||||
|
#include "shared-bindings/microcontroller/Pin.h"
|
||||||
|
|
||||||
|
pulseio_pwmout_obj_t rgb_status_r;
|
||||||
|
pulseio_pwmout_obj_t rgb_status_g;
|
||||||
|
pulseio_pwmout_obj_t rgb_status_b;
|
||||||
|
|
||||||
|
uint8_t rgb_status_brightness = 0xFF;
|
||||||
|
|
||||||
|
uint16_t status_rgb_color[3] = {
|
||||||
|
0 /* red */, 0 /* green */, 0 /* blue */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
|
||||||
static uint32_t current_status_color = 0;
|
static uint32_t current_status_color = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void rgb_led_status_init() {
|
void rgb_led_status_init() {
|
||||||
#ifdef MICROPY_HW_NEOPIXEL
|
#ifdef MICROPY_HW_NEOPIXEL
|
||||||
common_hal_digitalio_digitalinout_construct(&status_neopixel, MICROPY_HW_NEOPIXEL);
|
common_hal_digitalio_digitalinout_construct(&status_neopixel, MICROPY_HW_NEOPIXEL);
|
||||||
@ -93,7 +111,34 @@ void rgb_led_status_init() {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK))
|
|
||||||
|
#if defined(CP_RGB_STATUS_LED)
|
||||||
|
if (common_hal_mcu_pin_is_free(CP_RGB_STATUS_R)) {
|
||||||
|
pwmout_result_t red_result = common_hal_pulseio_pwmout_construct(&rgb_status_r, CP_RGB_STATUS_R, 0, 50000, false);
|
||||||
|
|
||||||
|
if (PWMOUT_OK == red_result) {
|
||||||
|
common_hal_pulseio_pwmout_never_reset(&rgb_status_r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (common_hal_mcu_pin_is_free(CP_RGB_STATUS_G)) {
|
||||||
|
pwmout_result_t green_result = common_hal_pulseio_pwmout_construct(&rgb_status_g, CP_RGB_STATUS_G, 0, 50000, false);
|
||||||
|
|
||||||
|
if (PWMOUT_OK == green_result) {
|
||||||
|
common_hal_pulseio_pwmout_never_reset(&rgb_status_g);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (common_hal_mcu_pin_is_free(CP_RGB_STATUS_B)) {
|
||||||
|
pwmout_result_t blue_result = common_hal_pulseio_pwmout_construct(&rgb_status_b, CP_RGB_STATUS_B, 0, 50000, false);
|
||||||
|
|
||||||
|
if (PWMOUT_OK == blue_result) {
|
||||||
|
common_hal_pulseio_pwmout_never_reset(&rgb_status_b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
|
||||||
// Force a write of the current status color.
|
// Force a write of the current status color.
|
||||||
uint32_t rgb = current_status_color;
|
uint32_t rgb = current_status_color;
|
||||||
current_status_color = 0x1000000; // Not a valid color
|
current_status_color = 0x1000000; // Not a valid color
|
||||||
@ -109,10 +154,15 @@ void reset_status_led() {
|
|||||||
reset_pin_number(MICROPY_HW_APA102_MOSI->number);
|
reset_pin_number(MICROPY_HW_APA102_MOSI->number);
|
||||||
reset_pin_number(MICROPY_HW_APA102_SCK->number);
|
reset_pin_number(MICROPY_HW_APA102_SCK->number);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CP_RGB_STATUS_LED)
|
||||||
|
reset_pin_number(CP_RGB_STATUS_R->number);
|
||||||
|
reset_pin_number(CP_RGB_STATUS_G->number);
|
||||||
|
reset_pin_number(CP_RGB_STATUS_B->number);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void new_status_color(uint32_t rgb) {
|
void new_status_color(uint32_t rgb) {
|
||||||
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK))
|
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
|
||||||
if (current_status_color == rgb) {
|
if (current_status_color == rgb) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -143,10 +193,24 @@ void new_status_color(uint32_t rgb) {
|
|||||||
common_hal_busio_spi_write(&status_apa102, status_apa102_color, 8);
|
common_hal_busio_spi_write(&status_apa102, status_apa102_color, 8);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CP_RGB_STATUS_LED)
|
||||||
|
uint8_t red_u8 = (rgb_adjusted >> 16) & 0xFF;
|
||||||
|
uint8_t green_u8 = (rgb_adjusted >> 8) & 0xFF;
|
||||||
|
uint8_t blue_u8 = rgb_adjusted & 0xFF;
|
||||||
|
|
||||||
|
status_rgb_color[0] = (uint16_t) (red_u8 << 8) + red_u8;
|
||||||
|
status_rgb_color[1] = (uint16_t) (green_u8 << 8) + green_u8;
|
||||||
|
status_rgb_color[2] = (uint16_t) (blue_u8 << 8) + blue_u8;
|
||||||
|
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_r, status_rgb_color[0]);
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_g, status_rgb_color[1]);
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_b, status_rgb_color[2]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void temp_status_color(uint32_t rgb) {
|
void temp_status_color(uint32_t rgb) {
|
||||||
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK))
|
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
|
||||||
uint32_t rgb_adjusted = rgb;
|
uint32_t rgb_adjusted = rgb;
|
||||||
rgb_adjusted = color_brightness(rgb, rgb_status_brightness);
|
rgb_adjusted = color_brightness(rgb, rgb_status_brightness);
|
||||||
#endif
|
#endif
|
||||||
@ -168,6 +232,19 @@ void temp_status_color(uint32_t rgb) {
|
|||||||
common_hal_busio_spi_write(&status_apa102, colors, 12);
|
common_hal_busio_spi_write(&status_apa102, colors, 12);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CP_RGB_STATUS_LED)
|
||||||
|
uint8_t red_u8 = (rgb_adjusted >> 16) & 0xFF;
|
||||||
|
uint8_t green_u8 = (rgb_adjusted >> 8) & 0xFF;
|
||||||
|
uint8_t blue_u8 = rgb_adjusted & 0xFF;
|
||||||
|
|
||||||
|
status_rgb_color[0] = (uint16_t) (red_u8 << 8) + red_u8;
|
||||||
|
status_rgb_color[1] = (uint16_t) (green_u8 << 8) + green_u8;
|
||||||
|
status_rgb_color[2] = (uint16_t) (blue_u8 << 8) + blue_u8;
|
||||||
|
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_r, status_rgb_color[0]);
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_g, status_rgb_color[1]);
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_b, status_rgb_color[2]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_temp_status() {
|
void clear_temp_status() {
|
||||||
@ -181,6 +258,11 @@ void clear_temp_status() {
|
|||||||
common_hal_busio_spi_write(&status_apa102, status_apa102_color, 8);
|
common_hal_busio_spi_write(&status_apa102, status_apa102_color, 8);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CP_RGB_STATUS_LED)
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_r, status_rgb_color[0]);
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_g, status_rgb_color[1]);
|
||||||
|
common_hal_pulseio_pwmout_set_duty_cycle(&rgb_status_b, status_rgb_color[2]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t color_brightness(uint32_t color, uint8_t brightness) {
|
uint32_t color_brightness(uint32_t color, uint8_t brightness) {
|
||||||
@ -210,7 +292,7 @@ void prep_rgb_status_animation(const pyexec_result_t* result,
|
|||||||
bool found_main,
|
bool found_main,
|
||||||
safe_mode_t safe_mode,
|
safe_mode_t safe_mode,
|
||||||
rgb_status_animation_t* status) {
|
rgb_status_animation_t* status) {
|
||||||
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK))
|
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
|
||||||
new_status_color(ALL_DONE);
|
new_status_color(ALL_DONE);
|
||||||
status->pattern_start = ticks_ms;
|
status->pattern_start = ticks_ms;
|
||||||
status->safe_mode = safe_mode;
|
status->safe_mode = safe_mode;
|
||||||
@ -256,7 +338,7 @@ void prep_rgb_status_animation(const pyexec_result_t* result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void tick_rgb_status_animation(rgb_status_animation_t* status) {
|
void tick_rgb_status_animation(rgb_status_animation_t* status) {
|
||||||
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK))
|
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
|
||||||
uint32_t tick_diff = ticks_ms - status->pattern_start;
|
uint32_t tick_diff = ticks_ms - status->pattern_start;
|
||||||
if (status->ok) {
|
if (status->ok) {
|
||||||
// All is good. Ramp ALL_DONE up and down.
|
// All is good. Ramp ALL_DONE up and down.
|
||||||
|
Loading…
Reference in New Issue
Block a user