Rename LILYGO_TWATCH_S3_PLUS to MECK_TWATCH as the watch form-factor gate

The macro was doing double duty: gating the 240x240 touch UI (tile grid, lock
screen, VKB, grey palette) and gating the Plus's onboard GNSS. A non-GPS watch
cannot reuse the first without dragging in the second.

  MECK_TWATCH             watch form factor
  LILYGO_TWATCH_S3_PLUS   Plus-only hardware (GNSS on BLDO1, GPIO0 user button)
  MECK_PMU_BUTTON         user button is the AXP2101 PWRON key, not a GPIO

84 sites renamed across 14 files. The WatchMapScreen include, construction and
its three touch handlers now also require HAS_GPS, as does the Maps tile branch
inside the home tile grid.

Behaviour-preserving: the Plus defines both MECK_TWATCH and HAS_GPS=1, so every
new condition evaluates as before. No other board defines MECK_TWATCH.
This commit is contained in:
pelgraine
2026-07-10 18:40:53 +10:00
parent 732cc2e8b2
commit 0fa7a321bf
15 changed files with 93 additions and 87 deletions
+1 -1
View File
@@ -2426,7 +2426,7 @@ void MyMesh::handleCmdFrame(size_t len) {
if (strcmp(sp, "gps") == 0) {
_prefs.gps_enabled = (np[0] == '1') ? 1 : 0;
savePrefs();
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Apply the BLDO1 GPS rail live so the toggle takes effect now, no reboot
if (_prefs.gps_enabled) board.gpsPowerOn(); else board.gpsPowerOff();
#endif
+1 -1
View File
@@ -109,7 +109,7 @@ struct NodePrefs { // persisted to file
// upward → fillRect must start above baseline to cover ascenders.
// T5S3: always 0 (both sizes use baseline fonts with highlight at y).
inline int smallHighlightOff() const {
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
return 0;
#else
// Custom 7pt fonts at textSize 0 use GFXfont (baseline rendering), not built-in.
+23 -21
View File
@@ -709,14 +709,14 @@
// =============================================================================
// Define MECK_TOUCH_ENABLED for any platform with touch support
#if defined(LilyGo_T5S3_EPaper_Pro) || (defined(LilyGo_TDeck_Pro) && defined(HAS_TOUCHSCREEN)) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || (defined(LilyGo_TDeck_Pro) && defined(HAS_TOUCHSCREEN)) || defined(MECK_TWATCH)
#define MECK_TOUCH_ENABLED 1
#endif
// --- T-Watch S3 Plus: screen headers for the touch UI ---
// The watch needs the same concrete screen types as the gesture machine casts
// to, but none of the T5S3/T-Deck hardware baggage (GT911, SD, TCA8418 keyboard).
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
#include "TextReaderScreen.h"
#include "NotesScreen.h"
#include "ContactsScreen.h"
@@ -901,7 +901,7 @@
#define TOUCH_LONG_PRESS_MS 750
#if defined(LilyGo_T5S3_EPaper_Pro)
#define TOUCH_SWIPE_THRESHOLD 60 // T5S3: 960×540 — 60px ≈ 6% of width
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
#define TOUCH_SWIPE_THRESHOLD 16 // Watch: getTouch() returns 0..119 (240px/UI_ZOOM); 16 is ~13% of width
#else
#define TOUCH_SWIPE_THRESHOLD 30 // T-Deck Pro: 240×320 — 30px ≈ 12.5% of width
@@ -939,7 +939,7 @@
}
#elif defined(LilyGo_TDeck_Pro)
return touchInput.getPoint(*outX, *outY);
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
{
// FT6336U is read through the LovyanGFX panel backing the display.
// display.getTouch() returns coordinates already divided by UI_ZOOM.
@@ -964,7 +964,7 @@
#elif defined(LilyGo_TDeck_Pro)
float sx = (float)EINK_WIDTH / 128.0f; // 240/128 = 1.875
float sy = (float)EINK_HEIGHT / 128.0f; // 320/128 = 2.5
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
// display.getTouch() already divides by UI_ZOOM, so px/py span the
// 240/UI_ZOOM logical canvas (0..119 at UI_ZOOM=2). Scale to 128 virtual.
float sx = (240.0f / UI_ZOOM) / 128.0f;
@@ -1058,7 +1058,7 @@ static uint32_t _atoi(const char* sp) {
DataStore store(LittleFS, rtc_clock);
#elif defined(ESP32)
#include <SPIFFS.h>
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
#include <LittleFS.h> // watch: dedicated 'maps' tiles partition
#endif
DataStore store(SPIFFS, rtc_clock);
@@ -1125,7 +1125,7 @@ static uint32_t _atoi(const char* sp) {
/* GLOBAL OBJECTS */
#ifdef DISPLAY_CLASS
#include "UITask.h"
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH) && HAS_GPS
#include "WatchMapScreen.h" // After BLE -- PNGdec headers conflict with BLE if included earlier
#elif HAS_GPS && !defined(LILYGO_TECHO_CARD)
#include "MapScreen.h" // After BLE -- PNGdec headers conflict with BLE if included earlier
@@ -1352,7 +1352,7 @@ static void lastHeardToggleContact() {
return '\r';
}
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH) && HAS_GPS
// Map screen: footer +/- buttons zoom; a tap in the map area recenters on
// GPS. (A top-strip tap is already handled above -> home.)
if (ui_task.isOnMapScreen()) {
@@ -1601,7 +1601,7 @@ static void lastHeardToggleContact() {
// Settings screen: tap to select row, tap same row to activate
if (ui_task.isOnSettingsScreen()) {
SettingsScreen* ss = (SettingsScreen*)ui_task.getSettingsScreen();
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch: while editing the UTC offset, tap the upper half to increment
// and the lower half to decrement. Long-press saves.
if (ss && ss->isEditing() && ss->getCurrentRowType() == ROW_UTC_OFFSET) {
@@ -1625,7 +1625,7 @@ static void lastHeardToggleContact() {
if (ui_task.isOnSMSScreen()) return 0;
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Repeater admin (watch): tap selects a menu row (tap again = activate);
// param entry opens the keyboard for the value.
if (ui_task.isOnRepeaterAdmin()) {
@@ -1660,7 +1660,7 @@ static void lastHeardToggleContact() {
if (ui_task.isOnSMSScreen()) return 0;
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH) && HAS_GPS
// Map screen: swipe pans the viewport (logical-pixel delta)
if (ui_task.isOnMapScreen()) {
WatchMapScreen* wms = (WatchMapScreen*)ui_task.getMapScreen();
@@ -1782,7 +1782,7 @@ static void lastHeardToggleContact() {
return 'q';
}
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch FIRST page: long-press on a coloured tile opens its screen.
// The grid renders in the logical (display.width()) space; touchToVirtual
// yields 128-space coords, so scale them back to render space to hit-test.
@@ -1806,6 +1806,7 @@ static void lastHeardToggleContact() {
if (row == 1 && col == 0) { ui_task.gotoSettingsScreen(); return 0; }
if (row == 1 && col == 1) { ui_task.gotoDiscoveryScreen(); return 0; }
if (row == 2 && col == 0) { ui_task.gotoTraceScreen(); return 0; }
#if HAS_GPS
if (row == 2 && col == 1) {
// Maps: mark the tile FS ready (detectZoomRange in enter() needs it)
// before opening; GPS centre + markers are populated in the main loop.
@@ -1814,6 +1815,7 @@ static void lastHeardToggleContact() {
ui_task.gotoMapScreen();
return 0;
}
#endif
if (row == 3 && col == 0) { ui_task.gotoNotesScreen(); return 0; }
if (row == 3 && col == 1) { ui_task.gotoStepsScreen(); return 0; }
}
@@ -1954,7 +1956,7 @@ static void lastHeardToggleContact() {
}
}
return 0;
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
// Watch: long press = DM (tw-keyboard) / admin / room action.
// purpose ints match TWatchKeyboardScreen::Purpose: DM=1.
{
@@ -2030,14 +2032,14 @@ static void lastHeardToggleContact() {
#if defined(LilyGo_T5S3_EPaper_Pro)
ui_task.showVirtualKeyboard(VKB_ADMIN_PASSWORD, "Admin Password", "", 32);
return 0;
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
ui_task.openTWatchKeyboard(2, 0); // TWKB_ADMIN_PASSWORD
return 0;
#else
return KEY_ENTER; // T-Deck Pro: keyboard handles password entry
#endif
}
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch: keyboard only for param entry; menu/other states activate the
// highlighted item (no raw CLI keyboard).
if (astate == RepeaterAdminScreen::STATE_PARAM_ENTRY) {
@@ -2062,7 +2064,7 @@ static void lastHeardToggleContact() {
if (ui_task.isOnSettingsScreen()) {
SettingsScreen* ss = (SettingsScreen*)ui_task.getSettingsScreen();
if (ss) {
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch: long-press while editing the UTC offset saves the value.
if (ss->isEditing() && ss->getCurrentRowType() == ROW_UTC_OFFSET) {
return '\r';
@@ -2302,7 +2304,7 @@ void setup() {
}
MESH_DEBUG_PRINTLN("setup() - SPIFFS.begin() done");
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Mount the dedicated 'maps' partition as LittleFS (map tiles live here,
// kept separate from the SPIFFS DataStore that holds identity/contacts).
// formatOnFail=true so a freshly flashed (raw) maps partition is formatted
@@ -2787,7 +2789,7 @@ void setup() {
#ifdef PIN_GPS_EN
digitalWrite(PIN_GPS_EN, GPS_EN_ACTIVE);
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
board.gpsPowerOn(); // GPS power is the AXP2101 BLDO1 rail
#endif
#if defined(LilyGo_TDeck_Pro_Max)
@@ -2807,7 +2809,7 @@ void setup() {
#if defined(LilyGo_TDeck_Pro_Max)
board.gpsPowerOff(); // MAX: GPS power is XL9555-routed, not PIN_GPS_EN
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
board.gpsPowerOff(); // GPS power is the AXP2101 BLDO1 rail
#endif
sensors.setSettingValue("gps", "0");
@@ -2985,7 +2987,7 @@ void loop() {
// Map screen: periodically update own GPS position and contact markers
#ifdef DISPLAY_CLASS
#if HAS_GPS && !defined(LILYGO_TECHO_CARD) && !defined(LILYGO_TWATCH_S3_PLUS)
#if HAS_GPS && !defined(LILYGO_TECHO_CARD) && !defined(MECK_TWATCH)
if (ui_task.isOnMapScreen()) {
static unsigned long lastMapUpdate = 0;
if (millis() - lastMapUpdate > 30000) { // Every 30 seconds
@@ -3012,7 +3014,7 @@ void loop() {
#endif
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH) && HAS_GPS
// Watch map screen: on open, centre on GPS and populate contact markers; then
// refresh own position + markers periodically while it stays open.
{
@@ -182,7 +182,7 @@ public:
// Sanitize emoji: replace UTF-8 emoji sequences with single-byte escape codes
// The text already contains "Sender: message" format
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch build: drop emoji entirely instead of storing sprite escape bytes.
// The watch UI has no sprite rendering and no room for emoji at 120x120
// virtual. Non-emoji UTF-8 (accented letters etc.) passes through
@@ -301,7 +301,7 @@ public:
int selCount = getSelectedCount();
snprintf(tmp, sizeof(tmp), "%d Selected [%s]", selCount, filterLabel(_filter));
} else {
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
snprintf(tmp, sizeof(tmp), "Contacts[%s]", filterLabel(_filter));
#else
snprintf(tmp, sizeof(tmp), "Contacts [%s]", filterLabel(_filter));
@@ -470,7 +470,7 @@ public:
display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY);
display.print(right);
}
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.setCursor(0, footerY);
if (!_selectMode) {
display.print("Long Press: Enter");
@@ -103,7 +103,7 @@ public:
display.setColor(DisplayDriver::LIGHT);
display.setCursor(4, 28);
display.print(active ? "Listening for adverts..." : "No nodes found");
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
display.setCursor(4, 38);
display.print("Hold: Rescan");
display.setCursor(4, 48);
@@ -211,7 +211,7 @@ public:
const char* right = "Hold:Rescan";
display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY);
display.print(right);
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.print("Tap:Slct");
const char* right = "Hold:Rescan";
@@ -281,7 +281,7 @@ public:
if (selected) {
display.setColor(DisplayDriver::LIGHT);
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
display.fillRect(0, y, display.width(), lineH);
#else
display.fillRect(0, y + 5, display.width(), lineH);
@@ -383,7 +383,7 @@ public:
const char* right = "Hold:Select";
display.setCursor(display.width() - display.getTextWidth(right) - 2, footerY);
display.print(right);
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.setCursor(0, footerY);
display.print("Tap:Slct");
const char* right = "Hold:Entr";
@@ -595,7 +595,7 @@ public:
// --- Header ---
display.setTextSize(1);
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Clip long lines at the screen edge instead of wrapping them onto the row
// below (restored before returning so other screens are unaffected).
((LGFXDisplay*)&display)->setTextWrap(false);
@@ -644,7 +644,7 @@ public:
#if defined(LilyGo_T5S3_EPaper_Pro)
display.print("Boot:Exit");
renderFooterRight(display, footerY, "Hold:Type");
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.print("Long Press: login");
#else
display.print("Sh+Del:Exit");
@@ -665,7 +665,7 @@ public:
#if defined(LilyGo_T5S3_EPaper_Pro)
display.print("Boot:Exit");
renderFooterMidRight(display, footerY, "Back:Exit", "Tap:Open", "Swipe:Sel");
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.print("Long Press: Select");
#else
display.print("Sh+Del:Exit");
@@ -677,7 +677,7 @@ public:
#if defined(LilyGo_T5S3_EPaper_Pro)
display.print("Boot:Back");
renderFooterMidRight(display, footerY, "Back:Back", "Tap:Run", "Swipe:Sel");
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.print("Long Press: Run");
#else
display.print("Sh+Del:Back");
@@ -689,7 +689,7 @@ public:
#if defined(LilyGo_T5S3_EPaper_Pro)
display.print("Boot:Cancel");
renderFooterRight(display, footerY, "Tap:Send");
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.print("Tap: Enter value");
#else
display.print("Sh+Del:Cancel");
@@ -723,7 +723,7 @@ public:
break;
}
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
((LGFXDisplay*)&display)->setTextWrap(true); // restore default before returning
#endif
@@ -1125,7 +1125,7 @@ private:
void renderResponse(DisplayDriver& display, int y, int bodyHeight) {
display.setTextSize(the_mesh.getNodePrefs()->smallTextSize());
int lineHeight = the_mesh.getNodePrefs()->smallLineH();
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch: clip long response lines at the screen edge instead of wrapping
// them onto the row below.
((LGFXDisplay*)&display)->setTextWrap(false);
@@ -1167,7 +1167,7 @@ private:
}
display.setTextSize(1);
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
((LGFXDisplay*)&display)->setTextWrap(true); // restore default
#endif
}
@@ -499,7 +499,7 @@ private:
addRow(ROW_BACKLIGHT_BRIGHTNESS);
addRow(ROW_KB_BACKLIGHT);
#endif
#if !defined(LILYGO_TWATCH_S3_PLUS)
#if !defined(MECK_TWATCH)
addRow(ROW_MSG_NOTIFY);
#endif
#if HAS_GPS
@@ -507,10 +507,10 @@ private:
#endif
addRow(ROW_PATH_HASH_SIZE);
addRow(ROW_DEFAULT_SCOPE);
#if !defined(LILYGO_TWATCH_S3_PLUS)
#if !defined(MECK_TWATCH)
addRow(ROW_DARK_MODE);
#endif
#if !defined(LILYGO_TECHO_LITE) && !defined(LILYGO_TWATCH_S3_PLUS)
#if !defined(LILYGO_TECHO_LITE) && !defined(MECK_TWATCH)
addRow(ROW_LARGE_FONT);
addRow(ROW_FONT_STYLE);
#endif
@@ -2940,13 +2940,13 @@ public:
} else if (_subScreen != SUB_NONE) {
display.print("Sh+Del:Back");
} else {
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
display.print("Hold:Edit");
#else
display.print("Sh+Del:Bk");
#endif
}
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
const char* r = (_subScreen == SUB_NONE) ? "Tap:Cycle" : "Tap/Ent:Edit";
#else
const char* r = "Tap/Ent:Edit";
+30 -30
View File
@@ -16,7 +16,7 @@
#ifdef MECK_WEB_READER
#include "WebReaderScreen.h"
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH) && HAS_GPS
#include "WatchMapScreen.h"
#elif HAS_GPS && !defined(LILYGO_TECHO_CARD)
#include "MapScreen.h"
@@ -25,7 +25,7 @@
#if defined(LilyGo_TDeck_Pro_Max)
#include "DRV2605Haptic.h" // haptic motor for "Buzzer (vibrate)" channels
#endif
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_AUDIO_VARIANT) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_AUDIO_VARIANT) || defined(MECK_TWATCH)
#include "HomeIcons.h"
#endif
#if defined(WIFI_SSID) || defined(MECK_WIFI_COMPANION)
@@ -136,7 +136,7 @@ public:
// version info
display.setColor(DisplayDriver::LIGHT);
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
display.setTextSize(1); // 240x240: size 2 overflows the 120px virtual width and wraps
#else
display.setTextSize(2);
@@ -377,7 +377,7 @@ public:
int render(DisplayDriver& display) override {
char tmp[80];
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
_task->setHomeShowingTiles(false); // Reset — only set true on FIRST page
#endif
@@ -412,13 +412,13 @@ public:
#define HOME_HDR_Y 1
#elif defined(LILYGO_TECHO_LITE)
#define HOME_HDR_Y 0
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
#define HOME_HDR_Y 1
#else
#define HOME_HDR_Y -3
#endif
display.setCursor(0, HOME_HDR_Y);
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch: render the name in a very small font so long names fit beside the
// centred clock instead of overrunning it. Colour was set above (GREEN).
((LGFXDisplay*)&display)->printSmallFont(0, HOME_HDR_Y, filtered_name);
@@ -435,12 +435,12 @@ public:
// alarm enabled indicator (AL icon, left of audio or battery)
renderAlarmIndicator(display, battLeftX);
#elif !defined(LILYGO_TWATCH_S3_PLUS)
#elif !defined(MECK_TWATCH)
renderBatteryIndicator(display, _task->getBattMilliVolts());
#endif
// centered clock — only show when time is valid
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch: right-aligned header cluster, right to left -- battery %, unread
// count, then clock, all in the tiny node-name font. Battery % is
// colour-coded by charge level.
@@ -522,7 +522,7 @@ public:
int y = 13; // Below header
#elif defined(LilyGo_T5S3_EPaper_Pro)
int y = 14; // Closer to header
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
int y = (_page == HomePage::FIRST) ? 9 : 18; // first page: tuck up under the header
#else
int y = 14;
@@ -537,7 +537,7 @@ public:
}
if (_page == HomePage::FIRST) {
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
_task->setHomeShowingTiles(true);
#endif
#if defined(LilyGo_T5S3_EPaper_Pro)
@@ -548,12 +548,12 @@ public:
#endif
#elif defined(LILYGO_TECHO_LITE)
int y = 18; // Below page dots
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
int y = 12; // 4-row grid starts just below the dots
#else
int y = 20;
#endif
#if !defined(LILYGO_TWATCH_S3_PLUS)
#if !defined(MECK_TWATCH)
display.setColor(DisplayDriver::YELLOW);
display.setTextSize(2);
sprintf(tmp, "MSG: %d", _task->getUnreadMsgCount());
@@ -563,7 +563,7 @@ public:
y += 12; // Compact
#elif defined(LilyGo_TDeck_Pro_Max)
y += 10; // MAX: pull < Connected > up under MSG to make room for [T] Phone
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
// watch: no MSG banner gap -- the 4-row grid sits just under the dots
#else
y += 14; // Reduced from 18
@@ -677,7 +677,7 @@ public:
}
display.setTextSize(1);
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
// ----- T-Watch S3 Plus: P4-style coloured tile grid (3x2) -----
// Border colours approximate the Meck P4 home palette (RGB565): a white
// icon + label on a dark navy fill, each tile a distinct bright border.
@@ -905,7 +905,7 @@ public:
#if defined(LilyGo_T5S3_EPaper_Pro)
display.drawTextCentered(display.width() / 2, display.height() - 24,
"Tap here for full Last Heard list");
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.drawTextCentered(display.width() / 2, display.height() - 24,
"Long Press: Full Last Heard List");
#else
@@ -966,7 +966,7 @@ public:
display.setTextSize(1);
#if defined(LilyGo_T5S3_EPaper_Pro)
display.drawTextCentered(display.width() / 2, 80, "toggle: " PRESS_LABEL);
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.drawTextCentered(display.width() / 2, 68, "toggle: " PRESS_LABEL);
#else
display.drawTextCentered(display.width() / 2, 68, "toggle: " PRESS_LABEL);
@@ -1021,7 +1021,7 @@ public:
#endif
#if defined(LilyGo_T5S3_EPaper_Pro)
display.drawTextCentered(display.width() / 2, 64, "advert: " PRESS_LABEL);
#elif defined(LILYGO_TWATCH_S3_PLUS)
#elif defined(MECK_TWATCH)
display.drawTextCentered(display.width() / 2, 57, "advert: " PRESS_LABEL);
#else
display.drawTextCentered(display.width() / 2, 57, "advert: " PRESS_LABEL);
@@ -1427,7 +1427,7 @@ public:
// T5S3: Long press boot button to lock/unlock. Touch disabled while locked.
// T-Deck Pro: Double-press boot button to lock/unlock. Touch+keyboard disabled.
// ==========================================================================
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch lock/clock screen: big HH:MM plus a day+date line, shown when the
// display is woken (by raise-to-wake or a tap) after the idle timeout.
class ClockScreen : public UIScreen {
@@ -1599,7 +1599,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
_sensors = sensors;
_auto_off = millis() + AUTO_OFF_MILLIS;
#if defined(PIN_USER_BTN)
#if defined(PIN_USER_BTN) || defined(MECK_PMU_BUTTON)
user_btn.begin();
#endif
#if defined(PIN_USER_BTN_ANA)
@@ -1689,7 +1689,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro)
lock_screen = new LockScreen(this, &rtc_clock, node_prefs);
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
lock_screen = new ClockScreen(this, &rtc_clock, node_prefs);
steps_screen = new StepsScreen(this);
#endif
@@ -1708,7 +1708,7 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
#ifdef HAS_4G_MODEM
sms_screen = new SMSScreen(this, node_prefs);
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH) && HAS_GPS
map_screen = new WatchMapScreen(this);
#elif HAS_GPS && !defined(LILYGO_TECHO_CARD)
map_screen = new MapScreen(this);
@@ -2006,7 +2006,7 @@ void UITask::newMsg(uint8_t path_len, const char* from_name, const char* text, i
}
if (_display != NULL && !suppressNotif) {
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Watch: a new message must not wake the screen. The unread counter has
// already been incremented above; leave the display asleep so the count
// is only seen on the next tilt-wake to the clock screen. Only refresh
@@ -2183,7 +2183,7 @@ void UITask::shutdown(bool restart){
}
bool UITask::isButtonPressed() const {
#ifdef PIN_USER_BTN
#if defined(PIN_USER_BTN) || defined(MECK_PMU_BUTTON)
return user_btn.isPressed();
#else
return false;
@@ -2192,7 +2192,7 @@ bool UITask::isButtonPressed() const {
void UITask::loop() {
char c = 0;
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// TEMP power-debug probe: every 60s, log display state + board power stats.
{
static unsigned long _pwr_dbg_next = 0;
@@ -2206,7 +2206,7 @@ void UITask::loop() {
}
}
#endif
#if defined(PIN_USER_BTN)
#if defined(PIN_USER_BTN) || defined(MECK_PMU_BUTTON)
int ev = user_btn.check();
if (ev == BUTTON_EVENT_CLICK) {
#if defined(LilyGo_T5S3_EPaper_Pro)
@@ -2649,7 +2649,7 @@ if (curr) curr->poll();
}
#endif
}
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Raise-to-wake: a wrist-raise (BMA423 tilt) while the display is off turns
// it back on showing the clock screen and restarts the idle timer.
if (_display != NULL && !_display->isOn() && board.tiltFired()) {
@@ -3183,7 +3183,7 @@ void UITask::toggleGPS() {
#if defined(LilyGo_TDeck_Pro_Max)
board.gpsPowerOff(); // MAX: GPS power is XL9555-routed, not PIN_GPS_EN
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
board.gpsPowerOff(); // Watch: GPS power is the AXP2101 BLDO1 rail
#endif
notify(UIEventType::ack);
@@ -3197,7 +3197,7 @@ void UITask::toggleGPS() {
#if defined(LilyGo_TDeck_Pro_Max)
board.gpsPowerOn(); // MAX: GPS power is XL9555-routed, not PIN_GPS_EN
#endif
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
board.gpsPowerOn(); // Watch: GPS power is the AXP2101 BLDO1 rail
#endif
notify(UIEventType::ack);
@@ -3656,7 +3656,7 @@ void UITask::gotoTraceScreen() {
_next_refresh = 100;
}
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
uint32_t UITask::getTodaySteps() {
uint32_t raw = board.getStepCount();
return (raw >= _stepBaseline) ? (raw - _stepBaseline) : raw;
@@ -3742,7 +3742,7 @@ void UITask::gotoWebReader() {
#if HAS_GPS
void UITask::gotoMapScreen() {
if (!map_screen) return; // Not available on this platform (T-Echo Card)
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
WatchMapScreen* map = (WatchMapScreen*)map_screen;
if (_display != NULL) {
map->enter(*_display);
+8 -8
View File
@@ -34,7 +34,7 @@
#include "AlarmScreen.h"
#endif
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
#include "VirtualKeyboard.h"
#endif
@@ -117,9 +117,9 @@ class UITask : public AbstractUITask {
UIScreen* curr;
bool _homeShowingTiles = false; // Set by HomeScreen render when tile grid is visible
int _tileGridVY = 44; // Virtual Y of tile grid top (updated each render)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
UIScreen* lock_screen; // Lock screen (big clock + battery + unread)
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
UIScreen* steps_screen; // Steps screen (big daily step count)
int32_t _lastStepDay = 0; // local day-of-epoch, for the midnight step reset
uint32_t _stepBaseline = 0; // raw step count at the start of the local day
@@ -225,7 +225,7 @@ public:
void gotoGamesMenu(); // Navigate to games launcher menu
void gotoSnakeScreen(); // Navigate to snake game
void gotoMinesweeperScreen(); // Navigate to minesweeper game
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
void gotoStepsScreen(); // Navigate to the step counter screen
uint32_t getTodaySteps(); // Daily step count (raw - baseline)
#endif
@@ -290,17 +290,17 @@ public:
bool isOnTraceScreen() const { return curr == trace_screen; }
bool isOnGamesMenu() const { return curr == games_menu_screen; }
bool isOnSnakeScreen() const { return curr == snake_screen; }
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
bool isOnStepsScreen() const { return curr == steps_screen; }
#endif
bool isOnMinesweeperScreen() const { return curr == minesweeper_screen; }
bool isOnMapScreen() const { return curr == map_screen; }
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LilyGo_TDeck_Pro) || defined(MECK_TWATCH)
bool isLocked() const { return _locked; }
void lockScreen();
void unlockScreen();
#endif
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
bool isVKBActive() const { return _vkbActive; }
unsigned long vkbOpenedAt() const { return _vkbOpenedAt; }
VirtualKeyboard& getVKB() { return _vkb; }
@@ -382,7 +382,7 @@ public:
UIScreen* getTraceScreen() const { return trace_screen; }
UIScreen* getGamesMenuScreen() const { return games_menu_screen; }
UIScreen* getSnakeScreen() const { return snake_screen; }
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
UIScreen* getStepsScreen() const { return steps_screen; }
#endif
UIScreen* getMinesweeperScreen() const { return minesweeper_screen; }
@@ -12,7 +12,7 @@
// if (keyboard.status() == VKB_SUBMITTED) { ... keyboard.getText() ... }
// =============================================================================
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(LILYGO_TWATCH_S3_PLUS)
#if defined(LilyGo_T5S3_EPaper_Pro) || defined(MECK_TWATCH)
#ifndef VIRTUAL_KEYBOARD_H
#define VIRTUAL_KEYBOARD_H
@@ -536,4 +536,4 @@ private:
};
#endif // VIRTUAL_KEYBOARD_H
#endif // LilyGo_T5S3_EPaper_Pro || LILYGO_TWATCH_S3_PLUS
#endif // LilyGo_T5S3_EPaper_Pro || MECK_TWATCH
+3 -3
View File
@@ -56,14 +56,14 @@ void LGFXDisplay::setColor(Color c) {
_color = TFT_WHITE;
break;
case RED:
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
_color = 0x7BEF; // dark grey -- the watch UI uses a grey/white/black palette
#else
_color = TFT_RED;
#endif
break;
case GREEN:
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
_color = 0xC618; // light grey
#else
_color = TFT_GREEN;
@@ -73,7 +73,7 @@ void LGFXDisplay::setColor(Color c) {
_color = TFT_BLUE;
break;
case YELLOW:
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
_color = TFT_WHITE;
#else
_color = TFT_YELLOW;
+1 -1
View File
@@ -28,7 +28,7 @@ public:
void startFrame(Color bkg = DARK) override;
void setTextSize(int sz) override;
void setColor(Color c) override;
#if defined(LILYGO_TWATCH_S3_PLUS)
#if defined(MECK_TWATCH)
// Set an exact RGB565 colour, bypassing the Color enum + watch grey remap.
// Used by the watch P4-style tile grid for per-tile border/fill colours.
void setRawColor(uint16_t c) { _color = c; buffer.setTextColor(c); }
@@ -11,6 +11,10 @@ build_flags =
${esp32_base.build_flags}
${sensor_base.build_flags}
-I variants/lilygo_twatch_s3_plus
; MECK_TWATCH gates the watch form factor (240x240, UI_ZOOM=2, touch, lock
; screen, tile grid, grey palette). LILYGO_TWATCH_S3_PLUS gates hardware that
; is specific to the Plus (onboard GNSS on BLDO1, GPIO0 user button).
-D MECK_TWATCH
-D LILYGO_TWATCH_S3_PLUS
-D TWATCH_COMPOSE_ENABLED
-D MECK_RX_DUTY_CYCLE