diff --git a/Production/Firmware/aic_pico.uf2 b/Production/Firmware/aic_pico.uf2 index 2611edf..1f4055b 100644 Binary files a/Production/Firmware/aic_pico.uf2 and b/Production/Firmware/aic_pico.uf2 differ diff --git a/firmware/aic_pico.uf2 b/firmware/aic_pico.uf2 deleted file mode 100644 index f81dccc..0000000 Binary files a/firmware/aic_pico.uf2 and /dev/null differ diff --git a/firmware/src/CMakeLists.txt b/firmware/src/CMakeLists.txt index 841428c..48d800c 100644 --- a/firmware/src/CMakeLists.txt +++ b/firmware/src/CMakeLists.txt @@ -4,7 +4,7 @@ set(LWIP_ROOT ${PICO_SDK_PATH}/lib/lwip) function(make_firmware board board_def) pico_sdk_init() add_executable(${board} - main.c save.c config.c commands.c rgb.c keypad.c + main.c save.c config.c commands.c light.c keypad.c aime.c cli.c pn532.c usb_descriptors.c) target_compile_definitions(${board} PUBLIC ${board_def}) diff --git a/firmware/src/board_defs.h b/firmware/src/board_defs.h index c886daa..b04b850 100644 --- a/firmware/src/board_defs.h +++ b/firmware/src/board_defs.h @@ -12,6 +12,7 @@ #define RGB_PIN 12 #define RGB_ORDER GRB // or RGB +#define LED_DEF { 25, 22, 13, 15 } #define KEYPAD_DEF { 6, 7, 8, 3, 4, 5, 0, 1, 2, 9, 10, 11 } /* HID Keycode: https://github.com/hathach/tinyusb/blob/master/src/class/hid/hid.h */ diff --git a/firmware/src/rgb.c b/firmware/src/light.c similarity index 78% rename from firmware/src/rgb.c rename to firmware/src/light.c index a856264..bf0c1fc 100644 --- a/firmware/src/rgb.c +++ b/firmware/src/light.c @@ -1,10 +1,10 @@ /* - * RGB LED (WS2812) Strip control + * Light (WS2812 + LED) control * WHowe * */ -#include "rgb.h" +#include "light.h" #include #include @@ -14,15 +14,17 @@ #include "bsp/board.h" #include "hardware/pio.h" #include "hardware/timer.h" +#include "hardware/pwm.h" #include "ws2812.pio.h" #include "board_defs.h" #include "config.h" -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - static uint32_t rgb_buf[16]; +static uint8_t led_gpio[] = LED_DEF; +#define RGB_NUM (sizeof(rgb_buf) / sizeof(rgb_buf[0])) +#define LED_NUM (sizeof(led_gpio)) #define _MAP_LED(x) _MAKE_MAPPER(x) #define _MAKE_MAPPER(x) MAP_LED_##x @@ -132,13 +134,19 @@ static void rainbow_update() static uint32_t rotator = 0; rotator = (rotator + rainbow_speed) % COLOR_WHEEL_SIZE; - for (int i = 0; i < ARRAY_SIZE(rgb_buf); i++) { + for (int i = 0; i < RGB_NUM; i++) { uint32_t index = (rotator + RAINBOW_PITCH * i) % COLOR_WHEEL_SIZE; rgb_buf[i] = color_wheel[index]; } + + /* LED just follows rgb */ + for (int i = 0; (i < LED_NUM) && (i < RGB_NUM); i++) { + int level = rgb_buf[i] & 0xff; + pwm_set_gpio_level(led_gpio[i], level * level); + } } -void rgb_set_rainbow_speed(uint8_t speed) +void light_set_rainbow_speed(uint8_t speed) { rainbow_speed = speed / 8; } @@ -166,33 +174,33 @@ static void drive_led() } last = now; - for (int i = 0; i < ARRAY_SIZE(rgb_buf); i++) { + for (int i = 0; i < RGB_NUM; i++) { pio_sm_put_blocking(pio0, 0, rgb_buf[i] << 8u); } } -void rgb_set_color(unsigned index, uint32_t color) +void light_set_color(unsigned index, uint32_t color) { - if (index >= ARRAY_SIZE(rgb_buf)) { + if (index >= RGB_NUM) { return; } rgb_buf[index] = apply_level(color); } -void rgb_set_color_all(uint32_t color) +void light_set_color_all(uint32_t color) { - for (int i = 0; i < ARRAY_SIZE(rgb_buf); i++) { + for (int i = 0; i < RGB_NUM; i++) { rgb_buf[i] = apply_level(color); } } -void rgb_set_brg(unsigned index, const uint8_t *brg_array, size_t num) +void light_set_brg(unsigned index, const uint8_t *brg_array, size_t num) { - if (index >= ARRAY_SIZE(rgb_buf)) { + if (index >= RGB_NUM) { return; } - if (index + num > ARRAY_SIZE(rgb_buf)) { - num = ARRAY_SIZE(rgb_buf) - index; + if (index + num > RGB_NUM) { + num = RGB_NUM - index; } for (int i = 0; i < num; i++) { uint8_t b = brg_array[i * 3 + 0]; @@ -202,16 +210,28 @@ void rgb_set_brg(unsigned index, const uint8_t *brg_array, size_t num) } } -void rgb_init() +void light_init() { uint pio0_offset = pio_add_program(pio0, &ws2812_program); gpio_set_drive_strength(RGB_PIN, GPIO_DRIVE_STRENGTH_2MA); ws2812_program_init(pio0, 0, pio0_offset, RGB_PIN, 800000, false); - + + for (int i = 0; i < LED_NUM; i++) { + gpio_init(led_gpio[i]); + gpio_set_dir(led_gpio[i], GPIO_OUT); + gpio_set_function(led_gpio[i], GPIO_FUNC_PWM); + + int slice = pwm_gpio_to_slice_num(led_gpio[i]); + + pwm_config cfg = pwm_get_default_config(); + pwm_config_set_clkdiv(&cfg, 4.f); + pwm_init(slice, &cfg, true); + } + generate_color_wheel(); } -void rgb_update() +void light_update() { generate_color_wheel(); diff --git a/firmware/src/rgb.h b/firmware/src/light.h similarity index 64% rename from firmware/src/rgb.h rename to firmware/src/light.h index 307b45d..f839371 100644 --- a/firmware/src/rgb.h +++ b/firmware/src/light.h @@ -12,14 +12,14 @@ #include "config.h" -void rgb_init(); -void rgb_update(); +void light_init(); +void light_update(); uint32_t rgb32(uint32_t r, uint32_t g, uint32_t b, bool gamma_fix); uint32_t rgb32_from_hsv(uint8_t h, uint8_t s, uint8_t v); -void rgb_set_color(unsigned index, uint32_t color); -void rgb_set_color_all(uint32_t color); -void rgb_set_rainbow_speed(uint8_t speed); +void light_set_color(unsigned index, uint32_t color); +void light_set_color_all(uint32_t color); +void light_set_rainbow_speed(uint8_t speed); #endif diff --git a/firmware/src/main.c b/firmware/src/main.c index 8a645de..4d77989 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -27,7 +27,7 @@ #include "config.h" #include "cli.h" #include "commands.h" -#include "rgb.h" +#include "light.h" #include "keypad.h" #include "pn532.h" @@ -48,7 +48,7 @@ void report_hid_cardio() uint64_t now = time_us_64(); if (memcmp(hid_cardio.current, "\0\0\0\0\0\0\0\0\0", 9) != 0) { - rgb_set_rainbow_speed(255); + light_set_rainbow_speed(255); } if ((memcmp(hid_cardio.current, hid_cardio.reported, 9) != 0) && @@ -108,7 +108,7 @@ static void core1_loop() if (mutex_try_enter(&core1_io_lock, NULL)) { mutex_exit(&core1_io_lock); } - rgb_update(); + light_update(); cli_fps_count(1); sleep_ms(1); } @@ -201,7 +201,7 @@ void init() board_init(); tusb_init(); stdio_init_all(); - rgb_init(); + light_init(); keypad_init(); config_init();