You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I am trying to understand how you exit out of an OP and turn off the function that was running in it.
I can enter and exit the OP, but the function I ran in it still runs. I feel I am missing something simple but cant see it and would love some help-
I am using the tt-Go t-dsiplay example and am loading one of the tft_espi graphics tests from the menu. It runs as it should except I cannot exit from it.
#include "menu_manager.h"
// TFT and button objects
TFT_eSPI tft = TFT_eSPI(); // Define the TFT object
Button2 btnUp(BTN_UP);
Button2 btnDwn(BTN_DWN);
bool invertFieldKeys = false;//global fields keys inversion flag (for code driven single input)
/////
bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap) {
// Stop further decoding as image is running off bottom of screen
if (y >= tft.height()) return 0;
// This function will clip the image block rendering automatically at the TFT boundaries
tft.pushImage(x, y, w, h, bitmap);
// Return 1 to decode next block
return 1;
}
const colorDef<uint16_t> colors[] MEMMODE = {
{ { (uint16_t)Black, (uint16_t)Black },
{ (uint16_t)Black, (uint16_t)DarkerBlue, (uint16_t)DarkerBlue } }, //bgColor
{ { (uint16_t)Gray, (uint16_t)Gray },
{ (uint16_t)White, (uint16_t)White, (uint16_t)White } }, //fgColor
{ { (uint16_t)White, (uint16_t)Black },
{ (uint16_t)Yellow, (uint16_t)Yellow, (uint16_t)Red } }, //valColor
{ { (uint16_t)White, (uint16_t)Black },
{ (uint16_t)White, (uint16_t)Yellow, (uint16_t)Yellow } }, //unitColor
{ { (uint16_t)White, (uint16_t)White },
{ (uint16_t)Black, (uint16_t)Blue, (uint16_t)White } }, //cursorColor
{ { (uint16_t)White, (uint16_t)Yellow },
{ (uint16_t)DarkerRed, (uint16_t)White, (uint16_t)White } }, //titleColor
};
//////// pages for the menu
////
result doAlert(eventMask e, prompt& item);
int test = 55;
// Setting PWM properties, do not change this!
const int pwmFreq = 5000;
const int pwmResolution = 8;
const int pwmLedChannelTFT = 0;
int ledBacklight = 80; // Initial TFT backlight intensity on a scale of 0 to 255. Initial value is 80.
int ledCtrl = LOW; // Initial value for external connected led
result myLedOn() {
ledCtrl = HIGH;
return proceed;
}
result myLedOff() {
ledCtrl = LOW;
return proceed;
}
TOGGLE(ledCtrl, setBuzz, "Buzzer: ", doNothing, noEvent, noStyle, //,doExit,enterEvent,noStyle
VALUE("On", HIGH, doNothing, noEvent),
VALUE("Off", LOW, doNothing, noEvent));
//int selVal = 1;
TOGGLE(selVal, rotateMenu, "Rotate Screen: ", doNothing, noEvent, noStyle,
// VALUE("Zero", 0, updateScreenRotation, enterEvent),
VALUE("A", 1, updateScreenRotation, enterEvent),
// VALUE("Two", 2, updateScreenRotation, enterEvent),
VALUE("B", 3, updateScreenRotation, enterEvent));
/*//int selVal = 1;
void updateScreenRotation() {
switch (selVal) {
case 0:
tft.setRotation(0);
break;
case 1:
tft.setRotation(1);
break;
case 2:
tft.setRotation(2);
break;
case 3:
tft.setRotation(3);
break;
}
}*/
int chooseTest = -1;
CHOOSE(chooseTest, chooseMenu, "Choose", doNothing, noEvent, noStyle,
VALUE("First", 1, doNothing, noEvent),
VALUE("Second", 2, doNothing, noEvent),
VALUE("Third", 3, doNothing, noEvent),
VALUE("Last", -1, doNothing, noEvent));
//////
MENU(subMenu, "Settings", doNothing, noEvent, noStyle,
OP("Battery", doNothing, noEvent),
SUBMENU(rotateMenu),
SUBMENU(setBuzz),
FIELD(ledBacklight, "Backlight: ", "", 0, 255, 10, 5, doNothing, noEvent, wrapStyle), // Menu option to set the intensity of the backlight of the screen.
OP("RawData", doNothing, noEvent),
EXIT("<Back"));
MENU(mainMenu, "Main menu", doNothing, noEvent, wrapStyle,
OP("OP_Template", OP_Template_Loop, enterEvent), // Operation1Loop is the name of the function to run
OP("Graphics Test PDQ", TFT_graphicstest_PDQ_Loop, enterEvent),
OP("OPeration3", doNothing, noEvent),
SUBMENU(subMenu),
SUBMENU(chooseMenu),
//OP("Alert test",doAlert,enterEvent),
EXIT("<Back"));
#define MAX_DEPTH 5
serialIn serial(Serial);
//MENU_INPUTS(in,&serial);its single, no need to `chainStream`
//define serial output device
idx_t serialTops[MAX_DEPTH] = { 0 };
serialOut outSerial(Serial, serialTops);
#define GFX_WIDTH 240
#define GFX_HEIGHT 135
#define fontW 12
#define fontH 24 // 18
constMEM panel panels[] MEMMODE = { { 0, 0, GFX_WIDTH / fontW, GFX_HEIGHT / fontH } };
navNode* nodes[sizeof(panels) / sizeof(panel)]; //navNodes to store navigation status
panelsList pList(panels, nodes, 1); //a list of panels and nodes
idx_t eSpiTops[MAX_DEPTH] = { 0 };
TFT_eSPIOut eSpiOut(tft, colors, eSpiTops, pList, fontW, fontH + 1);
menuOut* constMEM outputs[] MEMMODE = { &outSerial, &eSpiOut }; //list of output devices
outputsList out(outputs, sizeof(outputs) / sizeof(menuOut*)); //outputs list controller
NAVROOT(nav, mainMenu, MAX_DEPTH, serial, out);
unsigned long idleTimestamp = millis();
//when menu is suspended
result idle(menuOut& o, idleEvent e) {
if (e == idling) {
// Show the idle message once
int xpos = tft.width() / 2; // Half the screen width
tft.fillScreen(Black);
tft.setTextSize(1);
tft.setTextColor(Yellow, Black);
tft.setTextWrap(false);
tft.setTextDatum(MC_DATUM);
tft.drawString("IDLE", xpos, 50);
int getFontHeight = tft.fontHeight();
tft.setTextSize(1);
tft.setTextColor(White, Black);
tft.setTextDatum(MC_DATUM);
tft.drawString("Long press a button", xpos, 90);
tft.drawString("to exit", xpos, 110);
}
return proceed;
}
void button_init() {
btnUp.setLongClickHandler([](Button2& b) {
// exit/go back
unsigned int time = b.wasPressedFor();
if (time >= 550) {
nav.doNav(escCmd);
}
});
btnUp.setClickHandler([](Button2& b) {
// Up
unsigned int time = b.wasPressedFor();
if (time >= 50) {
nav.doNav(downCmd); // It's called downCmd because it decreases the index of an array. Visually that would mean the selector goes upwards.
}
});
btnDwn.setLongClickHandler([](Button2& b) {
// select/enter
unsigned int time = b.wasPressedFor();
if (time >= 550) {
nav.doNav(enterCmd);
}
});
btnDwn.setClickHandler([](Button2& b) {
// Down
unsigned int time = b.wasPressedFor();
if (time >= 50) {
nav.doNav(upCmd); // It's called upCmd because it increases the index of an array. Visually that would mean the selector goes downwards.
}
});
}
void button_loop() {
// Check for button presses
btnUp.loop();
btnDwn.loop();
}
void listDir() {
File root = LittleFS.open("/");
File file = root.openNextFile();
while (file) {
Serial.print("File: ");
Serial.println(file.name());
file = root.openNextFile();
}
}
// Menu setup function
void menuSetup() {
nav.idleTask = idle; //point a function to be used when menu is suspended
mainMenu[2].disable();
//outGfx.usePreview=true;//reserve one panel for preview?
//nav.showTitle=false;//show menu title?
//SPI.begin(); // Leave this commented or else there will be nothing shown on the screen.
// Initialise LittleFS
if (!LittleFS.begin()) {
Serial.println("LittleFS initialisation failed!");
while (1) yield(); // Stay here twiddling thumbs waiting
}
listDir();
Serial.println("\r\nInitialisation done.");
tft.init(); // Initialize the screen
ledcSetup(pwmLedChannelTFT, pwmFreq, pwmResolution);
ledcAttachPin(TFT_BL, pwmLedChannelTFT);
ledcWrite(pwmLedChannelTFT, ledBacklight); // Set default backlight intensity
// updateScreenRotation(); // Set initial rotation based on selVal - doesnt work
tft.setRotation(1); // Rotate display a quarter clockwise
tft.setTextFont(4); // Set to built-in font number 4
tft.setTextSize(1);
tft.setTextWrap(false);
tft.fillScreen(Black);
Serial.print("Showing bootlogo... ");
tft.setSwapBytes(true); // We need to swap the colour bytes (endianess)
// The jpeg image can be scaled by a factor of 1, 2, 4, or 8
TJpgDec.setJpgScale(1);
// The decoder must be given the exact name of the rendering function above
TJpgDec.setCallback(tft_output);
uint16_t w = 0, h = 0;
TJpgDec.getFsJpgSize(&w, &h, "/BootLogo.jpg", LittleFS); // Note name preceded with "/"
TJpgDec.drawFsJpg(0, 0, "/BootLogo.jpg", LittleFS);
delay(2000);
//delay(1000);
Serial.println("DONE");
Serial.print("Initialize buttons... ");
button_init();
delay(300);
Serial.println("DONE");
Serial.print("Initialize battery... ");
// batteryInit();
batterySetup();
delay(300);
Serial.println("DONE");
Serial.print("Initialize external led... ");
if (LED_CTRL > 0) {
pinMode(LED_CTRL, OUTPUT);
digitalWrite(LED_CTRL, ledCtrl);
delay(500);
Serial.println("DONE");
} else {
delay(500);
Serial.println("NOT SET UP");
}
delay(2000); // A little bit more delay so that you will be able to see the bootlogo.
Serial.println("- READY -");
tft.fillScreen(Black); // Clear the screen to be ready to draw the menu
//// Operations Setups/////
TFT_graphicstest_PDQ_Setup();
}
void menuLoop() {
nav.poll(); //this device only draws when needed - what does this do?
// Set blacklight intenisty of screen
ledcWrite(pwmLedChannelTFT, ledBacklight);
batteryLoop();
}
The text was updated successfully, but these errors were encountered:
I am trying to understand how you exit out of an OP and turn off the function that was running in it.
I can enter and exit the OP, but the function I ran in it still runs. I feel I am missing something simple but cant see it and would love some help-
I am using the tt-Go t-dsiplay example and am loading one of the tft_espi graphics tests from the menu. It runs as it should except I cannot exit from it.
The text was updated successfully, but these errors were encountered: