@@ -4,6 +4,8 @@ TaskHandle_t taskOtaHandle = NULL;
4
4
bool isOtaUpdating = false ;
5
5
QueueHandle_t otaQueue;
6
6
7
+
8
+
7
9
void setupOTA ()
8
10
{
9
11
if (preferences.getBool (" otaEnabled" , DEFAULT_OTA_ENABLED))
@@ -65,7 +67,7 @@ void onOTAStart()
65
67
vTaskSuspend (workerTaskHandle);
66
68
vTaskSuspend (taskScreenRotateTaskHandle);
67
69
68
- vTaskSuspend (ledTaskHandle);
70
+ // vTaskSuspend(ledTaskHandle);
69
71
vTaskSuspend (buttonTaskHandle);
70
72
71
73
// stopWebServer();
@@ -81,15 +83,26 @@ void handleOTATask(void *parameter)
81
83
{
82
84
if (xQueueReceive (otaQueue, &msg, 0 ) == pdTRUE)
83
85
{
84
- int result = downloadUpdateHandler (msg.updateType );
86
+ if (msg.updateType == UPDATE_ALL) {
87
+ int resultWebUi = downloadUpdateHandler (UPDATE_WEBUI);
88
+ int resultFw = downloadUpdateHandler (UPDATE_FIRMWARE);
89
+
90
+ if (resultWebUi == 0 && resultFw == 0 ) {
91
+ ESP.restart ();
92
+ } else {
93
+ queueLedEffect (LED_FLASH_ERROR);
94
+ vTaskDelay (pdMS_TO_TICKS (3000 ));
95
+ ESP.restart ();
96
+ }
97
+ }
85
98
}
86
99
87
100
ArduinoOTA.handle (); // Allow OTA updates to occur
88
101
vTaskDelay (pdMS_TO_TICKS (2000 ));
89
102
}
90
103
}
91
104
92
- String getLatestRelease (const String &fileToDownload)
105
+ ReleaseInfo getLatestRelease (const String &fileToDownload)
93
106
{
94
107
String releaseUrl = " https://api.github.com/repos/btclock/btclock_v3/releases/latest" ;
95
108
WiFiClientSecure client;
@@ -100,7 +113,7 @@ String getLatestRelease(const String &fileToDownload)
100
113
101
114
int httpCode = http.GET ();
102
115
103
- String downloadUrl = " " ;
116
+ ReleaseInfo info = { " " , " " } ;
104
117
105
118
if (httpCode > 0 )
106
119
{
@@ -113,15 +126,26 @@ String getLatestRelease(const String &fileToDownload)
113
126
114
127
for (JsonObject asset : assets)
115
128
{
116
- if (asset[" name" ] == fileToDownload)
129
+ String assetName = asset[" name" ].as <String>();
130
+ if (assetName == fileToDownload)
131
+ {
132
+ info.fileUrl = asset[" browser_download_url" ].as <String>();
133
+ }
134
+ else if (assetName == fileToDownload + " .sha256" )
135
+ {
136
+ info.checksumUrl = asset[" browser_download_url" ].as <String>();
137
+ }
138
+
139
+ if (!info.fileUrl .isEmpty () && !info.checksumUrl .isEmpty ())
117
140
{
118
- downloadUrl = asset[" browser_download_url" ].as <String>();
119
141
break ;
120
142
}
121
143
}
122
- Serial.printf (" Latest release URL: %s\r\n " , downloadUrl.c_str ());
144
+ Serial.printf (" Latest release URL: %s\r\n " , info.fileUrl .c_str ());
145
+ Serial.printf (" Checksum URL: %s\r\n " , info.checksumUrl .c_str ());
123
146
}
124
- return downloadUrl;
147
+ http.end ();
148
+ return info;
125
149
}
126
150
127
151
int downloadUpdateHandler (char updateType)
@@ -131,7 +155,7 @@ int downloadUpdateHandler(char updateType)
131
155
HTTPClient http;
132
156
http.setFollowRedirects (HTTPC_STRICT_FOLLOW_REDIRECTS);
133
157
134
- String latestRelease = " " ;
158
+ ReleaseInfo latestRelease;
135
159
136
160
switch (updateType)
137
161
{
@@ -143,25 +167,22 @@ int downloadUpdateHandler(char updateType)
143
167
case UPDATE_WEBUI:
144
168
{
145
169
latestRelease = getLatestRelease (" littlefs.bin" );
146
- updateWebUi (latestRelease, U_SPIFFS);
147
- return 0 ;
170
+ // updateWebUi(latestRelease.fileUrl , U_SPIFFS);
171
+ // return 0;
148
172
}
149
173
break ;
150
174
}
151
175
152
- if (latestRelease.isEmpty ())
153
- {
154
- return 503 ;
155
- }
176
+
156
177
// First, download the expected SHA256
157
- String expectedSHA256 = downloadSHA256 (getFirmwareFilename () );
178
+ String expectedSHA256 = downloadSHA256 (latestRelease. checksumUrl );
158
179
if (expectedSHA256.isEmpty ())
159
180
{
160
181
Serial.println (" Failed to get SHA256 checksum. Aborting update." );
161
182
return false ;
162
183
}
163
184
164
- http.begin (client, latestRelease);
185
+ http.begin (client, latestRelease. fileUrl );
165
186
http.setUserAgent (USER_AGENT);
166
187
167
188
int httpCode = http.GET ();
@@ -215,19 +236,21 @@ int downloadUpdateHandler(char updateType)
215
236
216
237
Update.onProgress (onOTAProgress);
217
238
218
- int updateType = (updateType == UPDATE_WEBUI) ? U_SPIFFS : U_FLASH;
219
-
220
239
if (Update.begin (contentLength, updateType))
221
240
{
222
- size_t written = Update.writeStream (*stream);
241
+ onOTAStart ();
242
+ size_t written = Update.write (firmware, contentLength);
223
243
224
244
if (written == contentLength)
225
245
{
226
246
Serial.println (" Written : " + String (written) + " successfully" );
247
+ free (firmware);
227
248
}
228
249
else
229
250
{
230
251
Serial.println (" Written only : " + String (written) + " /" + String (contentLength) + " . Retry?" );
252
+ free (firmware);
253
+ return 503 ;
231
254
}
232
255
233
256
if (Update.end ())
@@ -236,26 +259,33 @@ int downloadUpdateHandler(char updateType)
236
259
if (Update.isFinished ())
237
260
{
238
261
Serial.println (" Update successfully completed. Rebooting." );
239
- ESP.restart ();
262
+ // ESP.restart();
240
263
}
241
264
else
242
265
{
243
266
Serial.println (" Update not finished? Something went wrong!" );
267
+ free (firmware);
268
+ return 503 ;
244
269
}
245
270
}
246
271
else
247
272
{
248
273
Serial.println (" Error Occurred. Error #: " + String (Update.getError ()));
274
+ free (firmware);
275
+ return 503 ;
249
276
}
250
277
}
251
278
else
252
279
{
253
280
Serial.println (" Not enough space to begin OTA" );
281
+ free (firmware);
282
+ return 503 ;
254
283
}
255
284
}
256
285
else
257
286
{
258
287
Serial.println (" Invalid content length" );
288
+ return 503 ;
259
289
}
260
290
}
261
291
else
@@ -265,7 +295,7 @@ int downloadUpdateHandler(char updateType)
265
295
}
266
296
http.end ();
267
297
268
- return 200 ;
298
+ return 0 ;
269
299
}
270
300
271
301
void updateWebUi (String latestRelease, int command)
@@ -380,9 +410,8 @@ bool getIsOTAUpdating()
380
410
return isOtaUpdating;
381
411
}
382
412
383
- String downloadSHA256 (const String &filename )
413
+ String downloadSHA256 (const String &sha256Url )
384
414
{
385
- String sha256Url = getLatestRelease (filename + " .sha256" );
386
415
if (sha256Url.isEmpty ())
387
416
{
388
417
Serial.println (" Failed to get SHA256 file URL" );
0 commit comments