added support for ota and ntp

This commit is contained in:
Dan Priece
2026-05-19 10:37:51 -04:00
parent a29d0c5cfc
commit 2c5f532717
4 changed files with 138 additions and 26 deletions
+91 -1
View File
@@ -73,6 +73,26 @@ void ChronoWebServer::_handleRoot() {
.then(data => console.log(data))\
.catch(error => console.error('Error:', error));\
}\
function doOta(){\
const fileInput = document.getElementById('otaFile');\
if (!fileInput.files.length) {\
alert('Please select a firmware file');\
return;\
}\
const formData = new FormData();\
formData.append('otaFile', fileInput.files[0]);\
fetch('/ota', {\
method: 'POST',\
body: formData\
})\
.then(response => response.text())\
.then(data => {\
console.log(data);\
alert('OTA update in progress... Device will restart.');\
window.location.href = '/';\
})\
.catch(error => console.error('Error:', error));\
}\
document.addEventListener('DOMContentLoaded', function() {\
const rows = document.querySelectorAll('.clickable-row');\
rows.forEach(row => {\
@@ -114,6 +134,12 @@ void ChronoWebServer::_handleRoot() {
<button onclick='reset()'>Reset</button>\
<button onclick='format()'>Format</button>\
<button onclick='toggleTestMode()'>Toggle Test Mode</button>\
<button onclick='doOta()'>OTA Update</button>\
</div>\
<div style='margin-top:20px; padding: 10px; border: 1px solid #999;'>\
<h3>OTA Firmware Update</h3>\
<input type='file' id='otaFile' accept='.bin,.bin'></input>\
<p style='font-size: 12px; color: #666;'>Select a .bin firmware file to update over-the-air</p>\
</div>\
<div style='margin-top:100px; position:relative;'>\
<h3>Gun Profiles</h3>\
@@ -430,10 +456,73 @@ void ChronoWebServer::setTestModeCallback(void (*pFunc)()){
testModeCallback=pFunc;
}
void ChronoWebServer::_handleTestMode(){
Serial.println("toggling test mode....");
Serial.println("toggling test mode....");
testModeCallback();
_server.send(200, "text/html", "ok");
}
void ChronoWebServer::_handleOta(){
HTTPMethod method = _server.method();
if (method == HTTP_GET) {
// Serve OTA update page
String temp = "<html>\
<head>\
<title>OTA Firmware Update</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>OTA Firmware Update</h1>\
<p>Select a .bin firmware file to update over-the-air.</p>\
<form method='POST' action='/ota' enctype='multipart/form-data'>\
<div>\
<h3>Firmware File</h3>\
<input type='file' name='otaFile' accept='.bin'></input>\
</div>\
<div style='margin-top: 20px;'>\
<button type='submit'>Upload</button>\
</div>\
</form>\
</body>\
</html>";
_server.send(200, "text/html", temp);
}
else if (method == HTTP_POST) {
// Handle firmware upload
HTTPUpload& upload = _server.upload();
if (upload.status == UPLOAD_FILE_START) {
Serial.println("OTA: Starting update...");
// Initialize update with the size of the uploaded file
if (!Update.begin(upload.totalSize)) {
Serial.println("OTA: Error: Not enough space");
_server.send(500, "text/plain", "Not enough space");
return;
}
}
else if (upload.status == UPLOAD_FILE_WRITE) {
// Write received firmware to flash
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
Serial.println("OTA: Error: Write failed");
_server.send(500, "text/plain", "Write failed");
return;
}
}
else if (upload.status == UPLOAD_FILE_END) {
// End of upload
if (Update.end(true)) {
Serial.printf("OTA: Update complete: %u bytes\n", upload.totalSize);
_server.send(200, "text/html", "<h1>OTA Update Successful!<br>Restarting...</h1>");
delay(1000);
ESP.restart();
} else {
Serial.println("OTA: Error: Update end failed");
_server.send(500, "text/plain", "Update failed");
}
}
}
}
void ChronoWebServer::init(){
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
@@ -463,6 +552,7 @@ void ChronoWebServer::init(){
_server.on("/reset", _handleReset);
_server.on("/format", _handleFormat);
_server.on("/testmode", _handleTestMode);
_server.on("/ota", _handleOta);
_server.on("/", _handleRoot);
_server.begin();
}