Skip to content

Commit 291ee03

Browse files
committed
Added OTA updates
1 parent f0ab702 commit 291ee03

File tree

5 files changed

+197
-0
lines changed

5 files changed

+197
-0
lines changed

lib/LEDController/LEDController.cpp

+76
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,79 @@ void LEDController::turnOffAll() {
123123
digitalWrite(rightSymbolPin, state);
124124
}
125125

126+
void LEDController::showUpdateUploading() {
127+
// pattern like loading
128+
unsigned long currentMillis = millis();
129+
static unsigned long previousMillis = 0;
130+
static int state = LOW;
131+
static int ledIndex = 0;
132+
digitalWrite(leftDrumPin, LOW);
133+
digitalWrite(rightDrumPin, LOW);
134+
digitalWrite(leftSymbolPin, LOW);
135+
digitalWrite(rightSymbolPin, LOW);
136+
int ledPins[] = {rightDrumPin, leftDrumPin, leftSymbolPin, rightSymbolPin};
137+
138+
const unsigned long interval = 300;
139+
140+
while (ledIndex < 4) {
141+
currentMillis = millis();
142+
if (currentMillis - previousMillis >= interval && ledIndex < 4) {
143+
previousMillis = currentMillis;
144+
digitalWrite(ledPins[ledIndex], HIGH);
145+
ledIndex++;
146+
}
147+
}
148+
149+
}
150+
151+
void LEDController::showUpdateSuccess() {
152+
unsigned long currentMillis = millis();
153+
static unsigned long previousMillis = 0;
154+
static int state = LOW;
155+
static int ledIndex = 0;
156+
int ledPins[] = {rightDrumPin, leftDrumPin, leftSymbolPin, rightSymbolPin};
157+
158+
const unsigned long interval = 100;
159+
160+
for (int i = 0; i < 3; i++ ) {
161+
digitalWrite(leftDrumPin, LOW);
162+
digitalWrite(rightDrumPin, LOW);
163+
digitalWrite(leftSymbolPin, HIGH);
164+
digitalWrite(rightSymbolPin, HIGH);
165+
166+
delay(1000);
167+
168+
digitalWrite(leftDrumPin, LOW);
169+
digitalWrite(rightDrumPin, LOW);
170+
digitalWrite(leftSymbolPin, LOW);
171+
digitalWrite(rightSymbolPin, LOW);
172+
}
173+
}
174+
175+
176+
void LEDController::showUpdateFailed() {
177+
// pattern like loading
178+
unsigned long currentMillis = millis();
179+
static unsigned long previousMillis = 0;
180+
static int state = LOW;
181+
static int ledIndex = 0;
182+
int ledPins[] = {rightDrumPin, leftDrumPin, leftSymbolPin, rightSymbolPin};
183+
184+
const unsigned long interval = 100;
185+
186+
for (int i = 0; i < 3; i++ ) {
187+
digitalWrite(leftDrumPin, LOW);
188+
digitalWrite(rightDrumPin, HIGH);
189+
digitalWrite(leftSymbolPin, HIGH);
190+
digitalWrite(rightSymbolPin, LOW);
191+
192+
delay(1000);
193+
194+
digitalWrite(leftDrumPin, HIGH);
195+
digitalWrite(rightDrumPin, LOW);
196+
digitalWrite(leftSymbolPin, LOW);
197+
digitalWrite(rightSymbolPin, HIGH);
198+
}
199+
200+
}
201+

