feat(crowpanel-35): add Elecrow CrowPanel 3.5" (ESP32-S3, ILI9488 + GT911) touch target

- New crowpanel_35 variant: display, SD, board and target files, plus board JSON
- Portrait mode is drawn rotated 180°; landscape stays at rotation 3
- Share the GT911 touch driver between Wio Tracker L2 and CrowPanel
  (WioTrackerL2Touch.cpp -> src/helpers/input/LgfxGt911Touch.cpp)
- platformio envs, flasher/site entries, release and merge-bin support
- Tests for the CrowPanel SD codec and merge-bin

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132MkJ7RUV32mV9F7o4PJMm
This commit is contained in:
Michael A. CojocariandClaude Opus 5.5 committed 2026-10-02 20:16:06 -04:00
1 parent f7402e628c
commit dbecef0b6f
29 files changed
+1461 -118

No files matched your search

+11 -3
View File
@@ -3,7 +3,11 @@
#include "DataStore.h"
#include <helpers/AdvertDataHelpers.h> // ADV_TYPE_NONE (blank-record skip in loadContacts)
#if defined(ESP32)
#if defined(HAS_CROWPANEL_35)
#include <CrowPanel35SD.h>
#else
#include <SD.h>
#endif
#include "helpers/esp32/WdtHeavyGuard.h" // suspend core-0 idle WDT during the (SPIFFS-GC-prone) contact write
#endif
#if defined(HAS_TANMATSU) || defined(HAS_TDISPLAY_P4) || defined(HAS_WIO_TRACKER_L2)
@@ -1127,9 +1131,13 @@ bool DataStore::deleteBlobByKey(const uint8_t key[], int key_len) {
// Creates the folders, repoints _fs + the identity store, and sets the path
// prefix so every subsequent read/write/exists/remove lands under /meshcomod.
bool DataStore::useSdStorage() {
if (!SD.exists("/meshcomod")) SD.mkdir("/meshcomod");
if (!SD.exists("/meshcomod/bl")) SD.mkdir("/meshcomod/bl");
if (!SD.exists("/meshcomod/identity")) SD.mkdir("/meshcomod/identity");
static const char* const directories[] = { "/meshcomod", "/meshcomod/bl", "/meshcomod/identity" };
for (const char* path : directories) {
if (!SD.exists(path) && !SD.mkdir(path)) {
Serial.printf("[STORE] SD data directory unavailable: %s\n", path);
return false;
}
}
strncpy(_root, "/meshcomod", sizeof(_root) - 1);
_root[sizeof(_root) - 1] = '\0';
_fs = &SD;