From a62819f29862c44b3f76eb4986d0b6a1bdb20255 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 29 Jun 2023 09:49:57 +0200 Subject: Add faders page and introduce save timer --- src/app.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 130 insertions(+), 19 deletions(-) (limited to 'src/app.c') diff --git a/src/app.c b/src/app.c index 8f70a6e..6de719b 100644 --- a/src/app.c +++ b/src/app.c @@ -154,6 +154,14 @@ typedef enum Button { POLY_PAD_ACTIVE = 11, POLY_PAD_KBD_SENS = 11 + 6, POLY_PAD_STEAL = 11 + 7, + POLY_PAD_PLAY_0 = POLY_PAD_ROW_0 + 8, + POLY_PAD_PLAY_1 = POLY_PAD_ROW_1 + 8, + POLY_PAD_PLAY_2 = POLY_PAD_ROW_2 + 8, + POLY_PAD_PLAY_3 = POLY_PAD_ROW_3 + 8, + POLY_PAD_PLAY_4 = POLY_PAD_ROW_4 + 8, + POLY_PAD_PLAY_5 = POLY_PAD_ROW_5 + 8, + POLY_PAD_PLAY_6 = POLY_PAD_ROW_6 + 8, + POLY_PAD_PLAY_7 = POLY_PAD_ROW_7 + 8, POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0, POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1, POLY_PAD_MIN_CH_2 = POLY_PAD_ROW_0 + 2, @@ -205,9 +213,10 @@ typedef enum Button { } Button; typedef enum Mode { - MOD_POLY_MAIN = 0, - MOD_POLY_SETUP = 1, - MOD_POLY_KBD = 2, + MOD_POLY_MAIN = 0, + MOD_POLY_SETUP = 1, + MOD_POLY_KBD = 2, + MOD_POLY_FADER = 3, } Mode; typedef enum Stealing { @@ -270,6 +279,8 @@ typedef struct State { u8 kbd_octave; u8 kbd_root; Sensitivity kbd_sense; + // Faders. + u8 fader_page; } State; // Globals. @@ -282,7 +293,10 @@ u8 midi_in_connected = 0; u8 midi_out_connected = 0; u8 next_voice = 0; static Mode prev_mode = MOD_POLY_MAIN; -static int save_state = 0; +static int save_request = 0; +static int save_timer = 0; + +#define SAVE_TIMER 500 // store ADC frame pointer static const u16 *g_ADC = 0; @@ -428,6 +442,12 @@ kbd_find_note(int index) { return -1; } +void +save_state(void) { + save_request = 1; + save_timer = SAVE_TIMER; +} + void app_surface_event(u8 type, u8 index, u8 value) { switch (type) { @@ -438,9 +458,13 @@ app_surface_event(u8 type, u8 index, u8 value) { switch (index) { case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; case POLY_PAD_STEAL: { poly_steal_cycle(); } break; - case POLY_PAD_NOTE: { + case POLY_PAD_NOTE: { state.mode = MOD_POLY_KBD; - save_state = 1; + save_state(); + } break; + case POLY_PAD_DEVICE: { + state.mode = MOD_POLY_FADER; + save_state(); } break; default: break; } @@ -530,8 +554,12 @@ app_surface_event(u8 type, u8 index, u8 value) { // Different sections. case POLY_PAD_SESSION: { state.mode = MOD_POLY_MAIN; - save_state = 1; - } + save_state(); + } break; + case POLY_PAD_DEVICE: { + state.mode = MOD_POLY_FADER; + save_state(); + } break; default: break; } return; @@ -574,19 +602,69 @@ app_surface_event(u8 type, u8 index, u8 value) { app_midi_event(USBSTANDALONE, NOTEOFF | channel, note, value); } } break; + case MOD_POLY_FADER: { + if (!value) { + return; + } + switch (index) { + // Different sections. + case POLY_PAD_SESSION: { + state.mode = MOD_POLY_MAIN; + save_state(); + } break; + case POLY_PAD_NOTE: { + state.mode = MOD_POLY_KBD; + save_state(); + } break; + // Fader page. + case POLY_PAD_PLAY_0: { + state.fader_page = 0; + save_state(); + } break; + case POLY_PAD_PLAY_1: { + state.fader_page = 1; + save_state(); + } break; + case POLY_PAD_PLAY_2: { + state.fader_page = 2; + save_state(); + } break; + case POLY_PAD_PLAY_3: { + state.fader_page = 3; + save_state(); + } break; + case POLY_PAD_PLAY_4: { + state.fader_page = 4; + save_state(); + } break; + case POLY_PAD_PLAY_5: { + state.fader_page = 5; + save_state(); + } break; + case POLY_PAD_PLAY_6: { + state.fader_page = 6; + save_state(); + } break; + case POLY_PAD_PLAY_7: { + state.fader_page = 7; + save_state(); + } break; + default: break; + } + } break; + default: break; } } break; case TYPESETUP: { if (value) { switch (state.mode) { - case MOD_POLY_KBD: - case MOD_POLY_MAIN: { - prev_mode = state.mode; - state.mode = MOD_POLY_SETUP; - } break; case MOD_POLY_SETUP: { state.mode = prev_mode; - save_state = 1; + save_state(); + } break; + default: { + prev_mode = state.mode; + state.mode = MOD_POLY_SETUP; } break; } } @@ -760,9 +838,14 @@ print_number(u8 n, Color clr, u8 x, u8 y) { void update(void) { - if (save_state) { - hal_write_flash(0, (u8*)&state, sizeof(State)); - save_state = 0; + if (save_request) { + if (save_timer <= 0) { + hal_write_flash(0, (u8*)&state, sizeof(State)); + save_request = 0; + save_timer = 0; + } else { + save_timer--; + } } } @@ -773,6 +856,16 @@ clear_pads(void) { } DRAW(POLY_PAD_SESSION, BLACK); DRAW(POLY_PAD_NOTE, BLACK); + DRAW(POLY_PAD_DEVICE, BLACK); + DRAW(POLY_PAD_USER, BLACK); + DRAW(POLY_PAD_PLAY_0, BLACK); + DRAW(POLY_PAD_PLAY_1, BLACK); + DRAW(POLY_PAD_PLAY_2, BLACK); + DRAW(POLY_PAD_PLAY_3, BLACK); + DRAW(POLY_PAD_PLAY_4, BLACK); + DRAW(POLY_PAD_PLAY_5, BLACK); + DRAW(POLY_PAD_PLAY_6, BLACK); + DRAW(POLY_PAD_PLAY_7, BLACK); } void @@ -921,12 +1014,30 @@ draw_poly_kbd(void) { draw_kbd(6, PURPLE); } +void +draw_poly_faders(void) { + DRAW(POLY_PAD_DEVICE, GREY); + switch (state.fader_page) { + case 0: { DRAW(POLY_PAD_ROW_0 + 8, GREY); } break; + case 1: { DRAW(POLY_PAD_ROW_1 + 8, GREY); } break; + case 2: { DRAW(POLY_PAD_ROW_2 + 8, GREY); } break; + case 3: { DRAW(POLY_PAD_ROW_3 + 8, GREY); } break; + case 4: { DRAW(POLY_PAD_ROW_4 + 8, GREY); } break; + case 5: { DRAW(POLY_PAD_ROW_5 + 8, GREY); } break; + case 6: { DRAW(POLY_PAD_ROW_6 + 8, GREY); } break; + case 7: { DRAW(POLY_PAD_ROW_7 + 8, GREY); } break; + default: break; + } +} + void draw_scene(void) { switch (state.mode) { case MOD_POLY_MAIN: { draw_poly_main(); } break; case MOD_POLY_SETUP: { draw_poly_setup(); } break; case MOD_POLY_KBD: { draw_poly_kbd(); } break; + case MOD_POLY_FADER: { draw_poly_faders(); } break; + default: break; } } @@ -948,11 +1059,11 @@ app_timer_event() { void app_init(const u16 *adc_raw) { hal_read_flash(0, (u8*)&state, sizeof(State)); - if (state.magic != 0xbadd10de) { + if (state.magic != 0xbadd10d0) { state = (State){ .magic = 0xbadd10de, .active = 1, - .stealing = POLY_STEAL_OFF, + .stealing = POLY_STEAL_OLD, .ch_min = 0, .ch_max = 7, .ch_listen = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, -- cgit v1.2.1