New variant variants/m5stack_cardputer_adv for the Cardputer-Adv (ESP32-S3, 8 MB) with the Cap LoRa-1262 (SX1262 + GNSS): - Envs: companion_radio_ble, companion_radio_usb, repeater, room_server. - Board: enables the Cap's antenna path via the PI4IOE5V6408 on the internal I2C bus (Wire1, G8/G9); Wire stays on the Grove port. LoRa and microSD share FSPI because the display owns SPI3. TCXO 1.8 V. - Companion UI adapted from MultiMote/meshcore-cardputer-adv (MIT, LICENSE.MultiMote), running on the standard companion so the USB terminal CLI stays available. Contacts/identity stay in internal SPIFFS; the microSD card is optional (chat history, keyboard layouts). - Sticky Shift, one-shot Fn with Fn+letter shortcuts, top button (G0) sends a flood advert, brightness control. - Text size setting (Normal/Large/Extra large) with DejaVu Sans fonts generated by tools/gen_vlw_font.py; layouts derive from the font size. - Power save maps to the companion's powersaving pref; the UI vetoes light sleep while the screen is on. Low-battery power-off at 3.4 V. - win_long_cmdline.py: Windows-only -iprefix include shortening so the ESP32 compile command stays under the 32,767-character limit. Shared companion changes are guarded by CARDPUTER_ADV_UI: main.cpp selects CardputerDataStore/CardputerUITask/CardputerMesh, and MyMesh.h maps the_mesh to the subclass like the PSRAM storage path does. Tested on hardware (910.525 MHz mesh): radio RX/TX, USB CLI, BLE, UI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
927 B
C++
44 lines
927 B
C++
#include <cctype>
|
|
|
|
class Helpers {
|
|
public:
|
|
static bool containsIgnoreCase(const char *str, const char *search) {
|
|
if (*search == '\0') {
|
|
return true;
|
|
}
|
|
|
|
for (; *str != '\0'; ++str) {
|
|
const char *s1 = str;
|
|
const char *s2 = search;
|
|
|
|
while (*s1 && *s2 &&
|
|
std::tolower(static_cast<unsigned char>(*s1)) == std::tolower(static_cast<unsigned char>(*s2))) {
|
|
++s1;
|
|
++s2;
|
|
}
|
|
|
|
if (*s2 == '\0') {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// In case if input has utf-8 multibyte characters
|
|
static void removeLastStringChar(String &str) {
|
|
unsigned int len = str.length();
|
|
if (len == 0) {
|
|
return;
|
|
}
|
|
|
|
unsigned int bytesToRemove = 1;
|
|
|
|
while (len - bytesToRemove > 0 && ((uint8_t)str.charAt(len - bytesToRemove) & 0xC0) == 0x80) {
|
|
bytesToRemove++;
|
|
}
|
|
|
|
str.remove(len - bytesToRemove, bytesToRemove);
|
|
}
|
|
};
|