Make and use a more generic function for drawing menus

This commit is contained in:
John Stäck 2019-03-03 21:59:25 +01:00
parent 03eb07ea87
commit 08fca258c2
2 changed files with 71 additions and 114 deletions

4
menu.h
View file

@ -2,6 +2,10 @@
#define __MENU_H #define __MENU_H
#define MENU_ROW_HEIGHT 9
#define MENU_HEADER_OFFSET 3
//display states //display states
#define DISPLAYOFF_IDL 0 #define DISPLAYOFF_IDL 0
#define MAIN_MENU 1 #define MAIN_MENU 1

181
menu.ino
View file

@ -2920,60 +2920,42 @@ void drawAdjCursor(byte color){
} }
void drawMenuScreen(){ void drawMenuScreen(){
// Clear the buffer.
display.clearDisplay();
display.setTextSize(1); //Construct the title including voltage reading.
display.setTextColor(WHITE); //Involves intricate splicing of the title string with battery voltage
display.setCursor(0,0); char menuTitle[] = "MENU XXX Y.Y "; //Allocate string buffer of appropriate size with some placeholders
display.print("MENU "); char* splice1 = menuTitle + 13;
char* splice2 = menuTitle + 17;
int vMeterReading = analogRead(vMeterPin); int vMeterReading = analogRead(vMeterPin);
if (vMeterReading > 3000) display.print("USB "); else display.print("BAT "); memcpy(splice1, (vMeterReading > 3000) ? "USB" : "BAT", 3);
if (vMeterReading < 2294) display.print("LOW"); else { if (vMeterReading < 2294) {
display.print(map(vMeterReading,0,3030,0,50)*0.1,1); memcpy(splice2, "LOW ", 3);
display.print("V"); } else {
double voltage = map(vMeterReading,0,3030,0,50)*0.1;
dtostrf(voltage, 3, 1, splice2);
splice2[3]='V'; //Put the V at the end (last char of buffer before \0)
} }
display.drawLine(0,9,127,9,WHITE);
display.setCursor(0,12); drawMenu(menuTitle, mainMenuCursor, 6,
display.println("TRANSPOSE"); "TRANSPOSE",
display.setCursor(0,21); "OCTAVE",
display.println("OCTAVE"); "MIDI CH",
display.setCursor(0,30); "ADJUST",
display.println("MIDI CH"); "SETUP BR",
display.setCursor(0,39); "SETUP CTL");
display.println("ADJUST");
display.setCursor(0,48);
display.println("SETUP BR");
display.setCursor(0,57);
display.println("SETUP CTL");
drawMenuCursor(mainMenuCursor, WHITE);
display.display();
} }
void drawRotatorMenuScreen(){ void drawRotatorMenuScreen(){
// Clear the buffer. drawMenu("ROTATOR SETUP", rotatorMenuCursor, 6,
display.clearDisplay(); "PARALLEL",
"ROTATE 1",
display.setTextSize(1); "ROTATE 2",
display.setTextColor(WHITE); "ROTATE 3",
display.setCursor(0,0); "ROTATE 4",
display.print("ROTATOR SETUP"); "PRIORITY");
display.drawLine(0,9,127,9,WHITE);
display.setCursor(0,12);
display.println("PARALLEL");
display.setCursor(0,21);
display.println("ROTATE 1");
display.setCursor(0,30);
display.println("ROTATE 2");
display.setCursor(0,39);
display.println("ROTATE 3");
display.setCursor(0,48);
display.println("ROTATE 4");
display.setCursor(0,57);
display.println("PRIORITY");
drawMenuCursor(rotatorMenuCursor, WHITE);
display.display();
} }
void drawPatchView(){ void drawPatchView(){
display.clearDisplay(); display.clearDisplay();
if (FPD){ if (FPD){
@ -3613,81 +3595,17 @@ void plotVelBias(int color){
} }
void drawSetupBrMenuScreen(){ void drawSetupBrMenuScreen(){
// Clear the buffer. drawMenu("SETUP BREATH", -1, 6, "BREATH CC", "BREATH AT", "VELOCITY", "CURVE", "VEL DELAY", "VEL BIAS");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("SETUP BREATH");
display.drawLine(0,9,127,9,WHITE);
display.setCursor(0,12);
display.println("BREATH CC");
display.setCursor(0,21);
display.println("BREATH AT");
display.setCursor(0,30);
display.println("VELOCITY");
display.setCursor(0,39);
display.println("CURVE");
display.setCursor(0,48);
display.println("VEL DELAY");
display.setCursor(0,57);
display.println("VEL BIAS");
display.display();
} }
void drawSetupCtMenuScreen(){ void drawSetupCtMenuScreen(){
// Clear the buffer. drawMenu("SETUP CTRLS", -1, 6, "PORT/GLD", "PITCHBEND", "EXTRA CTR", "VIBRATO", "DEGLITCH", "PINKY KEY");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("SETUP CTRLS");
display.drawLine(0,9,127,9,WHITE);
display.setCursor(0,12);
display.println("PORT/GLD");
display.setCursor(0,21);
display.println("PITCHBEND");
display.setCursor(0,30);
display.println("EXTRA CTR");
display.setCursor(0,39);
display.println("VIBRATO");
display.setCursor(0,48);
display.println("DEGLITCH");
display.setCursor(0,57);
display.println("PINKY KEY");
display.display();
} }
void drawVibratoMenuScreen(){ void drawVibratoMenuScreen(){
// Clear the buffer. drawMenu("VIBRATO", -1, 5, "DEPTH","SENSE","RETURN", "SQUELCH", "DIRECTION");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("VIBRATO");
display.drawLine(0,9,127,9,WHITE);
display.setCursor(0,12);
display.println("DEPTH");
display.setCursor(0,21);
display.println("SENSE");
display.setCursor(0,30);
display.println("RETURN");
display.setCursor(0,39);
display.println("SQUELCH");
display.setCursor(0,48);
display.println("DIRECTION");
display.setCursor(0,57);
display.println("");
display.display();
} }
void drawSensorPixels(){ void drawSensorPixels(){
int pos,oldpos; int pos,oldpos;
int redraw=0; int redraw=0;
@ -3818,3 +3736,38 @@ void clearFPS(int trills) {
writeSetting(FP1_ADDR+2*(trills-1),0); writeSetting(FP1_ADDR+2*(trills-1),0);
FPD = 3; FPD = 3;
} }
/*
* 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
*/
void drawMenu(const char* header, byte selected, byte nItems, ...) {
//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);
va_list valist;
va_start(valist, nItems);
for(byte row=0; row<nItems; row++) {
int rowPixel = (row+1)*MENU_ROW_HEIGHT + MENU_HEADER_OFFSET;
const char* lineText = va_arg(valist, const char*);
display.setCursor(0,rowPixel);
display.println(lineText);
}
if(selected>=0) drawMenuCursor(selected, WHITE);
va_end(valist);
display.display();
}