-
Notifications
You must be signed in to change notification settings - Fork 3
/
ESP8266OTA.cpp
95 lines (85 loc) · 2.63 KB
/
ESP8266OTA.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "ESP8266OTA.h"
ESP8266OTA::ESP8266OTA() {
m_log = "";
}
void ESP8266OTA::Log(String text, bool newLine) {
m_log += text + (newLine ? "\n" : "");
Serial.print(text + (newLine ? "\r\n" : ""));
}
static ESP8266WebServer *webServer;
void ESP8266OTA::Begin(ESP8266WebServer *server) {
m_server = server;
m_log = "";
webServer = server;
// Upload
m_server->on("/ota/firmware.bin", HTTP_POST, [this]() {
m_server->sendHeader("Connection", "close");
m_server->sendHeader("Access-Control-Allow-Origin", "*");
Log("");
Log(Update.hasError() ? "ERROR: OTA update failed" : "OTA update finished");
m_server->send(200, "text/plain", m_log);
delay(1000);
ESP.restart();
}, [this]() {
HTTPUpload &upload = m_server->upload();
if (upload.status == UPLOAD_FILE_START){
m_log = "";
Log("Start receiving '", false);
Log(upload.filename, false);
Log("'");
uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
if (!Update.begin(maxSketchSpace)){
Update.printError(Serial);
Log("ERROR: UPLOAD_FILE_START");
}
}
else if (upload.status == UPLOAD_FILE_WRITE){
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize){
Update.printError(Serial);
Log("ERROR: UPLOAD_FILE_WRITE");
}
}
else if (upload.status == UPLOAD_FILE_END){
if (Update.end(true)) {
Log("Firmware size: ", false);
Log(String(upload.totalSize));
Log("Rebooting ESP8266 ...");
}
else {
Update.printError(Serial);
Log("ERROR: UPLOAD_FILE_END");
}
}
yield();
});
// Pull
static uint lastOtaProgress;
ArduinoOTA.onStart([]() {
lastOtaProgress = 0;
Serial.println("Starting OTA update");
webServer->stop();
});
ArduinoOTA.onEnd([]() {
Serial.println();
Serial.println("OTA update finished");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
if (progress / (total / 100) == lastOtaProgress + 2) {
Serial.print(".");
lastOtaProgress += 2;
}
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.setPort(8266);
ArduinoOTA.begin();
}
void ESP8266OTA::Handle() {
ArduinoOTA.handle();
}