Do most of the refactoring required to make menus easy to expand

This commit is contained in:
Reed Nightingale 2020-01-17 21:41:52 -08:00
parent f0e0640115
commit ebaf7c44de

190
setup.cpp
View File

@ -18,10 +18,6 @@
* - If the menu item is NOT clicked on, then the menu's prompt is to be displayed * - If the menu item is NOT clicked on, then the menu's prompt is to be displayed
*/ */
void setupExit(){
menuOn = 0;
}
static const unsigned int COLOR_TEXT = DISPLAY_WHITE; static const unsigned int COLOR_TEXT = DISPLAY_WHITE;
static const unsigned int COLOR_BACKGROUND = DISPLAY_BLACK; static const unsigned int COLOR_BACKGROUND = DISPLAY_BLACK;
static const unsigned int COLOR_TITLE_BACKGROUND = DISPLAY_NAVY; static const unsigned int COLOR_TITLE_BACKGROUND = DISPLAY_NAVY;
@ -190,7 +186,6 @@ void setupCwDelay(){
SaveSettingsToEeprom(); SaveSettingsToEeprom();
active_delay(500); active_delay(500);
setupExit();
} }
void setupKeyer(){ void setupKeyer(){
@ -243,88 +238,107 @@ void setupKeyer(){
globalSettings.keyerMode = tmp_mode; globalSettings.keyerMode = tmp_mode;
SaveSettingsToEeprom(); SaveSettingsToEeprom();
setupExit();
} }
struct MenuItem_t {
const char* const ItemName;
const void (*OnSelect)();
};
void runMenu(const MenuItem_t* const menu_items, const uint16_t num_items);
#define RUN_MENU(menu) runMenu(menu,sizeof(menu)/sizeof(menu[0]))
const char MT_CAL [] PROGMEM = "Calibrations";
const char MI_SET_FREQ [] PROGMEM = "Set Freq..."; const char MI_SET_FREQ [] PROGMEM = "Set Freq...";
const char MI_SET_BFO [] PROGMEM = "Set BFO..."; const char MI_SET_BFO [] PROGMEM = "Set BFO...";
const char MI_TOUCH [] PROGMEM = "Touch Screen...";
const MenuItem_t calibrationMenu [] PROGMEM {
{MT_CAL,nullptr},//Title
{MI_SET_FREQ,setupFreq},
{MI_SET_BFO,setupBFO},
{MI_TOUCH,setupTouch},
};
void runCalibrationMenu(){RUN_MENU(calibrationMenu);}
const char MT_CW [] PROGMEM = "CW/Morse Setup";
const char MI_CW_DELAY [] PROGMEM = "CW Delay..."; const char MI_CW_DELAY [] PROGMEM = "CW Delay...";
const char MI_CW_KEYER [] PROGMEM = "CW Keyer..."; const char MI_CW_KEYER [] PROGMEM = "CW Keyer...";
const char MI_TOUCH [] PROGMEM = "Touch Screen..."; const MenuItem_t cwMenu [] PROGMEM {
{MT_CW,nullptr},//Title
{MI_CW_DELAY,setupCwDelay},
{MI_CW_KEYER,setupKeyer},
};
void runCwMenu(){RUN_MENU(cwMenu);}
const char MT_SETTINGS [] PROGMEM = "Settings";
const MenuItem_t mainMenu [] PROGMEM {
{MT_SETTINGS,nullptr},//Title
{MT_CAL,runCalibrationMenu},
{MT_CW,runCwMenu},
};
const char MI_EXIT [] PROGMEM = "Exit"; const char MI_EXIT [] PROGMEM = "Exit";
const MenuItem_t exitMenu PROGMEM = {MI_EXIT,nullptr};
enum MenuIds { void drawMenu(const MenuItem_t* const items, const uint16_t num_items)
MENU_SET_FREQ, {
MENU_SET_BFO,
MENU_CW_DELAY,
MENU_CW_KEYER,
MENU_TOUCH,
MENU_EXIT,
MENU_TOTAL
};
const char* const menuItems [MENU_TOTAL] PROGMEM {
MI_SET_FREQ,
MI_SET_BFO,
MI_CW_DELAY,
MI_CW_KEYER,
MI_TOUCH,
MI_EXIT
};
void drawSetupMenu(){
displayClear(COLOR_BACKGROUND); displayClear(COLOR_BACKGROUND);
strcpy_P(b,(const char*)F("Setup")); MenuItem_t mi = {"",nullptr};
memcpy_P(&mi,&items[0],sizeof(mi));
strcpy_P(b,mi.ItemName);
displayText(b, LAYOUT_TITLE_X, LAYOUT_TITLE_Y, LAYOUT_TITLE_WIDTH, LAYOUT_TITLE_HEIGHT, COLOR_TEXT, COLOR_TITLE_BACKGROUND, COLOR_ACTIVE_BORDER); displayText(b, LAYOUT_TITLE_X, LAYOUT_TITLE_Y, LAYOUT_TITLE_WIDTH, LAYOUT_TITLE_HEIGHT, COLOR_TEXT, COLOR_TITLE_BACKGROUND, COLOR_ACTIVE_BORDER);
for(unsigned int i = 0; i < MENU_TOTAL; ++i){ for(unsigned int i = 1; i < num_items; ++i){
strcpy_P(b,(const char*)pgm_read_word(&(menuItems[i]))); memcpy_P(&mi,&items[i],sizeof(mi));
displayText(b, LAYOUT_ITEM_X, LAYOUT_ITEM_Y + i*LAYOUT_ITEM_PITCH_Y, LAYOUT_ITEM_WIDTH, LAYOUT_ITEM_HEIGHT, COLOR_TEXT, COLOR_BACKGROUND, COLOR_INACTIVE_BORDER); strcpy_P(b,mi.ItemName);
displayText(b, LAYOUT_ITEM_X, LAYOUT_ITEM_Y + (i-1)*LAYOUT_ITEM_PITCH_Y, LAYOUT_ITEM_WIDTH, LAYOUT_ITEM_HEIGHT, COLOR_TEXT, COLOR_BACKGROUND, COLOR_INACTIVE_BORDER);
} }
memcpy_P(&mi,&exitMenu,sizeof(mi));
strcpy_P(b,mi.ItemName);
displayText(b, LAYOUT_ITEM_X, LAYOUT_ITEM_Y + (num_items-1)*LAYOUT_ITEM_PITCH_Y, LAYOUT_ITEM_WIDTH, LAYOUT_ITEM_HEIGHT, COLOR_TEXT, COLOR_BACKGROUND, COLOR_INACTIVE_BORDER);
} }
void movePuck(int i){ void movePuck(unsigned int old_index, unsigned int new_index)
static int prevPuck = 1;//Start value at 1 so that on init, when we get called with 0, we'll update {
//Don't update if we're already on the right selection //Don't update if we're already on the right selection
if(prevPuck == i){ if(old_index == new_index){
return; return;
} }
else if(((unsigned int)-1) != old_index){
//Clear old //Clear old
displayRect(LAYOUT_ITEM_X, LAYOUT_ITEM_Y + (prevPuck*LAYOUT_ITEM_PITCH_Y), LAYOUT_ITEM_WIDTH, LAYOUT_ITEM_HEIGHT, COLOR_INACTIVE_BORDER); displayRect(LAYOUT_ITEM_X, LAYOUT_ITEM_Y + (old_index*LAYOUT_ITEM_PITCH_Y), LAYOUT_ITEM_WIDTH, LAYOUT_ITEM_HEIGHT, COLOR_INACTIVE_BORDER);
}
//Draw new //Draw new
displayRect(LAYOUT_ITEM_X, LAYOUT_ITEM_Y + (i*LAYOUT_ITEM_PITCH_Y), LAYOUT_ITEM_WIDTH, LAYOUT_ITEM_HEIGHT, COLOR_ACTIVE_BORDER); displayRect(LAYOUT_ITEM_X, LAYOUT_ITEM_Y + (new_index*LAYOUT_ITEM_PITCH_Y), LAYOUT_ITEM_WIDTH, LAYOUT_ITEM_HEIGHT, COLOR_ACTIVE_BORDER);
prevPuck = i;
} }
void doSetup2(){ void runMenu(const MenuItem_t* const menu_items, const uint16_t num_items)
{
static const unsigned int COUNTS_PER_ITEM = 10; static const unsigned int COUNTS_PER_ITEM = 10;
int select=0, i, btnState; const unsigned int MAX_KNOB_VALUE = num_items*COUNTS_PER_ITEM - 1;
int knob_sum = 0;
unsigned int old_index = 0;
drawSetupMenu(); drawMenu(menu_items,num_items);
movePuck(select); movePuck(1,0);//Force draw of puck
//wait for the button to be raised up //wait for the button to be raised up
while(btnDown()) while(btnDown()){
active_delay(50); active_delay(50);
}
active_delay(50); //debounce active_delay(50); //debounce
menuOn = 2;
while (menuOn){ while (true){
i = enc_read(); knob_sum += enc_read();
if(knob_sum < 0){
knob_sum = 0;
}
else if(MAX_KNOB_VALUE < knob_sum){
knob_sum = MAX_KNOB_VALUE;
}
if (i > 0){ uint16_t index = knob_sum/COUNTS_PER_ITEM;
if (select + i < MENU_TOTAL*COUNTS_PER_ITEM) movePuck(old_index,index);
select += i; old_index = index;
movePuck(select/COUNTS_PER_ITEM);
}
if (i < 0 && select + i >= 0){
select += i; //caught ya, i is already -ve here, so you add it
movePuck(select/COUNTS_PER_ITEM);
}
if (!btnDown()){ if (!btnDown()){
active_delay(50); active_delay(50);
@ -335,50 +349,28 @@ void doSetup2(){
while(btnDown()){ while(btnDown()){
active_delay(50); active_delay(50);
} }
active_delay(300); active_delay(50);//debounce
switch(select/COUNTS_PER_ITEM){ if(num_items-1 > index){
case MENU_SET_FREQ: MenuItem_t mi = {"",nullptr};
{ memcpy_P(&mi,&menu_items[index+1],sizeof(mi));//The 0th element in the array is the title, so offset by 1
setupFreq(); mi.OnSelect();
break; drawMenu(menu_items,num_items);//Need to re-render, since whatever ran just now is assumed to have drawn something
} old_index = -1;//Force redraw
case MENU_SET_BFO: }
{ else{
setupBFO(); break;
break; }
}
case MENU_CW_DELAY:
{
setupCwDelay();
break;
}
case MENU_CW_KEYER:
{
setupKeyer();
break;
}
case MENU_TOUCH:
{
setupTouch();
break;
}
case MENU_EXIT:
default:
{
menuOn = 0;
break;
}
}//switch
//redraw
drawSetupMenu();
} }
//debounce the button //debounce the button
while(btnDown()) while(btnDown()){
active_delay(50); active_delay(50);
active_delay(50); }
active_delay(50);//debounce
}
checkCAT(); void doSetup2(){
RUN_MENU(mainMenu);
guiUpdate(); guiUpdate();
} }