From e362546e3c9eb1c4db046b0ae79c13409af5c3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 9 Jun 2019 16:47:13 +0200 Subject: [PATCH 01/35] First iteration of menu cleanup * Broke up the code into more general functions instead of duplicating code * Made stuff const and removed variables no longer used * Use defines for menu button values * Changed the order or things to avoid forward declarations * Use array lookup instead of switch-case on some menu options * Adjust menu functionification * Cleaned up sensor rendering --- NuEVI/NuEVI.ino | 41 +- NuEVI/globals.h | 29 +- NuEVI/menu.cpp | 2041 +++++++++++++++------------------------------- NuEVI/menu.h | 2 +- NuEVI/numenu.cpp | 115 +++ NuEVI/numenu.h | 31 + 6 files changed, 831 insertions(+), 1428 deletions(-) create mode 100644 NuEVI/numenu.cpp create mode 100644 NuEVI/numenu.h diff --git a/NuEVI/NuEVI.ino b/NuEVI/NuEVI.ino index e4de329..1a45ba2 100644 --- a/NuEVI/NuEVI.ino +++ b/NuEVI/NuEVI.ino @@ -86,28 +86,23 @@ int parallel = 7; // semitones byte gateOpen = 0; // setting for gate always open, note on sent for every time fingering changes, no matter the breath status -int breathLoLimit = 0; -int breathHiLimit = 4095; -int portamLoLimit = 700; -int portamHiLimit = 4700; -int pitchbLoLimit = 500; -int pitchbHiLimit = 4000; -int extracLoLimit = 500; -int extracHiLimit = 4000; -int ctouchLoLimit = 50; -int ctouchHiLimit = 350; -int ttouchLoLimit = 50; -int ttouchHiLimit = 1900; + +// MAybe move these to config.h (as defines?) +const int breathLoLimit = 0; +const int breathHiLimit = 4095; +const int portamLoLimit = 700; +const int portamHiLimit = 4700; +const int pitchbLoLimit = 500; +const int pitchbHiLimit = 4000; +const int extracLoLimit = 500; +const int extracHiLimit = 4000; +const int ctouchLoLimit = 50; +const int ctouchHiLimit = 350; +const int ttouchLoLimit = 50; +const int ttouchHiLimit = 1900; int touch_Thr = 1300; - -int breathStep; -int portamStep; -int pitchbStep; -int extracStep; -int ctouchStep; - byte ccList[11] = {0,1,2,7,11,1,2,7,11,74,20}; // OFF, Modulation, Breath, Volume, Expression (then same sent in hires), CC74 (cutoff/brightness), CC20 int pbDepthList[13] = {8192,8192,4096,2731,2048,1638,1365,1170,1024,910,819,744,683}; @@ -262,7 +257,7 @@ void setup() { digitalWrite(biteJumperGndPin, LOW); //PBITE // if stored settings are not for current version, or Enter+Menu are pressed at startup, they are replaced by factory settings - + uint16_t settingsVersion = readSetting(VERSION_ADDR); if (((settingsVersion != VERSION) && (settingsVersion < 24)) || (!digitalRead(ePin) && !digitalRead(mPin)) || (settingsVersion == 0xffffu)) { @@ -371,12 +366,6 @@ void setup() { slowMidi = dipSwBits & (1<<3); activePatch = patch; - breathStep = (breathHiLimit - breathLoLimit)/92; // 92 is the number of pixels in the settings bar - portamStep = (portamHiLimit - portamLoLimit)/92; - pitchbStep = (pitchbHiLimit - pitchbLoLimit)/92; - extracStep = (extracHiLimit - extracLoLimit)/92; - ctouchStep = (ctouchHiLimit - ctouchLoLimit)/92; - touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); if (!touchSensor.begin(0x5A)) { diff --git a/NuEVI/globals.h b/NuEVI/globals.h index beb4567..464fa2b 100644 --- a/NuEVI/globals.h +++ b/NuEVI/globals.h @@ -40,25 +40,20 @@ extern byte currentRotation; extern int rotations[4]; extern int parallel; // semitones -extern int breathLoLimit; -extern int breathHiLimit; -extern int portamLoLimit; -extern int portamHiLimit; -extern int pitchbLoLimit; -extern int pitchbHiLimit; -extern int extracLoLimit; -extern int extracHiLimit; -extern int ctouchLoLimit; -extern int ctouchHiLimit; -extern int ttouchLoLimit; -extern int ttouchHiLimit; +extern const int breathLoLimit; +extern const int breathHiLimit; +extern const int portamLoLimit; +extern const int portamHiLimit; +extern const int pitchbLoLimit; +extern const int pitchbHiLimit; +extern const int extracLoLimit; +extern const int extracHiLimit; +extern const int ctouchLoLimit; +extern const int ctouchHiLimit; +extern const int ttouchLoLimit; +extern const int ttouchHiLimit; extern int touch_Thr; -extern int breathStep; -extern int portamStep; -extern int pitchbStep; -extern int extracStep; -extern int ctouchStep; extern unsigned long cursorBlinkTime; // the last time the cursor was toggled diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 3b358b5..04c68b2 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -10,21 +10,19 @@ #include #include "settings.h" -//#ifndef SSD1306_128_64 -//#error("Incorrect display type, please fix Adafruit_SSD1306.h!"); -//#endif +#include "numenu.h" -#define OLED_RESET 4 -Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET); +#define BTN_DOWN 1 +#define BTN_ENTER 2 +#define BTN_UP 4 +#define BTN_MENU 8 +// TODO: Ask Johan the reason for using this.. +// static const uint16_t minOffset = 50; - -static int minOffset = 50; - -static int deumButtons = 0; -static int lastDeumButtons = 0; -static int deumButtonState = 0; +static uint8_t lastDeumButtons = 0; +static uint8_t deumButtonState = 0; static byte buttonPressedAndNotUsed = 0; static byte mainMenuCursor = 1; @@ -40,8 +38,8 @@ static byte forceRedraw = 0; static byte FPD = 0; -static int pos1; -static int pos2; +static uint16_t pos1; +static uint16_t pos2; static const unsigned long debounceDelay = 30; // the debounce time; increase if the output flickers static const unsigned long buttonRepeatInterval = 50; @@ -57,36 +55,33 @@ static unsigned long menuTime = 0; static unsigned long patchViewTime = 0; unsigned long cursorBlinkTime = 0; // the last time the cursor was toggled -static int lastPbUp = 0; -static int lastPbDn = 0; - - //Display state static byte state = DISPLAYOFF_IDL; static byte stateFirstRun = 1; -byte subTranspose = 0; -byte subOctave = 0; -byte subMIDI = 0; -byte subBreathCC = 0; -byte subBreathAT = 0; -byte subVelocity = 0; -byte subCurve = 0; -byte subPort = 0; -byte subPB = 0; -byte subExtra = 0; -byte subVibrato = 0; -byte subDeglitch = 0; -byte subPinky = 0; -byte subVelSmpDl = 0; -byte subVelBias = 0; -byte subParallel = 0; -byte subRotator = 0; -byte subPriority = 0; +static byte subTranspose = 0; +static byte subOctave = 0; +static byte subMIDI = 0; +static byte subBreathCC = 0; +static byte subBreathAT = 0; +static byte subVelocity = 0; +static byte subCurve = 0; +static byte subPort = 0; +static byte subPB = 0; +static byte subExtra = 0; +static byte subVibrato = 0; +static byte subDeglitch = 0; +static byte subPinky = 0; +static byte subVelSmpDl = 0; +static byte subVelBias = 0; +static byte subParallel = 0; +static byte subRotator = 0; +static byte subPriority = 0; +static byte subVibSens = 0; +static byte subVibRetn = 0; +static byte subVibDirection = 0; + byte subVibSquelch = 0; //extern -byte subVibSens = 0; -byte subVibRetn = 0; -byte subVibDirection = 0; // 'NuEVI' logo @@ -163,52 +158,11 @@ static const unsigned char PROGMEM nuevi_logo_bmp[] = { extern void readSwitches(void); extern Adafruit_MPR121 touchSensor; -// Forward declare local function -static int readTrills(void); -static void clearFPS(int trills); -static void setFPS(int trills); - -static void clearSub(void); -static void drawRotatorMenuScreen(void); -static void drawSubRotator(void); -static void drawMenuScreen(void); -static void drawMenuCursor(byte itemNo, byte color); -static void drawSubTranspose(void); -static void drawPatchView(void); -static void drawTrills(void); -static void drawBreathScreen(void); -static void drawAdjCursor(byte color); - -static void plotTranspose(int color); -static void plotBreathCC(int color); -static void plotBreathAT(int color); -static void plotRotator(int color,int value); -static void plotOctave(int cursorNow); -static void plotMIDI(int color); -static void plotPriority(int color); -static void plotPort(int color); -static void plotPB(int color); -static void plotExtra(int color); -static void plotVibrato(int color); -static void plotVibSens(int color); -static void plotVibRetn(int color); -static void plotVibSquelch(int color); -static void plotVibDirection(int color); -static void plotDeglitch(int color); -static void plotCurve(int color); -static void plotVelocity(int color); -static void plotPinkyKey(int color); -static void plotVelSmpDl(int color); -static void plotVelBias(int color); - - - -// static void selectMainMenu(void); -// static void selectRotatorMenu(void); -// static void selectSetupBrMenu(void); -// static void selectSetupCtMenu(void); +#define OLED_RESET 4 +Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET); +// NuMenu mainMenu(display); void initDisplay() { @@ -222,7 +176,6 @@ void initDisplay() { display.clearDisplay(); display.drawBitmap(0,0,nuevi_logo_bmp,LOGO16_GLCD_WIDTH,LOGO16_GLCD_HEIGHT,1); display.display(); - } void showVersion() { @@ -242,211 +195,69 @@ void showVersion() { display.display(); } -void drawBreathScreen(){ - // Clear the buffer. +void drawAdjCursor(byte color){ + display.drawTriangle(16,4,20,4,18,1,color); + display.drawTriangle(16,6,20,6,18,9,color); +} + +static void drawAdjustBase(const char* title, bool all) { display.clearDisplay(); - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(25,2); - display.println("BREATH"); - //display.drawLine(0,10,127,10,WHITE); - display.setCursor(0,20); - display.println("THR"); display.drawLine(25,17,120,17,WHITE); display.drawLine(25,18,25,19,WHITE); display.drawLine(120,18,120,19,WHITE); display.drawLine(25,29,120,29,WHITE); display.drawLine(25,27,25,28,WHITE); display.drawLine(120,27,120,28,WHITE); - display.setCursor(0,35); - display.println("SNS"); - //display.drawLine(25,38,120,38,WHITE); + display.drawLine(25,36,25,40,WHITE); display.drawLine(120,36,120,40,WHITE); - display.setCursor(0,50); - display.println("MAX"); - display.drawLine(25,47,120,47,WHITE); - display.drawLine(25,48,25,49,WHITE); - display.drawLine(120,48,120,49,WHITE); - display.drawLine(25,60,120,60,WHITE); - display.drawLine(25,58,25,59,WHITE); - display.drawLine(120,58,120,59,WHITE); - - //display.drawLine(38,20,38,26,WHITE); // indikation thr - pos1 = map(breathThrVal, breathLoLimit, breathHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - cursorNow = WHITE; - //display.drawLine(115,50,115,57,WHITE); // indikation max - pos2 = map(breathMaxVal, breathLoLimit, breathHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - //display.drawPixel(34, 38, WHITE); - drawAdjCursor(WHITE); - display.display(); -} - -void drawPortamScreen(){ - // Clear the buffer. - display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(25,2); - display.println("PORTAMENTO"); - //display.drawLine(0,10,127,10,WHITE); + display.println(title); + display.setCursor(0,20); display.println("THR"); - display.drawLine(25,17,120,17,WHITE); - display.drawLine(25,18,25,19,WHITE); - display.drawLine(120,18,120,19,WHITE); - display.drawLine(25,29,120,29,WHITE); - display.drawLine(25,27,25,28,WHITE); - display.drawLine(120,27,120,28,WHITE); display.setCursor(0,35); display.println("SNS"); - //display.drawLine(25,38,120,38,WHITE); - display.drawLine(25,36,25,40,WHITE); - display.drawLine(120,36,120,40,WHITE); - display.setCursor(0,50); - display.println("MAX"); - display.drawLine(25,47,120,47,WHITE); - display.drawLine(25,48,25,49,WHITE); - display.drawLine(120,48,120,49,WHITE); - display.drawLine(25,60,120,60,WHITE); - display.drawLine(25,58,25,59,WHITE); - display.drawLine(120,58,120,59,WHITE); + + + if(all) { + display.drawLine(25,47,120,47,WHITE); + display.drawLine(25,48,25,49,WHITE); + display.drawLine(120,48,120,49,WHITE); + display.drawLine(25,59,120,59,WHITE); + display.drawLine(25,57,25,58,WHITE); + display.drawLine(120,57,120,58,WHITE); + display.setCursor(0,50); + display.println("MAX"); + } + cursorNow = WHITE; + drawAdjCursor(WHITE); +} + +void drawAdjustScreen(const char* title, int threshold, int maxValue, uint16_t lowLimit, uint16_t highLimit){ + drawAdjustBase(title, maxValue >= 0); //display.drawLine(38,20,38,26,WHITE); // indikation thr - pos1 = map(portamThrVal, portamLoLimit, portamHiLimit, 27, 119); + pos1 = map(threshold, lowLimit, highLimit, 27, 119); display.drawLine(pos1,20,pos1,26,WHITE); - cursorNow = WHITE; - //display.drawLine(115,50,115,57,WHITE); // indikation max - pos2 = map(portamMaxVal, portamLoLimit, portamHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - //display.drawPixel(34, 38, WHITE); - drawAdjCursor(WHITE); + + //display.drawLine(115,50,115,56,WHITE); // indikation max + if(maxValue >= 0) { + pos2 = map(maxValue, lowLimit, highLimit, 27, 119); + display.drawLine(pos2,50,pos2,56,WHITE); + } display.display(); } -void drawPitchbScreen(){ - // Clear the buffer. - display.clearDisplay(); - - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(25,2); - display.println("PITCH BEND"); - //display.drawLine(0,10,127,10,WHITE); - display.setCursor(0,20); - display.println("THR"); - display.drawLine(25,17,120,17,WHITE); - display.drawLine(25,18,25,19,WHITE); - display.drawLine(120,18,120,19,WHITE); - display.drawLine(25,29,120,29,WHITE); - display.drawLine(25,27,25,28,WHITE); - display.drawLine(120,27,120,28,WHITE); - display.setCursor(0,35); - display.println("SNS"); - //display.drawLine(25,38,120,38,WHITE); - display.drawLine(25,36,25,40,WHITE); - display.drawLine(120,36,120,40,WHITE); - display.setCursor(0,50); - display.println("MAX"); - display.drawLine(25,47,120,47,WHITE); - display.drawLine(25,48,25,49,WHITE); - display.drawLine(120,48,120,49,WHITE); - display.drawLine(25,60,120,60,WHITE); - display.drawLine(25,58,25,59,WHITE); - display.drawLine(120,58,120,59,WHITE); - - //display.drawLine(38,20,38,26,WHITE); // indikation thr - pos1 = map(pitchbThrVal, pitchbLoLimit, pitchbHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - cursorNow = WHITE; - //display.drawLine(115,50,115,57,WHITE); // indikation max - pos2 = map(pitchbMaxVal, pitchbLoLimit, pitchbHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - //display.drawPixel(34, 38, WHITE); - drawAdjCursor(WHITE); - display.display(); +void drawMenuCursor(byte itemNo, byte color){ + byte xmid = 6 + 9 * itemNo; + display.drawTriangle(57,xmid,61,xmid+2,61,xmid-2,color); } -void drawExtracScreen(){ - // Clear the buffer. - display.clearDisplay(); - - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(25,2); - display.println("EXTRA CONTROLLER"); - //display.drawLine(0,10,127,10,WHITE); - display.setCursor(0,20); - display.println("THR"); - display.drawLine(25,17,120,17,WHITE); - display.drawLine(25,18,25,19,WHITE); - display.drawLine(120,18,120,19,WHITE); - display.drawLine(25,29,120,29,WHITE); - display.drawLine(25,27,25,28,WHITE); - display.drawLine(120,27,120,28,WHITE); - display.setCursor(0,35); - display.println("SNS"); - //display.drawLine(25,38,120,38,WHITE); - display.drawLine(25,36,25,40,WHITE); - display.drawLine(120,36,120,40,WHITE); - display.setCursor(0,50); - display.println("MAX"); - display.drawLine(25,47,120,47,WHITE); - display.drawLine(25,48,25,49,WHITE); - display.drawLine(120,48,120,49,WHITE); - display.drawLine(25,60,120,60,WHITE); - display.drawLine(25,58,25,59,WHITE); - display.drawLine(120,58,120,59,WHITE); - - //display.drawLine(38,20,38,26,WHITE); // indikation thr - pos1 = map(extracThrVal, extracLoLimit, extracHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - cursorNow = WHITE; - //display.drawLine(115,50,115,57,WHITE); // indikation max - pos2 = map(extracMaxVal, extracLoLimit, extracHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - //display.drawPixel(34, 38, WHITE); - drawAdjCursor(WHITE); - display.display(); -} - - -void drawCtouchScreen(){ - // Clear the buffer. - display.clearDisplay(); - - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(25,2); - display.println("TOUCH SENSE"); - //display.drawLine(0,10,127,10,WHITE); - display.setCursor(0,20); - display.println("THR"); - display.drawLine(25,17,120,17,WHITE); - display.drawLine(25,18,25,19,WHITE); - display.drawLine(120,18,120,19,WHITE); - display.drawLine(25,29,120,29,WHITE); - display.drawLine(25,27,25,28,WHITE); - display.drawLine(120,27,120,28,WHITE); - display.setCursor(0,35); - display.println("SNS"); - //display.drawLine(25,38,120,38,WHITE); - display.drawLine(25,36,25,40,WHITE); - display.drawLine(120,36,120,40,WHITE); - - //display.drawLine(38,20,38,26,WHITE); // indikation thr - pos1 = map(ctouchThrVal, ctouchLoLimit, ctouchHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - cursorNow = WHITE; - - //display.drawPixel(34, 38, WHITE); - drawAdjCursor(WHITE); - display.display(); -} /* * Draw a regular list of text menu items @@ -474,24 +285,13 @@ static void drawMenu(const char* header, byte selected, byte nItems, ...) { display.println(lineText); } - if(selected>=0) drawMenuCursor(selected, WHITE); + drawMenuCursor(selected, WHITE); va_end(valist); display.display(); } - -void drawMenuCursor(byte itemNo, byte color){ - byte xmid = 6 + 9 * itemNo; - display.drawTriangle(57,xmid,61,xmid+2,61,xmid-2,color); -} - -void drawAdjCursor(byte color){ - display.drawTriangle(16,4,20,4,18,1,color); - display.drawTriangle(16,6,20,6,18,9,color); -} - void drawMenuScreen(){ //Construct the title including voltage reading. @@ -529,6 +329,12 @@ static void drawRotatorMenuScreen(){ "PRIORITY"); } +static void drawTrills(){ + if (K5) display.fillRect(0,0,5,5,WHITE); else display.drawRect(0,0,5,5,WHITE); + if (K6) display.fillRect(10,0,5,5,WHITE); else display.drawRect(10,0,5,5,WHITE); + if (K7) display.fillRect(20,0,5,5,WHITE); else display.drawRect(20,0,5,5,WHITE); +} + static void drawPatchView(){ display.clearDisplay(); if (FPD){ @@ -562,25 +368,16 @@ static void drawPatchView(){ display.display(); } -static void drawTrills(){ - if (K5) display.fillRect(0,0,5,5,WHITE); else display.drawRect(0,0,5,5,WHITE); - if (K6) display.fillRect(10,0,5,5,WHITE); else display.drawRect(10,0,5,5,WHITE); - if (K7) display.fillRect(20,0,5,5,WHITE); else display.drawRect(20,0,5,5,WHITE); -} - static void clearSub(){ display.fillRect(63,11,64,52,BLACK); } -static void drawSubTranspose(){ +static void drawSubBox() +{ display.fillRect(63,11,64,52,BLACK); display.drawRect(63,11,64,52,WHITE); display.setTextColor(WHITE); display.setTextSize(1); - display.setCursor(68,15); - display.println("TRANSPOSE"); - plotTranspose(WHITE); - display.display(); } static void plotTranspose(int color){ @@ -598,18 +395,15 @@ static void plotTranspose(int color){ } } -static void drawSubRotator(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); +static void drawSubTranspose(){ + drawSubBox(); display.setCursor(68,15); - display.println("SEMITONES"); - //plotRotator(WHITE,value); - forceRedraw = 1; + display.println("TRANSPOSE"); + plotTranspose(WHITE); display.display(); } + static void plotRotator(int color,int value){ display.setTextColor(color); display.setTextSize(2); @@ -625,14 +419,12 @@ static void plotRotator(int color,int value){ } } -static void drawSubPriority(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); +static void drawSubRotator(){ + drawSubBox(); display.setCursor(68,15); - display.println("MONO PRIO"); - plotPriority(WHITE); + display.println("SEMITONES"); + //plotRotator(WHITE,value); + forceRedraw = 1; display.display(); } @@ -647,18 +439,15 @@ static void plotPriority(int color){ } } - -static void drawSubOctave(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(77,15); - display.println("OCTAVE"); - plotOctave(WHITE); +static void drawSubPriority(){ + drawSubBox(); + display.setCursor(68,15); + display.println("MONO PRIO"); + plotPriority(WHITE); display.display(); } + static void plotOctave(int color){ display.setTextColor(color); display.setTextSize(2); @@ -674,14 +463,11 @@ static void plotOctave(int color){ } } -static void drawSubMIDI(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(68,15); - display.println("MIDI CHNL"); - plotMIDI(WHITE); +static void drawSubOctave(){ + drawSubBox(); + display.setCursor(77,15); + display.println("OCTAVE"); + plotOctave(WHITE); display.display(); } @@ -700,219 +486,110 @@ static void plotMIDI(int color){ display.print("S"); } +static void drawSubMIDI(){ + drawSubBox(); + display.setCursor(68,15); + display.println("MIDI CHNL"); + plotMIDI(WHITE); + display.display(); +} + + +static void plotSubOption(const char* label, int color) +{ + display.setTextColor(color); + display.setTextSize(2); + int x_pos = 91-strlen(label)*4; + display.setCursor(x_pos,33); + display.println(label); +} + +static const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", + "BR+", "VL+", "EX+", "CF", "20" }; + +static void plotBreathCC(int color){ + plotSubOption(breathCCMenuLabels[breathCC], color); +} + static void drawSubBreathCC(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); + drawSubBox(); display.setCursor(68,15); display.println("BREATH CC"); plotBreathCC(WHITE); display.display(); } -static void plotBreathCC(int color){ - display.setTextColor(color); - display.setTextSize(2); - if (breathCC){ - switch (breathCC){ - case 1: - display.setCursor(83,33); - display.println("MW"); - break; - case 2: - display.setCursor(83,33); - display.println("BR"); - break; - case 3: - display.setCursor(83,33); - display.println("VL"); - break; - case 4: - display.setCursor(83,33); - display.println("EX"); - break; - case 5: - display.setCursor(79,33); - display.println("MW+"); - break; - case 6: - display.setCursor(79,33); - display.println("BR+"); - break; - case 7: - display.setCursor(79,33); - display.println("VL+"); - break; - case 8: - display.setCursor(79,33); - display.println("EX+"); - break; - case 9: - display.setCursor(83,33); - display.println("CF"); - break; - case 10: - display.setCursor(83,33); - display.println("20"); - break; - } +static void plotBreathAT(int color){ + if (breathAT){ + plotSubOption("ON", color); } else { - display.setCursor(79,33); - display.println("OFF"); + plotSubOption("OFF", color); } } static void drawSubBreathAT(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); + drawSubBox(); display.setCursor(68,15); display.println("BREATH AT"); plotBreathAT(WHITE); display.display(); } -static void plotBreathAT(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); - if (breathAT){ - display.println("ON"); + +static void plotVelocity(int color){ + if (velocity){ + display.setTextColor(color); + display.setTextSize(2); + display.setCursor(79,33); + display.println(velocity); } else { - display.println("OFF"); + plotSubOption("DYN", color); } } static void drawSubVelocity(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); + drawSubBox(); display.setCursor(71,15); display.println("VELOCITY"); plotVelocity(WHITE); display.display(); } -static void plotVelocity(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); - if (velocity){ - display.println(velocity); - } else { - display.println("DYN"); - } + +static const char* curveMenuLabels[] = {"-4", "-3", "-2", "-1", "LIN", "+1", "+2", + "+3", "+4", "S1", "S2", "Z1", "Z2" }; + +static void plotCurve(int color){ + // Assumes curve is in rage 0..12 + plotSubOption(curveMenuLabels[curve], color); } - static void drawSubCurve(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); + drawSubBox(); display.setCursor(80,15); display.println("CURVE"); plotCurve(WHITE); display.display(); } -static void plotCurve(int color){ - display.setTextColor(color); - display.setTextSize(2); - switch (curve){ - case 0: - display.setCursor(83,33); - display.println("-4"); - break; - case 1: - display.setCursor(83,33); - display.println("-3"); - break; - case 2: - display.setCursor(83,33); - display.println("-2"); - break; - case 3: - display.setCursor(83,33); - display.println("-1"); - break; - case 4: - display.setCursor(79,33); - display.println("LIN"); - break; - case 5: - display.setCursor(83,33); - display.println("+1"); - break; - case 6: - display.setCursor(83,33); - display.println("+2"); - break; - case 7: - display.setCursor(83,33); - display.println("+3"); - break; - case 8: - display.setCursor(83,33); - display.println("+4"); - break; - case 9: - display.setCursor(83,33); - display.println("S1"); - break; - case 10: - display.setCursor(83,33); - display.println("S2"); - break; - case 11: - display.setCursor(83,33); - display.println("Z1"); - break; - case 12: - display.setCursor(83,33); - display.println("Z2"); - break; +static void plotPort(int color){ + if (portamento == 1){ + plotSubOption("ON", color); + } else if (portamento == 2){ + plotSubOption("SW", color); + } else { + plotSubOption("OFF", color); } } - static void drawSubPort(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); + drawSubBox(); display.setCursor(71,15); display.println("PORT/GLD"); plotPort(WHITE); display.display(); } -static void plotPort(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); - if (portamento == 1){ - display.println("ON"); - } else if (portamento == 2){ - display.println("SW"); - } else { - display.println("OFF"); - } -} - -static void drawSubPB(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(68,15); - display.println("PITCHBEND"); - plotPB(WHITE); - display.display(); -} static void plotPB(int color){ display.setTextColor(color); @@ -927,55 +604,28 @@ static void plotPB(int color){ } } +static void drawSubPB(){ + drawSubBox(); + display.setCursor(68,15); + display.println("PITCHBEND"); + plotPB(WHITE); + display.display(); +} + +static const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" }; + +static void plotExtra(int color){ + plotSubOption(extraMenuLabels[extraCT], color); +} + static void drawSubExtra(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); + drawSubBox(); display.setCursor(68,15); display.println("EXTRA CTR"); plotExtra(WHITE); display.display(); } -static void plotExtra(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); - switch (extraCT){ - case 0: - display.setCursor(79,33); - display.println("OFF"); - break; - case 1: - display.setCursor(83,33); - display.println("MW"); - break; - case 2: - display.setCursor(83,33); - display.println("FP"); - break; - case 3: - display.setCursor(83,33); - display.println("CF"); - break; - case 4: - display.setCursor(83,33); - display.println("SP"); - break; - } -} - -static void drawSubVibrato(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(81,15); - display.println("LEVEL"); - plotVibrato(WHITE); - display.display(); -} static void plotVibrato(int color){ display.setTextColor(color); @@ -989,14 +639,11 @@ static void plotVibrato(int color){ } } -static void drawSubVibSens(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); +static void drawSubVibrato(){ + drawSubBox(); display.setCursor(81,15); display.println("LEVEL"); - plotVibSens(WHITE); + plotVibrato(WHITE); display.display(); } @@ -1007,14 +654,11 @@ static void plotVibSens(int color){ display.println(vibSens); } -static void drawSubVibRetn(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); +static void drawSubVibSens(){ + drawSubBox(); display.setCursor(81,15); display.println("LEVEL"); - plotVibRetn(WHITE); + plotVibSens(WHITE); display.display(); } @@ -1025,17 +669,15 @@ static void plotVibRetn(int color){ display.println(vibRetn); } -static void drawSubVibSquelch(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); +static void drawSubVibRetn(){ + drawSubBox(); display.setCursor(81,15); display.println("LEVEL"); - plotVibSquelch(WHITE); + plotVibRetn(WHITE); display.display(); } + static void plotVibSquelch(int color){ display.setTextColor(color); display.setTextSize(2); @@ -1043,43 +685,30 @@ static void plotVibSquelch(int color){ display.println(vibSquelch); } - - -static void drawSubVibDirection(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(68,15); - display.println("DIRECTION"); - plotVibDirection(WHITE); +static void drawSubVibSquelch(){ + drawSubBox(); + display.setCursor(81,15); + display.println("LEVEL"); + plotVibSquelch(WHITE); display.display(); } + + + static void plotVibDirection(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); if (DNWD == vibDirection){ - display.println("NRM"); + plotSubOption("NRM", color); } else { - display.println("REV"); + plotSubOption("NRM", color); } } - - - - - -static void drawSubDeglitch(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(71,15); - display.println("DEGLITCH"); - plotDeglitch(WHITE); +static void drawSubVibDirection(){ + drawSubBox(); + display.setCursor(68,15); + display.println("DIRECTION"); + plotVibDirection(WHITE); display.display(); } @@ -1097,17 +726,15 @@ static void plotDeglitch(int color){ } } -static void drawSubPinkyKey(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(68,15); - display.println("PINKY KEY"); - plotPinkyKey(WHITE); +static void drawSubDeglitch(){ + drawSubBox(); + display.setCursor(71,15); + display.println("DEGLITCH"); + plotDeglitch(WHITE); display.display(); } + static void plotPinkyKey(int color){ display.setTextColor(color); display.setTextSize(2); @@ -1122,14 +749,11 @@ static void plotPinkyKey(int color){ } } -static void drawSubVelSmpDl(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(69,15); - display.println("VEL DELAY"); - plotVelSmpDl(WHITE); +static void drawSubPinkyKey(){ + drawSubBox(); + display.setCursor(68,15); + display.println("PINKY KEY"); + plotPinkyKey(WHITE); display.display(); } @@ -1147,17 +771,15 @@ static void plotVelSmpDl(int color){ } } -static void drawSubVelBias(){ - display.fillRect(63,11,64,52,BLACK); - display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(72,15); - display.println("VEL BIAS"); - plotVelBias(WHITE); +static void drawSubVelSmpDl(){ + drawSubBox(); + display.setCursor(69,15); + display.println("VEL DELAY"); + plotVelSmpDl(WHITE); display.display(); } + static void plotVelBias(int color){ display.setTextColor(color); display.setTextSize(2); @@ -1170,6 +792,14 @@ static void plotVelBias(int color){ } } +static void drawSubVelBias(){ + drawSubBox(); + display.setCursor(72,15); + display.println("VEL BIAS"); + plotVelBias(WHITE); + display.display(); +} + static void drawSetupBrMenuScreen(){ drawMenu("SETUP BREATH", -1, 6, "BREATH CC", "BREATH AT", "VELOCITY", "CURVE", "VEL DELAY", "VEL BIAS"); } @@ -1182,92 +812,60 @@ static void drawVibratoMenuScreen(){ drawMenu("VIBRATO", -1, 5, "DEPTH","SENSE","RETURN", "SQUELCH", "DIRECTION"); } +static int sensorPixelPos1 = -1; +static int sensorPixelPos2 = -1; + +bool updateSensorPixel(int pos, int pos2) { + bool update = pos != sensorPixelPos1 || pos2 != sensorPixelPos2; + if(update) { + display.drawFastHLine(28, 38, 118-28, BLACK); // Clear old line + display.drawPixel(pos, 38, WHITE); + sensorPixelPos1 = pos; + sensorPixelPos2 = pos2; + } + return update; +} + void drawSensorPixels(){ - int pos,oldpos; int redraw=0; + if(forcePix) + sensorPixelPos1 = -1; + if ((state == BREATH_ADJ_IDL) || (state == BREATH_ADJ_THR) || (state == BREATH_ADJ_MAX)){ - pos = map(constrain(pressureSensor, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118); - oldpos = map(constrain(lastPressure, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118); - if (pos!=oldpos){ - display.drawPixel(oldpos, 38, BLACK); - display.drawPixel(pos, 38, WHITE); - display.display(); - } else if (forcePix) { - display.drawPixel(pos, 38, WHITE); - display.display(); - } - lastPressure=pressureSensor; + int pos = map(constrain(pressureSensor, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); } - if ((state == PORTAM_ADJ_IDL) || (state == PORTAM_ADJ_THR) || (state == PORTAM_ADJ_MAX)){ - pos = map(constrain(biteSensor,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118); - oldpos = map(constrain(lastBite,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118); - if (pos!=oldpos){ - display.drawPixel(oldpos, 38, BLACK); - display.drawPixel(pos, 38, WHITE); - display.display(); - } else if (forcePix) { - display.drawPixel(pos, 38, WHITE); - display.display(); - } - lastBite=biteSensor; - /*if (biteJumper){ - pos = map(constrain(analogRead(bitePin),900,1400), 900, 1400, 28, 118); - display.drawPixel(pos, 40, WHITE); - }*/ + else if ((state == PORTAM_ADJ_IDL) || (state == PORTAM_ADJ_THR) || (state == PORTAM_ADJ_MAX)){ + int pos = map(constrain(biteSensor,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); } - if ((state == PITCHB_ADJ_IDL) || (state == PITCHB_ADJ_THR) || (state == PITCHB_ADJ_MAX)){ - pos = map(constrain(pbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - oldpos = map(constrain(lastPbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - if (pos!=oldpos){ - display.drawPixel(oldpos, 38, BLACK); - display.drawPixel(pos, 38, WHITE); - redraw=1; - } else if (forcePix) { - display.drawPixel(pos, 38, WHITE); - redraw=1; - } - pos = map(constrain(pbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - oldpos = map(constrain(lastPbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - if (pos!=oldpos){ - display.drawPixel(oldpos, 38, BLACK); - display.drawPixel(pos, 38, WHITE); - redraw=1; - } else if (forcePix) { - display.drawPixel(pos, 38, WHITE); - redraw=1; - } - if (redraw){ - display.display(); - redraw=0; - } - lastPbUp=pbUp; - lastPbDn=pbDn; + else if ((state == PITCHB_ADJ_IDL) || (state == PITCHB_ADJ_THR) || (state == PITCHB_ADJ_MAX)){ + int pos = map(constrain(pbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); + int pos2 = map(constrain(pbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); + redraw = updateSensorPixel(pos, pos2); } - if ((state == EXTRAC_ADJ_IDL) || (state == EXTRAC_ADJ_THR) || (state == EXTRAC_ADJ_MAX)){ - pos = map(constrain(exSensor, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118); - oldpos = map(constrain(lastEx, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118); - if (pos!=oldpos){ - display.drawPixel(oldpos, 38, BLACK); - display.drawPixel(pos, 38, WHITE); - display.display(); - } else if (forcePix) { - display.drawPixel(pos, 38, WHITE); - display.display(); - } - lastEx=exSensor; + else if ((state == EXTRAC_ADJ_IDL) || (state == EXTRAC_ADJ_THR) || (state == EXTRAC_ADJ_MAX)){ + int pos = map(constrain(exSensor, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); } - if ((state == CTOUCH_ADJ_IDL) || (state == CTOUCH_ADJ_THR)){ + else if ((state == CTOUCH_ADJ_IDL) || (state == CTOUCH_ADJ_THR)){ display.drawLine(28,38,118,38,BLACK); for (byte i=0; i<12; i++){ - pos = map(constrain(touchSensor.filteredData(i), ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + int pos = map(constrain(touchSensor.filteredData(i), ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); display.drawPixel(pos, 38, WHITE); } + int posRead = map(touchRead(halfPitchBendKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); - pos = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - display.drawPixel(pos, 38, WHITE); + int pos = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + posRead = map(touchRead(specialKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); - pos = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - display.drawPixel(pos, 38, WHITE); + int pos2 = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + + updateSensorPixel(pos, pos2); + + redraw = 1; + } + if (redraw){ display.display(); } forcePix = 0; @@ -1279,8 +877,8 @@ void writeSetting(byte address, unsigned short value){ unsigned short val; } data; data.val = value; - EEPROM.write(address, data.v[0]); - EEPROM.write(address+1, data.v[1]); + EEPROM.update(address, data.v[0]); + EEPROM.update(address+1, data.v[1]); } unsigned short readSetting(byte address){ @@ -1318,30 +916,29 @@ static void clearFPS(int trills) { } static void selectMainMenu(){ + cursorBlinkTime = millis(); switch (mainMenuCursor){ case 1: subTranspose = 1; drawMenuCursor(mainMenuCursor, WHITE); display.display(); - cursorBlinkTime = millis(); drawSubTranspose(); break; case 2: subOctave = 1; drawMenuCursor(mainMenuCursor, WHITE); display.display(); - cursorBlinkTime = millis(); drawSubOctave(); break; case 3: subMIDI = 1; drawMenuCursor(mainMenuCursor, WHITE); display.display(); - cursorBlinkTime = millis(); drawSubMIDI(); break; case 4: state = BREATH_ADJ_IDL; + sensorPixelPos1 = -1; stateFirstRun = 1; break; case 5: @@ -1356,191 +953,180 @@ static void selectMainMenu(){ } static void selectRotatorMenu(){ + drawMenuCursor(rotatorMenuCursor, WHITE); + cursorBlinkTime = millis(); + switch (rotatorMenuCursor){ case 1: subParallel = 1; - drawMenuCursor(rotatorMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubRotator(); break; case 2: subRotator = 1; - drawMenuCursor(rotatorMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubRotator(); break; case 3: subRotator = 2; - drawMenuCursor(rotatorMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubRotator(); break; case 4: subRotator = 3; - drawMenuCursor(rotatorMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubRotator(); break; case 5: subRotator = 4; - drawMenuCursor(rotatorMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubRotator(); break; case 6: subPriority = 1; - drawMenuCursor(rotatorMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubPriority(); break; } } static void selectSetupBrMenu(){ + drawMenuCursor(setupBrMenuCursor, WHITE); + cursorBlinkTime = millis(); switch (setupBrMenuCursor){ case 1: subBreathCC = 1; - drawMenuCursor(setupBrMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubBreathCC(); break; case 2: subBreathAT = 1; - drawMenuCursor(setupBrMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubBreathAT(); break; case 3: subVelocity = 1; - drawMenuCursor(setupBrMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVelocity(); break; case 4: subCurve = 1; - drawMenuCursor(setupBrMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubCurve(); break; case 5: subVelSmpDl = 1; - drawMenuCursor(setupBrMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVelSmpDl(); break; case 6: subVelBias = 1; - drawMenuCursor(setupBrMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVelBias(); break; } } static void selectSetupCtMenu(){ + drawMenuCursor(setupCtMenuCursor, WHITE); + cursorBlinkTime = millis(); + switch (setupCtMenuCursor){ case 1: subPort = 1; - drawMenuCursor(setupCtMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubPort(); break; case 2: subPB = 1; - drawMenuCursor(setupCtMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubPB(); break; case 3: subExtra = 1; - drawMenuCursor(setupCtMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubExtra(); break; case 4: //subVibrato = 1; - //drawMenuCursor(setupCtMenuCursor, WHITE); - //display.display(); - //cursorBlinkTime = millis(); //drawSubVibrato(); state = VIBRATO_MENU; stateFirstRun = 1; break; case 5: subDeglitch = 1; - drawMenuCursor(setupCtMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubDeglitch(); break; case 6: subPinky = 1; - drawMenuCursor(setupCtMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubPinkyKey(); } } static void selectVibratoMenu(){ + drawMenuCursor(vibratoMenuCursor, WHITE); + cursorBlinkTime = millis(); + switch (vibratoMenuCursor){ case 1: subVibrato = 1; - drawMenuCursor(vibratoMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVibrato(); break; case 2: subVibSens = 1; - drawMenuCursor(vibratoMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVibSens(); break; case 3: subVibRetn = 1; - drawMenuCursor(vibratoMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVibRetn(); break; case 4: subVibSquelch = 1; - drawMenuCursor(vibratoMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVibSquelch(); break; case 5: subVibDirection = 1; - drawMenuCursor(vibratoMenuCursor, WHITE); - display.display(); - cursorBlinkTime = millis(); drawSubVibDirection(); break; } } -void menu() { +bool drawAdjustBar(uint16_t buttons, int row, uint16_t *valPtr, uint16_t minVal, uint16_t maxVal, uint16_t *pos) { + bool updated = false; + uint16_t step = (maxVal-minVal)/92; + int val = *valPtr; + switch(buttons) { + case BTN_UP: + val += step; + updated = true; + break; + case BTN_DOWN: + val -= step; + updated = true; + break; + } + if(updated) + { + *valPtr = constrain(val, minVal, maxVal); + auto p = *pos; + display.drawLine(p, row, p, row+6, BLACK); + *pos = p = map(*valPtr, minVal, maxVal, 27, 119); + display.drawLine(p, row, p, row+6, WHITE); + cursorNow = BLACK; + } + return updated; +} + +void updateAdjustCursor(uint32_t timeNow){ + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; + drawAdjCursor(cursorNow); + display.display(); + cursorBlinkTime = timeNow; + } +} + +static void updateAdjustLineCursor(uint32_t timeNow, uint16_t hPos, uint16_t vPos ) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; + display.drawLine(hPos, vPos,hPos, vPos+6, cursorNow);; + display.display(); + cursorBlinkTime = timeNow; + } +} + +void menu() { + unsigned long timeNow = millis(); // read the state of the switches - deumButtons = !digitalRead(dPin)+2*!digitalRead(ePin)+4*!digitalRead(uPin)+8*!digitalRead(mPin); + uint8_t deumButtons = 0x0f ^(digitalRead(dPin) | (digitalRead(ePin) << 1) | (digitalRead(uPin) << 2) | (digitalRead(mPin)<<3)); + + // mainMenu.update(deumButtons); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough @@ -1549,34 +1135,33 @@ void menu() { // If the switch changed, due to noise or pressing: if (deumButtons != lastDeumButtons) { // reset the debouncing timer - lastDebounceTime = millis(); + lastDebounceTime = timeNow; } - if ((millis() - lastDebounceTime) > debounceDelay) { + if ((timeNow - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (deumButtons != deumButtonState) { deumButtonState = deumButtons; - menuTime = millis(); + menuTime = timeNow; Serial.println(deumButtonState); buttonPressedAndNotUsed = 1; - buttonPressedTime = millis(); + buttonPressedTime = timeNow; } - if (((deumButtons == 1) || (deumButtons == 4)) && (millis() - buttonPressedTime > buttonRepeatDelay) && (millis() - buttonRepeatTime > buttonRepeatInterval)){ + if (((deumButtons == 1) || (deumButtons == 4)) && (timeNow - buttonPressedTime > buttonRepeatDelay) && (timeNow - buttonRepeatTime > buttonRepeatInterval)){ buttonPressedAndNotUsed = 1; - buttonRepeatTime = millis(); + buttonRepeatTime = timeNow; } - } // save the reading. Next time through the loop, it'll be the lastButtonState: lastDeumButtons = deumButtons; - if (state && ((millis() - menuTime) > menuTimeUp)) { // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) + if (state && ((timeNow - menuTime) > menuTimeUp)) { // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) state = DISPLAYOFF_IDL; stateFirstRun = 1; subTranspose = 0; @@ -1612,7 +1197,7 @@ void menu() { buttonPressedAndNotUsed = 0; int trills = readTrills(); switch (deumButtonState){ - case 1: + case BTN_DOWN: // down if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; @@ -1624,7 +1209,7 @@ void menu() { state = PATCH_VIEW; stateFirstRun = 1; break; - case 2: + case BTN_ENTER: // enter if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; @@ -1636,7 +1221,7 @@ void menu() { state = PATCH_VIEW; stateFirstRun = 1; break; - case 4: + case BTN_UP: // up if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; @@ -1649,7 +1234,7 @@ void menu() { buttonPressedAndNotUsed = 1; stateFirstRun = 1; break; - case 8: + case BTN_MENU: // menu if (pinkyKey && (exSensor >= ((extracThrVal+extracMaxVal)/2))){ // switch breath activated legacy settings on/off legacyBrAct = !legacyBrAct; @@ -1691,10 +1276,10 @@ void menu() { } else if (state == PATCH_VIEW){ if (stateFirstRun) { drawPatchView(); - patchViewTime = millis(); + patchViewTime = timeNow; stateFirstRun = 0; } - if ((millis() - patchViewTime) > patchViewTimeUp) { + if ((timeNow - patchViewTime) > patchViewTimeUp) { state = DISPLAYOFF_IDL; stateFirstRun = 1; doPatchUpdate = 1; @@ -1705,7 +1290,7 @@ void menu() { buttonPressedAndNotUsed = 0; int trills = readTrills(); switch (deumButtonState){ - case 1: + case BTN_DOWN: // down if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; @@ -1722,9 +1307,9 @@ void menu() { FPD = 0; } drawPatchView(); - patchViewTime = millis(); + patchViewTime = timeNow; break; - case 2: + case BTN_ENTER: // enter if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; @@ -1733,9 +1318,9 @@ void menu() { FPD = 1; drawPatchView(); } - patchViewTime = millis(); + patchViewTime = timeNow; break; - case 4: + case BTN_UP: // up if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; @@ -1752,9 +1337,9 @@ void menu() { FPD = 0; } drawPatchView(); - patchViewTime = millis(); + patchViewTime = timeNow; break; - case 8: + case BTN_MENU: // menu if (FPD < 2){ state = DISPLAYOFF_IDL; @@ -1775,7 +1360,7 @@ void menu() { display.setCursor(35,30); display.println("PANIC"); display.display(); - patchViewTime = millis(); + patchViewTime = timeNow; break; case 15: //all keys depressed, reboot to programming mode @@ -1788,27 +1373,26 @@ void menu() { stateFirstRun = 0; } if (subTranspose){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotTranspose(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (transpose > 0){ plotTranspose(BLACK); transpose--; plotTranspose(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotTranspose(WHITE); cursorNow = BLACK; @@ -1816,7 +1400,7 @@ void menu() { subTranspose = 0; if (readSetting(TRANSP_ADDR) != transpose) writeSetting(TRANSP_ADDR,transpose); break; - case 4: + case BTN_UP: // up if (transpose < 24){ plotTranspose(BLACK); @@ -1824,10 +1408,10 @@ void menu() { plotTranspose(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotTranspose(WHITE); cursorNow = BLACK; @@ -1838,27 +1422,26 @@ void menu() { } } } else if (subOctave){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotOctave(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (octave > 0){ plotOctave(BLACK); octave--; plotOctave(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotOctave(WHITE); cursorNow = BLACK; @@ -1866,7 +1449,7 @@ void menu() { subOctave = 0; if (readSetting(OCTAVE_ADDR) != octave) writeSetting(OCTAVE_ADDR,octave); break; - case 4: + case BTN_UP: // up if (octave < 6){ plotOctave(BLACK); @@ -1874,10 +1457,10 @@ void menu() { plotOctave(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotOctave(WHITE); cursorNow = BLACK; @@ -1888,27 +1471,26 @@ void menu() { } } } else if (subMIDI) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotMIDI(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (MIDIchannel > 1){ plotMIDI(BLACK); MIDIchannel--; plotMIDI(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter readSwitches(); if (pinkyKey){ @@ -1926,7 +1508,7 @@ void menu() { if (readSetting(MIDI_ADDR) != MIDIchannel) writeSetting(MIDI_ADDR,MIDIchannel); } break; - case 4: + case BTN_UP: // up if (MIDIchannel < 16){ plotMIDI(BLACK); @@ -1934,10 +1516,10 @@ void menu() { plotMIDI(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotMIDI(WHITE); cursorNow = BLACK; @@ -1948,18 +1530,17 @@ void menu() { } } } else { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(mainMenuCursor, cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; int trills = readTrills(); switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (mainMenuCursor < 6){ drawMenuCursor(mainMenuCursor, BLACK); mainMenuCursor++; @@ -1969,11 +1550,11 @@ void menu() { display.display(); } break; - case 2: + case BTN_ENTER: // enter selectMainMenu(); break; - case 4: + case BTN_UP: // up if (mainMenuCursor > 1){ drawMenuCursor(mainMenuCursor, BLACK); @@ -1984,7 +1565,7 @@ void menu() { display.display(); } break; - case 8: + case BTN_MENU: // menu state = DISPLAYOFF_IDL; stateFirstRun = 1; @@ -2019,7 +1600,7 @@ void menu() { stateFirstRun = 0; } if (subParallel){ - if (((millis() - cursorBlinkTime) > cursorBlinkInterval) || forceRedraw) { + if (((timeNow - cursorBlinkTime) > cursorBlinkInterval) || forceRedraw) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; if (forceRedraw){ forceRedraw = 0; @@ -2027,23 +1608,22 @@ void menu() { } plotRotator(cursorNow,parallel); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (parallel > -24){ plotRotator(BLACK,parallel); parallel--; plotRotator(WHITE,parallel); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotRotator(WHITE,parallel); cursorNow = BLACK; @@ -2051,7 +1631,7 @@ void menu() { subParallel = 0; if (readSetting(PARAL_ADDR) != (parallel + 24)) writeSetting(PARAL_ADDR,(parallel + 24)); break; - case 4: + case BTN_UP: // up if (parallel < 24){ plotRotator(BLACK,parallel); @@ -2059,10 +1639,10 @@ void menu() { plotRotator(WHITE,parallel); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotRotator(WHITE,parallel); cursorNow = BLACK; @@ -2073,7 +1653,7 @@ void menu() { } } } else if (subRotator){ - if (((millis() - cursorBlinkTime) > cursorBlinkInterval) || forceRedraw) { + if (((timeNow - cursorBlinkTime) > cursorBlinkInterval) || forceRedraw) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; if (forceRedraw){ forceRedraw = 0; @@ -2081,23 +1661,22 @@ void menu() { } plotRotator(cursorNow,rotations[subRotator-1]); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (rotations[subRotator-1] > -24){ plotRotator(BLACK,rotations[subRotator-1]); rotations[subRotator-1]--; plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; @@ -2105,7 +1684,7 @@ void menu() { if (readSetting(ROTN1_ADDR+2*(subRotator-1)) != rotations[subRotator-1]) writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); subRotator = 0; break; - case 4: + case BTN_UP: // up if (rotations[subRotator-1] < 24){ plotRotator(BLACK,rotations[subRotator-1]); @@ -2113,10 +1692,10 @@ void menu() { plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; @@ -2127,25 +1706,24 @@ void menu() { } } } else if (subPriority){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPriority(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotPriority(BLACK); priority = !priority; plotPriority(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotPriority(WHITE); cursorNow = BLACK; @@ -2153,16 +1731,16 @@ void menu() { subPriority = 0; if (readSetting(PRIO_ADDR) != priority) writeSetting(PRIO_ADDR,priority); break; - case 4: + case BTN_UP: // up plotPriority(BLACK); priority = !priority; plotPriority(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotPriority(WHITE); cursorNow = BLACK; @@ -2173,18 +1751,17 @@ void menu() { } } } else { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(rotatorMenuCursor, cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; int trills = readTrills(); switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (rotatorMenuCursor < 6){ drawMenuCursor(rotatorMenuCursor, BLACK); rotatorMenuCursor++; @@ -2194,11 +1771,11 @@ void menu() { display.display(); } break; - case 2: + case BTN_ENTER: // enter selectRotatorMenu(); break; - case 4: + case BTN_UP: // up if (rotatorMenuCursor > 1){ drawMenuCursor(rotatorMenuCursor, BLACK); @@ -2209,7 +1786,7 @@ void menu() { display.display(); } break; - case 8: + case BTN_MENU: // menu state = DISPLAYOFF_IDL; stateFirstRun = 1; @@ -2241,88 +1818,54 @@ void menu() { // end rotator menu } else if (state == BREATH_ADJ_IDL){ if (stateFirstRun) { - drawBreathScreen(); + drawAdjustScreen("BREATH", breathThrVal, breathMaxVal, breathLoLimit, breathHiLimit); forcePix = 1; stateFirstRun = 0; } - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawAdjCursor(cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: + case BTN_DOWN: // down state = PORTAM_ADJ_IDL; stateFirstRun = 1; - if (readSetting(BREATH_THR_ADDR) != breathThrVal) writeSetting(BREATH_THR_ADDR,breathThrVal); - if (readSetting(BREATH_MAX_ADDR) != breathMaxVal) writeSetting(BREATH_MAX_ADDR,breathMaxVal); + writeSetting(BREATH_THR_ADDR,breathThrVal); + writeSetting(BREATH_MAX_ADDR,breathMaxVal); break; - case 2: + case BTN_ENTER: // enter state = BREATH_ADJ_THR; break; - case 4: + case BTN_UP: // up state = CTOUCH_ADJ_IDL; stateFirstRun = 1; - if (readSetting(BREATH_THR_ADDR) != breathThrVal) writeSetting(BREATH_THR_ADDR,breathThrVal); - if (readSetting(BREATH_MAX_ADDR) != breathMaxVal) writeSetting(BREATH_MAX_ADDR,breathMaxVal); + writeSetting(BREATH_THR_ADDR,breathThrVal); + writeSetting(BREATH_MAX_ADDR,breathMaxVal); break; - case 8: + case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; - if (readSetting(BREATH_THR_ADDR) != breathThrVal) writeSetting(BREATH_THR_ADDR,breathThrVal); - if (readSetting(BREATH_MAX_ADDR) != breathMaxVal) writeSetting(BREATH_MAX_ADDR,breathMaxVal); + writeSetting(BREATH_THR_ADDR,breathThrVal); + writeSetting(BREATH_MAX_ADDR,breathMaxVal); break; } } } else if (state == BREATH_ADJ_THR){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos1,20,pos1,26,cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ + drawAdjustBar(deumButtonState, 20, &breathThrVal, breathLoLimit, breathHiLimit, &pos1); + cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down - if (breathThrVal - breathStep > breathLoLimit){ - breathThrVal -= breathStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(breathThrVal, breathLoLimit, breathHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: - // enter + case BTN_ENTER: state = BREATH_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); display.display(); break; - case 4: - // up - if (breathThrVal + breathStep < breathHiLimit){ - breathThrVal += breathStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(breathThrVal, breathLoLimit, breathHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: - // menu + case BTN_MENU: state = BREATH_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); display.display(); @@ -2330,87 +1873,55 @@ void menu() { } } } else if (state == BREATH_ADJ_MAX){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos2,50,pos2,57,cursorNow);; - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ + drawAdjustBar(deumButtonState, 50, &breathMaxVal, breathLoLimit, breathHiLimit, &pos2); + cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down - if ((breathMaxVal - breathStep) > (breathThrVal + minOffset)){ - breathMaxVal -= breathStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(breathMaxVal, breathLoLimit, breathHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: + case BTN_ENTER: // enter state = BREATH_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); + display.drawLine(pos2,50,pos2,56,WHITE); display.display(); break; - case 4: - // up - if (breathMaxVal + breathStep < breathHiLimit){ - breathMaxVal += breathStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(breathMaxVal, breathLoLimit, breathHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: + case BTN_MENU: // menu state = BREATH_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); + display.drawLine(pos2,50,pos2,56,WHITE); display.display(); break; } } } else if (state == PORTAM_ADJ_IDL){ if (stateFirstRun) { - drawPortamScreen(); + drawAdjustScreen("PORTAMENTO", portamThrVal, portamMaxVal, portamLoLimit, portamHiLimit); forcePix = 1; stateFirstRun = 0; } - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawAdjCursor(cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: + case BTN_DOWN: // down state = PITCHB_ADJ_IDL; stateFirstRun = 1; if (readSetting(PORTAM_THR_ADDR) != portamThrVal) writeSetting(PORTAM_THR_ADDR,portamThrVal); if (readSetting(PORTAM_MAX_ADDR) != portamMaxVal) writeSetting(PORTAM_MAX_ADDR,portamMaxVal); break; - case 2: + case BTN_ENTER: // enter state = PORTAM_ADJ_THR; break; - case 4: + case BTN_UP: // up state = BREATH_ADJ_IDL; stateFirstRun = 1; if (readSetting(PORTAM_THR_ADDR) != portamThrVal) writeSetting(PORTAM_THR_ADDR,portamThrVal); if (readSetting(PORTAM_MAX_ADDR) != portamMaxVal) writeSetting(PORTAM_MAX_ADDR,portamMaxVal); break; - case 8: + case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; @@ -2420,46 +1931,20 @@ void menu() { } } } else if (state == PORTAM_ADJ_THR){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos1,20,pos1,26,cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; + drawAdjustBar(deumButtonState, 20, &portamThrVal, portamLoLimit, portamHiLimit, &pos1); + cursorBlinkTime = timeNow; + switch (deumButtonState){ - case 1: - // down - if (portamThrVal - portamStep > portamLoLimit){ - portamThrVal -= portamStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(portamThrVal, portamLoLimit, portamHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: + case BTN_ENTER: // enter state = PORTAM_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); display.display(); break; - case 4: - // up - if (portamThrVal + portamStep < portamHiLimit){ - portamThrVal += portamStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(portamThrVal, portamLoLimit, portamHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: + case BTN_MENU: // menu state = PORTAM_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); @@ -2468,87 +1953,53 @@ void menu() { } } } else if (state == PORTAM_ADJ_MAX){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos2,50,pos2,57,cursorNow);; - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ + // TODO: Ask Johan what the minOffset is for... + // if ((portamMaxVal - portamStep) > (portamThrVal + minOffset)){ + + drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); + cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down - if ((portamMaxVal - portamStep) > (portamThrVal + minOffset)){ - portamMaxVal -= portamStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(portamMaxVal, portamLoLimit, portamHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: - // enter + case BTN_ENTER: + case BTN_MENU: state = PORTAM_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - break; - case 4: - // up - if (portamMaxVal + portamStep < portamHiLimit){ - portamMaxVal += portamStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(portamMaxVal, portamLoLimit, portamHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: - // menu - state = PORTAM_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); + display.drawLine(pos2,50,pos2,56,WHITE); display.display(); break; } } } else if (state == PITCHB_ADJ_IDL){ if (stateFirstRun) { - drawPitchbScreen(); + drawAdjustScreen("PITCH BEND", pitchbThrVal, pitchbMaxVal, pitchbLoLimit, pitchbHiLimit); + // drawPitchbScreen(); forcePix = 1; stateFirstRun = 0; } - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawAdjCursor(cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: + case BTN_DOWN: // down state = EXTRAC_ADJ_IDL; stateFirstRun = 1; if (readSetting(PITCHB_THR_ADDR) != pitchbThrVal) writeSetting(PITCHB_THR_ADDR,pitchbThrVal); if (readSetting(PITCHB_MAX_ADDR) != pitchbMaxVal) writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); break; - case 2: + case BTN_ENTER: // enter state = PITCHB_ADJ_THR; break; - case 4: + case BTN_UP: // up state = PORTAM_ADJ_IDL; stateFirstRun = 1; if (readSetting(PITCHB_THR_ADDR) != pitchbThrVal) writeSetting(PITCHB_THR_ADDR,pitchbThrVal); if (readSetting(PITCHB_MAX_ADDR) != pitchbMaxVal) writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); break; - case 8: + case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; @@ -2558,46 +2009,19 @@ void menu() { } } } else if (state == PITCHB_ADJ_THR){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos1,20,pos1,26,cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; + cursorBlinkTime = timeNow; + drawAdjustBar(deumButtonState, 20, &pitchbThrVal, pitchbLoLimit, pitchbHiLimit, &pos1); switch (deumButtonState){ - case 1: - // down - if (pitchbThrVal - pitchbStep > pitchbLoLimit){ - pitchbThrVal -= pitchbStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(pitchbThrVal, pitchbLoLimit, pitchbHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: + case BTN_ENTER: // enter state = PITCHB_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); display.display(); break; - case 4: - // up - if (pitchbThrVal + pitchbStep < pitchbHiLimit){ - pitchbThrVal += pitchbStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(pitchbThrVal, pitchbLoLimit, pitchbHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: + case BTN_MENU: // menu state = PITCHB_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); @@ -2606,49 +2030,16 @@ void menu() { } } } else if (state == PITCHB_ADJ_MAX){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos2,50,pos2,57,cursorNow);; - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ + drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); + cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down - if ((pitchbMaxVal - pitchbStep) > (pitchbThrVal + minOffset)){ - pitchbMaxVal -= pitchbStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(pitchbMaxVal, pitchbLoLimit, pitchbHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: - // enter + case BTN_ENTER: + case BTN_MENU: state = PITCHB_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - break; - case 4: - // up - if (pitchbMaxVal + pitchbStep < pitchbHiLimit){ - pitchbMaxVal += pitchbStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(pitchbMaxVal, pitchbLoLimit, pitchbHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: - // menu - state = PITCHB_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); + display.drawLine(pos2,50,pos2,56,WHITE); display.display(); break; } @@ -2656,38 +2047,35 @@ void menu() { } else if (state == EXTRAC_ADJ_IDL){ if (stateFirstRun) { - drawExtracScreen(); + drawAdjustScreen("EXTRA CONTROLLER", extracThrVal, extracMaxVal, extracLoLimit, extracHiLimit); forcePix = 1; stateFirstRun = 0; } - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawAdjCursor(cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + + updateAdjustCursor(timeNow); + if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: + case BTN_DOWN: // down state = CTOUCH_ADJ_IDL; stateFirstRun = 1; if (readSetting(EXTRAC_THR_ADDR) != extracThrVal) writeSetting(EXTRAC_THR_ADDR,extracThrVal); if (readSetting(EXTRAC_MAX_ADDR) != extracMaxVal) writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); break; - case 2: + case BTN_ENTER: // enter state = EXTRAC_ADJ_THR; break; - case 4: + case BTN_UP: // up state = PITCHB_ADJ_IDL; stateFirstRun = 1; if (readSetting(EXTRAC_THR_ADDR) != extracThrVal) writeSetting(EXTRAC_THR_ADDR,extracThrVal); if (readSetting(EXTRAC_MAX_ADDR) != extracMaxVal) writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); break; - case 8: + case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; @@ -2697,47 +2085,20 @@ void menu() { } } } else if (state == EXTRAC_ADJ_THR){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos1,20,pos1,26,cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos1, 20); + if (buttonPressedAndNotUsed){ + drawAdjustBar(deumButtonState, 20, &extracThrVal, extracLoLimit, extracHiLimit, &pos1); + + cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down - if (extracThrVal - extracStep > extracLoLimit){ - extracThrVal -= extracStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(extracThrVal, extracLoLimit, extracHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: - // enter + case BTN_ENTER: state = EXTRAC_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); display.display(); break; - case 4: - // up - if (extracThrVal + extracStep < extracHiLimit){ - extracThrVal += extracStep; - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(extracThrVal, extracLoLimit, extracHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: - // menu + case BTN_MENU: state = EXTRAC_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); display.display(); @@ -2745,49 +2106,17 @@ void menu() { } } } else if (state == EXTRAC_ADJ_MAX){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos2,50,pos2,57,cursorNow);; - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ + drawAdjustBar(deumButtonState, 50, &extracMaxVal, extracLoLimit, extracHiLimit, &pos2); + + cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down - if ((extracMaxVal - extracStep) > (extracThrVal + minOffset)){ - extracMaxVal -= extracStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(extracMaxVal, extracLoLimit, extracHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: - // enter + case BTN_ENTER: + case BTN_MENU: state = EXTRAC_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - break; - case 4: - // up - if (extracMaxVal + extracStep < extracHiLimit){ - extracMaxVal += extracStep; - display.drawLine(pos2,50,pos2,57,BLACK); - pos2 = map(extracMaxVal, extracLoLimit, extracHiLimit, 27, 119); - display.drawLine(pos2,50,pos2,57,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: - // menu - state = EXTRAC_ADJ_IDL; - display.drawLine(pos2,50,pos2,57,WHITE); + display.drawLine(pos2,50,pos2,56,WHITE); display.display(); break; } @@ -2795,36 +2124,31 @@ void menu() { } else if (state == CTOUCH_ADJ_IDL){ if (stateFirstRun) { - drawCtouchScreen(); + drawAdjustScreen("TOUCH SENSE", ctouchThrVal, -1, ctouchLoLimit, ctouchHiLimit); forcePix = 1; stateFirstRun = 0; } - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawAdjCursor(cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: + case BTN_DOWN: // down state = BREATH_ADJ_IDL; stateFirstRun = 1; if (readSetting(CTOUCH_THR_ADDR) != ctouchThrVal) writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); break; - case 2: + case BTN_ENTER: // enter state = CTOUCH_ADJ_THR; break; - case 4: + case BTN_UP: // up state = EXTRAC_ADJ_IDL; stateFirstRun = 1; if (readSetting(CTOUCH_THR_ADDR) != ctouchThrVal) writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); break; - case 8: + case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; @@ -2833,49 +2157,17 @@ void menu() { } } } else if (state == CTOUCH_ADJ_THR){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(pos1,20,pos1,26,cursorNow); - display.display(); - cursorBlinkTime = millis(); - } + updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; + + bool updated = drawAdjustBar(deumButtonState, 20, &ctouchThrVal, ctouchLoLimit, ctouchHiLimit, &pos1); + if(updated) + touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); + switch (deumButtonState){ - case 1: - // down - if (ctouchThrVal - ctouchStep > ctouchLoLimit){ - ctouchThrVal -= ctouchStep; - touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(ctouchThrVal, ctouchLoLimit, ctouchHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 2: - // enter - state = CTOUCH_ADJ_IDL; - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - break; - case 4: - // up - if (ctouchThrVal + ctouchStep < ctouchHiLimit){ - ctouchThrVal += ctouchStep; - touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); - display.drawLine(pos1,20,pos1,26,BLACK); - pos1 = map(ctouchThrVal, ctouchLoLimit, ctouchHiLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); - cursorBlinkTime = millis(); - cursorNow = BLACK; - } - break; - case 8: - // menu + case BTN_ENTER: + case BTN_MENU: state = CTOUCH_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); display.display(); @@ -2890,34 +2182,33 @@ void menu() { stateFirstRun = 0; } if (subBreathCC){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotBreathCC(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (breathCC > 0){ plotBreathCC(BLACK); breathCC--; plotBreathCC(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } else { plotBreathCC(BLACK); breathCC = 10; plotBreathCC(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotBreathCC(WHITE); cursorNow = BLACK; @@ -2928,7 +2219,7 @@ void menu() { midiReset(); } break; - case 4: + case BTN_UP: // up if (breathCC < 10){ plotBreathCC(BLACK); @@ -2936,17 +2227,17 @@ void menu() { plotBreathCC(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } else { plotBreathCC(BLACK); breathCC = 0; plotBreathCC(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotBreathCC(WHITE); cursorNow = BLACK; @@ -2960,25 +2251,24 @@ void menu() { } } } else if (subBreathAT) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotBreathAT(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotBreathAT(BLACK); breathAT=!breathAT; plotBreathAT(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotBreathAT(WHITE); cursorNow = BLACK; @@ -2989,16 +2279,16 @@ void menu() { midiReset(); } break; - case 4: + case BTN_UP: // up plotBreathAT(BLACK); breathAT=!breathAT; plotBreathAT(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotBreathAT(WHITE); cursorNow = BLACK; @@ -3012,17 +2302,16 @@ void menu() { } } } else if (subVelocity) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVelocity(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotVelocity(BLACK); if (velocity > 0){ velocity--; @@ -3030,9 +2319,9 @@ void menu() { plotVelocity(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotVelocity(WHITE); cursorNow = BLACK; @@ -3040,7 +2329,7 @@ void menu() { subVelocity = 0; if (readSetting(VELOCITY_ADDR) != velocity) writeSetting(VELOCITY_ADDR,velocity); break; - case 4: + case BTN_UP: // up plotVelocity(BLACK); if (velocity < 127){ @@ -3049,9 +2338,9 @@ void menu() { plotVelocity(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotVelocity(WHITE); cursorNow = BLACK; @@ -3064,17 +2353,16 @@ void menu() { } else if (subCurve) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotCurve(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotCurve(BLACK); if (curve > 0){ curve--; @@ -3082,9 +2370,9 @@ void menu() { plotCurve(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotCurve(WHITE); cursorNow = BLACK; @@ -3092,7 +2380,7 @@ void menu() { subCurve = 0; if (readSetting(BREATHCURVE_ADDR) != curve) writeSetting(BREATHCURVE_ADDR,curve); break; - case 4: + case BTN_UP: // up plotCurve(BLACK); if (curve < 12){ @@ -3101,9 +2389,9 @@ void menu() { plotCurve(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotCurve(WHITE); cursorNow = BLACK; @@ -3115,17 +2403,16 @@ void menu() { } } else if (subVelSmpDl) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVelSmpDl(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotVelSmpDl(BLACK); if (velSmpDl > 0){ velSmpDl-=1; @@ -3133,9 +2420,9 @@ void menu() { plotVelSmpDl(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotVelSmpDl(WHITE); cursorNow = BLACK; @@ -3143,7 +2430,7 @@ void menu() { subVelSmpDl = 0; if (readSetting(VEL_SMP_DL_ADDR) != velSmpDl) writeSetting(VEL_SMP_DL_ADDR,velSmpDl); break; - case 4: + case BTN_UP: // up plotVelSmpDl(BLACK); if (velSmpDl < 30){ @@ -3152,9 +2439,9 @@ void menu() { plotVelSmpDl(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotVelSmpDl(WHITE); cursorNow = BLACK; @@ -3166,17 +2453,16 @@ void menu() { } } else if (subVelBias) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVelBias(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotVelBias(BLACK); if (velBias > 0){ velBias--; @@ -3184,9 +2470,9 @@ void menu() { plotVelBias(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotVelBias(WHITE); cursorNow = BLACK; @@ -3194,7 +2480,7 @@ void menu() { subVelBias = 0; if (readSetting(VEL_BIAS_ADDR) != velBias) writeSetting(VEL_BIAS_ADDR,velBias); break; - case 4: + case BTN_UP: // up plotVelBias(BLACK); if (velBias < 9){ @@ -3203,9 +2489,9 @@ void menu() { plotVelBias(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotVelBias(WHITE); cursorNow = BLACK; @@ -3217,17 +2503,16 @@ void menu() { } } else { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(setupBrMenuCursor, cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (setupBrMenuCursor < 6){ drawMenuCursor(setupBrMenuCursor, BLACK); setupBrMenuCursor++; @@ -3237,11 +2522,11 @@ void menu() { display.display(); } break; - case 2: + case BTN_ENTER: // enter selectSetupBrMenu(); break; - case 4: + case BTN_UP: // up if (setupBrMenuCursor > 1){ drawMenuCursor(setupBrMenuCursor, BLACK); @@ -3252,7 +2537,7 @@ void menu() { display.display(); } break; - case 8: + case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; @@ -3268,17 +2553,16 @@ void menu() { stateFirstRun = 0; } if (subPort){ - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPort(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotPort(BLACK); if (portamento > 0){ portamento--; @@ -3286,9 +2570,9 @@ void menu() { plotPort(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotPort(WHITE); cursorNow = BLACK; @@ -3296,7 +2580,7 @@ void menu() { subPort = 0; if (readSetting(PORTAM_ADDR) != portamento) writeSetting(PORTAM_ADDR,portamento); break; - case 4: + case BTN_UP: // up plotPort(BLACK); if (portamento < 2){ @@ -3305,9 +2589,9 @@ void menu() { plotPort(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotPort(WHITE); cursorNow = BLACK; @@ -3318,27 +2602,26 @@ void menu() { } } } else if (subPB) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPB(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (PBdepth > 0){ plotPB(BLACK); PBdepth--; plotPB(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotPB(WHITE); cursorNow = BLACK; @@ -3346,7 +2629,7 @@ void menu() { subPB = 0; if (readSetting(PB_ADDR) != PBdepth) writeSetting(PB_ADDR,PBdepth); break; - case 4: + case BTN_UP: // up if (PBdepth < 12){ plotPB(BLACK); @@ -3354,10 +2637,10 @@ void menu() { plotPB(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotPB(WHITE); cursorNow = BLACK; @@ -3368,17 +2651,16 @@ void menu() { } } } else if (subExtra) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotExtra(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotExtra(BLACK); if (extraCT > 0){ extraCT--; @@ -3386,9 +2668,9 @@ void menu() { plotExtra(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotExtra(WHITE); cursorNow = BLACK; @@ -3396,7 +2678,7 @@ void menu() { subExtra = 0; if (readSetting(EXTRA_ADDR) != extraCT) writeSetting(EXTRA_ADDR,extraCT); break; - case 4: + case BTN_UP: // up plotExtra(BLACK); if (extraCT < 4){ @@ -3405,9 +2687,9 @@ void menu() { plotExtra(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotExtra(WHITE); cursorNow = BLACK; @@ -3418,27 +2700,26 @@ void menu() { } } } else if (subDeglitch) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotDeglitch(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (deglitch > 0){ plotDeglitch(BLACK); deglitch-=1; plotDeglitch(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotDeglitch(WHITE); cursorNow = BLACK; @@ -3446,7 +2727,7 @@ void menu() { subDeglitch = 0; if (readSetting(DEGLITCH_ADDR) != deglitch) writeSetting(DEGLITCH_ADDR,deglitch); break; - case 4: + case BTN_UP: // up if (deglitch < 70){ plotDeglitch(BLACK); @@ -3454,10 +2735,10 @@ void menu() { plotDeglitch(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotDeglitch(WHITE); cursorNow = BLACK; @@ -3468,27 +2749,26 @@ void menu() { } } } else if (subPinky) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPinkyKey(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (pinkySetting > 0){ plotPinkyKey(BLACK); pinkySetting-=1; plotPinkyKey(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotPinkyKey(WHITE); cursorNow = BLACK; @@ -3496,7 +2776,7 @@ void menu() { subPinky = 0; if (readSetting(PINKY_KEY_ADDR) != pinkySetting) writeSetting(PINKY_KEY_ADDR,pinkySetting); break; - case 4: + case BTN_UP: // up if (pinkySetting < 24){ plotPinkyKey(BLACK); @@ -3504,10 +2784,10 @@ void menu() { plotPinkyKey(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotPinkyKey(WHITE); cursorNow = BLACK; @@ -3518,17 +2798,16 @@ void menu() { } } } else { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(setupCtMenuCursor, cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (setupCtMenuCursor < 6){ drawMenuCursor(setupCtMenuCursor, BLACK); setupCtMenuCursor++; @@ -3538,11 +2817,11 @@ void menu() { display.display(); } break; - case 2: + case BTN_ENTER: // enter selectSetupCtMenu(); break; - case 4: + case BTN_UP: // up if (setupCtMenuCursor > 1){ drawMenuCursor(setupCtMenuCursor, BLACK); @@ -3553,7 +2832,7 @@ void menu() { display.display(); } break; - case 8: + case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; @@ -3572,27 +2851,26 @@ void menu() { stateFirstRun = 0; } if (subVibrato) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibrato(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (vibrato > 0){ plotVibrato(BLACK); vibrato--; plotVibrato(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotVibrato(WHITE); cursorNow = BLACK; @@ -3600,7 +2878,7 @@ void menu() { subVibrato = 0; if (readSetting(VIBRATO_ADDR) != vibrato) writeSetting(VIBRATO_ADDR,vibrato); break; - case 4: + case BTN_UP: // up if (vibrato < 9){ plotVibrato(BLACK); @@ -3608,10 +2886,10 @@ void menu() { plotVibrato(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotVibrato(WHITE); cursorNow = BLACK; @@ -3622,27 +2900,26 @@ void menu() { } } } else if (subVibSens) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibSens(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (vibSens > 1){ plotVibSens(BLACK); vibSens--; plotVibSens(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotVibSens(WHITE); cursorNow = BLACK; @@ -3650,7 +2927,7 @@ void menu() { subVibSens = 0; if (readSetting(VIB_SENS_ADDR) != vibSens) writeSetting(VIB_SENS_ADDR,vibSens); break; - case 4: + case BTN_UP: // up if (vibSens < 12){ plotVibSens(BLACK); @@ -3658,10 +2935,10 @@ void menu() { plotVibSens(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotVibSens(WHITE); cursorNow = BLACK; @@ -3672,17 +2949,16 @@ void menu() { } } } else if (subVibRetn) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibRetn(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotVibRetn(BLACK); if (vibRetn > 0){ vibRetn--; @@ -3690,9 +2966,9 @@ void menu() { plotVibRetn(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotVibRetn(WHITE); cursorNow = BLACK; @@ -3700,7 +2976,7 @@ void menu() { subVibRetn = 0; if (readSetting(VIB_RETN_ADDR) != vibRetn) writeSetting(VIB_RETN_ADDR,vibRetn); break; - case 4: + case BTN_UP: // up plotVibRetn(BLACK); if (vibRetn < 4){ @@ -3709,9 +2985,9 @@ void menu() { plotVibRetn(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotVibRetn(WHITE); cursorNow = BLACK; @@ -3722,27 +2998,26 @@ void menu() { } } } else if (subVibSquelch) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibSquelch(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (vibSquelch > 1){ plotVibSquelch(BLACK); vibSquelch--; plotVibSquelch(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 2: + case BTN_ENTER: // enter plotVibSquelch(WHITE); cursorNow = BLACK; @@ -3750,7 +3025,7 @@ void menu() { subVibSquelch = 0; if (readSetting(VIB_SQUELCH_ADDR) != vibSquelch) writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; - case 4: + case BTN_UP: // up if (vibSquelch < 30){ plotVibSquelch(BLACK); @@ -3758,10 +3033,10 @@ void menu() { plotVibSquelch(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } break; - case 8: + case BTN_MENU: // menu plotVibSquelch(WHITE); cursorNow = BLACK; @@ -3772,25 +3047,24 @@ void menu() { } } } else if (subVibDirection) { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibDirection(cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: plotVibDirection(BLACK); vibDirection = !vibDirection; plotVibDirection(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 2: + case BTN_ENTER: // enter plotVibDirection(WHITE); cursorNow = BLACK; @@ -3798,16 +3072,16 @@ void menu() { subVibDirection = 0; if (readSetting(VIB_DIRECTION_ADDR) != vibDirection) writeSetting(VIB_DIRECTION_ADDR,vibDirection); break; - case 4: + case BTN_UP: // up plotVibDirection(BLACK); vibDirection = !vibDirection; plotVibDirection(WHITE); cursorNow = BLACK; display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; break; - case 8: + case BTN_MENU: // menu plotVibDirection(WHITE); cursorNow = BLACK; @@ -3818,17 +3092,16 @@ void menu() { } } } else { - if ((millis() - cursorBlinkTime) > cursorBlinkInterval) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(vibratoMenuCursor, cursorNow); display.display(); - cursorBlinkTime = millis(); + cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case 1: - // down + case BTN_DOWN: if (vibratoMenuCursor < 5){ drawMenuCursor(vibratoMenuCursor, BLACK); vibratoMenuCursor++; @@ -3838,11 +3111,11 @@ void menu() { display.display(); } break; - case 2: + case BTN_ENTER: // enter selectVibratoMenu(); break; - case 4: + case BTN_UP: // up if (vibratoMenuCursor > 1){ drawMenuCursor(vibratoMenuCursor, BLACK); @@ -3853,7 +3126,7 @@ void menu() { display.display(); } break; - case 8: + case BTN_MENU: // menu state = SETUP_CT_MENU; stateFirstRun = 1; diff --git a/NuEVI/menu.h b/NuEVI/menu.h index 79a2030..a2e5d4d 100644 --- a/NuEVI/menu.h +++ b/NuEVI/menu.h @@ -5,7 +5,7 @@ #define MENU_ROW_HEIGHT 9 #define MENU_HEADER_OFFSET 3 - +#define MENU_NUM_ROWS 5 //display states #define DISPLAYOFF_IDL 0 diff --git a/NuEVI/numenu.cpp b/NuEVI/numenu.cpp new file mode 100644 index 0000000..c8cbd9f --- /dev/null +++ b/NuEVI/numenu.cpp @@ -0,0 +1,115 @@ +/* +Notes on the original menu implementation + +# Menus + +## Main Menu + +### Transpose +Sub menu with values -12 to 12. + +### Octave +Sub menu with values -3 to +3 + +### MIDI CH + +Sub menu with values 0 to 16. Should be 1 to 16, but there might be a bug +either in my simulation code, my changes to the menu or a bug in the original +menu. + +### Adjust + +This is a special option where the Adjust menu mode is entered. It take over +the display and draw horizontal indicators for threshold and such. More on +this in a later section. + +### SETUP BR + +Breath setup. Opens a new menu with breath specific stuff. + + +### SETUP CTL + +Controls setup. Opens a new menu. + + + + */ + +#include +#include +#include "numenu.h" +#include "menu.h" + +NuMenu::NuMenu(Adafruit_SSD1306& display) + : _display(display) +{ +} + +bool NuMenu::init() +{ + // memset(_pageStack, 0, sizeof(_pageStack)); + // _rootMenu = MenuPageState(root, 0, 0); + _enabled = false; + return true; +} + +void NuMenu::update(uint16_t buttonState) +{ + if(_enabled) + { + // int + } +} +extern Adafruit_SSD1306 display; + +void NuMenu::drawMenuItems(const char* title, const char* entries[], int count, int selection, int offset) +{ + //Initialize display and draw menu header + line + display.clearDisplay(); + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(0,0); + display.println(title); + display.drawLine(0,MENU_ROW_HEIGHT,127,MENU_ROW_HEIGHT, WHITE); + + int rowPixel = MENU_HEADER_OFFSET + MENU_ROW_HEIGHT; + + for(int index = offset, count = 0; ((index-offset) < MENU_NUM_ROWS) && index < count; index++ ) + { + // int rowPixel = (row+1)*MENU_ROW_HEIGHT + MENU_HEADER_OFFSET; + const char* lineText = entries[index]; + display.setCursor(0,rowPixel); + rowPixel += (MENU_ROW_HEIGHT+1); + display.println(lineText); + } + + // TODO: Fix cursor + // if(selection>=0) + // drawMenuCursor(selection, WHITE); + +} + + + +// This is for the SUB MENU +// void NuMenu::drawSelection(const char* title, const char* entries[], int count, int* selection) +// { +// _display.fillRect(63,11,64,52,BLACK); +// _display.drawRect(63,11,64,52,WHITE); +// _display.setTextColor(WHITE); +// _display.setTextSize(1); + +// _display.setCursor(68,15); +// _display.println(title); + +// const char* entryTxt = entries[*selection]; +// int len = strlen(entryTxt); + +// _display.setTextSize(2); + +// _display.setCursor(91 - 4*len,33); +// _display.println(entryTxt); + +// _display.display(); +// } diff --git a/NuEVI/numenu.h b/NuEVI/numenu.h new file mode 100644 index 0000000..bc31595 --- /dev/null +++ b/NuEVI/numenu.h @@ -0,0 +1,31 @@ +#ifndef __NUMENU_H +#define __NUMENU_H + +#include +#include + +#define MAX_DEPTH 16 + +class Adafruit_SSD1306; + +class NuMenu +{ +public: + NuMenu(Adafruit_SSD1306 &gfx); + + bool init(); + void update(uint16_t buttonState); + + void setEnabled(bool state) { _enabled = state; } + + static void drawMenuItems(const char* title, const char* entries[], int count, int selection, int offset = 0); + +private: + bool _enabled; + // MenuPageState _rootMenu; + // MenuPageState _pageStack[MAX_DEPTH]; + + Adafruit_SSD1306 &_display; +}; + +#endif From 2f5c546b2c37dfc95ee47f7ae435488a8759cc60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 15 Jun 2019 19:16:13 +0200 Subject: [PATCH 02/35] Two unrelated changes * Move text print of submenu into function * No need to check if value changed since writeSettings uses EEPROM.update. --- NuEVI/menu.cpp | 220 ++++++++++++++++++++----------------------------- 1 file changed, 91 insertions(+), 129 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 04c68b2..d1fd71e 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -372,12 +372,16 @@ static void clearSub(){ display.fillRect(63,11,64,52,BLACK); } -static void drawSubBox() +static void drawSubBox(const char* label) { display.fillRect(63,11,64,52,BLACK); display.drawRect(63,11,64,52,WHITE); display.setTextColor(WHITE); display.setTextSize(1); + int len = strlen(label); + + display.setCursor(95-len*3,15); + display.println(label); } static void plotTranspose(int color){ @@ -396,9 +400,7 @@ static void plotTranspose(int color){ } static void drawSubTranspose(){ - drawSubBox(); - display.setCursor(68,15); - display.println("TRANSPOSE"); + drawSubBox("TRANSPOSE"); plotTranspose(WHITE); display.display(); } @@ -420,9 +422,7 @@ static void plotRotator(int color,int value){ } static void drawSubRotator(){ - drawSubBox(); - display.setCursor(68,15); - display.println("SEMITONES"); + drawSubBox("SEMITONES"); //plotRotator(WHITE,value); forceRedraw = 1; display.display(); @@ -440,9 +440,7 @@ static void plotPriority(int color){ } static void drawSubPriority(){ - drawSubBox(); - display.setCursor(68,15); - display.println("MONO PRIO"); + drawSubBox("MONO PRIO"); plotPriority(WHITE); display.display(); } @@ -464,9 +462,7 @@ static void plotOctave(int color){ } static void drawSubOctave(){ - drawSubBox(); - display.setCursor(77,15); - display.println("OCTAVE"); + drawSubBox("OCTAVE"); plotOctave(WHITE); display.display(); } @@ -487,9 +483,7 @@ static void plotMIDI(int color){ } static void drawSubMIDI(){ - drawSubBox(); - display.setCursor(68,15); - display.println("MIDI CHNL"); + drawSubBox("MIDI CHNL"); plotMIDI(WHITE); display.display(); } @@ -512,9 +506,7 @@ static void plotBreathCC(int color){ } static void drawSubBreathCC(){ - drawSubBox(); - display.setCursor(68,15); - display.println("BREATH CC"); + drawSubBox("BREATH CC"); plotBreathCC(WHITE); display.display(); } @@ -528,9 +520,7 @@ static void plotBreathAT(int color){ } static void drawSubBreathAT(){ - drawSubBox(); - display.setCursor(68,15); - display.println("BREATH AT"); + drawSubBox("BREATH AT"); plotBreathAT(WHITE); display.display(); } @@ -548,9 +538,7 @@ static void plotVelocity(int color){ } static void drawSubVelocity(){ - drawSubBox(); - display.setCursor(71,15); - display.println("VELOCITY"); + drawSubBox("VELOCITY"); plotVelocity(WHITE); display.display(); } @@ -565,9 +553,7 @@ static void plotCurve(int color){ } static void drawSubCurve(){ - drawSubBox(); - display.setCursor(80,15); - display.println("CURVE"); + drawSubBox("CURVE"); plotCurve(WHITE); display.display(); } @@ -583,9 +569,7 @@ static void plotPort(int color){ } static void drawSubPort(){ - drawSubBox(); - display.setCursor(71,15); - display.println("PORT/GLD"); + drawSubBox("PORT/GLD"); plotPort(WHITE); display.display(); } @@ -605,9 +589,7 @@ static void plotPB(int color){ } static void drawSubPB(){ - drawSubBox(); - display.setCursor(68,15); - display.println("PITCHBEND"); + drawSubBox("PITCHBEND"); plotPB(WHITE); display.display(); } @@ -619,9 +601,7 @@ static void plotExtra(int color){ } static void drawSubExtra(){ - drawSubBox(); - display.setCursor(68,15); - display.println("EXTRA CTR"); + drawSubBox("EXTRA CTR"); plotExtra(WHITE); display.display(); } @@ -640,9 +620,7 @@ static void plotVibrato(int color){ } static void drawSubVibrato(){ - drawSubBox(); - display.setCursor(81,15); - display.println("LEVEL"); + drawSubBox("LEVEL"); plotVibrato(WHITE); display.display(); } @@ -655,9 +633,7 @@ static void plotVibSens(int color){ } static void drawSubVibSens(){ - drawSubBox(); - display.setCursor(81,15); - display.println("LEVEL"); + drawSubBox("LEVEL"); plotVibSens(WHITE); display.display(); } @@ -670,9 +646,7 @@ static void plotVibRetn(int color){ } static void drawSubVibRetn(){ - drawSubBox(); - display.setCursor(81,15); - display.println("LEVEL"); + drawSubBox("LEVEL"); plotVibRetn(WHITE); display.display(); } @@ -686,9 +660,7 @@ static void plotVibSquelch(int color){ } static void drawSubVibSquelch(){ - drawSubBox(); - display.setCursor(81,15); - display.println("LEVEL"); + drawSubBox("LEVEL"); plotVibSquelch(WHITE); display.display(); } @@ -705,9 +677,7 @@ static void plotVibDirection(int color){ } static void drawSubVibDirection(){ - drawSubBox(); - display.setCursor(68,15); - display.println("DIRECTION"); + drawSubBox("DIRECTION"); plotVibDirection(WHITE); display.display(); } @@ -727,9 +697,7 @@ static void plotDeglitch(int color){ } static void drawSubDeglitch(){ - drawSubBox(); - display.setCursor(71,15); - display.println("DEGLITCH"); + drawSubBox("DEGLITCH"); plotDeglitch(WHITE); display.display(); } @@ -750,9 +718,7 @@ static void plotPinkyKey(int color){ } static void drawSubPinkyKey(){ - drawSubBox(); - display.setCursor(68,15); - display.println("PINKY KEY"); + drawSubBox("PINKY KEY"); plotPinkyKey(WHITE); display.display(); } @@ -772,9 +738,7 @@ static void plotVelSmpDl(int color){ } static void drawSubVelSmpDl(){ - drawSubBox(); - display.setCursor(69,15); - display.println("VEL DELAY"); + drawSubBox("VEL DELAY"); plotVelSmpDl(WHITE); display.display(); } @@ -793,9 +757,7 @@ static void plotVelBias(int color){ } static void drawSubVelBias(){ - drawSubBox(); - display.setCursor(72,15); - display.println("VEL BIAS"); + drawSubBox("VEL BIAS"); plotVelBias(WHITE); display.display(); } @@ -1284,7 +1246,7 @@ void menu() { stateFirstRun = 1; doPatchUpdate = 1; FPD = 0; - if (readSetting(PATCH_ADDR) != patch) writeSetting(PATCH_ADDR,patch); + writeSetting(PATCH_ADDR,patch); } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; @@ -1297,7 +1259,7 @@ void menu() { activePatch = 0; doPatchUpdate = 1; FPD = 1; - if (readSetting(PATCH_ADDR) != patch) writeSetting(PATCH_ADDR,patch); + writeSetting(PATCH_ADDR,patch); } else if (!trills){ if (patch > 1){ patch--; @@ -1327,7 +1289,7 @@ void menu() { activePatch = 0; doPatchUpdate = 1; FPD = 1; - if (readSetting(PATCH_ADDR) != patch) writeSetting(PATCH_ADDR,patch); + writeSetting(PATCH_ADDR,patch); } else if (!trills){ if (patch < 128){ patch++; @@ -1346,7 +1308,7 @@ void menu() { stateFirstRun = 1; doPatchUpdate = 1; } - if (readSetting(PATCH_ADDR) != patch) writeSetting(PATCH_ADDR,patch); + writeSetting(PATCH_ADDR,patch); FPD = 0; break; case 10: @@ -1398,7 +1360,7 @@ void menu() { cursorNow = BLACK; display.display(); subTranspose = 0; - if (readSetting(TRANSP_ADDR) != transpose) writeSetting(TRANSP_ADDR,transpose); + writeSetting(TRANSP_ADDR,transpose); break; case BTN_UP: // up @@ -1417,7 +1379,7 @@ void menu() { cursorNow = BLACK; display.display(); subTranspose = 0; - if (readSetting(TRANSP_ADDR) != transpose) writeSetting(TRANSP_ADDR,transpose); + writeSetting(TRANSP_ADDR,transpose); break; } } @@ -1447,7 +1409,7 @@ void menu() { cursorNow = BLACK; display.display(); subOctave = 0; - if (readSetting(OCTAVE_ADDR) != octave) writeSetting(OCTAVE_ADDR,octave); + writeSetting(OCTAVE_ADDR,octave); break; case BTN_UP: // up @@ -1466,7 +1428,7 @@ void menu() { cursorNow = BLACK; display.display(); subOctave = 0; - if (readSetting(OCTAVE_ADDR) != octave) writeSetting(OCTAVE_ADDR,octave); + writeSetting(OCTAVE_ADDR,octave); break; } } @@ -1505,7 +1467,7 @@ void menu() { cursorNow = BLACK; display.display(); subMIDI = 0; - if (readSetting(MIDI_ADDR) != MIDIchannel) writeSetting(MIDI_ADDR,MIDIchannel); + writeSetting(MIDI_ADDR,MIDIchannel); } break; case BTN_UP: @@ -1525,7 +1487,7 @@ void menu() { cursorNow = BLACK; display.display(); subMIDI = 0; - if (readSetting(MIDI_ADDR) != MIDIchannel) writeSetting(MIDI_ADDR,MIDIchannel); + writeSetting(MIDI_ADDR,MIDIchannel); break; } } @@ -1629,7 +1591,7 @@ void menu() { cursorNow = BLACK; display.display(); subParallel = 0; - if (readSetting(PARAL_ADDR) != (parallel + 24)) writeSetting(PARAL_ADDR,(parallel + 24)); + writeSetting(PARAL_ADDR,(parallel + 24)); break; case BTN_UP: // up @@ -1648,7 +1610,7 @@ void menu() { cursorNow = BLACK; display.display(); subParallel = 0; - if (readSetting(PARAL_ADDR) != (parallel + 24)) writeSetting(PARAL_ADDR,(parallel + 24)); + writeSetting(PARAL_ADDR,(parallel + 24)); break; } } @@ -1681,7 +1643,7 @@ void menu() { plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; display.display(); - if (readSetting(ROTN1_ADDR+2*(subRotator-1)) != rotations[subRotator-1]) writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); + writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); subRotator = 0; break; case BTN_UP: @@ -1700,7 +1662,7 @@ void menu() { plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; display.display(); - if (readSetting(ROTN1_ADDR+2*(subRotator-1)) != (rotations[subRotator-1]+24)) writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); + writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); subRotator = 0; break; } @@ -1729,7 +1691,7 @@ void menu() { cursorNow = BLACK; display.display(); subPriority = 0; - if (readSetting(PRIO_ADDR) != priority) writeSetting(PRIO_ADDR,priority); + writeSetting(PRIO_ADDR,priority); break; case BTN_UP: // up @@ -1746,7 +1708,7 @@ void menu() { cursorNow = BLACK; display.display(); subPriority = 0; - if (readSetting(PRIO_ADDR) != priority) writeSetting(PRIO_ADDR,priority); + writeSetting(PRIO_ADDR,priority); break; } } @@ -1907,8 +1869,8 @@ void menu() { // down state = PITCHB_ADJ_IDL; stateFirstRun = 1; - if (readSetting(PORTAM_THR_ADDR) != portamThrVal) writeSetting(PORTAM_THR_ADDR,portamThrVal); - if (readSetting(PORTAM_MAX_ADDR) != portamMaxVal) writeSetting(PORTAM_MAX_ADDR,portamMaxVal); + writeSetting(PORTAM_THR_ADDR,portamThrVal); + writeSetting(PORTAM_MAX_ADDR,portamMaxVal); break; case BTN_ENTER: // enter @@ -1918,15 +1880,15 @@ void menu() { // up state = BREATH_ADJ_IDL; stateFirstRun = 1; - if (readSetting(PORTAM_THR_ADDR) != portamThrVal) writeSetting(PORTAM_THR_ADDR,portamThrVal); - if (readSetting(PORTAM_MAX_ADDR) != portamMaxVal) writeSetting(PORTAM_MAX_ADDR,portamMaxVal); + writeSetting(PORTAM_THR_ADDR,portamThrVal); + writeSetting(PORTAM_MAX_ADDR,portamMaxVal); break; case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; - if (readSetting(PORTAM_THR_ADDR) != portamThrVal) writeSetting(PORTAM_THR_ADDR,portamThrVal); - if (readSetting(PORTAM_MAX_ADDR) != portamMaxVal) writeSetting(PORTAM_MAX_ADDR,portamMaxVal); + writeSetting(PORTAM_THR_ADDR,portamThrVal); + writeSetting(PORTAM_MAX_ADDR,portamMaxVal); break; } } @@ -1985,8 +1947,8 @@ void menu() { // down state = EXTRAC_ADJ_IDL; stateFirstRun = 1; - if (readSetting(PITCHB_THR_ADDR) != pitchbThrVal) writeSetting(PITCHB_THR_ADDR,pitchbThrVal); - if (readSetting(PITCHB_MAX_ADDR) != pitchbMaxVal) writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); + writeSetting(PITCHB_THR_ADDR,pitchbThrVal); + writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); break; case BTN_ENTER: // enter @@ -1996,15 +1958,15 @@ void menu() { // up state = PORTAM_ADJ_IDL; stateFirstRun = 1; - if (readSetting(PITCHB_THR_ADDR) != pitchbThrVal) writeSetting(PITCHB_THR_ADDR,pitchbThrVal); - if (readSetting(PITCHB_MAX_ADDR) != pitchbMaxVal) writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); + writeSetting(PITCHB_THR_ADDR,pitchbThrVal); + writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); break; case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; - if (readSetting(PITCHB_THR_ADDR) != pitchbThrVal) writeSetting(PITCHB_THR_ADDR,pitchbThrVal); - if (readSetting(PITCHB_MAX_ADDR) != pitchbMaxVal) writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); + writeSetting(PITCHB_THR_ADDR,pitchbThrVal); + writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); break; } } @@ -2061,8 +2023,8 @@ void menu() { // down state = CTOUCH_ADJ_IDL; stateFirstRun = 1; - if (readSetting(EXTRAC_THR_ADDR) != extracThrVal) writeSetting(EXTRAC_THR_ADDR,extracThrVal); - if (readSetting(EXTRAC_MAX_ADDR) != extracMaxVal) writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); + writeSetting(EXTRAC_THR_ADDR,extracThrVal); + writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); break; case BTN_ENTER: // enter @@ -2072,15 +2034,15 @@ void menu() { // up state = PITCHB_ADJ_IDL; stateFirstRun = 1; - if (readSetting(EXTRAC_THR_ADDR) != extracThrVal) writeSetting(EXTRAC_THR_ADDR,extracThrVal); - if (readSetting(EXTRAC_MAX_ADDR) != extracMaxVal) writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); + writeSetting(EXTRAC_THR_ADDR,extracThrVal); + writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); break; case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; - if (readSetting(EXTRAC_THR_ADDR) != extracThrVal) writeSetting(EXTRAC_THR_ADDR,extracThrVal); - if (readSetting(EXTRAC_MAX_ADDR) != extracMaxVal) writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); + writeSetting(EXTRAC_THR_ADDR,extracThrVal); + writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); break; } } @@ -2136,7 +2098,7 @@ void menu() { // down state = BREATH_ADJ_IDL; stateFirstRun = 1; - if (readSetting(CTOUCH_THR_ADDR) != ctouchThrVal) writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); + writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); break; case BTN_ENTER: // enter @@ -2146,13 +2108,13 @@ void menu() { // up state = EXTRAC_ADJ_IDL; stateFirstRun = 1; - if (readSetting(CTOUCH_THR_ADDR) != ctouchThrVal) writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); + writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); break; case BTN_MENU: // menu state = MAIN_MENU; stateFirstRun = 1; - if (readSetting(CTOUCH_THR_ADDR) != ctouchThrVal) writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); + writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); break; } } @@ -2327,7 +2289,7 @@ void menu() { cursorNow = BLACK; display.display(); subVelocity = 0; - if (readSetting(VELOCITY_ADDR) != velocity) writeSetting(VELOCITY_ADDR,velocity); + writeSetting(VELOCITY_ADDR,velocity); break; case BTN_UP: // up @@ -2346,7 +2308,7 @@ void menu() { cursorNow = BLACK; display.display(); subVelocity = 0; - if (readSetting(VELOCITY_ADDR) != velocity) writeSetting(VELOCITY_ADDR,velocity); + writeSetting(VELOCITY_ADDR,velocity); break; } } @@ -2378,7 +2340,7 @@ void menu() { cursorNow = BLACK; display.display(); subCurve = 0; - if (readSetting(BREATHCURVE_ADDR) != curve) writeSetting(BREATHCURVE_ADDR,curve); + writeSetting(BREATHCURVE_ADDR,curve); break; case BTN_UP: // up @@ -2397,7 +2359,7 @@ void menu() { cursorNow = BLACK; display.display(); subCurve = 0; - if (readSetting(BREATHCURVE_ADDR) != curve) writeSetting(BREATHCURVE_ADDR,curve); + writeSetting(BREATHCURVE_ADDR,curve); break; } } @@ -2428,7 +2390,7 @@ void menu() { cursorNow = BLACK; display.display(); subVelSmpDl = 0; - if (readSetting(VEL_SMP_DL_ADDR) != velSmpDl) writeSetting(VEL_SMP_DL_ADDR,velSmpDl); + writeSetting(VEL_SMP_DL_ADDR,velSmpDl); break; case BTN_UP: // up @@ -2447,7 +2409,7 @@ void menu() { cursorNow = BLACK; display.display(); subVelSmpDl = 0; - if (readSetting(VEL_SMP_DL_ADDR) != velSmpDl) writeSetting(VEL_SMP_DL_ADDR,velSmpDl); + writeSetting(VEL_SMP_DL_ADDR,velSmpDl); break; } } @@ -2478,7 +2440,7 @@ void menu() { cursorNow = BLACK; display.display(); subVelBias = 0; - if (readSetting(VEL_BIAS_ADDR) != velBias) writeSetting(VEL_BIAS_ADDR,velBias); + writeSetting(VEL_BIAS_ADDR,velBias); break; case BTN_UP: // up @@ -2497,7 +2459,7 @@ void menu() { cursorNow = BLACK; display.display(); subVelBias = 0; - if (readSetting(VEL_BIAS_ADDR) != velBias) writeSetting(VEL_BIAS_ADDR,velBias); + writeSetting(VEL_BIAS_ADDR,velBias); break; } } @@ -2578,7 +2540,7 @@ void menu() { cursorNow = BLACK; display.display(); subPort = 0; - if (readSetting(PORTAM_ADDR) != portamento) writeSetting(PORTAM_ADDR,portamento); + writeSetting(PORTAM_ADDR,portamento); break; case BTN_UP: // up @@ -2597,7 +2559,7 @@ void menu() { cursorNow = BLACK; display.display(); subPort = 0; - if (readSetting(PORTAM_ADDR) != portamento) writeSetting(PORTAM_ADDR,portamento); + writeSetting(PORTAM_ADDR,portamento); break; } } @@ -2627,7 +2589,7 @@ void menu() { cursorNow = BLACK; display.display(); subPB = 0; - if (readSetting(PB_ADDR) != PBdepth) writeSetting(PB_ADDR,PBdepth); + writeSetting(PB_ADDR,PBdepth); break; case BTN_UP: // up @@ -2646,7 +2608,7 @@ void menu() { cursorNow = BLACK; display.display(); subPB = 0; - if (readSetting(PB_ADDR) != PBdepth) writeSetting(PB_ADDR,PBdepth); + writeSetting(PB_ADDR,PBdepth); break; } } @@ -2676,7 +2638,7 @@ void menu() { cursorNow = BLACK; display.display(); subExtra = 0; - if (readSetting(EXTRA_ADDR) != extraCT) writeSetting(EXTRA_ADDR,extraCT); + writeSetting(EXTRA_ADDR,extraCT); break; case BTN_UP: // up @@ -2695,7 +2657,7 @@ void menu() { cursorNow = BLACK; display.display(); subExtra = 0; - if (readSetting(EXTRA_ADDR) != extraCT) writeSetting(EXTRA_ADDR,extraCT); + writeSetting(EXTRA_ADDR,extraCT); break; } } @@ -2725,7 +2687,7 @@ void menu() { cursorNow = BLACK; display.display(); subDeglitch = 0; - if (readSetting(DEGLITCH_ADDR) != deglitch) writeSetting(DEGLITCH_ADDR,deglitch); + writeSetting(DEGLITCH_ADDR,deglitch); break; case BTN_UP: // up @@ -2744,7 +2706,7 @@ void menu() { cursorNow = BLACK; display.display(); subDeglitch = 0; - if (readSetting(DEGLITCH_ADDR) != deglitch) writeSetting(DEGLITCH_ADDR,deglitch); + writeSetting(DEGLITCH_ADDR,deglitch); break; } } @@ -2774,7 +2736,7 @@ void menu() { cursorNow = BLACK; display.display(); subPinky = 0; - if (readSetting(PINKY_KEY_ADDR) != pinkySetting) writeSetting(PINKY_KEY_ADDR,pinkySetting); + writeSetting(PINKY_KEY_ADDR,pinkySetting); break; case BTN_UP: // up @@ -2793,7 +2755,7 @@ void menu() { cursorNow = BLACK; display.display(); subPinky = 0; - if (readSetting(PINKY_KEY_ADDR) != pinkySetting) writeSetting(PINKY_KEY_ADDR,pinkySetting); + writeSetting(PINKY_KEY_ADDR,pinkySetting); break; } } @@ -2876,7 +2838,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibrato = 0; - if (readSetting(VIBRATO_ADDR) != vibrato) writeSetting(VIBRATO_ADDR,vibrato); + writeSetting(VIBRATO_ADDR,vibrato); break; case BTN_UP: // up @@ -2895,7 +2857,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibrato = 0; - if (readSetting(VIBRATO_ADDR) != vibrato) writeSetting(VIBRATO_ADDR,vibrato); + writeSetting(VIBRATO_ADDR,vibrato); break; } } @@ -2925,7 +2887,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibSens = 0; - if (readSetting(VIB_SENS_ADDR) != vibSens) writeSetting(VIB_SENS_ADDR,vibSens); + writeSetting(VIB_SENS_ADDR,vibSens); break; case BTN_UP: // up @@ -2944,7 +2906,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibSens = 0; - if (readSetting(VIB_SENS_ADDR) != vibSens) writeSetting(VIB_SENS_ADDR,vibSens); + writeSetting(VIB_SENS_ADDR,vibSens); break; } } @@ -2974,7 +2936,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibRetn = 0; - if (readSetting(VIB_RETN_ADDR) != vibRetn) writeSetting(VIB_RETN_ADDR,vibRetn); + writeSetting(VIB_RETN_ADDR,vibRetn); break; case BTN_UP: // up @@ -2993,7 +2955,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibRetn = 0; - if (readSetting(VIB_RETN_ADDR) != vibRetn) writeSetting(VIB_RETN_ADDR,vibRetn); + writeSetting(VIB_RETN_ADDR,vibRetn); break; } } @@ -3023,7 +2985,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibSquelch = 0; - if (readSetting(VIB_SQUELCH_ADDR) != vibSquelch) writeSetting(VIB_SQUELCH_ADDR,vibSquelch); + writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; case BTN_UP: // up @@ -3042,7 +3004,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibSquelch = 0; - if (readSetting(VIB_SQUELCH_ADDR) != vibSquelch) writeSetting(VIB_SQUELCH_ADDR,vibSquelch); + writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; } } @@ -3070,7 +3032,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibDirection = 0; - if (readSetting(VIB_DIRECTION_ADDR) != vibDirection) writeSetting(VIB_DIRECTION_ADDR,vibDirection); + writeSetting(VIB_DIRECTION_ADDR,vibDirection); break; case BTN_UP: // up @@ -3087,7 +3049,7 @@ void menu() { cursorNow = BLACK; display.display(); subVibDirection = 0; - if (readSetting(VIB_DIRECTION_ADDR) != vibDirection) writeSetting(VIB_DIRECTION_ADDR,vibDirection); + writeSetting(VIB_DIRECTION_ADDR,vibDirection); break; } } From 6a8e36635e835667dbc3991c0e1498b81c72847e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 15 Jun 2019 20:24:50 +0200 Subject: [PATCH 03/35] Avoid calling display.display() twice in an update. Moved functions around to have a better overview of draw function. This will make it easier for me to continue with the next part, which probably will be a more generic handling of menus. --- NuEVI/menu.cpp | 631 +++++++++++++++++++++---------------------------- 1 file changed, 263 insertions(+), 368 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index d1fd71e..7803033 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -10,9 +10,6 @@ #include #include "settings.h" -#include "numenu.h" - - #define BTN_DOWN 1 #define BTN_ENTER 2 #define BTN_UP 4 @@ -250,7 +247,6 @@ void drawAdjustScreen(const char* title, int threshold, int maxValue, uint16_t l pos2 = map(maxValue, lowLimit, highLimit, 27, 119); display.drawLine(pos2,50,pos2,56,WHITE); } - display.display(); } void drawMenuCursor(byte itemNo, byte color){ @@ -385,24 +381,19 @@ static void drawSubBox(const char* label) } static void plotTranspose(int color){ + int value = transpose - 12; + const char *sign = (value < 0) ? "-":"+"; display.setTextColor(color); display.setTextSize(2); display.setCursor(80,33); - if ((transpose-12) > -1){ - display.println("+"); - display.setCursor(93,33); - display.println(transpose-12); - } else { - display.println("-"); - display.setCursor(93,33); - display.println(abs(transpose-12)); - } + display.println(sign); + display.setCursor(93,33); + display.println(abs(value)); } static void drawSubTranspose(){ drawSubBox("TRANSPOSE"); plotTranspose(WHITE); - display.display(); } @@ -421,12 +412,6 @@ static void plotRotator(int color,int value){ } } -static void drawSubRotator(){ - drawSubBox("SEMITONES"); - //plotRotator(WHITE,value); - forceRedraw = 1; - display.display(); -} static void plotPriority(int color){ display.setTextColor(color); @@ -439,12 +424,6 @@ static void plotPriority(int color){ } } -static void drawSubPriority(){ - drawSubBox("MONO PRIO"); - plotPriority(WHITE); - display.display(); -} - static void plotOctave(int color){ display.setTextColor(color); @@ -461,12 +440,6 @@ static void plotOctave(int color){ } } -static void drawSubOctave(){ - drawSubBox("OCTAVE"); - plotOctave(WHITE); - display.display(); -} - static void plotMIDI(int color){ display.setTextColor(color); display.setTextSize(2); @@ -482,11 +455,6 @@ static void plotMIDI(int color){ display.print("S"); } -static void drawSubMIDI(){ - drawSubBox("MIDI CHNL"); - plotMIDI(WHITE); - display.display(); -} static void plotSubOption(const char* label, int color) @@ -505,11 +473,6 @@ static void plotBreathCC(int color){ plotSubOption(breathCCMenuLabels[breathCC], color); } -static void drawSubBreathCC(){ - drawSubBox("BREATH CC"); - plotBreathCC(WHITE); - display.display(); -} static void plotBreathAT(int color){ if (breathAT){ @@ -519,12 +482,6 @@ static void plotBreathAT(int color){ } } -static void drawSubBreathAT(){ - drawSubBox("BREATH AT"); - plotBreathAT(WHITE); - display.display(); -} - static void plotVelocity(int color){ if (velocity){ @@ -537,27 +494,15 @@ static void plotVelocity(int color){ } } -static void drawSubVelocity(){ - drawSubBox("VELOCITY"); - plotVelocity(WHITE); - display.display(); -} - - static const char* curveMenuLabels[] = {"-4", "-3", "-2", "-1", "LIN", "+1", "+2", "+3", "+4", "S1", "S2", "Z1", "Z2" }; + static void plotCurve(int color){ // Assumes curve is in rage 0..12 plotSubOption(curveMenuLabels[curve], color); } -static void drawSubCurve(){ - drawSubBox("CURVE"); - plotCurve(WHITE); - display.display(); -} - static void plotPort(int color){ if (portamento == 1){ plotSubOption("ON", color); @@ -568,13 +513,6 @@ static void plotPort(int color){ } } -static void drawSubPort(){ - drawSubBox("PORT/GLD"); - plotPort(WHITE); - display.display(); -} - - static void plotPB(int color){ display.setTextColor(color); display.setTextSize(2); @@ -588,25 +526,12 @@ static void plotPB(int color){ } } -static void drawSubPB(){ - drawSubBox("PITCHBEND"); - plotPB(WHITE); - display.display(); -} - static const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" }; static void plotExtra(int color){ plotSubOption(extraMenuLabels[extraCT], color); } -static void drawSubExtra(){ - drawSubBox("EXTRA CTR"); - plotExtra(WHITE); - display.display(); -} - - static void plotVibrato(int color){ display.setTextColor(color); display.setTextSize(2); @@ -619,12 +544,6 @@ static void plotVibrato(int color){ } } -static void drawSubVibrato(){ - drawSubBox("LEVEL"); - plotVibrato(WHITE); - display.display(); -} - static void plotVibSens(int color){ display.setTextColor(color); display.setTextSize(2); @@ -632,12 +551,6 @@ static void plotVibSens(int color){ display.println(vibSens); } -static void drawSubVibSens(){ - drawSubBox("LEVEL"); - plotVibSens(WHITE); - display.display(); -} - static void plotVibRetn(int color){ display.setTextColor(color); display.setTextSize(2); @@ -645,13 +558,6 @@ static void plotVibRetn(int color){ display.println(vibRetn); } -static void drawSubVibRetn(){ - drawSubBox("LEVEL"); - plotVibRetn(WHITE); - display.display(); -} - - static void plotVibSquelch(int color){ display.setTextColor(color); display.setTextSize(2); @@ -659,28 +565,14 @@ static void plotVibSquelch(int color){ display.println(vibSquelch); } -static void drawSubVibSquelch(){ - drawSubBox("LEVEL"); - plotVibSquelch(WHITE); - display.display(); -} - - - - static void plotVibDirection(int color){ if (DNWD == vibDirection){ plotSubOption("NRM", color); } else { - plotSubOption("NRM", color); + plotSubOption("REV", color); } } -static void drawSubVibDirection(){ - drawSubBox("DIRECTION"); - plotVibDirection(WHITE); - display.display(); -} static void plotDeglitch(int color){ display.setTextColor(color); @@ -696,12 +588,6 @@ static void plotDeglitch(int color){ } } -static void drawSubDeglitch(){ - drawSubBox("DEGLITCH"); - plotDeglitch(WHITE); - display.display(); -} - static void plotPinkyKey(int color){ display.setTextColor(color); @@ -717,16 +603,11 @@ static void plotPinkyKey(int color){ } } -static void drawSubPinkyKey(){ - drawSubBox("PINKY KEY"); - plotPinkyKey(WHITE); - display.display(); -} static void plotVelSmpDl(int color){ display.setTextColor(color); - display.setTextSize(2); display.setCursor(79,33); + display.setTextSize(2); if (velSmpDl){ display.println(velSmpDl); display.setCursor(105,40); @@ -737,13 +618,6 @@ static void plotVelSmpDl(int color){ } } -static void drawSubVelSmpDl(){ - drawSubBox("VEL DELAY"); - plotVelSmpDl(WHITE); - display.display(); -} - - static void plotVelBias(int color){ display.setTextColor(color); display.setTextSize(2); @@ -756,12 +630,112 @@ static void plotVelBias(int color){ } } + + +static void drawSubRotator(){ + drawSubBox("SEMITONES"); + //plotRotator(WHITE,value); + forceRedraw = 1; +} + + +static void drawSubVelSmpDl(){ + drawSubBox("VEL DELAY"); + plotVelSmpDl(WHITE); +} + +static void drawSubPriority(){ + drawSubBox("MONO PRIO"); + plotPriority(WHITE); +} + +static void drawSubOctave(){ + drawSubBox("OCTAVE"); + plotOctave(WHITE); +} + +static void drawSubMIDI(){ + drawSubBox("MIDI CHNL"); + plotMIDI(WHITE); +} + +static void drawSubBreathCC(){ + drawSubBox("BREATH CC"); + plotBreathCC(WHITE); +} + +static void drawSubBreathAT(){ + drawSubBox("BREATH AT"); + plotBreathAT(WHITE); +} + +static void drawSubVelocity(){ + drawSubBox("VELOCITY"); + plotVelocity(WHITE); +} + +static void drawSubCurve(){ + drawSubBox("CURVE"); + plotCurve(WHITE); +} + +static void drawSubPort(){ + drawSubBox("PORT/GLD"); + plotPort(WHITE); +} + +static void drawSubPB(){ + drawSubBox("PITCHBEND"); + plotPB(WHITE); +} + static void drawSubVelBias(){ drawSubBox("VEL BIAS"); plotVelBias(WHITE); - display.display(); } +static void drawSubVibSquelch(){ + drawSubBox("LEVEL"); + plotVibSquelch(WHITE); +} + +static void drawSubVibDirection(){ + drawSubBox("DIRECTION"); + plotVibDirection(WHITE); +} + +static void drawSubExtra(){ + drawSubBox("EXTRA CTR"); + plotExtra(WHITE); +} + +static void drawSubVibrato(){ + drawSubBox("LEVEL"); + plotVibrato(WHITE); +} + +static void drawSubVibSens(){ + drawSubBox("LEVEL"); + plotVibSens(WHITE); +} + +static void drawSubVibRetn(){ + drawSubBox("LEVEL"); + plotVibRetn(WHITE); +} + +static void drawSubDeglitch(){ + drawSubBox("DEGLITCH"); + plotDeglitch(WHITE); +} + +static void drawSubPinkyKey(){ + drawSubBox("PINKY KEY"); + plotPinkyKey(WHITE); +} + + + static void drawSetupBrMenuScreen(){ drawMenu("SETUP BREATH", -1, 6, "BREATH CC", "BREATH AT", "VELOCITY", "CURVE", "VEL DELAY", "VEL BIAS"); } @@ -877,26 +851,26 @@ static void clearFPS(int trills) { FPD = 3; } -static void selectMainMenu(){ +static bool selectMainMenu(){ cursorBlinkTime = millis(); switch (mainMenuCursor){ case 1: subTranspose = 1; drawMenuCursor(mainMenuCursor, WHITE); - display.display(); drawSubTranspose(); + return true; break; case 2: subOctave = 1; drawMenuCursor(mainMenuCursor, WHITE); - display.display(); drawSubOctave(); + return true; break; case 3: subMIDI = 1; drawMenuCursor(mainMenuCursor, WHITE); - display.display(); drawSubMIDI(); + return true; break; case 4: state = BREATH_ADJ_IDL; @@ -912,6 +886,7 @@ static void selectMainMenu(){ stateFirstRun = 1; break; } + return false; } static void selectRotatorMenu(){ @@ -975,12 +950,13 @@ static void selectSetupBrMenu(){ drawSubVelBias(); break; } + display.display(); } static void selectSetupCtMenu(){ drawMenuCursor(setupCtMenuCursor, WHITE); cursorBlinkTime = millis(); - + bool redraw = true; switch (setupCtMenuCursor){ case 1: subPort = 1; @@ -999,6 +975,7 @@ static void selectSetupCtMenu(){ //drawSubVibrato(); state = VIBRATO_MENU; stateFirstRun = 1; + redraw = false; break; case 5: subDeglitch = 1; @@ -1008,6 +985,8 @@ static void selectSetupCtMenu(){ subPinky = 1; drawSubPinkyKey(); } + if(redraw) + display.display(); } static void selectVibratoMenu(){ @@ -1065,31 +1044,32 @@ bool drawAdjustBar(uint16_t buttons, int row, uint16_t *valPtr, uint16_t minVal, return updated; } -void updateAdjustCursor(uint32_t timeNow){ - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawAdjCursor(cursorNow); - display.display(); - cursorBlinkTime = timeNow; - } +static bool updateAdjustCursor(uint32_t timeNow){ + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; + drawAdjCursor(cursorNow); + cursorBlinkTime = timeNow; + return true; + } + return false; } -static void updateAdjustLineCursor(uint32_t timeNow, uint16_t hPos, uint16_t vPos ) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(hPos, vPos,hPos, vPos+6, cursorNow);; - display.display(); - cursorBlinkTime = timeNow; - } +static bool updateAdjustLineCursor(uint32_t timeNow, uint16_t hPos, uint16_t vPos ) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; + display.drawLine(hPos, vPos,hPos, vPos+6, cursorNow);; + cursorBlinkTime = timeNow; + return true; + } + return false; } void menu() { unsigned long timeNow = millis(); + bool redraw = false; // read the state of the switches uint8_t deumButtons = 0x0f ^(digitalRead(dPin) | (digitalRead(ePin) << 1) | (digitalRead(uPin) << 2) | (digitalRead(mPin)<<3)); - // mainMenu.update(deumButtons); - // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: @@ -1108,7 +1088,6 @@ void menu() { if (deumButtons != deumButtonState) { deumButtonState = deumButtons; menuTime = timeNow; - Serial.println(deumButtonState); buttonPressedAndNotUsed = 1; buttonPressedTime = timeNow; } @@ -1148,7 +1127,9 @@ void menu() { subVibDirection = 0; } - + if (stateFirstRun) { + redraw = true; + } if (state == DISPLAYOFF_IDL){ if (stateFirstRun) { @@ -1321,7 +1302,7 @@ void menu() { display.println("DON'T"); display.setCursor(35,30); display.println("PANIC"); - display.display(); + redraw = true; patchViewTime = timeNow; break; case 15: @@ -1338,7 +1319,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotTranspose(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1350,7 +1331,7 @@ void menu() { transpose--; plotTranspose(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1358,7 +1339,7 @@ void menu() { // enter plotTranspose(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subTranspose = 0; writeSetting(TRANSP_ADDR,transpose); break; @@ -1369,7 +1350,7 @@ void menu() { transpose++; plotTranspose(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1377,7 +1358,7 @@ void menu() { // menu plotTranspose(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subTranspose = 0; writeSetting(TRANSP_ADDR,transpose); break; @@ -1495,7 +1476,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(mainMenuCursor, cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1509,12 +1490,12 @@ void menu() { drawMenuCursor(mainMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_ENTER: // enter - selectMainMenu(); + redraw |= selectMainMenu(); break; case BTN_UP: // up @@ -1524,7 +1505,7 @@ void menu() { drawMenuCursor(mainMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_MENU: @@ -1569,7 +1550,7 @@ void menu() { cursorNow = WHITE; } plotRotator(cursorNow,parallel); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1581,7 +1562,7 @@ void menu() { parallel--; plotRotator(WHITE,parallel); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1589,7 +1570,7 @@ void menu() { // enter plotRotator(WHITE,parallel); cursorNow = BLACK; - display.display(); + redraw = true; subParallel = 0; writeSetting(PARAL_ADDR,(parallel + 24)); break; @@ -1600,7 +1581,7 @@ void menu() { parallel++; plotRotator(WHITE,parallel); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1608,7 +1589,7 @@ void menu() { // menu plotRotator(WHITE,parallel); cursorNow = BLACK; - display.display(); + redraw = true; subParallel = 0; writeSetting(PARAL_ADDR,(parallel + 24)); break; @@ -1622,7 +1603,7 @@ void menu() { cursorNow = WHITE; } plotRotator(cursorNow,rotations[subRotator-1]); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1634,7 +1615,7 @@ void menu() { rotations[subRotator-1]--; plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1642,7 +1623,7 @@ void menu() { // enter plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; - display.display(); + redraw = true; writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); subRotator = 0; break; @@ -1653,7 +1634,7 @@ void menu() { rotations[subRotator-1]++; plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1661,7 +1642,7 @@ void menu() { // menu plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; - display.display(); + redraw = true; writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); subRotator = 0; break; @@ -1671,7 +1652,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPriority(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1680,16 +1661,10 @@ void menu() { case BTN_DOWN: plotPriority(BLACK); priority = !priority; - plotPriority(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter - plotPriority(WHITE); - cursorNow = BLACK; - display.display(); subPriority = 0; writeSetting(PRIO_ADDR,priority); break; @@ -1697,20 +1672,17 @@ void menu() { // up plotPriority(BLACK); priority = !priority; - plotPriority(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu - plotPriority(WHITE); - cursorNow = BLACK; - display.display(); subPriority = 0; writeSetting(PRIO_ADDR,priority); break; } + plotPriority(WHITE); + cursorNow = BLACK; + redraw = true; } } else { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { @@ -1730,12 +1702,13 @@ void menu() { drawMenuCursor(rotatorMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_ENTER: // enter selectRotatorMenu(); + redraw = true; break; case BTN_UP: // up @@ -1745,7 +1718,7 @@ void menu() { drawMenuCursor(rotatorMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_MENU: @@ -1771,7 +1744,6 @@ void menu() { state = PATCH_VIEW; stateFirstRun = 1; clearFPS(trills); - } break; } @@ -1784,7 +1756,7 @@ void menu() { forcePix = 1; stateFirstRun = 0; } - updateAdjustCursor(timeNow); + redraw |=updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1816,42 +1788,36 @@ void menu() { } } } else if (state == BREATH_ADJ_THR){ - updateAdjustLineCursor(timeNow, pos1, 20); + redraw |= updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ - drawAdjustBar(deumButtonState, 20, &breathThrVal, breathLoLimit, breathHiLimit, &pos1); + redraw |= drawAdjustBar(deumButtonState, 20, &breathThrVal, breathLoLimit, breathHiLimit, &pos1); cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_ENTER: state = BREATH_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; case BTN_MENU: state = BREATH_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; } } } else if (state == BREATH_ADJ_MAX){ - updateAdjustLineCursor(timeNow, pos2, 50); + redraw |= updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ - drawAdjustBar(deumButtonState, 50, &breathMaxVal, breathLoLimit, breathHiLimit, &pos2); + redraw |= drawAdjustBar(deumButtonState, 50, &breathMaxVal, breathLoLimit, breathHiLimit, &pos2); cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_ENTER: - // enter - state = BREATH_ADJ_IDL; - display.drawLine(pos2,50,pos2,56,WHITE); - display.display(); - break; case BTN_MENU: - // menu state = BREATH_ADJ_IDL; display.drawLine(pos2,50,pos2,56,WHITE); - display.display(); + redraw = true; break; } } @@ -1861,7 +1827,7 @@ void menu() { forcePix = 1; stateFirstRun = 0; } - updateAdjustCursor(timeNow); + redraw |= updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1893,10 +1859,10 @@ void menu() { } } } else if (state == PORTAM_ADJ_THR){ - updateAdjustLineCursor(timeNow, pos1, 20); + redraw |= updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; - drawAdjustBar(deumButtonState, 20, &portamThrVal, portamLoLimit, portamHiLimit, &pos1); + redraw |= drawAdjustBar(deumButtonState, 20, &portamThrVal, portamLoLimit, portamHiLimit, &pos1); cursorBlinkTime = timeNow; switch (deumButtonState){ @@ -1904,23 +1870,23 @@ void menu() { // enter state = PORTAM_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; case BTN_MENU: // menu state = PORTAM_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; } } } else if (state == PORTAM_ADJ_MAX){ - updateAdjustLineCursor(timeNow, pos2, 50); + redraw |= updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ // TODO: Ask Johan what the minOffset is for... // if ((portamMaxVal - portamStep) > (portamThrVal + minOffset)){ - drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); + redraw |= drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1928,7 +1894,7 @@ void menu() { case BTN_MENU: state = PORTAM_ADJ_IDL; display.drawLine(pos2,50,pos2,56,WHITE); - display.display(); + redraw = true; break; } } @@ -1939,7 +1905,7 @@ void menu() { forcePix = 1; stateFirstRun = 0; } - updateAdjustCursor(timeNow); + redraw |= updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1971,30 +1937,30 @@ void menu() { } } } else if (state == PITCHB_ADJ_THR){ - updateAdjustLineCursor(timeNow, pos1, 20); + redraw |= updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; cursorBlinkTime = timeNow; - drawAdjustBar(deumButtonState, 20, &pitchbThrVal, pitchbLoLimit, pitchbHiLimit, &pos1); + redraw |= drawAdjustBar(deumButtonState, 20, &pitchbThrVal, pitchbLoLimit, pitchbHiLimit, &pos1); switch (deumButtonState){ case BTN_ENTER: // enter state = PITCHB_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; case BTN_MENU: // menu state = PITCHB_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; } } } else if (state == PITCHB_ADJ_MAX){ - updateAdjustLineCursor(timeNow, pos2, 50); + redraw |= updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ - drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); + redraw |= drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2002,7 +1968,7 @@ void menu() { case BTN_MENU: state = PITCHB_ADJ_IDL; display.drawLine(pos2,50,pos2,56,WHITE); - display.display(); + redraw = true; break; } } @@ -2014,7 +1980,7 @@ void menu() { stateFirstRun = 0; } - updateAdjustCursor(timeNow); + redraw |= updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; @@ -2047,30 +2013,29 @@ void menu() { } } } else if (state == EXTRAC_ADJ_THR){ - updateAdjustLineCursor(timeNow, pos1, 20); + redraw |= updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ - drawAdjustBar(deumButtonState, 20, &extracThrVal, extracLoLimit, extracHiLimit, &pos1); - cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; + redraw |= drawAdjustBar(deumButtonState, 20, &extracThrVal, extracLoLimit, extracHiLimit, &pos1); switch (deumButtonState){ case BTN_ENTER: state = EXTRAC_ADJ_MAX; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; case BTN_MENU: state = EXTRAC_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; } } } else if (state == EXTRAC_ADJ_MAX){ - updateAdjustLineCursor(timeNow, pos2, 50); + redraw |= updateAdjustLineCursor(timeNow, pos2, 50); if (buttonPressedAndNotUsed){ - drawAdjustBar(deumButtonState, 50, &extracMaxVal, extracLoLimit, extracHiLimit, &pos2); + redraw |= drawAdjustBar(deumButtonState, 50, &extracMaxVal, extracLoLimit, extracHiLimit, &pos2); cursorBlinkTime = timeNow; buttonPressedAndNotUsed = 0; @@ -2079,7 +2044,7 @@ void menu() { case BTN_MENU: state = EXTRAC_ADJ_IDL; display.drawLine(pos2,50,pos2,56,WHITE); - display.display(); + redraw = true; break; } } @@ -2090,7 +2055,7 @@ void menu() { forcePix = 1; stateFirstRun = 0; } - updateAdjustCursor(timeNow); + redraw |= updateAdjustCursor(timeNow); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2119,20 +2084,22 @@ void menu() { } } } else if (state == CTOUCH_ADJ_THR){ - updateAdjustLineCursor(timeNow, pos1, 20); + redraw |= updateAdjustLineCursor(timeNow, pos1, 20); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; bool updated = drawAdjustBar(deumButtonState, 20, &ctouchThrVal, ctouchLoLimit, ctouchHiLimit, &pos1); - if(updated) + if(updated) { touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); + redraw = true; + } switch (deumButtonState){ case BTN_ENTER: case BTN_MENU: state = CTOUCH_ADJ_IDL; display.drawLine(pos1,20,pos1,26,WHITE); - display.display(); + redraw = true; break; } } @@ -2147,34 +2114,23 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotBreathCC(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: + plotBreathCC(BLACK); if (breathCC > 0){ - plotBreathCC(BLACK); breathCC--; - plotBreathCC(WHITE); - cursorNow = BLACK; - display.display(); - cursorBlinkTime = timeNow; } else { - plotBreathCC(BLACK); breathCC = 10; - plotBreathCC(WHITE); - cursorNow = BLACK; - display.display(); - cursorBlinkTime = timeNow; } + cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter - plotBreathCC(WHITE); - cursorNow = BLACK; - display.display(); subBreathCC = 0; if (readSetting(BREATH_CC_ADDR) != breathCC) { writeSetting(BREATH_CC_ADDR,breathCC); @@ -2183,27 +2139,16 @@ void menu() { break; case BTN_UP: // up + plotBreathCC(BLACK); if (breathCC < 10){ - plotBreathCC(BLACK); breathCC++; - plotBreathCC(WHITE); - cursorNow = BLACK; - display.display(); - cursorBlinkTime = timeNow; } else { - plotBreathCC(BLACK); breathCC = 0; - plotBreathCC(WHITE); - cursorNow = BLACK; - display.display(); - cursorBlinkTime = timeNow; } + cursorBlinkTime = timeNow; break; case BTN_MENU: // menu - plotBreathCC(WHITE); - cursorNow = BLACK; - display.display(); subBreathCC = 0; if (readSetting(BREATH_CC_ADDR) != breathCC) { writeSetting(BREATH_CC_ADDR,breathCC); @@ -2211,12 +2156,15 @@ void menu() { } break; } + plotBreathCC(WHITE); + cursorNow = BLACK; + redraw = true; } } else if (subBreathAT) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotBreathAT(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2225,16 +2173,10 @@ void menu() { case BTN_DOWN: plotBreathAT(BLACK); breathAT=!breathAT; - plotBreathAT(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter - plotBreathAT(WHITE); - cursorNow = BLACK; - display.display(); subBreathAT = 0; if (readSetting(BREATH_AT_ADDR) != breathAT){ writeSetting(BREATH_AT_ADDR,breathAT); @@ -2245,16 +2187,10 @@ void menu() { // up plotBreathAT(BLACK); breathAT=!breathAT; - plotBreathAT(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu - plotBreathAT(WHITE); - cursorNow = BLACK; - display.display(); subBreathAT = 0; if (readSetting(BREATH_AT_ADDR) != breathAT){ writeSetting(BREATH_AT_ADDR,breathAT); @@ -2262,12 +2198,15 @@ void menu() { } break; } + plotBreathAT(WHITE); + cursorNow = BLACK; + redraw = true; } } else if (subVelocity) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVelocity(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2278,47 +2217,34 @@ void menu() { if (velocity > 0){ velocity--; } else velocity = 127; - plotVelocity(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: - // enter - plotVelocity(WHITE); - cursorNow = BLACK; - display.display(); subVelocity = 0; writeSetting(VELOCITY_ADDR,velocity); break; case BTN_UP: - // up plotVelocity(BLACK); if (velocity < 127){ velocity++; } else velocity = 0; - plotVelocity(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: - // menu - plotVelocity(WHITE); - cursorNow = BLACK; - display.display(); subVelocity = 0; writeSetting(VELOCITY_ADDR,velocity); break; } + plotVelocity(WHITE); + cursorNow = BLACK; + redraw = true; } - } else if (subCurve) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotCurve(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2330,15 +2256,11 @@ void menu() { curve--; } else curve = 12; plotCurve(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter plotCurve(WHITE); - cursorNow = BLACK; - display.display(); subCurve = 0; writeSetting(BREATHCURVE_ADDR,curve); break; @@ -2349,26 +2271,24 @@ void menu() { curve++; } else curve = 0; plotCurve(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu plotCurve(WHITE); - cursorNow = BLACK; - display.display(); subCurve = 0; writeSetting(BREATHCURVE_ADDR,curve); break; } + cursorNow = BLACK; + redraw = true; } } else if (subVelSmpDl) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVelSmpDl(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2380,15 +2300,11 @@ void menu() { velSmpDl-=1; } else velSmpDl = 30; plotVelSmpDl(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter plotVelSmpDl(WHITE); - cursorNow = BLACK; - display.display(); subVelSmpDl = 0; writeSetting(VEL_SMP_DL_ADDR,velSmpDl); break; @@ -2399,26 +2315,24 @@ void menu() { velSmpDl+=1; } else velSmpDl = 0; plotVelSmpDl(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu plotVelSmpDl(WHITE); - cursorNow = BLACK; - display.display(); subVelSmpDl = 0; writeSetting(VEL_SMP_DL_ADDR,velSmpDl); break; } + cursorNow = BLACK; + redraw = true; } } else if (subVelBias) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVelBias(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2430,15 +2344,11 @@ void menu() { velBias--; } else velBias = 9; plotVelBias(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter plotVelBias(WHITE); - cursorNow = BLACK; - display.display(); subVelBias = 0; writeSetting(VEL_BIAS_ADDR,velBias); break; @@ -2449,26 +2359,24 @@ void menu() { velBias++; } else velBias = 0; plotVelBias(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu plotVelBias(WHITE); - cursorNow = BLACK; - display.display(); subVelBias = 0; writeSetting(VEL_BIAS_ADDR,velBias); break; } + cursorNow = BLACK; + redraw = true; } } else { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(setupBrMenuCursor, cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2481,7 +2389,7 @@ void menu() { drawMenuCursor(setupBrMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_ENTER: @@ -2496,7 +2404,7 @@ void menu() { drawMenuCursor(setupBrMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_MENU: @@ -2518,7 +2426,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPort(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2530,15 +2438,11 @@ void menu() { portamento--; } else portamento = 2; plotPort(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter plotPort(WHITE); - cursorNow = BLACK; - display.display(); subPort = 0; writeSetting(PORTAM_ADDR,portamento); break; @@ -2549,19 +2453,17 @@ void menu() { portamento++; } else portamento = 0; plotPort(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu plotPort(WHITE); - cursorNow = BLACK; - display.display(); subPort = 0; writeSetting(PORTAM_ADDR,portamento); break; } + cursorNow = BLACK; + redraw = true; } } else if (subPB) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { @@ -2828,7 +2730,7 @@ void menu() { vibrato--; plotVibrato(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -2836,7 +2738,7 @@ void menu() { // enter plotVibrato(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subVibrato = 0; writeSetting(VIBRATO_ADDR,vibrato); break; @@ -2847,7 +2749,7 @@ void menu() { vibrato++; plotVibrato(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -2855,7 +2757,7 @@ void menu() { // menu plotVibrato(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subVibrato = 0; writeSetting(VIBRATO_ADDR,vibrato); break; @@ -2865,7 +2767,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibSens(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2877,7 +2779,7 @@ void menu() { vibSens--; plotVibSens(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -2885,7 +2787,7 @@ void menu() { // enter plotVibSens(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subVibSens = 0; writeSetting(VIB_SENS_ADDR,vibSens); break; @@ -2896,7 +2798,7 @@ void menu() { vibSens++; plotVibSens(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -2904,7 +2806,7 @@ void menu() { // menu plotVibSens(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subVibSens = 0; writeSetting(VIB_SENS_ADDR,vibSens); break; @@ -2914,7 +2816,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibRetn(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2926,15 +2828,11 @@ void menu() { vibRetn--; } plotVibRetn(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter plotVibRetn(WHITE); - cursorNow = BLACK; - display.display(); subVibRetn = 0; writeSetting(VIB_RETN_ADDR,vibRetn); break; @@ -2945,25 +2843,23 @@ void menu() { vibRetn++; } plotVibRetn(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu plotVibRetn(WHITE); - cursorNow = BLACK; - display.display(); subVibRetn = 0; writeSetting(VIB_RETN_ADDR,vibRetn); break; } + cursorNow = BLACK; + redraw = true; } } else if (subVibSquelch) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibSquelch(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2975,7 +2871,7 @@ void menu() { vibSquelch--; plotVibSquelch(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -2983,7 +2879,7 @@ void menu() { // enter plotVibSquelch(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subVibSquelch = 0; writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; @@ -2994,7 +2890,7 @@ void menu() { vibSquelch++; plotVibSquelch(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -3002,7 +2898,7 @@ void menu() { // menu plotVibSquelch(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subVibSquelch = 0; writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; @@ -3012,7 +2908,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibDirection(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -3022,15 +2918,11 @@ void menu() { plotVibDirection(BLACK); vibDirection = !vibDirection; plotVibDirection(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_ENTER: // enter plotVibDirection(WHITE); - cursorNow = BLACK; - display.display(); subVibDirection = 0; writeSetting(VIB_DIRECTION_ADDR,vibDirection); break; @@ -3039,25 +2931,23 @@ void menu() { plotVibDirection(BLACK); vibDirection = !vibDirection; plotVibDirection(WHITE); - cursorNow = BLACK; - display.display(); cursorBlinkTime = timeNow; break; case BTN_MENU: // menu plotVibDirection(WHITE); - cursorNow = BLACK; - display.display(); subVibDirection = 0; writeSetting(VIB_DIRECTION_ADDR,vibDirection); break; } + cursorNow = BLACK; + redraw = true; } } else { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(vibratoMenuCursor, cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -3070,12 +2960,13 @@ void menu() { drawMenuCursor(vibratoMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_ENTER: // enter selectVibratoMenu(); + redraw = true; break; case BTN_UP: // up @@ -3085,7 +2976,7 @@ void menu() { drawMenuCursor(vibratoMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_MENU: @@ -3097,4 +2988,8 @@ void menu() { } } } + + if(redraw) { + display.display(); + } } From 9a0bb369acb395f6ec5f28015316000cb4758632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 16 Jun 2019 01:42:25 +0200 Subject: [PATCH 04/35] Menu selection is now data driven Some major refactoring has been going on. Added simple structs of data containing info about what action to take when a menu item is selected. Finally removed all but one call to display.display() in menu-function. There might still be more than one call to it on a frame though, since some functions still calls it internally. --- NuEVI/menu.cpp | 622 +++++++++++++++++++---------------------------- NuEVI/numenu.cpp | 78 ------ 2 files changed, 253 insertions(+), 447 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 7803033..ab9d885 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -22,11 +22,11 @@ static uint8_t lastDeumButtons = 0; static uint8_t deumButtonState = 0; static byte buttonPressedAndNotUsed = 0; -static byte mainMenuCursor = 1; -static byte setupBrMenuCursor = 1; -static byte setupCtMenuCursor = 1; -static byte rotatorMenuCursor = 1; -static byte vibratoMenuCursor = 1; +static byte mainMenuCursor = 0; +static byte setupBrMenuCursor = 0; +static byte setupCtMenuCursor = 0; +static byte rotatorMenuCursor = 0; +static byte vibratoMenuCursor = 0; static byte cursorNow; @@ -250,8 +250,8 @@ void drawAdjustScreen(const char* title, int threshold, int maxValue, uint16_t l } void drawMenuCursor(byte itemNo, byte color){ - byte xmid = 6 + 9 * itemNo; - display.drawTriangle(57,xmid,61,xmid+2,61,xmid-2,color); + byte ymid = 15 + 9 * itemNo; + display.drawTriangle(57, ymid,61, ymid+2,61, ymid-2, color); } @@ -262,7 +262,7 @@ void drawMenuCursor(byte itemNo, byte color){ * nItems - number of menu items * ... - a list (nItems long) of text items to show */ -static void drawMenu(const char* header, byte selected, byte nItems, ...) { +static void drawMenu(const char* header, byte nItems, ...) { va_list valist; //Initialize display and draw menu header + line @@ -281,8 +281,6 @@ static void drawMenu(const char* header, byte selected, byte nItems, ...) { display.println(lineText); } - drawMenuCursor(selected, WHITE); - va_end(valist); display.display(); @@ -306,7 +304,7 @@ void drawMenuScreen(){ splice2[2] = (voltage%10)+'0'; } - drawMenu(menuTitle, mainMenuCursor, 6, + drawMenu(menuTitle, 6, "TRANSPOSE", "OCTAVE", "MIDI CH", @@ -316,7 +314,7 @@ void drawMenuScreen(){ } static void drawRotatorMenuScreen(){ - drawMenu("ROTATOR SETUP", rotatorMenuCursor, 6, + drawMenu("ROTATOR SETUP", 6, "PARALLEL", "ROTATE 1", "ROTATE 2", @@ -630,8 +628,6 @@ static void plotVelBias(int color){ } } - - static void drawSubRotator(){ drawSubBox("SEMITONES"); //plotRotator(WHITE,value); @@ -737,15 +733,15 @@ static void drawSubPinkyKey(){ static void drawSetupBrMenuScreen(){ - drawMenu("SETUP BREATH", -1, 6, "BREATH CC", "BREATH AT", "VELOCITY", "CURVE", "VEL DELAY", "VEL BIAS"); + drawMenu("SETUP BREATH", 6, "BREATH CC", "BREATH AT", "VELOCITY", "CURVE", "VEL DELAY", "VEL BIAS"); } static void drawSetupCtMenuScreen(){ - drawMenu("SETUP CTRLS", -1, 6, "PORT/GLD", "PITCHBEND", "EXTRA CTR", "VIBRATO", "DEGLITCH", "PINKY KEY"); + drawMenu("SETUP CTRLS", 6, "PORT/GLD", "PITCHBEND", "EXTRA CTR", "VIBRATO", "DEGLITCH", "PINKY KEY"); } static void drawVibratoMenuScreen(){ - drawMenu("VIBRATO", -1, 5, "DEPTH","SENSE","RETURN", "SQUELCH", "DIRECTION"); + drawMenu("VIBRATO", 5, "DEPTH","SENSE","RETURN", "SQUELCH", "DIRECTION"); } static int sensorPixelPos1 = -1; @@ -763,7 +759,7 @@ bool updateSensorPixel(int pos, int pos2) { } void drawSensorPixels(){ - int redraw=0; + int redraw = 0; if(forcePix) sensorPixelPos1 = -1; @@ -837,9 +833,9 @@ static int readTrills() { //*********************************************************** -static void setFPS(int trills) { - fastPatch[trills-1] = patch; - writeSetting(FP1_ADDR+2*(trills-1),patch); +static void setFPS(int trills, uint16_t patchNum) { + fastPatch[trills-1] = patchNum; + writeSetting(FP1_ADDR+2*(trills-1), patchNum); FPD = 2; } @@ -851,172 +847,190 @@ static void clearFPS(int trills) { FPD = 3; } -static bool selectMainMenu(){ - cursorBlinkTime = millis(); - switch (mainMenuCursor){ - case 1: - subTranspose = 1; - drawMenuCursor(mainMenuCursor, WHITE); - drawSubTranspose(); +//*********************************************************** + +enum MenuType { + ESub, + ESubRotator, + EStateChange, +}; + +struct MenuEntry { + enum MenuType type; +}; + +struct MenuEntrySub { + enum MenuType type; + byte* flag; + void (*subMenuFunc)(void); +}; + +struct MenuEntrySubRotator { + enum MenuType type; + byte flagValue; + byte* flag; + void (*subMenuFunc)(void); +}; + +struct MenuEntryStateCh { + enum MenuType type; + byte state; +}; + +//*********************************************************** + +static bool ExecuteMenuSelection(int cursorPosition, const struct MenuEntry *menuEntry) +{ + switch(menuEntry->type) { + case MenuType::ESub: + *((const MenuEntrySub*)menuEntry)->flag = 1; + drawMenuCursor(cursorPosition, WHITE); + ((const MenuEntrySub*)menuEntry)->subMenuFunc(); return true; - break; - case 2: - subOctave = 1; - drawMenuCursor(mainMenuCursor, WHITE); - drawSubOctave(); - return true; - break; - case 3: - subMIDI = 1; - drawMenuCursor(mainMenuCursor, WHITE); - drawSubMIDI(); - return true; - break; - case 4: - state = BREATH_ADJ_IDL; - sensorPixelPos1 = -1; + + case MenuType::EStateChange: + state = ((const MenuEntryStateCh*)menuEntry)->state; stateFirstRun = 1; break; - case 5: - state = SETUP_BR_MENU; - stateFirstRun = 1; - break; - case 6: - state = SETUP_CT_MENU; - stateFirstRun = 1; + + case MenuType::ESubRotator: + *((const MenuEntrySubRotator*)menuEntry)->flag = ((const MenuEntrySubRotator*)menuEntry)->flagValue; + drawMenuCursor(cursorPosition, WHITE); + ((const MenuEntrySub*)menuEntry)->subMenuFunc(); break; } + return false; } -static void selectRotatorMenu(){ - drawMenuCursor(rotatorMenuCursor, WHITE); - cursorBlinkTime = millis(); +//*********************************************************** - switch (rotatorMenuCursor){ - case 1: - subParallel = 1; - drawSubRotator(); - break; - case 2: - subRotator = 1; - drawSubRotator(); - break; - case 3: - subRotator = 2; - drawSubRotator(); - break; - case 4: - subRotator = 3; - drawSubRotator(); - break; - case 5: - subRotator = 4; - drawSubRotator(); - break; - case 6: - subPriority = 1; - drawSubPriority(); - break; - } +const MenuEntrySub transposeMenu = { MenuType::ESub, &subTranspose, drawSubTranspose }; +const MenuEntrySub octaveMenu = { MenuType::ESub, &subOctave, drawSubOctave }; +const MenuEntrySub midiMenu = { MenuType::ESub, &subMIDI, drawSubMIDI }; +const MenuEntryStateCh adjustMenu = { MenuType::EStateChange, BREATH_ADJ_IDL }; +const MenuEntryStateCh breathMenu = { MenuType::EStateChange, SETUP_BR_MENU }; +const MenuEntryStateCh controlMenu = { MenuType::EStateChange, SETUP_CT_MENU }; + +const MenuEntry* MainMenuEntries[] = { + (MenuEntry*)&transposeMenu, + (MenuEntry*)&octaveMenu, + (MenuEntry*)&midiMenu, + (MenuEntry*)&adjustMenu, + (MenuEntry*)&breathMenu, + (MenuEntry*)&controlMenu +}; + +static bool selectMainMenu(int cursorPosition){ + cursorBlinkTime = millis(); + const struct MenuEntry* entry = MainMenuEntries[cursorPosition]; + return ExecuteMenuSelection( cursorPosition, entry ); } -static void selectSetupBrMenu(){ - drawMenuCursor(setupBrMenuCursor, WHITE); +//*********************************************************** +// Rotator menu +const MenuEntrySub rotatorParaMenu = { MenuType::ESub, &subParallel, drawSubRotator }; +const MenuEntrySubRotator rotator1Menu = { MenuType::ESubRotator, 1, &subRotator, drawSubRotator }; +const MenuEntrySubRotator rotator2Menu = { MenuType::ESubRotator, 2, &subRotator, drawSubRotator }; +const MenuEntrySubRotator rotator3Menu = { MenuType::ESubRotator, 3, &subRotator, drawSubRotator }; +const MenuEntrySubRotator rotator4Menu = { MenuType::ESubRotator, 4, &subRotator, drawSubRotator }; +const MenuEntrySub rotatorPrioMenu = { MenuType::ESub, &subPriority, drawSubPriority }; + +const MenuEntry* rotatorMenuEntries[] = { + (MenuEntry*)&rotatorParaMenu, + (MenuEntry*)&rotator1Menu, + (MenuEntry*)&rotator2Menu, + (MenuEntry*)&rotator3Menu, + (MenuEntry*)&rotator4Menu, + (MenuEntry*)&rotatorPrioMenu +}; +//*********************************************************** + +static bool selectRotatorMenu(int cursorPosition){ cursorBlinkTime = millis(); - switch (setupBrMenuCursor){ - case 1: - subBreathCC = 1; - drawSubBreathCC(); - break; - case 2: - subBreathAT = 1; - drawSubBreathAT(); - break; - case 3: - subVelocity = 1; - drawSubVelocity(); - break; - case 4: - subCurve = 1; - drawSubCurve(); - break; - case 5: - subVelSmpDl = 1; - drawSubVelSmpDl(); - break; - case 6: - subVelBias = 1; - drawSubVelBias(); - break; - } - display.display(); + const MenuEntry* entry = rotatorMenuEntries[cursorPosition]; + return ExecuteMenuSelection( cursorPosition, entry ); } -static void selectSetupCtMenu(){ - drawMenuCursor(setupCtMenuCursor, WHITE); +//*********************************************************** +// Breath menu +const MenuEntrySub breathCCMenu = { MenuType::ESub, &subBreathCC, drawSubBreathCC }; +const MenuEntrySub breathATMenu = { MenuType::ESub, &subBreathAT, drawSubBreathAT }; +const MenuEntrySub velocityMenu = { MenuType::ESub, &subVelocity, drawSubVelocity }; +const MenuEntrySub curveMenu = { MenuType::ESub, &subCurve, drawSubCurve }; +const MenuEntrySub velSmpDlMenu = { MenuType::ESub, &subVelSmpDl, drawSubVelSmpDl }; +const MenuEntrySub velBiasMenu = { MenuType::ESub, &subVelBias, drawSubVelBias }; + +const MenuEntry* breathMenuEntries[] = { + (MenuEntry*)&breathCCMenu, + (MenuEntry*)&breathATMenu, + (MenuEntry*)&velocityMenu, + (MenuEntry*)&curveMenu, + (MenuEntry*)&velSmpDlMenu, + (MenuEntry*)&velBiasMenu +}; +//*********************************************************** + +static bool selectSetupBrMenu(int cursorPosition) { cursorBlinkTime = millis(); - bool redraw = true; - switch (setupCtMenuCursor){ - case 1: - subPort = 1; - drawSubPort(); - break; - case 2: - subPB = 1; - drawSubPB(); - break; - case 3: - subExtra = 1; - drawSubExtra(); - break; - case 4: - //subVibrato = 1; - //drawSubVibrato(); - state = VIBRATO_MENU; - stateFirstRun = 1; - redraw = false; - break; - case 5: - subDeglitch = 1; - drawSubDeglitch(); - break; - case 6: - subPinky = 1; - drawSubPinkyKey(); - } - if(redraw) - display.display(); + const MenuEntry* entry = breathMenuEntries[cursorPosition]; + return ExecuteMenuSelection( cursorPosition, entry ); } -static void selectVibratoMenu(){ - drawMenuCursor(vibratoMenuCursor, WHITE); - cursorBlinkTime = millis(); +//*********************************************************** +// Breath menu +const MenuEntrySub portMenu = { MenuType::ESub, &subPort, drawSubPort }; +const MenuEntrySub pitchBendMenu = { MenuType::ESub, &subPB, drawSubPB }; +const MenuEntrySub extraMenu = { MenuType::ESub, &subExtra, drawSubExtra }; +const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, VIBRATO_MENU }; +const MenuEntrySub deglitchMenu = { MenuType::ESub, &subDeglitch, drawSubDeglitch }; +const MenuEntrySub pinkyMenu = { MenuType::ESub, &subPinky, drawSubPinkyKey }; - switch (vibratoMenuCursor){ - case 1: - subVibrato = 1; - drawSubVibrato(); - break; - case 2: - subVibSens = 1; - drawSubVibSens(); - break; - case 3: - subVibRetn = 1; - drawSubVibRetn(); - break; - case 4: - subVibSquelch = 1; - drawSubVibSquelch(); - break; - case 5: - subVibDirection = 1; - drawSubVibDirection(); - break; - } +const MenuEntry* controlMenuEntries[] = { + (MenuEntry*)&portMenu, + (MenuEntry*)&pitchBendMenu, + (MenuEntry*)&extraMenu, + (MenuEntry*)&vibratoSubMenu, + (MenuEntry*)°litchMenu, + (MenuEntry*)&pinkyMenu +}; + +//*********************************************************** + +static bool selectSetupCtMenu(int cursorPosition){ + cursorBlinkTime = millis(); + const MenuEntry* entry = controlMenuEntries[cursorPosition]; + return ExecuteMenuSelection( cursorPosition, entry ); } + +//*********************************************************** +// Vibrato menu +const MenuEntrySub vibDepthMenu = { MenuType::ESub, &subVibrato, drawSubVibrato }; +const MenuEntrySub vibSenseMenu = { MenuType::ESub, &subVibSens, drawSubVibSens }; +const MenuEntrySub vibRetnMenu = { MenuType::ESub, &subVibRetn, drawSubVibRetn }; +const MenuEntrySub vibSquelchMenu = { MenuType::ESub, &subVibSquelch, drawSubVibSquelch }; +const MenuEntrySub vibDirMenu = { MenuType::ESub, &subVibDirection, drawSubVibDirection }; + +const MenuEntry* vibratorMenuEntries[] = { + (MenuEntry*)&vibDepthMenu, + (MenuEntry*)&vibSenseMenu, + (MenuEntry*)&vibRetnMenu, + (MenuEntry*)&vibSquelchMenu, + (MenuEntry*)&vibDirMenu +}; + +static bool selectVibratoMenu(int cursorPosition){ + cursorBlinkTime = millis(); + const MenuEntry* entry = vibratorMenuEntries[cursorPosition]; + return ExecuteMenuSelection( cursorPosition, entry ); +} + + +//*********************************************************** + + + bool drawAdjustBar(uint16_t buttons, int row, uint16_t *valPtr, uint16_t minVal, uint16_t maxVal, uint16_t *pos) { bool updated = false; uint16_t step = (maxVal-minVal)/92; @@ -1335,14 +1349,6 @@ void menu() { cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotTranspose(WHITE); - cursorNow = BLACK; - redraw = true; - subTranspose = 0; - writeSetting(TRANSP_ADDR,transpose); - break; case BTN_UP: // up if (transpose < 24){ @@ -1354,6 +1360,7 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotTranspose(WHITE); @@ -1368,7 +1375,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotOctave(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1380,18 +1387,10 @@ void menu() { octave--; plotOctave(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotOctave(WHITE); - cursorNow = BLACK; - display.display(); - subOctave = 0; - writeSetting(OCTAVE_ADDR,octave); - break; case BTN_UP: // up if (octave < 6){ @@ -1399,15 +1398,16 @@ void menu() { octave++; plotOctave(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotOctave(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subOctave = 0; writeSetting(OCTAVE_ADDR,octave); break; @@ -1417,7 +1417,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotMIDI(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1429,7 +1429,7 @@ void menu() { MIDIchannel--; plotMIDI(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1440,13 +1440,13 @@ void menu() { slowMidi = !slowMidi; plotMIDI(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; dipSwBits = dipSwBits ^ (1<<3); writeSetting(DIPSW_BITS_ADDR,dipSwBits); } else { plotMIDI(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subMIDI = 0; writeSetting(MIDI_ADDR,MIDIchannel); } @@ -1458,7 +1458,7 @@ void menu() { MIDIchannel++; plotMIDI(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; @@ -1466,7 +1466,7 @@ void menu() { // menu plotMIDI(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subMIDI = 0; writeSetting(MIDI_ADDR,MIDIchannel); break; @@ -1484,7 +1484,7 @@ void menu() { int trills = readTrills(); switch (deumButtonState){ case BTN_DOWN: - if (mainMenuCursor < 6){ + if (mainMenuCursor < 5){ drawMenuCursor(mainMenuCursor, BLACK); mainMenuCursor++; drawMenuCursor(mainMenuCursor, WHITE); @@ -1495,11 +1495,11 @@ void menu() { break; case BTN_ENTER: // enter - redraw |= selectMainMenu(); + redraw |= selectMainMenu(mainMenuCursor); break; case BTN_UP: // up - if (mainMenuCursor > 1){ + if (mainMenuCursor > 0){ drawMenuCursor(mainMenuCursor, BLACK); mainMenuCursor--; drawMenuCursor(mainMenuCursor, WHITE); @@ -1513,19 +1513,19 @@ void menu() { state = DISPLAYOFF_IDL; stateFirstRun = 1; break; - case 9: + case BTN_MENU+BTN_DOWN: //menu+down break; - case 10: + case BTN_MENU+BTN_ENTER: //menu+enter if (trills){ state = PATCH_VIEW; stateFirstRun = 1; - setFPS(trills); + setFPS(trills, patch); } break; - case 12: + case BTN_MENU+BTN_UP: //menu+up if (trills){ state = PATCH_VIEW; @@ -1566,14 +1566,6 @@ void menu() { cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotRotator(WHITE,parallel); - cursorNow = BLACK; - redraw = true; - subParallel = 0; - writeSetting(PARAL_ADDR,(parallel + 24)); - break; case BTN_UP: // up if (parallel < 24){ @@ -1585,6 +1577,7 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotRotator(WHITE,parallel); @@ -1619,14 +1612,6 @@ void menu() { cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotRotator(WHITE,rotations[subRotator-1]); - cursorNow = BLACK; - redraw = true; - writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); - subRotator = 0; - break; case BTN_UP: // up if (rotations[subRotator-1] < 24){ @@ -1638,6 +1623,7 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotRotator(WHITE,rotations[subRotator-1]); @@ -1659,21 +1645,13 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotPriority(BLACK); - priority = !priority; - cursorBlinkTime = timeNow; - break; - case BTN_ENTER: - // enter - subPriority = 0; - writeSetting(PRIO_ADDR,priority); - break; case BTN_UP: // up plotPriority(BLACK); priority = !priority; cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu subPriority = 0; @@ -1688,7 +1666,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(rotatorMenuCursor, cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -1696,7 +1674,7 @@ void menu() { int trills = readTrills(); switch (deumButtonState){ case BTN_DOWN: - if (rotatorMenuCursor < 6){ + if (rotatorMenuCursor < 5){ drawMenuCursor(rotatorMenuCursor, BLACK); rotatorMenuCursor++; drawMenuCursor(rotatorMenuCursor, WHITE); @@ -1707,12 +1685,11 @@ void menu() { break; case BTN_ENTER: // enter - selectRotatorMenu(); - redraw = true; + redraw |= selectRotatorMenu(rotatorMenuCursor); break; case BTN_UP: // up - if (rotatorMenuCursor > 1){ + if (rotatorMenuCursor > 0){ drawMenuCursor(rotatorMenuCursor, BLACK); rotatorMenuCursor--; drawMenuCursor(rotatorMenuCursor, WHITE); @@ -1735,7 +1712,7 @@ void menu() { if (trills){ state = PATCH_VIEW; stateFirstRun = 1; - setFPS(trills); + setFPS(trills, patch); } break; case 12: @@ -1754,6 +1731,7 @@ void menu() { if (stateFirstRun) { drawAdjustScreen("BREATH", breathThrVal, breathMaxVal, breathLoLimit, breathHiLimit); forcePix = 1; + sensorPixelPos1 = -1; // Force draw of sensor pixels stateFirstRun = 0; } redraw |=updateAdjustCursor(timeNow); @@ -2129,14 +2107,6 @@ void menu() { } cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - subBreathCC = 0; - if (readSetting(BREATH_CC_ADDR) != breathCC) { - writeSetting(BREATH_CC_ADDR,breathCC); - midiReset(); - } - break; case BTN_UP: // up plotBreathCC(BLACK); @@ -2147,6 +2117,7 @@ void menu() { } cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu subBreathCC = 0; @@ -2175,20 +2146,13 @@ void menu() { breathAT=!breathAT; cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - subBreathAT = 0; - if (readSetting(BREATH_AT_ADDR) != breathAT){ - writeSetting(BREATH_AT_ADDR,breathAT); - midiReset(); - } - break; case BTN_UP: // up plotBreathAT(BLACK); breathAT=!breathAT; cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu subBreathAT = 0; @@ -2219,10 +2183,6 @@ void menu() { } else velocity = 127; cursorBlinkTime = timeNow; break; - case BTN_ENTER: - subVelocity = 0; - writeSetting(VELOCITY_ADDR,velocity); - break; case BTN_UP: plotVelocity(BLACK); if (velocity < 127){ @@ -2230,6 +2190,7 @@ void menu() { } else velocity = 0; cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: subVelocity = 0; writeSetting(VELOCITY_ADDR,velocity); @@ -2258,12 +2219,6 @@ void menu() { plotCurve(WHITE); cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - plotCurve(WHITE); - subCurve = 0; - writeSetting(BREATHCURVE_ADDR,curve); - break; case BTN_UP: // up plotCurve(BLACK); @@ -2273,6 +2228,7 @@ void menu() { plotCurve(WHITE); cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotCurve(WHITE); @@ -2302,12 +2258,6 @@ void menu() { plotVelSmpDl(WHITE); cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - plotVelSmpDl(WHITE); - subVelSmpDl = 0; - writeSetting(VEL_SMP_DL_ADDR,velSmpDl); - break; case BTN_UP: // up plotVelSmpDl(BLACK); @@ -2317,6 +2267,7 @@ void menu() { plotVelSmpDl(WHITE); cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotVelSmpDl(WHITE); @@ -2383,7 +2334,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (setupBrMenuCursor < 6){ + if (setupBrMenuCursor < 5){ drawMenuCursor(setupBrMenuCursor, BLACK); setupBrMenuCursor++; drawMenuCursor(setupBrMenuCursor, WHITE); @@ -2394,11 +2345,11 @@ void menu() { break; case BTN_ENTER: // enter - selectSetupBrMenu(); + redraw |= selectSetupBrMenu(setupBrMenuCursor); break; case BTN_UP: // up - if (setupBrMenuCursor > 1){ + if (setupBrMenuCursor > 0){ drawMenuCursor(setupBrMenuCursor, BLACK); setupBrMenuCursor--; drawMenuCursor(setupBrMenuCursor, WHITE); @@ -2440,12 +2391,6 @@ void menu() { plotPort(WHITE); cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - plotPort(WHITE); - subPort = 0; - writeSetting(PORTAM_ADDR,portamento); - break; case BTN_UP: // up plotPort(BLACK); @@ -2455,6 +2400,7 @@ void menu() { plotPort(WHITE); cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotPort(WHITE); @@ -2469,7 +2415,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPB(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2481,18 +2427,10 @@ void menu() { PBdepth--; plotPB(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotPB(WHITE); - cursorNow = BLACK; - display.display(); - subPB = 0; - writeSetting(PB_ADDR,PBdepth); - break; case BTN_UP: // up if (PBdepth < 12){ @@ -2500,15 +2438,16 @@ void menu() { PBdepth++; plotPB(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotPB(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subPB = 0; writeSetting(PB_ADDR,PBdepth); break; @@ -2518,7 +2457,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotExtra(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2531,17 +2470,9 @@ void menu() { } else extraCT = 4; plotExtra(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - plotExtra(WHITE); - cursorNow = BLACK; - display.display(); - subExtra = 0; - writeSetting(EXTRA_ADDR,extraCT); - break; case BTN_UP: // up plotExtra(BLACK); @@ -2550,14 +2481,15 @@ void menu() { } else extraCT = 0; plotExtra(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotExtra(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subExtra = 0; writeSetting(EXTRA_ADDR,extraCT); break; @@ -2567,7 +2499,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotDeglitch(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2579,18 +2511,10 @@ void menu() { deglitch-=1; plotDeglitch(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotDeglitch(WHITE); - cursorNow = BLACK; - display.display(); - subDeglitch = 0; - writeSetting(DEGLITCH_ADDR,deglitch); - break; case BTN_UP: // up if (deglitch < 70){ @@ -2598,15 +2522,16 @@ void menu() { deglitch+=1; plotDeglitch(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotDeglitch(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subDeglitch = 0; writeSetting(DEGLITCH_ADDR,deglitch); break; @@ -2616,7 +2541,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotPinkyKey(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2628,18 +2553,10 @@ void menu() { pinkySetting-=1; plotPinkyKey(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotPinkyKey(WHITE); - cursorNow = BLACK; - display.display(); - subPinky = 0; - writeSetting(PINKY_KEY_ADDR,pinkySetting); - break; case BTN_UP: // up if (pinkySetting < 24){ @@ -2647,15 +2564,16 @@ void menu() { pinkySetting+=1; plotPinkyKey(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotPinkyKey(WHITE); cursorNow = BLACK; - display.display(); + redraw = true; subPinky = 0; writeSetting(PINKY_KEY_ADDR,pinkySetting); break; @@ -2665,35 +2583,35 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(setupCtMenuCursor, cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (setupCtMenuCursor < 6){ + if (setupCtMenuCursor < 5){ drawMenuCursor(setupCtMenuCursor, BLACK); setupCtMenuCursor++; drawMenuCursor(setupCtMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_ENTER: // enter - selectSetupCtMenu(); + redraw |= selectSetupCtMenu(setupCtMenuCursor); break; case BTN_UP: // up - if (setupCtMenuCursor > 1){ + if (setupCtMenuCursor > 0){ drawMenuCursor(setupCtMenuCursor, BLACK); setupCtMenuCursor--; drawMenuCursor(setupCtMenuCursor, WHITE); cursorNow = BLACK; clearSub(); - display.display(); + redraw = true; } break; case BTN_MENU: @@ -2707,8 +2625,6 @@ void menu() { - - } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< if (stateFirstRun) { drawVibratoMenuScreen(); @@ -2718,7 +2634,7 @@ void menu() { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; plotVibrato(cursorNow); - display.display(); + redraw = true; cursorBlinkTime = timeNow; } if (buttonPressedAndNotUsed){ @@ -2734,14 +2650,6 @@ void menu() { cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotVibrato(WHITE); - cursorNow = BLACK; - redraw = true; - subVibrato = 0; - writeSetting(VIBRATO_ADDR,vibrato); - break; case BTN_UP: // up if (vibrato < 9){ @@ -2753,6 +2661,7 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotVibrato(WHITE); @@ -2783,14 +2692,6 @@ void menu() { cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotVibSens(WHITE); - cursorNow = BLACK; - redraw = true; - subVibSens = 0; - writeSetting(VIB_SENS_ADDR,vibSens); - break; case BTN_UP: // up if (vibSens < 12){ @@ -2802,6 +2703,7 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotVibSens(WHITE); @@ -2830,12 +2732,6 @@ void menu() { plotVibRetn(WHITE); cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - plotVibRetn(WHITE); - subVibRetn = 0; - writeSetting(VIB_RETN_ADDR,vibRetn); - break; case BTN_UP: // up plotVibRetn(BLACK); @@ -2845,6 +2741,7 @@ void menu() { plotVibRetn(WHITE); cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotVibRetn(WHITE); @@ -2875,14 +2772,6 @@ void menu() { cursorBlinkTime = timeNow; } break; - case BTN_ENTER: - // enter - plotVibSquelch(WHITE); - cursorNow = BLACK; - redraw = true; - subVibSquelch = 0; - writeSetting(VIB_SQUELCH_ADDR,vibSquelch); - break; case BTN_UP: // up if (vibSquelch < 30){ @@ -2894,6 +2783,7 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotVibSquelch(WHITE); @@ -2920,12 +2810,6 @@ void menu() { plotVibDirection(WHITE); cursorBlinkTime = timeNow; break; - case BTN_ENTER: - // enter - plotVibDirection(WHITE); - subVibDirection = 0; - writeSetting(VIB_DIRECTION_ADDR,vibDirection); - break; case BTN_UP: // up plotVibDirection(BLACK); @@ -2933,6 +2817,7 @@ void menu() { plotVibDirection(WHITE); cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: // menu plotVibDirection(WHITE); @@ -2954,7 +2839,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (vibratoMenuCursor < 5){ + if (vibratoMenuCursor < 4){ drawMenuCursor(vibratoMenuCursor, BLACK); vibratoMenuCursor++; drawMenuCursor(vibratoMenuCursor, WHITE); @@ -2965,12 +2850,11 @@ void menu() { break; case BTN_ENTER: // enter - selectVibratoMenu(); - redraw = true; + redraw |= selectVibratoMenu(vibratoMenuCursor); break; case BTN_UP: // up - if (vibratoMenuCursor > 1){ + if (vibratoMenuCursor > 0){ drawMenuCursor(vibratoMenuCursor, BLACK); vibratoMenuCursor--; drawMenuCursor(vibratoMenuCursor, WHITE); diff --git a/NuEVI/numenu.cpp b/NuEVI/numenu.cpp index c8cbd9f..0abb174 100644 --- a/NuEVI/numenu.cpp +++ b/NuEVI/numenu.cpp @@ -35,81 +35,3 @@ Controls setup. Opens a new menu. */ - -#include -#include -#include "numenu.h" -#include "menu.h" - -NuMenu::NuMenu(Adafruit_SSD1306& display) - : _display(display) -{ -} - -bool NuMenu::init() -{ - // memset(_pageStack, 0, sizeof(_pageStack)); - // _rootMenu = MenuPageState(root, 0, 0); - _enabled = false; - return true; -} - -void NuMenu::update(uint16_t buttonState) -{ - if(_enabled) - { - // int - } -} -extern Adafruit_SSD1306 display; - -void NuMenu::drawMenuItems(const char* title, const char* entries[], int count, int selection, int offset) -{ - //Initialize display and draw menu header + line - display.clearDisplay(); - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(0,0); - display.println(title); - display.drawLine(0,MENU_ROW_HEIGHT,127,MENU_ROW_HEIGHT, WHITE); - - int rowPixel = MENU_HEADER_OFFSET + MENU_ROW_HEIGHT; - - for(int index = offset, count = 0; ((index-offset) < MENU_NUM_ROWS) && index < count; index++ ) - { - // int rowPixel = (row+1)*MENU_ROW_HEIGHT + MENU_HEADER_OFFSET; - const char* lineText = entries[index]; - display.setCursor(0,rowPixel); - rowPixel += (MENU_ROW_HEIGHT+1); - display.println(lineText); - } - - // TODO: Fix cursor - // if(selection>=0) - // drawMenuCursor(selection, WHITE); - -} - - - -// This is for the SUB MENU -// void NuMenu::drawSelection(const char* title, const char* entries[], int count, int* selection) -// { -// _display.fillRect(63,11,64,52,BLACK); -// _display.drawRect(63,11,64,52,WHITE); -// _display.setTextColor(WHITE); -// _display.setTextSize(1); - -// _display.setCursor(68,15); -// _display.println(title); - -// const char* entryTxt = entries[*selection]; -// int len = strlen(entryTxt); - -// _display.setTextSize(2); - -// _display.setCursor(91 - 4*len,33); -// _display.println(entryTxt); - -// _display.display(); -// } From 0d0ea5051d6228633672568c03dffeb32cc749a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 16 Jun 2019 14:36:03 +0200 Subject: [PATCH 05/35] Made the sensor adjust menu driven by data * Moved menu titles and option names into data structures. * Unified select menu option code * Also unified handling of menu selection, although main and rotator menus are still handled the old way. * Moved struct definitions to numenu.h * Grouped functions and variables together based on usage. --- NuEVI/NuEVI.ino | 30 +- NuEVI/config.h | 15 + NuEVI/globals.h | 13 - NuEVI/menu.cpp | 1536 ++++++++++++++++++----------------------------- NuEVI/menu.h | 19 +- NuEVI/numenu.h | 83 ++- 6 files changed, 663 insertions(+), 1033 deletions(-) diff --git a/NuEVI/NuEVI.ino b/NuEVI/NuEVI.ino index 1a45ba2..3492201 100644 --- a/NuEVI/NuEVI.ino +++ b/NuEVI/NuEVI.ino @@ -87,19 +87,19 @@ int parallel = 7; // semitones byte gateOpen = 0; // setting for gate always open, note on sent for every time fingering changes, no matter the breath status -// MAybe move these to config.h (as defines?) -const int breathLoLimit = 0; -const int breathHiLimit = 4095; -const int portamLoLimit = 700; -const int portamHiLimit = 4700; -const int pitchbLoLimit = 500; -const int pitchbHiLimit = 4000; -const int extracLoLimit = 500; -const int extracHiLimit = 4000; -const int ctouchLoLimit = 50; -const int ctouchHiLimit = 350; -const int ttouchLoLimit = 50; -const int ttouchHiLimit = 1900; +// // MAybe move these to config.h (as defines?) +// const uint16_t breathLoLimit = 0; +// const uint16_t breathHiLimit = 4095; +// const uint16_t portamLoLimit = 700; +// const uint16_t portamHiLimit = 4700; +// const uint16_t pitchbLoLimit = 500; +// const uint16_t pitchbHiLimit = 4000; +// const uint16_t extracLoLimit = 500; +// const uint16_t extracHiLimit = 4000; +// const uint16_t ctouchLoLimit = 50; +// const uint16_t ctouchHiLimit = 350; +// const uint16_t ttouchLoLimit = 50; +// const uint16_t ttouchHiLimit = 1900; int touch_Thr = 1300; @@ -1214,9 +1214,9 @@ void extraController() { void portamento_() { // Portamento is controlled with the bite sensor (variable capacitor) in the mouthpiece if (biteJumper){ //PBITE (if pulled low with jumper, use pressure sensor on A7) - biteSensor=analogRead(A7); // alternative kind bite sensor (air pressure tube and sensor) PBITE + biteSensor = analogRead(A7); // alternative kind bite sensor (air pressure tube and sensor) PBITE } else { - biteSensor=touchRead(bitePin); // get sensor data, do some smoothing - SENSOR PIN 17 - PCB PINS LABELED "BITE" (GND left, sensor pin right) + biteSensor = touchRead(bitePin); // get sensor data, do some smoothing - SENSOR PIN 17 - PCB PINS LABELED "BITE" (GND left, sensor pin right) } if (portamento && (biteSensor >= portamThrVal)) { // if we are enabled and over the threshold, send portamento if (!portIsOn) { diff --git a/NuEVI/config.h b/NuEVI/config.h index 7762fc3..f2ff43a 100644 --- a/NuEVI/config.h +++ b/NuEVI/config.h @@ -21,4 +21,19 @@ #define CC_INTERVAL 2 +// MAybe move these to config.h (as defines?) +#define breathLoLimit 0 +#define breathHiLimit 4095 +#define portamLoLimit 700 +#define portamHiLimit 4700 +#define pitchbLoLimit 500 +#define pitchbHiLimit 4000 +#define extracLoLimit 500 +#define extracHiLimit 4000 +#define ctouchLoLimit 50 +#define ctouchHiLimit 350 +#define ttouchLoLimit 50 +#define ttouchHiLimit 1900 + + #endif diff --git a/NuEVI/globals.h b/NuEVI/globals.h index 464fa2b..a8f0b5f 100644 --- a/NuEVI/globals.h +++ b/NuEVI/globals.h @@ -40,19 +40,6 @@ extern byte currentRotation; extern int rotations[4]; extern int parallel; // semitones -extern const int breathLoLimit; -extern const int breathHiLimit; -extern const int portamLoLimit; -extern const int portamHiLimit; -extern const int pitchbLoLimit; -extern const int pitchbHiLimit; -extern const int extracLoLimit; -extern const int extracHiLimit; -extern const int ctouchLoLimit; -extern const int ctouchHiLimit; -extern const int ttouchLoLimit; -extern const int ttouchHiLimit; - extern int touch_Thr; extern unsigned long cursorBlinkTime; // the last time the cursor was toggled diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index ab9d885..bcafcfb 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -9,6 +9,9 @@ #include #include #include "settings.h" +#include "numenu.h" + +#define ARR_LEN(a) (sizeof (a) / sizeof (a[0])) #define BTN_DOWN 1 #define BTN_ENTER 2 @@ -22,22 +25,44 @@ static uint8_t lastDeumButtons = 0; static uint8_t deumButtonState = 0; static byte buttonPressedAndNotUsed = 0; -static byte mainMenuCursor = 0; -static byte setupBrMenuCursor = 0; -static byte setupCtMenuCursor = 0; -static byte rotatorMenuCursor = 0; -static byte vibratoMenuCursor = 0; +// Allocate some space for cursors +enum CursorIdx { + EMain, + EBreath, + EControl, + ERotator, + EVibrato, + + // NEVER ADD + NUM_CURSORS +}; + +static byte cursors[CursorIdx::NUM_CURSORS]; + +// These two should +static byte mainMenuCursor = 0; +static byte rotatorMenuCursor = 0; static byte cursorNow; -static byte forcePix = 0; + static byte forceRedraw = 0; static byte FPD = 0; +// Variables used for the adjust menu +static byte forcePix = 0; static uint16_t pos1; static uint16_t pos2; +static int16_t adjustOption = 0; +static int16_t adjustCurrent = 0; + +static int16_t sensorPixelPos1 = -1; +static int16_t sensorPixelPos2 = -1; + + +// constants static const unsigned long debounceDelay = 30; // the debounce time; increase if the output flickers static const unsigned long buttonRepeatInterval = 50; static const unsigned long buttonRepeatDelay = 400; @@ -155,12 +180,12 @@ static const unsigned char PROGMEM nuevi_logo_bmp[] = { extern void readSwitches(void); extern Adafruit_MPR121 touchSensor; +extern const MenuPage mainMenuPage; // Forward declaration. + #define OLED_RESET 4 Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET); -// NuMenu mainMenu(display); - void initDisplay() { // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) @@ -173,6 +198,9 @@ void initDisplay() { display.clearDisplay(); display.drawBitmap(0,0,nuevi_logo_bmp,LOGO16_GLCD_WIDTH,LOGO16_GLCD_HEIGHT,1); display.display(); + + // Arduino memset??? + memset(cursors, 0, sizeof(cursors)); } void showVersion() { @@ -192,98 +220,32 @@ void showVersion() { display.display(); } -void drawAdjCursor(byte color){ - display.drawTriangle(16,4,20,4,18,1,color); - display.drawTriangle(16,6,20,6,18,9,color); -} - -static void drawAdjustBase(const char* title, bool all) { - display.clearDisplay(); - - display.drawLine(25,17,120,17,WHITE); - display.drawLine(25,18,25,19,WHITE); - display.drawLine(120,18,120,19,WHITE); - display.drawLine(25,29,120,29,WHITE); - display.drawLine(25,27,25,28,WHITE); - display.drawLine(120,27,120,28,WHITE); - - display.drawLine(25,36,25,40,WHITE); - display.drawLine(120,36,120,40,WHITE); - - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(25,2); - display.println(title); - - display.setCursor(0,20); - display.println("THR"); - display.setCursor(0,35); - display.println("SNS"); - - - if(all) { - display.drawLine(25,47,120,47,WHITE); - display.drawLine(25,48,25,49,WHITE); - display.drawLine(120,48,120,49,WHITE); - display.drawLine(25,59,120,59,WHITE); - display.drawLine(25,57,25,58,WHITE); - display.drawLine(120,57,120,58,WHITE); - display.setCursor(0,50); - display.println("MAX"); - } - cursorNow = WHITE; - drawAdjCursor(WHITE); -} - -void drawAdjustScreen(const char* title, int threshold, int maxValue, uint16_t lowLimit, uint16_t highLimit){ - drawAdjustBase(title, maxValue >= 0); - - //display.drawLine(38,20,38,26,WHITE); // indikation thr - pos1 = map(threshold, lowLimit, highLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - - //display.drawLine(115,50,115,56,WHITE); // indikation max - if(maxValue >= 0) { - pos2 = map(maxValue, lowLimit, highLimit, 27, 119); - display.drawLine(pos2,50,pos2,56,WHITE); - } -} - void drawMenuCursor(byte itemNo, byte color){ byte ymid = 15 + 9 * itemNo; display.drawTriangle(57, ymid,61, ymid+2,61, ymid-2, color); } -/* - * Draw a regular list of text menu items - * header - first header line - * selectedItem - the currently selected item (draw a triangle next to it). -1 for none. 1..nItems (1-based, 0 is header row) - * nItems - number of menu items - * ... - a list (nItems long) of text items to show - */ -static void drawMenu(const char* header, byte nItems, ...) { - va_list valist; +static void drawMenu(const MenuPage &page, const char* customTitle = nullptr) { //Initialize display and draw menu header + line display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); - display.println(header); - display.drawLine(0,MENU_ROW_HEIGHT,127,MENU_ROW_HEIGHT, WHITE); + if(customTitle) + display.println(customTitle); + else + display.println(page.title); + display.drawLine(0, MENU_ROW_HEIGHT, 127, MENU_ROW_HEIGHT, WHITE); - va_start(valist, nItems); - for(byte row=0; rowtitle; display.setCursor(0,rowPixel); display.println(lineText); } - - va_end(valist); - - display.display(); } void drawMenuScreen(){ @@ -303,24 +265,7 @@ void drawMenuScreen(){ splice2[0] = (voltage/10)+'0'; splice2[2] = (voltage%10)+'0'; } - - drawMenu(menuTitle, 6, - "TRANSPOSE", - "OCTAVE", - "MIDI CH", - "ADJUST", - "SETUP BR", - "SETUP CTL"); -} - -static void drawRotatorMenuScreen(){ - drawMenu("ROTATOR SETUP", 6, - "PARALLEL", - "ROTATE 1", - "ROTATE 2", - "ROTATE 3", - "ROTATE 4", - "PRIORITY"); + drawMenu(mainMenuPage, menuTitle); } static void drawTrills(){ @@ -334,28 +279,23 @@ static void drawPatchView(){ if (FPD){ drawTrills(); } + display.setTextColor(WHITE); + display.setTextSize(6); if (FPD < 2){ - display.setTextColor(WHITE); - display.setTextSize(6); - if (patch < 10){ - // 1-9 - display.setCursor(48,10); - } else if (patch < 100){ - // 10-99 - display.setCursor(31,10); - } else { - // 99-128 - display.setCursor(10,10); + int align; + if (patch < 10) { // 1-9 + align = 48; + } else if (patch < 100) { // 10-99 + align = 31; + } else { // 100-128 use default + align = 10; } + display.setCursor(align,10); display.println(patch); } else if (FPD == 2){ - display.setTextColor(WHITE); - display.setTextSize(6); display.setCursor(10,10); display.println("SET"); } else { - display.setTextColor(WHITE); - display.setTextSize(6); display.setCursor(10,10); display.println("CLR"); } @@ -366,6 +306,10 @@ static void clearSub(){ display.fillRect(63,11,64,52,BLACK); } +static void clearSubValue() { + display.fillRect(65, 24, 60, 37, BLACK); +} + static void drawSubBox(const char* label) { display.fillRect(63,11,64,52,BLACK); @@ -389,28 +333,19 @@ static void plotTranspose(int color){ display.println(abs(value)); } -static void drawSubTranspose(){ - drawSubBox("TRANSPOSE"); - plotTranspose(WHITE); -} - - static void plotRotator(int color,int value){ display.setTextColor(color); display.setTextSize(2); display.setCursor(80,33); if ((value) > -1){ display.println("+"); - display.setCursor(93,33); - display.println(value); } else { display.println("-"); - display.setCursor(93,33); - display.println(abs(value)); } + display.setCursor(93,33); + display.println(abs(value)); } - static void plotPriority(int color){ display.setTextColor(color); display.setTextSize(2); @@ -422,20 +357,17 @@ static void plotPriority(int color){ } } - static void plotOctave(int color){ display.setTextColor(color); display.setTextSize(2); display.setCursor(80,33); if ((octave-3) > -1){ display.println("+"); - display.setCursor(93,33); - display.println(octave-3); } else { display.println("-"); - display.setCursor(93,33); - display.println(abs(octave-3)); } + display.setCursor(93,33); + display.println(abs(octave-3)); } static void plotMIDI(int color){ @@ -453,8 +385,6 @@ static void plotMIDI(int color){ display.print("S"); } - - static void plotSubOption(const char* label, int color) { display.setTextColor(color); @@ -628,181 +558,14 @@ static void plotVelBias(int color){ } } -static void drawSubRotator(){ - drawSubBox("SEMITONES"); +static void drawSubRotator(int __unused color){ + // HACKY HACK ROTATOR MENU + // drawSubBox("SEMITONES"); //plotRotator(WHITE,value); forceRedraw = 1; } -static void drawSubVelSmpDl(){ - drawSubBox("VEL DELAY"); - plotVelSmpDl(WHITE); -} - -static void drawSubPriority(){ - drawSubBox("MONO PRIO"); - plotPriority(WHITE); -} - -static void drawSubOctave(){ - drawSubBox("OCTAVE"); - plotOctave(WHITE); -} - -static void drawSubMIDI(){ - drawSubBox("MIDI CHNL"); - plotMIDI(WHITE); -} - -static void drawSubBreathCC(){ - drawSubBox("BREATH CC"); - plotBreathCC(WHITE); -} - -static void drawSubBreathAT(){ - drawSubBox("BREATH AT"); - plotBreathAT(WHITE); -} - -static void drawSubVelocity(){ - drawSubBox("VELOCITY"); - plotVelocity(WHITE); -} - -static void drawSubCurve(){ - drawSubBox("CURVE"); - plotCurve(WHITE); -} - -static void drawSubPort(){ - drawSubBox("PORT/GLD"); - plotPort(WHITE); -} - -static void drawSubPB(){ - drawSubBox("PITCHBEND"); - plotPB(WHITE); -} - -static void drawSubVelBias(){ - drawSubBox("VEL BIAS"); - plotVelBias(WHITE); -} - -static void drawSubVibSquelch(){ - drawSubBox("LEVEL"); - plotVibSquelch(WHITE); -} - -static void drawSubVibDirection(){ - drawSubBox("DIRECTION"); - plotVibDirection(WHITE); -} - -static void drawSubExtra(){ - drawSubBox("EXTRA CTR"); - plotExtra(WHITE); -} - -static void drawSubVibrato(){ - drawSubBox("LEVEL"); - plotVibrato(WHITE); -} - -static void drawSubVibSens(){ - drawSubBox("LEVEL"); - plotVibSens(WHITE); -} - -static void drawSubVibRetn(){ - drawSubBox("LEVEL"); - plotVibRetn(WHITE); -} - -static void drawSubDeglitch(){ - drawSubBox("DEGLITCH"); - plotDeglitch(WHITE); -} - -static void drawSubPinkyKey(){ - drawSubBox("PINKY KEY"); - plotPinkyKey(WHITE); -} - - - -static void drawSetupBrMenuScreen(){ - drawMenu("SETUP BREATH", 6, "BREATH CC", "BREATH AT", "VELOCITY", "CURVE", "VEL DELAY", "VEL BIAS"); -} - -static void drawSetupCtMenuScreen(){ - drawMenu("SETUP CTRLS", 6, "PORT/GLD", "PITCHBEND", "EXTRA CTR", "VIBRATO", "DEGLITCH", "PINKY KEY"); -} - -static void drawVibratoMenuScreen(){ - drawMenu("VIBRATO", 5, "DEPTH","SENSE","RETURN", "SQUELCH", "DIRECTION"); -} - -static int sensorPixelPos1 = -1; -static int sensorPixelPos2 = -1; - -bool updateSensorPixel(int pos, int pos2) { - bool update = pos != sensorPixelPos1 || pos2 != sensorPixelPos2; - if(update) { - display.drawFastHLine(28, 38, 118-28, BLACK); // Clear old line - display.drawPixel(pos, 38, WHITE); - sensorPixelPos1 = pos; - sensorPixelPos2 = pos2; - } - return update; -} - -void drawSensorPixels(){ - int redraw = 0; - if(forcePix) - sensorPixelPos1 = -1; - - if ((state == BREATH_ADJ_IDL) || (state == BREATH_ADJ_THR) || (state == BREATH_ADJ_MAX)){ - int pos = map(constrain(pressureSensor, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118); - redraw = updateSensorPixel(pos, -1); - } - else if ((state == PORTAM_ADJ_IDL) || (state == PORTAM_ADJ_THR) || (state == PORTAM_ADJ_MAX)){ - int pos = map(constrain(biteSensor,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118); - redraw = updateSensorPixel(pos, -1); - } - else if ((state == PITCHB_ADJ_IDL) || (state == PITCHB_ADJ_THR) || (state == PITCHB_ADJ_MAX)){ - int pos = map(constrain(pbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - int pos2 = map(constrain(pbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - redraw = updateSensorPixel(pos, pos2); - } - else if ((state == EXTRAC_ADJ_IDL) || (state == EXTRAC_ADJ_THR) || (state == EXTRAC_ADJ_MAX)){ - int pos = map(constrain(exSensor, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118); - redraw = updateSensorPixel(pos, -1); - } - else if ((state == CTOUCH_ADJ_IDL) || (state == CTOUCH_ADJ_THR)){ - display.drawLine(28,38,118,38,BLACK); - for (byte i=0; i<12; i++){ - int pos = map(constrain(touchSensor.filteredData(i), ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - display.drawPixel(pos, 38, WHITE); - } - - int posRead = map(touchRead(halfPitchBendKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); - int pos = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - - posRead = map(touchRead(specialKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); - int pos2 = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - - updateSensorPixel(pos, pos2); - - redraw = 1; - } - if (redraw){ - display.display(); - } - forcePix = 0; -} - void writeSetting(byte address, unsigned short value){ union { byte v[2]; @@ -848,71 +611,15 @@ static void clearFPS(int trills) { } //*********************************************************** +// Main menu +const MenuEntrySub transposeMenu = { MenuType::ESub, "TRANSPOSE", "TRANSPOSE", &subTranspose, plotTranspose }; +const MenuEntrySub octaveMenu = { MenuType::ESub, "OCTAVE", "OCTAVE", &subOctave, plotOctave }; +const MenuEntrySub midiMenu = { MenuType::ESub, "MIDI CH", "MIDI CHNL", &subMIDI, plotMIDI }; +const MenuEntryStateCh adjustMenu = { MenuType::EStateChange, "ADJUST", ADJUST_MENU }; +const MenuEntryStateCh breathMenu = { MenuType::EStateChange, "SETUP BR", SETUP_BR_MENU }; +const MenuEntryStateCh controlMenu = { MenuType::EStateChange, "SETUP CTL", SETUP_CT_MENU }; -enum MenuType { - ESub, - ESubRotator, - EStateChange, -}; - -struct MenuEntry { - enum MenuType type; -}; - -struct MenuEntrySub { - enum MenuType type; - byte* flag; - void (*subMenuFunc)(void); -}; - -struct MenuEntrySubRotator { - enum MenuType type; - byte flagValue; - byte* flag; - void (*subMenuFunc)(void); -}; - -struct MenuEntryStateCh { - enum MenuType type; - byte state; -}; - -//*********************************************************** - -static bool ExecuteMenuSelection(int cursorPosition, const struct MenuEntry *menuEntry) -{ - switch(menuEntry->type) { - case MenuType::ESub: - *((const MenuEntrySub*)menuEntry)->flag = 1; - drawMenuCursor(cursorPosition, WHITE); - ((const MenuEntrySub*)menuEntry)->subMenuFunc(); - return true; - - case MenuType::EStateChange: - state = ((const MenuEntryStateCh*)menuEntry)->state; - stateFirstRun = 1; - break; - - case MenuType::ESubRotator: - *((const MenuEntrySubRotator*)menuEntry)->flag = ((const MenuEntrySubRotator*)menuEntry)->flagValue; - drawMenuCursor(cursorPosition, WHITE); - ((const MenuEntrySub*)menuEntry)->subMenuFunc(); - break; - } - - return false; -} - -//*********************************************************** - -const MenuEntrySub transposeMenu = { MenuType::ESub, &subTranspose, drawSubTranspose }; -const MenuEntrySub octaveMenu = { MenuType::ESub, &subOctave, drawSubOctave }; -const MenuEntrySub midiMenu = { MenuType::ESub, &subMIDI, drawSubMIDI }; -const MenuEntryStateCh adjustMenu = { MenuType::EStateChange, BREATH_ADJ_IDL }; -const MenuEntryStateCh breathMenu = { MenuType::EStateChange, SETUP_BR_MENU }; -const MenuEntryStateCh controlMenu = { MenuType::EStateChange, SETUP_CT_MENU }; - -const MenuEntry* MainMenuEntries[] = { +const MenuEntry* mainMenuEntries[] = { (MenuEntry*)&transposeMenu, (MenuEntry*)&octaveMenu, (MenuEntry*)&midiMenu, @@ -921,20 +628,20 @@ const MenuEntry* MainMenuEntries[] = { (MenuEntry*)&controlMenu }; -static bool selectMainMenu(int cursorPosition){ - cursorBlinkTime = millis(); - const struct MenuEntry* entry = MainMenuEntries[cursorPosition]; - return ExecuteMenuSelection( cursorPosition, entry ); -} +const MenuPage mainMenuPage = { + nullptr, + CursorIdx::EMain, + DISPLAYOFF_IDL, + ARR_LEN(mainMenuEntries), mainMenuEntries +}; -//*********************************************************** // Rotator menu -const MenuEntrySub rotatorParaMenu = { MenuType::ESub, &subParallel, drawSubRotator }; -const MenuEntrySubRotator rotator1Menu = { MenuType::ESubRotator, 1, &subRotator, drawSubRotator }; -const MenuEntrySubRotator rotator2Menu = { MenuType::ESubRotator, 2, &subRotator, drawSubRotator }; -const MenuEntrySubRotator rotator3Menu = { MenuType::ESubRotator, 3, &subRotator, drawSubRotator }; -const MenuEntrySubRotator rotator4Menu = { MenuType::ESubRotator, 4, &subRotator, drawSubRotator }; -const MenuEntrySub rotatorPrioMenu = { MenuType::ESub, &subPriority, drawSubPriority }; +const MenuEntrySub rotatorParaMenu = { MenuType::ESub, "PARALLEL", "SEMITONES", &subParallel, drawSubRotator }; +const MenuEntrySubRotator rotator1Menu = { MenuType::ESubRotator, "ROTATE 1", "SEMITONES", 1, &subRotator, drawSubRotator }; +const MenuEntrySubRotator rotator2Menu = { MenuType::ESubRotator, "ROTATE 2", "SEMITONES", 2, &subRotator, drawSubRotator }; +const MenuEntrySubRotator rotator3Menu = { MenuType::ESubRotator, "ROTATE 3", "SEMITONES", 3, &subRotator, drawSubRotator }; +const MenuEntrySubRotator rotator4Menu = { MenuType::ESubRotator, "ROTATE 4", "SEMITONES", 4, &subRotator, drawSubRotator }; +const MenuEntrySub rotatorPrioMenu = { MenuType::ESub, "PRIORITY", "MONO PRIO", &subPriority, plotPriority }; const MenuEntry* rotatorMenuEntries[] = { (MenuEntry*)&rotatorParaMenu, @@ -944,22 +651,21 @@ const MenuEntry* rotatorMenuEntries[] = { (MenuEntry*)&rotator4Menu, (MenuEntry*)&rotatorPrioMenu }; -//*********************************************************** -static bool selectRotatorMenu(int cursorPosition){ - cursorBlinkTime = millis(); - const MenuEntry* entry = rotatorMenuEntries[cursorPosition]; - return ExecuteMenuSelection( cursorPosition, entry ); -} +const MenuPage rotatorMenuPage = { + "ROTATOR SETUP", + CursorIdx::ERotator, + MAIN_MENU, + ARR_LEN(rotatorMenuEntries), rotatorMenuEntries +}; -//*********************************************************** // Breath menu -const MenuEntrySub breathCCMenu = { MenuType::ESub, &subBreathCC, drawSubBreathCC }; -const MenuEntrySub breathATMenu = { MenuType::ESub, &subBreathAT, drawSubBreathAT }; -const MenuEntrySub velocityMenu = { MenuType::ESub, &subVelocity, drawSubVelocity }; -const MenuEntrySub curveMenu = { MenuType::ESub, &subCurve, drawSubCurve }; -const MenuEntrySub velSmpDlMenu = { MenuType::ESub, &subVelSmpDl, drawSubVelSmpDl }; -const MenuEntrySub velBiasMenu = { MenuType::ESub, &subVelBias, drawSubVelBias }; +const MenuEntrySub breathCCMenu = { MenuType::ESub, "BREATH CC", "BREATH CC", &subBreathCC, plotBreathCC }; +const MenuEntrySub breathATMenu = { MenuType::ESub, "BREATH AT", "BREATH AT", &subBreathAT, plotBreathAT }; +const MenuEntrySub velocityMenu = { MenuType::ESub, "VELOCITY", "VELOCITY", &subVelocity, plotVelocity }; +const MenuEntrySub curveMenu = { MenuType::ESub, "CURVE", "CURVE", &subCurve, plotCurve }; +const MenuEntrySub velSmpDlMenu = { MenuType::ESub, "VEL DELAY", "VEL DELAY", &subVelSmpDl, plotVelSmpDl }; +const MenuEntrySub velBiasMenu = { MenuType::ESub, "VEL BIAS", "VEL BIAS", &subVelBias, plotVelBias }; const MenuEntry* breathMenuEntries[] = { (MenuEntry*)&breathCCMenu, @@ -969,22 +675,21 @@ const MenuEntry* breathMenuEntries[] = { (MenuEntry*)&velSmpDlMenu, (MenuEntry*)&velBiasMenu }; -//*********************************************************** -static bool selectSetupBrMenu(int cursorPosition) { - cursorBlinkTime = millis(); - const MenuEntry* entry = breathMenuEntries[cursorPosition]; - return ExecuteMenuSelection( cursorPosition, entry ); -} +const MenuPage breathMenuPage = { + "SETUP BREATH", + CursorIdx::EBreath, + MAIN_MENU, + ARR_LEN(breathMenuEntries), breathMenuEntries +}; -//*********************************************************** -// Breath menu -const MenuEntrySub portMenu = { MenuType::ESub, &subPort, drawSubPort }; -const MenuEntrySub pitchBendMenu = { MenuType::ESub, &subPB, drawSubPB }; -const MenuEntrySub extraMenu = { MenuType::ESub, &subExtra, drawSubExtra }; -const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, VIBRATO_MENU }; -const MenuEntrySub deglitchMenu = { MenuType::ESub, &subDeglitch, drawSubDeglitch }; -const MenuEntrySub pinkyMenu = { MenuType::ESub, &subPinky, drawSubPinkyKey }; +// Control menu +const MenuEntrySub portMenu = { MenuType::ESub, "PORT/GLD", "PORT/GLD", &subPort, plotPort }; +const MenuEntrySub pitchBendMenu = { MenuType::ESub, "PITCHBEND", "PITCHBEND", &subPB, plotPB }; +const MenuEntrySub extraMenu = { MenuType::ESub, "EXTRA CTR", "EXTRA CTR", &subExtra, plotExtra }; +const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, "VIBRATO", VIBRATO_MENU }; +const MenuEntrySub deglitchMenu = { MenuType::ESub, "DEGLITCH", "DEGLITCH", &subDeglitch, plotDeglitch }; +const MenuEntrySub pinkyMenu = { MenuType::ESub, "PINKY KEY", "PINKY KEY", &subPinky, plotPinkyKey }; const MenuEntry* controlMenuEntries[] = { (MenuEntry*)&portMenu, @@ -995,22 +700,20 @@ const MenuEntry* controlMenuEntries[] = { (MenuEntry*)&pinkyMenu }; -//*********************************************************** - -static bool selectSetupCtMenu(int cursorPosition){ - cursorBlinkTime = millis(); - const MenuEntry* entry = controlMenuEntries[cursorPosition]; - return ExecuteMenuSelection( cursorPosition, entry ); -} +const MenuPage controlMenuPage = { + "SETUP CTRLS", + CursorIdx::EControl, + MAIN_MENU, + ARR_LEN(controlMenuEntries), controlMenuEntries +}; -//*********************************************************** // Vibrato menu -const MenuEntrySub vibDepthMenu = { MenuType::ESub, &subVibrato, drawSubVibrato }; -const MenuEntrySub vibSenseMenu = { MenuType::ESub, &subVibSens, drawSubVibSens }; -const MenuEntrySub vibRetnMenu = { MenuType::ESub, &subVibRetn, drawSubVibRetn }; -const MenuEntrySub vibSquelchMenu = { MenuType::ESub, &subVibSquelch, drawSubVibSquelch }; -const MenuEntrySub vibDirMenu = { MenuType::ESub, &subVibDirection, drawSubVibDirection }; +const MenuEntrySub vibDepthMenu = { MenuType::ESub, "DEPTH", "LEVEL", &subVibrato, plotVibrato }; +const MenuEntrySub vibSenseMenu = { MenuType::ESub, "SENSE", "LEVEL", &subVibSens, plotVibSens }; +const MenuEntrySub vibRetnMenu = { MenuType::ESub, "RETURN", "LEVEL", &subVibRetn, plotVibRetn }; +const MenuEntrySub vibSquelchMenu = { MenuType::ESub, "SQUELCH", "LEVEL", &subVibSquelch, plotVibSquelch }; +const MenuEntrySub vibDirMenu = { MenuType::ESub, "DIRECTION", "DIRECTION", &subVibDirection, plotVibDirection }; const MenuEntry* vibratorMenuEntries[] = { (MenuEntry*)&vibDepthMenu, @@ -1020,21 +723,151 @@ const MenuEntry* vibratorMenuEntries[] = { (MenuEntry*)&vibDirMenu }; -static bool selectVibratoMenu(int cursorPosition){ - cursorBlinkTime = millis(); - const MenuEntry* entry = vibratorMenuEntries[cursorPosition]; - return ExecuteMenuSelection( cursorPosition, entry ); -} +const MenuPage vibratoMenuPage = { + "VIBRATO", + CursorIdx::EVibrato, + SETUP_CT_MENU, + ARR_LEN(vibratorMenuEntries), vibratorMenuEntries +}; //*********************************************************** +const AdjustMenuEntry breathAdjustMenu = { + "BREATH", + { + { &breathThrVal, breathLoLimit, breathHiLimit }, + { &breathMaxVal, breathLoLimit, breathHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(BREATH_THR_ADDR, *e.entries[0].value); + writeSetting(BREATH_MAX_ADDR, *e.entries[1].value); + } +}; + +const AdjustMenuEntry portamentoAdjustMenu = { + "PORTAMENTO", + { + { &portamThrVal, portamLoLimit, portamHiLimit }, + { &portamMaxVal, portamLoLimit, portamHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(PORTAM_THR_ADDR, *e.entries[0].value); + writeSetting(PORTAM_MAX_ADDR, *e.entries[1].value); + } +}; + +const AdjustMenuEntry pitchBendAdjustMenu = { + "PITCH BEND", + { + { &pitchbThrVal, pitchbLoLimit, pitchbHiLimit }, + { &pitchbMaxVal, pitchbLoLimit, pitchbHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(PITCHB_THR_ADDR, *e.entries[0].value); + writeSetting(PITCHB_MAX_ADDR, *e.entries[1].value); + } +}; + +const AdjustMenuEntry extraSensorAdjustMenu = { + "EXTRA CONTROLLER", + { + { &extracThrVal, extracLoLimit, extracHiLimit }, + { &extracMaxVal, extracLoLimit, extracHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(EXTRAC_THR_ADDR, *e.entries[0].value); + writeSetting(EXTRAC_MAX_ADDR, *e.entries[1].value); + } +}; -bool drawAdjustBar(uint16_t buttons, int row, uint16_t *valPtr, uint16_t minVal, uint16_t maxVal, uint16_t *pos) { +const AdjustMenuEntry ctouchAdjustMenu = { + "TOUCH SENSE", + { + { &ctouchThrVal, ctouchLoLimit, ctouchHiLimit }, + { nullptr, 0, 0 } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(CTOUCH_THR_ADDR, *e.entries[0].value); + } +}; + +const AdjustMenuEntry* adjustMenuEntries[] = { + &breathAdjustMenu, + &portamentoAdjustMenu, + &pitchBendAdjustMenu, + &extraSensorAdjustMenu, + &ctouchAdjustMenu, +}; + + +static const int numAdjustEntries = ARR_LEN(adjustMenuEntries); + + + +//*********************************************************** +void drawAdjCursor(byte color) { + display.drawTriangle(16,4,20,4,18,1,color); + display.drawTriangle(16,6,20,6,18,9,color); +} + +static void drawAdjustFrame(int line) { + display.drawLine(25,line,120,line,WHITE); // Top line + display.drawLine(25,line+12,120,line+12,WHITE); // Bottom line + + display.drawLine(25,line+1,25,line+2,WHITE); + display.drawLine(120,line+1,120,line+2,WHITE); + + display.drawLine(120,line+10,120,line+11,WHITE); + display.drawLine(25,line+10,25,line+11,WHITE); +} + +static void drawAdjustBase(const char* title, bool all) { + display.clearDisplay(); + + drawAdjustFrame(17); + + // sensor marker lines. + display.drawLine(25,36,25,40,WHITE); + display.drawLine(120,36,120,40,WHITE); + + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(25,2); + display.println(title); + + display.setCursor(0,20); + display.println("THR"); + display.setCursor(0,35); + display.println("SNS"); + + + if(all) { + drawAdjustFrame(47); + display.setCursor(0,50); + display.println("MAX"); + } + cursorNow = WHITE; + drawAdjCursor(WHITE); +} + +void drawAdjustScreen(const char* title, int threshold, int maxValue, uint16_t lowLimit, uint16_t highLimit){ + drawAdjustBase(title, maxValue >= 0); + + pos1 = map(threshold, lowLimit, highLimit, 27, 119); + display.drawLine(pos1,20,pos1,26,WHITE); + + if(maxValue >= 0) { + pos2 = map(maxValue, lowLimit, highLimit, 27, 119); + display.drawLine(pos2,50,pos2,56,WHITE); + } +} + +bool drawAdjustBar(uint16_t buttons, int row, const AdjustValue* entry, uint16_t *pos) { bool updated = false; - uint16_t step = (maxVal-minVal)/92; - int val = *valPtr; + uint16_t step = (entry->limitHigh-entry->limitLow)/92; + int val = *entry->value; switch(buttons) { case BTN_UP: val += step; @@ -1046,19 +879,18 @@ bool drawAdjustBar(uint16_t buttons, int row, uint16_t *valPtr, uint16_t minVal, updated = true; break; } - if(updated) - { - *valPtr = constrain(val, minVal, maxVal); + if(updated) { + *entry->value = constrain(val, entry->limitLow, entry->limitHigh); auto p = *pos; display.drawLine(p, row, p, row+6, BLACK); - *pos = p = map(*valPtr, minVal, maxVal, 27, 119); + *pos = p = map(*entry->value, entry->limitLow, entry->limitHigh, 27, 119); display.drawLine(p, row, p, row+6, WHITE); cursorNow = BLACK; } return updated; } -static bool updateAdjustCursor(uint32_t timeNow){ +static bool updateAdjustCursor(uint32_t timeNow) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawAdjCursor(cursorNow); @@ -1078,6 +910,252 @@ static bool updateAdjustLineCursor(uint32_t timeNow, uint16_t hPos, uint16_t vPo return false; } +static void drawAdjustMenu(const AdjustMenuEntry *menu) { + + bool haveSecondValue = menu->entries[1].value != nullptr; + drawAdjustBase( menu->title, haveSecondValue ); + + pos1 = map( *menu->entries[0].value, menu->entries[0].limitLow, menu->entries[0].limitHigh, 27, 119); + display.drawLine( pos1, 20, pos1, 26, WHITE ); + + if(haveSecondValue) { + pos2 = map( *menu->entries[1].value, menu->entries[1].limitLow, menu->entries[1].limitHigh, 27, 119); + display.drawLine( pos2, 50, pos2, 56, WHITE ); + } +} + +static bool updateAdjustMenu(uint32_t timeNow, uint8_t buttons) { + bool redraw = false; + const AdjustMenuEntry *currentMenu = adjustMenuEntries[adjustOption]; + + if(stateFirstRun) { + adjustCurrent = 0; + drawAdjustMenu(currentMenu); + stateFirstRun = 0; + // the sensor pixel stuff should be refactored (to work again) + forcePix = 1; + sensorPixelPos1 = -1; // Force draw of sensor pixels + } + + if(adjustCurrent == 0) { + // Currently selecting what option to modify + redraw |= updateAdjustCursor(timeNow); + + bool save = false; + + if( buttons == BTN_DOWN ) { + adjustOption += 1; + stateFirstRun = 1; + save = true; + } + else if ( buttons == BTN_UP ) { + adjustOption -= 1; + stateFirstRun = 1; + save = true; + } + else if ( buttons == BTN_ENTER ) { + adjustCurrent = 1; + } + else if (buttons == BTN_MENU ) { + adjustCurrent = 0; + state = MAIN_MENU; + stateFirstRun = 1; + save = true; + } + + if(save && currentMenu->saveFunc) + currentMenu->saveFunc(*currentMenu); + + } else if( adjustCurrent == 1) { + if (buttons) { + drawAdjustBar( buttons, 20, ¤tMenu->entries[0], &pos1 ); + if(buttons == BTN_ENTER) adjustCurrent += 1; + else if( buttons == BTN_MENU) adjustCurrent = 0; + redraw = true; + } else { + redraw |= updateAdjustLineCursor( timeNow, pos1, 20 ); + } + } else { + if (buttons) { + drawAdjustBar( buttons, 50, ¤tMenu->entries[1], &pos2 ); + if(buttons == BTN_ENTER) adjustCurrent += 1; + else if( buttons == BTN_MENU) adjustCurrent = 0; + redraw = true; + } else { + redraw |= updateAdjustLineCursor( timeNow, pos2, 50 ); + } + } + + // Keep adjustCurrent in range + if(adjustCurrent > 2) + adjustCurrent = 0; + + // Keep adjust option in range. + if(adjustOption < 0) + adjustOption = numAdjustEntries-1; + else if (adjustOption >= numAdjustEntries) + adjustOption = 0; + + return redraw; +} + +//*********************************************************** + +static bool updateSensorPixel(int pos, int pos2) { + bool update = pos != sensorPixelPos1 || pos2 != sensorPixelPos2; + if(update) { + display.drawFastHLine(28, 38, 119-28, BLACK); // Clear old line + display.drawPixel(pos, 38, WHITE); + if( pos2 >= 0) display.drawPixel(pos2, 38, WHITE); + + sensorPixelPos1 = pos; + sensorPixelPos2 = pos2; + } + return update; +} + +void drawSensorPixels(){ + if( state != ADJUST_MENU ) + return; + + int redraw = 0; + + if(forcePix) + sensorPixelPos1 = -1; + + // This is hacky. It depends on the order of items in the adjust menu list. + if(adjustOption == 0) { + int pos = map(constrain(pressureSensor, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); + } + else if(adjustOption == 1) { + int pos = map(constrain(biteSensor,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); + } + else if(adjustOption == 2) { + int pos = map(constrain(pbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); + int pos2 = map(constrain(pbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); + redraw = updateSensorPixel(pos, pos2); + } + else if(adjustOption == 3) { + int pos = map(constrain(exSensor, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); + } + else if(adjustOption == 4) { + display.drawLine(28,38,118,38,BLACK); + for (byte i=0; i<12; i++){ + int pos = map(constrain(touchSensor.filteredData(i), ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + display.drawPixel(pos, 38, WHITE); + } + + int posRead = map(touchRead(halfPitchBendKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); + int pos = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + + posRead = map(touchRead(specialKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); + int pos2 = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + + updateSensorPixel(pos, pos2); + + redraw = 1; + } + if (redraw){ + display.display(); + } + forcePix = 0; +} + +//*********************************************************** + +static bool ExecuteMenuSelection(int cursorPosition, const struct MenuEntry *menuEntry) +{ + switch(menuEntry->type) { + case MenuType::ESub: + *((const MenuEntrySub*)menuEntry)->flag = 1; + drawMenuCursor(cursorPosition, WHITE); + drawSubBox( ((const MenuEntrySub*)menuEntry)->subTitle); + ((const MenuEntrySub*)menuEntry)->subMenuFunc(WHITE); + return true; + + case MenuType::EStateChange: + state = ((const MenuEntryStateCh*)menuEntry)->state; + stateFirstRun = 1; + break; + + case MenuType::ESubRotator: + *((const MenuEntrySubRotator*)menuEntry)->flag = ((const MenuEntrySubRotator*)menuEntry)->flagValue; + drawMenuCursor(cursorPosition, WHITE); + ((const MenuEntrySubRotator*)menuEntry)->subMenuFunc(WHITE); + break; + } + + return false; +} + +//*********************************************************** + +static bool selectMenuOption(int cursorPosition, const MenuEntry** menuEntries){ + cursorBlinkTime = millis(); + const MenuEntry* entry = menuEntries[cursorPosition]; + return ExecuteMenuSelection( cursorPosition, entry ); +} + +//*********************************************************** + +static bool handleMenuPageInput( const MenuPage &page, uint32_t timeNow ) +{ + byte cursorPos = cursors[page.cursor]; + bool redraw = false; + + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; + drawMenuCursor(cursorPos, cursorNow); + redraw = true; + cursorBlinkTime = timeNow; + } + if (buttonPressedAndNotUsed){ + + int numEntries = page.numEntries; + + buttonPressedAndNotUsed = 0; + switch (deumButtonState){ + case BTN_DOWN: + if (cursorPos < numEntries){ + drawMenuCursor(cursorPos, BLACK); + cursorPos++; + drawMenuCursor(cursorPos, WHITE); + cursorNow = BLACK; + clearSub(); + redraw = true; + } + break; + case BTN_ENTER: + // enter + redraw |= selectMenuOption(cursorPos, page.entries); + break; + case BTN_UP: + // up + if (cursorPos > 0){ + drawMenuCursor(cursorPos, BLACK); + cursorPos--; + drawMenuCursor(cursorPos, WHITE); + cursorNow = BLACK; + clearSub(); + redraw = true; + } + break; + case BTN_MENU: + // menu + state = page.parentPage; + stateFirstRun = 1; + break; + } + cursors[page.cursor] = cursorPos; + } + return redraw; +} +//*********************************************************** + + void menu() { unsigned long timeNow = millis(); bool redraw = false; @@ -1145,7 +1223,7 @@ void menu() { redraw = true; } - if (state == DISPLAYOFF_IDL){ + if (state == DISPLAYOFF_IDL) { if (stateFirstRun) { display.ssd1306_command(SSD1306_DISPLAYOFF); stateFirstRun = 0; @@ -1154,6 +1232,7 @@ void menu() { buttonPressedAndNotUsed = 0; int trills = readTrills(); switch (deumButtonState){ + case BTN_UP: // fallthrough case BTN_DOWN: // down if (trills && (fastPatch[trills-1] > 0)){ @@ -1166,6 +1245,7 @@ void menu() { state = PATCH_VIEW; stateFirstRun = 1; break; + case BTN_ENTER: // enter if (trills && (fastPatch[trills-1] > 0)){ @@ -1178,22 +1258,10 @@ void menu() { state = PATCH_VIEW; stateFirstRun = 1; break; - case BTN_UP: - // up - if (trills && (fastPatch[trills-1] > 0)){ - patch = fastPatch[trills-1]; - activePatch = 0; - doPatchUpdate = 1; - FPD = 1; - } else if (!trills) buttonPressedAndNotUsed = 1; - display.ssd1306_command(SSD1306_DISPLAYON); - state = PATCH_VIEW; - buttonPressedAndNotUsed = 1; - stateFirstRun = 1; - break; + case BTN_MENU: // menu - if (pinkyKey && (exSensor >= ((extracThrVal+extracMaxVal)/2))){ // switch breath activated legacy settings on/off + if (pinkyKey && (exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch breath activated legacy settings on/off legacyBrAct = !legacyBrAct; dipSwBits = dipSwBits ^ (1<<2); writeSetting(DIPSW_BITS_ADDR,dipSwBits); @@ -1204,7 +1272,7 @@ void menu() { digitalWrite(statusLedPin, LOW); delay(150); digitalWrite(statusLedPin,HIGH); - } else if ((exSensor >= ((extracThrVal+extracMaxVal)/2))){ // switch pb pad activated legacy settings control on/off + } else if ((exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch pb pad activated legacy settings control on/off legacy = !legacy; dipSwBits = dipSwBits ^ (1<<1); writeSetting(DIPSW_BITS_ADDR,dipSwBits); @@ -1230,7 +1298,7 @@ void menu() { _reboot_Teensyduino_(); } } - } else if (state == PATCH_VIEW){ + } else if (state == PATCH_VIEW) { if (stateFirstRun) { drawPatchView(); patchViewTime = timeNow; @@ -1264,6 +1332,7 @@ void menu() { FPD = 0; } drawPatchView(); + redraw = true; patchViewTime = timeNow; break; case BTN_ENTER: @@ -1274,6 +1343,7 @@ void menu() { doPatchUpdate = 1; FPD = 1; drawPatchView(); + redraw = true; } patchViewTime = timeNow; break; @@ -1294,6 +1364,7 @@ void menu() { FPD = 0; } drawPatchView(); + redraw = true; patchViewTime = timeNow; break; case BTN_MENU: @@ -1324,7 +1395,7 @@ void menu() { _reboot_Teensyduino_(); } } - } else if (state == MAIN_MENU){ // MAIN MENU HERE <<<<<<<<<<<<<<< + } else if (state == MAIN_MENU) { // MAIN MENU HERE <<<<<<<<<<<<<<< if (stateFirstRun) { drawMenuScreen(); stateFirstRun = 0; @@ -1341,7 +1412,7 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (transpose > 0){ - plotTranspose(BLACK); + clearSubValue(); transpose--; plotTranspose(WHITE); cursorNow = BLACK; @@ -1352,7 +1423,7 @@ void menu() { case BTN_UP: // up if (transpose < 24){ - plotTranspose(BLACK); + clearSubValue(); transpose++; plotTranspose(WHITE); cursorNow = BLACK; @@ -1383,7 +1454,8 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (octave > 0){ - plotOctave(BLACK); + clearSubValue(); + // plotOctave(BLACK); octave--; plotOctave(WHITE); cursorNow = BLACK; @@ -1394,7 +1466,8 @@ void menu() { case BTN_UP: // up if (octave < 6){ - plotOctave(BLACK); + clearSubValue(); + // plotOctave(BLACK); octave++; plotOctave(WHITE); cursorNow = BLACK; @@ -1425,7 +1498,8 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (MIDIchannel > 1){ - plotMIDI(BLACK); + // plotMIDI(BLACK); + clearSubValue(); MIDIchannel--; plotMIDI(WHITE); cursorNow = BLACK; @@ -1454,7 +1528,8 @@ void menu() { case BTN_UP: // up if (MIDIchannel < 16){ - plotMIDI(BLACK); + clearSubValue(); + // plotMIDI(BLACK); MIDIchannel++; plotMIDI(WHITE); cursorNow = BLACK; @@ -1495,7 +1570,7 @@ void menu() { break; case BTN_ENTER: // enter - redraw |= selectMainMenu(mainMenuCursor); + redraw |= selectMenuOption(mainMenuCursor, mainMenuEntries); break; case BTN_UP: // up @@ -1531,15 +1606,15 @@ void menu() { state = PATCH_VIEW; stateFirstRun = 1; clearFPS(trills); - } break; } } } - } else if (state == ROTATOR_MENU){ // ROTATOR MENU HERE <<<<<<<<<<<<<<< + } else if (state == ROTATOR_MENU) { // ROTATOR MENU HERE <<<<<<<<<<<<<<< if (stateFirstRun) { - drawRotatorMenuScreen(); + drawMenu(rotatorMenuPage); + // drawRotatorMenuScreen(); stateFirstRun = 0; } if (subParallel){ @@ -1683,12 +1758,12 @@ void menu() { redraw = true; } break; + case BTN_ENTER: - // enter - redraw |= selectRotatorMenu(rotatorMenuCursor); + redraw |= selectMenuOption(rotatorMenuCursor, rotatorMenuEntries); break; + case BTN_UP: - // up if (rotatorMenuCursor > 0){ drawMenuCursor(rotatorMenuCursor, BLACK); rotatorMenuCursor--; @@ -1698,25 +1773,24 @@ void menu() { redraw = true; } break; + case BTN_MENU: - // menu state = DISPLAYOFF_IDL; stateFirstRun = 1; break; - case 9: - //menu+down + case BTN_MENU+BTN_DOWN: break; - case 10: - //menu+enter + + case BTN_MENU+BTN_ENTER: if (trills){ state = PATCH_VIEW; stateFirstRun = 1; setFPS(trills, patch); } break; - case 12: - //menu+up + + case BTN_MENU+BTN_UP: if (trills){ state = PATCH_VIEW; stateFirstRun = 1; @@ -1727,365 +1801,21 @@ void menu() { } } // end rotator menu - } else if (state == BREATH_ADJ_IDL){ - if (stateFirstRun) { - drawAdjustScreen("BREATH", breathThrVal, breathMaxVal, breathLoLimit, breathHiLimit); - forcePix = 1; - sensorPixelPos1 = -1; // Force draw of sensor pixels - stateFirstRun = 0; - } - redraw |=updateAdjustCursor(timeNow); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - // down - state = PORTAM_ADJ_IDL; - stateFirstRun = 1; - writeSetting(BREATH_THR_ADDR,breathThrVal); - writeSetting(BREATH_MAX_ADDR,breathMaxVal); - break; - case BTN_ENTER: - // enter - state = BREATH_ADJ_THR; - break; - case BTN_UP: - // up - state = CTOUCH_ADJ_IDL; - stateFirstRun = 1; - writeSetting(BREATH_THR_ADDR,breathThrVal); - writeSetting(BREATH_MAX_ADDR,breathMaxVal); - break; - case BTN_MENU: - // menu - state = MAIN_MENU; - stateFirstRun = 1; - writeSetting(BREATH_THR_ADDR,breathThrVal); - writeSetting(BREATH_MAX_ADDR,breathMaxVal); - break; - } - } - } else if (state == BREATH_ADJ_THR){ - redraw |= updateAdjustLineCursor(timeNow, pos1, 20); - if (buttonPressedAndNotUsed){ - redraw |= drawAdjustBar(deumButtonState, 20, &breathThrVal, breathLoLimit, breathHiLimit, &pos1); - cursorBlinkTime = timeNow; - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_ENTER: - state = BREATH_ADJ_MAX; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - case BTN_MENU: - state = BREATH_ADJ_IDL; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - } - } - } else if (state == BREATH_ADJ_MAX){ - redraw |= updateAdjustLineCursor(timeNow, pos2, 50); - if (buttonPressedAndNotUsed){ - redraw |= drawAdjustBar(deumButtonState, 50, &breathMaxVal, breathLoLimit, breathHiLimit, &pos2); - cursorBlinkTime = timeNow; - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_ENTER: - case BTN_MENU: - state = BREATH_ADJ_IDL; - display.drawLine(pos2,50,pos2,56,WHITE); - redraw = true; - break; - } - } - } else if (state == PORTAM_ADJ_IDL){ - if (stateFirstRun) { - drawAdjustScreen("PORTAMENTO", portamThrVal, portamMaxVal, portamLoLimit, portamHiLimit); - forcePix = 1; - stateFirstRun = 0; - } - redraw |= updateAdjustCursor(timeNow); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - // down - state = PITCHB_ADJ_IDL; - stateFirstRun = 1; - writeSetting(PORTAM_THR_ADDR,portamThrVal); - writeSetting(PORTAM_MAX_ADDR,portamMaxVal); - break; - case BTN_ENTER: - // enter - state = PORTAM_ADJ_THR; - break; - case BTN_UP: - // up - state = BREATH_ADJ_IDL; - stateFirstRun = 1; - writeSetting(PORTAM_THR_ADDR,portamThrVal); - writeSetting(PORTAM_MAX_ADDR,portamMaxVal); - break; - case BTN_MENU: - // menu - state = MAIN_MENU; - stateFirstRun = 1; - writeSetting(PORTAM_THR_ADDR,portamThrVal); - writeSetting(PORTAM_MAX_ADDR,portamMaxVal); - break; - } - } - } else if (state == PORTAM_ADJ_THR){ - redraw |= updateAdjustLineCursor(timeNow, pos1, 20); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - redraw |= drawAdjustBar(deumButtonState, 20, &portamThrVal, portamLoLimit, portamHiLimit, &pos1); - cursorBlinkTime = timeNow; - switch (deumButtonState){ - case BTN_ENTER: - // enter - state = PORTAM_ADJ_MAX; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - case BTN_MENU: - // menu - state = PORTAM_ADJ_IDL; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - } - } - } else if (state == PORTAM_ADJ_MAX){ - redraw |= updateAdjustLineCursor(timeNow, pos2, 50); - if (buttonPressedAndNotUsed){ - // TODO: Ask Johan what the minOffset is for... - // if ((portamMaxVal - portamStep) > (portamThrVal + minOffset)){ + } else if (state == ADJUST_MENU) { - redraw |= drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); - cursorBlinkTime = timeNow; - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_ENTER: - case BTN_MENU: - state = PORTAM_ADJ_IDL; - display.drawLine(pos2,50,pos2,56,WHITE); - redraw = true; - break; - } - } - } else if (state == PITCHB_ADJ_IDL){ - if (stateFirstRun) { - drawAdjustScreen("PITCH BEND", pitchbThrVal, pitchbMaxVal, pitchbLoLimit, pitchbHiLimit); - // drawPitchbScreen(); - forcePix = 1; - stateFirstRun = 0; - } - redraw |= updateAdjustCursor(timeNow); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - // down - state = EXTRAC_ADJ_IDL; - stateFirstRun = 1; - writeSetting(PITCHB_THR_ADDR,pitchbThrVal); - writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); - break; - case BTN_ENTER: - // enter - state = PITCHB_ADJ_THR; - break; - case BTN_UP: - // up - state = PORTAM_ADJ_IDL; - stateFirstRun = 1; - writeSetting(PITCHB_THR_ADDR,pitchbThrVal); - writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); - break; - case BTN_MENU: - // menu - state = MAIN_MENU; - stateFirstRun = 1; - writeSetting(PITCHB_THR_ADDR,pitchbThrVal); - writeSetting(PITCHB_MAX_ADDR,pitchbMaxVal); - break; - } - } - } else if (state == PITCHB_ADJ_THR){ - redraw |= updateAdjustLineCursor(timeNow, pos1, 20); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - cursorBlinkTime = timeNow; - redraw |= drawAdjustBar(deumButtonState, 20, &pitchbThrVal, pitchbLoLimit, pitchbHiLimit, &pos1); - switch (deumButtonState){ - case BTN_ENTER: - // enter - state = PITCHB_ADJ_MAX; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - case BTN_MENU: - // menu - state = PITCHB_ADJ_IDL; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - } - } - } else if (state == PITCHB_ADJ_MAX){ - redraw |= updateAdjustLineCursor(timeNow, pos2, 50); - if (buttonPressedAndNotUsed){ - redraw |= drawAdjustBar(deumButtonState, 50, &portamMaxVal, portamLoLimit, portamHiLimit, &pos2); - cursorBlinkTime = timeNow; - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_ENTER: - case BTN_MENU: - state = PITCHB_ADJ_IDL; - display.drawLine(pos2,50,pos2,56,WHITE); - redraw = true; - break; - } - } + // This is a hack to update touch_Thr is it was changed.. + int old_thr = ctouchThrVal; + redraw |= updateAdjustMenu( timeNow, buttonPressedAndNotUsed ? deumButtonState : 0 ); + buttonPressedAndNotUsed = 0; - } else if (state == EXTRAC_ADJ_IDL){ - if (stateFirstRun) { - drawAdjustScreen("EXTRA CONTROLLER", extracThrVal, extracMaxVal, extracLoLimit, extracHiLimit); - forcePix = 1; - stateFirstRun = 0; + if( old_thr != ctouchThrVal) { + // Question: Why not used the built-in threshold in the touch sensor? + touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); } - - redraw |= updateAdjustCursor(timeNow); - - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - // down - state = CTOUCH_ADJ_IDL; - stateFirstRun = 1; - writeSetting(EXTRAC_THR_ADDR,extracThrVal); - writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); - break; - case BTN_ENTER: - // enter - state = EXTRAC_ADJ_THR; - break; - case BTN_UP: - // up - state = PITCHB_ADJ_IDL; - stateFirstRun = 1; - writeSetting(EXTRAC_THR_ADDR,extracThrVal); - writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); - break; - case BTN_MENU: - // menu - state = MAIN_MENU; - stateFirstRun = 1; - writeSetting(EXTRAC_THR_ADDR,extracThrVal); - writeSetting(EXTRAC_MAX_ADDR,extracMaxVal); - break; - } - } - } else if (state == EXTRAC_ADJ_THR){ - redraw |= updateAdjustLineCursor(timeNow, pos1, 20); - - if (buttonPressedAndNotUsed){ - cursorBlinkTime = timeNow; - buttonPressedAndNotUsed = 0; - redraw |= drawAdjustBar(deumButtonState, 20, &extracThrVal, extracLoLimit, extracHiLimit, &pos1); - switch (deumButtonState){ - case BTN_ENTER: - state = EXTRAC_ADJ_MAX; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - case BTN_MENU: - state = EXTRAC_ADJ_IDL; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - } - } - } else if (state == EXTRAC_ADJ_MAX){ - redraw |= updateAdjustLineCursor(timeNow, pos2, 50); - if (buttonPressedAndNotUsed){ - redraw |= drawAdjustBar(deumButtonState, 50, &extracMaxVal, extracLoLimit, extracHiLimit, &pos2); - - cursorBlinkTime = timeNow; - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_ENTER: - case BTN_MENU: - state = EXTRAC_ADJ_IDL; - display.drawLine(pos2,50,pos2,56,WHITE); - redraw = true; - break; - } - } - - } else if (state == CTOUCH_ADJ_IDL){ - if (stateFirstRun) { - drawAdjustScreen("TOUCH SENSE", ctouchThrVal, -1, ctouchLoLimit, ctouchHiLimit); - forcePix = 1; - stateFirstRun = 0; - } - redraw |= updateAdjustCursor(timeNow); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - // down - state = BREATH_ADJ_IDL; - stateFirstRun = 1; - writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); - break; - case BTN_ENTER: - // enter - state = CTOUCH_ADJ_THR; - break; - case BTN_UP: - // up - state = EXTRAC_ADJ_IDL; - stateFirstRun = 1; - writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); - break; - case BTN_MENU: - // menu - state = MAIN_MENU; - stateFirstRun = 1; - writeSetting(CTOUCH_THR_ADDR,ctouchThrVal); - break; - } - } - } else if (state == CTOUCH_ADJ_THR){ - redraw |= updateAdjustLineCursor(timeNow, pos1, 20); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - - bool updated = drawAdjustBar(deumButtonState, 20, &ctouchThrVal, ctouchLoLimit, ctouchHiLimit, &pos1); - if(updated) { - touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); - redraw = true; - } - - switch (deumButtonState){ - case BTN_ENTER: - case BTN_MENU: - state = CTOUCH_ADJ_IDL; - display.drawLine(pos1,20,pos1,26,WHITE); - redraw = true; - break; - } - } - - } else if (state == SETUP_BR_MENU) { // SETUP BREATH MENU HERE <<<<<<<<<<<<<< if (stateFirstRun) { - drawSetupBrMenuScreen(); + drawMenu( breathMenuPage ); stateFirstRun = 0; } if (subBreathCC){ @@ -2099,7 +1829,6 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotBreathCC(BLACK); if (breathCC > 0){ breathCC--; } else { @@ -2108,8 +1837,6 @@ void menu() { cursorBlinkTime = timeNow; break; case BTN_UP: - // up - plotBreathCC(BLACK); if (breathCC < 10){ breathCC++; } else { @@ -2127,6 +1854,7 @@ void menu() { } break; } + clearSubValue(); plotBreathCC(WHITE); cursorNow = BLACK; redraw = true; @@ -2142,13 +1870,13 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotBreathAT(BLACK); + clearSubValue(); breathAT=!breathAT; cursorBlinkTime = timeNow; break; case BTN_UP: // up - plotBreathAT(BLACK); + clearSubValue(); breathAT=!breathAT; cursorBlinkTime = timeNow; break; @@ -2177,14 +1905,14 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotVelocity(BLACK); + clearSubValue(); if (velocity > 0){ velocity--; } else velocity = 127; cursorBlinkTime = timeNow; break; case BTN_UP: - plotVelocity(BLACK); + clearSubValue(); if (velocity < 127){ velocity++; } else velocity = 0; @@ -2212,7 +1940,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotCurve(BLACK); + clearSubValue(); if (curve > 0){ curve--; } else curve = 12; @@ -2221,7 +1949,7 @@ void menu() { break; case BTN_UP: // up - plotCurve(BLACK); + clearSubValue(); if (curve < 12){ curve++; } else curve = 0; @@ -2290,7 +2018,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotVelBias(BLACK); + clearSubValue(); if (velBias > 0){ velBias--; } else velBias = 9; @@ -2305,7 +2033,7 @@ void menu() { break; case BTN_UP: // up - plotVelBias(BLACK); + clearSubValue(); if (velBias < 9){ velBias++; } else velBias = 0; @@ -2324,53 +2052,14 @@ void menu() { } } else { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawMenuCursor(setupBrMenuCursor, cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (setupBrMenuCursor < 5){ - drawMenuCursor(setupBrMenuCursor, BLACK); - setupBrMenuCursor++; - drawMenuCursor(setupBrMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_ENTER: - // enter - redraw |= selectSetupBrMenu(setupBrMenuCursor); - break; - case BTN_UP: - // up - if (setupBrMenuCursor > 0){ - drawMenuCursor(setupBrMenuCursor, BLACK); - setupBrMenuCursor--; - drawMenuCursor(setupBrMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_MENU: - // menu - state = MAIN_MENU; - stateFirstRun = 1; - break; - } - } + redraw |= handleMenuPageInput( breathMenuPage, timeNow ); } } else if (state == SETUP_CT_MENU) { // SETUP CONTROLLERS MENU HERE <<<<<<<<<<<<< - if (stateFirstRun) { - drawSetupCtMenuScreen(); + if (stateFirstRun) { + drawMenu( controlMenuPage ); + // drawSetupCtMenuScreen(); stateFirstRun = 0; } if (subPort){ @@ -2580,54 +2269,13 @@ void menu() { } } } else { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawMenuCursor(setupCtMenuCursor, cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (setupCtMenuCursor < 5){ - drawMenuCursor(setupCtMenuCursor, BLACK); - setupCtMenuCursor++; - drawMenuCursor(setupCtMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_ENTER: - // enter - redraw |= selectSetupCtMenu(setupCtMenuCursor); - break; - case BTN_UP: - // up - if (setupCtMenuCursor > 0){ - drawMenuCursor(setupCtMenuCursor, BLACK); - setupCtMenuCursor--; - drawMenuCursor(setupCtMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_MENU: - // menu - state = MAIN_MENU; - stateFirstRun = 1; - break; - } - } + redraw |= handleMenuPageInput( controlMenuPage, timeNow ); } - - } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< - if (stateFirstRun) { - drawVibratoMenuScreen(); + } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< + if (stateFirstRun) { + drawMenu(vibratoMenuPage); stateFirstRun = 0; } if (subVibrato) { @@ -2829,47 +2477,7 @@ void menu() { redraw = true; } } else { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawMenuCursor(vibratoMenuCursor, cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (vibratoMenuCursor < 4){ - drawMenuCursor(vibratoMenuCursor, BLACK); - vibratoMenuCursor++; - drawMenuCursor(vibratoMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_ENTER: - // enter - redraw |= selectVibratoMenu(vibratoMenuCursor); - break; - case BTN_UP: - // up - if (vibratoMenuCursor > 0){ - drawMenuCursor(vibratoMenuCursor, BLACK); - vibratoMenuCursor--; - drawMenuCursor(vibratoMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_MENU: - // menu - state = SETUP_CT_MENU; - stateFirstRun = 1; - break; - } - } + redraw |= handleMenuPageInput( vibratoMenuPage, timeNow ); } } diff --git a/NuEVI/menu.h b/NuEVI/menu.h index a2e5d4d..57485ab 100644 --- a/NuEVI/menu.h +++ b/NuEVI/menu.h @@ -11,28 +11,13 @@ #define DISPLAYOFF_IDL 0 #define MAIN_MENU 1 #define PATCH_VIEW 2 -#define BREATH_ADJ_IDL 10 -#define BREATH_ADJ_THR 11 -#define BREATH_ADJ_MAX 12 -#define PORTAM_ADJ_IDL 20 -#define PORTAM_ADJ_THR 21 -#define PORTAM_ADJ_MAX 22 -#define PITCHB_ADJ_IDL 30 -#define PITCHB_ADJ_THR 31 -#define PITCHB_ADJ_MAX 32 -#define EXTRAC_ADJ_IDL 40 -#define EXTRAC_ADJ_THR 41 -#define EXTRAC_ADJ_MAX 42 -#define VIBRAT_ADJ_IDL 50 -#define VIBRAT_ADJ_THR 51 -#define VIBRAT_ADJ_DPT 52 -#define CTOUCH_ADJ_IDL 60 -#define CTOUCH_ADJ_THR 61 +#define ADJUST_MENU 70 #define SETUP_BR_MENU 80 #define SETUP_CT_MENU 90 #define ROTATOR_MENU 100 #define VIBRATO_MENU 110 + extern byte subVibSquelch; void initDisplay(); diff --git a/NuEVI/numenu.h b/NuEVI/numenu.h index bc31595..f3ac0ff 100644 --- a/NuEVI/numenu.h +++ b/NuEVI/numenu.h @@ -1,31 +1,66 @@ #ifndef __NUMENU_H #define __NUMENU_H -#include -#include +//*********************************************************** -#define MAX_DEPTH 16 - -class Adafruit_SSD1306; - -class NuMenu -{ -public: - NuMenu(Adafruit_SSD1306 &gfx); - - bool init(); - void update(uint16_t buttonState); - - void setEnabled(bool state) { _enabled = state; } - - static void drawMenuItems(const char* title, const char* entries[], int count, int selection, int offset = 0); - -private: - bool _enabled; - // MenuPageState _rootMenu; - // MenuPageState _pageStack[MAX_DEPTH]; - - Adafruit_SSD1306 &_display; +enum MenuType { + ESub, + ESubRotator, + EStateChange, }; +struct MenuEntry { + enum MenuType type; + const char* title; +}; + +struct MenuEntrySub { + enum MenuType type; + const char* title; + const char* subTitle; + byte* flag; + void (*subMenuFunc)(int color); +}; + +struct MenuEntrySubRotator { + enum MenuType type; + const char* title; + const char* subTitle; + byte flagValue; + byte* flag; + void (*subMenuFunc)(int color); +}; + +struct MenuEntryStateCh { + enum MenuType type; + const char* title; + byte state; +}; + +struct MenuPage { + const char* title; + byte cursor; + byte parentPage; + byte numEntries; + const MenuEntry** entries; +}; + + +//*********************************************************** + + + +struct AdjustValue { + uint16_t *value; + uint16_t limitLow; + uint16_t limitHigh; +}; + +struct AdjustMenuEntry { + const char* title; + AdjustValue entries[2]; + void (*saveFunc)(const AdjustMenuEntry&); +}; + + #endif From 4c4d0e8b5acc97a98a6b390fa5437392240b4f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 16:43:40 +0200 Subject: [PATCH 06/35] Unified main and patch menu input handling Now all menu pages are handled the same way, which is great because now I can implement scrolling in the menu pages. --- NuEVI/NuEVI.ino | 15 --- NuEVI/menu.cpp | 337 ++++++++++++++++-------------------------------- 2 files changed, 112 insertions(+), 240 deletions(-) diff --git a/NuEVI/NuEVI.ino b/NuEVI/NuEVI.ino index 3492201..efc4e0f 100644 --- a/NuEVI/NuEVI.ino +++ b/NuEVI/NuEVI.ino @@ -86,21 +86,6 @@ int parallel = 7; // semitones byte gateOpen = 0; // setting for gate always open, note on sent for every time fingering changes, no matter the breath status - -// // MAybe move these to config.h (as defines?) -// const uint16_t breathLoLimit = 0; -// const uint16_t breathHiLimit = 4095; -// const uint16_t portamLoLimit = 700; -// const uint16_t portamHiLimit = 4700; -// const uint16_t pitchbLoLimit = 500; -// const uint16_t pitchbHiLimit = 4000; -// const uint16_t extracLoLimit = 500; -// const uint16_t extracHiLimit = 4000; -// const uint16_t ctouchLoLimit = 50; -// const uint16_t ctouchHiLimit = 350; -// const uint16_t ttouchLoLimit = 50; -// const uint16_t ttouchHiLimit = 1900; - int touch_Thr = 1300; byte ccList[11] = {0,1,2,7,11,1,2,7,11,74,20}; // OFF, Modulation, Breath, Volume, Expression (then same sent in hires), CC74 (cutoff/brightness), CC20 diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index bcafcfb..e3785a1 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -40,10 +40,6 @@ enum CursorIdx { static byte cursors[CursorIdx::NUM_CURSORS]; -// These two should -static byte mainMenuCursor = 0; -static byte rotatorMenuCursor = 0; - static byte cursorNow; static byte forceRedraw = 0; @@ -655,7 +651,7 @@ const MenuEntry* rotatorMenuEntries[] = { const MenuPage rotatorMenuPage = { "ROTATOR SETUP", CursorIdx::ERotator, - MAIN_MENU, + DISPLAYOFF_IDL, ARR_LEN(rotatorMenuEntries), rotatorMenuEntries }; @@ -781,7 +777,6 @@ const AdjustMenuEntry extraSensorAdjustMenu = { } }; - const AdjustMenuEntry ctouchAdjustMenu = { "TOUCH SENSE", { @@ -801,11 +796,8 @@ const AdjustMenuEntry* adjustMenuEntries[] = { &ctouchAdjustMenu, }; - static const int numAdjustEntries = ARR_LEN(adjustMenuEntries); - - //*********************************************************** void drawAdjCursor(byte color) { display.drawTriangle(16,4,20,4,18,1,color); @@ -1101,64 +1093,88 @@ static bool selectMenuOption(int cursorPosition, const MenuEntry** menuEntries){ //*********************************************************** -static bool handleMenuPageInput( const MenuPage &page, uint32_t timeNow ) -{ +static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { byte cursorPos = cursors[page.cursor]; + byte newPos = cursorPos; bool redraw = false; - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (buttonPressedAndNotUsed) { + + int lastEntry = page.numEntries-1; + + buttonPressedAndNotUsed = 0; + switch (deumButtonState) { + case BTN_DOWN: + if (cursorPos < lastEntry) + newPos = cursorPos+1; + break; + + case BTN_ENTER: + redraw |= selectMenuOption(cursorPos, page.entries); + break; + + case BTN_UP: + if (cursorPos > 0) + newPos = cursorPos-1; + break; + + case BTN_MENU: + state = page.parentPage; + stateFirstRun = 1; + break; + } + + if(newPos != cursorPos) { + drawMenuCursor(cursorPos, BLACK); + drawMenuCursor(newPos, WHITE); + cursorNow = BLACK; + clearSub(); + redraw = true; + cursors[page.cursor] = newPos; + } + } else if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + // Only need to update cursor blink if no buttons were pressed if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; drawMenuCursor(cursorPos, cursorNow); redraw = true; cursorBlinkTime = timeNow; } - if (buttonPressedAndNotUsed){ - int numEntries = page.numEntries; - - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (cursorPos < numEntries){ - drawMenuCursor(cursorPos, BLACK); - cursorPos++; - drawMenuCursor(cursorPos, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_ENTER: - // enter - redraw |= selectMenuOption(cursorPos, page.entries); - break; - case BTN_UP: - // up - if (cursorPos > 0){ - drawMenuCursor(cursorPos, BLACK); - cursorPos--; - drawMenuCursor(cursorPos, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_MENU: - // menu - state = page.parentPage; - stateFirstRun = 1; - break; - } - cursors[page.cursor] = cursorPos; - } return redraw; } -//*********************************************************** +//*********************************************************** +static void checkForPatchView() +{ + int trills = readTrills(); + + switch (deumButtonState){ + case BTN_MENU+BTN_DOWN: + break; + + case BTN_MENU+BTN_ENTER: + if (trills){ + state = PATCH_VIEW; + stateFirstRun = 1; + setFPS(trills, patch); + } + break; + + case BTN_MENU+BTN_UP: + if (trills){ + state = PATCH_VIEW; + stateFirstRun = 1; + clearFPS(trills); + } + break; + } +} + +//*********************************************************** void menu() { unsigned long timeNow = millis(); - bool redraw = 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)); @@ -1219,10 +1235,6 @@ void menu() { subVibDirection = 0; } - if (stateFirstRun) { - redraw = true; - } - if (state == DISPLAYOFF_IDL) { if (stateFirstRun) { display.ssd1306_command(SSD1306_DISPLAYOFF); @@ -1234,33 +1246,28 @@ void menu() { switch (deumButtonState){ case BTN_UP: // fallthrough case BTN_DOWN: - // down if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; activePatch = 0; doPatchUpdate = 1; FPD = 1; } else if (!trills) buttonPressedAndNotUsed = 1; - display.ssd1306_command(SSD1306_DISPLAYON); state = PATCH_VIEW; stateFirstRun = 1; break; case BTN_ENTER: - // enter if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; activePatch = 0; doPatchUpdate = 1; FPD = 1; } - display.ssd1306_command(SSD1306_DISPLAYON); state = PATCH_VIEW; stateFirstRun = 1; break; case BTN_MENU: - // menu if (pinkyKey && (exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch breath activated legacy settings on/off legacyBrAct = !legacyBrAct; dipSwBits = dipSwBits ^ (1<<2); @@ -1293,6 +1300,7 @@ void menu() { stateFirstRun = 1; } break; + case 15: //all keys depressed, reboot to programming mode _reboot_Teensyduino_(); @@ -1300,6 +1308,7 @@ void menu() { } } else if (state == PATCH_VIEW) { if (stateFirstRun) { + display.ssd1306_command(SSD1306_DISPLAYON); drawPatchView(); patchViewTime = timeNow; stateFirstRun = 0; @@ -1313,6 +1322,7 @@ void menu() { } if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; + patchViewTime = timeNow; int trills = readTrills(); switch (deumButtonState){ case BTN_DOWN: @@ -1333,7 +1343,6 @@ void menu() { } drawPatchView(); redraw = true; - patchViewTime = timeNow; break; case BTN_ENTER: // enter @@ -1345,7 +1354,6 @@ void menu() { drawPatchView(); redraw = true; } - patchViewTime = timeNow; break; case BTN_UP: // up @@ -1365,10 +1373,9 @@ void menu() { } drawPatchView(); redraw = true; - patchViewTime = timeNow; break; + case BTN_MENU: - // menu if (FPD < 2){ state = DISPLAYOFF_IDL; stateFirstRun = 1; @@ -1377,8 +1384,8 @@ void menu() { writeSetting(PATCH_ADDR,patch); FPD = 0; break; - case 10: - // enter + menu + + case BTN_MENU+BTN_ENTER: midiPanic(); display.clearDisplay(); display.setTextColor(WHITE); @@ -1388,9 +1395,9 @@ void menu() { display.setCursor(35,30); display.println("PANIC"); redraw = true; - patchViewTime = timeNow; break; - case 15: + + case BTN_MENU+BTN_ENTER+BTN_UP+BTN_DOWN: //all keys depressed, reboot to programming mode _reboot_Teensyduino_(); } @@ -1498,7 +1505,6 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (MIDIchannel > 1){ - // plotMIDI(BLACK); clearSubValue(); MIDIchannel--; plotMIDI(WHITE); @@ -1507,8 +1513,8 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_ENTER: - // enter readSwitches(); if (pinkyKey){ slowMidi = !slowMidi; @@ -1525,11 +1531,10 @@ void menu() { writeSetting(MIDI_ADDR,MIDIchannel); } break; + case BTN_UP: - // up if (MIDIchannel < 16){ clearSubValue(); - // plotMIDI(BLACK); MIDIchannel++; plotMIDI(WHITE); cursorNow = BLACK; @@ -1537,8 +1542,8 @@ void menu() { cursorBlinkTime = timeNow; } break; + case BTN_MENU: - // menu plotMIDI(WHITE); cursorNow = BLACK; redraw = true; @@ -1548,73 +1553,14 @@ void menu() { } } } else { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawMenuCursor(mainMenuCursor, cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - int trills = readTrills(); - switch (deumButtonState){ - case BTN_DOWN: - if (mainMenuCursor < 5){ - drawMenuCursor(mainMenuCursor, BLACK); - mainMenuCursor++; - drawMenuCursor(mainMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_ENTER: - // enter - redraw |= selectMenuOption(mainMenuCursor, mainMenuEntries); - break; - case BTN_UP: - // up - if (mainMenuCursor > 0){ - drawMenuCursor(mainMenuCursor, BLACK); - mainMenuCursor--; - drawMenuCursor(mainMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - case BTN_MENU: - // menu - state = DISPLAYOFF_IDL; - stateFirstRun = 1; - break; - case BTN_MENU+BTN_DOWN: - //menu+down - - break; - case BTN_MENU+BTN_ENTER: - //menu+enter - if (trills){ - state = PATCH_VIEW; - stateFirstRun = 1; - setFPS(trills, patch); - } - break; - case BTN_MENU+BTN_UP: - //menu+up - if (trills){ - state = PATCH_VIEW; - stateFirstRun = 1; - clearFPS(trills); - } - break; - } - } + bool hadButtons = buttonPressedAndNotUsed; + redraw |= updateMenuPage( mainMenuPage, timeNow ); + if (hadButtons) + checkForPatchView(); } } else if (state == ROTATOR_MENU) { // ROTATOR MENU HERE <<<<<<<<<<<<<<< if (stateFirstRun) { drawMenu(rotatorMenuPage); - // drawRotatorMenuScreen(); stateFirstRun = 0; } if (subParallel){ @@ -1679,7 +1625,7 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (rotations[subRotator-1] > -24){ - plotRotator(BLACK,rotations[subRotator-1]); + clearSubValue(); rotations[subRotator-1]--; plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; @@ -1690,7 +1636,7 @@ void menu() { case BTN_UP: // up if (rotations[subRotator-1] < 24){ - plotRotator(BLACK,rotations[subRotator-1]); + clearSubValue(); rotations[subRotator-1]++; plotRotator(WHITE,rotations[subRotator-1]); cursorNow = BLACK; @@ -1722,7 +1668,7 @@ void menu() { case BTN_DOWN: case BTN_UP: // up - plotPriority(BLACK); + clearSubValue(); priority = !priority; cursorBlinkTime = timeNow; break; @@ -1738,67 +1684,10 @@ void menu() { redraw = true; } } else { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawMenuCursor(rotatorMenuCursor, cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - int trills = readTrills(); - switch (deumButtonState){ - case BTN_DOWN: - if (rotatorMenuCursor < 5){ - drawMenuCursor(rotatorMenuCursor, BLACK); - rotatorMenuCursor++; - drawMenuCursor(rotatorMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - - case BTN_ENTER: - redraw |= selectMenuOption(rotatorMenuCursor, rotatorMenuEntries); - break; - - case BTN_UP: - if (rotatorMenuCursor > 0){ - drawMenuCursor(rotatorMenuCursor, BLACK); - rotatorMenuCursor--; - drawMenuCursor(rotatorMenuCursor, WHITE); - cursorNow = BLACK; - clearSub(); - redraw = true; - } - break; - - case BTN_MENU: - state = DISPLAYOFF_IDL; - stateFirstRun = 1; - break; - - case BTN_MENU+BTN_DOWN: - break; - - case BTN_MENU+BTN_ENTER: - if (trills){ - state = PATCH_VIEW; - stateFirstRun = 1; - setFPS(trills, patch); - } - break; - - case BTN_MENU+BTN_UP: - if (trills){ - state = PATCH_VIEW; - stateFirstRun = 1; - clearFPS(trills); - } - break; - } - } + bool hadButtons = buttonPressedAndNotUsed; + redraw |= updateMenuPage( rotatorMenuPage, timeNow ); + if (hadButtons) + checkForPatchView(); } // end rotator menu @@ -1979,7 +1868,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotVelSmpDl(BLACK); + clearSubValue(); if (velSmpDl > 0){ velSmpDl-=1; } else velSmpDl = 30; @@ -1988,7 +1877,7 @@ void menu() { break; case BTN_UP: // up - plotVelSmpDl(BLACK); + clearSubValue(); if (velSmpDl < 30){ velSmpDl+=1; } else velSmpDl = 0; @@ -2052,14 +1941,13 @@ void menu() { } } else { - redraw |= handleMenuPageInput( breathMenuPage, timeNow ); + redraw |= updateMenuPage( breathMenuPage, timeNow ); } } else if (state == SETUP_CT_MENU) { // SETUP CONTROLLERS MENU HERE <<<<<<<<<<<<< if (stateFirstRun) { - drawMenu( controlMenuPage ); - // drawSetupCtMenuScreen(); + drawMenu( controlMenuPage ); stateFirstRun = 0; } if (subPort){ @@ -2073,7 +1961,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotPort(BLACK); + clearSubValue(); if (portamento > 0){ portamento--; } else portamento = 2; @@ -2082,7 +1970,7 @@ void menu() { break; case BTN_UP: // up - plotPort(BLACK); + clearSubValue(); if (portamento < 2){ portamento++; } else portamento = 0; @@ -2112,7 +2000,7 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (PBdepth > 0){ - plotPB(BLACK); + clearSubValue(); PBdepth--; plotPB(WHITE); cursorNow = BLACK; @@ -2123,7 +2011,7 @@ void menu() { case BTN_UP: // up if (PBdepth < 12){ - plotPB(BLACK); + clearSubValue(); PBdepth++; plotPB(WHITE); cursorNow = BLACK; @@ -2153,7 +2041,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotExtra(BLACK); + clearSubValue(); if (extraCT > 0){ extraCT--; } else extraCT = 4; @@ -2164,7 +2052,7 @@ void menu() { break; case BTN_UP: // up - plotExtra(BLACK); + clearSubValue(); if (extraCT < 4){ extraCT++; } else extraCT = 0; @@ -2196,7 +2084,7 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (deglitch > 0){ - plotDeglitch(BLACK); + clearSubValue(); deglitch-=1; plotDeglitch(WHITE); cursorNow = BLACK; @@ -2207,7 +2095,7 @@ void menu() { case BTN_UP: // up if (deglitch < 70){ - plotDeglitch(BLACK); + clearSubValue(); deglitch+=1; plotDeglitch(WHITE); cursorNow = BLACK; @@ -2238,7 +2126,7 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (pinkySetting > 0){ - plotPinkyKey(BLACK); + clearSubValue(); pinkySetting-=1; plotPinkyKey(WHITE); cursorNow = BLACK; @@ -2249,7 +2137,7 @@ void menu() { case BTN_UP: // up if (pinkySetting < 24){ - plotPinkyKey(BLACK); + clearSubValue(); pinkySetting+=1; plotPinkyKey(WHITE); cursorNow = BLACK; @@ -2269,10 +2157,9 @@ void menu() { } } } else { - redraw |= handleMenuPageInput( controlMenuPage, timeNow ); + redraw |= updateMenuPage( controlMenuPage, timeNow ); } - } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< if (stateFirstRun) { drawMenu(vibratoMenuPage); @@ -2373,7 +2260,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotVibRetn(BLACK); + clearSubValue(); if (vibRetn > 0){ vibRetn--; } @@ -2382,7 +2269,7 @@ void menu() { break; case BTN_UP: // up - plotVibRetn(BLACK); + clearSubValue(); if (vibRetn < 4){ vibRetn++; } @@ -2412,7 +2299,7 @@ void menu() { switch (deumButtonState){ case BTN_DOWN: if (vibSquelch > 1){ - plotVibSquelch(BLACK); + clearSubValue(); vibSquelch--; plotVibSquelch(WHITE); cursorNow = BLACK; @@ -2423,7 +2310,7 @@ void menu() { case BTN_UP: // up if (vibSquelch < 30){ - plotVibSquelch(BLACK); + clearSubValue(); vibSquelch++; plotVibSquelch(WHITE); cursorNow = BLACK; @@ -2453,14 +2340,14 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - plotVibDirection(BLACK); + clearSubValue(); vibDirection = !vibDirection; plotVibDirection(WHITE); cursorBlinkTime = timeNow; break; case BTN_UP: // up - plotVibDirection(BLACK); + clearSubValue(); vibDirection = !vibDirection; plotVibDirection(WHITE); cursorBlinkTime = timeNow; @@ -2477,7 +2364,7 @@ void menu() { redraw = true; } } else { - redraw |= handleMenuPageInput( vibratoMenuPage, timeNow ); + redraw |= updateMenuPage( vibratoMenuPage, timeNow ); } } From bd84f16b1a688027476f51872b6284c82aa658a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 19:11:48 +0200 Subject: [PATCH 07/35] Removed an unused function --- NuEVI/menu.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index e3785a1..6537d44 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -844,19 +844,7 @@ static void drawAdjustBase(const char* title, bool all) { drawAdjCursor(WHITE); } -void drawAdjustScreen(const char* title, int threshold, int maxValue, uint16_t lowLimit, uint16_t highLimit){ - drawAdjustBase(title, maxValue >= 0); - - pos1 = map(threshold, lowLimit, highLimit, 27, 119); - display.drawLine(pos1,20,pos1,26,WHITE); - - if(maxValue >= 0) { - pos2 = map(maxValue, lowLimit, highLimit, 27, 119); - display.drawLine(pos2,50,pos2,56,WHITE); - } -} - -bool drawAdjustBar(uint16_t buttons, int row, const AdjustValue* entry, uint16_t *pos) { +static bool drawAdjustBar(uint16_t buttons, int row, const AdjustValue* entry, uint16_t *pos) { bool updated = false; uint16_t step = (entry->limitHigh-entry->limitLow)/92; int val = *entry->value; From 2ea76d96d37b11dfbff21be48997d5780c39bb15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 19:50:54 +0200 Subject: [PATCH 08/35] Unified sub menu cursor blink --- NuEVI/menu.cpp | 262 +++++++++++++++---------------------------------- 1 file changed, 80 insertions(+), 182 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 6537d44..0013351 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -222,6 +222,21 @@ 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; + + 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; + return true; + } + return false; +} static void drawMenu(const MenuPage &page, const char* customTitle = nullptr) { //Initialize display and draw menu header + line @@ -561,7 +576,9 @@ static void drawSubRotator(int __unused color){ forceRedraw = 1; } +//*********************************************************** +// TODO: Move these to a settings.cpp maybe? void writeSetting(byte address, unsigned short value){ union { byte v[2]; @@ -582,7 +599,6 @@ unsigned short readSetting(byte address){ return data.val; } - //*********************************************************** static int readTrills() { @@ -799,7 +815,7 @@ const AdjustMenuEntry* adjustMenuEntries[] = { static const int numAdjustEntries = ARR_LEN(adjustMenuEntries); //*********************************************************** -void drawAdjCursor(byte color) { +static void drawAdjCursor(byte color) { display.drawTriangle(16,4,20,4,18,1,color); display.drawTriangle(16,6,20,6,18,9,color); } @@ -1396,12 +1412,7 @@ void menu() { stateFirstRun = 0; } if (subTranspose){ - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotTranspose(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1438,12 +1449,7 @@ void menu() { } } } else if (subOctave){ - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotOctave(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1482,12 +1488,7 @@ void menu() { } } } else if (subMIDI) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotMIDI(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1696,12 +1697,7 @@ void menu() { stateFirstRun = 0; } if (subBreathCC){ - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotBreathCC(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1737,12 +1733,7 @@ void menu() { redraw = true; } } else if (subBreathAT) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotBreathAT(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1772,12 +1763,7 @@ void menu() { redraw = true; } } else if (subVelocity) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVelocity(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1807,12 +1793,7 @@ void menu() { } } else if (subCurve) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotCurve(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1846,12 +1827,7 @@ void menu() { } } else if (subVelSmpDl) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVelSmpDl(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1885,12 +1861,7 @@ void menu() { } } else if (subVelBias) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVelBias(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1939,12 +1910,9 @@ void menu() { stateFirstRun = 0; } if (subPort){ - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotPort(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + + redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); + if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1977,12 +1945,7 @@ void menu() { redraw = true; } } else if (subPB) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotPB(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2019,12 +1982,7 @@ void menu() { } } } else if (subExtra) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotExtra(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2061,12 +2019,7 @@ void menu() { } } } else if (subDeglitch) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotDeglitch(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2103,12 +2056,7 @@ void menu() { } } } else if (subPinky) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotPinkyKey(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2153,177 +2101,127 @@ void menu() { drawMenu(vibratoMenuPage); stateFirstRun = 0; } + if (subVibrato) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVibrato(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + + redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (vibrato > 0){ - plotVibrato(BLACK); + if (vibrato > 0) vibrato--; - plotVibrato(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (vibrato < 9){ - plotVibrato(BLACK); + if (vibrato < 9) vibrato++; - plotVibrato(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotVibrato(WHITE); - cursorNow = BLACK; - redraw = true; subVibrato = 0; writeSetting(VIBRATO_ADDR,vibrato); break; } - } - } else if (subVibSens) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVibSens(cursorNow); + clearSubValue(); + plotVibrato(WHITE); + cursorNow = BLACK; redraw = true; cursorBlinkTime = timeNow; } + } else if (subVibSens) { + + redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (vibSens > 1){ - plotVibSens(BLACK); + if (vibSens > 1) vibSens--; - plotVibSens(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (vibSens < 12){ - plotVibSens(BLACK); + if (vibSens < 12) vibSens++; - plotVibSens(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotVibSens(WHITE); - cursorNow = BLACK; - redraw = true; subVibSens = 0; writeSetting(VIB_SENS_ADDR,vibSens); break; } - } - } else if (subVibRetn) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVibRetn(cursorNow); + clearSubValue(); + plotVibSens(WHITE); + cursorNow = BLACK; redraw = true; cursorBlinkTime = timeNow; } + } else if (subVibRetn) { + + redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - clearSubValue(); - if (vibRetn > 0){ + if (vibRetn > 0) vibRetn--; - } - plotVibRetn(WHITE); - cursorBlinkTime = timeNow; break; case BTN_UP: // up - clearSubValue(); - if (vibRetn < 4){ + if (vibRetn < 4) vibRetn++; - } - plotVibRetn(WHITE); - cursorBlinkTime = timeNow; break; case BTN_ENTER: // fallthrough case BTN_MENU: // menu - plotVibRetn(WHITE); subVibRetn = 0; writeSetting(VIB_RETN_ADDR,vibRetn); break; } + cursorBlinkTime = timeNow; cursorNow = BLACK; redraw = true; + clearSubValue(); + plotVibRetn(WHITE); } } else if (subVibSquelch) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVibSquelch(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + + redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (vibSquelch > 1){ - clearSubValue(); + if (vibSquelch > 1) vibSquelch--; - plotVibSquelch(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_UP: - // up - if (vibSquelch < 30){ - clearSubValue(); + if (vibSquelch < 30) vibSquelch++; - plotVibSquelch(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu - plotVibSquelch(WHITE); - cursorNow = BLACK; - redraw = true; subVibSquelch = 0; writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; } + cursorBlinkTime = timeNow; + cursorNow = BLACK; + redraw = true; + clearSubValue(); + plotVibSquelch(WHITE); } } else if (subVibDirection) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - plotVibDirection(cursorNow); - redraw = true; - cursorBlinkTime = timeNow; - } + + redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ 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 09/35] 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(); } From 0c7bb7cc13d4d849e10b62237d6e9eee661b098e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 20:51:46 +0200 Subject: [PATCH 10/35] Pass *currentPage to functions instead of the original page data This way it will be easier to break out even more functionality into more general functions. --- NuEVI/menu.cpp | 79 +++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 6edaf37..be0c654 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -1420,7 +1420,7 @@ void menu() { } currentPage = &mainMenuPage; if (subTranspose){ - redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1443,7 +1443,7 @@ void menu() { redrawSubValue = true; } } else if (subOctave){ - redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1466,7 +1466,7 @@ void menu() { redrawSubValue = true; } } else if (subMIDI) { - redraw |= updateSubMenuCursor( mainMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1501,7 +1501,7 @@ void menu() { } } else { bool hadButtons = buttonPressedAndNotUsed; - redraw |= updateMenuPage( mainMenuPage, timeNow ); + redraw |= updateMenuPage( *currentPage, timeNow ); if (hadButtons) checkForPatchView(); } @@ -1584,7 +1584,7 @@ void menu() { cursorBlinkTime = timeNow; } } else if (subPriority){ - updateSubMenuCursor( rotatorMenuPage, timeNow ); + updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed) { buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1605,21 +1605,19 @@ void menu() { } } else { bool hadButtons = buttonPressedAndNotUsed; - redraw |= updateMenuPage( rotatorMenuPage, timeNow ); + redraw |= updateMenuPage( *currentPage, timeNow ); if (hadButtons) checkForPatchView(); } // end rotator menu } else if (state == ADJUST_MENU) { - // This is a hack to update touch_Thr is it was changed.. int old_thr = ctouchThrVal; redraw |= updateAdjustMenu( timeNow, buttonPressedAndNotUsed ? deumButtonState : 0 ); buttonPressedAndNotUsed = 0; if( old_thr != ctouchThrVal) { - // Question: Why not used the built-in threshold in the touch sensor? touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); } } else if (state == SETUP_BR_MENU) { // SETUP BREATH MENU HERE <<<<<<<<<<<<<< @@ -1629,7 +1627,7 @@ void menu() { } currentPage = &breathMenuPage; if (subBreathCC){ - redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1660,23 +1658,20 @@ void menu() { redrawSubValue = true; } } else if (subBreathAT) { - redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case BTN_DOWN: - breathAT = !breathAT; - break; - case BTN_UP: - // up + case BTN_DOWN: // fallthrough + breathAT = !breathAT; breathAT = !breathAT; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu subBreathAT = 0; if (readSetting(BREATH_AT_ADDR) != breathAT){ - writeSetting(BREATH_AT_ADDR,breathAT); + writeSetting(BREATH_AT_ADDR, breathAT); midiReset(); } break; @@ -1684,7 +1679,7 @@ void menu() { redrawSubValue = true; } } else if (subVelocity) { - redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1693,11 +1688,13 @@ void menu() { velocity--; } else velocity = 127; break; + case BTN_UP: if (velocity < 127){ velocity++; } else velocity = 0; break; + case BTN_ENTER: // fallthrough case BTN_MENU: subVelocity = 0; @@ -1708,24 +1705,24 @@ void menu() { } } else if (subCurve) { - redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: - if (curve > 0){ + if (curve > 0) curve--; - } else curve = 12; + else curve = 12; break; + case BTN_UP: - // up - if (curve < 12){ + if (curve < 12) curve++; - } else curve = 0; + else curve = 0; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu subCurve = 0; writeSetting(BREATHCURVE_ADDR,curve); break; @@ -1734,7 +1731,7 @@ void menu() { } } else if (subVelSmpDl) { - redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1760,7 +1757,7 @@ void menu() { } } else if (subVelBias) { - redraw |= updateSubMenuCursor( breathMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState) { @@ -1794,7 +1791,7 @@ void menu() { } } else { - redraw |= updateMenuPage( breathMenuPage, timeNow ); + redraw |= updateMenuPage( *currentPage, timeNow ); } @@ -1805,7 +1802,7 @@ void menu() { } currentPage = &controlMenuPage; if (subPort){ - redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1830,7 +1827,7 @@ void menu() { redrawSubValue = true; } } else if (subPB) { - redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1853,7 +1850,7 @@ void menu() { redrawSubValue = true; } } else if (subExtra) { - redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1878,7 +1875,7 @@ void menu() { redrawSubValue = true; } } else if (subDeglitch) { - redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1902,7 +1899,7 @@ void menu() { redrawSubValue = true; } } else if (subPinky) { - redraw |= updateSubMenuCursor( controlMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1925,7 +1922,7 @@ void menu() { redrawSubValue = true; } } else { - redraw |= updateMenuPage( controlMenuPage, timeNow ); + redraw |= updateMenuPage( *currentPage, timeNow ); } } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< @@ -1935,7 +1932,7 @@ void menu() { } currentPage = &vibratoMenuPage; if (subVibrato) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1958,9 +1955,7 @@ void menu() { redrawSubValue = true; } } else if (subVibSens) { - - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); - + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -1987,7 +1982,7 @@ void menu() { cursorBlinkTime = timeNow; } } else if (subVibRetn) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2010,7 +2005,7 @@ void menu() { redrawSubValue = true; } } else if (subVibSquelch) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2037,7 +2032,7 @@ void menu() { redraw = true; } } else if (subVibDirection) { - redraw |= updateSubMenuCursor( vibratoMenuPage, timeNow ); + redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; switch (deumButtonState){ @@ -2056,7 +2051,7 @@ void menu() { redrawSubValue = true; } } else { - redraw |= updateMenuPage( vibratoMenuPage, timeNow ); + redraw |= updateMenuPage( *currentPage, timeNow ); } } From 2ed201ed04e7fb986b76ce30278246696d3e159b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 21:49:51 +0200 Subject: [PATCH 11/35] Helper function to draw centered number in sub box --- NuEVI/menu.cpp | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index be0c654..2f7412a 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -195,7 +195,6 @@ void initDisplay() { display.drawBitmap(0,0,nuevi_logo_bmp,LOGO16_GLCD_WIDTH,LOGO16_GLCD_HEIGHT,1); display.display(); - // Arduino memset??? memset(cursors, 0, sizeof(cursors)); } @@ -263,8 +262,7 @@ static void drawMenu(const MenuPage &page, const char* customTitle = nullptr) { } } -void drawMenuScreen(){ - +static void drawMenuScreen() { //Construct the title including voltage reading. //Involves intricate splicing of the title string with battery voltage char menuTitle[] = "MENU XXX Y.YV"; //Allocate string buffer of appropriate size with some placeholders @@ -390,7 +388,7 @@ static void plotMIDI(int color){ display.setTextSize(2); display.setCursor(90,33); display.println(MIDIchannel); - if (slowMidi){ + if (slowMidi && color){ display.setTextColor(WHITE); } else { display.setTextColor(BLACK); @@ -409,6 +407,16 @@ static void plotSubOption(const char* label, int color) display.println(label); } +static void plotNum(int value, int color) { + int s = 0; + if(value > 99) s = 2*7; + else if(value > 9) s = 1*7; + display.setTextColor(color); + display.setTextSize(2); + display.setCursor(90-s ,33); + display.println(value); +} + static const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", "BR+", "VL+", "EX+", "CF", "20" }; @@ -488,24 +496,15 @@ static void plotVibrato(int color){ } static void plotVibSens(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(90,33); - display.println(vibSens); + plotNum(vibSens, color); } static void plotVibRetn(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(90,33); - display.println(vibRetn); + plotNum(vibRetn, color); } static void plotVibSquelch(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(83,33); - display.println(vibSquelch); + plotNum(vibSquelch, color); } static void plotVibDirection(int color){ @@ -565,8 +564,7 @@ static void plotVelBias(int color){ display.setTextColor(color); display.setTextSize(2); if (velBias){ - display.setCursor(90,33); - display.println(velBias); + plotNum(velBias, color); } else { display.setCursor(79,33); display.println("OFF"); From 8772e289070ec59521d1cdf44934b4c076582673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 21:50:46 +0200 Subject: [PATCH 12/35] Pass button state instead of accessing global variable --- NuEVI/menu.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 2f7412a..ea142fe 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -1150,11 +1150,11 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { } //*********************************************************** -static void checkForPatchView() +static void checkForPatchView(int buttons) { int trills = readTrills(); - switch (deumButtonState){ + switch (buttons){ case BTN_MENU+BTN_DOWN: break; @@ -1501,7 +1501,7 @@ void menu() { bool hadButtons = buttonPressedAndNotUsed; redraw |= updateMenuPage( *currentPage, timeNow ); if (hadButtons) - checkForPatchView(); + checkForPatchView(deumButtonState); } } else if (state == ROTATOR_MENU) { // ROTATOR MENU HERE <<<<<<<<<<<<<<< if (stateFirstRun) { @@ -1605,7 +1605,7 @@ void menu() { bool hadButtons = buttonPressedAndNotUsed; redraw |= updateMenuPage( *currentPage, timeNow ); if (hadButtons) - checkForPatchView(); + checkForPatchView(deumButtonState); } // end rotator menu From 8087f9367747ac274cc02619544d9c85aa7e3b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Fri, 21 Jun 2019 21:58:49 +0200 Subject: [PATCH 13/35] Use helper function for midi channel as well --- NuEVI/menu.cpp | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index ea142fe..36d801e 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -335,6 +335,24 @@ static void drawSubBox(const char* label) display.println(label); } +static void plotSubOption(const char* label, int color) { + display.setTextColor(color); + display.setTextSize(2); + int x_pos = 91-strlen(label)*4; + display.setCursor(x_pos,33); + display.println(label); +} + +static void plotNum(int value, int color) { + int s = 0; + if(value > 99) s = 2*7; + else if(value > 9) s = 1*7; + display.setTextColor(color); + display.setTextSize(2); + display.setCursor(90-s ,33); + display.println(value); +} + static void plotTranspose(int color){ int value = transpose - 12; const char *sign = (value < 0) ? "-":"+"; @@ -383,12 +401,9 @@ static void plotOctave(int color){ display.println(abs(octave-3)); } -static void plotMIDI(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(90,33); - display.println(MIDIchannel); - if (slowMidi && color){ +static void plotMIDI(int color) { + plotNum(MIDIchannel, color); + if (slowMidi && color) { display.setTextColor(WHITE); } else { display.setTextColor(BLACK); @@ -398,25 +413,6 @@ static void plotMIDI(int color){ display.print("S"); } -static void plotSubOption(const char* label, int color) -{ - display.setTextColor(color); - display.setTextSize(2); - int x_pos = 91-strlen(label)*4; - display.setCursor(x_pos,33); - display.println(label); -} - -static void plotNum(int value, int color) { - int s = 0; - if(value > 99) s = 2*7; - else if(value > 9) s = 1*7; - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(90-s ,33); - display.println(value); -} - static const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", "BR+", "VL+", "EX+", "CF", "20" }; From 6e0786bccb410024b165546e0d34fd9cc9b0fd82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:03:28 +0200 Subject: [PATCH 14/35] Missed a few spots for sub menu redraw --- NuEVI/menu.cpp | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 36d801e..1f5b173 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -1146,8 +1146,7 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { } //*********************************************************** -static void checkForPatchView(int buttons) -{ +static void checkForPatchView(int buttons) { int trills = readTrills(); switch (buttons){ @@ -1750,7 +1749,7 @@ void menu() { redrawSubValue = true; } - } else if (subVelBias) { + } else if (subVelBias) { redraw |= updateSubMenuCursor( *currentPage, timeNow ); if (buttonPressedAndNotUsed){ buttonPressedAndNotUsed = 0; @@ -1777,11 +1776,7 @@ void menu() { writeSetting(VEL_BIAS_ADDR,velBias); break; } - clearSubValue(); - plotVelBias(WHITE); - cursorBlinkTime = timeNow; - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else { @@ -1969,11 +1964,7 @@ void menu() { writeSetting(VIB_SENS_ADDR,vibSens); break; } - clearSubValue(); - plotVibSens(WHITE); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; + redrawSubValue = true; } } else if (subVibRetn) { redraw |= updateSubMenuCursor( *currentPage, timeNow ); @@ -2019,11 +2010,7 @@ void menu() { writeSetting(VIB_SQUELCH_ADDR,vibSquelch); break; } - clearSubValue(); - plotVibSquelch(WHITE); - cursorBlinkTime = timeNow; - cursorNow = BLACK; - redraw = true; + redrawSubValue = true; } } else if (subVibDirection) { redraw |= updateSubMenuCursor( *currentPage, timeNow ); From 1ac1b67732efc007956d1052b3d7d3f03a6355e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:07:37 +0200 Subject: [PATCH 15/35] Small bug fix --- NuEVI/menu.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 1f5b173..c7cb26f 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -1656,7 +1656,6 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: // fallthrough - breathAT = !breathAT; breathAT = !breathAT; break; From f2eabd7d375d663c414d30daa2f6a444f17b3cb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:13:42 +0200 Subject: [PATCH 16/35] Minor cleanups --- NuEVI/menu.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index c7cb26f..17b74bc 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -1244,7 +1244,7 @@ void menu() { display.ssd1306_command(SSD1306_DISPLAYOFF); stateFirstRun = 0; } - if (buttonPressedAndNotUsed){ + if (buttonPressedAndNotUsed) { buttonPressedAndNotUsed = 0; int trills = readTrills(); switch (deumButtonState){ @@ -1581,15 +1581,13 @@ void menu() { if (buttonPressedAndNotUsed) { buttonPressedAndNotUsed = 0; switch (deumButtonState){ - case BTN_DOWN: + case BTN_DOWN: // fallthrough case BTN_UP: - // up priority = !priority; - cursorBlinkTime = timeNow; break; + case BTN_ENTER: // fallthrough case BTN_MENU: - // menu subPriority = 0; writeSetting(PRIO_ADDR,priority); break; @@ -1656,6 +1654,7 @@ void menu() { buttonPressedAndNotUsed = 0; switch (deumButtonState){ case BTN_DOWN: // fallthrough + case BTN_UP: breathAT = !breathAT; break; @@ -1759,17 +1758,13 @@ void menu() { } else velBias = 9; break; - case BTN_ENTER: - subVelBias = 0; - writeSetting(VEL_BIAS_ADDR,velBias); - break; - case BTN_UP: if (velBias < 9){ velBias++; } else velBias = 0; break; + case BTN_ENTER: // fallthrough case BTN_MENU: subVelBias = 0; writeSetting(VEL_BIAS_ADDR,velBias); From b156a5935df0c5d7134ce1b3c2d156bfd21f5cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:17:08 +0200 Subject: [PATCH 17/35] Moved status led blink to function --- NuEVI/menu.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 17b74bc..bf3af12 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -1171,6 +1171,17 @@ static void checkForPatchView(int buttons) { } } +// This should be moved to a separate file/process that handles only led +void statusBlink() { + digitalWrite(statusLedPin,LOW); + delay(150); + digitalWrite(statusLedPin,HIGH); + delay(150); + digitalWrite(statusLedPin,LOW); + delay(150); + digitalWrite(statusLedPin,HIGH); +} + //*********************************************************** void menu() { @@ -1276,24 +1287,12 @@ void menu() { legacyBrAct = !legacyBrAct; dipSwBits = dipSwBits ^ (1<<2); writeSetting(DIPSW_BITS_ADDR,dipSwBits); - digitalWrite(statusLedPin,LOW); - delay(150); - digitalWrite(statusLedPin,HIGH); - delay(150); - digitalWrite(statusLedPin, LOW); - delay(150); - digitalWrite(statusLedPin,HIGH); + statusBlink(); } else if ((exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch pb pad activated legacy settings control on/off legacy = !legacy; dipSwBits = dipSwBits ^ (1<<1); writeSetting(DIPSW_BITS_ADDR,dipSwBits); - digitalWrite(statusLedPin,LOW); - delay(150); - digitalWrite(statusLedPin,HIGH); - delay(150); - digitalWrite(statusLedPin,LOW); - delay(150); - digitalWrite(statusLedPin,HIGH); + statusBlink(); } else if (pinkyKey && !specialKey){ //hold pinky key for rotator menu, and if too high touch sensing blocks regular menu, touching special key helps display.ssd1306_command(SSD1306_DISPLAYON); state = ROTATOR_MENU; From aec3ef9fc7f80c3413018600ccce65660fcd2807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:31:13 +0200 Subject: [PATCH 18/35] Use helper function to plot velocity --- NuEVI/menu.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index bf3af12..9c396b9 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -432,10 +432,7 @@ static void plotBreathAT(int color){ static void plotVelocity(int color){ if (velocity){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); - display.println(velocity); + plotNum(velocity, color); } else { plotSubOption("DYN", color); } From 3de5dd2b37af774d293f7cd81c5a2e6db008cbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:34:23 +0200 Subject: [PATCH 19/35] Even more places to use helper functions --- NuEVI/menu.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 9c396b9..9e71528 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -343,7 +343,7 @@ static void plotSubOption(const char* label, int color) { display.println(label); } -static void plotNum(int value, int color) { +static void plotSubNum(int value, int color) { int s = 0; if(value > 99) s = 2*7; else if(value > 9) s = 1*7; @@ -402,7 +402,7 @@ static void plotOctave(int color){ } static void plotMIDI(int color) { - plotNum(MIDIchannel, color); + plotSubNum(MIDIchannel, color); if (slowMidi && color) { display.setTextColor(WHITE); } else { @@ -432,7 +432,7 @@ static void plotBreathAT(int color){ static void plotVelocity(int color){ if (velocity){ - plotNum(velocity, color); + plotSubNum(velocity, color); } else { plotSubOption("DYN", color); } @@ -477,27 +477,23 @@ static void plotExtra(int color){ } static void plotVibrato(int color){ - display.setTextColor(color); - display.setTextSize(2); if (vibrato){ - display.setCursor(90,33); - display.println(vibrato); + plotSubNum(vibrato, color); } else { - display.setCursor(79,33); - display.println("OFF"); + plotSubOption("OFF", color); } } static void plotVibSens(int color){ - plotNum(vibSens, color); + plotSubNum(vibSens, color); } static void plotVibRetn(int color){ - plotNum(vibRetn, color); + plotSubNum(vibRetn, color); } static void plotVibSquelch(int color){ - plotNum(vibSquelch, color); + plotSubNum(vibSquelch, color); } static void plotVibDirection(int color){ @@ -557,7 +553,7 @@ static void plotVelBias(int color){ display.setTextColor(color); display.setTextSize(2); if (velBias){ - plotNum(velBias, color); + plotSubNum(velBias, color); } else { display.setCursor(79,33); display.println("OFF"); From 3df78f6598cca51970fc8db4e9ab89327425b844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:37:54 +0200 Subject: [PATCH 20/35] Same as before --- NuEVI/menu.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 9e71528..0f90c4f 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -378,13 +378,10 @@ static void plotRotator(int color,int value){ } static void plotPriority(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); if (priority){ - display.println("ROT"); + plotSubOption("ROT", color); } else { - display.println("MEL"); + plotSubOption("MEL", color); } } @@ -550,13 +547,10 @@ static void plotVelSmpDl(int color){ } static void plotVelBias(int color){ - display.setTextColor(color); - display.setTextSize(2); if (velBias){ plotSubNum(velBias, color); } else { - display.setCursor(79,33); - display.println("OFF"); + plotSubOption("OFF", color); } } From ca5b2b9484d595d41b6cd45817e1392f8f2772d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 00:43:03 +0200 Subject: [PATCH 21/35] Removed unnecessary display.display() call --- NuEVI/menu.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 0f90c4f..d7ff9f1 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -312,7 +312,6 @@ static void drawPatchView(){ display.setCursor(10,10); display.println("CLR"); } - display.display(); } static void clearSub(){ From 699546df8c34e8c883e633a6fc2a7da0dc8efd97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 14:25:31 +0200 Subject: [PATCH 22/35] Handle sub menus in a generic way and moved adjust menu logic to separate file This is a big one where I can finally reap what I sown. Sub menu entries now provide two functions, one to get the text for the current value and one to apply changes aka save to EEPROM. With this I can replace so much code in the menu() function that handles input, but was _almost_ identical. The process of converting the old menus are not completed, and I can probably remove about 200 lines more code. The question is still what to do with less general menus like the rotator and fast patch menu. One problem with the current implementation is that it is RAM heavy. It seems the const MenuEntry structs are placed in ram, because there is a pointer to RAM that I assume is allocated during execution and therefore the address cannot be stored in ROM. My plan has been to put all the configuration fields (that are stored in EEPROM) into a struct or an array. When that is implemented, I can instead store the offset into the array in the const struct, which should be available at compile time and therefore can reside completely in ROM. --- .gitignore | 2 + NuEVI/adjustmenu.cpp | 359 ++++++++++++++ NuEVI/menu.cpp | 1080 +++++++++++++----------------------------- NuEVI/menu.h | 24 +- NuEVI/numenu.h | 20 + simulation/Makefile | 1 + 6 files changed, 724 insertions(+), 762 deletions(-) create mode 100644 .gitignore create mode 100644 NuEVI/adjustmenu.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eafd693 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode/ipch +*.o \ No newline at end of file diff --git a/NuEVI/adjustmenu.cpp b/NuEVI/adjustmenu.cpp new file mode 100644 index 0000000..310d6f7 --- /dev/null +++ b/NuEVI/adjustmenu.cpp @@ -0,0 +1,359 @@ +#include +#include +#include + +#include "menu.h" +#include "numenu.h" +#include "globals.h" +#include "config.h" +#include "hardware.h" +#include "settings.h" + +//*********************************************************** + +extern Adafruit_SSD1306 display; +extern Adafruit_MPR121 touchSensor; +extern byte cursorNow; + +//*********************************************************** +// Variables used for the adjust menu +static byte forcePix; + +static uint16_t pos1; +static uint16_t pos2; + +static int16_t adjustOption; +static int16_t adjustCurrent; + +static int16_t sensorPixelPos1 = -1; +static int16_t sensorPixelPos2 = -1; + +static bool refreshScreen; + +//*********************************************************** + + +const AdjustMenuEntry breathAdjustMenu = { + "BREATH", + { + { &breathThrVal, breathLoLimit, breathHiLimit }, + { &breathMaxVal, breathLoLimit, breathHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(BREATH_THR_ADDR, *e.entries[0].value); + writeSetting(BREATH_MAX_ADDR, *e.entries[1].value); + } +}; + +const AdjustMenuEntry portamentoAdjustMenu = { + "PORTAMENTO", + { + { &portamThrVal, portamLoLimit, portamHiLimit }, + { &portamMaxVal, portamLoLimit, portamHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(PORTAM_THR_ADDR, *e.entries[0].value); + writeSetting(PORTAM_MAX_ADDR, *e.entries[1].value); + } +}; + +const AdjustMenuEntry pitchBendAdjustMenu = { + "PITCH BEND", + { + { &pitchbThrVal, pitchbLoLimit, pitchbHiLimit }, + { &pitchbMaxVal, pitchbLoLimit, pitchbHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(PITCHB_THR_ADDR, *e.entries[0].value); + writeSetting(PITCHB_MAX_ADDR, *e.entries[1].value); + } +}; + +const AdjustMenuEntry extraSensorAdjustMenu = { + "EXTRA CONTROLLER", + { + { &extracThrVal, extracLoLimit, extracHiLimit }, + { &extracMaxVal, extracLoLimit, extracHiLimit } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(EXTRAC_THR_ADDR, *e.entries[0].value); + writeSetting(EXTRAC_MAX_ADDR, *e.entries[1].value); + } +}; + +const AdjustMenuEntry ctouchAdjustMenu = { + "TOUCH SENSE", + { + { &ctouchThrVal, ctouchLoLimit, ctouchHiLimit }, + { nullptr, 0, 0 } + }, + [] (const AdjustMenuEntry& e) { + writeSetting(CTOUCH_THR_ADDR, *e.entries[0].value); + } +}; + +const AdjustMenuEntry* adjustMenuEntries[] = { + &breathAdjustMenu, + &portamentoAdjustMenu, + &pitchBendAdjustMenu, + &extraSensorAdjustMenu, + &ctouchAdjustMenu, +}; + +static const int numAdjustEntries = ARR_LEN(adjustMenuEntries); + +//*********************************************************** + +static void drawAdjCursor(byte color) { + display.drawTriangle(16,4,20,4,18,1,color); + display.drawTriangle(16,6,20,6,18,9,color); +} + +static void drawAdjustFrame(int line) { + display.drawLine(25,line,120,line,WHITE); // Top line + display.drawLine(25,line+12,120,line+12,WHITE); // Bottom line + + display.drawLine(25,line+1,25,line+2,WHITE); + display.drawLine(120,line+1,120,line+2,WHITE); + + display.drawLine(120,line+10,120,line+11,WHITE); + display.drawLine(25,line+10,25,line+11,WHITE); +} + +static void drawAdjustBase(const char* title, bool all) { + display.clearDisplay(); + + drawAdjustFrame(17); + + // sensor marker lines. + display.drawLine(25,36,25,40,WHITE); + display.drawLine(120,36,120,40,WHITE); + + display.setTextSize(1); + display.setTextColor(WHITE); + display.setCursor(25,2); + display.println(title); + + display.setCursor(0,20); + display.println("THR"); + display.setCursor(0,35); + display.println("SNS"); + + + if(all) { + drawAdjustFrame(47); + display.setCursor(0,50); + display.println("MAX"); + } + cursorNow = WHITE; + drawAdjCursor(WHITE); +} + +static bool updateAdjustLineCursor(uint32_t timeNow, uint16_t hPos, uint16_t vPos ) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; + display.drawLine(hPos, vPos,hPos, vPos+6, cursorNow);; + cursorBlinkTime = timeNow; + return true; + } + return false; +} + +static void drawAdjustMenu(const AdjustMenuEntry *menu) { + + bool haveSecondValue = menu->entries[1].value != nullptr; + drawAdjustBase( menu->title, haveSecondValue ); + + pos1 = map( *menu->entries[0].value, menu->entries[0].limitLow, menu->entries[0].limitHigh, 27, 119); + display.drawLine( pos1, 20, pos1, 26, WHITE ); + + if(haveSecondValue) { + pos2 = map( *menu->entries[1].value, menu->entries[1].limitLow, menu->entries[1].limitHigh, 27, 119); + display.drawLine( pos2, 50, pos2, 56, WHITE ); + } +} + +//*********************************************************** + +static bool updateSensorPixel(int pos, int pos2) { + bool update = pos != sensorPixelPos1 || pos2 != sensorPixelPos2; + if(update) { + display.drawFastHLine(28, 38, 119-28, BLACK); // Clear old line + display.drawPixel(pos, 38, WHITE); + if( pos2 >= 0) display.drawPixel(pos2, 38, WHITE); + + sensorPixelPos1 = pos; + sensorPixelPos2 = pos2; + } + return update; +} + +void plotSensorPixels(){ + int redraw = 0; + + if(forcePix) + sensorPixelPos1 = -1; + + // This is hacky. It depends on the order of items in the adjust menu list. + if(adjustOption == 0) { + int pos = map(constrain(pressureSensor, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); + } + else if(adjustOption == 1) { + int pos = map(constrain(biteSensor,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); + } + else if(adjustOption == 2) { + int pos = map(constrain(pbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); + int pos2 = map(constrain(pbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); + redraw = updateSensorPixel(pos, pos2); + } + else if(adjustOption == 3) { + int pos = map(constrain(exSensor, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118); + redraw = updateSensorPixel(pos, -1); + } + else if(adjustOption == 4) { + display.drawLine(28,38,118,38,BLACK); + for (byte i=0; i<12; i++){ + int pos = map(constrain(touchSensor.filteredData(i), ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + display.drawPixel(pos, 38, WHITE); + } + + int posRead = map(touchRead(halfPitchBendKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); + int pos = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + + posRead = map(touchRead(specialKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); + int pos2 = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); + + updateSensorPixel(pos, pos2); + + redraw = 1; + } + if (redraw){ + display.display(); + } + forcePix = 0; +} + + +//*********************************************************** + +static bool drawAdjustBar(uint16_t buttons, int row, const AdjustValue* entry, uint16_t *pos) { + bool updated = false; + uint16_t step = (entry->limitHigh-entry->limitLow)/92; + int val = *entry->value; + switch(buttons) { + case BTN_UP: + val += step; + updated = true; + break; + + case BTN_DOWN: + val -= step; + updated = true; + break; + } + if(updated) { + *entry->value = constrain(val, entry->limitLow, entry->limitHigh); + auto p = *pos; + display.drawLine(p, row, p, row+6, BLACK); + *pos = p = map(*entry->value, entry->limitLow, entry->limitHigh, 27, 119); + display.drawLine(p, row, p, row+6, WHITE); + cursorNow = BLACK; + } + return updated; +} + +static bool updateAdjustCursor(uint32_t timeNow) { + if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { + if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; + drawAdjCursor(cursorNow); + cursorBlinkTime = timeNow; + return true; + } + return false; +} + +int updateAdjustMenu(uint32_t timeNow, uint8_t buttons, bool firstRun, bool drawSensor) { + bool redraw = false; + int result = 0; + + const AdjustMenuEntry *currentMenu = adjustMenuEntries[adjustOption]; + + if(firstRun || refreshScreen) { + adjustCurrent = 0; + refreshScreen = false; + drawAdjustMenu(currentMenu); + // the sensor pixel stuff should be refactored (to work again) + forcePix = 1; + sensorPixelPos1 = -1; // Force draw of sensor pixels + } + + if(adjustCurrent == 0) { + // Currently selecting what option to modify + redraw |= updateAdjustCursor(timeNow); + + bool save = false; + + if( buttons == BTN_DOWN ) { + adjustOption += 1; + refreshScreen = 1; + save = true; + } + else if ( buttons == BTN_UP ) { + adjustOption -= 1; + refreshScreen = 1; + save = true; + } + else if ( buttons == BTN_ENTER ) { + adjustCurrent = 1; + } + else if (buttons == BTN_MENU ) { + adjustCurrent = 0; + result = -1; + save = true; + } + + if(save && currentMenu->saveFunc) + currentMenu->saveFunc(*currentMenu); + + } else if( adjustCurrent == 1) { + if (buttons) { + drawAdjustBar( buttons, 20, ¤tMenu->entries[0], &pos1 ); + if(buttons == BTN_ENTER) adjustCurrent += 1; + else if( buttons == BTN_MENU) adjustCurrent = 0; + redraw = true; + } else { + redraw |= updateAdjustLineCursor( timeNow, pos1, 20 ); + } + } else { + if (buttons) { + drawAdjustBar( buttons, 50, ¤tMenu->entries[1], &pos2 ); + if(buttons == BTN_ENTER) adjustCurrent += 1; + else if( buttons == BTN_MENU) adjustCurrent = 0; + redraw = true; + } else { + redraw |= updateAdjustLineCursor( timeNow, pos2, 50 ); + } + } + + // Keep adjustCurrent in range + if( adjustCurrent > 2 || (adjustCurrent == 2 && currentMenu->entries[1].value == nullptr)) + adjustCurrent = 0; + + // Keep adjust option in range. + if(adjustOption < 0) + adjustOption = numAdjustEntries-1; + else if (adjustOption >= numAdjustEntries) + adjustOption = 0; + + + if(drawSensor) { + plotSensorPixels(); + } + + if(result >= 0) + result = redraw; + + return result; +} diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index d7ff9f1..a8a219a 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -11,13 +11,6 @@ #include "settings.h" #include "numenu.h" -#define ARR_LEN(a) (sizeof (a) / sizeof (a[0])) - -#define BTN_DOWN 1 -#define BTN_ENTER 2 -#define BTN_UP 4 -#define BTN_MENU 8 - // TODO: Ask Johan the reason for using this.. // static const uint16_t minOffset = 50; @@ -39,32 +32,22 @@ enum CursorIdx { }; static byte cursors[CursorIdx::NUM_CURSORS]; +static byte offsets[CursorIdx::NUM_CURSORS]; +static byte activeSub[CursorIdx::NUM_CURSORS]; -static byte cursorNow; +byte cursorNow; static byte forceRedraw = 0; static byte FPD = 0; -// Variables used for the adjust menu -static byte forcePix = 0; - -static uint16_t pos1; -static uint16_t pos2; - -static int16_t adjustOption = 0; -static int16_t adjustCurrent = 0; - -static int16_t sensorPixelPos1 = -1; -static int16_t sensorPixelPos2 = -1; - // constants -static const unsigned long debounceDelay = 30; // the debounce time; increase if the output flickers -static const unsigned long buttonRepeatInterval = 50; -static const unsigned long buttonRepeatDelay = 400; -static const unsigned long cursorBlinkInterval = 300; // the cursor blink toggle interval time -static const unsigned long patchViewTimeUp = 2000; // ms until patch view shuts off -static const unsigned long menuTimeUp = 60000; // menu shuts off after one minute of button inactivity +const unsigned long debounceDelay = 30; // the debounce time; increase if the output flickers +const unsigned long buttonRepeatInterval = 50; +const unsigned long buttonRepeatDelay = 400; +const unsigned long cursorBlinkInterval = 300; // the cursor blink toggle interval time +const unsigned long patchViewTimeUp = 2000; // ms until patch view shuts off +const unsigned long menuTimeUp = 60000; // menu shuts off after one minute of button inactivity static unsigned long lastDebounceTime = 0; // the last time the output pin was toggled static unsigned long buttonRepeatTime = 0; @@ -84,24 +67,17 @@ static byte subBreathCC = 0; static byte subBreathAT = 0; static byte subVelocity = 0; static byte subCurve = 0; -static byte subPort = 0; -static byte subPB = 0; -static byte subExtra = 0; -static byte subVibrato = 0; -static byte subDeglitch = 0; -static byte subPinky = 0; static byte subVelSmpDl = 0; static byte subVelBias = 0; static byte subParallel = 0; static byte subRotator = 0; static byte subPriority = 0; -static byte subVibSens = 0; -static byte subVibRetn = 0; -static byte subVibDirection = 0; +// The external function of subSquelch has been broken, +// need to come up with a smart way to make it work again. +// The status led was update when the Squelch menu was open. byte subVibSquelch = 0; //extern - // 'NuEVI' logo #define LOGO16_GLCD_WIDTH 128 #define LOGO16_GLCD_HEIGHT 64 @@ -196,6 +172,8 @@ void initDisplay() { display.display(); memset(cursors, 0, sizeof(cursors)); + memset(offsets, 0, sizeof(offsets)); + memset(activeSub, 0, sizeof(activeSub)); } void showVersion() { @@ -215,18 +193,76 @@ void showVersion() { display.display(); } -void drawMenuCursor(byte itemNo, byte color){ - byte ymid = 15 + 9 * itemNo; - display.drawTriangle(57, ymid,61, ymid+2,61, ymid-2, color); +// Assumes dest points to a buffer of atleast 7 bytes. +static const char* numToString(int16_t value, char* dest, bool plusSign = false) { + char* ptr = dest; + uint16_t absVal = abs(value); + int c = 1; + + if(value < 0) { + *ptr++ = '-'; + } else if(plusSign && value) { + *ptr++ = '+'; + } + while((c*10) < absVal+1) c *= 10; + while(c > 0) { + int tmp = absVal / c; + *ptr++ = tmp + '0'; + absVal %= c; + c /= 10; + } + *ptr = 0; + return dest; } +static void plotSubOption(const char* label, int color) { + display.setTextColor(color); + display.setTextSize(2); + int x_pos = 96-strlen(label)*6; + display.setCursor(x_pos,33); + display.println(label); +} + +static void plotSubNum(int value, int color) { + int s = 0; + if(value > 99) s = 2*7; + else if(value > 9) s = 1*7; + display.setTextColor(color); + display.setTextSize(2); + display.setCursor(90-s ,33); + display.println(value); +} + + 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(color); + const MenuEntry* subEntry = page.entries[index]; + switch(subEntry->type) { + case MenuType::ESub: + ((const MenuEntrySub*)subEntry)->subMenuFunc(color); + break; + + case MenuType::ESubNew: + { + char buffer[12]; + const char* labelPtr = nullptr; + ((const MenuEntrySubNew*)subEntry)->getSubTextFunc(buffer, &labelPtr); + plotSubOption(buffer, color); + if(labelPtr != nullptr) { + // TODO: handle this better, we should center text + label + display.setCursor(105,40); + display.setTextSize(1); + display.println(labelPtr); + } + } + break; + + default: + break; + } return true; } @@ -241,6 +277,19 @@ static bool updateSubMenuCursor(const MenuPage &page, uint32_t timeNow) return false; } +static void plotMenuEntries(const MenuPage &page, bool clear = false) { + int row = 0; + if(clear) { + display.fillRect( 0, MENU_HEADER_OFFSET, 56, 64-MENU_HEADER_OFFSET, BLACK ); + } + for(int item = offsets[page.cursor]; (item < page.numEntries) && (row < MENU_NUM_ROWS); item++, row++) { + int rowPixel = (row)*MENU_ROW_HEIGHT + MENU_HEADER_OFFSET; + const char* lineText = page.entries[item]->title; + display.setCursor(0,rowPixel); + display.println(lineText); + } +} + static void drawMenu(const MenuPage &page, const char* customTitle = nullptr) { //Initialize display and draw menu header + line display.clearDisplay(); @@ -253,13 +302,7 @@ static void drawMenu(const MenuPage &page, const char* customTitle = nullptr) { display.println(page.title); display.drawLine(0, MENU_ROW_HEIGHT, 127, MENU_ROW_HEIGHT, WHITE); - int row = 0; - for(int item = 0; (item < page.numEntries) && (row < 6); item++, row++) { - int rowPixel = (row+1)*MENU_ROW_HEIGHT + MENU_HEADER_OFFSET; - const char* lineText = page.entries[item]->title; - display.setCursor(0,rowPixel); - display.println(lineText); - } + plotMenuEntries(page); } static void drawMenuScreen() { @@ -334,46 +377,22 @@ static void drawSubBox(const char* label) display.println(label); } -static void plotSubOption(const char* label, int color) { - display.setTextColor(color); - display.setTextSize(2); - int x_pos = 91-strlen(label)*4; - display.setCursor(x_pos,33); - display.println(label); +void drawMenuCursor(byte itemNo, byte color){ + byte ymid = 15 + 9 * itemNo; + display.drawTriangle(57, ymid,61, ymid+2,61, ymid-2, color); } -static void plotSubNum(int value, int color) { - int s = 0; - if(value > 99) s = 2*7; - else if(value > 9) s = 1*7; - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(90-s ,33); - display.println(value); -} static void plotTranspose(int color){ - int value = transpose - 12; - const char *sign = (value < 0) ? "-":"+"; - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(80,33); - display.println(sign); - display.setCursor(93,33); - display.println(abs(value)); + char buff[12]; + numToString(transpose - 12, buff, true); + plotSubOption(buff, color); } static void plotRotator(int color,int value){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(80,33); - if ((value) > -1){ - display.println("+"); - } else { - display.println("-"); - } - display.setCursor(93,33); - display.println(abs(value)); + char buff[12]; + numToString(value, buff, true); + plotSubOption(buff, color); } static void plotPriority(int color){ @@ -385,16 +404,9 @@ static void plotPriority(int color){ } static void plotOctave(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(80,33); - if ((octave-3) > -1){ - display.println("+"); - } else { - display.println("-"); - } - display.setCursor(93,33); - display.println(abs(octave-3)); + char buff[12]; + numToString(octave-3, buff, true); + plotSubOption(buff, color); } static void plotMIDI(int color) { @@ -443,94 +455,6 @@ static void plotCurve(int color){ plotSubOption(curveMenuLabels[curve], color); } -static void plotPort(int color){ - if (portamento == 1){ - plotSubOption("ON", color); - } else if (portamento == 2){ - plotSubOption("SW", color); - } else { - plotSubOption("OFF", color); - } -} - -static void plotPB(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(76,33); - if (PBdepth){ - display.println("1/"); - display.setCursor(101,33); - display.println(PBdepth); - } else { - display.println("OFF"); - } -} - -static const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" }; - -static void plotExtra(int color){ - plotSubOption(extraMenuLabels[extraCT], color); -} - -static void plotVibrato(int color){ - if (vibrato){ - plotSubNum(vibrato, color); - } else { - plotSubOption("OFF", color); - } -} - -static void plotVibSens(int color){ - plotSubNum(vibSens, color); -} - -static void plotVibRetn(int color){ - plotSubNum(vibRetn, color); -} - -static void plotVibSquelch(int color){ - plotSubNum(vibSquelch, color); -} - -static void plotVibDirection(int color){ - if (DNWD == vibDirection){ - plotSubOption("NRM", color); - } else { - plotSubOption("REV", color); - } -} - - -static void plotDeglitch(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); - if (deglitch){ - display.println(deglitch); - display.setCursor(105,40); - display.setTextSize(1); - display.println("ms"); - } else { - display.println("OFF"); - } -} - - -static void plotPinkyKey(int color){ - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(79,33); - if (pinkySetting < 12){ - display.println(pinkySetting - 12); - } else if (pinkySetting == PBD) { - display.println("PBD"); - } else { - display.print("+"); - display.println(pinkySetting - 12); - } -} - - static void plotVelSmpDl(int color){ display.setTextColor(color); display.setCursor(79,33); @@ -679,13 +603,62 @@ const MenuPage breathMenuPage = { ARR_LEN(breathMenuEntries), breathMenuEntries }; +//*********************************************************** // Control menu -const MenuEntrySub portMenu = { MenuType::ESub, "PORT/GLD", "PORT/GLD", &subPort, plotPort }; -const MenuEntrySub pitchBendMenu = { MenuType::ESub, "PITCHBEND", "PITCHBEND", &subPB, plotPB }; -const MenuEntrySub extraMenu = { MenuType::ESub, "EXTRA CTR", "EXTRA CTR", &subExtra, plotExtra }; +const MenuEntrySubNew portMenu = { + MenuType::ESubNew, "PORT/GLD", "PORT/GLD", &portamento, 0, 2, MenuEntryFlags::EWrap, + [](char* out, const char ** __unused label) { + const char* labs[] = { "OFF", "ON", "SW" }; + strncpy(out, labs[portamento], 4); + }, + []() { writeSetting(PORTAM_ADDR,portamento); } +}; + +const MenuEntrySubNew pitchBendMenu = { + MenuType::ESubNew, "PITCHBEND", "PITCHBEND", &PBdepth, 0, 12, MenuEntryFlags::ENone, + [](char* out, const char** __unused label) { + if(PBdepth) { + memcpy(out, "1/", 2); + numToString(PBdepth, &out[2]); + } + else strncpy(out, "OFF", 4); + }, + [](){ writeSetting(PB_ADDR,PBdepth); } +}; + +const MenuEntrySubNew extraMenu = { + MenuType::ESubNew, "EXTRA CTR", "EXTRA CTR", &extraCT, 0,4, MenuEntryFlags::EWrap, + [](char* out, const char** __unused label) { + const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" }; + strncpy(out, extraMenuLabels[extraCT], 12); + }, + []() { writeSetting(EXTRA_ADDR,extraCT); } +}; + const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, "VIBRATO", VIBRATO_MENU }; -const MenuEntrySub deglitchMenu = { MenuType::ESub, "DEGLITCH", "DEGLITCH", &subDeglitch, plotDeglitch }; -const MenuEntrySub pinkyMenu = { MenuType::ESub, "PINKY KEY", "PINKY KEY", &subPinky, plotPinkyKey }; + +const MenuEntrySubNew deglitchMenu = { + MenuType::ESubNew, "DEGLITCH", "DEGLITCH", °litch, 0, 70, MenuEntryFlags::ENone, + [](char* textBuffer, const char** label) { + if(deglitch) { + numToString(deglitch, textBuffer); + *label = "ms"; + } else + strncpy(textBuffer, "OFF", 4); + }, + []() { writeSetting(DEGLITCH_ADDR,deglitch); } +}; + +const MenuEntrySubNew pinkyMenu = { + MenuType::ESubNew, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 24, MenuEntryFlags::ENone, + [](char* textBuffer, const char** __unused label) { + if (pinkySetting == PBD) + strncpy(textBuffer, "PBD", 4); + else + numToString(pinkySetting-12, textBuffer, true); + }, + []() { writeSetting(PINKY_KEY_ADDR,pinkySetting); } +}; const MenuEntry* controlMenuEntries[] = { (MenuEntry*)&portMenu, @@ -704,12 +677,54 @@ const MenuPage controlMenuPage = { }; +//*********************************************************** // Vibrato menu -const MenuEntrySub vibDepthMenu = { MenuType::ESub, "DEPTH", "LEVEL", &subVibrato, plotVibrato }; -const MenuEntrySub vibSenseMenu = { MenuType::ESub, "SENSE", "LEVEL", &subVibSens, plotVibSens }; -const MenuEntrySub vibRetnMenu = { MenuType::ESub, "RETURN", "LEVEL", &subVibRetn, plotVibRetn }; -const MenuEntrySub vibSquelchMenu = { MenuType::ESub, "SQUELCH", "LEVEL", &subVibSquelch, plotVibSquelch }; -const MenuEntrySub vibDirMenu = { MenuType::ESub, "DIRECTION", "DIRECTION", &subVibDirection, plotVibDirection }; + +const MenuEntrySubNew vibDepthMenu = { + MenuType::ESubNew, "DEPTH", "LEVEL", &vibrato, 0, 9, MenuEntryFlags::ENone, + [](char* textBuffer, const char** __unused label) { + if(vibrato) + numToString(vibrato, textBuffer); + else + strncpy(textBuffer, "OFF", 4); + }, + []() { writeSetting(VIBRATO_ADDR,vibrato); } +}; + +const MenuEntrySubNew vibSenseMenu = { + MenuType::ESubNew, "SENSE", "LEVEL", &vibSens, 1, 12, MenuEntryFlags::ENone, + [](char* textBuffer, const char** __unused label) { + numToString(vibSens, textBuffer); + }, + []() { writeSetting(VIB_SENS_ADDR,vibSens); } +}; + +const MenuEntrySubNew vibRetnMenu = { + MenuType::ESubNew, "RETURN", "LEVEL", &vibRetn, 0, 4, MenuEntryFlags::ENone, + [](char* textBuffer, const char** __unused label) { + numToString(vibRetn, textBuffer); + }, + []() { writeSetting(VIB_RETN_ADDR,vibRetn); } +}; + +const MenuEntrySubNew vibSquelchMenu = { + MenuType::ESubNew, "SQUELCH", "LEVEL", &vibSquelch, 1, 30, MenuEntryFlags::ENone, + [](char* textBuffer, const char** __unused label) { + numToString(vibSquelch, textBuffer); + }, + []() { writeSetting(VIB_SQUELCH_ADDR,vibSquelch); } +}; + +const MenuEntrySubNew vibDirMenu = { + MenuType::ESubNew, "DIRECTION", "DIRECTION", &vibDirection, 0, 1, MenuEntryFlags::EWrap, + [](char* textBuffer, const char** __unused label) { + if (DNWD == vibDirection) + strncpy(textBuffer, "NRM", 4); + else + strncpy(textBuffer, "REV", 4); + }, + []() { writeSetting(VIB_DIRECTION_ADDR,vibDirection); } +}; const MenuEntry* vibratorMenuEntries[] = { (MenuEntry*)&vibDepthMenu, @@ -729,339 +744,47 @@ const MenuPage vibratoMenuPage = { //*********************************************************** -const AdjustMenuEntry breathAdjustMenu = { - "BREATH", - { - { &breathThrVal, breathLoLimit, breathHiLimit }, - { &breathMaxVal, breathLoLimit, breathHiLimit } - }, - [] (const AdjustMenuEntry& e) { - writeSetting(BREATH_THR_ADDR, *e.entries[0].value); - writeSetting(BREATH_MAX_ADDR, *e.entries[1].value); - } -}; - -const AdjustMenuEntry portamentoAdjustMenu = { - "PORTAMENTO", - { - { &portamThrVal, portamLoLimit, portamHiLimit }, - { &portamMaxVal, portamLoLimit, portamHiLimit } - }, - [] (const AdjustMenuEntry& e) { - writeSetting(PORTAM_THR_ADDR, *e.entries[0].value); - writeSetting(PORTAM_MAX_ADDR, *e.entries[1].value); - } -}; - -const AdjustMenuEntry pitchBendAdjustMenu = { - "PITCH BEND", - { - { &pitchbThrVal, pitchbLoLimit, pitchbHiLimit }, - { &pitchbMaxVal, pitchbLoLimit, pitchbHiLimit } - }, - [] (const AdjustMenuEntry& e) { - writeSetting(PITCHB_THR_ADDR, *e.entries[0].value); - writeSetting(PITCHB_MAX_ADDR, *e.entries[1].value); - } -}; - -const AdjustMenuEntry extraSensorAdjustMenu = { - "EXTRA CONTROLLER", - { - { &extracThrVal, extracLoLimit, extracHiLimit }, - { &extracMaxVal, extracLoLimit, extracHiLimit } - }, - [] (const AdjustMenuEntry& e) { - writeSetting(EXTRAC_THR_ADDR, *e.entries[0].value); - writeSetting(EXTRAC_MAX_ADDR, *e.entries[1].value); - } -}; - -const AdjustMenuEntry ctouchAdjustMenu = { - "TOUCH SENSE", - { - { &ctouchThrVal, ctouchLoLimit, ctouchHiLimit }, - { nullptr, 0, 0 } - }, - [] (const AdjustMenuEntry& e) { - writeSetting(CTOUCH_THR_ADDR, *e.entries[0].value); - } -}; - -const AdjustMenuEntry* adjustMenuEntries[] = { - &breathAdjustMenu, - &portamentoAdjustMenu, - &pitchBendAdjustMenu, - &extraSensorAdjustMenu, - &ctouchAdjustMenu, -}; - -static const int numAdjustEntries = ARR_LEN(adjustMenuEntries); - -//*********************************************************** -static void drawAdjCursor(byte color) { - display.drawTriangle(16,4,20,4,18,1,color); - display.drawTriangle(16,6,20,6,18,9,color); -} - -static void drawAdjustFrame(int line) { - display.drawLine(25,line,120,line,WHITE); // Top line - display.drawLine(25,line+12,120,line+12,WHITE); // Bottom line - - display.drawLine(25,line+1,25,line+2,WHITE); - display.drawLine(120,line+1,120,line+2,WHITE); - - display.drawLine(120,line+10,120,line+11,WHITE); - display.drawLine(25,line+10,25,line+11,WHITE); -} - -static void drawAdjustBase(const char* title, bool all) { - display.clearDisplay(); - - drawAdjustFrame(17); - - // sensor marker lines. - display.drawLine(25,36,25,40,WHITE); - display.drawLine(120,36,120,40,WHITE); - - display.setTextSize(1); - display.setTextColor(WHITE); - display.setCursor(25,2); - display.println(title); - - display.setCursor(0,20); - display.println("THR"); - display.setCursor(0,35); - display.println("SNS"); - - - if(all) { - drawAdjustFrame(47); - display.setCursor(0,50); - display.println("MAX"); - } - cursorNow = WHITE; - drawAdjCursor(WHITE); -} - -static bool drawAdjustBar(uint16_t buttons, int row, const AdjustValue* entry, uint16_t *pos) { - bool updated = false; - uint16_t step = (entry->limitHigh-entry->limitLow)/92; - int val = *entry->value; - switch(buttons) { - case BTN_UP: - val += step; - updated = true; - break; - - case BTN_DOWN: - val -= step; - updated = true; - break; - } - if(updated) { - *entry->value = constrain(val, entry->limitLow, entry->limitHigh); - auto p = *pos; - display.drawLine(p, row, p, row+6, BLACK); - *pos = p = map(*entry->value, entry->limitLow, entry->limitHigh, 27, 119); - display.drawLine(p, row, p, row+6, WHITE); - cursorNow = BLACK; - } - return updated; -} - -static bool updateAdjustCursor(uint32_t timeNow) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - drawAdjCursor(cursorNow); - cursorBlinkTime = timeNow; - return true; - } - return false; -} - -static bool updateAdjustLineCursor(uint32_t timeNow, uint16_t hPos, uint16_t vPos ) { - if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(hPos, vPos,hPos, vPos+6, cursorNow);; - cursorBlinkTime = timeNow; - return true; - } - return false; -} - -static void drawAdjustMenu(const AdjustMenuEntry *menu) { - - bool haveSecondValue = menu->entries[1].value != nullptr; - drawAdjustBase( menu->title, haveSecondValue ); - - pos1 = map( *menu->entries[0].value, menu->entries[0].limitLow, menu->entries[0].limitHigh, 27, 119); - display.drawLine( pos1, 20, pos1, 26, WHITE ); - - if(haveSecondValue) { - pos2 = map( *menu->entries[1].value, menu->entries[1].limitLow, menu->entries[1].limitHigh, 27, 119); - display.drawLine( pos2, 50, pos2, 56, WHITE ); - } -} - -static bool updateAdjustMenu(uint32_t timeNow, uint8_t buttons) { - bool redraw = false; - const AdjustMenuEntry *currentMenu = adjustMenuEntries[adjustOption]; - - if(stateFirstRun) { - adjustCurrent = 0; - drawAdjustMenu(currentMenu); - stateFirstRun = 0; - // the sensor pixel stuff should be refactored (to work again) - forcePix = 1; - sensorPixelPos1 = -1; // Force draw of sensor pixels - } - - if(adjustCurrent == 0) { - // Currently selecting what option to modify - redraw |= updateAdjustCursor(timeNow); - - bool save = false; - - if( buttons == BTN_DOWN ) { - adjustOption += 1; - stateFirstRun = 1; - save = true; - } - else if ( buttons == BTN_UP ) { - adjustOption -= 1; - stateFirstRun = 1; - save = true; - } - else if ( buttons == BTN_ENTER ) { - adjustCurrent = 1; - } - else if (buttons == BTN_MENU ) { - adjustCurrent = 0; - state = MAIN_MENU; - stateFirstRun = 1; - save = true; - } - - if(save && currentMenu->saveFunc) - currentMenu->saveFunc(*currentMenu); - - } else if( adjustCurrent == 1) { - if (buttons) { - drawAdjustBar( buttons, 20, ¤tMenu->entries[0], &pos1 ); - if(buttons == BTN_ENTER) adjustCurrent += 1; - else if( buttons == BTN_MENU) adjustCurrent = 0; - redraw = true; - } else { - redraw |= updateAdjustLineCursor( timeNow, pos1, 20 ); - } - } else { - if (buttons) { - drawAdjustBar( buttons, 50, ¤tMenu->entries[1], &pos2 ); - if(buttons == BTN_ENTER) adjustCurrent += 1; - else if( buttons == BTN_MENU) adjustCurrent = 0; - redraw = true; - } else { - redraw |= updateAdjustLineCursor( timeNow, pos2, 50 ); - } - } - - // Keep adjustCurrent in range - if(adjustCurrent > 2) - adjustCurrent = 0; - - // Keep adjust option in range. - if(adjustOption < 0) - adjustOption = numAdjustEntries-1; - else if (adjustOption >= numAdjustEntries) - adjustOption = 0; - - return redraw; -} - -//*********************************************************** - -static bool updateSensorPixel(int pos, int pos2) { - bool update = pos != sensorPixelPos1 || pos2 != sensorPixelPos2; - if(update) { - display.drawFastHLine(28, 38, 119-28, BLACK); // Clear old line - display.drawPixel(pos, 38, WHITE); - if( pos2 >= 0) display.drawPixel(pos2, 38, WHITE); - - sensorPixelPos1 = pos; - sensorPixelPos2 = pos2; - } - return update; -} - -void drawSensorPixels(){ - if( state != ADJUST_MENU ) - return; - - int redraw = 0; - - if(forcePix) - sensorPixelPos1 = -1; - - // This is hacky. It depends on the order of items in the adjust menu list. - if(adjustOption == 0) { - int pos = map(constrain(pressureSensor, breathLoLimit, breathHiLimit), breathLoLimit, breathHiLimit, 28, 118); - redraw = updateSensorPixel(pos, -1); - } - else if(adjustOption == 1) { - int pos = map(constrain(biteSensor,portamLoLimit,portamHiLimit), portamLoLimit, portamHiLimit, 28, 118); - redraw = updateSensorPixel(pos, -1); - } - else if(adjustOption == 2) { - int pos = map(constrain(pbUp, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - int pos2 = map(constrain(pbDn, pitchbLoLimit, pitchbHiLimit), pitchbLoLimit, pitchbHiLimit, 28, 118); - redraw = updateSensorPixel(pos, pos2); - } - else if(adjustOption == 3) { - int pos = map(constrain(exSensor, extracLoLimit, extracHiLimit), extracLoLimit, extracHiLimit, 28, 118); - redraw = updateSensorPixel(pos, -1); - } - else if(adjustOption == 4) { - display.drawLine(28,38,118,38,BLACK); - for (byte i=0; i<12; i++){ - int pos = map(constrain(touchSensor.filteredData(i), ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - display.drawPixel(pos, 38, WHITE); - } - - int posRead = map(touchRead(halfPitchBendKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); - int pos = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - - posRead = map(touchRead(specialKeyPin),ttouchLoLimit,ttouchHiLimit,ctouchHiLimit,ctouchLoLimit); - int pos2 = map(constrain(posRead, ctouchLoLimit, ctouchHiLimit), ctouchLoLimit, ctouchHiLimit, 28, 118); - - updateSensorPixel(pos, pos2); - - redraw = 1; - } - if (redraw){ - display.display(); - } - forcePix = 0; -} - -//*********************************************************** - -static bool ExecuteMenuSelection(int cursorPosition, const struct MenuEntry *menuEntry) +static bool ExecuteMenuSelection( const MenuPage &page ) //int cursorPosition, const struct MenuEntry *menuEntry) { + int cursorPosition = cursors[page.cursor]; + const MenuEntry* menuEntry = page.entries[cursorPosition]; + cursorBlinkTime = millis(); + switch(menuEntry->type) { case MenuType::ESub: *((const MenuEntrySub*)menuEntry)->flag = 1; + activeSub[page.cursor] = cursorPosition+1; drawMenuCursor(cursorPosition, WHITE); drawSubBox( ((const MenuEntrySub*)menuEntry)->subTitle); ((const MenuEntrySub*)menuEntry)->subMenuFunc(WHITE); return true; + case MenuType::ESubNew: + { + char buffer[12]; + const char* labelPtr = nullptr; + activeSub[page.cursor] = cursorPosition+1; + drawMenuCursor(cursorPosition, WHITE); + drawSubBox( ((const MenuEntrySubNew*)menuEntry)->subTitle); + ((const MenuEntrySubNew*)menuEntry)->getSubTextFunc(buffer, &labelPtr); + plotSubOption(buffer, WHITE); + if(labelPtr != nullptr) { + // TODO: handle this better, we should center text + label + display.setCursor(105,40); + display.setTextSize(1); + display.println(labelPtr); + } + return true; + } + break; + case MenuType::EStateChange: state = ((const MenuEntryStateCh*)menuEntry)->state; stateFirstRun = 1; break; case MenuType::ESubRotator: + activeSub[page.cursor] = cursorPosition+1; *((const MenuEntrySubRotator*)menuEntry)->flag = ((const MenuEntrySubRotator*)menuEntry)->flagValue; drawMenuCursor(cursorPosition, WHITE); ((const MenuEntrySubRotator*)menuEntry)->subMenuFunc(WHITE); @@ -1073,14 +796,67 @@ static bool ExecuteMenuSelection(int cursorPosition, const struct MenuEntry *men //*********************************************************** -static bool selectMenuOption(int cursorPosition, const MenuEntry** menuEntries){ - cursorBlinkTime = millis(); - const MenuEntry* entry = menuEntries[cursorPosition]; - return ExecuteMenuSelection( cursorPosition, entry ); +static bool selectMenuOption(const MenuPage &page){ + // const MenuEntry* entry = menuEntries[cursorPosition]; + return ExecuteMenuSelection( page ); } //*********************************************************** +static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { + + bool redraw = false; + bool redrawSubValue = false; + if (buttonPressedAndNotUsed){ + buttonPressedAndNotUsed = 0; + + int current_sub = activeSub[page.cursor] -1; + + if( current_sub < 0) + return false; + + auto sub = (const MenuEntrySubNew*)page.entries[current_sub]; + uint16_t currentVal = *sub->valuePtr; + + switch (deumButtonState){ + case BTN_DOWN: + if(currentVal > sub->min) { + currentVal -= 1; + } else if(sub->flags & MenuEntryFlags::EWrap) { + currentVal = sub->max; + } + break; + + case BTN_UP: + if(currentVal < sub->max) { + currentVal += 1; + } else if(sub->flags & MenuEntryFlags::EWrap) { + currentVal = sub->min; + } + break; + + case BTN_ENTER: // fallthrough + case BTN_MENU: + activeSub[page.cursor] = 0; + sub->applyFunc(); + break; + } + *sub->valuePtr = currentVal; + redrawSubValue = true; + } else { + redraw = updateSubMenuCursor( page, timeNow ); + } + + if(redrawSubValue) { + clearSubValue(); + redraw |= drawSubMenu(page, WHITE); + cursorNow = BLACK; + cursorBlinkTime = timeNow; + } + + return redraw; +} + static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { byte cursorPos = cursors[page.cursor]; byte newPos = cursorPos; @@ -1098,7 +874,8 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { break; case BTN_ENTER: - redraw |= selectMenuOption(cursorPos, page.entries); + // redraw |= selectMenuOption(cursorPos, page.entries); + redraw |= selectMenuOption(page); break; case BTN_UP: @@ -1158,7 +935,7 @@ static void checkForPatchView(int buttons) { } // This should be moved to a separate file/process that handles only led -void statusBlink() { +static void statusBlink() { digitalWrite(statusLedPin,LOW); delay(150); digitalWrite(statusLedPin,HIGH); @@ -1168,6 +945,13 @@ void statusBlink() { digitalWrite(statusLedPin,HIGH); } +static bool updateSensorPixelsFlag = false; + +void drawSensorPixels() { + updateSensorPixelsFlag = true; +} + + //*********************************************************** void menu() { @@ -1219,21 +1003,14 @@ void menu() { subBreathCC = 0; subBreathAT = 0; subVelocity = 0; - subPort = 0; - subPB = 0; - subExtra = 0; - subVibrato = 0; - subDeglitch = 0; - subPinky = 0; subVelSmpDl = 0; subVelBias = 0; + subParallel = 0; subRotator = 0; subPriority = 0; - subVibSens = 0; - subVibRetn = 0; + subVibSquelch = 0; - subVibDirection = 0; } if (state == DISPLAYOFF_IDL) { @@ -1590,9 +1367,19 @@ void menu() { } else if (state == ADJUST_MENU) { // This is a hack to update touch_Thr is it was changed.. int old_thr = ctouchThrVal; - redraw |= updateAdjustMenu( timeNow, buttonPressedAndNotUsed ? deumButtonState : 0 ); + int result = updateAdjustMenu( timeNow, buttonPressedAndNotUsed ? deumButtonState : 0, stateFirstRun, updateSensorPixelsFlag); + + updateSensorPixelsFlag = false; + stateFirstRun = 0; buttonPressedAndNotUsed = 0; + if( result < 0) + { + // Go back to main menu + state = MAIN_MENU; + stateFirstRun = true; + } + if( old_thr != ctouchThrVal) { touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); } @@ -1764,254 +1551,27 @@ void menu() { } else if (state == SETUP_CT_MENU) { // SETUP CONTROLLERS MENU HERE <<<<<<<<<<<<< + currentPage = &controlMenuPage; if (stateFirstRun) { - drawMenu( controlMenuPage ); + drawMenu(*currentPage); stateFirstRun = 0; } - currentPage = &controlMenuPage; - if (subPort){ - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (portamento > 0){ - portamento--; - } else portamento = 2; - break; - - case BTN_UP: - if (portamento < 2){ - portamento++; - } else portamento = 0; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subPort = 0; - writeSetting(PORTAM_ADDR,portamento); - break; - } - redrawSubValue = true; - } - } else if (subPB) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (PBdepth > 0) - PBdepth--; - break; - - case BTN_UP: - if (PBdepth < 12) - PBdepth++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subPB = 0; - writeSetting(PB_ADDR,PBdepth); - break; - } - redrawSubValue = true; - } - } else if (subExtra) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (extraCT > 0){ - extraCT--; - } else extraCT = 4; - break; - - case BTN_UP: - if (extraCT < 4){ - extraCT++; - } else extraCT = 0; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subExtra = 0; - writeSetting(EXTRA_ADDR,extraCT); - break; - } - redrawSubValue = true; - } - } else if (subDeglitch) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (deglitch > 0) - deglitch-=1; - break; - - case BTN_UP: - if (deglitch < 70){ - deglitch+=1; - } - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subDeglitch = 0; - writeSetting(DEGLITCH_ADDR,deglitch); - break; - } - redrawSubValue = true; - } - } else if (subPinky) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (pinkySetting > 0) - pinkySetting-=1; - break; - - case BTN_UP: - if (pinkySetting < 24) - pinkySetting += 1; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subPinky = 0; - writeSetting(PINKY_KEY_ADDR,pinkySetting); - break; - } - redrawSubValue = true; - } + if (activeSub[currentPage->cursor]) { + redraw |= updateSubMenu(*currentPage, timeNow); } else { - redraw |= updateMenuPage( *currentPage, timeNow ); + redraw |= updateMenuPage(*currentPage, timeNow); } } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< + currentPage = &vibratoMenuPage; if (stateFirstRun) { - drawMenu(vibratoMenuPage); + drawMenu(*currentPage); stateFirstRun = 0; } - currentPage = &vibratoMenuPage; - if (subVibrato) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (vibrato > 0) - vibrato--; - break; - - case BTN_UP: - if (vibrato < 9) - vibrato++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVibrato = 0; - writeSetting(VIBRATO_ADDR,vibrato); - break; - } - redrawSubValue = true; - } - } else if (subVibSens) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (vibSens > 1) - vibSens--; - break; - - case BTN_UP: - if (vibSens < 12) - vibSens++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVibSens = 0; - writeSetting(VIB_SENS_ADDR,vibSens); - break; - } - redrawSubValue = true; - } - } else if (subVibRetn) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (vibRetn > 0) - vibRetn--; - break; - - case BTN_UP: - if (vibRetn < 4) - vibRetn++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVibRetn = 0; - writeSetting(VIB_RETN_ADDR,vibRetn); - break; - } - redrawSubValue = true; - } - } else if (subVibSquelch) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (vibSquelch > 1) - vibSquelch--; - break; - - case BTN_UP: - if (vibSquelch < 30) - vibSquelch++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVibSquelch = 0; - writeSetting(VIB_SQUELCH_ADDR,vibSquelch); - break; - } - redrawSubValue = true; - } - } else if (subVibDirection) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - - case BTN_DOWN: // fallthrough - case BTN_UP: - vibDirection = !vibDirection; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVibDirection = 0; - writeSetting(VIB_DIRECTION_ADDR,vibDirection); - break; - } - redrawSubValue = true; - } + if (activeSub[currentPage->cursor]) { + redraw |= updateSubMenu(*currentPage, timeNow); } else { - redraw |= updateMenuPage( *currentPage, timeNow ); + redraw |= updateMenuPage(*currentPage, timeNow); } } diff --git a/NuEVI/menu.h b/NuEVI/menu.h index 57485ab..d0d21af 100644 --- a/NuEVI/menu.h +++ b/NuEVI/menu.h @@ -4,8 +4,8 @@ #include "Wiring.h" #define MENU_ROW_HEIGHT 9 -#define MENU_HEADER_OFFSET 3 -#define MENU_NUM_ROWS 5 +#define MENU_HEADER_OFFSET 12 +#define MENU_NUM_ROWS 6 //display states #define DISPLAYOFF_IDL 0 @@ -17,6 +17,23 @@ #define ROTATOR_MENU 100 #define VIBRATO_MENU 110 +#define ARR_LEN(a) (sizeof (a) / sizeof (a[0])) + +#define BTN_DOWN 1 +#define BTN_ENTER 2 +#define BTN_UP 4 +#define BTN_MENU 8 + + + +extern const unsigned long debounceDelay; // the debounce time; increase if the output flickers +extern const unsigned long buttonRepeatInterval; +extern const unsigned long buttonRepeatDelay; +extern const unsigned long cursorBlinkInterval; // the cursor blink toggle interval time +extern const unsigned long patchViewTimeUp; // ms until patch view shuts off +extern const unsigned long menuTimeUp; // menu shuts off after one minute of button inactivity + + extern byte subVibSquelch; @@ -27,4 +44,7 @@ void drawSensorPixels(); unsigned short readSetting(byte address); void writeSetting(byte address, unsigned short value); +int updateAdjustMenu(uint32_t timeNow, uint8_t buttons, bool firstRun, bool updateSensor); + + #endif diff --git a/NuEVI/numenu.h b/NuEVI/numenu.h index f3ac0ff..befb618 100644 --- a/NuEVI/numenu.h +++ b/NuEVI/numenu.h @@ -5,6 +5,7 @@ enum MenuType { ESub, + ESubNew, ESubRotator, EStateChange, }; @@ -22,6 +23,25 @@ struct MenuEntrySub { void (*subMenuFunc)(int color); }; +enum MenuEntryFlags { + ENone = 0, + EWrap = (1<<0), + ECustom = (1<<1), +}; + +struct MenuEntrySubNew { + enum MenuType type; + const char* title; + const char* subTitle; + uint16_t* valuePtr; + uint16_t min; + uint16_t max; + uint16_t flags; + void (*getSubTextFunc)(char*textBuffer, const char**label); + void (*applyFunc)(void); +}; + + struct MenuEntrySubRotator { enum MenuType type; const char* title; diff --git a/simulation/Makefile b/simulation/Makefile index d960a6c..30ac3d8 100644 --- a/simulation/Makefile +++ b/simulation/Makefile @@ -27,6 +27,7 @@ INCDIRS += $(addprefix -I,$(INCS)) TARGET=nuevisim CXXFILES= ../NuEVI/menu.cpp \ + ../NuEVI/adjustmenu.cpp \ src/nuevisim.cpp \ src/simeeprom.cpp \ src/Print.cpp \ From 65aa0f4dabce847ae0b6a4282e402e2d3415e241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 20:56:52 +0200 Subject: [PATCH 23/35] Converted more of the sub menus to the new sub definitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Found out that it’s the lambda functions used for pointer that forces the structs to be in ram instead or rom. --- NuEVI/menu.cpp | 644 +++++++++++++++++-------------------------------- NuEVI/numenu.h | 2 + 2 files changed, 224 insertions(+), 422 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index a8a219a..f56b461 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -27,7 +27,7 @@ enum CursorIdx { ERotator, EVibrato, - // NEVER ADD + // NEVER ADD NUM_CURSORS }; @@ -60,15 +60,6 @@ unsigned long cursorBlinkTime = 0; // the last time the cursor was togg static byte state = DISPLAYOFF_IDL; static byte stateFirstRun = 1; -static byte subTranspose = 0; -static byte subOctave = 0; -static byte subMIDI = 0; -static byte subBreathCC = 0; -static byte subBreathAT = 0; -static byte subVelocity = 0; -static byte subCurve = 0; -static byte subVelSmpDl = 0; -static byte subVelBias = 0; static byte subParallel = 0; static byte subRotator = 0; static byte subPriority = 0; @@ -223,18 +214,6 @@ static void plotSubOption(const char* label, int color) { display.println(label); } -static void plotSubNum(int value, int color) { - int s = 0; - if(value > 99) s = 2*7; - else if(value > 9) s = 1*7; - display.setTextColor(color); - display.setTextSize(2); - display.setCursor(90-s ,33); - display.println(value); -} - - - static bool drawSubMenu(const MenuPage &page, int color) { int index = cursors[page.cursor]; // TODO: Handle MenuEntrySubRotator case @@ -249,13 +228,19 @@ static bool drawSubMenu(const MenuPage &page, int color) { { char buffer[12]; const char* labelPtr = nullptr; - ((const MenuEntrySubNew*)subEntry)->getSubTextFunc(buffer, &labelPtr); - plotSubOption(buffer, color); - if(labelPtr != nullptr) { - // TODO: handle this better, we should center text + label - display.setCursor(105,40); - display.setTextSize(1); - display.println(labelPtr); + const MenuEntrySubNew* sub = (const MenuEntrySubNew*)subEntry; + sub->getSubTextFunc(buffer, &labelPtr); + + // If ECustom flag is set, we assume that the getSubTextFunc + // rendered by it self. + if( !(sub->flags & MenuEntryFlags::ECustom)) { + plotSubOption(buffer, color); + if(labelPtr != nullptr) { + // TODO: handle this better, we should center text + label + display.setCursor(105,40); + display.setTextSize(1); + display.println(labelPtr); + } } } break; @@ -266,13 +251,25 @@ static bool drawSubMenu(const MenuPage &page, int color) { return true; } +static void clearSub(){ + display.fillRect(63,11,64,52,BLACK); +} + +static void clearSubValue() { + display.fillRect(65, 24, 60, 37, BLACK); +} + 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 ); + if (cursorNow == WHITE) { + cursorNow = BLACK; + clearSubValue(); + } else { + cursorNow = WHITE; + return drawSubMenu( page, cursorNow ); + } } return false; } @@ -357,13 +354,6 @@ static void drawPatchView(){ } } -static void clearSub(){ - display.fillRect(63,11,64,52,BLACK); -} - -static void clearSubValue() { - display.fillRect(65, 24, 60, 37, BLACK); -} static void drawSubBox(const char* label) { @@ -382,13 +372,6 @@ void drawMenuCursor(byte itemNo, byte color){ display.drawTriangle(57, ymid,61, ymid+2,61, ymid-2, color); } - -static void plotTranspose(int color){ - char buff[12]; - numToString(transpose - 12, buff, true); - plotSubOption(buff, color); -} - static void plotRotator(int color,int value){ char buff[12]; numToString(value, buff, true); @@ -403,14 +386,10 @@ static void plotPriority(int color){ } } -static void plotOctave(int color){ - char buff[12]; - numToString(octave-3, buff, true); - plotSubOption(buff, color); -} - static void plotMIDI(int color) { - plotSubNum(MIDIchannel, color); + char buff[7]; + numToString(MIDIchannel, buff); + plotSubOption(buff, color); if (slowMidi && color) { display.setTextColor(WHITE); } else { @@ -421,62 +400,6 @@ static void plotMIDI(int color) { display.print("S"); } -static const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", - "BR+", "VL+", "EX+", "CF", "20" }; - -static void plotBreathCC(int color){ - plotSubOption(breathCCMenuLabels[breathCC], color); -} - - -static void plotBreathAT(int color){ - if (breathAT){ - plotSubOption("ON", color); - } else { - plotSubOption("OFF", color); - } -} - - -static void plotVelocity(int color){ - if (velocity){ - plotSubNum(velocity, color); - } else { - plotSubOption("DYN", color); - } -} - -static const char* curveMenuLabels[] = {"-4", "-3", "-2", "-1", "LIN", "+1", "+2", - "+3", "+4", "S1", "S2", "Z1", "Z2" }; - - -static void plotCurve(int color){ - // Assumes curve is in rage 0..12 - plotSubOption(curveMenuLabels[curve], color); -} - -static void plotVelSmpDl(int color){ - display.setTextColor(color); - display.setCursor(79,33); - display.setTextSize(2); - if (velSmpDl){ - display.println(velSmpDl); - display.setCursor(105,40); - display.setTextSize(1); - display.println("ms"); - } else { - display.println("OFF"); - } -} - -static void plotVelBias(int color){ - if (velBias){ - plotSubNum(velBias, color); - } else { - plotSubOption("OFF", color); - } -} - static void drawSubRotator(int __unused color){ // HACKY HACK ROTATOR MENU // drawSubBox("SEMITONES"); @@ -532,24 +455,59 @@ static void clearFPS(int trills) { //*********************************************************** // Main menu -const MenuEntrySub transposeMenu = { MenuType::ESub, "TRANSPOSE", "TRANSPOSE", &subTranspose, plotTranspose }; -const MenuEntrySub octaveMenu = { MenuType::ESub, "OCTAVE", "OCTAVE", &subOctave, plotOctave }; -const MenuEntrySub midiMenu = { MenuType::ESub, "MIDI CH", "MIDI CHNL", &subMIDI, plotMIDI }; +const MenuEntrySubNew transposeMenu = { + MenuType::ESubNew, "TRANSPOSE", "TRANSPOSE", &transpose, 0, 24, MenuEntryFlags::ENone, + [](char* out, const char** __unused unit) { + numToString(transpose - 12, out, true); + }, + []() { writeSetting(TRANSP_ADDR,transpose); } + , nullptr +}; + +const MenuEntrySubNew octaveMenu = { + MenuType::ESubNew, "OCTAVE", "OCTAVE", &octave, 0, 6, MenuEntryFlags::ENone, + [](char* out, const char** __unused unit) { + numToString(octave-3, out, true); + }, + []() { writeSetting(OCTAVE_ADDR,octave); } + , nullptr +}; + +const MenuEntrySubNew midiMenu = { + MenuType::ESubNew, "MIDI CH", "MIDI CHNL", &MIDIchannel, 1, 16, MenuEntryFlags::ECustom | MenuEntryFlags::EEnterHandler, + [](char* __unused out, const char** __unused unit) { + plotMIDI(WHITE); + }, + []() { writeSetting(MIDI_ADDR, MIDIchannel); }, + []() -> bool { // On enter handler + readSwitches(); + if (pinkyKey){ + slowMidi = !slowMidi; + dipSwBits = dipSwBits ^ (1<<3); + writeSetting(DIPSW_BITS_ADDR,dipSwBits); + return false; + } else { + writeSetting(MIDI_ADDR, MIDIchannel); + return true; + } + } +}; + const MenuEntryStateCh adjustMenu = { MenuType::EStateChange, "ADJUST", ADJUST_MENU }; const MenuEntryStateCh breathMenu = { MenuType::EStateChange, "SETUP BR", SETUP_BR_MENU }; const MenuEntryStateCh controlMenu = { MenuType::EStateChange, "SETUP CTL", SETUP_CT_MENU }; -const MenuEntry* mainMenuEntries[] = { +const MenuEntry* mainMenuEntries[] = { (MenuEntry*)&transposeMenu, - (MenuEntry*)&octaveMenu, - (MenuEntry*)&midiMenu, - (MenuEntry*)&adjustMenu, - (MenuEntry*)&breathMenu, + (MenuEntry*)&octaveMenu, + (MenuEntry*)&midiMenu, + (MenuEntry*)&adjustMenu, + (MenuEntry*)&breathMenu, (MenuEntry*)&controlMenu }; const MenuPage mainMenuPage = { - nullptr, + nullptr, CursorIdx::EMain, DISPLAYOFF_IDL, ARR_LEN(mainMenuEntries), mainMenuEntries @@ -563,7 +521,7 @@ const MenuEntrySubRotator rotator3Menu = { MenuType::ESubRotator, "ROTATE 3", " const MenuEntrySubRotator rotator4Menu = { MenuType::ESubRotator, "ROTATE 4", "SEMITONES", 4, &subRotator, drawSubRotator }; const MenuEntrySub rotatorPrioMenu = { MenuType::ESub, "PRIORITY", "MONO PRIO", &subPriority, plotPriority }; -const MenuEntry* rotatorMenuEntries[] = { +const MenuEntry* rotatorMenuEntries[] = { (MenuEntry*)&rotatorParaMenu, (MenuEntry*)&rotator1Menu, (MenuEntry*)&rotator2Menu, @@ -573,21 +531,87 @@ const MenuEntry* rotatorMenuEntries[] = { }; const MenuPage rotatorMenuPage = { - "ROTATOR SETUP", + "ROTATOR SETUP", CursorIdx::ERotator, DISPLAYOFF_IDL, ARR_LEN(rotatorMenuEntries), rotatorMenuEntries }; +//*********************************************************** // Breath menu -const MenuEntrySub breathCCMenu = { MenuType::ESub, "BREATH CC", "BREATH CC", &subBreathCC, plotBreathCC }; -const MenuEntrySub breathATMenu = { MenuType::ESub, "BREATH AT", "BREATH AT", &subBreathAT, plotBreathAT }; -const MenuEntrySub velocityMenu = { MenuType::ESub, "VELOCITY", "VELOCITY", &subVelocity, plotVelocity }; -const MenuEntrySub curveMenu = { MenuType::ESub, "CURVE", "CURVE", &subCurve, plotCurve }; -const MenuEntrySub velSmpDlMenu = { MenuType::ESub, "VEL DELAY", "VEL DELAY", &subVelSmpDl, plotVelSmpDl }; -const MenuEntrySub velBiasMenu = { MenuType::ESub, "VEL BIAS", "VEL BIAS", &subVelBias, plotVelBias }; +const MenuEntrySubNew breathCCMenu = { + MenuType::ESubNew, "BREATH CC", "BREATH CC", &breathCC, 0, 10, MenuEntryFlags::EWrap, + [](char* out, const char** __unused unit) { + const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", + "BR+", "VL+", "EX+", "CF", "20" }; + strncpy(out, breathCCMenuLabels[breathCC], 4); + }, + [](){ + if (readSetting(BREATH_CC_ADDR) != breathCC) { + writeSetting(BREATH_CC_ADDR,breathCC); + midiReset(); + } + } + , nullptr +}; -const MenuEntry* breathMenuEntries[] = { +const MenuEntrySubNew breathATMenu = { + MenuType::ESubNew, "BREATH AT", "BREATH AT", &breathAT, 0, 1, MenuEntryFlags::EWrap, + [](char* out, const char ** __unused unit) { + strncpy(out, breathAT?"ON":"OFF", 4); + }, []() { + if (readSetting(BREATH_AT_ADDR) != breathAT) { + writeSetting(BREATH_AT_ADDR, breathAT); + midiReset(); + } + } + , nullptr +}; + +const MenuEntrySubNew velocityMenu = { + MenuType::ESubNew, "VELOCITY", "VELOCITY", &velocity, 0, 127, MenuEntryFlags::EWrap, + [](char* out, const char** __unused unit) { + if(velocity) numToString(velocity, out); + else strncpy(out, "DYN", 4); + }, + []() { writeSetting(VELOCITY_ADDR,velocity); } + , nullptr +}; + +const MenuEntrySubNew curveMenu = { + MenuType::ESubNew, "CURVE", "CURVE", &curve, 0, 12, MenuEntryFlags::EWrap, + [](char* out, const char** __unused unit) { + const char* curveMenuLabels[] = {"-4", "-3", "-2", "-1", "LIN", "+1", "+2", + "+3", "+4", "S1", "S2", "Z1", "Z2" }; + strncpy(out, curveMenuLabels[curve], 4); + }, + [](){ writeSetting(BREATHCURVE_ADDR,curve); } + , nullptr +}; + +const MenuEntrySubNew velSmpDlMenu = { + MenuType::ESubNew, "VEL DELAY", "VEL DELAY", &velSmpDl, 0, 30, MenuEntryFlags::EWrap, + [](char *out, const char** label) { + if (velSmpDl) { + numToString(velSmpDl, out); + *label = "ms"; + } else strncpy(out, "OFF", 4); + }, + []() { writeSetting(VEL_SMP_DL_ADDR,velSmpDl); } + , nullptr +}; + +const MenuEntrySubNew velBiasMenu = { + MenuType::ESubNew, "VEL BIAS", "VEL BIAS", &velBias, 0, 9, MenuEntryFlags::EWrap, + [](char* out, const char** __unused unit) { + if (velBias) numToString(velBias, out); + else strncpy(out, "OFF", 4); + }, + [](){ writeSetting(VEL_BIAS_ADDR,velBias); } + , nullptr +}; + +const MenuEntry* breathMenuEntries[] = { (MenuEntry*)&breathCCMenu, (MenuEntry*)&breathATMenu, (MenuEntry*)&velocityMenu, @@ -597,7 +621,7 @@ const MenuEntry* breathMenuEntries[] = { }; const MenuPage breathMenuPage = { - "SETUP BREATH", + "SETUP BREATH", CursorIdx::EBreath, MAIN_MENU, ARR_LEN(breathMenuEntries), breathMenuEntries @@ -607,16 +631,17 @@ const MenuPage breathMenuPage = { // Control menu const MenuEntrySubNew portMenu = { MenuType::ESubNew, "PORT/GLD", "PORT/GLD", &portamento, 0, 2, MenuEntryFlags::EWrap, - [](char* out, const char ** __unused label) { + [](char* out, const char ** __unused unit) { const char* labs[] = { "OFF", "ON", "SW" }; strncpy(out, labs[portamento], 4); }, []() { writeSetting(PORTAM_ADDR,portamento); } + , nullptr }; const MenuEntrySubNew pitchBendMenu = { MenuType::ESubNew, "PITCHBEND", "PITCHBEND", &PBdepth, 0, 12, MenuEntryFlags::ENone, - [](char* out, const char** __unused label) { + [](char* out, const char** __unused unit) { if(PBdepth) { memcpy(out, "1/", 2); numToString(PBdepth, &out[2]); @@ -624,15 +649,17 @@ const MenuEntrySubNew pitchBendMenu = { else strncpy(out, "OFF", 4); }, [](){ writeSetting(PB_ADDR,PBdepth); } + , nullptr }; const MenuEntrySubNew extraMenu = { MenuType::ESubNew, "EXTRA CTR", "EXTRA CTR", &extraCT, 0,4, MenuEntryFlags::EWrap, - [](char* out, const char** __unused label) { + [](char* out, const char** __unused unit) { const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" }; strncpy(out, extraMenuLabels[extraCT], 12); }, []() { writeSetting(EXTRA_ADDR,extraCT); } + , nullptr }; const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, "VIBRATO", VIBRATO_MENU }; @@ -647,20 +674,22 @@ const MenuEntrySubNew deglitchMenu = { strncpy(textBuffer, "OFF", 4); }, []() { writeSetting(DEGLITCH_ADDR,deglitch); } + , nullptr }; const MenuEntrySubNew pinkyMenu = { - MenuType::ESubNew, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 24, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused label) { - if (pinkySetting == PBD) + MenuType::ESubNew, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 24, MenuEntryFlags::ENone, + [](char* textBuffer, const char** __unused unit) { + if (pinkySetting == PBD) strncpy(textBuffer, "PBD", 4); else numToString(pinkySetting-12, textBuffer, true); }, []() { writeSetting(PINKY_KEY_ADDR,pinkySetting); } + , nullptr }; -const MenuEntry* controlMenuEntries[] = { +const MenuEntry* controlMenuEntries[] = { (MenuEntry*)&portMenu, (MenuEntry*)&pitchBendMenu, (MenuEntry*)&extraMenu, @@ -670,7 +699,7 @@ const MenuEntry* controlMenuEntries[] = { }; const MenuPage controlMenuPage = { - "SETUP CTRLS", + "SETUP CTRLS", CursorIdx::EControl, MAIN_MENU, ARR_LEN(controlMenuEntries), controlMenuEntries @@ -680,50 +709,61 @@ const MenuPage controlMenuPage = { //*********************************************************** // Vibrato menu +static void vibGetStr(char* textBuffer, const char** __unused unit) { + if(vibrato) + numToString(vibrato, textBuffer); + else + strncpy(textBuffer, "OFF", 4); +} + +static void vibStore() { + writeSetting(VIBRATO_ADDR,vibrato); +} + const MenuEntrySubNew vibDepthMenu = { MenuType::ESubNew, "DEPTH", "LEVEL", &vibrato, 0, 9, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused label) { - if(vibrato) - numToString(vibrato, textBuffer); - else - strncpy(textBuffer, "OFF", 4); - }, - []() { writeSetting(VIBRATO_ADDR,vibrato); } + vibGetStr, + vibStore, + nullptr }; const MenuEntrySubNew vibSenseMenu = { MenuType::ESubNew, "SENSE", "LEVEL", &vibSens, 1, 12, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused label) { + [](char* textBuffer, const char** __unused unit) { numToString(vibSens, textBuffer); }, []() { writeSetting(VIB_SENS_ADDR,vibSens); } + , nullptr }; const MenuEntrySubNew vibRetnMenu = { MenuType::ESubNew, "RETURN", "LEVEL", &vibRetn, 0, 4, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused label) { + [](char* textBuffer, const char** __unused unit) { numToString(vibRetn, textBuffer); }, []() { writeSetting(VIB_RETN_ADDR,vibRetn); } + , nullptr }; const MenuEntrySubNew vibSquelchMenu = { MenuType::ESubNew, "SQUELCH", "LEVEL", &vibSquelch, 1, 30, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused label) { + [](char* textBuffer, const char** __unused unit) { numToString(vibSquelch, textBuffer); }, []() { writeSetting(VIB_SQUELCH_ADDR,vibSquelch); } + , nullptr }; const MenuEntrySubNew vibDirMenu = { - MenuType::ESubNew, "DIRECTION", "DIRECTION", &vibDirection, 0, 1, MenuEntryFlags::EWrap, - [](char* textBuffer, const char** __unused label) { + MenuType::ESubNew, "DIRECTION", "DIRECTION", &vibDirection , 0, 1, MenuEntryFlags::EWrap, + [](char* out, const char** __unused unit) { if (DNWD == vibDirection) - strncpy(textBuffer, "NRM", 4); + strncpy(out, "NRM", 4); else - strncpy(textBuffer, "REV", 4); + strncpy(out, "REV", 4); }, []() { writeSetting(VIB_DIRECTION_ADDR,vibDirection); } + , nullptr }; const MenuEntry* vibratorMenuEntries[] = { @@ -735,7 +775,7 @@ const MenuEntry* vibratorMenuEntries[] = { }; const MenuPage vibratoMenuPage = { - "VIBRATO", + "VIBRATO", CursorIdx::EVibrato, SETUP_CT_MENU, ARR_LEN(vibratorMenuEntries), vibratorMenuEntries @@ -744,7 +784,7 @@ const MenuPage vibratoMenuPage = { //*********************************************************** -static bool ExecuteMenuSelection( const MenuPage &page ) //int cursorPosition, const struct MenuEntry *menuEntry) +static bool ExecuteMenuSelection(const MenuPage &page) //int cursorPosition, const struct MenuEntry *menuEntry) { int cursorPosition = cursors[page.cursor]; const MenuEntry* menuEntry = page.entries[cursorPosition]; @@ -760,23 +800,11 @@ static bool ExecuteMenuSelection( const MenuPage &page ) //int cursorPosition, c return true; case MenuType::ESubNew: - { - char buffer[12]; - const char* labelPtr = nullptr; - activeSub[page.cursor] = cursorPosition+1; - drawMenuCursor(cursorPosition, WHITE); - drawSubBox( ((const MenuEntrySubNew*)menuEntry)->subTitle); - ((const MenuEntrySubNew*)menuEntry)->getSubTextFunc(buffer, &labelPtr); - plotSubOption(buffer, WHITE); - if(labelPtr != nullptr) { - // TODO: handle this better, we should center text + label - display.setCursor(105,40); - display.setTextSize(1); - display.println(labelPtr); - } - return true; - } - break; + activeSub[page.cursor] = cursorPosition+1; + drawMenuCursor(cursorPosition, WHITE); + drawSubBox( ((const MenuEntrySubNew*)menuEntry)->subTitle); + drawSubMenu(page, WHITE); + return true; case MenuType::EStateChange: state = ((const MenuEntryStateCh*)menuEntry)->state; @@ -813,7 +841,7 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { int current_sub = activeSub[page.cursor] -1; if( current_sub < 0) - return false; + return false; auto sub = (const MenuEntrySubNew*)page.entries[current_sub]; uint16_t currentVal = *sub->valuePtr; @@ -835,7 +863,18 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { } break; - case BTN_ENTER: // fallthrough + case BTN_ENTER: + if(sub->flags & MenuEntryFlags::EEnterHandler) { + bool result = sub->onEnterFunc(); + if(result) { + activeSub[page.cursor] = 0; + } + } else { + activeSub[page.cursor] = 0; + sub->applyFunc(); + } + break; + case BTN_MENU: activeSub[page.cursor] = 0; sub->applyFunc(); @@ -864,7 +903,7 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { if (buttonPressedAndNotUsed) { - int lastEntry = page.numEntries-1; + int lastEntry = page.numEntries-1; buttonPressedAndNotUsed = 0; switch (deumButtonState) { @@ -934,7 +973,7 @@ static void checkForPatchView(int buttons) { } } -// This should be moved to a separate file/process that handles only led +// This should be moved to a separate file/process that handles only led static void statusBlink() { digitalWrite(statusLedPin,LOW); delay(150); @@ -956,7 +995,7 @@ void drawSensorPixels() { void menu() { unsigned long timeNow = millis(); - const MenuPage *currentPage = nullptr; + const MenuPage *currentPage = nullptr; bool redrawSubValue = false; bool redraw = stateFirstRun; @@ -998,13 +1037,6 @@ void menu() { if (state && ((timeNow - menuTime) > menuTimeUp)) { // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) state = DISPLAYOFF_IDL; stateFirstRun = 1; - subTranspose = 0; - subMIDI = 0; - subBreathCC = 0; - subBreathAT = 0; - subVelocity = 0; - subVelSmpDl = 0; - subVelBias = 0; subParallel = 0; subRotator = 0; @@ -1169,91 +1201,14 @@ void menu() { } } } else if (state == MAIN_MENU) { // MAIN MENU HERE <<<<<<<<<<<<<<< + currentPage = &mainMenuPage; if (stateFirstRun) { drawMenuScreen(); stateFirstRun = 0; } - currentPage = &mainMenuPage; - if (subTranspose){ - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (transpose > 0) - transpose--; - break; - case BTN_UP: - if (transpose < 24) - transpose++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subTranspose = 0; - writeSetting(TRANSP_ADDR,transpose); - break; - } - redrawSubValue = true; - } - } else if (subOctave){ - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (octave > 0) - octave--; - break; - - case BTN_UP: - if (octave < 6) - octave++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subOctave = 0; - writeSetting(OCTAVE_ADDR,octave); - break; - } - redrawSubValue = true; - } - } else if (subMIDI) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (MIDIchannel > 1) - MIDIchannel--; - break; - - case BTN_UP: - if (MIDIchannel < 16) - MIDIchannel++; - break; - - case BTN_ENTER: - readSwitches(); - if (pinkyKey){ - slowMidi = !slowMidi; - dipSwBits = dipSwBits ^ (1<<3); - writeSetting(DIPSW_BITS_ADDR,dipSwBits); - } else { - subMIDI = 0; - writeSetting(MIDI_ADDR,MIDIchannel); - } - break; - - case BTN_MENU: - subMIDI = 0; - writeSetting(MIDI_ADDR,MIDIchannel); - break; - } - redrawSubValue = true; - } + if(activeSub[currentPage->cursor]) { + redraw |= updateSubMenu(*currentPage, timeNow); } else { bool hadButtons = buttonPressedAndNotUsed; redraw |= updateMenuPage( *currentPage, timeNow ); @@ -1358,7 +1313,7 @@ void menu() { } } else { bool hadButtons = buttonPressedAndNotUsed; - redraw |= updateMenuPage( *currentPage, timeNow ); + redraw |= updateMenuPage(*currentPage, timeNow ); if (hadButtons) checkForPatchView(deumButtonState); } @@ -1384,172 +1339,17 @@ void menu() { touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); } } else if (state == SETUP_BR_MENU) { // SETUP BREATH MENU HERE <<<<<<<<<<<<<< + currentPage = &breathMenuPage; if (stateFirstRun) { - drawMenu( breathMenuPage ); + drawMenu(*currentPage); stateFirstRun = 0; } - currentPage = &breathMenuPage; - if (subBreathCC){ - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (breathCC > 0){ - breathCC--; - } else { - breathCC = 10; - } - break; - case BTN_UP: - if (breathCC < 10){ - breathCC++; - } else { - breathCC = 0; - } - break; - case BTN_ENTER: // fallthrough - case BTN_MENU: - // menu - subBreathCC = 0; - if (readSetting(BREATH_CC_ADDR) != breathCC) { - writeSetting(BREATH_CC_ADDR,breathCC); - midiReset(); - } - break; - } - redrawSubValue = true; - } - } else if (subBreathAT) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: // fallthrough - case BTN_UP: - breathAT = !breathAT; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subBreathAT = 0; - if (readSetting(BREATH_AT_ADDR) != breathAT){ - writeSetting(BREATH_AT_ADDR, breathAT); - midiReset(); - } - break; - } - redrawSubValue = true; - } - } else if (subVelocity) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (velocity > 0){ - velocity--; - } else velocity = 127; - break; - - case BTN_UP: - if (velocity < 127){ - velocity++; - } else velocity = 0; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVelocity = 0; - writeSetting(VELOCITY_ADDR,velocity); - break; - } - redrawSubValue = true; - } - - } else if (subCurve) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (curve > 0) - curve--; - else curve = 12; - break; - - case BTN_UP: - if (curve < 12) - curve++; - else curve = 0; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subCurve = 0; - writeSetting(BREATHCURVE_ADDR,curve); - break; - } - redrawSubValue = true; - } - - } else if (subVelSmpDl) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (velSmpDl > 0){ - velSmpDl-=1; - } else velSmpDl = 30; - break; - - case BTN_UP: - if (velSmpDl < 30){ - velSmpDl+=1; - } else velSmpDl = 0; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVelSmpDl = 0; - writeSetting(VEL_SMP_DL_ADDR,velSmpDl); - break; - } - redrawSubValue = true; - } - - } else if (subVelBias) { - redraw |= updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState) { - case BTN_DOWN: - if (velBias > 0){ - velBias--; - } else velBias = 9; - break; - - case BTN_UP: - if (velBias < 9){ - velBias++; - } else velBias = 0; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subVelBias = 0; - writeSetting(VEL_BIAS_ADDR,velBias); - break; - } - redrawSubValue = true; - } - + if (activeSub[currentPage->cursor]) { + redraw |= updateSubMenu(*currentPage, timeNow); } else { - redraw |= updateMenuPage( *currentPage, timeNow ); + redraw |= updateMenuPage(*currentPage, timeNow); } - } else if (state == SETUP_CT_MENU) { // SETUP CONTROLLERS MENU HERE <<<<<<<<<<<<< currentPage = &controlMenuPage; if (stateFirstRun) { diff --git a/NuEVI/numenu.h b/NuEVI/numenu.h index befb618..9746056 100644 --- a/NuEVI/numenu.h +++ b/NuEVI/numenu.h @@ -27,6 +27,7 @@ enum MenuEntryFlags { ENone = 0, EWrap = (1<<0), ECustom = (1<<1), + EEnterHandler = (1<<2), }; struct MenuEntrySubNew { @@ -39,6 +40,7 @@ struct MenuEntrySubNew { uint16_t flags; void (*getSubTextFunc)(char*textBuffer, const char**label); void (*applyFunc)(void); + bool (*onEnterFunc)(void); }; From 6c721e8b65a360c6d18783d0bb8ea98372a6bdab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sat, 22 Jun 2019 21:23:45 +0200 Subject: [PATCH 24/35] Removed code duplication Also fixed bug were I reset the active sub menu when then sleep timer kicks in. --- NuEVI/menu.cpp | 56 ++++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 36 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index f56b461..2e1d907 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -947,6 +947,18 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { return redraw; } +static bool updatePage(const MenuPage &page, uint32_t timeNow) { + if (stateFirstRun) { + drawMenu(page); + stateFirstRun = 0; + } + if (activeSub[page.cursor]) { + return updateSubMenu(page, timeNow); + } else { + return updateMenuPage(page, timeNow); + } +} + //*********************************************************** static void checkForPatchView(int buttons) { int trills = readTrills(); @@ -1034,7 +1046,8 @@ void menu() { // save the reading. Next time through the loop, it'll be the lastButtonState: lastDeumButtons = deumButtons; - if (state && ((timeNow - menuTime) > menuTimeUp)) { // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) + // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) + if (state && ((timeNow - menuTime) > menuTimeUp)) { state = DISPLAYOFF_IDL; stateFirstRun = 1; @@ -1043,6 +1056,7 @@ void menu() { subPriority = 0; subVibSquelch = 0; + memset(activeSub, 0, sizeof(activeSub)); } if (state == DISPLAYOFF_IDL) { @@ -1322,14 +1336,13 @@ void menu() { } else if (state == ADJUST_MENU) { // This is a hack to update touch_Thr is it was changed.. int old_thr = ctouchThrVal; - int result = updateAdjustMenu( timeNow, buttonPressedAndNotUsed ? deumButtonState : 0, stateFirstRun, updateSensorPixelsFlag); + int result = updateAdjustMenu(timeNow, buttonPressedAndNotUsed ? deumButtonState : 0, stateFirstRun, updateSensorPixelsFlag); updateSensorPixelsFlag = false; stateFirstRun = 0; buttonPressedAndNotUsed = 0; - if( result < 0) - { + if( result < 0) { // Go back to main menu state = MAIN_MENU; stateFirstRun = true; @@ -1339,40 +1352,11 @@ void menu() { touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); } } else if (state == SETUP_BR_MENU) { // SETUP BREATH MENU HERE <<<<<<<<<<<<<< - currentPage = &breathMenuPage; - if (stateFirstRun) { - drawMenu(*currentPage); - stateFirstRun = 0; - } - if (activeSub[currentPage->cursor]) { - redraw |= updateSubMenu(*currentPage, timeNow); - } else { - redraw |= updateMenuPage(*currentPage, timeNow); - } - + redraw |= updatePage(breathMenuPage, timeNow); } else if (state == SETUP_CT_MENU) { // SETUP CONTROLLERS MENU HERE <<<<<<<<<<<<< - currentPage = &controlMenuPage; - if (stateFirstRun) { - drawMenu(*currentPage); - stateFirstRun = 0; - } - if (activeSub[currentPage->cursor]) { - redraw |= updateSubMenu(*currentPage, timeNow); - } else { - redraw |= updateMenuPage(*currentPage, timeNow); - } - + redraw |= updatePage(controlMenuPage, timeNow); } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< - currentPage = &vibratoMenuPage; - if (stateFirstRun) { - drawMenu(*currentPage); - stateFirstRun = 0; - } - if (activeSub[currentPage->cursor]) { - redraw |= updateSubMenu(*currentPage, timeNow); - } else { - redraw |= updateMenuPage(*currentPage, timeNow); - } + redraw |= updatePage(vibratoMenuPage, timeNow); } if(redrawSubValue && currentPage) { From bddbffd51dcb4af1daf02d37bb989e406edfd5eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 01:17:56 +0200 Subject: [PATCH 25/35] Moved over the rotation menu to new system Had to change how the values where stored in RAM from singed to unsigned to be able to use the generic menu features. Also had to add the MenuEntrySub as a parameter to the menu callback functions to be able fo display and store the correct values. Did some major cleanup now that the special case of rotator menu is gone together with all uses of the old version of the sub menu struct. --- NuEVI/NuEVI.ino | 30 ++-- NuEVI/globals.h | 4 +- NuEVI/menu.cpp | 401 +++++++++++++++++++----------------------------- NuEVI/numenu.h | 41 ++--- 4 files changed, 189 insertions(+), 287 deletions(-) diff --git a/NuEVI/NuEVI.ino b/NuEVI/NuEVI.ino index efc4e0f..0c146f4 100644 --- a/NuEVI/NuEVI.ino +++ b/NuEVI/NuEVI.ino @@ -81,8 +81,8 @@ unsigned short fastPatch[7] = {0,0,0,0,0,0,0}; byte rotatorOn = 0; byte currentRotation = 0; -int rotations[4] = { -5, -10, -7, -14 }; // semitones { -5, -10, -7, -14 }; -int parallel = 7; // semitones +uint16_t rotations[4]; // semitones { -5, -10, -7, -14 }; +uint16_t parallel; // = 7; // semitones byte gateOpen = 0; // setting for gate always open, note on sent for every time fingering changes, no matter the breath status @@ -335,11 +335,11 @@ void setup() { fastPatch[5] = readSetting(FP6_ADDR); fastPatch[6] = readSetting(FP7_ADDR); dipSwBits = readSetting(DIPSW_BITS_ADDR); - parallel = readSetting(PARAL_ADDR)-24; - rotations[0] = readSetting(ROTN1_ADDR)-24; - rotations[1] = readSetting(ROTN2_ADDR)-24; - rotations[2] = readSetting(ROTN3_ADDR)-24; - rotations[3] = readSetting(ROTN4_ADDR)-24; + parallel = readSetting(PARAL_ADDR); + rotations[0] = readSetting(ROTN1_ADDR); + rotations[1] = readSetting(ROTN2_ADDR); + rotations[2] = readSetting(ROTN3_ADDR); + rotations[3] = readSetting(ROTN4_ADDR); priority = readSetting(PRIO_ADDR); vibSens = readSetting(VIB_SENS_ADDR); vibRetn = readSetting(VIB_RETN_ADDR); @@ -639,10 +639,10 @@ void loop() { } } if (rotatorOn) { - midiSendNoteOn(noteValueCheck(fingeredNote + parallel), velocitySend); // send Note On message for new note + midiSendNoteOn(noteValueCheck(fingeredNote + parallel-24), velocitySend); // send Note On message for new note if (currentRotation < 3) currentRotation++; else currentRotation = 0; - midiSendNoteOn(noteValueCheck(fingeredNote + rotations[currentRotation]), velocitySend); // send Note On message for new note + midiSendNoteOn(noteValueCheck(fingeredNote + rotations[currentRotation]-24), velocitySend); // send Note On message for new note } if (!priority) { // mono prio to base note midiSendNoteOn(fingeredNote, velocitySend); // send Note On message for new note @@ -676,8 +676,8 @@ void loop() { } } if (rotatorOn) { - midiSendNoteOff(noteValueCheck(activeNote + parallel)); // send Note Off message for old note - midiSendNoteOff(noteValueCheck(activeNote + rotations[currentRotation])); // send Note Off message for old note + midiSendNoteOff(noteValueCheck(activeNote + parallel-24 )); // send Note Off message for old note + midiSendNoteOff(noteValueCheck(activeNote + rotations[currentRotation]-24)); // send Note Off message for old note } if (!priority) { midiSendNoteOff(activeNote); // send Note Off message @@ -725,8 +725,8 @@ void loop() { } } if (rotatorOn) { - midiSendNoteOff(noteValueCheck(activeNote + parallel)); // send Note Off message for old note - midiSendNoteOff(noteValueCheck(activeNote + rotations[currentRotation])); // send Note Off message for old note + midiSendNoteOff(noteValueCheck(activeNote + parallel-24)); // send Note Off message for old note + midiSendNoteOff(noteValueCheck(activeNote + rotations[currentRotation]-24)); // send Note Off message for old note } if ((parallelChord || subOctaveDouble || rotatorOn) && !priority) { // poly playing, send old note off before new note on midiSendNoteOff(activeNote); // send Note Off message for old note @@ -750,10 +750,10 @@ void loop() { } } if (rotatorOn) { - midiSendNoteOn(noteValueCheck(fingeredNote + parallel), velocitySend); // send Note On message for new note + midiSendNoteOn(noteValueCheck(fingeredNote + parallel-24), velocitySend); // send Note On message for new note if (currentRotation < 3) currentRotation++; else currentRotation = 0; - midiSendNoteOn(noteValueCheck(fingeredNote + rotations[currentRotation]), velocitySend); // send Note On message for new note + midiSendNoteOn(noteValueCheck(fingeredNote + rotations[currentRotation]-24), velocitySend); // send Note On message for new note } if (!priority) { diff --git a/NuEVI/globals.h b/NuEVI/globals.h index a8f0b5f..98776a3 100644 --- a/NuEVI/globals.h +++ b/NuEVI/globals.h @@ -37,8 +37,8 @@ extern unsigned short vibDirection; //direction of first vibrato wave UPWD or DN extern unsigned short fastPatch[7]; extern byte rotatorOn; extern byte currentRotation; -extern int rotations[4]; -extern int parallel; // semitones +extern uint16_t rotations[4]; +extern uint16_t parallel; // semitones extern int touch_Thr; diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 2e1d907..9a7768b 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -37,7 +37,6 @@ static byte activeSub[CursorIdx::NUM_CURSORS]; byte cursorNow; -static byte forceRedraw = 0; static byte FPD = 0; @@ -216,20 +215,15 @@ static void plotSubOption(const char* label, int color) { static bool drawSubMenu(const MenuPage &page, int color) { int index = cursors[page.cursor]; - // TODO: Handle MenuEntrySubRotator case // TODO: Null check subMenuFunc const MenuEntry* subEntry = page.entries[index]; switch(subEntry->type) { case MenuType::ESub: - ((const MenuEntrySub*)subEntry)->subMenuFunc(color); - break; - - case MenuType::ESubNew: { char buffer[12]; const char* labelPtr = nullptr; - const MenuEntrySubNew* sub = (const MenuEntrySubNew*)subEntry; - sub->getSubTextFunc(buffer, &labelPtr); + const MenuEntrySub* sub = (const MenuEntrySub*)subEntry; + sub->getSubTextFunc(*sub, buffer, &labelPtr); // If ECustom flag is set, we assume that the getSubTextFunc // rendered by it self. @@ -354,7 +348,6 @@ static void drawPatchView(){ } } - static void drawSubBox(const char* label) { display.fillRect(63,11,64,52,BLACK); @@ -372,20 +365,6 @@ void drawMenuCursor(byte itemNo, byte color){ display.drawTriangle(57, ymid,61, ymid+2,61, ymid-2, color); } -static void plotRotator(int color,int value){ - char buff[12]; - numToString(value, buff, true); - plotSubOption(buff, color); -} - -static void plotPriority(int color){ - if (priority){ - plotSubOption("ROT", color); - } else { - plotSubOption("MEL", color); - } -} - static void plotMIDI(int color) { char buff[7]; numToString(MIDIchannel, buff); @@ -400,13 +379,6 @@ static void plotMIDI(int color) { display.print("S"); } -static void drawSubRotator(int __unused color){ - // HACKY HACK ROTATOR MENU - // drawSubBox("SEMITONES"); - //plotRotator(WHITE,value); - forceRedraw = 1; -} - //*********************************************************** // TODO: Move these to a settings.cpp maybe? @@ -455,30 +427,30 @@ static void clearFPS(int trills) { //*********************************************************** // Main menu -const MenuEntrySubNew transposeMenu = { - MenuType::ESubNew, "TRANSPOSE", "TRANSPOSE", &transpose, 0, 24, MenuEntryFlags::ENone, - [](char* out, const char** __unused unit) { +const MenuEntrySub transposeMenu = { + MenuType::ESub, "TRANSPOSE", "TRANSPOSE", &transpose, 0, 24, MenuEntryFlags::ENone, + [](SubMenuRef __unused, char* out, const char** __unused unit) { numToString(transpose - 12, out, true); }, - []() { writeSetting(TRANSP_ADDR,transpose); } + [](const MenuEntrySub &sub) { writeSetting(TRANSP_ADDR,*sub.valuePtr); } , nullptr }; -const MenuEntrySubNew octaveMenu = { - MenuType::ESubNew, "OCTAVE", "OCTAVE", &octave, 0, 6, MenuEntryFlags::ENone, - [](char* out, const char** __unused unit) { +const MenuEntrySub octaveMenu = { + MenuType::ESub, "OCTAVE", "OCTAVE", &octave, 0, 6, MenuEntryFlags::ENone, + [](SubMenuRef __unused, char* out, const char** __unused unit) { numToString(octave-3, out, true); }, - []() { writeSetting(OCTAVE_ADDR,octave); } + [](SubMenuRef __unused) { writeSetting(OCTAVE_ADDR,octave); } , nullptr }; -const MenuEntrySubNew midiMenu = { - MenuType::ESubNew, "MIDI CH", "MIDI CHNL", &MIDIchannel, 1, 16, MenuEntryFlags::ECustom | MenuEntryFlags::EEnterHandler, - [](char* __unused out, const char** __unused unit) { +const MenuEntrySub midiMenu = { + MenuType::ESub, "MIDI CH", "MIDI CHNL", &MIDIchannel, 1, 16, MenuEntryFlags::ECustom | MenuEntryFlags::EEnterHandler, + [](SubMenuRef __unused, char* __unused out, const char** __unused unit) { plotMIDI(WHITE); }, - []() { writeSetting(MIDI_ADDR, MIDIchannel); }, + [](const MenuEntrySub & __unused sub) { writeSetting(MIDI_ADDR, MIDIchannel); }, []() -> bool { // On enter handler readSwitches(); if (pinkyKey){ @@ -513,13 +485,80 @@ const MenuPage mainMenuPage = { ARR_LEN(mainMenuEntries), mainMenuEntries }; + +//*********************************************************** // Rotator menu -const MenuEntrySub rotatorParaMenu = { MenuType::ESub, "PARALLEL", "SEMITONES", &subParallel, drawSubRotator }; -const MenuEntrySubRotator rotator1Menu = { MenuType::ESubRotator, "ROTATE 1", "SEMITONES", 1, &subRotator, drawSubRotator }; -const MenuEntrySubRotator rotator2Menu = { MenuType::ESubRotator, "ROTATE 2", "SEMITONES", 2, &subRotator, drawSubRotator }; -const MenuEntrySubRotator rotator3Menu = { MenuType::ESubRotator, "ROTATE 3", "SEMITONES", 3, &subRotator, drawSubRotator }; -const MenuEntrySubRotator rotator4Menu = { MenuType::ESubRotator, "ROTATE 4", "SEMITONES", 4, &subRotator, drawSubRotator }; -const MenuEntrySub rotatorPrioMenu = { MenuType::ESub, "PRIORITY", "MONO PRIO", &subPriority, plotPriority }; + +static void rotatorSave(const MenuEntrySub& __unused sub) { + int16_t stored; + for(int i = 0; i < 4; ++i) { + stored = readSetting(ROTN1_ADDR+2*i); + if(stored != rotations[i]) + writeSetting(ROTN1_ADDR+2*i,(rotations[i])); + } +} + +static void rotatorOptionGet(SubMenuRef sub, char *out, const char** __unused unit) { + numToString((*sub.valuePtr) - 24, out, true); +} + +static void parallelOptionGet(SubMenuRef __unused, char *out, const char** __unused unit) { + numToString(parallel-24, out, true); +} + +static void parallelSave(SubMenuRef __unused) { + writeSetting(PARAL_ADDR, parallel); +} + +const MenuEntrySub rotatorParaMenu = { + MenuType::ESub, "PARALLEL", "SEMITONES", ¶llel, 0, 48, MenuEntryFlags::ENone, + parallelOptionGet, + parallelSave, + nullptr +}; + +const MenuEntrySub rotator1Menu = { + MenuType::ESub, "ROTATE 1", "SEMITONES", &rotations[0], 0, 48, MenuEntryFlags::ENone, + rotatorOptionGet, + rotatorSave, + nullptr +}; + +const MenuEntrySub rotator2Menu = { + MenuType::ESub, "ROTATE 2", "SEMITONES", &rotations[1], 0, 48, MenuEntryFlags::ENone, + rotatorOptionGet, + rotatorSave, + nullptr +}; +const MenuEntrySub rotator3Menu = { + MenuType::ESub, "ROTATE 3", "SEMITONES", &rotations[2], 0, 48, MenuEntryFlags::ENone, + rotatorOptionGet, + rotatorSave, + nullptr +}; +const MenuEntrySub rotator4Menu = { + MenuType::ESub, "ROTATE 4", "SEMITONES", &rotations[3], 0, 48, MenuEntryFlags::ENone, + rotatorOptionGet, + rotatorSave, + nullptr +}; + +static void rotatorPrioOptionGet(SubMenuRef __unused, char* out, const char** __unused) { + if (priority) strncpy(out, "ROT", 4); + else strncpy(out, "MEL", 4); +} + +static void rotatorPrioSave(SubMenuRef __unused) { + writeSetting(PRIO_ADDR,priority); +} + +const MenuEntrySub rotatorPrioMenu = { + MenuType::ESub, "PRIORITY", "MONO PRIO", &priority, 0,1, MenuEntryFlags::EWrap, + rotatorPrioOptionGet, + rotatorPrioSave, + nullptr, +}; + const MenuEntry* rotatorMenuEntries[] = { (MenuEntry*)&rotatorParaMenu, @@ -539,14 +578,14 @@ const MenuPage rotatorMenuPage = { //*********************************************************** // Breath menu -const MenuEntrySubNew breathCCMenu = { - MenuType::ESubNew, "BREATH CC", "BREATH CC", &breathCC, 0, 10, MenuEntryFlags::EWrap, - [](char* out, const char** __unused unit) { +const MenuEntrySub breathCCMenu = { + MenuType::ESub, "BREATH CC", "BREATH CC", &breathCC, 0, 10, MenuEntryFlags::EWrap, + [](SubMenuRef __unused, char* out, const char** __unused unit) { const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", "BR+", "VL+", "EX+", "CF", "20" }; strncpy(out, breathCCMenuLabels[breathCC], 4); }, - [](){ + [](const MenuEntrySub & __unused sub){ if (readSetting(BREATH_CC_ADDR) != breathCC) { writeSetting(BREATH_CC_ADDR,breathCC); midiReset(); @@ -555,11 +594,11 @@ const MenuEntrySubNew breathCCMenu = { , nullptr }; -const MenuEntrySubNew breathATMenu = { - MenuType::ESubNew, "BREATH AT", "BREATH AT", &breathAT, 0, 1, MenuEntryFlags::EWrap, - [](char* out, const char ** __unused unit) { +const MenuEntrySub breathATMenu = { + MenuType::ESub, "BREATH AT", "BREATH AT", &breathAT, 0, 1, MenuEntryFlags::EWrap, + [](SubMenuRef __unused, char* out, const char ** __unused unit) { strncpy(out, breathAT?"ON":"OFF", 4); - }, []() { + }, [](const MenuEntrySub & __unused sub) { if (readSetting(BREATH_AT_ADDR) != breathAT) { writeSetting(BREATH_AT_ADDR, breathAT); midiReset(); @@ -568,46 +607,46 @@ const MenuEntrySubNew breathATMenu = { , nullptr }; -const MenuEntrySubNew velocityMenu = { - MenuType::ESubNew, "VELOCITY", "VELOCITY", &velocity, 0, 127, MenuEntryFlags::EWrap, - [](char* out, const char** __unused unit) { +const MenuEntrySub velocityMenu = { + MenuType::ESub, "VELOCITY", "VELOCITY", &velocity, 0, 127, MenuEntryFlags::EWrap, + [](SubMenuRef __unused, char* out, const char** __unused unit) { if(velocity) numToString(velocity, out); else strncpy(out, "DYN", 4); }, - []() { writeSetting(VELOCITY_ADDR,velocity); } + [](const MenuEntrySub & __unused sub) { writeSetting(VELOCITY_ADDR,velocity); } , nullptr }; -const MenuEntrySubNew curveMenu = { - MenuType::ESubNew, "CURVE", "CURVE", &curve, 0, 12, MenuEntryFlags::EWrap, - [](char* out, const char** __unused unit) { +const MenuEntrySub curveMenu = { + MenuType::ESub, "CURVE", "CURVE", &curve, 0, 12, MenuEntryFlags::EWrap, + [](SubMenuRef __unused, char* out, const char** __unused unit) { const char* curveMenuLabels[] = {"-4", "-3", "-2", "-1", "LIN", "+1", "+2", "+3", "+4", "S1", "S2", "Z1", "Z2" }; strncpy(out, curveMenuLabels[curve], 4); }, - [](){ writeSetting(BREATHCURVE_ADDR,curve); } + [](const MenuEntrySub & __unused sub){ writeSetting(BREATHCURVE_ADDR,curve); } , nullptr }; -const MenuEntrySubNew velSmpDlMenu = { - MenuType::ESubNew, "VEL DELAY", "VEL DELAY", &velSmpDl, 0, 30, MenuEntryFlags::EWrap, - [](char *out, const char** label) { +const MenuEntrySub velSmpDlMenu = { + MenuType::ESub, "VEL DELAY", "VEL DELAY", &velSmpDl, 0, 30, MenuEntryFlags::EWrap, + [](SubMenuRef __unused, char *out, const char** label) { if (velSmpDl) { numToString(velSmpDl, out); *label = "ms"; } else strncpy(out, "OFF", 4); }, - []() { writeSetting(VEL_SMP_DL_ADDR,velSmpDl); } + [](const MenuEntrySub & __unused sub) { writeSetting(VEL_SMP_DL_ADDR,velSmpDl); } , nullptr }; -const MenuEntrySubNew velBiasMenu = { - MenuType::ESubNew, "VEL BIAS", "VEL BIAS", &velBias, 0, 9, MenuEntryFlags::EWrap, - [](char* out, const char** __unused unit) { +const MenuEntrySub velBiasMenu = { + MenuType::ESub, "VEL BIAS", "VEL BIAS", &velBias, 0, 9, MenuEntryFlags::EWrap, + [](SubMenuRef __unused, char* out, const char** __unused unit) { if (velBias) numToString(velBias, out); else strncpy(out, "OFF", 4); }, - [](){ writeSetting(VEL_BIAS_ADDR,velBias); } + [](SubMenuRef __unused){ writeSetting(VEL_BIAS_ADDR,velBias); } , nullptr }; @@ -629,63 +668,63 @@ const MenuPage breathMenuPage = { //*********************************************************** // Control menu -const MenuEntrySubNew portMenu = { - MenuType::ESubNew, "PORT/GLD", "PORT/GLD", &portamento, 0, 2, MenuEntryFlags::EWrap, - [](char* out, const char ** __unused unit) { +const MenuEntrySub portMenu = { + MenuType::ESub, "PORT/GLD", "PORT/GLD", &portamento, 0, 2, MenuEntryFlags::EWrap, + [](SubMenuRef __unused,char* out, const char ** __unused unit) { const char* labs[] = { "OFF", "ON", "SW" }; strncpy(out, labs[portamento], 4); }, - []() { writeSetting(PORTAM_ADDR,portamento); } + [](SubMenuRef __unused sub) { writeSetting(PORTAM_ADDR,portamento); } , nullptr }; -const MenuEntrySubNew pitchBendMenu = { - MenuType::ESubNew, "PITCHBEND", "PITCHBEND", &PBdepth, 0, 12, MenuEntryFlags::ENone, - [](char* out, const char** __unused unit) { +const MenuEntrySub pitchBendMenu = { + MenuType::ESub, "PITCHBEND", "PITCHBEND", &PBdepth, 0, 12, MenuEntryFlags::ENone, + [](SubMenuRef __unused, char* out, const char** __unused unit) { if(PBdepth) { memcpy(out, "1/", 2); numToString(PBdepth, &out[2]); } else strncpy(out, "OFF", 4); }, - [](){ writeSetting(PB_ADDR,PBdepth); } + [](SubMenuRef __unused){ writeSetting(PB_ADDR,PBdepth); } , nullptr }; -const MenuEntrySubNew extraMenu = { - MenuType::ESubNew, "EXTRA CTR", "EXTRA CTR", &extraCT, 0,4, MenuEntryFlags::EWrap, - [](char* out, const char** __unused unit) { +const MenuEntrySub extraMenu = { + MenuType::ESub, "EXTRA CTR", "EXTRA CTR", &extraCT, 0,4, MenuEntryFlags::EWrap, + [](SubMenuRef __unused,char* out, const char** __unused unit) { const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" }; strncpy(out, extraMenuLabels[extraCT], 12); }, - []() { writeSetting(EXTRA_ADDR,extraCT); } + [](const MenuEntrySub & __unused sub) { writeSetting(EXTRA_ADDR,extraCT); } , nullptr }; const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, "VIBRATO", VIBRATO_MENU }; -const MenuEntrySubNew deglitchMenu = { - MenuType::ESubNew, "DEGLITCH", "DEGLITCH", °litch, 0, 70, MenuEntryFlags::ENone, - [](char* textBuffer, const char** label) { +const MenuEntrySub deglitchMenu = { + MenuType::ESub, "DEGLITCH", "DEGLITCH", °litch, 0, 70, MenuEntryFlags::ENone, + [](SubMenuRef __unused,char* textBuffer, const char** label) { if(deglitch) { numToString(deglitch, textBuffer); *label = "ms"; } else strncpy(textBuffer, "OFF", 4); }, - []() { writeSetting(DEGLITCH_ADDR,deglitch); } + [](const MenuEntrySub & __unused sub) { writeSetting(DEGLITCH_ADDR,deglitch); } , nullptr }; -const MenuEntrySubNew pinkyMenu = { - MenuType::ESubNew, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 24, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused unit) { +const MenuEntrySub pinkyMenu = { + MenuType::ESub, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 24, MenuEntryFlags::ENone, + [](SubMenuRef __unused,char* textBuffer, const char** __unused unit) { if (pinkySetting == PBD) strncpy(textBuffer, "PBD", 4); else numToString(pinkySetting-12, textBuffer, true); }, - []() { writeSetting(PINKY_KEY_ADDR,pinkySetting); } + [](const MenuEntrySub & __unused sub) { writeSetting(PINKY_KEY_ADDR,pinkySetting); } , nullptr }; @@ -709,60 +748,60 @@ const MenuPage controlMenuPage = { //*********************************************************** // Vibrato menu -static void vibGetStr(char* textBuffer, const char** __unused unit) { +static void vibGetStr(SubMenuRef __unused, char* textBuffer, const char** __unused unit) { if(vibrato) numToString(vibrato, textBuffer); else strncpy(textBuffer, "OFF", 4); } -static void vibStore() { +static void vibStore(const MenuEntrySub & __unused sub) { writeSetting(VIBRATO_ADDR,vibrato); } -const MenuEntrySubNew vibDepthMenu = { - MenuType::ESubNew, "DEPTH", "LEVEL", &vibrato, 0, 9, MenuEntryFlags::ENone, +const MenuEntrySub vibDepthMenu = { + MenuType::ESub, "DEPTH", "LEVEL", &vibrato, 0, 9, MenuEntryFlags::ENone, vibGetStr, vibStore, nullptr }; -const MenuEntrySubNew vibSenseMenu = { - MenuType::ESubNew, "SENSE", "LEVEL", &vibSens, 1, 12, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused unit) { +const MenuEntrySub vibSenseMenu = { + MenuType::ESub, "SENSE", "LEVEL", &vibSens, 1, 12, MenuEntryFlags::ENone, + [](SubMenuRef __unused,char* textBuffer, const char** __unused unit) { numToString(vibSens, textBuffer); }, - []() { writeSetting(VIB_SENS_ADDR,vibSens); } + [](const MenuEntrySub & __unused sub) { writeSetting(VIB_SENS_ADDR,vibSens); } , nullptr }; -const MenuEntrySubNew vibRetnMenu = { - MenuType::ESubNew, "RETURN", "LEVEL", &vibRetn, 0, 4, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused unit) { +const MenuEntrySub vibRetnMenu = { + MenuType::ESub, "RETURN", "LEVEL", &vibRetn, 0, 4, MenuEntryFlags::ENone, + [](SubMenuRef __unused, char* textBuffer, const char** __unused unit) { numToString(vibRetn, textBuffer); }, - []() { writeSetting(VIB_RETN_ADDR,vibRetn); } + [](const MenuEntrySub & __unused sub) { writeSetting(VIB_RETN_ADDR,vibRetn); } , nullptr }; -const MenuEntrySubNew vibSquelchMenu = { - MenuType::ESubNew, "SQUELCH", "LEVEL", &vibSquelch, 1, 30, MenuEntryFlags::ENone, - [](char* textBuffer, const char** __unused unit) { +const MenuEntrySub vibSquelchMenu = { + MenuType::ESub, "SQUELCH", "LEVEL", &vibSquelch, 1, 30, MenuEntryFlags::ENone, + [](SubMenuRef __unused, char* textBuffer, const char** __unused unit) { numToString(vibSquelch, textBuffer); }, - []() { writeSetting(VIB_SQUELCH_ADDR,vibSquelch); } + [](const MenuEntrySub & __unused sub) { writeSetting(VIB_SQUELCH_ADDR,vibSquelch); } , nullptr }; -const MenuEntrySubNew vibDirMenu = { - MenuType::ESubNew, "DIRECTION", "DIRECTION", &vibDirection , 0, 1, MenuEntryFlags::EWrap, - [](char* out, const char** __unused unit) { +const MenuEntrySub vibDirMenu = { + MenuType::ESub, "DIRECTION", "DIRECTION", &vibDirection , 0, 1, MenuEntryFlags::EWrap, + [](SubMenuRef __unused, char* out, const char** __unused unit) { if (DNWD == vibDirection) strncpy(out, "NRM", 4); else strncpy(out, "REV", 4); }, - []() { writeSetting(VIB_DIRECTION_ADDR,vibDirection); } + [](const MenuEntrySub & __unused sub) { writeSetting(VIB_DIRECTION_ADDR,vibDirection); } , nullptr }; @@ -784,25 +823,16 @@ const MenuPage vibratoMenuPage = { //*********************************************************** -static bool ExecuteMenuSelection(const MenuPage &page) //int cursorPosition, const struct MenuEntry *menuEntry) -{ +static bool selectMenuOption(const MenuPage &page) { int cursorPosition = cursors[page.cursor]; const MenuEntry* menuEntry = page.entries[cursorPosition]; cursorBlinkTime = millis(); switch(menuEntry->type) { case MenuType::ESub: - *((const MenuEntrySub*)menuEntry)->flag = 1; activeSub[page.cursor] = cursorPosition+1; drawMenuCursor(cursorPosition, WHITE); drawSubBox( ((const MenuEntrySub*)menuEntry)->subTitle); - ((const MenuEntrySub*)menuEntry)->subMenuFunc(WHITE); - return true; - - case MenuType::ESubNew: - activeSub[page.cursor] = cursorPosition+1; - drawMenuCursor(cursorPosition, WHITE); - drawSubBox( ((const MenuEntrySubNew*)menuEntry)->subTitle); drawSubMenu(page, WHITE); return true; @@ -810,24 +840,11 @@ static bool ExecuteMenuSelection(const MenuPage &page) //int cursorPosition, con state = ((const MenuEntryStateCh*)menuEntry)->state; stateFirstRun = 1; break; - - case MenuType::ESubRotator: - activeSub[page.cursor] = cursorPosition+1; - *((const MenuEntrySubRotator*)menuEntry)->flag = ((const MenuEntrySubRotator*)menuEntry)->flagValue; - drawMenuCursor(cursorPosition, WHITE); - ((const MenuEntrySubRotator*)menuEntry)->subMenuFunc(WHITE); - break; } return false; } -//*********************************************************** - -static bool selectMenuOption(const MenuPage &page){ - // const MenuEntry* entry = menuEntries[cursorPosition]; - return ExecuteMenuSelection( page ); -} //*********************************************************** @@ -843,7 +860,7 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { if( current_sub < 0) return false; - auto sub = (const MenuEntrySubNew*)page.entries[current_sub]; + auto sub = (const MenuEntrySub*)page.entries[current_sub]; uint16_t currentVal = *sub->valuePtr; switch (deumButtonState){ @@ -871,13 +888,13 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { } } else { activeSub[page.cursor] = 0; - sub->applyFunc(); + sub->applyFunc(*sub); } break; case BTN_MENU: activeSub[page.cursor] = 0; - sub->applyFunc(); + sub->applyFunc(*sub); break; } *sub->valuePtr = currentVal; @@ -1009,7 +1026,6 @@ 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)); @@ -1225,109 +1241,21 @@ void menu() { redraw |= updateSubMenu(*currentPage, timeNow); } else { bool hadButtons = buttonPressedAndNotUsed; - redraw |= updateMenuPage( *currentPage, timeNow ); + redraw |= updateMenuPage(*currentPage, timeNow); if (hadButtons) checkForPatchView(deumButtonState); } } else if (state == ROTATOR_MENU) { // ROTATOR MENU HERE <<<<<<<<<<<<<<< + currentPage = &rotatorMenuPage; if (stateFirstRun) { - drawMenu(rotatorMenuPage); + drawMenu(*currentPage); stateFirstRun = 0; } - currentPage = &rotatorMenuPage; - if (subParallel){ - if (((timeNow - cursorBlinkTime) > cursorBlinkInterval) || forceRedraw) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - if (forceRedraw){ - forceRedraw = 0; - cursorNow = WHITE; - } - plotRotator(cursorNow,parallel); - redraw = true; - cursorBlinkTime = timeNow; - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (parallel > -24) - parallel--; - break; - - case BTN_UP: - if (parallel < 24) - parallel++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - 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) { - if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - if (forceRedraw){ - forceRedraw = 0; - cursorNow = WHITE; - } - plotRotator(cursorNow,rotations[subRotator-1]); - redraw = true; - cursorBlinkTime = timeNow; - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: - if (rotations[subRotator-1] > -24) - rotations[subRotator-1]--; - break; - - case BTN_UP: - if (rotations[subRotator-1] < 24) - rotations[subRotator-1]++; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - writeSetting(ROTN1_ADDR+2*(subRotator-1),(rotations[subRotator-1]+24)); - subRotator = 0; - break; - } - clearSubValue(); - plotRotator(WHITE,rotations[subRotator-1]); - cursorNow = BLACK; - redraw = true; - cursorBlinkTime = timeNow; - } - } else if (subPriority){ - updateSubMenuCursor( *currentPage, timeNow ); - if (buttonPressedAndNotUsed) { - buttonPressedAndNotUsed = 0; - switch (deumButtonState){ - case BTN_DOWN: // fallthrough - case BTN_UP: - priority = !priority; - break; - - case BTN_ENTER: // fallthrough - case BTN_MENU: - subPriority = 0; - writeSetting(PRIO_ADDR,priority); - break; - } - redrawSubValue = true; - } + if(activeSub[currentPage->cursor]) { + redraw |= updateSubMenu(*currentPage, timeNow); } else { bool hadButtons = buttonPressedAndNotUsed; - redraw |= updateMenuPage(*currentPage, timeNow ); + redraw |= updateMenuPage(*currentPage, timeNow); if (hadButtons) checkForPatchView(deumButtonState); } @@ -1359,13 +1287,6 @@ void menu() { redraw |= updatePage(vibratoMenuPage, timeNow); } - if(redrawSubValue && currentPage) { - clearSubValue(); - redraw |= drawSubMenu(*currentPage, WHITE); - cursorNow = BLACK; - cursorBlinkTime = timeNow; - } - if(redraw) { display.display(); } diff --git a/NuEVI/numenu.h b/NuEVI/numenu.h index 9746056..bab71f2 100644 --- a/NuEVI/numenu.h +++ b/NuEVI/numenu.h @@ -5,24 +5,9 @@ enum MenuType { ESub, - ESubNew, - ESubRotator, EStateChange, }; -struct MenuEntry { - enum MenuType type; - const char* title; -}; - -struct MenuEntrySub { - enum MenuType type; - const char* title; - const char* subTitle; - byte* flag; - void (*subMenuFunc)(int color); -}; - enum MenuEntryFlags { ENone = 0, EWrap = (1<<0), @@ -30,7 +15,15 @@ enum MenuEntryFlags { EEnterHandler = (1<<2), }; -struct MenuEntrySubNew { +struct MenuEntry { + enum MenuType type; + const char* title; +}; + +struct MenuEntrySub; +typedef const MenuEntrySub& SubMenuRef; + +struct MenuEntrySub { enum MenuType type; const char* title; const char* subTitle; @@ -38,21 +31,11 @@ struct MenuEntrySubNew { uint16_t min; uint16_t max; uint16_t flags; - void (*getSubTextFunc)(char*textBuffer, const char**label); - void (*applyFunc)(void); + void (*getSubTextFunc)(SubMenuRef, char*textBuffer, const char**label); + void (*applyFunc)(SubMenuRef); bool (*onEnterFunc)(void); }; - -struct MenuEntrySubRotator { - enum MenuType type; - const char* title; - const char* subTitle; - byte flagValue; - byte* flag; - void (*subMenuFunc)(int color); -}; - struct MenuEntryStateCh { enum MenuType type; const char* title; @@ -70,8 +53,6 @@ struct MenuPage { //*********************************************************** - - struct AdjustValue { uint16_t *value; uint16_t limitLow; From f2e2b7d33f87eae072384267049c04452e7f9565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 11:35:14 +0200 Subject: [PATCH 26/35] Tiny adjust menu redraw bug fix Had forgotten to redraw adjust menu after normal update, it was only redrawn when the sensor pixels were to be updated. As a bonus I cleaned up some code. --- NuEVI/menu.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 9a7768b..e91d193 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -11,14 +11,10 @@ #include "settings.h" #include "numenu.h" -// TODO: Ask Johan the reason for using this.. -// static const uint16_t minOffset = 50; - static uint8_t lastDeumButtons = 0; static uint8_t deumButtonState = 0; static byte buttonPressedAndNotUsed = 0; -// Allocate some space for cursors enum CursorIdx { EMain, @@ -27,16 +23,16 @@ enum CursorIdx { ERotator, EVibrato, - // NEVER ADD + // NEVER ADD ANYTHING AFTER THIS, ONLY ABOVE NUM_CURSORS }; +// Allocate some space for cursors static byte cursors[CursorIdx::NUM_CURSORS]; static byte offsets[CursorIdx::NUM_CURSORS]; static byte activeSub[CursorIdx::NUM_CURSORS]; byte cursorNow; - static byte FPD = 0; @@ -852,7 +848,7 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { bool redraw = false; bool redrawSubValue = false; - if (buttonPressedAndNotUsed){ + if (buttonPressedAndNotUsed) { buttonPressedAndNotUsed = 0; int current_sub = activeSub[page.cursor] -1; @@ -930,7 +926,6 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { break; case BTN_ENTER: - // redraw |= selectMenuOption(cursorPos, page.entries); redraw |= selectMenuOption(page); break; @@ -985,7 +980,7 @@ static void checkForPatchView(int buttons) { break; case BTN_MENU+BTN_ENTER: - if (trills){ + if (trills) { state = PATCH_VIEW; stateFirstRun = 1; setFPS(trills, patch); @@ -993,7 +988,7 @@ static void checkForPatchView(int buttons) { break; case BTN_MENU+BTN_UP: - if (trills){ + if (trills) { state = PATCH_VIEW; stateFirstRun = 1; clearFPS(trills); @@ -1270,10 +1265,12 @@ void menu() { stateFirstRun = 0; buttonPressedAndNotUsed = 0; - if( result < 0) { + if(result < 0) { // Go back to main menu state = MAIN_MENU; stateFirstRun = true; + } else { + redraw = result; } if( old_thr != ctouchThrVal) { From be0d08d8d612df694405e2de08adccfb726d3830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 13:29:03 +0200 Subject: [PATCH 27/35] Renamed some stuff for clarity --- NuEVI/menu.cpp | 72 ++++++++++++++++++++------------------------------ NuEVI/menu.h | 2 +- NuEVI/numenu.h | 18 ++++++++++--- 3 files changed, 44 insertions(+), 48 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index e91d193..f2010b6 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -55,10 +55,6 @@ unsigned long cursorBlinkTime = 0; // the last time the cursor was togg static byte state = DISPLAYOFF_IDL; static byte stateFirstRun = 1; -static byte subParallel = 0; -static byte subRotator = 0; -static byte subPriority = 0; - // The external function of subSquelch has been broken, // need to come up with a smart way to make it work again. // The status led was update when the Squelch menu was open. @@ -223,7 +219,7 @@ static bool drawSubMenu(const MenuPage &page, int color) { // If ECustom flag is set, we assume that the getSubTextFunc // rendered by it self. - if( !(sub->flags & MenuEntryFlags::ECustom)) { + if( !(sub->flags & EMenuEntryCustom)) { plotSubOption(buffer, color); if(labelPtr != nullptr) { // TODO: handle this better, we should center text + label @@ -442,7 +438,7 @@ const MenuEntrySub octaveMenu = { }; const MenuEntrySub midiMenu = { - MenuType::ESub, "MIDI CH", "MIDI CHNL", &MIDIchannel, 1, 16, MenuEntryFlags::ECustom | MenuEntryFlags::EEnterHandler, + MenuType::ESub, "MIDI CH", "MIDI CHNL", &MIDIchannel, 1, 16, EMenuEntryCustom | EMenuEntryEnterHandler, [](SubMenuRef __unused, char* __unused out, const char** __unused unit) { plotMIDI(WHITE); }, @@ -476,6 +472,7 @@ const MenuEntry* mainMenuEntries[] = { const MenuPage mainMenuPage = { nullptr, + EMenuPageRoot, CursorIdx::EMain, DISPLAYOFF_IDL, ARR_LEN(mainMenuEntries), mainMenuEntries @@ -508,35 +505,27 @@ static void parallelSave(SubMenuRef __unused) { const MenuEntrySub rotatorParaMenu = { MenuType::ESub, "PARALLEL", "SEMITONES", ¶llel, 0, 48, MenuEntryFlags::ENone, - parallelOptionGet, - parallelSave, - nullptr + parallelOptionGet, parallelSave, nullptr }; const MenuEntrySub rotator1Menu = { MenuType::ESub, "ROTATE 1", "SEMITONES", &rotations[0], 0, 48, MenuEntryFlags::ENone, - rotatorOptionGet, - rotatorSave, - nullptr + rotatorOptionGet, rotatorSave, nullptr }; const MenuEntrySub rotator2Menu = { MenuType::ESub, "ROTATE 2", "SEMITONES", &rotations[1], 0, 48, MenuEntryFlags::ENone, - rotatorOptionGet, - rotatorSave, - nullptr + rotatorOptionGet, rotatorSave, nullptr }; + const MenuEntrySub rotator3Menu = { MenuType::ESub, "ROTATE 3", "SEMITONES", &rotations[2], 0, 48, MenuEntryFlags::ENone, - rotatorOptionGet, - rotatorSave, - nullptr + rotatorOptionGet, rotatorSave, nullptr }; + const MenuEntrySub rotator4Menu = { MenuType::ESub, "ROTATE 4", "SEMITONES", &rotations[3], 0, 48, MenuEntryFlags::ENone, - rotatorOptionGet, - rotatorSave, - nullptr + rotatorOptionGet, rotatorSave, nullptr }; static void rotatorPrioOptionGet(SubMenuRef __unused, char* out, const char** __unused) { @@ -549,13 +538,10 @@ static void rotatorPrioSave(SubMenuRef __unused) { } const MenuEntrySub rotatorPrioMenu = { - MenuType::ESub, "PRIORITY", "MONO PRIO", &priority, 0,1, MenuEntryFlags::EWrap, - rotatorPrioOptionGet, - rotatorPrioSave, - nullptr, + MenuType::ESub, "PRIORITY", "MONO PRIO", &priority, 0,1, MenuEntryFlags::EMenuEntryWrap, + rotatorPrioOptionGet, rotatorPrioSave, nullptr, }; - const MenuEntry* rotatorMenuEntries[] = { (MenuEntry*)&rotatorParaMenu, (MenuEntry*)&rotator1Menu, @@ -567,6 +553,7 @@ const MenuEntry* rotatorMenuEntries[] = { const MenuPage rotatorMenuPage = { "ROTATOR SETUP", + EMenuPageRoot, CursorIdx::ERotator, DISPLAYOFF_IDL, ARR_LEN(rotatorMenuEntries), rotatorMenuEntries @@ -575,7 +562,7 @@ const MenuPage rotatorMenuPage = { //*********************************************************** // Breath menu const MenuEntrySub breathCCMenu = { - MenuType::ESub, "BREATH CC", "BREATH CC", &breathCC, 0, 10, MenuEntryFlags::EWrap, + MenuType::ESub, "BREATH CC", "BREATH CC", &breathCC, 0, 10, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char** __unused unit) { const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+", "BR+", "VL+", "EX+", "CF", "20" }; @@ -591,7 +578,7 @@ const MenuEntrySub breathCCMenu = { }; const MenuEntrySub breathATMenu = { - MenuType::ESub, "BREATH AT", "BREATH AT", &breathAT, 0, 1, MenuEntryFlags::EWrap, + MenuType::ESub, "BREATH AT", "BREATH AT", &breathAT, 0, 1, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char ** __unused unit) { strncpy(out, breathAT?"ON":"OFF", 4); }, [](const MenuEntrySub & __unused sub) { @@ -604,7 +591,7 @@ const MenuEntrySub breathATMenu = { }; const MenuEntrySub velocityMenu = { - MenuType::ESub, "VELOCITY", "VELOCITY", &velocity, 0, 127, MenuEntryFlags::EWrap, + MenuType::ESub, "VELOCITY", "VELOCITY", &velocity, 0, 127, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char** __unused unit) { if(velocity) numToString(velocity, out); else strncpy(out, "DYN", 4); @@ -614,7 +601,7 @@ const MenuEntrySub velocityMenu = { }; const MenuEntrySub curveMenu = { - MenuType::ESub, "CURVE", "CURVE", &curve, 0, 12, MenuEntryFlags::EWrap, + MenuType::ESub, "CURVE", "CURVE", &curve, 0, 12, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char** __unused unit) { const char* curveMenuLabels[] = {"-4", "-3", "-2", "-1", "LIN", "+1", "+2", "+3", "+4", "S1", "S2", "Z1", "Z2" }; @@ -625,7 +612,7 @@ const MenuEntrySub curveMenu = { }; const MenuEntrySub velSmpDlMenu = { - MenuType::ESub, "VEL DELAY", "VEL DELAY", &velSmpDl, 0, 30, MenuEntryFlags::EWrap, + MenuType::ESub, "VEL DELAY", "VEL DELAY", &velSmpDl, 0, 30, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char *out, const char** label) { if (velSmpDl) { numToString(velSmpDl, out); @@ -637,7 +624,7 @@ const MenuEntrySub velSmpDlMenu = { }; const MenuEntrySub velBiasMenu = { - MenuType::ESub, "VEL BIAS", "VEL BIAS", &velBias, 0, 9, MenuEntryFlags::EWrap, + MenuType::ESub, "VEL BIAS", "VEL BIAS", &velBias, 0, 9, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char** __unused unit) { if (velBias) numToString(velBias, out); else strncpy(out, "OFF", 4); @@ -657,6 +644,7 @@ const MenuEntry* breathMenuEntries[] = { const MenuPage breathMenuPage = { "SETUP BREATH", + 0, CursorIdx::EBreath, MAIN_MENU, ARR_LEN(breathMenuEntries), breathMenuEntries @@ -665,7 +653,7 @@ const MenuPage breathMenuPage = { //*********************************************************** // Control menu const MenuEntrySub portMenu = { - MenuType::ESub, "PORT/GLD", "PORT/GLD", &portamento, 0, 2, MenuEntryFlags::EWrap, + MenuType::ESub, "PORT/GLD", "PORT/GLD", &portamento, 0, 2, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused,char* out, const char ** __unused unit) { const char* labs[] = { "OFF", "ON", "SW" }; strncpy(out, labs[portamento], 4); @@ -688,7 +676,7 @@ const MenuEntrySub pitchBendMenu = { }; const MenuEntrySub extraMenu = { - MenuType::ESub, "EXTRA CTR", "EXTRA CTR", &extraCT, 0,4, MenuEntryFlags::EWrap, + MenuType::ESub, "EXTRA CTR", "EXTRA CTR", &extraCT, 0,4, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused,char* out, const char** __unused unit) { const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" }; strncpy(out, extraMenuLabels[extraCT], 12); @@ -735,6 +723,7 @@ const MenuEntry* controlMenuEntries[] = { const MenuPage controlMenuPage = { "SETUP CTRLS", + 0, CursorIdx::EControl, MAIN_MENU, ARR_LEN(controlMenuEntries), controlMenuEntries @@ -790,7 +779,7 @@ const MenuEntrySub vibSquelchMenu = { }; const MenuEntrySub vibDirMenu = { - MenuType::ESub, "DIRECTION", "DIRECTION", &vibDirection , 0, 1, MenuEntryFlags::EWrap, + MenuType::ESub, "DIRECTION", "DIRECTION", &vibDirection , 0, 1, MenuEntryFlags::EMenuEntryWrap, [](SubMenuRef __unused, char* out, const char** __unused unit) { if (DNWD == vibDirection) strncpy(out, "NRM", 4); @@ -811,6 +800,7 @@ const MenuEntry* vibratorMenuEntries[] = { const MenuPage vibratoMenuPage = { "VIBRATO", + 0, CursorIdx::EVibrato, SETUP_CT_MENU, ARR_LEN(vibratorMenuEntries), vibratorMenuEntries @@ -863,7 +853,7 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { case BTN_DOWN: if(currentVal > sub->min) { currentVal -= 1; - } else if(sub->flags & MenuEntryFlags::EWrap) { + } else if(sub->flags & MenuEntryFlags::EMenuEntryWrap) { currentVal = sub->max; } break; @@ -871,13 +861,13 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { case BTN_UP: if(currentVal < sub->max) { currentVal += 1; - } else if(sub->flags & MenuEntryFlags::EWrap) { + } else if(sub->flags & MenuEntryFlags::EMenuEntryWrap) { currentVal = sub->min; } break; case BTN_ENTER: - if(sub->flags & MenuEntryFlags::EEnterHandler) { + if(sub->flags & EMenuEntryEnterHandler) { bool result = sub->onEnterFunc(); if(result) { activeSub[page.cursor] = 0; @@ -915,7 +905,6 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { bool redraw = false; if (buttonPressedAndNotUsed) { - int lastEntry = page.numEntries-1; buttonPressedAndNotUsed = 0; @@ -1053,7 +1042,6 @@ void menu() { } } - // save the reading. Next time through the loop, it'll be the lastButtonState: lastDeumButtons = deumButtons; @@ -1062,10 +1050,6 @@ void menu() { state = DISPLAYOFF_IDL; stateFirstRun = 1; - subParallel = 0; - subRotator = 0; - subPriority = 0; - subVibSquelch = 0; memset(activeSub, 0, sizeof(activeSub)); } diff --git a/NuEVI/menu.h b/NuEVI/menu.h index d0d21af..16bbbf5 100644 --- a/NuEVI/menu.h +++ b/NuEVI/menu.h @@ -45,6 +45,6 @@ unsigned short readSetting(byte address); void writeSetting(byte address, unsigned short value); int updateAdjustMenu(uint32_t timeNow, uint8_t buttons, bool firstRun, bool updateSensor); - +bool adjustPageUpdate(uint16_t buttonChanges, uint32_t timeNow); #endif diff --git a/NuEVI/numenu.h b/NuEVI/numenu.h index bab71f2..c7d8de1 100644 --- a/NuEVI/numenu.h +++ b/NuEVI/numenu.h @@ -10,11 +10,17 @@ enum MenuType { enum MenuEntryFlags { ENone = 0, - EWrap = (1<<0), - ECustom = (1<<1), - EEnterHandler = (1<<2), + EMenuEntryWrap = (1u<<0), + EMenuEntryCustom = (1u<<1), + EMenuEntryEnterHandler = (1u<<2), }; +enum MenuPageFlags { + EMenuPageCustom = (1u<<0), + EMenuPageRoot = (1u<<1), +}; + + struct MenuEntry { enum MenuType type; const char* title; @@ -44,12 +50,18 @@ struct MenuEntryStateCh { struct MenuPage { const char* title; + uint16_t flags; byte cursor; byte parentPage; byte numEntries; const MenuEntry** entries; }; +struct MenuPageCustom { + const char* title; + uint16_t flags; + bool (*menuUpdateFunc)(void); +}; //*********************************************************** From 9a595c0ffc84b2050ecc138ab222a32b11696953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 13:30:58 +0200 Subject: [PATCH 28/35] WIP on making menues even more generic in handling --- NuEVI/menu.cpp | 58 ++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index f2010b6..014ade3 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -960,6 +960,37 @@ static bool updatePage(const MenuPage &page, uint32_t timeNow) { } } + + + +static bool updateSensorPixelsFlag = false; +void drawSensorPixels() { + updateSensorPixelsFlag = true; +} + +bool adjustPageUpdate(uint16_t buttonChanges, uint32_t timeNow) { + // This is a hack to update touch_Thr is it was changed.. + int old_thr = ctouchThrVal; + int result = updateAdjustMenu(timeNow, buttonChanges, stateFirstRun, updateSensorPixelsFlag); + bool redraw = false; + + updateSensorPixelsFlag = false; + stateFirstRun = 0; + buttonPressedAndNotUsed = 0; + + if(result < 0) { + // Go back to main menu + state = MAIN_MENU; + stateFirstRun = true; + } else { + redraw = result; + } + + if( old_thr != ctouchThrVal) { + touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); + } + return redraw; +} //*********************************************************** static void checkForPatchView(int buttons) { int trills = readTrills(); @@ -997,13 +1028,6 @@ static void statusBlink() { digitalWrite(statusLedPin,HIGH); } -static bool updateSensorPixelsFlag = false; - -void drawSensorPixels() { - updateSensorPixelsFlag = true; -} - - //*********************************************************** void menu() { @@ -1241,25 +1265,7 @@ void menu() { // end rotator menu } else if (state == ADJUST_MENU) { - // This is a hack to update touch_Thr is it was changed.. - int old_thr = ctouchThrVal; - int result = updateAdjustMenu(timeNow, buttonPressedAndNotUsed ? deumButtonState : 0, stateFirstRun, updateSensorPixelsFlag); - - updateSensorPixelsFlag = false; - stateFirstRun = 0; - buttonPressedAndNotUsed = 0; - - if(result < 0) { - // Go back to main menu - state = MAIN_MENU; - stateFirstRun = true; - } else { - redraw = result; - } - - if( old_thr != ctouchThrVal) { - touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); - } + adjustPageUpdate(buttonPressedAndNotUsed ? deumButtonState : 0, timeNow); } else if (state == SETUP_BR_MENU) { // SETUP BREATH MENU HERE <<<<<<<<<<<<<< redraw |= updatePage(breathMenuPage, timeNow); } else if (state == SETUP_CT_MENU) { // SETUP CONTROLLERS MENU HERE <<<<<<<<<<<<< From 5b59b4cd0fdf5af4cd67334bd72e2a5187445605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 16:55:25 +0200 Subject: [PATCH 29/35] Final push to unify all menu states All states are now handled by the new menu system, although some are flagged to have a custom handler that does everything by itself. I replaced most reference parameters to pointers to be able to typecast in a nicer way. Key input is not passed as a parameter to the menu functions instead of having global variables they all access. I think I broke one thing by doing this, since there is no way to propagate key input changes to the next frame. --- NuEVI/adjustmenu.cpp | 6 +- NuEVI/menu.cpp | 631 +++++++++++++++++++++++-------------------- NuEVI/menu.h | 20 +- NuEVI/numenu.h | 21 +- 4 files changed, 364 insertions(+), 314 deletions(-) diff --git a/NuEVI/adjustmenu.cpp b/NuEVI/adjustmenu.cpp index 310d6f7..500c503 100644 --- a/NuEVI/adjustmenu.cpp +++ b/NuEVI/adjustmenu.cpp @@ -274,12 +274,14 @@ static bool updateAdjustCursor(uint32_t timeNow) { return false; } -int updateAdjustMenu(uint32_t timeNow, uint8_t buttons, bool firstRun, bool drawSensor) { +int updateAdjustMenu(uint32_t timeNow, KeyState &input, bool firstRun, bool drawSensor) { bool redraw = false; int result = 0; const AdjustMenuEntry *currentMenu = adjustMenuEntries[adjustOption]; + uint8_t buttons = input.changed ? input.current : 0; + if(firstRun || refreshScreen) { adjustCurrent = 0; refreshScreen = false; @@ -294,7 +296,6 @@ int updateAdjustMenu(uint32_t timeNow, uint8_t buttons, bool firstRun, bool draw redraw |= updateAdjustCursor(timeNow); bool save = false; - if( buttons == BTN_DOWN ) { adjustOption += 1; refreshScreen = 1; @@ -357,3 +358,4 @@ int updateAdjustMenu(uint32_t timeNow, uint8_t buttons, bool firstRun, bool draw return result; } + diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 014ade3..59f9a80 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -11,11 +11,6 @@ #include "settings.h" #include "numenu.h" -static uint8_t lastDeumButtons = 0; -static uint8_t deumButtonState = 0; -static byte buttonPressedAndNotUsed = 0; - - enum CursorIdx { EMain, EBreath, @@ -44,15 +39,13 @@ const unsigned long cursorBlinkInterval = 300; // the cursor blink toggle int const unsigned long patchViewTimeUp = 2000; // ms until patch view shuts off const unsigned long menuTimeUp = 60000; // menu shuts off after one minute of button inactivity -static unsigned long lastDebounceTime = 0; // the last time the output pin was toggled -static unsigned long buttonRepeatTime = 0; -static unsigned long buttonPressedTime = 0; + static unsigned long menuTime = 0; static unsigned long patchViewTime = 0; unsigned long cursorBlinkTime = 0; // the last time the cursor was toggled //Display state -static byte state = DISPLAYOFF_IDL; +static byte menuState= DISPLAYOFF_IDL; static byte stateFirstRun = 1; // The external function of subSquelch has been broken, @@ -205,10 +198,10 @@ static void plotSubOption(const char* label, int color) { display.println(label); } -static bool drawSubMenu(const MenuPage &page, int color) { - int index = cursors[page.cursor]; +static bool drawSubMenu(const MenuPage *page, int color) { + int index = cursors[page->cursor]; // TODO: Null check subMenuFunc - const MenuEntry* subEntry = page.entries[index]; + const MenuEntry* subEntry = page->entries[index]; switch(subEntry->type) { case MenuType::ESub: { @@ -245,7 +238,7 @@ static void clearSubValue() { display.fillRect(65, 24, 60, 37, BLACK); } -static bool updateSubMenuCursor(const MenuPage &page, uint32_t timeNow) +static bool updateSubMenuCursor(const MenuPage *page, uint32_t timeNow) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { cursorBlinkTime = timeNow; @@ -260,35 +253,42 @@ static bool updateSubMenuCursor(const MenuPage &page, uint32_t timeNow) return false; } -static void plotMenuEntries(const MenuPage &page, bool clear = false) { +static void plotMenuEntries(const MenuPage *page, bool clear = false) { int row = 0; if(clear) { display.fillRect( 0, MENU_HEADER_OFFSET, 56, 64-MENU_HEADER_OFFSET, BLACK ); } - for(int item = offsets[page.cursor]; (item < page.numEntries) && (row < MENU_NUM_ROWS); item++, row++) { + for(int item = offsets[page->cursor]; (item < page->numEntries) && (row < MENU_NUM_ROWS); item++, row++) { int rowPixel = (row)*MENU_ROW_HEIGHT + MENU_HEADER_OFFSET; - const char* lineText = page.entries[item]->title; + const char* lineText = page->entries[item]->title; display.setCursor(0,rowPixel); display.println(lineText); } } -static void drawMenu(const MenuPage &page, const char* customTitle = nullptr) { +typedef void (*MenuTitleGetFunc)(char*out); + +static void drawMenu(const MenuPage *page) { //Initialize display and draw menu header + line display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); - if(customTitle) - display.println(customTitle); - else - display.println(page.title); + + if(page->flags & EMenuCustomTitle) { + // This is a bit hacky, but we are reusing the title pointer as a function pointer + MenuTitleGetFunc func = (MenuTitleGetFunc)page->title; + char buffer[23]; + func(buffer); + display.println(buffer); + } else + display.println(page->title); display.drawLine(0, MENU_ROW_HEIGHT, 127, MENU_ROW_HEIGHT, WHITE); plotMenuEntries(page); } -static void drawMenuScreen() { +static void mainTitleGetStr(char* out) { //Construct the title including voltage reading. //Involves intricate splicing of the title string with battery voltage char menuTitle[] = "MENU XXX Y.YV"; //Allocate string buffer of appropriate size with some placeholders @@ -304,7 +304,7 @@ static void drawMenuScreen() { splice2[0] = (voltage/10)+'0'; splice2[2] = (voltage%10)+'0'; } - drawMenu(mainMenuPage, menuTitle); + strncpy(out, menuTitle, 22); } static void drawTrills(){ @@ -471,8 +471,8 @@ const MenuEntry* mainMenuEntries[] = { }; const MenuPage mainMenuPage = { - nullptr, - EMenuPageRoot, + (const char*)mainTitleGetStr, + EMenuPageRoot | EMenuCustomTitle, CursorIdx::EMain, DISPLAYOFF_IDL, ARR_LEN(mainMenuEntries), mainMenuEntries @@ -806,24 +806,41 @@ const MenuPage vibratoMenuPage = { ARR_LEN(vibratorMenuEntries), vibratorMenuEntries }; +//*********************************************************** + +static bool patchPageUpdate(KeyState& __unused input, uint32_t __unused timeNow); +static bool idlePageUpdate(KeyState& __unused input, uint32_t __unused timeNow); + +const MenuPageCustom adjustMenuPage = { + nullptr, EMenuPageCustom, adjustPageUpdate, +}; + +const MenuPageCustom patchMenuPage = { + nullptr, EMenuPageCustom, patchPageUpdate, +}; + +const MenuPageCustom idleMenuPage = { + nullptr, EMenuPageCustom, idlePageUpdate, +}; + //*********************************************************** -static bool selectMenuOption(const MenuPage &page) { - int cursorPosition = cursors[page.cursor]; - const MenuEntry* menuEntry = page.entries[cursorPosition]; +static bool selectMenuOption(const MenuPage *page) { + int cursorPosition = cursors[page->cursor]; + const MenuEntry* menuEntry = page->entries[cursorPosition]; cursorBlinkTime = millis(); switch(menuEntry->type) { case MenuType::ESub: - activeSub[page.cursor] = cursorPosition+1; + activeSub[page->cursor] = cursorPosition+1; drawMenuCursor(cursorPosition, WHITE); drawSubBox( ((const MenuEntrySub*)menuEntry)->subTitle); drawSubMenu(page, WHITE); return true; case MenuType::EStateChange: - state = ((const MenuEntryStateCh*)menuEntry)->state; + menuState= ((const MenuEntryStateCh*)menuEntry)->state; stateFirstRun = 1; break; } @@ -831,25 +848,22 @@ static bool selectMenuOption(const MenuPage &page) { return false; } - //*********************************************************** -static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { +static bool updateSubMenu(const MenuPage *page, KeyState &input, uint32_t timeNow) { bool redraw = false; bool redrawSubValue = false; - if (buttonPressedAndNotUsed) { - buttonPressedAndNotUsed = 0; - - int current_sub = activeSub[page.cursor] -1; + if (input.changed) { + int current_sub = activeSub[page->cursor] -1; if( current_sub < 0) return false; - auto sub = (const MenuEntrySub*)page.entries[current_sub]; + auto sub = (const MenuEntrySub*)page->entries[current_sub]; uint16_t currentVal = *sub->valuePtr; - switch (deumButtonState){ + switch (input.current){ case BTN_DOWN: if(currentVal > sub->min) { currentVal -= 1; @@ -870,16 +884,16 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { if(sub->flags & EMenuEntryEnterHandler) { bool result = sub->onEnterFunc(); if(result) { - activeSub[page.cursor] = 0; + activeSub[page->cursor] = 0; } } else { - activeSub[page.cursor] = 0; + activeSub[page->cursor] = 0; sub->applyFunc(*sub); } break; case BTN_MENU: - activeSub[page.cursor] = 0; + activeSub[page->cursor] = 0; sub->applyFunc(*sub); break; } @@ -899,16 +913,14 @@ static bool updateSubMenu(const MenuPage &page, uint32_t timeNow) { return redraw; } -static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { - byte cursorPos = cursors[page.cursor]; +static bool updateMenuPage(const MenuPage *page, KeyState &input, uint32_t timeNow) { + byte cursorPos = cursors[page->cursor]; byte newPos = cursorPos; bool redraw = false; - if (buttonPressedAndNotUsed) { - int lastEntry = page.numEntries-1; - - buttonPressedAndNotUsed = 0; - switch (deumButtonState) { + if (input.changed) { + int lastEntry = page->numEntries-1; + switch (input.current) { case BTN_DOWN: if (cursorPos < lastEntry) newPos = cursorPos+1; @@ -924,7 +936,8 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { break; case BTN_MENU: - state = page.parentPage; + Serial.print("back to parent..."); + menuState= page->parentPage; stateFirstRun = 1; break; } @@ -935,7 +948,7 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { cursorNow = BLACK; clearSub(); redraw = true; - cursors[page.cursor] = newPos; + cursors[page->cursor] = newPos; } } else if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { // Only need to update cursor blink if no buttons were pressed @@ -948,60 +961,44 @@ static bool updateMenuPage( const MenuPage &page, uint32_t timeNow ) { return redraw; } -static bool updatePage(const MenuPage &page, uint32_t timeNow) { +static void checkForPatchView(int buttons); + + +static bool updatePage(const MenuPage *page, KeyState &input, uint32_t timeNow) { + if(page->flags & EMenuPageCustom) { + auto custom = (const MenuPageCustom*)page; + return custom->menuUpdateFunc(input, timeNow); + } + + bool redraw = false; + if (stateFirstRun) { drawMenu(page); stateFirstRun = 0; } - if (activeSub[page.cursor]) { - return updateSubMenu(page, timeNow); + if (activeSub[page->cursor]) { + redraw = updateSubMenu(page, input, timeNow); } else { - return updateMenuPage(page, timeNow); - } -} + redraw = updateMenuPage(page, input, timeNow); - - - -static bool updateSensorPixelsFlag = false; -void drawSensorPixels() { - updateSensorPixelsFlag = true; -} - -bool adjustPageUpdate(uint16_t buttonChanges, uint32_t timeNow) { - // This is a hack to update touch_Thr is it was changed.. - int old_thr = ctouchThrVal; - int result = updateAdjustMenu(timeNow, buttonChanges, stateFirstRun, updateSensorPixelsFlag); - bool redraw = false; - - updateSensorPixelsFlag = false; - stateFirstRun = 0; - buttonPressedAndNotUsed = 0; - - if(result < 0) { - // Go back to main menu - state = MAIN_MENU; - stateFirstRun = true; - } else { - redraw = result; + if((page->flags & EMenuPageRoot) && input.changed) + checkForPatchView(input.current); } - if( old_thr != ctouchThrVal) { - touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); - } + return redraw; } + + //*********************************************************** + static void checkForPatchView(int buttons) { int trills = readTrills(); - switch (buttons){ - case BTN_MENU+BTN_DOWN: - break; - + switch (buttons) { case BTN_MENU+BTN_ENTER: if (trills) { - state = PATCH_VIEW; + menuState= PATCH_VIEW; stateFirstRun = 1; setFPS(trills, patch); } @@ -1009,14 +1006,16 @@ static void checkForPatchView(int buttons) { case BTN_MENU+BTN_UP: if (trills) { - state = PATCH_VIEW; + menuState= PATCH_VIEW; stateFirstRun = 1; clearFPS(trills); } break; + default: break; } } +//*********************************************************** // This should be moved to a separate file/process that handles only led static void statusBlink() { digitalWrite(statusLedPin,LOW); @@ -1030,12 +1029,219 @@ static void statusBlink() { //*********************************************************** -void menu() { - unsigned long timeNow = millis(); - const MenuPage *currentPage = nullptr; - bool redraw = stateFirstRun; - // read the state of the switches +static bool updateSensorPixelsFlag = false; +void drawSensorPixels() { + updateSensorPixelsFlag = true; +} + +//*********************************************************** + + +bool adjustPageUpdate(KeyState &input, uint32_t timeNow) { + // This is a hack to update touch_Thr is it was changed.. + int old_thr = ctouchThrVal; + int result = updateAdjustMenu(timeNow, input, stateFirstRun, updateSensorPixelsFlag); + bool redraw = false; + + updateSensorPixelsFlag = false; + stateFirstRun = 0; + + if(result < 0) { + // Go back to main menu + menuState= MAIN_MENU; + stateFirstRun = true; + } else { + redraw = result; + } + + if( old_thr != ctouchThrVal) { + touch_Thr = map(ctouchThrVal,ctouchHiLimit,ctouchLoLimit,ttouchLoLimit,ttouchHiLimit); + } + return redraw; +} + + +static bool patchPageUpdate(KeyState& input, uint32_t timeNow) { + bool redraw = false; + + if (stateFirstRun) { + display.ssd1306_command(SSD1306_DISPLAYON); + drawPatchView(); + patchViewTime = timeNow; + stateFirstRun = 0; + } + if ((timeNow - patchViewTime) > patchViewTimeUp) { + menuState= DISPLAYOFF_IDL; + stateFirstRun = 1; + doPatchUpdate = 1; + FPD = 0; + writeSetting(PATCH_ADDR,patch); + } + if (input.changed) { + patchViewTime = timeNow; + int trills = readTrills(); + switch (input.current){ + case BTN_DOWN: + // down + if (trills && (fastPatch[trills-1] > 0)){ + patch = fastPatch[trills-1]; + activePatch = 0; + doPatchUpdate = 1; + FPD = 1; + writeSetting(PATCH_ADDR,patch); + } else if (!trills){ + if (patch > 1){ + patch--; + } else patch = 128; + activePatch = 0; + doPatchUpdate = 1; + FPD = 0; + } + drawPatchView(); + redraw = true; + break; + case BTN_ENTER: + // enter + if (trills && (fastPatch[trills-1] > 0)){ + patch = fastPatch[trills-1]; + activePatch = 0; + doPatchUpdate = 1; + FPD = 1; + drawPatchView(); + redraw = true; + } + break; + case BTN_UP: + // up + if (trills && (fastPatch[trills-1] > 0)){ + patch = fastPatch[trills-1]; + activePatch = 0; + doPatchUpdate = 1; + FPD = 1; + writeSetting(PATCH_ADDR,patch); + } else if (!trills){ + if (patch < 128){ + patch++; + } else patch = 1; + activePatch = 0; + doPatchUpdate = 1; + FPD = 0; + } + drawPatchView(); + redraw = true; + break; + + case BTN_MENU: + if (FPD < 2){ + menuState= DISPLAYOFF_IDL; + stateFirstRun = 1; + doPatchUpdate = 1; + } + writeSetting(PATCH_ADDR,patch); + FPD = 0; + break; + + case BTN_MENU+BTN_ENTER: + midiPanic(); + display.clearDisplay(); + display.setTextColor(WHITE); + display.setTextSize(2); + display.setCursor(35,15); + display.println("DON'T"); + display.setCursor(35,30); + display.println("PANIC"); + redraw = true; + break; + + case BTN_MENU+BTN_ENTER+BTN_UP+BTN_DOWN: + //all keys depressed, reboot to programming mode + _reboot_Teensyduino_(); + } + } + + return redraw; +} + + +static bool idlePageUpdate(KeyState& __unused input, uint32_t __unused timeNow) { + bool redraw = false; + if (stateFirstRun) { + display.ssd1306_command(SSD1306_DISPLAYOFF); + display.clearDisplay(); + redraw = true; + stateFirstRun = 0; + } + if (input.changed) { + int trills = readTrills(); + switch (input.current){ + case BTN_UP: // fallthrough + case BTN_DOWN: + if (trills && (fastPatch[trills-1] > 0)){ + patch = fastPatch[trills-1]; + activePatch = 0; + doPatchUpdate = 1; + FPD = 1; + } // else if (!trills) buttonPressedAndNotUsed = 1; // <- TODO: this is now broken, all input is consumed... solve in another way. + menuState= PATCH_VIEW; + stateFirstRun = 1; + break; + + case BTN_ENTER: + if (trills && (fastPatch[trills-1] > 0)){ + patch = fastPatch[trills-1]; + activePatch = 0; + doPatchUpdate = 1; + FPD = 1; + } + menuState= PATCH_VIEW; + stateFirstRun = 1; + break; + + case BTN_MENU: + if (pinkyKey && (exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch breath activated legacy settings on/off + legacyBrAct = !legacyBrAct; + dipSwBits = dipSwBits ^ (1<<2); + writeSetting(DIPSW_BITS_ADDR,dipSwBits); + statusBlink(); + } else if ((exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch pb pad activated legacy settings control on/off + legacy = !legacy; + dipSwBits = dipSwBits ^ (1<<1); + writeSetting(DIPSW_BITS_ADDR,dipSwBits); + statusBlink(); + } else if (pinkyKey && !specialKey){ //hold pinky key for rotator menu, and if too high touch sensing blocks regular menu, touching special key helps + display.ssd1306_command(SSD1306_DISPLAYON); + menuState= ROTATOR_MENU; + stateFirstRun = 1; + } else { + display.ssd1306_command(SSD1306_DISPLAYON); + menuState= MAIN_MENU; + stateFirstRun = 1; + } + break; + + case BTN_UP | BTN_DOWN | BTN_ENTER | BTN_MENU: + //all keys depressed, reboot to programming mode + _reboot_Teensyduino_(); + } + } + return redraw; +} + + +//*********************************************************** + +static KeyState readInput(uint32_t timeNow) { + + static uint32_t lastDebounceTime = 0; // the last time the output pin was toggled + static uint32_t buttonRepeatTime = 0; + static uint32_t buttonPressedTime = 0; + static uint8_t lastDeumButtons = 0; + static uint8_t deumButtonState = 0; + + + KeyState keys = { deumButtonState, 0 }; + uint8_t deumButtons = 0x0f ^(digitalRead(dPin) | (digitalRead(ePin) << 1) | (digitalRead(uPin) << 2) | (digitalRead(mPin)<<3)); // check to see if you just pressed the button @@ -1048,230 +1254,65 @@ void menu() { lastDebounceTime = timeNow; } + if ((timeNow - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (deumButtons != deumButtonState) { + keys.current = deumButtons; + keys.changed = deumButtonState ^ deumButtons; + deumButtonState = deumButtons; menuTime = timeNow; - buttonPressedAndNotUsed = 1; buttonPressedTime = timeNow; } - if (((deumButtons == 1) || (deumButtons == 4)) && (timeNow - buttonPressedTime > buttonRepeatDelay) && (timeNow - buttonRepeatTime > buttonRepeatInterval)){ - buttonPressedAndNotUsed = 1; + if (((deumButtons == BTN_DOWN) || (deumButtons == BTN_UP)) && (timeNow - buttonPressedTime > buttonRepeatDelay) && (timeNow - buttonRepeatTime > buttonRepeatInterval)){ buttonRepeatTime = timeNow; + keys.changed = deumButtons; // Key repeat } } // save the reading. Next time through the loop, it'll be the lastButtonState: lastDeumButtons = deumButtons; - // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) - if (state && ((timeNow - menuTime) > menuTimeUp)) { - state = DISPLAYOFF_IDL; - stateFirstRun = 1; + return keys; +} +void menu() { + unsigned long timeNow = millis(); + + bool redraw = stateFirstRun; + + KeyState input = readInput(timeNow); + // read the state of the switches + + // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) + if (menuState&& ((timeNow - menuTime) > menuTimeUp)) { + menuState= DISPLAYOFF_IDL; + stateFirstRun = 1; subVibSquelch = 0; memset(activeSub, 0, sizeof(activeSub)); } - if (state == DISPLAYOFF_IDL) { - if (stateFirstRun) { - display.ssd1306_command(SSD1306_DISPLAYOFF); - stateFirstRun = 0; - } - if (buttonPressedAndNotUsed) { - buttonPressedAndNotUsed = 0; - int trills = readTrills(); - switch (deumButtonState){ - case BTN_UP: // fallthrough - case BTN_DOWN: - if (trills && (fastPatch[trills-1] > 0)){ - patch = fastPatch[trills-1]; - activePatch = 0; - doPatchUpdate = 1; - FPD = 1; - } else if (!trills) buttonPressedAndNotUsed = 1; - state = PATCH_VIEW; - stateFirstRun = 1; - break; - - case BTN_ENTER: - if (trills && (fastPatch[trills-1] > 0)){ - patch = fastPatch[trills-1]; - activePatch = 0; - doPatchUpdate = 1; - FPD = 1; - } - state = PATCH_VIEW; - stateFirstRun = 1; - break; - - case BTN_MENU: - if (pinkyKey && (exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch breath activated legacy settings on/off - legacyBrAct = !legacyBrAct; - dipSwBits = dipSwBits ^ (1<<2); - writeSetting(DIPSW_BITS_ADDR,dipSwBits); - statusBlink(); - } else if ((exSensor >= ((extracThrVal+extracMaxVal)/2))) { // switch pb pad activated legacy settings control on/off - legacy = !legacy; - dipSwBits = dipSwBits ^ (1<<1); - writeSetting(DIPSW_BITS_ADDR,dipSwBits); - statusBlink(); - } else if (pinkyKey && !specialKey){ //hold pinky key for rotator menu, and if too high touch sensing blocks regular menu, touching special key helps - display.ssd1306_command(SSD1306_DISPLAYON); - state = ROTATOR_MENU; - stateFirstRun = 1; - } else { - display.ssd1306_command(SSD1306_DISPLAYON); - state = MAIN_MENU; - stateFirstRun = 1; - } - break; - - case 15: - //all keys depressed, reboot to programming mode - _reboot_Teensyduino_(); - } - } - } else if (state == PATCH_VIEW) { - if (stateFirstRun) { - display.ssd1306_command(SSD1306_DISPLAYON); - drawPatchView(); - patchViewTime = timeNow; - stateFirstRun = 0; - } - if ((timeNow - patchViewTime) > patchViewTimeUp) { - state = DISPLAYOFF_IDL; - stateFirstRun = 1; - doPatchUpdate = 1; - FPD = 0; - writeSetting(PATCH_ADDR,patch); - } - if (buttonPressedAndNotUsed){ - buttonPressedAndNotUsed = 0; - patchViewTime = timeNow; - int trills = readTrills(); - switch (deumButtonState){ - case BTN_DOWN: - // down - if (trills && (fastPatch[trills-1] > 0)){ - patch = fastPatch[trills-1]; - activePatch = 0; - doPatchUpdate = 1; - FPD = 1; - writeSetting(PATCH_ADDR,patch); - } else if (!trills){ - if (patch > 1){ - patch--; - } else patch = 128; - activePatch = 0; - doPatchUpdate = 1; - FPD = 0; - } - drawPatchView(); - redraw = true; - break; - case BTN_ENTER: - // enter - if (trills && (fastPatch[trills-1] > 0)){ - patch = fastPatch[trills-1]; - activePatch = 0; - doPatchUpdate = 1; - FPD = 1; - drawPatchView(); - redraw = true; - } - break; - case BTN_UP: - // up - if (trills && (fastPatch[trills-1] > 0)){ - patch = fastPatch[trills-1]; - activePatch = 0; - doPatchUpdate = 1; - FPD = 1; - writeSetting(PATCH_ADDR,patch); - } else if (!trills){ - if (patch < 128){ - patch++; - } else patch = 1; - activePatch = 0; - doPatchUpdate = 1; - FPD = 0; - } - drawPatchView(); - redraw = true; - break; - - case BTN_MENU: - if (FPD < 2){ - state = DISPLAYOFF_IDL; - stateFirstRun = 1; - doPatchUpdate = 1; - } - writeSetting(PATCH_ADDR,patch); - FPD = 0; - break; - - case BTN_MENU+BTN_ENTER: - midiPanic(); - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(35,15); - display.println("DON'T"); - display.setCursor(35,30); - display.println("PANIC"); - redraw = true; - break; - - case BTN_MENU+BTN_ENTER+BTN_UP+BTN_DOWN: - //all keys depressed, reboot to programming mode - _reboot_Teensyduino_(); - } - } - } else if (state == MAIN_MENU) { // MAIN MENU HERE <<<<<<<<<<<<<<< - currentPage = &mainMenuPage; - if (stateFirstRun) { - drawMenuScreen(); - stateFirstRun = 0; - } - - if(activeSub[currentPage->cursor]) { - redraw |= updateSubMenu(*currentPage, timeNow); - } else { - bool hadButtons = buttonPressedAndNotUsed; - redraw |= updateMenuPage(*currentPage, timeNow); - if (hadButtons) - checkForPatchView(deumButtonState); - } - } else if (state == ROTATOR_MENU) { // ROTATOR MENU HERE <<<<<<<<<<<<<<< - currentPage = &rotatorMenuPage; - if (stateFirstRun) { - drawMenu(*currentPage); - stateFirstRun = 0; - } - if(activeSub[currentPage->cursor]) { - redraw |= updateSubMenu(*currentPage, timeNow); - } else { - bool hadButtons = buttonPressedAndNotUsed; - redraw |= updateMenuPage(*currentPage, timeNow); - if (hadButtons) - checkForPatchView(deumButtonState); - } - // end rotator menu - - } else if (state == ADJUST_MENU) { - adjustPageUpdate(buttonPressedAndNotUsed ? deumButtonState : 0, timeNow); - } else if (state == SETUP_BR_MENU) { // SETUP BREATH MENU HERE <<<<<<<<<<<<<< - redraw |= updatePage(breathMenuPage, timeNow); - } else if (state == SETUP_CT_MENU) { // SETUP CONTROLLERS MENU HERE <<<<<<<<<<<<< - redraw |= updatePage(controlMenuPage, timeNow); - } else if (state == VIBRATO_MENU) { // VIBRATO MENU HERE <<<<<<<<<<<<< - redraw |= updatePage(vibratoMenuPage, timeNow); + if (menuState== DISPLAYOFF_IDL) { + redraw |= updatePage((const MenuPage*)&idleMenuPage, input, timeNow); + } else if (menuState== PATCH_VIEW) { + redraw |= updatePage((const MenuPage*)&patchMenuPage, input, timeNow); + } else if (menuState== MAIN_MENU) { + redraw |= updatePage(&mainMenuPage, input, timeNow); + } else if (menuState== ROTATOR_MENU) { + redraw |= updatePage(&rotatorMenuPage, input, timeNow); + } else if (menuState== ADJUST_MENU) { + redraw |= updatePage((const MenuPage*)&adjustMenuPage, input, timeNow); + } else if (menuState== SETUP_BR_MENU) { + redraw |= updatePage(&breathMenuPage, input, timeNow); + } else if (menuState== SETUP_CT_MENU) { + redraw |= updatePage(&controlMenuPage, input, timeNow); + } else if (menuState== VIBRATO_MENU) { + redraw |= updatePage(&vibratoMenuPage, input, timeNow); } if(redraw) { diff --git a/NuEVI/menu.h b/NuEVI/menu.h index 16bbbf5..0d70a90 100644 --- a/NuEVI/menu.h +++ b/NuEVI/menu.h @@ -2,6 +2,7 @@ #define __MENU_H #include "Wiring.h" +#include "numenu.h" #define MENU_ROW_HEIGHT 9 #define MENU_HEADER_OFFSET 12 @@ -11,11 +12,11 @@ #define DISPLAYOFF_IDL 0 #define MAIN_MENU 1 #define PATCH_VIEW 2 -#define ADJUST_MENU 70 -#define SETUP_BR_MENU 80 -#define SETUP_CT_MENU 90 -#define ROTATOR_MENU 100 -#define VIBRATO_MENU 110 +#define ADJUST_MENU 3 +#define SETUP_BR_MENU 4 +#define SETUP_CT_MENU 5 +#define ROTATOR_MENU 6 +#define VIBRATO_MENU 7 #define ARR_LEN(a) (sizeof (a) / sizeof (a[0])) @@ -25,7 +26,6 @@ #define BTN_MENU 8 - extern const unsigned long debounceDelay; // the debounce time; increase if the output flickers extern const unsigned long buttonRepeatInterval; extern const unsigned long buttonRepeatDelay; @@ -33,9 +33,7 @@ extern const unsigned long cursorBlinkInterval; // the cursor blink toggle in extern const unsigned long patchViewTimeUp; // ms until patch view shuts off extern const unsigned long menuTimeUp; // menu shuts off after one minute of button inactivity - - -extern byte subVibSquelch; +extern byte subVibSquelch; // TODO: This is broken <- subVibSquelch is never set, we need another way to expose what menu is open. void initDisplay(); void showVersion(); @@ -44,7 +42,7 @@ void drawSensorPixels(); unsigned short readSetting(byte address); void writeSetting(byte address, unsigned short value); -int updateAdjustMenu(uint32_t timeNow, uint8_t buttons, bool firstRun, bool updateSensor); -bool adjustPageUpdate(uint16_t buttonChanges, uint32_t timeNow); +int updateAdjustMenu(uint32_t timeNow, KeyState &input, bool firstRun, bool drawSensor); +bool adjustPageUpdate(KeyState &input, uint32_t timeNow); #endif diff --git a/NuEVI/numenu.h b/NuEVI/numenu.h index c7d8de1..525d2cc 100644 --- a/NuEVI/numenu.h +++ b/NuEVI/numenu.h @@ -1,6 +1,15 @@ #ifndef __NUMENU_H #define __NUMENU_H +#include + +//*********************************************************** + +struct KeyState { + uint8_t current; + uint8_t changed; +}; + //*********************************************************** enum MenuType { @@ -18,6 +27,7 @@ enum MenuEntryFlags { enum MenuPageFlags { EMenuPageCustom = (1u<<0), EMenuPageRoot = (1u<<1), + EMenuCustomTitle = (1u << 2), }; @@ -45,22 +55,22 @@ struct MenuEntrySub { struct MenuEntryStateCh { enum MenuType type; const char* title; - byte state; + uint8_t state; }; struct MenuPage { const char* title; uint16_t flags; - byte cursor; - byte parentPage; - byte numEntries; + uint8_t cursor; + uint8_t parentPage; + uint8_t numEntries; const MenuEntry** entries; }; struct MenuPageCustom { const char* title; uint16_t flags; - bool (*menuUpdateFunc)(void); + bool (*menuUpdateFunc)(KeyState &input, uint32_t timeNow); }; //*********************************************************** @@ -77,5 +87,4 @@ struct AdjustMenuEntry { void (*saveFunc)(const AdjustMenuEntry&); }; - #endif From 7a2b70c38d92374a9e6d58dc1fb2b50d061e2097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 21:02:08 +0200 Subject: [PATCH 30/35] Moved code from a function into where it was called and some minor cleanup --- NuEVI/menu.cpp | 68 +++++++++++++++++++------------------------------- 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 59f9a80..af1f576 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -799,11 +799,7 @@ const MenuEntry* vibratorMenuEntries[] = { }; const MenuPage vibratoMenuPage = { - "VIBRATO", - 0, - CursorIdx::EVibrato, - SETUP_CT_MENU, - ARR_LEN(vibratorMenuEntries), vibratorMenuEntries + "VIBRATO", 0, CursorIdx::EVibrato, SETUP_CT_MENU, ARR_LEN(vibratorMenuEntries), vibratorMenuEntries }; //*********************************************************** @@ -936,7 +932,6 @@ static bool updateMenuPage(const MenuPage *page, KeyState &input, uint32_t timeN break; case BTN_MENU: - Serial.print("back to parent..."); menuState= page->parentPage; stateFirstRun = 1; break; @@ -961,9 +956,6 @@ static bool updateMenuPage(const MenuPage *page, KeyState &input, uint32_t timeN return redraw; } -static void checkForPatchView(int buttons); - - static bool updatePage(const MenuPage *page, KeyState &input, uint32_t timeNow) { if(page->flags & EMenuPageCustom) { auto custom = (const MenuPageCustom*)page; @@ -981,40 +973,32 @@ static bool updatePage(const MenuPage *page, KeyState &input, uint32_t timeNow) } else { redraw = updateMenuPage(page, input, timeNow); - if((page->flags & EMenuPageRoot) && input.changed) - checkForPatchView(input.current); - } + if((page->flags & EMenuPageRoot) && input.changed) { + int trills = readTrills(); + switch (input.current) { + case BTN_MENU+BTN_ENTER: + if (trills) { + menuState = PATCH_VIEW; + stateFirstRun = 1; + setFPS(trills, patch); + } + break; + case BTN_MENU+BTN_UP: + if (trills) { + menuState = PATCH_VIEW; + stateFirstRun = 1; + clearFPS(trills); + } + break; + default: break; + } + } + } return redraw; } - -//*********************************************************** - -static void checkForPatchView(int buttons) { - int trills = readTrills(); - - switch (buttons) { - case BTN_MENU+BTN_ENTER: - if (trills) { - menuState= PATCH_VIEW; - stateFirstRun = 1; - setFPS(trills, patch); - } - break; - - case BTN_MENU+BTN_UP: - if (trills) { - menuState= PATCH_VIEW; - stateFirstRun = 1; - clearFPS(trills); - } - break; - default: break; - } -} - //*********************************************************** // This should be moved to a separate file/process that handles only led static void statusBlink() { @@ -1083,7 +1067,6 @@ static bool patchPageUpdate(KeyState& input, uint32_t timeNow) { int trills = readTrills(); switch (input.current){ case BTN_DOWN: - // down if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; activePatch = 0; @@ -1101,8 +1084,8 @@ static bool patchPageUpdate(KeyState& input, uint32_t timeNow) { drawPatchView(); redraw = true; break; + case BTN_ENTER: - // enter if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; activePatch = 0; @@ -1112,8 +1095,8 @@ static bool patchPageUpdate(KeyState& input, uint32_t timeNow) { redraw = true; } break; + case BTN_UP: - // up if (trills && (fastPatch[trills-1] > 0)){ patch = fastPatch[trills-1]; activePatch = 0; @@ -1239,9 +1222,9 @@ static KeyState readInput(uint32_t timeNow) { static uint8_t lastDeumButtons = 0; static uint8_t deumButtonState = 0; - KeyState keys = { deumButtonState, 0 }; + // read the state of the switches (note that they are active low, so we invert the values) uint8_t deumButtons = 0x0f ^(digitalRead(dPin) | (digitalRead(ePin) << 1) | (digitalRead(uPin) << 2) | (digitalRead(mPin)<<3)); // check to see if you just pressed the button @@ -1287,7 +1270,6 @@ void menu() { bool redraw = stateFirstRun; KeyState input = readInput(timeNow); - // read the state of the switches // shut off menu system if not used for a while (changes not stored by exiting a setting manually will not be stored in EEPROM) if (menuState&& ((timeNow - menuTime) > menuTimeUp)) { From 9561556302793111add734aebcb1d0a2ad921dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 21:28:35 +0200 Subject: [PATCH 31/35] No need to set text color all the time Since the cursor blinking is handled a bit differently now, there is no need to set text color all the time since we know it should always be white. But just to be certain, lets set it to WHITE first thing in the updatePage function. Also moved the code from plotMIDI into a custom render function for midi sub menu. --- NuEVI/adjustmenu.cpp | 1 - NuEVI/menu.cpp | 76 ++++++++++++++++++++------------------------ 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/NuEVI/adjustmenu.cpp b/NuEVI/adjustmenu.cpp index 500c503..5d6f947 100644 --- a/NuEVI/adjustmenu.cpp +++ b/NuEVI/adjustmenu.cpp @@ -130,7 +130,6 @@ static void drawAdjustBase(const char* title, bool all) { display.drawLine(120,36,120,40,WHITE); display.setTextSize(1); - display.setTextColor(WHITE); display.setCursor(25,2); display.println(title); diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index af1f576..14cfb45 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -190,15 +190,14 @@ static const char* numToString(int16_t value, char* dest, bool plusSign = false) return dest; } -static void plotSubOption(const char* label, int color) { - display.setTextColor(color); +static void plotSubOption(const char* label) { display.setTextSize(2); int x_pos = 96-strlen(label)*6; display.setCursor(x_pos,33); display.println(label); } -static bool drawSubMenu(const MenuPage *page, int color) { +static bool drawSubMenu(const MenuPage *page) { int index = cursors[page->cursor]; // TODO: Null check subMenuFunc const MenuEntry* subEntry = page->entries[index]; @@ -213,7 +212,7 @@ static bool drawSubMenu(const MenuPage *page, int color) { // If ECustom flag is set, we assume that the getSubTextFunc // rendered by it self. if( !(sub->flags & EMenuEntryCustom)) { - plotSubOption(buffer, color); + plotSubOption(buffer); if(labelPtr != nullptr) { // TODO: handle this better, we should center text + label display.setCursor(105,40); @@ -247,7 +246,7 @@ static bool updateSubMenuCursor(const MenuPage *page, uint32_t timeNow) clearSubValue(); } else { cursorNow = WHITE; - return drawSubMenu( page, cursorNow ); + return drawSubMenu(page); } } return false; @@ -272,7 +271,6 @@ static void drawMenu(const MenuPage *page) { //Initialize display and draw menu header + line display.clearDisplay(); display.setTextSize(1); - display.setTextColor(WHITE); display.setCursor(0,0); if(page->flags & EMenuCustomTitle) { @@ -318,7 +316,6 @@ static void drawPatchView(){ if (FPD){ drawTrills(); } - display.setTextColor(WHITE); display.setTextSize(6); if (FPD < 2){ int align; @@ -344,7 +341,6 @@ static void drawSubBox(const char* label) { display.fillRect(63,11,64,52,BLACK); display.drawRect(63,11,64,52,WHITE); - display.setTextColor(WHITE); display.setTextSize(1); int len = strlen(label); @@ -357,20 +353,6 @@ void drawMenuCursor(byte itemNo, byte color){ display.drawTriangle(57, ymid,61, ymid+2,61, ymid-2, color); } -static void plotMIDI(int color) { - char buff[7]; - numToString(MIDIchannel, buff); - plotSubOption(buff, color); - if (slowMidi && color) { - display.setTextColor(WHITE); - } else { - display.setTextColor(BLACK); - } - display.setTextSize(1); - display.setCursor(116,51); - display.print("S"); -} - //*********************************************************** // TODO: Move these to a settings.cpp maybe? @@ -437,24 +419,34 @@ const MenuEntrySub octaveMenu = { , nullptr }; +static void midiSaveFunc(const MenuEntrySub & __unused sub) { writeSetting(MIDI_ADDR, MIDIchannel); } +static void midiCustomDrawFunc(SubMenuRef __unused, char* __unused, const char** __unused) { + char buff[7]; + numToString(MIDIchannel, buff); + plotSubOption(buff); + if (slowMidi) { + display.setTextSize(1); + display.setCursor(116,51); + display.print("S"); + } +} + +static bool midiEnterHandlerFunc() { + readSwitches(); + if (pinkyKey){ + slowMidi = !slowMidi; + dipSwBits = dipSwBits ^ (1<<3); + writeSetting(DIPSW_BITS_ADDR,dipSwBits); + return false; + } else { + writeSetting(MIDI_ADDR, MIDIchannel); + return true; + } +} + const MenuEntrySub midiMenu = { MenuType::ESub, "MIDI CH", "MIDI CHNL", &MIDIchannel, 1, 16, EMenuEntryCustom | EMenuEntryEnterHandler, - [](SubMenuRef __unused, char* __unused out, const char** __unused unit) { - plotMIDI(WHITE); - }, - [](const MenuEntrySub & __unused sub) { writeSetting(MIDI_ADDR, MIDIchannel); }, - []() -> bool { // On enter handler - readSwitches(); - if (pinkyKey){ - slowMidi = !slowMidi; - dipSwBits = dipSwBits ^ (1<<3); - writeSetting(DIPSW_BITS_ADDR,dipSwBits); - return false; - } else { - writeSetting(MIDI_ADDR, MIDIchannel); - return true; - } - } + midiCustomDrawFunc, midiSaveFunc, midiEnterHandlerFunc }; const MenuEntryStateCh adjustMenu = { MenuType::EStateChange, "ADJUST", ADJUST_MENU }; @@ -832,7 +824,7 @@ static bool selectMenuOption(const MenuPage *page) { activeSub[page->cursor] = cursorPosition+1; drawMenuCursor(cursorPosition, WHITE); drawSubBox( ((const MenuEntrySub*)menuEntry)->subTitle); - drawSubMenu(page, WHITE); + drawSubMenu(page); return true; case MenuType::EStateChange: @@ -901,7 +893,7 @@ static bool updateSubMenu(const MenuPage *page, KeyState &input, uint32_t timeNo if(redrawSubValue) { clearSubValue(); - redraw |= drawSubMenu(page, WHITE); + redraw |= drawSubMenu(page); cursorNow = BLACK; cursorBlinkTime = timeNow; } @@ -957,6 +949,9 @@ static bool updateMenuPage(const MenuPage *page, KeyState &input, uint32_t timeN } static bool updatePage(const MenuPage *page, KeyState &input, uint32_t timeNow) { + + display.setTextColor(WHITE); + if(page->flags & EMenuPageCustom) { auto custom = (const MenuPageCustom*)page; return custom->menuUpdateFunc(input, timeNow); @@ -1128,7 +1123,6 @@ static bool patchPageUpdate(KeyState& input, uint32_t timeNow) { case BTN_MENU+BTN_ENTER: midiPanic(); display.clearDisplay(); - display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(35,15); display.println("DON'T"); From e08a3a5291d1c0e58d077513e98159eab37e7330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 22:01:17 +0200 Subject: [PATCH 32/35] Converted lambdas to normal functions to save RAM --- NuEVI/adjustmenu.cpp | 49 ++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/NuEVI/adjustmenu.cpp b/NuEVI/adjustmenu.cpp index 5d6f947..a1b1df7 100644 --- a/NuEVI/adjustmenu.cpp +++ b/NuEVI/adjustmenu.cpp @@ -32,6 +32,10 @@ static bool refreshScreen; //*********************************************************** +static void breathSave(const AdjustMenuEntry& e) { + writeSetting(BREATH_THR_ADDR, *e.entries[0].value); + writeSetting(BREATH_MAX_ADDR, *e.entries[1].value); +} const AdjustMenuEntry breathAdjustMenu = { "BREATH", @@ -39,57 +43,63 @@ const AdjustMenuEntry breathAdjustMenu = { { &breathThrVal, breathLoLimit, breathHiLimit }, { &breathMaxVal, breathLoLimit, breathHiLimit } }, - [] (const AdjustMenuEntry& e) { - writeSetting(BREATH_THR_ADDR, *e.entries[0].value); - writeSetting(BREATH_MAX_ADDR, *e.entries[1].value); - } + breathSave }; +static void portamentoSave(const AdjustMenuEntry& e) { + writeSetting(PORTAM_THR_ADDR, *e.entries[0].value); + writeSetting(PORTAM_MAX_ADDR, *e.entries[1].value); +} + const AdjustMenuEntry portamentoAdjustMenu = { "PORTAMENTO", { { &portamThrVal, portamLoLimit, portamHiLimit }, { &portamMaxVal, portamLoLimit, portamHiLimit } }, - [] (const AdjustMenuEntry& e) { - writeSetting(PORTAM_THR_ADDR, *e.entries[0].value); - writeSetting(PORTAM_MAX_ADDR, *e.entries[1].value); - } + portamentoSave }; +static void pbSave(const AdjustMenuEntry& e) { + writeSetting(PITCHB_THR_ADDR, *e.entries[0].value); + writeSetting(PITCHB_MAX_ADDR, *e.entries[1].value); +} + const AdjustMenuEntry pitchBendAdjustMenu = { "PITCH BEND", { { &pitchbThrVal, pitchbLoLimit, pitchbHiLimit }, { &pitchbMaxVal, pitchbLoLimit, pitchbHiLimit } }, - [] (const AdjustMenuEntry& e) { - writeSetting(PITCHB_THR_ADDR, *e.entries[0].value); - writeSetting(PITCHB_MAX_ADDR, *e.entries[1].value); - } + pbSave }; +static void extracSave(const AdjustMenuEntry& e) { + writeSetting(EXTRAC_THR_ADDR, *e.entries[0].value); + writeSetting(EXTRAC_MAX_ADDR, *e.entries[1].value); +} + const AdjustMenuEntry extraSensorAdjustMenu = { "EXTRA CONTROLLER", { { &extracThrVal, extracLoLimit, extracHiLimit }, { &extracMaxVal, extracLoLimit, extracHiLimit } }, - [] (const AdjustMenuEntry& e) { - writeSetting(EXTRAC_THR_ADDR, *e.entries[0].value); - writeSetting(EXTRAC_MAX_ADDR, *e.entries[1].value); - } + extracSave }; + +static void ctouchThrSave(const AdjustMenuEntry& e) { + writeSetting(CTOUCH_THR_ADDR, *e.entries[0].value); +} + const AdjustMenuEntry ctouchAdjustMenu = { "TOUCH SENSE", { { &ctouchThrVal, ctouchLoLimit, ctouchHiLimit }, { nullptr, 0, 0 } }, - [] (const AdjustMenuEntry& e) { - writeSetting(CTOUCH_THR_ADDR, *e.entries[0].value); - } + ctouchThrSave }; const AdjustMenuEntry* adjustMenuEntries[] = { @@ -234,7 +244,6 @@ void plotSensorPixels(){ forcePix = 0; } - //*********************************************************** static bool drawAdjustBar(uint16_t buttons, int row, const AdjustValue* entry, uint16_t *pos) { From d2f3bba5442a746fe8ff2474456d94959774d431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Sun, 23 Jun 2019 22:02:23 +0200 Subject: [PATCH 33/35] Reduced code duplication and fixed adjust cursor bug --- NuEVI/adjustmenu.cpp | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/NuEVI/adjustmenu.cpp b/NuEVI/adjustmenu.cpp index a1b1df7..23ceb6d 100644 --- a/NuEVI/adjustmenu.cpp +++ b/NuEVI/adjustmenu.cpp @@ -158,10 +158,14 @@ static void drawAdjustBase(const char* title, bool all) { drawAdjCursor(WHITE); } +static void drawLineCursor(uint16_t hPos, uint16_t vPos, int color) { + display.drawLine(hPos, vPos,hPos, vPos+6, color); +} + static bool updateAdjustLineCursor(uint32_t timeNow, uint16_t hPos, uint16_t vPos ) { if ((timeNow - cursorBlinkTime) > cursorBlinkInterval) { if (cursorNow == WHITE) cursorNow = BLACK; else cursorNow = WHITE; - display.drawLine(hPos, vPos,hPos, vPos+6, cursorNow);; + drawLineCursor(hPos, vPos, cursorNow); cursorBlinkTime = timeNow; return true; } @@ -282,6 +286,21 @@ static bool updateAdjustCursor(uint32_t timeNow) { return false; } +static bool handleInput(const AdjustMenuEntry *currentMenu, uint32_t timeNow, uint8_t buttons, uint16_t *xpos, int ypos, int index) { + if (buttons) { + drawAdjustBar( buttons, ypos, ¤tMenu->entries[index], xpos ); + int last = adjustCurrent; + if(buttons == BTN_ENTER) adjustCurrent += 1; + else if( buttons == BTN_MENU) adjustCurrent = 0; + + if(last != adjustCurrent) drawLineCursor(*xpos, ypos, WHITE); + + return true; + } else { + return updateAdjustLineCursor(timeNow, *xpos, ypos); + } +} + int updateAdjustMenu(uint32_t timeNow, KeyState &input, bool firstRun, bool drawSensor) { bool redraw = false; int result = 0; @@ -327,27 +346,13 @@ int updateAdjustMenu(uint32_t timeNow, KeyState &input, bool firstRun, bool draw currentMenu->saveFunc(*currentMenu); } else if( adjustCurrent == 1) { - if (buttons) { - drawAdjustBar( buttons, 20, ¤tMenu->entries[0], &pos1 ); - if(buttons == BTN_ENTER) adjustCurrent += 1; - else if( buttons == BTN_MENU) adjustCurrent = 0; - redraw = true; - } else { - redraw |= updateAdjustLineCursor( timeNow, pos1, 20 ); - } + handleInput(currentMenu, timeNow, buttons, &pos1, 20, 0); } else { - if (buttons) { - drawAdjustBar( buttons, 50, ¤tMenu->entries[1], &pos2 ); - if(buttons == BTN_ENTER) adjustCurrent += 1; - else if( buttons == BTN_MENU) adjustCurrent = 0; - redraw = true; - } else { - redraw |= updateAdjustLineCursor( timeNow, pos2, 50 ); - } + handleInput(currentMenu, timeNow, buttons, &pos2, 50, 1); } // Keep adjustCurrent in range - if( adjustCurrent > 2 || (adjustCurrent == 2 && currentMenu->entries[1].value == nullptr)) + if( (adjustCurrent > 2) || ((adjustCurrent == 2) && (currentMenu->entries[1].value == nullptr))) adjustCurrent = 0; // Keep adjust option in range. From 91b2a69d21e154a46e21f994c23f6214f89b31e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Mon, 24 Jun 2019 00:17:27 +0200 Subject: [PATCH 34/35] Fixed text alignment for sub values with units --- NuEVI/menu.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index 14cfb45..afde514 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -190,11 +190,25 @@ static const char* numToString(int16_t value, char* dest, bool plusSign = false) return dest; } -static void plotSubOption(const char* label) { - display.setTextSize(2); - int x_pos = 96-strlen(label)*6; - display.setCursor(x_pos,33); - display.println(label); +static void plotSubOption(const char* label, const char* unit = nullptr) { + int text_x, unit_x; + int label_pixel_width = strlen(label)*12; + + if(unit == nullptr) { + text_x = 96 - (label_pixel_width/2); + } else { + int unit_pixel_width = strlen(unit)*6; + int halfSum = (label_pixel_width + unit_pixel_width)/2; + text_x = 96 - halfSum; + unit_x = 96 + halfSum - unit_pixel_width; + display.setCursor(unit_x,40); + display.setTextSize(1); + display.println(unit); + } + + display.setTextSize(2); + display.setCursor(text_x,33); + display.println(label); } static bool drawSubMenu(const MenuPage *page) { @@ -209,16 +223,10 @@ static bool drawSubMenu(const MenuPage *page) { const MenuEntrySub* sub = (const MenuEntrySub*)subEntry; sub->getSubTextFunc(*sub, buffer, &labelPtr); - // If ECustom flag is set, we assume that the getSubTextFunc + // If EMenuEntryCustom flag is set, we assume that the getSubTextFunc // rendered by it self. if( !(sub->flags & EMenuEntryCustom)) { - plotSubOption(buffer); - if(labelPtr != nullptr) { - // TODO: handle this better, we should center text + label - display.setCursor(105,40); - display.setTextSize(1); - display.println(labelPtr); - } + plotSubOption(buffer, labelPtr); } } break; From b061084f1f8869bf2cac5ef78ea0d01529e8198c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Degerf=C3=A4lt?= Date: Mon, 24 Jun 2019 17:55:37 +0200 Subject: [PATCH 35/35] Fixed som redraw issues --- NuEVI/menu.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NuEVI/menu.cpp b/NuEVI/menu.cpp index afde514..cb88b0d 100644 --- a/NuEVI/menu.cpp +++ b/NuEVI/menu.cpp @@ -961,11 +961,11 @@ static bool updatePage(const MenuPage *page, KeyState &input, uint32_t timeNow) display.setTextColor(WHITE); if(page->flags & EMenuPageCustom) { - auto custom = (const MenuPageCustom*)page; + const MenuPageCustom* custom = (const MenuPageCustom*)page; return custom->menuUpdateFunc(input, timeNow); } - bool redraw = false; + bool redraw = stateFirstRun; if (stateFirstRun) { drawMenu(page); @@ -1050,7 +1050,7 @@ bool adjustPageUpdate(KeyState &input, uint32_t timeNow) { static bool patchPageUpdate(KeyState& input, uint32_t timeNow) { - bool redraw = false; + bool redraw = stateFirstRun; if (stateFirstRun) { display.ssd1306_command(SSD1306_DISPLAYON); @@ -1129,14 +1129,14 @@ static bool patchPageUpdate(KeyState& input, uint32_t timeNow) { break; case BTN_MENU+BTN_ENTER: - midiPanic(); display.clearDisplay(); display.setTextSize(2); display.setCursor(35,15); display.println("DON'T"); display.setCursor(35,30); display.println("PANIC"); - redraw = true; + display.display(); // call display explicitly _before_ we call midiPanic + midiPanic(); break; case BTN_MENU+BTN_ENTER+BTN_UP+BTN_DOWN: @@ -1200,7 +1200,7 @@ static bool idlePageUpdate(KeyState& __unused input, uint32_t __unused timeNow) stateFirstRun = 1; } else { display.ssd1306_command(SSD1306_DISPLAYON); - menuState= MAIN_MENU; + menuState = MAIN_MENU; stateFirstRun = 1; } break;