From 87339b7a1bfbd9ba4f4cb9a180e07cad8db23b47 Mon Sep 17 00:00:00 2001 From: whowechina Date: Tue, 18 Apr 2023 23:26:15 +0800 Subject: [PATCH] Add LED Off mode --- doc/Firmware_manual.pptx | Bin 452895 -> 453110 bytes firmware/src/config.c | 19 ++++--- firmware/src/config.h | 7 ++- firmware/src/rgb.c | 113 +++++++++++++++++++++++++++++++-------- firmware/src/setup.c | 57 +++++++++++++------- firmware/src/turntable.c | 19 +++---- 6 files changed, 157 insertions(+), 58 deletions(-) diff --git a/doc/Firmware_manual.pptx b/doc/Firmware_manual.pptx index fbaa98cce55c1a41898c963c634ab7eb883caee1..c39fb338736bf54b29c4c971471a5ca841c1ad1b 100644 GIT binary patch delta 6346 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 JD&$}P{{#N12&w=8 delta 6217 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.num = 24; config_changed(); } - if (iidx_cfg->tt_sensor.analog_deadzone > 2) { - iidx_cfg->tt_sensor.analog_deadzone = 0; + if (iidx_cfg->tt_sensor.deadzone > 2) { + iidx_cfg->tt_sensor.deadzone = 0; + config_changed(); + } + if (iidx_cfg->tt_led.mode > 2) { + iidx_cfg->tt_led.mode = 0; + config_changed(); + } + if (iidx_cfg->tt_sensor.mode > 3) { + iidx_cfg->tt_sensor.mode = 0; config_changed(); } } diff --git a/firmware/src/config.h b/firmware/src/config.h index e038ce8..adcfce8 100644 --- a/firmware/src/config.h +++ b/firmware/src/config.h @@ -24,12 +24,11 @@ typedef struct __attribute ((packed)) { uint8_t effect; uint8_t param; uint8_t brightness; - bool reversed; + uint8_t mode; /* 0: on, 1: reversed, 2: off */ } tt_led; struct { - bool analog; - bool reversed; - uint8_t analog_deadzone; + uint8_t mode; /* 0: analog, 1: analog reversed, 2: i2c, 3: i2c reversed */ + uint8_t deadzone; /* only for analog */ } tt_sensor; struct { uint8_t play_vol; diff --git a/firmware/src/rgb.c b/firmware/src/rgb.c index 992e8e6..08d6783 100644 --- a/firmware/src/rgb.c +++ b/firmware/src/rgb.c @@ -12,6 +12,7 @@ #include #include +#include "bsp/board.h" #include "hardware/pio.h" #include "hardware/timer.h" @@ -31,6 +32,8 @@ static tt_effect_t effects[10] = { {trap, trap, trap, trap, 0} }; static size_t effect_num = 0; static size_t current_effect = 0; +static uint8_t current_mode = 0; + #define _MAP_LED(x) _MAKE_MAPPER(x) #define _MAKE_MAPPER(x) MAP_LED_##x #define MAP_LED_RGB { c1 = r; c2 = g; c3 = b; } @@ -105,11 +108,17 @@ void drive_led() for (int i = 0; i < ARRAY_SIZE(button_led_buf); i++) { pio_sm_put_blocking(pio0, 0, button_led_buf[i] << 8u); } + + if (iidx_cfg->tt_led.mode == 2) { + return; + } + for (int i = 0; i < iidx_cfg->tt_led.start; i++) { pio_sm_put_blocking(pio1, 0, 0); } for (int i = 0; i < TT_LED_NUM; i++) { - uint8_t id = iidx_cfg->tt_led.reversed ? TT_LED_NUM - i - 1 : i; + bool reversed = iidx_cfg->tt_led.mode & 0x01; + uint8_t id = reversed ? TT_LED_NUM - i - 1 : i; pio_sm_put_blocking(pio1, 0, tt_led_buf[id] << 8u); } for (int i = 0; i < 8; i++) { // a few more to wipe out the last led @@ -206,8 +215,90 @@ void force_update() memcpy(tt_led_buf, force_tt, TT_LED_NUM * sizeof(uint32_t)); } +void rgb_force_display(uint32_t *buttons, uint32_t *tt) +{ + force_buttons = buttons; + force_tt = tt; + force_expire_time = time_us_64() + FORCE_EXPIRE_DURATION; +} + +static bool pio1_loaded = false; + +static void wipe_out_tt_led() +{ + sleep_ms(5); + for (int i = 0; i < 128; i++) { + pio_sm_put_blocking(pio1, 0, 0); + } + sleep_ms(5); +} + +static void start_pio1() +{ + if (pio1_loaded) { + return; + } + + gpio_set_drive_strength(TT_RGB_PIN, GPIO_DRIVE_STRENGTH_8MA); + uint offset = pio_add_program(pio1, &ws2812_program); + ws2812_program_init(pio1, 0, offset, TT_RGB_PIN, 800000, false); + rgb_set_level(8); + set_effect(1); + + pio1_loaded = true; +} + +static void stop_pio1() +{ + if (!pio1_loaded) { + return; + } + + wipe_out_tt_led(); + + pio_sm_set_enabled(pio1, 0, false); + pio_clear_instruction_memory(pio1); + + gpio_set_function(TT_RGB_PIN, GPIO_FUNC_SIO); + gpio_set_dir(TT_RGB_PIN, GPIO_IN); + gpio_disable_pulls(TT_RGB_PIN); + + pio1_loaded = false; +} + +void rgb_tt_init() +{ + current_mode = iidx_cfg->tt_led.mode; + if (current_mode == 2) { + stop_pio1(); + } else { + start_pio1(); + } +} + +static void rgb_button_init() +{ + gpio_set_drive_strength(BUTTON_RGB_PIN, GPIO_DRIVE_STRENGTH_2MA); + uint offset = pio_add_program(pio0, &ws2812_program); + ws2812_program_init(pio0, 0, offset, BUTTON_RGB_PIN, 800000, false); +} + +void rgb_init() +{ + rgb_tt_init(); + rgb_button_init(); +} + +static void follow_mode_change() +{ + if (current_mode != iidx_cfg->tt_led.mode) { + rgb_tt_init(); + } +} + void rgb_update() { + follow_mode_change(); if (time_us_64() > force_expire_time) { effect_update(); button_lights_update(); @@ -217,26 +308,6 @@ void rgb_update() drive_led(); } -void rgb_force_display(uint32_t *buttons, uint32_t *tt) -{ - force_buttons = buttons; - force_tt = tt; - force_expire_time = time_us_64() + FORCE_EXPIRE_DURATION; -} - -void rgb_init() -{ - gpio_set_drive_strength(BUTTON_RGB_PIN, GPIO_DRIVE_STRENGTH_2MA); - uint offset = pio_add_program(pio0, &ws2812_program); - ws2812_program_init(pio0, 0, offset, BUTTON_RGB_PIN, 800000, false); - - gpio_set_drive_strength(BUTTON_RGB_PIN, GPIO_DRIVE_STRENGTH_8MA); - offset = pio_add_program(pio1, &ws2812_program); - ws2812_program_init(pio1, 0, offset, TT_RGB_PIN, 800000, false); - rgb_set_level(8); - set_effect(1); -} - void rgb_reg_tt_effect(tt_effect_t effect) { effects[effect_num] = effect; diff --git a/firmware/src/setup.c b/firmware/src/setup.c index 93da178..ec8cf78 100644 --- a/firmware/src/setup.c +++ b/firmware/src/setup.c @@ -152,18 +152,15 @@ static void mode_tt_key_change() tt_ctx.adjust_led_start = false; tt_ctx.start_angle = input.angle; } else if (JUST_PRESSED(E_VEFX)) { - iidx_cfg->tt_led.reversed = !iidx_cfg->tt_led.reversed; + iidx_cfg->tt_led.mode = (iidx_cfg->tt_led.mode + 1) % 3; } else if (JUST_PRESSED(E_4)) { - if (iidx_cfg->tt_sensor.reversed) { - iidx_cfg->tt_sensor.analog = !iidx_cfg->tt_sensor.analog; - } - iidx_cfg->tt_sensor.reversed = !iidx_cfg->tt_sensor.reversed; + iidx_cfg->tt_sensor.mode = (iidx_cfg->tt_sensor.mode + 1) % 4; } else if (JUST_PRESSED(KEY_2)) { - iidx_cfg->tt_sensor.analog_deadzone = 0; + iidx_cfg->tt_sensor.deadzone = 0; } else if (JUST_PRESSED(KEY_4)) { - iidx_cfg->tt_sensor.analog_deadzone = 1; + iidx_cfg->tt_sensor.deadzone = 1; } else if (JUST_PRESSED(KEY_6)) { - iidx_cfg->tt_sensor.analog_deadzone = 2; + iidx_cfg->tt_sensor.deadzone = 2; } check_exit(); @@ -207,8 +204,10 @@ void mode_tt_loop() for (int i = 1; i < iidx_cfg->tt_led.num - 1; i++) { setup_led_tt[i] = tt_rgb32(10, 10, 10, false); } - int head = iidx_cfg->tt_led.reversed ? TT_LED_NUM - 1 : 0; - int tail = iidx_cfg->tt_led.reversed ? 0 : TT_LED_NUM - 1; + + bool led_reversed = (iidx_cfg->tt_led.mode == 1); + int head = led_reversed ? TT_LED_NUM - 1 : 0; + int tail = led_reversed ? 0 : TT_LED_NUM - 1; setup_led_tt[head] = tt_rgb32(0xa0, 0, 0, false); setup_led_tt[tail] = tt_rgb32(0, 0xa0, 0, false); @@ -225,18 +224,40 @@ void mode_tt_loop() uint32_t red = button_rgb32(99, 0, 0, false); uint32_t green = button_rgb32(0, 99, 0, false); - uint32_t cyan = button_rgb32(0, 99, 99, false); + uint32_t cyan = button_rgb32(0, 40, 99, false); uint32_t yellow = button_rgb32(99, 99, 0, false); uint32_t silver = button_rgb32(60, 60, 60, false); - setup_led_button[LED_E_VEFX] = iidx_cfg->tt_led.reversed ? cyan : yellow; - setup_led_button[LED_E_4] = iidx_cfg->tt_sensor.analog ? - (iidx_cfg->tt_sensor.reversed ? red : green) : - (iidx_cfg->tt_sensor.reversed ? yellow : cyan); + switch (iidx_cfg->tt_led.mode) { + case 0: + setup_led_button[LED_E_VEFX] = cyan; + break; + case 1: + setup_led_button[LED_E_VEFX] = yellow; + break; + default: + setup_led_button[LED_E_VEFX] = 0; + break; + } - setup_led_button[LED_KEY_2] = iidx_cfg->tt_sensor.analog_deadzone == 0 ? silver : 0; - setup_led_button[LED_KEY_4] = iidx_cfg->tt_sensor.analog_deadzone == 1 ? silver : 0; - setup_led_button[LED_KEY_6] = iidx_cfg->tt_sensor.analog_deadzone == 2 ? silver : 0; + switch (iidx_cfg->tt_sensor.mode) { + case 0: + setup_led_button[LED_E_4] = green; + break; + case 1: + setup_led_button[LED_E_4] = red; + break; + case 2: + setup_led_button[LED_E_4] = cyan; + break; + default: + setup_led_button[LED_E_4] = yellow; + break; + } + + setup_led_button[LED_KEY_2] = iidx_cfg->tt_sensor.deadzone == 0 ? silver : 0; + setup_led_button[LED_KEY_4] = iidx_cfg->tt_sensor.deadzone == 1 ? silver : 0; + setup_led_button[LED_KEY_6] = iidx_cfg->tt_sensor.deadzone == 2 ? silver : 0; } static struct { diff --git a/firmware/src/turntable.c b/firmware/src/turntable.c index 0053f3b..72f84d0 100644 --- a/firmware/src/turntable.c +++ b/firmware/src/turntable.c @@ -20,7 +20,7 @@ static uint16_t angle = 0; -static bool running_analog = false; +static uint8_t current_mode = 0; static void init_i2c() { @@ -42,18 +42,18 @@ static void init_analog() static void follow_mode_change() { - if (running_analog != iidx_cfg->tt_sensor.analog) { + if (current_mode != iidx_cfg->tt_sensor.mode) { turntable_init(); } } void turntable_init() { - running_analog = iidx_cfg->tt_sensor.analog; - if (running_analog) { - init_analog(); - } else { + current_mode = iidx_cfg->tt_sensor.mode; + if (current_mode & 0x02) { init_i2c(); + } else { + init_analog(); } } @@ -141,7 +141,7 @@ static void update_analog() auto_adjust_adc(); - uint16_t deadzone = (iidx_cfg->tt_sensor.analog_deadzone + 1) * 16; + uint16_t deadzone = (iidx_cfg->tt_sensor.deadzone + 1) * 16; int new_value = read_average(200); int delta = abs(new_value - sample); @@ -171,7 +171,7 @@ static void update_i2c() void turntable_update() { follow_mode_change(); - if (running_analog) { + if (current_mode) { update_analog(); } else { update_i2c(); @@ -180,5 +180,6 @@ void turntable_update() uint16_t turntable_read() { - return iidx_cfg->tt_sensor.reversed ? 4095 - angle : angle; // 12bit + bool reversed = iidx_cfg->tt_sensor.mode & 0x01; + return reversed ? 4095 - angle : angle; // 12bit }