From 9c5dea76b078ed7ef69d99e7d65eab9498030929 Mon Sep 17 00:00:00 2001 From: Rene Stange Date: Tue, 5 Apr 2022 20:00:24 +0200 Subject: [PATCH] Add shortcut for changing the TG in parameter edit (#70) When a parameter is edited in the UI, the current TG can be changed by pressing the switch and turning the knob left or right. The selected TG remains active, when the parameter editor is left. The menu home position is entered by triple click now, reboot after holding the switch for ten seconds. --- src/uimenu.cpp | 59 +++++++++++++++++++++++++++++++++++++++++-- src/uimenu.h | 4 +++ src/userinterface.cpp | 25 +++++++++++++----- src/userinterface.h | 1 + 4 files changed, 80 insertions(+), 9 deletions(-) diff --git a/src/uimenu.cpp b/src/uimenu.cpp index 2b1ddc73..c139586d 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -37,6 +37,7 @@ const CUIMenu::TMenuItem CUIMenu::s_MenuRoot[] = {0} }; +// inserting menu items before "TG1" affect TGShortcutHandler() const CUIMenu::TMenuItem CUIMenu::s_MainMenu[] = { {"TG1", MenuHandler, s_TGMenu, 0}, @@ -328,8 +329,7 @@ void CUIMenu::MenuHandler (CUIMenu *pUIMenu, TMenuEvent Event) break; default: - assert (0); - break; + return; } if (pUIMenu->m_pCurrentMenu) // if this is another menu? @@ -422,6 +422,11 @@ void CUIMenu::EditVoiceBankNumber (CUIMenu *pUIMenu, TMenuEvent Event) CMiniDexed::TGParameterVoiceBank, nValue, nTG); break; + case MenuEventPressAndStepDown: + case MenuEventPressAndStepUp: + pUIMenu->TGShortcutHandler (Event); + return; + default: return; } @@ -465,6 +470,11 @@ void CUIMenu::EditProgramNumber (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_pMiniDexed->SetTGParameter (CMiniDexed::TGParameterProgram, nValue, nTG); break; + case MenuEventPressAndStepDown: + case MenuEventPressAndStepUp: + pUIMenu->TGShortcutHandler (Event); + return; + default: return; } @@ -512,6 +522,11 @@ void CUIMenu::EditTGParameter (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_pMiniDexed->SetTGParameter (Param, nValue, nTG); break; + case MenuEventPressAndStepDown: + case MenuEventPressAndStepUp: + pUIMenu->TGShortcutHandler (Event); + return; + default: return; } @@ -559,6 +574,11 @@ void CUIMenu::EditVoiceParameter (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_pMiniDexed->SetVoiceParameter (nParam, nValue, CMiniDexed::NoOP, nTG); break; + case MenuEventPressAndStepDown: + case MenuEventPressAndStepUp: + pUIMenu->TGShortcutHandler (Event); + return; + default: return; } @@ -607,6 +627,11 @@ void CUIMenu::EditOPParameter (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_pMiniDexed->SetVoiceParameter (nParam, nValue, nOP, nTG); break; + case MenuEventPressAndStepDown: + case MenuEventPressAndStepUp: + pUIMenu->TGShortcutHandler (Event); + return; + default: return; } @@ -808,3 +833,33 @@ string CUIMenu::ToOscillatorDetune (int nValue) return Result; } + +void CUIMenu::TGShortcutHandler (TMenuEvent Event) +{ + assert (m_nCurrentMenuDepth >= 2); + assert (m_MenuStackMenu[0] = s_MainMenu); + unsigned nTG = m_nMenuStackSelection[0]; + assert (nTG < CConfig::ToneGenerators); + assert (m_nMenuStackItem[1] == nTG); + assert (m_nMenuStackParameter[1] == nTG); + + assert ( Event == MenuEventPressAndStepDown + || Event == MenuEventPressAndStepUp); + if (Event == MenuEventPressAndStepDown) + { + nTG--; + } + else + { + nTG++; + } + + if (nTG < CConfig::ToneGenerators) + { + m_nMenuStackSelection[0] = nTG; + m_nMenuStackItem[1] = nTG; + m_nMenuStackParameter[1] = nTG; + + EventHandler (MenuEventUpdate); + } +} diff --git a/src/uimenu.h b/src/uimenu.h index a590a827..9f857165 100644 --- a/src/uimenu.h +++ b/src/uimenu.h @@ -42,6 +42,8 @@ class CUIMenu MenuEventHome, MenuEventStepDown, MenuEventStepUp, + MenuEventPressAndStepDown, + MenuEventPressAndStepUp, MenuEventUnknown }; @@ -98,6 +100,8 @@ class CUIMenu static std::string ToOscillatorMode (int nValue); static std::string ToOscillatorDetune (int nValue); + void TGShortcutHandler (TMenuEvent Event); + private: CUserInterface *m_pUI; CMiniDexed *m_pMiniDexed; diff --git a/src/userinterface.cpp b/src/userinterface.cpp index f504d9d9..058f14ed 100644 --- a/src/userinterface.cpp +++ b/src/userinterface.cpp @@ -34,6 +34,7 @@ CUserInterface::CUserInterface (CMiniDexed *pMiniDexed, CGPIOManager *pGPIOManag m_pLCD (0), m_pLCDBuffered (0), m_pRotaryEncoder (0), + m_bSwitchPressed (false), m_Menu (this, pMiniDexed) { } @@ -177,12 +178,22 @@ void CUserInterface::EncoderEventHandler (CKY040::TEvent Event) { switch (Event) { + case CKY040::EventSwitchDown: + m_bSwitchPressed = true; + break; + + case CKY040::EventSwitchUp: + m_bSwitchPressed = false; + break; + case CKY040::EventClockwise: - m_Menu.EventHandler (CUIMenu::MenuEventStepUp); + m_Menu.EventHandler (m_bSwitchPressed ? CUIMenu::MenuEventPressAndStepUp + : CUIMenu::MenuEventStepUp); break; case CKY040::EventCounterclockwise: - m_Menu.EventHandler (CUIMenu::MenuEventStepDown); + m_Menu.EventHandler (m_bSwitchPressed ? CUIMenu::MenuEventPressAndStepDown + : CUIMenu::MenuEventStepDown); break; case CKY040::EventSwitchClick: @@ -193,17 +204,17 @@ void CUserInterface::EncoderEventHandler (CKY040::TEvent Event) m_Menu.EventHandler (CUIMenu::MenuEventSelect); break; + case CKY040::EventSwitchTripleClick: + m_Menu.EventHandler (CUIMenu::MenuEventHome); + break; + case CKY040::EventSwitchHold: - if (m_pRotaryEncoder->GetHoldSeconds () >= 3) + if (m_pRotaryEncoder->GetHoldSeconds () >= 10) { delete m_pLCD; // reset LCD reboot (); } - else - { - m_Menu.EventHandler (CUIMenu::MenuEventHome); - } break; default: diff --git a/src/userinterface.h b/src/userinterface.h index 6f29d5c1..437993ae 100644 --- a/src/userinterface.h +++ b/src/userinterface.h @@ -64,6 +64,7 @@ class CUserInterface CWriteBufferDevice *m_pLCDBuffered; CKY040 *m_pRotaryEncoder; + bool m_bSwitchPressed; CUIMenu m_Menu; };