2dc216fb7b
- 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.
88 lines
2.1 KiB
C++
88 lines
2.1 KiB
C++
#pragma once
|
|
#ifdef ESP_PLATFORM
|
|
|
|
#include <Tactility/service/Service.h>
|
|
|
|
#include <Tactility/RecursiveMutex.h>
|
|
|
|
#include <esp_event.h>
|
|
#include <esp_http_server.h>
|
|
#include <Tactility/network/HttpServer.h>
|
|
|
|
namespace tt::service::development {
|
|
|
|
class DevelopmentService final : public Service {
|
|
|
|
RecursiveMutex mutex;
|
|
std::string deviceResponse;
|
|
network::HttpServer httpServer = network::HttpServer(
|
|
6666,
|
|
"0.0.0.0",
|
|
std::vector<httpd_uri_t>{
|
|
{
|
|
.uri = "/info",
|
|
.method = HTTP_GET,
|
|
.handler = handleGetInfo,
|
|
.user_ctx = this
|
|
},
|
|
{
|
|
.uri = "/app/run",
|
|
.method = HTTP_POST,
|
|
.handler = handleAppRun,
|
|
.user_ctx = this
|
|
},
|
|
{
|
|
.uri = "/app/install",
|
|
.method = HTTP_PUT,
|
|
.handler = handleAppInstall,
|
|
.user_ctx = this
|
|
},
|
|
{
|
|
.uri = "/app/uninstall",
|
|
.method = HTTP_PUT,
|
|
.handler = handleAppUninstall,
|
|
.user_ctx = this
|
|
}
|
|
},
|
|
8192
|
|
);
|
|
|
|
void startServer();
|
|
void stopServer();
|
|
|
|
static esp_err_t handleGetInfo(httpd_req_t* request);
|
|
static esp_err_t handleAppRun(httpd_req_t* request);
|
|
static esp_err_t handleAppInstall(httpd_req_t* request);
|
|
static esp_err_t handleAppUninstall(httpd_req_t* request);
|
|
|
|
public:
|
|
|
|
// region Overrides
|
|
|
|
bool onStart(ServiceContext& service) override;
|
|
|
|
void onStop(ServiceContext& service) override;
|
|
|
|
// endregion Overrides
|
|
|
|
// region Internal API
|
|
|
|
/**
|
|
* Enabling the service means that the user is willing to start the web server.
|
|
* @return true when the service is enabled
|
|
*/
|
|
bool isEnabled() const;
|
|
|
|
/**
|
|
* Enabling the service means that the user is willing to start the web server.
|
|
* @param[in] enabled
|
|
*/
|
|
void setEnabled(bool enabled);
|
|
};
|
|
|
|
std::shared_ptr<DevelopmentService> findService();
|
|
|
|
}
|
|
|
|
#endif // ESP_PLATFORM
|