Port ESP32 Marauder to CYD 2432S028

This commit is contained in:
Just Call Me Koko
2025-04-25 17:32:28 -04:00
parent 97dce525a4
commit 4a90876d81
9 changed files with 413 additions and 180 deletions

View File

@@ -4,9 +4,53 @@
#ifdef HAS_SCREEN
Display::Display()
#ifdef HAS_CYD_TOUCH
: touchscreenSPI(VSPI),
touchscreen(XPT2046_CS, XPT2046_IRQ)
#endif
{
}
uint8_t Display::updateTouch(uint16_t *x, uint16_t *y, uint16_t threshold) {
if (!this->headless_mode)
#ifndef HAS_CYD_TOUCH
return this->tft.getTouch(x, y, threshold);
#else
if (this->touchscreen.tirqTouched() && this->touchscreen.touched()) {
TS_Point p = this->touchscreen.getPoint();
//*x = map(p.x, 200, 3700, 1, TFT_WIDTH);
//*y = map(p.y, 240, 3800, 1, TFT_HEIGHT);
uint8_t rot = this->tft.getRotation();
switch (rot) {
case 0: // Standard Protrait
*x = map(p.x, 200, 3700, 1, TFT_WIDTH);
*y = map(p.y, 240, 3800, 1, TFT_HEIGHT);
break;
case 1:
*x = map(p.y, 143, 3715, 0, TFT_HEIGHT); // Horizontal (Y axis in touch, X on screen)
*y = map(p.x, 3786, 216, 0, TFT_WIDTH); // Vertical (X axis in touch, Y on screen)
break;
case 2:
*x = map(p.x, 3700, 200, 1, TFT_WIDTH);
*y = map(p.y, 3800, 240, 1, TFT_HEIGHT);
break;
case 3:
*x = map(p.y, 3800, 240, 1, TFT_WIDTH);
*y = map(p.x, 200, 3700, 1, TFT_HEIGHT);
break;
}
return 1;
}
else
return 0;
#endif
else
return !this->headless_mode;
}
// Function to prepare the display and the menus
void Display::RunSetup()
{
@@ -19,6 +63,12 @@ void Display::RunSetup()
screen_buffer = new LinkedList<String>();
#endif
#ifdef HAS_CYD_TOUCH
this->touchscreenSPI.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
this->touchscreen.begin(touchscreenSPI);
this->touchscreen.setRotation(0);
#endif
tft.init();
#ifndef MARAUDER_M5STICKC
tft.setRotation(0); // Portrait
@@ -36,14 +86,16 @@ void Display::RunSetup()
#ifdef HAS_ILI9341
#ifndef HAS_CYD_TOUCH
#ifdef TFT_SHIELD
uint16_t calData[5] = { 275, 3494, 361, 3528, 4 }; // tft.setRotation(0); // Portrait with TFT Shield
//Serial.println(F("Using TFT Shield"));
#else if defined(TFT_DIY)
#elif defined(TFT_DIY)
uint16_t calData[5] = { 339, 3470, 237, 3438, 2 }; // tft.setRotation(0); // Portrait with DIY TFT
//Serial.println(F("Using TFT DIY"));
#endif
tft.setTouch(calData);
#endif
#endif

View File

@@ -19,6 +19,10 @@
#include <TFT_eSPI.h>
#ifdef HAS_CYD_TOUCH
#include <XPT2046_Touchscreen.h>
#endif
// WiFi stuff
#define OTA_UPDATE 100
#define SHOW_INFO 101
@@ -72,6 +76,11 @@ class Display
TFT_eSPI_Button key[BUTTON_ARRAY_LEN];
const String PROGMEM version_number = MARAUDER_VERSION;
#ifdef HAS_CYD_TOUCH
SPIClass touchscreenSPI;
XPT2046_Touchscreen touchscreen;
#endif
bool printing = false;
bool loading = false;
bool tteBar = false;
@@ -105,6 +114,7 @@ class Display
// We can speed up scrolling of short text lines by just blanking the character we drew
int blank[19]; // We keep all the strings pixel lengths to optimise the speed of the top line blanking
uint8_t updateTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600);
void tftDrawRedOnOffButton();
void tftDrawGreenOnOffButton();
void tftDrawGraphObjects(byte x_scale);

