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:
parent
d7f0f789a6
commit
87339b7a1b
Binary file not shown.
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user