ota update feature
This commit is contained in:
parent
44ccee7903
commit
f7f1bec255
|
@ -21,5 +21,5 @@ lib_deps = siwats/ESPMegaPROR3@^1.3.0
|
||||||
robtillaart/DHTNEW@^0.4.18
|
robtillaart/DHTNEW@^0.4.18
|
||||||
seithan/Easy Nextion Library@^1.0.6
|
seithan/Easy Nextion Library@^1.0.6
|
||||||
robtillaart/FRAM_I2C@^0.6.1
|
robtillaart/FRAM_I2C@^0.6.1
|
||||||
|
esphome/ESPAsyncWebServer-esphome@^3.1.0
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
board_build.partitions = no_ota.csv
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include <espmega_iot_core.hpp>
|
#include <espmega_iot_core.hpp>
|
||||||
|
|
||||||
// OS Configuration
|
// OS Configuration
|
||||||
#define FASTBOOT
|
//#define FASTBOOT
|
||||||
|
|
||||||
// Network Connectivity
|
// Network Connectivity
|
||||||
char HOSTNAME[15];
|
char HOSTNAME[15];
|
||||||
|
@ -11,6 +11,7 @@ IPAddress GATEWAY(0, 0, 0, 0);
|
||||||
IPAddress DNS(0, 0, 0, 0);
|
IPAddress DNS(0, 0, 0, 0);
|
||||||
IPAddress MQTT_SERVER(0, 0, 0, 0);
|
IPAddress MQTT_SERVER(0, 0, 0, 0);
|
||||||
uint16_t MQTT_PORT = 0;
|
uint16_t MQTT_PORT = 0;
|
||||||
|
WebServer otaserver(80);
|
||||||
bool standalone = true;
|
bool standalone = true;
|
||||||
// #define MQTT_BASE_TOPIC "/espmega/ProR3"
|
// #define MQTT_BASE_TOPIC "/espmega/ProR3"
|
||||||
char MQTT_BASE_TOPIC[20];
|
char MQTT_BASE_TOPIC[20];
|
||||||
|
@ -141,6 +142,7 @@ void setup()
|
||||||
mqtt_connect();
|
mqtt_connect();
|
||||||
lcd_send_command("boot_state.txt=\"Threads Initializing . . .\"");
|
lcd_send_command("boot_state.txt=\"Threads Initializing . . .\"");
|
||||||
thread_initialization();
|
thread_initialization();
|
||||||
|
ota_begin();
|
||||||
Serial.println("Initialization Completed.");
|
Serial.println("Initialization Completed.");
|
||||||
Serial.println("Jumping to User Code.");
|
Serial.println("Jumping to User Code.");
|
||||||
user_init();
|
user_init();
|
||||||
|
@ -151,6 +153,7 @@ void setup()
|
||||||
Serial2.write(0xFF);
|
Serial2.write(0xFF);
|
||||||
Serial2.write(0xFF);
|
Serial2.write(0xFF);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
|
@ -162,6 +165,9 @@ void loop()
|
||||||
thread_controller.run();
|
thread_controller.run();
|
||||||
lcd_loop();
|
lcd_loop();
|
||||||
user_loop();
|
user_loop();
|
||||||
|
otaserver.handleClient();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void eeprom_retrieve_init()
|
void eeprom_retrieve_init()
|
||||||
|
@ -242,6 +248,37 @@ void eeprom_retrieve_init()
|
||||||
strcat(INPUTS_TOPIC, "/input/00");
|
strcat(INPUTS_TOPIC, "/input/00");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ota_begin() {
|
||||||
|
otaserver.on("/", HTTP_GET, []() {
|
||||||
|
otaserver.sendHeader("Connection", "close");
|
||||||
|
otaserver.send(200, "text/html", ota_upload_page);
|
||||||
|
});
|
||||||
|
otaserver.on("/update", HTTP_POST, []() {
|
||||||
|
otaserver.sendHeader("Connection", "close");
|
||||||
|
otaserver.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
|
||||||
|
ESP.restart();
|
||||||
|
}, []() {
|
||||||
|
HTTPUpload& upload = otaserver.upload();
|
||||||
|
if (upload.status == UPLOAD_FILE_START) {
|
||||||
|
Serial.printf("Update: %s\n", upload.filename.c_str());
|
||||||
|
if (!Update.begin(UPDATE_SIZE_UNKNOWN)) {
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
} else if (upload.status == UPLOAD_FILE_WRITE) {
|
||||||
|
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
} else if (upload.status == UPLOAD_FILE_END) {
|
||||||
|
if (Update.end(true)) {
|
||||||
|
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
|
||||||
|
} else {
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
otaserver.begin();
|
||||||
|
}
|
||||||
|
|
||||||
void io_begin()
|
void io_begin()
|
||||||
{
|
{
|
||||||
Serial.println("Initializing I/O . . .");
|
Serial.println("Initializing I/O . . .");
|
||||||
|
|
|
@ -10,9 +10,15 @@
|
||||||
#include <dhtnew.h>
|
#include <dhtnew.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <EasyNextionLibrary.h>
|
#include <EasyNextionLibrary.h>
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <WebServer.h>
|
||||||
|
#include <Update.h>
|
||||||
|
|
||||||
#include "lcd.hpp"
|
#include "lcd.hpp"
|
||||||
#include "user_code.hpp"
|
#include "user_code.hpp"
|
||||||
#include "ir_codes.hpp"
|
#include "ir_codes.hpp"
|
||||||
|
#include "espmega_iot_ota.hpp"
|
||||||
|
#include "espmega_iot_timer.hpp"
|
||||||
|
|
||||||
void virtual_interrupt_loop();
|
void virtual_interrupt_loop();
|
||||||
void virtual_interrupt_callback(int pin, int state);
|
void virtual_interrupt_callback(int pin, int state);
|
||||||
|
@ -26,6 +32,8 @@ void state_request_callback(String topic, String message);
|
||||||
void io_begin();
|
void io_begin();
|
||||||
void ir_loop();
|
void ir_loop();
|
||||||
|
|
||||||
|
void ota_begin();
|
||||||
|
|
||||||
void publish_pwm_states();
|
void publish_pwm_states();
|
||||||
void publish_pwm_state(int id);
|
void publish_pwm_state(int id);
|
||||||
void pwm_set_state(int id, int state);
|
void pwm_set_state(int id, int state);
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
#include "espmega_iot_ota.hpp"
|
||||||
|
/* Style */
|
||||||
|
String ota_style =
|
||||||
|
"<style>#file-input,input{width:100%;height:44px;border-radius:4px;margin:10px auto;font-size:15px}"
|
||||||
|
"input{background:#f1f1f1;border:0;padding:0 15px}body{background:#3498db;font-family:sans-serif;font-size:14px;color:#777}"
|
||||||
|
"#file-input{padding:0;border:1px solid #ddd;line-height:44px;text-align:left;display:block;cursor:pointer}"
|
||||||
|
"#bar,#prgbar{background-color:#f1f1f1;border-radius:10px}#bar{background-color:#3498db;width:0%;height:10px}"
|
||||||
|
"form{background:#fff;max-width:258px;margin:75px auto;padding:30px;border-radius:5px;text-align:center}"
|
||||||
|
".btn{background:#3498db;color:#fff;cursor:pointer}</style>";
|
||||||
|
|
||||||
|
/* Server Index Page */
|
||||||
|
String ota_upload_page =
|
||||||
|
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
|
||||||
|
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
|
||||||
|
"<h1>ESPMega PRO</h1>"
|
||||||
|
"<h3>Programming Tool</h3>"
|
||||||
|
"<input type='file' name='update' id='file' onchange='sub(this)' style=display:none>"
|
||||||
|
"<label id='file-input' for='file'> Choose file...</label>"
|
||||||
|
"<input type='submit' class=btn value='Program'>"
|
||||||
|
"<br><br>"
|
||||||
|
"<div id='prg'></div>"
|
||||||
|
"<br><div id='prgbar'><div id='bar'></div></div><br></form>"
|
||||||
|
"<script>"
|
||||||
|
"function sub(obj){"
|
||||||
|
"var fileName = obj.value.split('\\\\');"
|
||||||
|
"document.getElementById('file-input').innerHTML = ' '+ fileName[fileName.length-1];"
|
||||||
|
"};"
|
||||||
|
"$('form').submit(function(e){"
|
||||||
|
"e.preventDefault();"
|
||||||
|
"var form = $('#upload_form')[0];"
|
||||||
|
"var data = new FormData(form);"
|
||||||
|
"$.ajax({"
|
||||||
|
"url: '/update',"
|
||||||
|
"type: 'POST',"
|
||||||
|
"data: data,"
|
||||||
|
"contentType: false,"
|
||||||
|
"processData:false,"
|
||||||
|
"xhr: function() {"
|
||||||
|
"var xhr = new window.XMLHttpRequest();"
|
||||||
|
"xhr.upload.addEventListener('progress', function(evt) {"
|
||||||
|
"if (evt.lengthComputable) {"
|
||||||
|
"var per = evt.loaded / evt.total;"
|
||||||
|
"$('#prg').html('progress: ' + Math.round(per*100) + '%');"
|
||||||
|
"$('#bar').css('width',Math.round(per*100) + '%');"
|
||||||
|
"}"
|
||||||
|
"}, false);"
|
||||||
|
"return xhr;"
|
||||||
|
"},"
|
||||||
|
"success:function(d, s) {"
|
||||||
|
"console.log('success!') "
|
||||||
|
"},"
|
||||||
|
"error: function (a, b, c) {"
|
||||||
|
"}"
|
||||||
|
"});"
|
||||||
|
"});"
|
||||||
|
"</script>" + ota_style;
|
|
@ -0,0 +1,4 @@
|
||||||
|
#pragma once
|
||||||
|
#include <ESPMegaPRO.h>
|
||||||
|
extern String ota_upload_page;
|
||||||
|
extern String ota_style;
|
Loading…
Reference in New Issue