Local menu problem
I Have an issue where for the first time after a reset when I press the up arrow panel button which I have assigned an interupt it is supposed to display the main menu but actually displays the second menu. I have to press back menu option to get to the main menu. Once I do this after startup it works as it should. Maybe someone can see the problem.
The readbuttons function is exactly the same as the demo
Any ideas are appreciated.
Here I assign the interupts
attachInterrupt(25, upPress, FALLING);
attachInterrupt(24, enterPress, FALLING);
Here is the upPress function. As you can see I am trying to reset all of the menu option to defaults.
void upPress()
{
if (runMode)
{
// SerialUSB.println("runMode to 0");
MenuLevel = 0; //menu tree depth -> second level
MenuID = 10; //unique menu id -> has to be unique for each menu on the same menu level.
buttonUpState = 0;
prevBtnUp = 0;
lastBtnUp = 0;
enterPressed = 0;
buttonEnterState = 0;
prevBtnEnt = 0;
lastBtnEnt = 0;
backLightDimmed = 0;
analogWrite(backlightPin, (map(5, 5, 0, 255, 0)));
glBackLightDelayTime = millis();
lRunModeTimeout = millis();
MenuMain();
runMode = 0;
}
}
The enterPress function.
void enterPress()
{
if (runMode)
{
backLightDimmed = 0;
analogWrite(backlightPin, (map(5, 5, 0, 255, 0)));
glBackLightDelayTime = millis();
}
}
The loop.
void loop()
{
if (runMode)
{
// if (bAuthenticated)
// {
// if ((millis() - lLogintimeOut) > 10000)
// {
// bAuthenticated = false;
// loggedIn = 0;
//// currPage = 1;
// }
// }
listenForEthernetClients();
if ((millis() - lSpLoop) > 5000 && sMode > 0)
{
lSpLoop = millis();
occProcess();
outputProcess();
monitorProcess();
outputProcessPrint();
}
if ((millis() - glBackLightDelayTime) > 30000 && backLightDimmed == 0)
{
//isLocked = true;
backLightDimmed = 1;
analogWrite(backlightPin, (map(0, 5, 0, 255, 0)));
}
}
else // use local menu buttons
{
ReadButtons(); //check buttons
Navigate(); //update menus and perform actions
if ((millis() - lRunModeTimeout) > 30000)
{
setRunMode();
}
}
}
Here are the menus.
This is the menu I want on the first press of the up arrow.
void MenuMain()
{
//menu inintialisers
channel = 0; //starting row position of the cursor (top row) - controlled by the button panel counter
channelUpLimit = 6; //upper row limit
channelLowLimit = 0;
MenuLevel = 0; //menu tree depth -> second level
MenuID = 10; //unique menu id -> has to be unique for each menu on the same menu level.
enterPressed = 0; //clears any possible accidental "Enter" presses that could have been caried over from the previous menu
lcd.clear(); //clear the screen
//actual user content on the screen
lcd.setCursor(6, 0); //set the cursor to the sixth pixel from the left edge, first row.
lcd.print("Main Opt"); //print text on screen
lcd.setCursor(6, 1); //set the cursor to the sixth pixel from the left edge, first row.
lcd.print("Temperature Opt"); //print text on screen
lcd.setCursor(6, 2); //set the cursor to the sixth pixel from the left edge, first row.
lcd.print("Voltage Opt"); //print text on screen
lcd.setCursor(6, 3); //set the cursor to the sixth pixel from the left edge, first row.
lcd.print("Percent Opt"); //print text on screen
lcd.setCursor(6, 4); //set the cursor to the sixth pixel from the left edge, third row.
lcd.print("Save Settings"); //print text on screen
lcd.setCursor(6, 5); //set the cursor to the sixth pixel from the left edge, second row.
lcd.print("Run Program"); //print text on screen
lcd.setCursor(6, 6);
lcd.print("About");
ScrollCursor(); //enable the moving cursor (note that this function is not called in the splash screen, thus disabling the cursor)
}
This is the menu that I get on the first press of the up arrow.
void MenuSetupPg1()
{
channel = 0;
channelUpLimit = 3;
channelLowLimit = 0;
MenuID = 11;
MenuLevel = 1;
enterPressed = 0;
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("Mode(0,1,2");
lcd.setCursor(80, 0);
lcd.print(sMode, 1);
lcd.setCursor(6, 1);
lcd.print("Occ Mode(0,1");
lcd.setCursor(80, 1);
lcd.print(sModeOcc, 1);
lcd.setCursor(6, 2);
lcd.print("Reset");
lcd.setCursor(6, 3);
lcd.print("Back");
ScrollCursor();
}
Here is the navigate function.
if (runMode == 0)
{
if (valueEditing != 1)
{
if (MenuLevel == 0)
{ //check if current activated menu is the 'Main menu' (first level)
if (channel == 0 && enterPressed == 1) MenuSetupPg1();
if (channel == 1 && enterPressed == 1) MenuSetupPg2();
if (channel == 2 && enterPressed == 1) MenuSetupPg3();
if (channel == 3 && enterPressed == 1) MenuSetupPg4();
if (channel == 4 && enterPressed == 1) writeToEEprom();
if (channel == 5 && enterPressed == 1) setRunMode();
if (channel == 6 && enterPressed == 1) AboutPg1();
}
if (MenuLevel == 1)
{
if (MenuID == 11)
{
if (channel == 0 && enterPressed == 1) //using 'value editing mode' to edit a variable using the UI
{
targetMax = 2;
targetMin = 0;
TargetValue = sMode; //copy variable to be edited to 'Target value'
sMode = EditValue();
}
if (channel == 1 && enterPressed == 1) //using 'value editing mode' to edit a variable using the UI
{
targetMax = 1;
targetMin = 0;
TargetValue = sModeOcc; //copy variable to be edited to 'Target value'
sModeOcc = EditValue();
}
if (channel == 2 && enterPressed == 1) resetFunc();
if (channel == 3 && enterPressed == 1) MenuMain();
}
if (MenuID == 12)
{
if (channel == 0 && enterPressed == 1)
{
targetMax = 90;
targetMin = tMin[1] + 2;
TargetValue = tMax[1]; //copy variable to be edited to 'Target value'
tMax[1] = EditValue();
}
if (channel == 1 && enterPressed == 1)
{
targetMax = 90;
targetMin = tMin[2] + 2;
TargetValue = tMax[2]; //copy variable to be edited to 'Target value'
tMax[2] = EditValue();
}
if (channel == 2 && enterPressed == 1)
{
targetMax = tMax[1] - 2;
targetMin = 60;
TargetValue = tMin[1]; //copy variable to be edited to 'Target value'
tMin[1] = EditValue();
}
if (channel == 3 && enterPressed == 1)
{
targetMax = tMax[2] - 2;
targetMin = 60;
TargetValue = tMin[2]; //copy variable to be edited to 'Target value'
tMin[2] = EditValue();
}
if (channel == 4 && enterPressed == 1) MenuMain();
}// menu id 1
if (MenuID == 13)
{
if (channel == 0 && enterPressed == 1) //using 'value editing mode' to edit a variable using the UI
{
targetMax = 10;
targetMin = 4;
TargetValue = vMax[1]; //copy variable to be edited to 'Target value'
vMax[1] = EditValue();
}
if (channel == 1 && enterPressed == 1) //using 'value editing mode' to edit a variable using the UI
{
targetMax = 10;
targetMin = 4;
TargetValue = vMax[2]; //copy variable to be edited to 'Target value'
vMax[2] = EditValue();
}
if (channel == 2 && enterPressed == 1)
{
targetMax = 8;
targetMin = constrain(vMin[1], 0, (vMax[1] - 2));
TargetValue = vMin[1]; //copy variable to be edited to 'Target value'
vMin[1] = EditValue();
}
if (channel == 3 && enterPressed == 1)
{
targetMax = 8;
targetMin = constrain(vMin[2], 0, (vMax[2] - 2));
TargetValue = vMin[2]; //copy variable to be edited to 'Target value'
vMin[2] = EditValue();
}
if (channel == 4 && enterPressed == 1) MenuMain();
}// menu id 2
if (MenuID == 14)
{
if (channel == 0 && enterPressed == 1) //using 'value editing mode' to edit a variable using the UI
{
targetMax = 100;
targetMin = 20;
TargetValue = pMax[1]; //copy variable to be edited to 'Target value'
pMax[1] = EditValue();
}
if (channel == 1 && enterPressed == 1) //using 'value editing mode' to edit a variable using the UI
{
targetMax = 100;
targetMin = 20;
TargetValue = pMax[2]; //copy variable to be edited to 'Target value'
pMax[2] = EditValue();
}
if (channel == 2 && enterPressed == 1)
{
targetMax = 80;
targetMin = constrain(pMin[1], 20, (pMax[1] - 2));
TargetValue = pMin[1]; //copy variable to be edited to 'Target value'
pMin[1] = EditValue();
}
if (channel == 3 && enterPressed == 1)
{
targetMax = 80;
targetMin = constrain(pMin[2], 20, (pMax[2] - 2));
TargetValue = pMin[2]; //copy variable to be edited to 'Target value'
pMin[2] = EditValue();
}
if (channel == 4 && enterPressed == 1) MenuMain();
}// menu id 14
if (MenuID == 15)
{
if (channel == 5 && enterPressed == 1) MenuMain();
}
}
}
//dont remove this part
if (channel != lastChannel && valueEditing != 1)
{ //updates the cursor position if button counter changed and 'value editing mode' is not running
ScrollCursor();
}
}
}
Your answer
Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!
Keep Informed
About This Forum
This community is for professionals and enthusiasts of our products and services.
Read GuidelinesQuestion tools
Stats
| Asked: 6/15/21, 12:53 PM |
| Seen: 1576 times |
| Last updated: 6/15/21, 12:53 PM |