1
0
mirror of https://github.com/whowechina/iidx_pico.git synced 2025-02-14 09:52:35 +01:00

Add LED Off mode

This commit is contained in:
whowechina 2023-04-18 23:26:15 +08:00
parent d7f0f789a6
commit 87339b7a1b
6 changed files with 157 additions and 58 deletions

Binary file not shown.

View File

@ -21,12 +21,11 @@ static iidx_cfg_t default_cfg = {
.effect = 0,
.param = 0,
.brightness = 5,
.reversed = false,
.mode = 0,
},
.tt_sensor = {
.analog = false,
.reversed = false,
.analog_deadzone = 0,
.mode = 0,
.deadzone = 0,
},
.effects = {
.play_vol = 255,
@ -44,8 +43,16 @@ static void config_loaded()
iidx_cfg->tt_led.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();
}
}

View File

@ -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;

View File

@ -12,6 +12,7 @@
#include <stdint.h>
#include <stdbool.h>
#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;

View File

@ -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 {

View File

@ -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
}