mirror of
https://codeberg.org/mclemens/ubitxv6.git
synced 2025-06-06 04:33:36 -04:00
Do most of the refactoring required to make menus easy to expand
This commit is contained in:
parent
f0e0640115
commit
ebaf7c44de
190
setup.cpp
190
setup.cpp
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user