1
0
mirror of https://github.com/whowechina/iidx_pico.git synced 2024-09-23 18:58:22 +02:00

Turntable ppr setting

This commit is contained in:
whowechina 2023-05-03 11:06:11 +08:00
parent 13f9e8ff2b
commit 8235ed88ac
7 changed files with 69 additions and 7 deletions

Binary file not shown.

View File

@ -26,6 +26,7 @@ static iidx_cfg_t default_cfg = {
.tt_sensor = {
.mode = 0,
.deadzone = 0,
.ppr = 0,
},
.effects = {
.e1 = 255,
@ -55,6 +56,10 @@ static void config_loaded()
iidx_cfg->tt_sensor.mode = 0;
config_changed();
}
if (iidx_cfg->tt_sensor.ppr > 3) {
iidx_cfg->tt_sensor.ppr = 0;
config_changed();
}
}
void config_changed()

View File

@ -29,6 +29,7 @@ typedef struct __attribute ((packed)) {
struct {
uint8_t mode; /* 0: analog, 1: analog reversed, 2: i2c, 3: i2c reversed */
uint8_t deadzone; /* only for analog */
uint8_t ppr; /* 0: 256, 1: 128, 2: 96, 3: 64, other: 256 */
} tt_sensor;
struct {
uint8_t e1;

View File

@ -72,11 +72,12 @@ static void core1_loop()
#define RUN_EVERY_N_MS(a, ms) { if (frame % ms == 0) a; }
uint32_t frame = 0;
while (true) {
uint32_t angle = turntable_read();
uint32_t angle = turntable_raw();
rgb_set_angle(angle);
hid_report.joy[0] = angle >> 4; // 12bit to 8bit
hid_report.joy[1] = 255 - hid_report.joy[0];
uint8_t angle8 = turntable_read();
hid_report.joy[0] = angle8;
hid_report.joy[1] = 255 - angle8;
RUN_EVERY_N_MS(rgb_update(), 2);
turntable_update();
@ -102,7 +103,7 @@ static void core0_loop()
tud_task();
uint16_t buttons = button_read();
boot_usb_check(buttons);
uint16_t angle = turntable_read() >> 4;
uint16_t angle = turntable_raw() >> 4;
if (setup_run(buttons, angle)) {
rgb_force_display(setup_led_button, setup_led_tt);
} else {

View File

@ -181,6 +181,14 @@ static void tt_key_change()
iidx_cfg->tt_sensor.deadzone = 1;
} else if (JUST_PRESSED(KEY_6)) {
iidx_cfg->tt_sensor.deadzone = 2;
} else if (JUST_PRESSED(KEY_1)) {
iidx_cfg->tt_sensor.ppr = 0;
} else if (JUST_PRESSED(KEY_3)) {
iidx_cfg->tt_sensor.ppr = 1;
} else if (JUST_PRESSED(KEY_5)) {
iidx_cfg->tt_sensor.ppr = 2;
} else if (JUST_PRESSED(KEY_7)) {
iidx_cfg->tt_sensor.ppr = 3;
}
check_exit();
@ -268,6 +276,10 @@ static void tt_loop()
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;
setup_led_button[LED_KEY_1] = iidx_cfg->tt_sensor.ppr == 0 ? SILVER : 0;
setup_led_button[LED_KEY_3] = iidx_cfg->tt_sensor.ppr == 1 ? SILVER : 0;
setup_led_button[LED_KEY_5] = iidx_cfg->tt_sensor.ppr == 2 ? SILVER : 0;
setup_led_button[LED_KEY_7] = iidx_cfg->tt_sensor.ppr == 3 ? SILVER : 0;
}
static struct {

View File

@ -19,7 +19,6 @@
#include "config.h"
static uint16_t angle = 0;
static uint8_t current_mode = 0;
static void init_i2c()
@ -178,8 +177,51 @@ void turntable_update()
}
}
uint16_t turntable_read()
uint16_t turntable_raw()
{
bool reversed = iidx_cfg->tt_sensor.mode & 0x01;
return reversed ? 4095 - angle : angle; // 12bit
}
uint8_t turntable_read()
{
static uint8_t counter = 0;
static int16_t old_angle = 0;
uint16_t step;
if (iidx_cfg->tt_sensor.ppr == 1) {
step = 4096 / 128;
} else if (iidx_cfg->tt_sensor.ppr == 2) {
step = 4096 / 96;
} else if (iidx_cfg->tt_sensor.ppr == 3) {
step = 4096 / 64;
} else {
return angle >> 4;
}
int16_t delta = angle - old_angle;
if (delta == 0) {
return counter;
} else if (delta > 2048) {
delta -= 4096;
} else if (delta < -2048) {
delta += 4096;
}
if (abs(delta) >= step) {
if (delta > 0) {
counter++;
old_angle += step;
} else {
counter--;
old_angle -= step;
}
if (old_angle > 4096) {
old_angle -= 4096;
} else if (old_angle < 0) {
old_angle += 4096;
}
}
return counter;
}

View File

@ -10,7 +10,8 @@
#include <stdbool.h>
void turntable_init();
uint16_t turntable_read();
uint8_t turntable_read();
uint16_t turntable_raw();
void turntable_update();
#endif