diff --git a/platformio.ini b/platformio.ini
index baf69d1..fc5fbd8 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -8,6 +8,9 @@
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
+[platformio]
+inc_dir = src/espcpputils
+
[common_env_data]
platform = espressif32
board = esp32dev
@@ -96,7 +99,7 @@ platform = ${common_env_data.platform}
board = ${common_env_data.board}
framework = ${common_env_data.framework}
platform_packages = ${common_env_data.platform_packages}
-board_build.partitions = partitions_4M_noota.csv
+board_build.partitions = partitions_4M_ota.csv
lib_deps =
${common_env_data.lib_deps}
${webserver_common.lib_deps}
@@ -130,7 +133,8 @@ build_flags =
-DDEVICE_PREFIX=bobbyquad
-DAP_PASSWORD=Passwort_123
${webserver_common.build_flags}
-; -DFEATURE_OTA
+ -DFEATURE_ARDUINOOTA
+; -DFEATURE_WEBOTA
-DFEATURE_DPAD_5WIRESW
-DPINS_DPAD_5WIRESW_OUT=32
-DPINS_DPAD_5WIRESW_IN1=25
@@ -150,8 +154,8 @@ build_flags =
-DDEFAULT_GASMAX=3700
-DDEFAULT_BREMSMIN=1300
-DDEFAULT_BREMSMAX=4000
- -DFEATURE_BLUETOOTH
- -DFEATURE_BMS
+; -DFEATURE_BLUETOOTH
+; -DFEATURE_BMS
; -DFEATURE_GAMETRAK
; -DPINS_GAMETRAKX=34
; -DPINS_GAMETRAKY=39
@@ -212,7 +216,7 @@ build_flags =
-DDEVICE_PREFIX=bobbycar
-DAP_PASSWORD=Passwort_123
${webserver_common.build_flags}
- -DFEATURE_OTA
+ -DFEATURE_ARDUINOOTA
-DDEFAULT_GASMIN=400
-DDEFAULT_GASMAX=2000
-DDEFAULT_BREMSMIN=600
@@ -276,7 +280,7 @@ build_flags =
-DDEVICE_PREFIX=bobbyquad
-DAP_PASSWORD=Passwort_123
${webserver_common.build_flags}
- -DFEATURE_OTA
+ -DFEATURE_ARDUINOOTA
-DFEATURE_DPAD
-DPINS_DPAD_UP=32
-DPINS_DPAD_DOWN=22
@@ -310,7 +314,7 @@ build_flags =
-DDEVICE_PREFIX=bobbyquad
-DAP_PASSWORD=Passwort_123
${webserver_common.build_flags}
- -DFEATURE_OTA
+ -DFEATURE_ARDUINOOTA
-DRPI_DISPLAY_TYPE
-DR61581_DRIVER
; TODO: TFT_MISO (touch MISO?)
@@ -359,7 +363,7 @@ build_flags =
-DDEVICE_PREFIX=bobbycar
-DAP_PASSWORD=Passwort_123
${webserver_common.build_flags}
- -DFEATURE_OTA
+ -DFEATURE_ARDUINOOTA
-DDEFAULT_GASMIN=1000
-DDEFAULT_GASMAX=4000
-DDEFAULT_BREMSMIN=200
diff --git a/src/bobby_webserver.h b/src/bobby_webserver.h
index e07e473..addbbac 100644
--- a/src/bobby_webserver.h
+++ b/src/bobby_webserver.h
@@ -8,11 +8,15 @@
#include "textinterface.h"
#include "menudisplay.h"
#include "changevaluedisplay.h"
+#include "displays/updatedisplay.h"
+//#include "esputils.h"
namespace {
#ifdef FEATURE_WEBSERVER
AsyncWebServer webServer{80};
+bool shouldReboot;
+
class HtmlTag {
public:
HtmlTag(const char *tagName, AsyncResponseStream *response) :
@@ -34,6 +38,8 @@ private:
void initWebserver()
{
+ shouldReboot = false;
+
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
@@ -184,7 +190,7 @@ void initWebserver()
return;
}
- if (index < 0 || index >= menuDisplay->size())
+ if (index < 0 || index >= menuDisplay->menuItemCount())
{
request->send(400, "text/plain", "index out of range");
return;
@@ -235,11 +241,111 @@ void initWebserver()
request->send(response);
});
+
+#ifdef FEATURE_WEBOTA
+ webServer.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
+ request->send(200, "text/html",
+ "
"
+ "");
+ });
+
+ const auto handleUpdate = [](AsyncWebServerRequest *request){
+ shouldReboot = !Update.hasError();
+
+ AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", shouldReboot ? "OK" : "FAIL");
+ response->addHeader("Connection", "close");
+ request->send(response);
+ };
+
+ const auto createHandleUpdtateUpload = [](size_t size, int command){
+ return [size, command](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
+ //ESP_UNUSED(request)
+
+ Serial.printf("callback %u %u\r\n", index, len);
+
+ if (!index)
+ {
+ Serial.printf("Update Start: %s\r\n", filename.c_str());
+ //Update.runAsync(true);
+ if (!Update.begin(size, command))
+ Update.printError(Serial);
+
+ String type;
+ if (ArduinoOTA.getCommand() == U_FLASH)
+ type = "sketch";
+ else if (ArduinoOTA.getCommand() == U_SPIFFS) // U_SPIFFS
+ type = "filesystem";
+ else
+ type = "unknown";
+
+ switchScreenImpl("Updating " + type);
+ }
+
+ if (!Update.hasError())
+ {
+ if (Update.write(data, len) == len)
+ {
+ ((UpdateDisplay*)currentDisplay.get())->m_progress = index;
+ ((UpdateDisplay*)currentDisplay.get())->m_total = size;
+ ((UpdateDisplay*)currentDisplay.get())->redraw();
+ }
+ else
+ {
+ Update.printError(Serial);
+
+ ((UpdateDisplay*)currentDisplay.get())->m_error = {};
+ ((UpdateDisplay*)currentDisplay.get())->m_errorValid = true;
+ ((UpdateDisplay*)currentDisplay.get())->redraw();
+ }
+ }
+ else
+ {
+ ((UpdateDisplay*)currentDisplay.get())->m_error = {};
+ ((UpdateDisplay*)currentDisplay.get())->m_errorValid = true;
+ ((UpdateDisplay*)currentDisplay.get())->redraw();
+ }
+
+ if (final)
+ {
+ if (Update.end(true))
+ {
+ Serial.printf("Update Success: %uB\r\n", index + len);
+
+ ((UpdateDisplay*)currentDisplay.get())->m_finished = true;
+ ((UpdateDisplay*)currentDisplay.get())->redraw();
+ }
+ else
+ {
+ Update.printError(Serial);
+
+ ((UpdateDisplay*)currentDisplay.get())->m_error = {};
+ ((UpdateDisplay*)currentDisplay.get())->m_errorValid = true;
+ ((UpdateDisplay*)currentDisplay.get())->redraw();
+ }
+ }
+ };
+ };
+
+ webServer.on("/updateCode", HTTP_POST, handleUpdate, createHandleUpdtateUpload((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000, U_FLASH));
+ webServer.on("/updateData", HTTP_POST, handleUpdate, createHandleUpdtateUpload(UPDATE_SIZE_UNKNOWN, U_SPIFFS));
+#endif
+
webServer.begin();
}
void handleWebserver()
{
+ if (shouldReboot)
+ {
+ shouldReboot = false;
+ ESP.restart();
+ }
}
#endif
}
diff --git a/src/changevaluedisplay_bluetoothmode.h b/src/changevaluedisplay_bluetoothmode.h
index b6220f7..ac27a31 100644
--- a/src/changevaluedisplay_bluetoothmode.h
+++ b/src/changevaluedisplay_bluetoothmode.h
@@ -22,66 +22,30 @@ class ChangeValueDisplay :
using Base = MenuDisplay;
public:
+ ChangeValueDisplay();
+
void start() override;
-
- std::size_t size() const override { return 4; }
-
- MenuItem& getMenuItem(std::size_t index) override
- {
- switch (index)
- {
- case 0: return m_offAction;
- case 1: return m_masterAction;
- case 2: return m_slaveAction;
- case 3: return m_backItem;
- }
-
- throw "aua";
- }
- const MenuItem& getMenuItem(std::size_t index) const override
- {
- switch (index)
- {
- case 0: return m_offAction;
- case 1: return m_masterAction;
- case 2: return m_slaveAction;
- case 3: return m_backItem;
- }
-
- throw "aua";
- }
-
- void runForEveryMenuItem(std::function &&callback) override
- {
- callback(m_offAction);
- callback(m_masterAction);
- callback(m_slaveAction);
- callback(m_backItem);
- }
- void runForEveryMenuItem(std::function &&callback) const override
- {
- callback(m_offAction);
- callback(m_masterAction);
- callback(m_slaveAction);
- callback(m_backItem);
- }
-
-private:
- makeComponentArgs