ubitxv6/menu_main.cpp

193 lines
5.4 KiB
C++
Raw Normal View History

2020-02-09 22:10:32 +00:00
#include "menu_main.h"
2020-02-10 05:14:43 +00:00
#include "menu_main_buttons.h"
2020-02-09 22:10:32 +00:00
#include <avr/pgmspace.h>
2020-02-10 01:09:46 +00:00
#include <Arduino.h>
#include "button.h"
2020-02-10 05:14:43 +00:00
#include "color_theme.h"
#include "menu_utils.h"
2020-02-09 22:10:32 +00:00
#include "morse.h"
2020-02-10 05:14:43 +00:00
#include "nano_gui.h"
2020-02-09 22:10:32 +00:00
#include "settings.h"
#include "ubitx.h"//THRESHOLD_USB_LSB
2020-02-09 22:10:32 +00:00
#include "utils.h"
2020-02-10 06:01:19 +00:00
void drawMainMenu(void);
MenuReturn_e runMainMenu(const ButtonPress_e tuner_button,
const ButtonPress_e touch_button,
const Point touch_point,
const int16_t knob);
2020-02-09 22:10:32 +00:00
Menu_t mainMenu = {
2020-02-10 06:01:19 +00:00
drawMainMenu,
runMainMenu,
2020-02-10 06:01:19 +00:00
nullptr
2020-02-09 22:10:32 +00:00
};
Menu_t* const rootMenu = &mainMenu;
2020-02-09 22:10:32 +00:00
bool mainMenuSelecting = false;//Tracks if we're selecting buttons with knob, or adjusting frequency
2020-02-10 01:04:47 +00:00
int16_t mainMenuSelectedItemRaw = 0;//Allow negative only for easier checks on wrap around
2020-02-09 22:10:32 +00:00
2020-02-12 05:45:26 +00:00
extern Button* const* buttons;
2020-02-09 22:10:32 +00:00
void drawMainMenu(void)
{
2020-02-10 05:14:43 +00:00
displayClear(COLOR_BACKGROUND);
Button button;
2020-02-12 05:45:26 +00:00
Button* bp;
2020-02-10 05:14:43 +00:00
for(uint8_t i = 0; i < MAIN_MENU_NUM_BUTTONS; ++i){
2020-02-12 05:45:26 +00:00
memcpy_P(&bp, &(mainMenuButtons[i]), sizeof(bp));
memcpy_P(&button,bp,sizeof(button));
drawButton(&button);
2020-02-10 05:14:43 +00:00
}
}
MenuReturn_e runStartupMenu(const ButtonPress_e,
const ButtonPress_e,
const Point,
const int16_t)
{
return MenuReturn_e::ExitedRedraw;
2020-02-09 22:10:32 +00:00
}
void mainMenuTune(int16_t knob)
{
static uint32_t current_freq = 0;
if((0 == knob) && (GetActiveVfoFreq() == current_freq)){
//Nothing to do - we're already set!
return;
}
current_freq = GetActiveVfoFreq();
uint32_t new_freq = current_freq + (50 * knob);
//Transition from below to above the traditional threshold for USB
if(current_freq < THRESHOLD_USB_LSB && new_freq >= THRESHOLD_USB_LSB){
SetActiveVfoMode(VfoMode_e::VFO_MODE_USB);
}
//Transition from above to below the traditional threshold for USB
if(current_freq >= THRESHOLD_USB_LSB && new_freq < THRESHOLD_USB_LSB){
SetActiveVfoMode(VfoMode_e::VFO_MODE_LSB);
}
setFrequency(new_freq);
current_freq = new_freq;
2020-02-10 05:14:43 +00:00
Button button;
2020-02-12 05:45:26 +00:00
if(Vfo_e::VFO_A == globalSettings.activeVfo){
memcpy_P(&button,&bVfoA,sizeof(button));
}
else{
memcpy_P(&button,&bVfoB,sizeof(button));
}
drawButton(&button);
2020-02-09 22:10:32 +00:00
}
MenuReturn_e runMainMenu(const ButtonPress_e tuner_button,
const ButtonPress_e touch_button,
const Point touch_point,
const int16_t knob)
2020-02-09 22:10:32 +00:00
{
if(runSubmenu(&mainMenu,
drawMainMenu,
tuner_button,
touch_button,
touch_point,
knob)){
//Submenu processed the input, so return now
mainMenuSelectedItemRaw = 0;
mainMenuSelecting = false;
2020-02-09 22:10:32 +00:00
return MenuReturn_e::StillActive;//main menu always returns StillActive
}//end submenu
//Submenu didn't run, so handle the inputs ourselves
//Check tuner_button
if(ButtonPress_e::NotPressed != tuner_button){
switch(tuner_button){
default://Fallthrough intended
case ButtonPress_e::NotPressed:
{
//Nothing to do
break;
}
case ButtonPress_e::ShortPress:
{
if(mainMenuSelecting){
uint8_t menu_index = mainMenuSelectedItemRaw/MENU_KNOB_COUNTS_PER_ITEM;
2020-02-10 05:59:15 +00:00
Button button;
2020-02-12 05:45:26 +00:00
Button* bp;
memcpy_P(&bp,&(mainMenuButtons[menu_index]),sizeof(bp));
memcpy_P(&button,bp,sizeof(button));
2020-02-10 05:59:15 +00:00
endSelector(&button);
2020-02-09 22:10:32 +00:00
//TODO: activate button
2020-02-10 01:09:46 +00:00
Serial.print(F("Select button "));
Serial.print(menu_index);
Serial.print(F(":"));
2020-02-10 05:59:15 +00:00
Serial.println(button.text);
2020-02-09 22:10:32 +00:00
}
else{
2020-02-10 01:04:47 +00:00
initSelector(&mainMenuSelectedItemRaw,
mainMenuButtons,
MAIN_MENU_NUM_BUTTONS,
MorsePlaybackType_e::PlayChar);
}
2020-02-09 22:10:32 +00:00
mainMenuSelecting = !mainMenuSelecting;
//Don't handle touch or knob on this run
return MenuReturn_e::StillActive;//main menu always returns StillActive
break;
}
case ButtonPress_e::LongPress:
{
if(!globalSettings.morseMenuOn){
globalSettings.morseMenuOn = true;//set before playing
morseLetter(2);
}
else{
morseLetter(4);
globalSettings.morseMenuOn = false;//unset after playing
}
SaveSettingsToEeprom();
//Don't handle touch or knob on this run
return MenuReturn_e::StillActive;//main menu always returns StillActive
break;
}
}//switch
}//tuner_button
else if(ButtonPress_e::NotPressed != touch_button){
//We treat long and short presses the same, so no need to have a switch
2020-02-10 00:31:24 +00:00
Button button;
if(findPressedButton(mainMenuButtons,MAIN_MENU_NUM_BUTTONS,&button,touch_point)){
2020-02-09 22:10:32 +00:00
//TODO: activate button
2020-02-10 01:09:46 +00:00
Serial.print(F("Touch button "));
Serial.println(button.text);
2020-02-09 22:10:32 +00:00
}
else{
//Touch detected, but not on our buttons, so ignore
2020-02-10 01:09:46 +00:00
Serial.println(F("Touch not on button"));
2020-02-09 22:10:32 +00:00
}
}//touch_button
else{//Neither button input type found, so handle the knob
if(mainMenuSelecting){
2020-02-10 01:04:47 +00:00
adjustSelector(&mainMenuSelectedItemRaw,
knob,
mainMenuButtons,
MAIN_MENU_NUM_BUTTONS,
MorsePlaybackType_e::PlayChar);
2020-02-09 22:10:32 +00:00
}
else{
mainMenuTune(knob);
}
}
//
return MenuReturn_e::StillActive;//main menu always returns StillActive
}