diff options
author | Bad Diode <bd@badd10de.dev> | 2023-06-29 09:49:57 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-06-29 09:49:57 +0200 |
commit | a62819f29862c44b3f76eb4986d0b6a1bdb20255 (patch) | |
tree | 83c38cdee81ed418ad79b3717074b319bc92043c /src/app.c | |
parent | 10f0c0b60dee4b8bb4fb1685bc478ecdc5b526aa (diff) | |
download | launchpad-polymaker-a62819f29862c44b3f76eb4986d0b6a1bdb20255.tar.gz launchpad-polymaker-a62819f29862c44b3f76eb4986d0b6a1bdb20255.zip |
Add faders page and introduce save timer
Diffstat (limited to 'src/app.c')
-rw-r--r-- | src/app.c | 149 |
1 files changed, 130 insertions, 19 deletions
@@ -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 | ||
207 | typedef enum Mode { | 215 | typedef 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 | ||
213 | typedef enum Stealing { | 222 | typedef 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; | |||
282 | u8 midi_out_connected = 0; | 293 | u8 midi_out_connected = 0; |
283 | u8 next_voice = 0; | 294 | u8 next_voice = 0; |
284 | static Mode prev_mode = MOD_POLY_MAIN; | 295 | static Mode prev_mode = MOD_POLY_MAIN; |
285 | static int save_state = 0; | 296 | static int save_request = 0; |
297 | static int save_timer = 0; | ||
298 | |||
299 | #define SAVE_TIMER 500 | ||
286 | 300 | ||
287 | // store ADC frame pointer | 301 | // store ADC frame pointer |
288 | static const u16 *g_ADC = 0; | 302 | static const u16 *g_ADC = 0; |
@@ -429,6 +443,12 @@ kbd_find_note(int index) { | |||
429 | } | 443 | } |
430 | 444 | ||
431 | void | 445 | void |
446 | save_state(void) { | ||
447 | save_request = 1; | ||
448 | save_timer = SAVE_TIMER; | ||
449 | } | ||
450 | |||
451 | void | ||
432 | app_surface_event(u8 type, u8 index, u8 value) { | 452 | app_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 | ||
761 | void | 839 | void |
762 | update(void) { | 840 | update(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 | ||
778 | void | 871 | void |
@@ -922,11 +1015,29 @@ draw_poly_kbd(void) { | |||
922 | } | 1015 | } |
923 | 1016 | ||
924 | void | 1017 | void |
1018 | draw_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 | |||
1033 | void | ||
925 | draw_scene(void) { | 1034 | draw_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() { | |||
948 | void | 1059 | void |
949 | app_init(const u16 *adc_raw) { | 1060 | app_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}, |