From 5aafab684e76bfefecf70a49acbc86d5c5d0c4fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 20:36:16 +0200 Subject: [PATCH] Unified sub menu redraw --- NuEVI/menu.cpp | 407 +++++++++++++------------------------------------ 1 file changed, 110 insertions(+), 297 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 0013351..6edaf37 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -222,18 +222,22 @@ void drawMenuCursor(byte itemNo, byte color){ } -static bool updateSubMenuCursor(const MenuPage &page, uint32_t timeNow) -{ - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - +static bool drawSubMenu(const MenuPage &page, int color) { int index = cursors[page.cursor]; // TODO: Make sure this is a MenuEntrySub // TODO: Handle MenuEntrySubRotator case // TODO: Null check subMenuFunc - ((const MenuEntrySub*)page.entries[index])->subMenuFunc(cursorNow); - cursorBlinkTime = timeNow; + ((const MenuEntrySub*)page.entries[index])->subMenuFunc(color); return true; +} + +static bool updateSubMenuCursor(const MenuPage &page, uint32_t timeNow) +{ + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; + else cursorNow = WHITE; + cursorBlinkTime = timeNow; + return drawSubMenu( page, cursorNow ); } return false; } @@ -1178,6 +1182,9 @@ static void checkForPatchView() void menu() { unsigned long timeNow = millis(); + const MenuPage *currentPage = nullptr; + + bool redrawSubValue = false; bool redraw = stateFirstRun; // read the state of the switches uint8_t deumButtons = 0x0f ^(digitalRead(dPin) | (digitalRead(ePin) << 1) | (digitalRead(uPin) << 2) | (digitalRead(mPin)<<3)); @@ -1411,42 +1418,29 @@ void menu() { drawMenuScreen(); stateFirstRun = 0; } + currentPage = &mainMenuPage; if (subTranspose){ redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (transpose > 0){ - clearSubValue(); + if (transpose > 0) transpose--; - plotTranspose(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (transpose < 24){ - clearSubValue(); + if (transpose < 24) transpose++; - plotTranspose(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotTranspose(WHITE); - cursorNow = BLACK; - redraw = true; subTranspose = 0; writeSetting(TRANSP_ADDR,transpose); break; } + redrawSubValue = true; } } else if (subOctave){ redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); @@ -1454,38 +1448,22 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (octave > 0){ - clearSubValue(); - // plotOctave(BLACK); + if (octave > 0) octave--; - plotOctave(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (octave < 6){ - clearSubValue(); - // plotOctave(BLACK); + if (octave < 6) octave++; - plotOctave(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotOctave(WHITE); - cursorNow = BLACK; - redraw = true; subOctave = 0; writeSetting(OCTAVE_ADDR,octave); break; } + redrawSubValue = true; } } else if (subMIDI) { redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); @@ -1493,53 +1471,33 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (MIDIchannel > 1){ - clearSubValue(); + if (MIDIchannel > 1) MIDIchannel--; - plotMIDI(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } + break; + + case BTN_UP: + if (MIDIchannel < 16) + MIDIchannel++; break; case BTN_ENTER: readSwitches(); if (pinkyKey){ slowMidi = !slowMidi; - plotMIDI(WHITE); - cursorNow = BLACK; - redraw = true; dipSwBits = dipSwBits ^ (1<<3); writeSetting(DIPSW_BITS_ADDR,dipSwBits); } else { - plotMIDI(WHITE); - cursorNow = BLACK; - redraw = true; subMIDI = 0; writeSetting(MIDI_ADDR,MIDIchannel); } break; - case BTN_UP: - if (MIDIchannel < 16){ - clearSubValue(); - MIDIchannel++; - plotMIDI(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } - break; - case BTN_MENU: - plotMIDI(WHITE); - cursorNow = BLACK; - redraw = true; subMIDI = 0; writeSetting(MIDI_ADDR,MIDIchannel); break; } + redrawSubValue = true; } } else { bool hadButtons = buttonPressedAndNotUsed; @@ -1552,6 +1510,7 @@ void menu() { drawMenu(rotatorMenuPage); stateFirstRun = 0; } + currentPage = &rotatorMenuPage; if (subParallel){ if (((timeNow - cursorBlinkTime) > cursorBlinkInterval) || forceRedraw) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; @@ -1567,36 +1526,26 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (parallel > -24){ - plotRotator(BLACK,parallel); + if (parallel > -24) parallel--; - plotRotator(WHITE,parallel); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (parallel < 24){ - plotRotator(BLACK,parallel); + if (parallel < 24) parallel++; - plotRotator(WHITE,parallel); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotRotator(WHITE,parallel); - cursorNow = BLACK; - redraw = true; subParallel = 0; writeSetting(PARAL_ADDR,(parallel + 24)); break; } + clearSubValue(); + plotRotator(WHITE,parallel); + cursorNow = BLACK; + redraw = true; + cursorBlinkTime = timeNow; } } else if (subRotator){ if (((timeNow - cursorBlinkTime) > cursorBlinkInterval) || forceRedraw) { @@ -1613,51 +1562,35 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (rotations[subRotator-1] > -24){ - clearSubValue(); + if (rotations[subRotator-1] > -24) rotations[subRotator-1]--; - plotRotator(WHITE,rotations[subRotator-1]); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (rotations[subRotator-1] < 24){ - clearSubValue(); + if (rotations[subRotator-1] < 24) rotations[subRotator-1]++; - plotRotator(WHITE,rotations[subRotator-1]); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotRotator(WHITE,rotations[subRotator-1]); - cursorNow = BLACK; - redraw = true; writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); subRotator = 0; break; } - } - } else if (subPriority){ - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotPriority(cursorNow); + clearSubValue(); + plotRotator(WHITE,rotations[subRotator-1]); + cursorNow = BLACK; redraw = true; cursorBlinkTime = timeNow; } - if (buttonPressedAndNotUsed){ + } else if (subPriority){ + updateSubMenuCursor( rotatorMenuPage, timeNow ); + if (buttonPressedAndNotUsed) { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: case BTN_UP: // up - clearSubValue(); priority = !priority; cursorBlinkTime = timeNow; break; @@ -1668,9 +1601,7 @@ void menu() { writeSetting(PRIO_ADDR,priority); break; } - plotPriority(WHITE); - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else { bool hadButtons = buttonPressedAndNotUsed; @@ -1696,6 +1627,7 @@ void menu() { drawMenu( breathMenuPage ); stateFirstRun = 0; } + currentPage = &breathMenuPage; if (subBreathCC){ redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ @@ -1707,7 +1639,6 @@ void menu() { } else { breathCC = 10; } - cursorBlinkTime = timeNow; break; case BTN_UP: if (breathCC < 10){ @@ -1715,7 +1646,6 @@ void menu() { } else { breathCC = 0; } - cursorBlinkTime = timeNow; break; case BTN_ENTER: // fallthrough case BTN_MENU: @@ -1727,10 +1657,7 @@ void menu() { } break; } - clearSubValue(); - plotBreathCC(WHITE); - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else if (subBreathAT) { redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); @@ -1738,15 +1665,11 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - clearSubValue(); - breathAT=!breathAT; - cursorBlinkTime = timeNow; + breathAT = !breathAT; break; case BTN_UP: // up - clearSubValue(); - breathAT=!breathAT; - cursorBlinkTime = timeNow; + breathAT = !breathAT; break; case BTN_ENTER: // fallthrough case BTN_MENU: @@ -1758,9 +1681,7 @@ void menu() { } break; } - plotBreathAT(WHITE); - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else if (subVelocity) { redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); @@ -1768,18 +1689,14 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - clearSubValue(); if (velocity > 0){ velocity--; } else velocity = 127; - cursorBlinkTime = timeNow; break; case BTN_UP: - clearSubValue(); if (velocity < 127){ velocity++; } else velocity = 0; - cursorBlinkTime = timeNow; break; case BTN_ENTER: // fallthrough case BTN_MENU: @@ -1787,9 +1704,7 @@ void menu() { writeSetting(VELOCITY_ADDR,velocity); break; } - plotVelocity(WHITE); - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else if (subCurve) { @@ -1798,32 +1713,24 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - clearSubValue(); if (curve > 0){ curve--; } else curve = 12; - plotCurve(WHITE); - cursorBlinkTime = timeNow; break; case BTN_UP: // up - clearSubValue(); if (curve < 12){ curve++; } else curve = 0; - plotCurve(WHITE); - cursorBlinkTime = timeNow; break; case BTN_ENTER: // fallthrough case BTN_MENU: // menu - plotCurve(WHITE); subCurve = 0; writeSetting(BREATHCURVE_ADDR,curve); break; } - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else if (subVelSmpDl) { @@ -1832,69 +1739,56 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - clearSubValue(); if (velSmpDl > 0){ velSmpDl-=1; } else velSmpDl = 30; - plotVelSmpDl(WHITE); - cursorBlinkTime = timeNow; break; + case BTN_UP: - // up - clearSubValue(); if (velSmpDl < 30){ velSmpDl+=1; } else velSmpDl = 0; - plotVelSmpDl(WHITE); - cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotVelSmpDl(WHITE); subVelSmpDl = 0; writeSetting(VEL_SMP_DL_ADDR,velSmpDl); break; } - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else if (subVelBias) { redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; - switch (deumButtonState){ + switch (deumButtonState) { case BTN_DOWN: - clearSubValue(); if (velBias > 0){ velBias--; } else velBias = 9; - plotVelBias(WHITE); - cursorBlinkTime = timeNow; break; + case BTN_ENTER: - // enter - plotVelBias(WHITE); subVelBias = 0; writeSetting(VEL_BIAS_ADDR,velBias); break; + case BTN_UP: - // up - clearSubValue(); if (velBias < 9){ velBias++; } else velBias = 0; - plotVelBias(WHITE); - cursorBlinkTime = timeNow; break; + case BTN_MENU: - // menu - plotVelBias(WHITE); subVelBias = 0; writeSetting(VEL_BIAS_ADDR,velBias); break; } + clearSubValue(); + plotVelBias(WHITE); + cursorBlinkTime = timeNow; cursorNow = BLACK; redraw = true; } @@ -1909,40 +1803,31 @@ void menu() { drawMenu( controlMenuPage ); stateFirstRun = 0; } + currentPage = &controlMenuPage; if (subPort){ - redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); - if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - clearSubValue(); if (portamento > 0){ portamento--; } else portamento = 2; - plotPort(WHITE); - cursorBlinkTime = timeNow; break; + case BTN_UP: - // up - clearSubValue(); if (portamento < 2){ portamento++; } else portamento = 0; - plotPort(WHITE); - cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotPort(WHITE); subPort = 0; writeSetting(PORTAM_ADDR,portamento); break; } - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else if (subPB) { redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); @@ -1950,36 +1835,22 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (PBdepth > 0){ - clearSubValue(); + if (PBdepth > 0) PBdepth--; - plotPB(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (PBdepth < 12){ - clearSubValue(); + if (PBdepth < 12) PBdepth++; - plotPB(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotPB(WHITE); - cursorNow = BLACK; - redraw = true; subPB = 0; writeSetting(PB_ADDR,PBdepth); break; } + redrawSubValue = true; } } else if (subExtra) { redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); @@ -1987,36 +1858,24 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - clearSubValue(); if (extraCT > 0){ extraCT--; } else extraCT = 4; - plotExtra(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; break; + case BTN_UP: - // up - clearSubValue(); if (extraCT < 4){ extraCT++; } else extraCT = 0; - plotExtra(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotExtra(WHITE); - cursorNow = BLACK; - redraw = true; subExtra = 0; writeSetting(EXTRA_ADDR,extraCT); break; } + redrawSubValue = true; } } else if (subDeglitch) { redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); @@ -2024,36 +1883,23 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (deglitch > 0){ - clearSubValue(); + if (deglitch > 0) deglitch-=1; - plotDeglitch(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up if (deglitch < 70){ - clearSubValue(); deglitch+=1; - plotDeglitch(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotDeglitch(WHITE); - cursorNow = BLACK; - redraw = true; subDeglitch = 0; writeSetting(DEGLITCH_ADDR,deglitch); break; } + redrawSubValue = true; } } else if (subPinky) { redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); @@ -2061,36 +1907,22 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (pinkySetting > 0){ - clearSubValue(); + if (pinkySetting > 0) pinkySetting-=1; - plotPinkyKey(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (pinkySetting < 24){ - clearSubValue(); - pinkySetting+=1; - plotPinkyKey(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } + if (pinkySetting < 24) + pinkySetting += 1; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotPinkyKey(WHITE); - cursorNow = BLACK; - redraw = true; subPinky = 0; writeSetting(PINKY_KEY_ADDR,pinkySetting); break; } + redrawSubValue = true; } } else { redraw |= updateMenuPage( controlMenuPage, timeNow ); @@ -2101,11 +1933,9 @@ void menu() { drawMenu(vibratoMenuPage); stateFirstRun = 0; } - + currentPage = &vibratoMenuPage; if (subVibrato) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); - if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2125,11 +1955,7 @@ void menu() { writeSetting(VIBRATO_ADDR,vibrato); break; } - clearSubValue(); - plotVibrato(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; + redrawSubValue = true; } } else if (subVibSens) { @@ -2161,9 +1987,7 @@ void menu() { cursorBlinkTime = timeNow; } } else if (subVibRetn) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); - if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2171,28 +1995,22 @@ void menu() { if (vibRetn > 0) vibRetn--; break; + case BTN_UP: - // up if (vibRetn < 4) vibRetn++; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu subVibRetn = 0; writeSetting(VIB_RETN_ADDR,vibRetn); break; } - cursorBlinkTime = timeNow; - cursorNow = BLACK; - redraw = true; - clearSubValue(); - plotVibRetn(WHITE); + redrawSubValue = true; } } else if (subVibSquelch) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); - if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2212,48 +2030,43 @@ void menu() { writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; } + clearSubValue(); + plotVibSquelch(WHITE); cursorBlinkTime = timeNow; cursorNow = BLACK; redraw = true; - clearSubValue(); - plotVibSquelch(WHITE); } } else if (subVibDirection) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); - if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case BTN_DOWN: - clearSubValue(); - vibDirection = !vibDirection; - plotVibDirection(WHITE); - cursorBlinkTime = timeNow; - break; + + case BTN_DOWN: // fallthrough case BTN_UP: - // up - clearSubValue(); vibDirection = !vibDirection; - plotVibDirection(WHITE); - cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotVibDirection(WHITE); subVibDirection = 0; writeSetting(VIB_DIRECTION_ADDR,vibDirection); break; } - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else { redraw |= updateMenuPage( vibratoMenuPage, timeNow ); } } + if(redrawSubValue && currentPage) { + clearSubValue(); + redraw |= drawSubMenu(*currentPage, WHITE); + cursorNow = BLACK; + cursorBlinkTime = timeNow; + } + if(redraw) { display.display(); }