Exemplo n.º 1
0
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;
      }
    }
  }
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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);
    }

}
Exemplo n.º 4
0
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;
}