1
0
mirror of https://github.com/whowechina/iidx_pico.git synced 2025-02-15 02:12:36 +01:00

Better setup mode

This commit is contained in:
whowechina 2023-04-19 21:29:08 +08:00
parent 5344ea93c5
commit dad3945300
5 changed files with 41 additions and 62 deletions

Binary file not shown.

View File

@ -47,7 +47,7 @@ uint8_t button_gpio(uint8_t id)
} }
/* If a switch flips, it freezes for a while */ /* If a switch flips, it freezes for a while */
#define DEBOUNCE_FREEZE_TIME_US 1000 #define DEBOUNCE_FREEZE_TIME_US 5000
uint16_t button_read() uint16_t button_read()
{ {
uint64_t now = time_us_64(); uint64_t now = time_us_64();

View File

@ -32,8 +32,6 @@ static tt_effect_t effects[10] = { {trap, trap, trap, trap, 0} };
static size_t effect_num = 0; static size_t effect_num = 0;
static size_t current_effect = 0; static size_t current_effect = 0;
static uint8_t current_mode = 0;
#define _MAP_LED(x) _MAKE_MAPPER(x) #define _MAP_LED(x) _MAKE_MAPPER(x)
#define _MAKE_MAPPER(x) MAP_LED_##x #define _MAKE_MAPPER(x) MAP_LED_##x
#define MAP_LED_RGB { c1 = r; c2 = g; c3 = b; } #define MAP_LED_RGB { c1 = r; c2 = g; c3 = b; }
@ -222,8 +220,6 @@ void rgb_force_display(uint32_t *buttons, uint32_t *tt)
force_expire_time = time_us_64() + FORCE_EXPIRE_DURATION; force_expire_time = time_us_64() + FORCE_EXPIRE_DURATION;
} }
static bool pio1_loaded = false;
static void wipe_out_tt_led() static void wipe_out_tt_led()
{ {
sleep_ms(5); sleep_ms(5);
@ -233,66 +229,50 @@ static void wipe_out_tt_led()
sleep_ms(5); sleep_ms(5);
} }
static void start_pio1() static uint pio1_offset;
static bool pio1_running = false;
static void pio1_run()
{ {
if (pio1_loaded) {
return;
}
gpio_set_drive_strength(TT_RGB_PIN, GPIO_DRIVE_STRENGTH_8MA); gpio_set_drive_strength(TT_RGB_PIN, GPIO_DRIVE_STRENGTH_8MA);
uint offset = pio_add_program(pio1, &ws2812_program); ws2812_program_init(pio1, 0, pio1_offset, TT_RGB_PIN, 800000, false);
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() static void pio1_stop()
{ {
if (!pio1_loaded) {
return;
}
wipe_out_tt_led(); wipe_out_tt_led();
pio_sm_set_enabled(pio1, 0, false); pio_sm_set_enabled(pio1, 0, false);
pio_clear_instruction_memory(pio1);
gpio_set_function(TT_RGB_PIN, GPIO_FUNC_SIO); gpio_set_function(TT_RGB_PIN, GPIO_FUNC_SIO);
gpio_set_dir(TT_RGB_PIN, GPIO_IN); gpio_set_dir(TT_RGB_PIN, GPIO_IN);
gpio_disable_pulls(TT_RGB_PIN); 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() void rgb_init()
{ {
rgb_tt_init(); uint pio0_offset = pio_add_program(pio0, &ws2812_program);
rgb_button_init(); pio1_offset = pio_add_program(pio1, &ws2812_program);
gpio_set_drive_strength(BUTTON_RGB_PIN, GPIO_DRIVE_STRENGTH_2MA);
ws2812_program_init(pio0, 0, pio0_offset, BUTTON_RGB_PIN, 800000, false);
/* We don't start the tt LED program yet */
rgb_set_level(8);
set_effect(1);
} }
static void follow_mode_change() static void follow_mode_change()
{ {
if (current_mode != iidx_cfg->tt_led.mode) { bool pio1_should_run = (iidx_cfg->tt_led.mode != 2);
rgb_tt_init(); if (pio1_should_run == pio1_running) {
return;
}
pio1_running = pio1_should_run;
if (pio1_should_run) {
pio1_run();
} else {
pio1_stop();
} }
} }

View File

@ -133,9 +133,8 @@ static void mode_none_loop()
} }
static struct { static struct {
bool adjust_led_start; uint8_t adjust_led; /* 0: nothing, 1: adjust start, 2: adjust stop */
int16_t start_angle; int16_t start_angle;
uint8_t counter;
} tt_ctx; } tt_ctx;
void mode_tt_enter() void mode_tt_enter()
@ -146,10 +145,10 @@ void mode_tt_enter()
static void mode_tt_key_change() static void mode_tt_key_change()
{ {
if (JUST_PRESSED(E_START)) { if (JUST_PRESSED(E_START)) {
tt_ctx.adjust_led_start = true; tt_ctx.adjust_led = (tt_ctx.adjust_led == 1) ? 0 : 1;
tt_ctx.start_angle = input.angle; tt_ctx.start_angle = input.angle;
} else if (JUST_PRESSED(E_EFFECT)) { } else if (JUST_PRESSED(E_EFFECT)) {
tt_ctx.adjust_led_start = false; tt_ctx.adjust_led = (tt_ctx.adjust_led == 2) ? 0 : 2;
tt_ctx.start_angle = input.angle; tt_ctx.start_angle = input.angle;
} else if (JUST_PRESSED(E_VEFX)) { } else if (JUST_PRESSED(E_VEFX)) {
iidx_cfg->tt_led.mode = (iidx_cfg->tt_led.mode + 1) % 3; iidx_cfg->tt_led.mode = (iidx_cfg->tt_led.mode + 1) % 3;
@ -175,7 +174,7 @@ static void mode_tt_rotate()
#define LED_START iidx_cfg->tt_led.start #define LED_START iidx_cfg->tt_led.start
#define LED_NUM iidx_cfg->tt_led.num #define LED_NUM iidx_cfg->tt_led.num
if (tt_ctx.adjust_led_start) { if (tt_ctx.adjust_led == 1) {
if ((delta > 0) & (LED_START < 8)) { if ((delta > 0) & (LED_START < 8)) {
LED_START++; LED_START++;
if (LED_NUM > 1) { if (LED_NUM > 1) {
@ -185,7 +184,7 @@ static void mode_tt_rotate()
LED_START--; LED_START--;
LED_NUM++; LED_NUM++;
} }
} else { } else if (tt_ctx.adjust_led == 2) {
if ((delta > 0) & (LED_NUM + LED_START < 128)) { if ((delta > 0) & (LED_NUM + LED_START < 128)) {
LED_NUM++; LED_NUM++;
} else if ((delta < 0) & (LED_NUM > 1)) { // at least 1 led } else if ((delta < 0) & (LED_NUM > 1)) { // at least 1 led
@ -211,14 +210,14 @@ void mode_tt_loop()
setup_led_tt[head] = tt_rgb32(0xa0, 0, 0, false); setup_led_tt[head] = tt_rgb32(0xa0, 0, 0, false);
setup_led_tt[tail] = tt_rgb32(0, 0xa0, 0, false); setup_led_tt[tail] = tt_rgb32(0, 0xa0, 0, false);
setup_led_button[LED_E_EFFECT] = tt_rgb32(0, 10, 0, false);
setup_led_button[LED_E_START] = tt_rgb32(10, 0, 0, false);
if (tt_ctx.adjust_led_start) { if (tt_ctx.adjust_led == 1) {
setup_led_tt[head] &= mask; setup_led_tt[head] &= mask;
setup_led_button[LED_E_START] = tt_rgb32(128, 0, 0, false) & mask; setup_led_button[LED_E_START] = tt_rgb32(128, 0, 0, false) & mask;
setup_led_button[LED_E_EFFECT] = tt_rgb32(0, 10, 0, false); } else if (tt_ctx.adjust_led == 2) {
} else {
setup_led_tt[tail] &= mask; setup_led_tt[tail] &= mask;
setup_led_button[LED_E_START] = tt_rgb32(10, 0, 0, false);
setup_led_button[LED_E_EFFECT] = tt_rgb32(0, 128, 0, false) & mask; setup_led_button[LED_E_EFFECT] = tt_rgb32(0, 128, 0, false) & mask;
} }
@ -230,10 +229,10 @@ void mode_tt_loop()
switch (iidx_cfg->tt_led.mode) { switch (iidx_cfg->tt_led.mode) {
case 0: case 0:
setup_led_button[LED_E_VEFX] = cyan; setup_led_button[LED_E_VEFX] = green;
break; break;
case 1: case 1:
setup_led_button[LED_E_VEFX] = yellow; setup_led_button[LED_E_VEFX] = red;
break; break;
default: default:
setup_led_button[LED_E_VEFX] = 0; setup_led_button[LED_E_VEFX] = 0;

View File

@ -50,7 +50,7 @@ static void follow_mode_change()
void turntable_init() void turntable_init()
{ {
current_mode = iidx_cfg->tt_sensor.mode; current_mode = iidx_cfg->tt_sensor.mode;
if (current_mode & 0x02) { if (current_mode > 1) {
init_i2c(); init_i2c();
} else { } else {
init_analog(); init_analog();
@ -171,10 +171,10 @@ static void update_i2c()
void turntable_update() void turntable_update()
{ {
follow_mode_change(); follow_mode_change();
if (current_mode) { if (current_mode > 1) {
update_analog();
} else {
update_i2c(); update_i2c();
} else {
update_analog();
} }
} }