summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-06-29 09:49:57 +0200
committerBad Diode <bd@badd10de.dev>2023-06-29 09:49:57 +0200
commita62819f29862c44b3f76eb4986d0b6a1bdb20255 (patch)
tree83c38cdee81ed418ad79b3717074b319bc92043c
parent10f0c0b60dee4b8bb4fb1685bc478ecdc5b526aa (diff)
downloadlaunchpad-polymaker-a62819f29862c44b3f76eb4986d0b6a1bdb20255.tar.gz
launchpad-polymaker-a62819f29862c44b3f76eb4986d0b6a1bdb20255.zip
Add faders page and introduce save timer
-rw-r--r--src/app.c149
1 files changed, 130 insertions, 19 deletions
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 {
154 POLY_PAD_ACTIVE = 11, 154 POLY_PAD_ACTIVE = 11,
155 POLY_PAD_KBD_SENS = 11 + 6, 155 POLY_PAD_KBD_SENS = 11 + 6,
156 POLY_PAD_STEAL = 11 + 7, 156 POLY_PAD_STEAL = 11 + 7,
157 POLY_PAD_PLAY_0 = POLY_PAD_ROW_0 + 8,
158 POLY_PAD_PLAY_1 = POLY_PAD_ROW_1 + 8,
159 POLY_PAD_PLAY_2 = POLY_PAD_ROW_2 + 8,
160 POLY_PAD_PLAY_3 = POLY_PAD_ROW_3 + 8,
161 POLY_PAD_PLAY_4 = POLY_PAD_ROW_4 + 8,
162 POLY_PAD_PLAY_5 = POLY_PAD_ROW_5 + 8,
163 POLY_PAD_PLAY_6 = POLY_PAD_ROW_6 + 8,
164 POLY_PAD_PLAY_7 = POLY_PAD_ROW_7 + 8,
157 POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0, 165 POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0,
158 POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1, 166 POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1,
159 POLY_PAD_MIN_CH_2 = POLY_PAD_ROW_0 + 2, 167 POLY_PAD_MIN_CH_2 = POLY_PAD_ROW_0 + 2,
@@ -205,9 +213,10 @@ typedef enum Button {
205} Button; 213} Button;
206 214
207typedef enum Mode { 215typedef enum Mode {
208 MOD_POLY_MAIN = 0, 216 MOD_POLY_MAIN = 0,
209 MOD_POLY_SETUP = 1, 217 MOD_POLY_SETUP = 1,
210 MOD_POLY_KBD = 2, 218 MOD_POLY_KBD = 2,
219 MOD_POLY_FADER = 3,
211} Mode; 220} Mode;
212 221
213typedef enum Stealing { 222typedef enum Stealing {
@@ -270,6 +279,8 @@ typedef struct State {
270 u8 kbd_octave; 279 u8 kbd_octave;
271 u8 kbd_root; 280 u8 kbd_root;
272 Sensitivity kbd_sense; 281 Sensitivity kbd_sense;
282 // Faders.
283 u8 fader_page;
273} State; 284} State;
274 285
275// Globals. 286// Globals.
@@ -282,7 +293,10 @@ u8 midi_in_connected = 0;
282u8 midi_out_connected = 0; 293u8 midi_out_connected = 0;
283u8 next_voice = 0; 294u8 next_voice = 0;
284static Mode prev_mode = MOD_POLY_MAIN; 295static Mode prev_mode = MOD_POLY_MAIN;
285static int save_state = 0; 296static int save_request = 0;
297static int save_timer = 0;
298
299#define SAVE_TIMER 500
286 300
287// store ADC frame pointer 301// store ADC frame pointer
288static const u16 *g_ADC = 0; 302static const u16 *g_ADC = 0;
@@ -429,6 +443,12 @@ kbd_find_note(int index) {
429} 443}
430 444
431void 445void
446save_state(void) {
447 save_request = 1;
448 save_timer = SAVE_TIMER;
449}
450
451void
432app_surface_event(u8 type, u8 index, u8 value) { 452app_surface_event(u8 type, u8 index, u8 value) {
433 switch (type) { 453 switch (type) {
434 case TYPEPAD: { 454 case TYPEPAD: {
@@ -438,9 +458,13 @@ app_surface_event(u8 type, u8 index, u8 value) {
438 switch (index) { 458 switch (index) {
439 case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; 459 case POLY_PAD_ACTIVE: { poly_active_toggle(); } break;
440 case POLY_PAD_STEAL: { poly_steal_cycle(); } break; 460 case POLY_PAD_STEAL: { poly_steal_cycle(); } break;
441 case POLY_PAD_NOTE: { 461 case POLY_PAD_NOTE: {
442 state.mode = MOD_POLY_KBD; 462 state.mode = MOD_POLY_KBD;
443 save_state = 1; 463 save_state();
464 } break;
465 case POLY_PAD_DEVICE: {
466 state.mode = MOD_POLY_FADER;
467 save_state();
444 } break; 468 } break;
445 default: break; 469 default: break;
446 } 470 }
@@ -530,8 +554,12 @@ app_surface_event(u8 type, u8 index, u8 value) {
530 // Different sections. 554 // Different sections.
531 case POLY_PAD_SESSION: { 555 case POLY_PAD_SESSION: {
532 state.mode = MOD_POLY_MAIN; 556 state.mode = MOD_POLY_MAIN;
533 save_state = 1; 557 save_state();
534 } 558 } break;
559 case POLY_PAD_DEVICE: {
560 state.mode = MOD_POLY_FADER;
561 save_state();
562 } break;
535 default: break; 563 default: break;
536 } 564 }
537 return; 565 return;
@@ -574,19 +602,69 @@ app_surface_event(u8 type, u8 index, u8 value) {
574 app_midi_event(USBSTANDALONE, NOTEOFF | channel, note, value); 602 app_midi_event(USBSTANDALONE, NOTEOFF | channel, note, value);
575 } 603 }
576 } break; 604 } break;
605 case MOD_POLY_FADER: {
606 if (!value) {
607 return;
608 }
609 switch (index) {
610 // Different sections.
611 case POLY_PAD_SESSION: {
612 state.mode = MOD_POLY_MAIN;
613 save_state();
614 } break;
615 case POLY_PAD_NOTE: {
616 state.mode = MOD_POLY_KBD;
617 save_state();
618 } break;
619 // Fader page.
620 case POLY_PAD_PLAY_0: {
621 state.fader_page = 0;
622 save_state();
623 } break;
624 case POLY_PAD_PLAY_1: {
625 state.fader_page = 1;
626 save_state();
627 } break;
628 case POLY_PAD_PLAY_2: {
629 state.fader_page = 2;
630 save_state();
631 } break;
632 case POLY_PAD_PLAY_3: {
633 state.fader_page = 3;
634 save_state();
635 } break;
636 case POLY_PAD_PLAY_4: {
637 state.fader_page = 4;
638 save_state();
639 } break;
640 case POLY_PAD_PLAY_5: {
641 state.fader_page = 5;
642 save_state();
643 } break;
644 case POLY_PAD_PLAY_6: {
645 state.fader_page = 6;
646 save_state();
647 } break;
648 case POLY_PAD_PLAY_7: {
649 state.fader_page = 7;
650 save_state();
651 } break;
652 default: break;
653 }
654 } break;
655 default: break;
577 } 656 }
578 } break; 657 } break;
579 case TYPESETUP: { 658 case TYPESETUP: {
580 if (value) { 659 if (value) {
581 switch (state.mode) { 660 switch (state.mode) {
582 case MOD_POLY_KBD:
583 case MOD_POLY_MAIN: {
584 prev_mode = state.mode;
585 state.mode = MOD_POLY_SETUP;
586 } break;
587 case MOD_POLY_SETUP: { 661 case MOD_POLY_SETUP: {
588 state.mode = prev_mode; 662 state.mode = prev_mode;
589 save_state = 1; 663 save_state();
664 } break;
665 default: {
666 prev_mode = state.mode;
667 state.mode = MOD_POLY_SETUP;
590 } break; 668 } break;
591 } 669 }
592 } 670 }
@@ -760,9 +838,14 @@ print_number(u8 n, Color clr, u8 x, u8 y) {
760 838
761void 839void
762update(void) { 840update(void) {
763 if (save_state) { 841 if (save_request) {
764 hal_write_flash(0, (u8*)&state, sizeof(State)); 842 if (save_timer <= 0) {
765 save_state = 0; 843 hal_write_flash(0, (u8*)&state, sizeof(State));
844 save_request = 0;
845 save_timer = 0;
846 } else {
847 save_timer--;
848 }
766 } 849 }
767} 850}
768 851
@@ -773,6 +856,16 @@ clear_pads(void) {
773 } 856 }
774 DRAW(POLY_PAD_SESSION, BLACK); 857 DRAW(POLY_PAD_SESSION, BLACK);
775 DRAW(POLY_PAD_NOTE, BLACK); 858 DRAW(POLY_PAD_NOTE, BLACK);
859 DRAW(POLY_PAD_DEVICE, BLACK);
860 DRAW(POLY_PAD_USER, BLACK);
861 DRAW(POLY_PAD_PLAY_0, BLACK);
862 DRAW(POLY_PAD_PLAY_1, BLACK);
863 DRAW(POLY_PAD_PLAY_2, BLACK);
864 DRAW(POLY_PAD_PLAY_3, BLACK);
865 DRAW(POLY_PAD_PLAY_4, BLACK);
866 DRAW(POLY_PAD_PLAY_5, BLACK);
867 DRAW(POLY_PAD_PLAY_6, BLACK);
868 DRAW(POLY_PAD_PLAY_7, BLACK);
776} 869}
777 870
778void 871void
@@ -922,11 +1015,29 @@ draw_poly_kbd(void) {
922} 1015}
923 1016
924void 1017void
1018draw_poly_faders(void) {
1019 DRAW(POLY_PAD_DEVICE, GREY);
1020 switch (state.fader_page) {
1021 case 0: { DRAW(POLY_PAD_ROW_0 + 8, GREY); } break;
1022 case 1: { DRAW(POLY_PAD_ROW_1 + 8, GREY); } break;
1023 case 2: { DRAW(POLY_PAD_ROW_2 + 8, GREY); } break;
1024 case 3: { DRAW(POLY_PAD_ROW_3 + 8, GREY); } break;
1025 case 4: { DRAW(POLY_PAD_ROW_4 + 8, GREY); } break;
1026 case 5: { DRAW(POLY_PAD_ROW_5 + 8, GREY); } break;
1027 case 6: { DRAW(POLY_PAD_ROW_6 + 8, GREY); } break;
1028 case 7: { DRAW(POLY_PAD_ROW_7 + 8, GREY); } break;
1029 default: break;
1030 }
1031}
1032
1033void
925draw_scene(void) { 1034draw_scene(void) {
926 switch (state.mode) { 1035 switch (state.mode) {
927 case MOD_POLY_MAIN: { draw_poly_main(); } break; 1036 case MOD_POLY_MAIN: { draw_poly_main(); } break;
928 case MOD_POLY_SETUP: { draw_poly_setup(); } break; 1037 case MOD_POLY_SETUP: { draw_poly_setup(); } break;
929 case MOD_POLY_KBD: { draw_poly_kbd(); } break; 1038 case MOD_POLY_KBD: { draw_poly_kbd(); } break;
1039 case MOD_POLY_FADER: { draw_poly_faders(); } break;
1040 default: break;
930 } 1041 }
931} 1042}
932 1043
@@ -948,11 +1059,11 @@ app_timer_event() {
948void 1059void
949app_init(const u16 *adc_raw) { 1060app_init(const u16 *adc_raw) {
950 hal_read_flash(0, (u8*)&state, sizeof(State)); 1061 hal_read_flash(0, (u8*)&state, sizeof(State));
951 if (state.magic != 0xbadd10de) { 1062 if (state.magic != 0xbadd10d0) {
952 state = (State){ 1063 state = (State){
953 .magic = 0xbadd10de, 1064 .magic = 0xbadd10de,
954 .active = 1, 1065 .active = 1,
955 .stealing = POLY_STEAL_OFF, 1066 .stealing = POLY_STEAL_OLD,
956 .ch_min = 0, 1067 .ch_min = 0,
957 .ch_max = 7, 1068 .ch_max = 7,
958 .ch_listen = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 1069 .ch_listen = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},