View File

@@ -18,13 +18,6 @@ MenuFunctions::MenuFunctions()
/* Interrupt driven periodic handler */
#ifdef HAS_ILI9341
uint8_t MenuFunctions::updateTouch(uint16_t *x, uint16_t *y, uint16_t threshold) {
if (!display_obj.headless_mode)
return display_obj.tft.getTouch(x, y, threshold);
else
return !display_obj.headless_mode;
}
void MenuFunctions::lv_tick_handler()
{
lv_tick_inc(LVGL_TICK_PERIOD);
@@ -723,13 +716,11 @@ void MenuFunctions::main(uint32_t currentTime)
display_obj.displayBuffer();
// Pressed will be set true is there is a valid touch on the screen
int pre_getTouch = millis();
// getTouch causes a 10ms delay which makes beacon spam less effective
#ifdef HAS_ILI9341
if (!this->disable_touch)
pressed = this->updateTouch(&t_x, &t_y);
pressed = display_obj.updateTouch(&t_x, &t_y);
#endif
@@ -946,7 +937,7 @@ void MenuFunctions::main(uint32_t currentTime)
// Menu navigation and paging
#ifdef HAS_BUTTONS
#if !(defined(MARAUDER_V6) || defined(MARAUDER_V6_1))
#if !(defined(MARAUDER_V6) || defined(MARAUDER_V6_1) || defined(MARAUDER_CYD_MICRO))
#if !defined(MARAUDER_M5STICKC) || defined(MARAUDER_M5STICKCP2)
if (u_btn.justPressed()){
if ((wifi_scan_obj.currentScanMode == WIFI_SCAN_OFF) ||
@@ -1158,11 +1149,13 @@ void MenuFunctions::updateStatusBar()
uint16_t the_color;
#ifdef HAS_GPS
if (this->old_gps_sat_count != gps_obj.getNumSats()) {
this->old_gps_sat_count = gps_obj.getNumSats();
display_obj.tft.fillRect(0, 0, 240, STATUS_BAR_WIDTH, STATUSBAR_COLOR);
status_changed = true;
}
#endif
// GPS Stuff
#ifdef HAS_GPS
@@ -1386,6 +1379,7 @@ void MenuFunctions::orientDisplay()
display_obj.tft.setCursor(0, 0);
#ifdef HAS_ILI9341
#ifndef HAS_CYD_TOUCH
#ifdef TFT_SHIELD
uint16_t calData[5] = { 275, 3494, 361, 3528, 4 }; // tft.setRotation(0); // Portrait with TFT Shield
#else if defined(TFT_DIY)
@@ -1393,6 +1387,9 @@ void MenuFunctions::orientDisplay()
#endif
display_obj.tft.setTouch(calData);
#else
display_obj.touchscreen.setRotation(0);
#endif
#endif
changeMenu(current_menu);
@@ -1601,9 +1598,11 @@ void MenuFunctions::RunSetup()
this->addNodes(&wifiMenu, text_table1[31], TFTYELLOW, NULL, SNIFFERS, [this]() {
this->changeMenu(&wifiSnifferMenu);
});
#ifdef HAS_GPS
this->addNodes(&wifiMenu, "Wardriving", TFTGREEN, NULL, BEACON_SNIFF, [this]() {
this->changeMenu(&wardrivingMenu);
});
#endif
this->addNodes(&wifiMenu, text_table1[32], TFTRED, NULL, ATTACKS, [this]() {
this->changeMenu(&wifiAttackMenu);
});
@@ -1708,11 +1707,11 @@ void MenuFunctions::RunSetup()
//#endif
// Build Wardriving menu
#ifdef HAS_GPS
wardrivingMenu.parentMenu = &wifiMenu; // Main Menu is second menu parent
this->addNodes(&wardrivingMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
this->changeMenu(wardrivingMenu.parentMenu);
});
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
this->addNodes(&wardrivingMenu, "Wardrive", TFTGREEN, NULL, BEACON_SNIFF, [this]() {
display_obj.clearScreen();
@@ -2274,7 +2273,7 @@ void MenuFunctions::RunSetup()
#ifndef HAS_ILI9341
#ifdef HAS_BUTTONS
this->changeMenu(&sdDeleteMenu);
#if !(defined(MARAUDER_V6) || defined(MARAUDER_V6_1))
#if !(defined(MARAUDER_V6) || defined(MARAUDER_V6_1) || defined(MARAUDER_CYD_MICRO))
bool deleting = true;
@@ -2539,7 +2538,7 @@ void MenuFunctions::RunSetup()
// Button loop until hold center button
#ifdef HAS_BUTTONS
#if !(defined(MARAUDER_V6) || defined(MARAUDER_V6_1))
#if !(defined(MARAUDER_V6) || defined(MARAUDER_V6_1) || defined(MARAUDER_CYD_MICRO))
while(true) {
// Cycle char previous
#ifdef HAS_L

View File

@@ -215,8 +215,6 @@ class MenuFunctions
void miniKeyboard(Menu * targetMenu);
#endif
uint8_t updateTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600);
public:
MenuFunctions();

View File

@@ -21,7 +21,7 @@ bool SDInterface::initSD() {
pinMode(SD_CS, OUTPUT);
delay(10);
#if defined(MARAUDER_M5STICKC)
#if (defined(MARAUDER_M5STICKC)) || (defined(HAS_CYD_TOUCH))
/* Set up SPI SD Card using external pin header
StickCPlus Header - SPI SD Card Reader
3v3 - 3v3
@@ -31,7 +31,13 @@ bool SDInterface::initSD() {
G26 - MOSI
- CS (jumper to SD Card GND Pin)
*/
#if defined(MARAUDER_M5STICKC)
enum { SPI_SCK = 0, SPI_MISO = 36, SPI_MOSI = 26 };
#elif defined(MARAUDER_CYD_MICRO)
enum { SPI_SCK = SD_SCK, SPI_MISO = SD_MISO, SPI_MOSI = SD_MOSI };
#else
enum { SPI_SCK = 0, SPI_MISO = 36, SPI_MOSI = 26 };
#endif
this->spiExt = new SPIClass();
this->spiExt->begin(SPI_SCK, SPI_MISO, SPI_MOSI, SD_CS);
if (!SD.begin(SD_CS, *(this->spiExt))) {

View File

@@ -26,9 +26,9 @@ extern Settings settings_obj;
class SDInterface {
private:
#if defined(MARAUDER_M5STICKC)
#if (defined(MARAUDER_M5STICKC) || defined(HAS_CYD_TOUCH))
SPIClass *spiExt;
#endif
#endif
bool checkDetectPin();
public:

View File

@@ -1327,6 +1327,7 @@ void WiFiScan::RunLoadATList() {
}
void WiFiScan::RunSaveATList(bool save_as) {
#ifdef HAS_SD
if (save_as) {
sd_obj.removeFile("/Airtags_0.log");
@@ -1362,6 +1363,7 @@ void WiFiScan::RunSaveATList(bool save_as) {
Serial.print("Saved Airtags:");
Serial.println((String)airtags->size());
}
#endif
}
void WiFiScan::RunLoadAPList() {
@@ -1440,6 +1442,7 @@ void WiFiScan::RunLoadAPList() {
}
void WiFiScan::RunSaveAPList(bool save_as) {
#ifdef HAS_SD
if (save_as) {
sd_obj.removeFile("/APs_0.log");
@@ -1485,6 +1488,7 @@ void WiFiScan::RunSaveAPList(bool save_as) {
Serial.print("Saved APs:");
Serial.println((String)access_points->size());
}
#endif
}
void WiFiScan::RunLoadSSIDList() {
@@ -1527,6 +1531,7 @@ void WiFiScan::RunLoadSSIDList() {
}
void WiFiScan::RunSaveSSIDList(bool save_as) {
#ifdef HAS_SD
if (save_as) {
sd_obj.removeFile("/SSIDs_0.log");
@@ -1552,6 +1557,7 @@ void WiFiScan::RunSaveSSIDList(bool save_as) {
Serial.print("Saved SSIDs: ");
Serial.println((String)ssids->size());
}
#endif
}
void WiFiScan::RunEvilPortal(uint8_t scan_mode, uint16_t color)
@@ -1664,6 +1670,7 @@ void WiFiScan::RunAPScan(uint8_t scan_mode, uint16_t color)
display_obj.tft.init();
display_obj.tft.setRotation(1);
#ifndef HAS_CYD_TOUCH
#ifdef TFT_SHIELD
uint16_t calData[5] = { 391, 3491, 266, 3505, 7 }; // Landscape TFT Shield
Serial.println("Using TFT Shield");
@@ -1674,6 +1681,9 @@ void WiFiScan::RunAPScan(uint8_t scan_mode, uint16_t color)
#ifdef HAS_ILI9341
display_obj.tft.setTouch(calData);
#endif
#else
display_obj.touchscreen.setRotation(1);
#endif
lv_obj_t * scr = lv_cont_create(NULL, NULL);
@@ -2236,6 +2246,7 @@ void WiFiScan::RunPacketMonitor(uint8_t scan_mode, uint16_t color)
#endif
#ifdef HAS_SCREEN
#ifndef HAS_CYD_TOUCH
#ifdef TFT_SHIELD
uint16_t calData[5] = { 391, 3491, 266, 3505, 7 }; // Landscape TFT Shield
Serial.println("Using TFT Shield");
@@ -2244,6 +2255,9 @@ void WiFiScan::RunPacketMonitor(uint8_t scan_mode, uint16_t color)
Serial.println("Using TFT DIY");
#endif
display_obj.tft.setTouch(calData);
#else
//display_obj.touchscreen.setRotation(1);
#endif
//display_obj.tft.setFreeFont(1);
display_obj.tft.setFreeFont(NULL);
@@ -2353,6 +2367,7 @@ void WiFiScan::RunEapolScan(uint8_t scan_mode, uint16_t color)
startPcap("eapol");
#ifdef HAS_SCREEN
#ifndef HAS_CYD_TOUCH
#ifdef TFT_SHIELD
uint16_t calData[5] = { 391, 3491, 266, 3505, 7 }; // Landscape TFT Shield
//Serial.println("Using TFT Shield");
@@ -2361,6 +2376,9 @@ void WiFiScan::RunEapolScan(uint8_t scan_mode, uint16_t color)
//Serial.println("Using TFT DIY");
#endif
display_obj.tft.setTouch(calData);
#else
display_obj.touchscreen.setRotation(1);
#endif
display_obj.tft.setFreeFont(NULL);
display_obj.tft.setTextSize(1);
@@ -5594,7 +5612,8 @@ void WiFiScan::activeEapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t
// Do the touch stuff
#ifdef HAS_ILI9341
pressed = display_obj.tft.getTouch(&t_x, &t_y);
pressed = display_obj.updateTouch(&t_x, &t_y);
//pressed = display_obj.tft.getTouch(&t_x, &t_y);
#endif
// Check buttons for presses

View File

@@ -21,9 +21,10 @@
//#define MARAUDER_DEV_BOARD_PRO
//#define XIAO_ESP32_S3
//#define MARAUDER_REV_FEATHER
//#define MARAUDER_CYD_MICRO // 2431S028
//// END BOARD TARGETS
#define MARAUDER_VERSION "v1.4.4"
#define MARAUDER_VERSION "v1.4.5"
#define GRAPH_REFRESH 100
@@ -44,6 +45,8 @@
#define HARDWARE_NAME "Marauder v6"
#elif defined(MARAUDER_V6_1)
#define HARDWARE_NAME "Marauder v6.1"
#elif defined(MARAUDER_CYD_MICRO)
#define HARDWARE_NAME "CYD 2432S028"
#elif defined(MARAUDER_KIT)
#define HARDWARE_NAME "Marauder Kit"
#elif defined(MARAUDER_FLIPPER)
@@ -153,6 +156,23 @@
#define HAS_GPS
#endif
#ifdef MARAUDER_CYD_MICRO
//#define FLIPPER_ZERO_HAT
//#define HAS_BATTERY
#define HAS_BT
#define HAS_BT_REMOTE
#define HAS_BUTTONS
#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
#define HAS_SCREEN
#define HAS_FULL_SCREEN
#define HAS_SD
#define USE_SD
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_CYD_TOUCH
#endif
#ifdef MARAUDER_KIT
//#define FLIPPER_ZERO_HAT
#define HAS_BATTERY
@@ -379,6 +399,26 @@
#define D_PULL true
#endif
#ifdef MARAUDER_CYD_MICRO
#define L_BTN -1
#define C_BTN 0
#define U_BTN -1
#define R_BTN -1
#define D_BTN -1
//#define HAS_L
//#define HAS_R
//#define HAS_U
//#define HAS_D
#define HAS_C
#define L_PULL true
#define C_PULL true
#define U_PULL true
#define R_PULL true
#define D_PULL true
#endif
#endif
//// END BUTTON DEFINITIONS
@@ -606,7 +646,74 @@
#define TFT_HEIGHT 320
#endif
#ifndef MARAUDER_CYD_MICRO
#define TFT_DIY
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
#define EXT_BUTTON_WIDTH 20
#define SCREEN_BUFFER
#define MAX_SCREEN_BUFFER 22
#define CHAR_WIDTH 12
#define SCREEN_WIDTH TFT_WIDTH
#define SCREEN_HEIGHT TFT_HEIGHT
#define HEIGHT_1 TFT_WIDTH
#define WIDTH_1 TFT_HEIGHT
#define STANDARD_FONT_CHAR_LIMIT (TFT_WIDTH/6) // number of characters on a single line with normal font
#define TEXT_HEIGHT 16 // Height of text to be printed and scrolled
#define BOT_FIXED_AREA 0 // Number of lines in bottom fixed area (lines counted from bottom of screen)
#define TOP_FIXED_AREA 48 // Number of lines in top fixed area (lines counted from top of screen)
#define YMAX 320 // Bottom of screen area
#define minimum(a,b) (((a) < (b)) ? (a) : (b))
//#define MENU_FONT NULL
#define MENU_FONT &FreeMono9pt7b // Winner
//#define MENU_FONT &FreeMonoBold9pt7b
//#define MENU_FONT &FreeSans9pt7b
//#define MENU_FONT &FreeSansBold9pt7b
#define BUTTON_SCREEN_LIMIT 12
#define BUTTON_ARRAY_LEN BUTTON_SCREEN_LIMIT
#define STATUS_BAR_WIDTH 16
#define LVGL_TICK_PERIOD 6
#define FRAME_X 100
#define FRAME_Y 64
#define FRAME_W 120
#define FRAME_H 50
// Red zone size
#define REDBUTTON_X FRAME_X
#define REDBUTTON_Y FRAME_Y
#define REDBUTTON_W (FRAME_W/2)
#define REDBUTTON_H FRAME_H
// Green zone size
#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
#define GREENBUTTON_Y FRAME_Y
#define GREENBUTTON_W (FRAME_W/2)
#define GREENBUTTON_H FRAME_H
#define STATUSBAR_COLOR 0x4A49
#define KIT_LED_BUILTIN 13
#endif
#if defined(MARAUDER_CYD_MICRO)
#define SCREEN_CHAR_WIDTH 40
#define HAS_ILI9341
#define BANNER_TEXT_SIZE 2
#ifndef TFT_WIDTH
#define TFT_WIDTH 240
#endif
#ifndef TFT_HEIGHT
#define TFT_HEIGHT 320
#endif
#define GRAPH_VERT_LIM TFT_HEIGHT/2
@@ -974,6 +1081,25 @@
//#define BUTTON_ARRAY_LEN 5
#endif
#if defined(MARAUDER_CYD_MICRO)
#define BANNER_TIME 100
#define COMMAND_PREFIX "!"
// Keypad start position, key sizes and spacing
#define KEY_X 120 // Centre of key
#define KEY_Y 50
#define KEY_W 240 // Width and height
#define KEY_H 22
#define KEY_SPACING_X 0 // X and Y gap
#define KEY_SPACING_Y 1
#define KEY_TEXTSIZE 1 // Font size multiplier
#define ICON_W 22
#define ICON_H 22
#define BUTTON_PADDING 22
//#define BUTTON_ARRAY_LEN 5
#endif
#ifdef MARAUDER_V7
#define BANNER_TIME 100
@@ -1082,6 +1208,10 @@
#define SD_CS 14
#endif
#ifdef MARAUDER_CYD_MICRO
#define SD_CS 5
#endif
#ifdef MARAUDER_KIT
#define SD_CS 12
#endif
@@ -1184,6 +1314,8 @@
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_V6) || defined(MARAUDER_V6_1)
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_CYD_MICRO)
#define MEM_LOWER_LIM 10000
#elif defined(MARAUDER_KIT)
#define MEM_LOWER_LIM 10000
#elif defined(GENERIC_ESP32)
@@ -1208,6 +1340,8 @@
#define PIN 16
#elif defined(MARAUDER_REV_FEATHER)
#define PIN 33
#elif defined(MARAUDER_CYD_MICRO)
#define PIN 4
#else
#define PIN 25
#endif
@@ -1228,6 +1362,8 @@
#define MAX_HTML_SIZE 11400
#elif defined(MARAUDER_V6) || defined(MARAUDER_V6_1)
#define MAX_HTML_SIZE 11400
#elif defined(MARAUDER_CYD_MICRO)
#define MAX_HTML_SIZE 11400
#elif defined(MARAUDER_KIT)
#define MAX_HTML_SIZE 11400
#elif defined(GENERIC_ESP32)
@@ -1252,6 +1388,11 @@
#define GPS_TX 4
#define GPS_RX 13
#define mac_history_len 100
#elif defined(MARAUDER_CYD_MICRO)
#define GPS_SERIAL_INDEX 2
#define GPS_TX 27 // Fits the extended I/O
#define GPS_RX 22
#define mac_history_len 100
#elif defined(MARAUDER_V4)
#define GPS_SERIAL_INDEX 2
#define GPS_TX 4
@@ -1343,6 +1484,8 @@
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_V6) || defined(MARAUDER_V6_1)
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_CYD_MICRO)
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_KIT)
#define MARAUDER_TITLE_BYTES 13578
#elif defined(MARAUDER_MINI)
@@ -1372,4 +1515,20 @@
#define SNAP_LEN 2324 // max len of each recieved packet
#endif
//// PCAP BUFFER STUFF
//// STUPID CYD STUFF
#ifdef HAS_CYD_TOUCH
#ifdef MARAUDER_CYD_MICRO
#define XPT2046_IRQ 36
#define XPT2046_MOSI 32
#define XPT2046_MISO 39
#define XPT2046_CLK 25
#define XPT2046_CS 33
#define SD_MISO 19
#define SD_MOSI 23
#define SD_SCK 18
#endif
#endif
//// END STUPID CYD STUFF
#endif

View File

@@ -123,7 +123,6 @@ const String PROGMEM version_number = MARAUDER_VERSION;
uint32_t currentTime = 0;
void backlightOn() {
#ifdef HAS_SCREEN
#ifdef MARAUDER_MINI
@@ -166,10 +165,10 @@ void setup()
#endif
backlightOff();
#if BATTERY_ANALOG_ON == 1
#if BATTERY_ANALOG_ON == 1
pinMode(BATTERY_PIN, OUTPUT);
pinMode(CHARGING_PIN, INPUT);
#endif
#endif
// Preset SPI CS pins to avoid bus conflicts
#ifdef HAS_SCREEN
@@ -258,18 +257,9 @@ void setup()
buffer_obj = Buffer();
#if defined(HAS_SD)
// Do some SD stuff
if(sd_obj.initSD()) {
#ifdef HAS_SCREEN
//display_obj.tft.println(F(text_table0[3]));
#endif
} else {
if(!sd_obj.initSD())
Serial.println(F("SD Card NOT Supported"));
#ifdef HAS_SCREEN
//display_obj.tft.setTextColor(TFT_RED, TFT_BLACK);
//display_obj.tft.println(F(text_table0[4]));
//display_obj.tft.setTextColor(TFT_CYAN, TFT_BLACK);
#endif
}
#endif
#ifdef HAS_SCREEN