- McpSettings was hardcoded to /data/service/mcp/settings.properties,
but ES3C28P uses storage.userDataLocation=SD so user data lives on
/sdcard/tactility/. Settings appeared to save but on reload returned
default false -> "enable and when I go back shows disabled".
Fixed to use getUserDataPath()+"/settings/mcp.properties" pattern
consistent with DisplaySettings/WebServerSettings, with
findOrCreateParentDirectory() and isFile() guard.
- HttpServer ctrl_port collision: ESP-IDF default 32768 used by both
WebServer (80) and DevelopmentService (6666). Second httpd_start()
failed silently -> dashboard up but /api/mcp 404 and :6666 refused.
Fixed with unique ctrl_port = 32768 + (port % 1000).
Added CONFIG_HTTPD_MAX_URI_HANDLERS=20 (default 8 < 9 needed for
7 handlers + 2 internal).
- DevService stack 5120 -> 8192 for /app/install handling.
- McpSystem video stream task stack 4096 -> 8192 and idle yield 50ms
(was 5ms always) to avoid CPU starvation blocking httpd tasks.
On RLCD, timer must always run: DisplayIdle early return on
!supportsBacklightDuty() broke MCP manual activation (cachedSettings
not loaded, backlight duty 0). Fixed to always load settings +
start timer, log RLCD detection, guard setBacklightDuty with
supportsBacklightDuty() and fallback duty 255.
- DisplaySettings: add disableScreensaverWhenCharging bool, persisted,
with UI toggle in Display app (Settings->Display) using
PowerDevice::IsCharging check via findDevices callback.
When charging and flag enabled, screensaver activation skipped,
and if already dimmed, wake on charging.
- ES3C28P Power driver: GPIO9 ADC1_CH8 2x divider 2500-4200mV spec from
~/Downloads official docs, TP4054 CHRG not connected to GPIO, so
IsCharging inferred via voltage thresholds (<500mV no battery USB
or >5000mV wall powered, >=4150mV high) + rising trend.
Verified: flashed es3c28p to /dev/cu.usbmodem101 (192.168.68.113),
WiFi FamReynaMesh RSSI -59, dashboard 200, :6666/info now works,
/api/mcp returns disabled correctly until enabled, persists to SD.
- Disable BlueTooth driver by default, to ensure it doesn't allocate memory
- Update BlueTooth settings app behaviour to make sure it starts/stops the devices
- Disable SPI RAM usage for ST7789 as it broke App Hub
- Reduce T-Display and T-Deck display buffers from 1/3rd to 1/10th of resolution
- Enabled dynamic buffers for MbedTLS to optimize memory
- TLS 1.3 did not work with dynamic buffers: downgrade to 1.2 for now
- WiFi is now enabled from the Boot app callback to the WiFi service, instead of the WiFi service start() function. This avoids a lockup when WiFi is started by the service while the Boot app is updating the WiFi settings.
**New Features**
* Runtime font accessors and new symbol fonts for text, launcher, statusbar, and shared icons.
* Added font height base setting to device.properties
* Text fonts now have 3 sizes: small, default, large
**Improvements**
* Renamed `UiScale` to `UiDensity`
* Statusbar, toolbar and many UI components now compute heights and spacing from fonts/density.
* SSD1306 initialization sequence refined for more stable startup.
* Multiple image assets replaced by symbol-font rendering.
* Many layout improvements related to density, font scaling and icon scaling
* Updated folder name capitalization for newer style
- `TT_LOG_*` macros are replaced by `Logger` via `#include<Tactility/Logger.h>`
- Changed default timezone to Europe/Amsterdam
- Fix for logic bug in unPhone hardware
- Fix for init/deinit in DRV2605 driver
- Other fixes
- Removed optimization that broke unPhone (disabled the moving of heap-related functions to flash)
- Fix for `sdkconfig` generation: the keys that contained the MCU type in its name weren't properly upper-cased.
- Moved WiFi configuration property files to the user data path of the app instead of a fixed location.
- Moved more properties from `device.py` to `sdkconfig/default.properties`
- Fix for `device.cmake` device id parsing: separate basic property parsing from device id validation
- Created internal `tt::service::wifi::findServiceContext()`
- Changed Wi-Fi service id to lowercase (will change it for other services later)