lib/LEDController/LEDController.h

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ class LEDController {
1111
void showAPEnabled();
1212
void lightUpAll();
1313
void turnOffAll();
14+
void showUpdateUploading();
15+
void showUpdateSuccess();
16+
void showUpdateFailed();
1417

1518
private:
1619
int leftDrumPin;

lib/OTAManager/OTAManager.cpp

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#include "OTAManager.h"
2+
3+
OTAManager::OTAManager() {}
4+
5+
void OTAManager::begin(WebServer* server, LEDController* ledController) {
6+
setupOTA();
7+
setupWebUpdate(server, ledController);
8+
}
9+
10+
void OTAManager::handle() {
11+
ArduinoOTA.handle();
12+
}
13+
14+
void OTAManager::setupOTA() {
15+
ArduinoOTA.onStart([]() {
16+
String type;
17+
if (ArduinoOTA.getCommand() == U_FLASH) {
18+
type = "sketch";
19+
} else {
20+
type = "filesystem";
21+
}
22+
Serial.println("Start updating " + type);
23+
});
24+
ArduinoOTA.onEnd([]() {
25+
Serial.println("\nEnd");
26+
});
27+
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
28+
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
29+
});
30+
ArduinoOTA.onError([](ota_error_t error) {
31+
Serial.printf("Error[%u]: ", error);
32+
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
33+
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
34+
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
35+
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
36+
else if (error == OTA_END_ERROR) Serial.println("End Failed");
37+
});
38+
ArduinoOTA.begin();
39+
}
40+
41+
void OTAManager::setupWebUpdate(WebServer* server, LEDController* ledController) {
42+
server->on("/update", HTTP_GET, [server]() {
43+
server->sendHeader("Connection", "close");
44+
server->send(200, "text/html",
45+
"<form method='POST' action='/update' enctype='multipart/form-data'>"
46+
"<input type='file' name='update'>"
47+
"<input type='submit' value='Update'>"
48+
"</form>");
49+
});
50+
51+
52+
server->on("/update", HTTP_POST, [server, &ledController]() {
53+
server->sendHeader("Connection", "close");
54+
server->send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
55+
Serial.println("Test print");
56+
57+
ESP.restart();
58+
}, [server, &ledController]() {
59+
HTTPUpload& upload = server->upload();
60+
if (upload.status == UPLOAD_FILE_START) {
61+
Serial.printf("Update: %s\n", upload.filename.c_str());
62+
// ledController->showUpdateUploading();
63+
64+
/*
65+
LED Controller wont light up gives these errors
66+
Update: firmware.bin
67+
E (1291037) gpio: gpio_set_level(227): GPIO output gpio_num error
68+
E (1291038) gpio: gpio_set_level(227): GPIO output gpio_num error
69+
*/
70+
71+
if (!Update.begin(UPDATE_SIZE_UNKNOWN)) {
72+
Update.printError(Serial);
73+
74+
}
75+
} else if (upload.status == UPLOAD_FILE_WRITE) {
76+
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
77+
Update.printError(Serial);
78+
}
79+
} else if (upload.status == UPLOAD_FILE_END) {
80+
if (Update.end(true)) {
81+
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
82+
// ledController->showUpdateSuccess();
83+
84+
} else {
85+
Update.printError(Serial);
86+
// ledController->showUpdateFailed();
87+
}
88+
}
89+
});
90+
}

lib/OTAManager/OTAManager.h

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef OTAMANAGER_H
2+
#define OTAMANAGER_H
3+
4+
#include <ArduinoOTA.h>
5+
#include <WebServer.h>
6+
#include <Update.h>
7+
#include "LEDController.h"
8+
9+
class OTAManager {
10+
public:
11+
OTAManager();
12+
void begin(WebServer* server, LEDController* ledController);
13+
void handle();
14+
15+
private:
16+
void setupOTA();
17+
void setupWebUpdate(WebServer* server, LEDController* ledController);
18+
};
19+
20+
#endif // OTAMANAGER_H

src/main.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "LEDController.h"
1414
#include "FlexSensor.h"
1515
#include "DrumHitDetector.h"
16+
#include "OTAManager.h"
1617

1718
#define GLOVE_NO 1 // 0 for left, 1 for right glove
1819

@@ -48,6 +49,7 @@ WSMsgRecievedHandler wsMsgRecievedHandler = WSMsgRecievedHandler(GLOVE_NO);
4849
MPU6050Handler mpu6050Handler = MPU6050Handler(INTERRUPT_PIN, RESET_ANGLES_BTN);
4950
InstrumentSelector instrumentSelector = InstrumentSelector();
5051
LEDController ledController = LEDController(LEFT_DRUM_LED, RIGHT_DRUM_LED, LEFT_SYMBOL_LED, RIGHT_SYMBOL_LED);
52+
OTAManager otaManager;
5153

5254
FlexSensor flexSensor(34);
5355
DrumHitDetector drumHitDetector(50); // Flex bend acceleration threshold is the parameter
@@ -97,6 +99,8 @@ void setup()
9799
{
98100
Serial.println("\nFailed to connect to WiFi. Starting AP mode.");
99101
accessPoint.start();
102+
otaManager.begin(&server, &ledController);
103+
100104
}
101105
}
102106

@@ -130,6 +134,8 @@ void loop()
130134
{
131135
Serial.println("Failed to connect to server. Starting AP mode.");
132136
accessPoint.start();
137+
otaManager.begin(&server, &ledController);
138+
133139
}
134140
}
135141

@@ -216,5 +222,7 @@ void loop()
216222
dnsServer.processNextRequest();
217223
// Serial.println("AP mode");
218224
server.handleClient();
225+
otaManager.handle(); // Handle OTA updates
226+
219227
}
220228
}

0 commit comments

Comments
 (0)