void menuSelect(){ menu_item* curr = menuStack_top(); if(curr->subMenu.items[selected_i].attr & MENU_ATTR_HASSUBMENU){ // We're moving to a new submenu, push it on our stack menuStack_push( &curr->subMenu.items[selected_i] ); selected_i = 0; } else { // Otherwise, run the menu item's function setMessage( curr->subMenu.items[selected_i].func(selected_i) ); if(_message_item.caption){ menuBack(); menuStack_push( &message_item ); } selected_i = 0; } }
/****************************************************************************** * @fn main * * @brief Main handles all applications attached to the menu system * * input parameters * * output parameters * *@return */ void main( void ) { // Init clocks and I/O bspInit(BSP_SYS_CLK_16MHZ); // Init leds bspLedInit(); // Init Buttons bspKeyInit(BSP_KEY_MODE_POLL); // Initialize SPI interface to LCD (shared with SPI flash) bspIoSpiInit(BSP_FLASH_LCD_SPI, BSP_FLASH_LCD_SPI_SPD); /* Init Buttons */ bspKeyInit(BSP_KEY_MODE_ISR); bspKeyIntEnable(BSP_KEY_ALL); /* Init LCD and issue a welcome */ lcdInit(); lcdClear(); // Instantiate tranceiver RF spi interface to SCLK ~ 4 MHz */ //input clockDivider - SMCLK/clockDivider gives SCLK frequency trxRfSpiInterfaceInit(0x10); /* Welcome Screen Part */ lcdSendBuffer(trxebWelcomeScreen); lcdBufferPrintString(lcdDefaultBuffer,"TEXAS",60,eLcdPage6); lcdBufferPrintString(lcdDefaultBuffer,"INSTRUMENTS",60,eLcdPage7); lcdSendBufferPart(lcdDefaultBuffer, 60,127,eLcdPage6, eLcdPage7); /* MCU will stay in sleep until button is pressed */ __low_power_mode_3(); bspKeyPushed(BSP_KEY_ALL); //Clear screen lcdBufferClear(0); /* Menu Driver */ menu_t *pCurrentMenu = &mainMenu; uint8 menuButtonsPressed; menuDisplay(pCurrentMenu); __low_power_mode_3(); while(1) { menuButtonsPressed = bspKeyPushed(BSP_KEY_ALL); switch(menuButtonsPressed) { case BSP_KEY_LEFT: pCurrentMenu = menuBack(pCurrentMenu); break; case BSP_KEY_RIGHT: pCurrentMenu = menuEnter(pCurrentMenu); break; case BSP_KEY_DOWN: menuDown(pCurrentMenu); break; case BSP_KEY_UP: menuUp(pCurrentMenu); break; default: break; } menuDisplay(pCurrentMenu); /* Enter low power mode while menu driver waits on user input */ __low_power_mode_3(); } }
void LCDST7565::buttonEvent(int buttonIndex, button_event_e event) { pressedButtonIndex = buttonIndex; if( event == RELEASE_EVENT ) { pressedButtonIndex = -1; //return; } if(currentMenu == MENU_HOME) { if(event == PRESS_EVENT) { switch(buttonIndex) { case 3: { menuSelect(); break; } case 0: { midi->setEnabled( ! midi->configuration()->enabled ); break; } case 1: { synth->setEnabled( ! synth->configuration()->enabled ); break; } } } } else // We are in a menu or sub menu { if(event == PRESS_EVENT || event == REPEATED_PRESS_EVENT) { if(event == PRESS_EVENT) { valStepFactor = 1; } else if(valueMenuActive) { if(++valRepeatedCount >= cSynthVal.incSpeed) { valRepeatedCount = 0; valStepFactor *= 2; } } switch(buttonIndex) { case BUT_BACK: { if( event == REPEATED_PRESS_EVENT ) { if( _menu_items[_item_index].type == MENU_ITEM_TYPE_INLINE_INT ) menuBack(); } else { menuBack(); } break; } case BUT_UP: { if(valueMenuActive) { valueMenuUp(); } else { menuUp(); } break; } case BUT_DOWN: { if(valueMenuActive) { valueMenuDown(); } else { menuDown(); } break; } case BUT_OK: { if( event == REPEATED_PRESS_EVENT ) { if( _menu_items[_item_index].type == MENU_ITEM_TYPE_INLINE_INT ) menuSelect(); } else { if(valueMenuActive) { menuBack(); } else { menuSelect(); } } break; } } } } update(); }
void LCDST7565::makeValueMenu(int menu) { switch(menu) { //TODO: set current value when enter a valueMenu case MENU_MIDI_RENOTE: { midi->reNote(); menuBack(); break; } case MENU_MIDI_NOTEOFF: { midi->noteOff(); menuBack(); break; } case MENU_MIDI_CHANNEL: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_MIDI_CHANNEL; cSynthVal.min = 0; cSynthVal.max = 15; cSynthVal.value = midi->configuration()->channel; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "MIDI Channel"); strcpy(cSynthVal.unit, ""); break; } case MENU_MIDI_NOTE: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_MIDI_NOTE; cSynthVal.min = 0; cSynthVal.max = 127; cSynthVal.value = midi->configuration()->baseNote; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Note"); strcpy(cSynthVal.unit, ""); break; } case MENU_MIDI_VELOCITY: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_MIDI_CC; cSynthVal.min = 0; cSynthVal.max = 127; cSynthVal.value = midi->configuration()->velocity; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Velocity"); strcpy(cSynthVal.unit, ""); break; } case MENU_MIDI_CC_PITCH: case MENU_MIDI_CC_VOL: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_MIDI_CC; cSynthVal.min = 0; cSynthVal.max = 127; cSynthVal.step = 1; cSynthVal.incSpeed = 5; if(menu == MENU_MIDI_CC_PITCH) { strcpy(cSynthVal.name, "MIDI CC Pitch"); cSynthVal.value = midi->configuration()->antenna[CT_PITCH].cc; } else { strcpy(cSynthVal.name, "MIDI CC Vol"); cSynthVal.value = midi->configuration()->antenna[CT_VOLUME].cc; } strcpy(cSynthVal.unit, ""); break; } case MENU_DISP_CONTRAST: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_INT; cSynthVal.min = 0; cSynthVal.max = 100; cSynthVal.value = contrast; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Contrast"); strcpy(cSynthVal.unit, "%"); break; } case MENU_SYNTH_GAIN: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_FLOAT; cSynthVal.fmin = 0.f; cSynthVal.fmax = 100.f; cSynthVal.fvalue = synth->config->masterGain * 100.f; cSynthVal.fstep = 0.01; cSynthVal.fdigits = 2; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "MasterGain"); strcpy(cSynthVal.unit, "%"); break; } case MENU_SYNTH_BASEFREQ: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_FLOAT; cSynthVal.fmin = 10; cSynthVal.fmax = 10000; cSynthVal.fvalue = synth->configuration()->baseFreq; cSynthVal.fstep = 0.1f; cSynthVal.fdigits = 1; cSynthVal.incSpeed = 3; strcpy(cSynthVal.name, "Basefrequency"); strcpy(cSynthVal.unit, "Hz"); break; } case MENU_SYNTH_SEMIRANGE: { cSynthVal.type = VAL_TYPE_INT; cSynthVal.min = 0; cSynthVal.max = 24; cSynthVal.indexOffset = 0; cSynthVal.value = synth->configuration()->semiRange; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Semitone Range"); strcpy(cSynthVal.unit, "+/-"); break; } case MENU_SYNTH_OSC_AMPLITUDE: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_FLOAT; cSynthVal.fmin = 0.f; cSynthVal.fmax = 100.f; cSynthVal.fvalue = synth->preset->osc[selectedPartIndex].amplitude * 100.f; cSynthVal.fstep = 0.01; cSynthVal.fdigits = 2; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Amplitude"); strcpy(cSynthVal.unit, "%"); break; } case MENU_SYNTH_OSC_SEMI: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_INT; cSynthVal.min = -24; cSynthVal.max = 24; cSynthVal.value = synth->preset->osc[selectedPartIndex].semitones; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Semitones"); strcpy(cSynthVal.unit, ""); break; } case MENU_SYNTH_OSC_CENT: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_INT; cSynthVal.min = -100; cSynthVal.max = 100; cSynthVal.value = synth->preset->osc[selectedPartIndex].cents; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Cents"); strcpy(cSynthVal.unit, ""); break; } case MENU_SYNTH_OSC_WTPOS: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_FLOAT; cSynthVal.fmin = 0.f; cSynthVal.fmax = 100.f; cSynthVal.fvalue = synth->preset->osc[selectedPartIndex].wavetable_position; cSynthVal.fstep = 0.01; cSynthVal.fdigits = 2; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Wavetable Position"); strcpy(cSynthVal.unit, "%"); break; } case MENU_SYNTH_OSC_DUTY: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_INT; cSynthVal.min = 0; cSynthVal.max = 100; cSynthVal.value = synth->preset->osc[selectedPartIndex].wavetable_position; cSynthVal.step = 1; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Dutycycle"); strcpy(cSynthVal.unit, "%"); break; } case MENU_SYNTH_FILTER_SERPAR: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_FLOAT; cSynthVal.fmin = 0.f; cSynthVal.fmax = 100.f; cSynthVal.fvalue = synth->preset->filter.serParCF * 100.f; cSynthVal.fstep = 0.01; cSynthVal.fdigits = 2; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Serial / Parallel"); strcpy(cSynthVal.unit, "%"); break; } case MENU_SYNTH_FILTER1_FREQ: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_FLOAT; cSynthVal.fmin = 10; cSynthVal.fmax = 20000; cSynthVal.fvalue = synth->preset->filter.flt1.frequency; cSynthVal.fstep = 0.1f; cSynthVal.fdigits = 1; cSynthVal.incSpeed = 3; strcpy(cSynthVal.name, "Frequency"); strcpy(cSynthVal.unit, "Hz"); break; } case MENU_SYNTH_FILTER1_RESO: { cSynthVal.indexOffset = 0; cSynthVal.type = VAL_TYPE_FLOAT; cSynthVal.fmin = 0.0; cSynthVal.fmax = 3.0; cSynthVal.fvalue = synth->preset->filter.flt1.resonance; cSynthVal.fstep = 0.001; cSynthVal.fdigits = 3; cSynthVal.incSpeed = 5; strcpy(cSynthVal.name, "Resonance"); strcpy(cSynthVal.unit, ""); break; } } }