static inline void toplevel_handler(void) { uint8_t parameter_button = 0xFF; // Search through the list of parameter buttons pressed, and find the first for (uint8_t i = 5; i < 16; i++) { if (button_pressed(i)) { parameter_button = i; if (button_on(BTN_SHIFT)) parameter_button |= 0x80; break; } } for (uint8_t i = 0; i < 8; i++) { // Handle the case where the main button is currently being pressed if (button_on(i)) { enum parameter_id id = get_parameter_id(i, parameter_button); // If a parameter button is being pressed and is a valid button for // the current main button, set up a getvalue session. if (id != 0xFF) { ui_getvalue_session.button1 = i; ui_getvalue_session.button2 = parameter_button; ui_getvalue_session.parameter = parameter_get(id); mode |= MODE_GETVALUE; return; } } // In the case where the main button has been depressed else if (button_depressed(i)) { struct parameter parameter = parameter_get(main_buttons[i].depress_parameter); if (parameter.type == BOOL) *parameter.target ^= 1; else { ui_getvalue_session.button1 = i; ui_getvalue_session.button2 = 0xFF; ui_getvalue_session.parameter = parameter; mode |= MODE_GETVALUE; return; } } } }
uint8_t ui_updown(int8_t* value, int8_t min, int8_t max) /* Handles up/down buttons when selecting values */ { static uint8_t wait_count = 0; static uint8_t speed_count = 0; if ((button_on(BTN_UP) && *value < max) || (button_on(BTN_DOWN) && *value > min)) { // If the button was just pressed, increase/decrease one step and start the wait counter // (to avoid the value rapidly changing if the button is held for too long) if (button_pressed(BTN_UP)) { (*value)++; wait_count = 0; return 1; } else if (button_pressed(BTN_DOWN)) { (*value)--; wait_count = 0; return 1; } // If the button was not just pressed, increase the wait counter and see if // we can start to increase the value continuously else { if (wait_count == WAIT_CNT) { if (speed_count++ == SPEED_CNT) { speed_count = 0; *value = (button_on(BTN_UP)) ? *value + 1 : *value - 1; return 1; } } else wait_count++; } } return 0; }
void enter_note(void) { // Check if any of the note buttons have been pressed: uint8_t note = 0xFF; for (uint8_t i = 0; i < 16; i++) { if (button_pressed(i)) note = btn_to_note(i); } // If none of the on-board keys were pressed, check MIDI: if (sequencer_midi_note != 0xFF) note = sequencer_midi_note; if (note != 0xFF) { sequencer_pattern.notes[current_channel][current_note].note = note; sequencer_pattern.notes[current_channel][current_note].length = channel_length[current_channel]; enter_note_exit(); } // Other button presses: else if (button_pressed(BTN_NOTE_CLEAR)) { sequencer_pattern.notes[current_channel][current_note].length = 0; enter_note_exit(); } else if (button_on(BTN_OCTAVE)) { leds_7seg_two_digit_set(3, 4, channel_octave[current_channel]); ui_updown((int8_t*)&channel_octave[current_channel], 1, 7); } else if (button_pressed(BTN_OK)) enter_note_exit(); else { leds_7seg_two_digit_set(3, 4, channel_length[current_channel]); ui_updown((int8_t*)&channel_length[current_channel], 1, 4); } }
void ui_handler(void) /* Top level user interface handler. Checks whether one of the mode buttons have been pressed, and transfers control to the corresponding function. */ { // If a transfer is going on, simply use the 16 upper buttons as a progress // bar if (mode & MODE_TRANSFER) button_leds[midi_transfer_progress] = 0xFF; else if (mode & MODE_GETVALUE) ui_getvalue_handler(); else { if (button_pressed(BTN_PROGRAM)) { mode = MODE_PROGRAM; button_leds = programmer_leds; } else if (button_pressed(BTN_PATTERN)) { mode = MODE_PATTERN; button_leds = sequencer_leds; } else if (button_pressed(BTN_TRACK)) { mode = MODE_TRACK; //button_leds = track_leds; } else if (button_pressed(BTN_SETTINGS)) { mode = MODE_SETTINGS; button_leds = settings_leds; } switch (mode) { case MODE_PROGRAM: button_led_on(BTN_PROGRAM); programmer(); break; case MODE_PATTERN: //sequencer(); button_led_on(BTN_PATTERN); break; case MODE_TRACK: button_led_on(BTN_TRACK); break; // not implemented yet! case MODE_SETTINGS: settings(); button_led_on(BTN_SETTINGS); break; } // Todo: abstract away this ... if (button_on(BTN_SHIFT)) button_led_on(BTN_SHIFT); else button_led_off(BTN_SHIFT); } // Save current button states prev_input[0] = input[0]; prev_input[1] = input[1]; prev_input[2] = input[2]; //last_mode = mode; }