mirror of
https://github.com/0015/ThatProject.git
synced 2026-01-12 17:27:43 +03:00
175 lines
4.0 KiB
C++
175 lines
4.0 KiB
C++
#include <Arduino.h>
|
|
#include "SimpleOTA.h"
|
|
|
|
static SimpleOTA *instance = NULL;
|
|
|
|
SimpleOTA::SimpleOTA() {
|
|
t1 = 0;
|
|
t2 = 0;
|
|
currentState = NONE;
|
|
instance = this;
|
|
}
|
|
|
|
SimpleOTA::~SimpleOTA() {
|
|
}
|
|
|
|
void buttonCallbackEvent() {
|
|
Serial.println("buttonCallbackEvent");
|
|
if (instance->currentState == SERVER_FOUND && instance->version->hasNewUpdate()) {
|
|
instance->startDownload();
|
|
}
|
|
}
|
|
|
|
void networkDownloadEvent(int percent) {
|
|
Serial.print("networkDownloadEvent downloadPercent: ");
|
|
if (percent == 0) {
|
|
instance->currentState = FIRMWARE_DOWNLOAD_START;
|
|
}
|
|
Serial.println(percent);
|
|
instance->display->downloadScreen(percent);
|
|
}
|
|
|
|
void SimpleOTA::begin() {
|
|
this->initDisplay();
|
|
this->initVersion();
|
|
this->initNetwork();
|
|
this->initFileIO();
|
|
this->initButton();
|
|
}
|
|
|
|
void SimpleOTA::loop() {
|
|
|
|
switch (currentState) {
|
|
case NETWORK_CONNECTED:
|
|
|
|
if (millis() - t1 >= 1000) {
|
|
t1 = millis();
|
|
this->requestLocalServerTime();
|
|
}
|
|
break;
|
|
|
|
case SERVER_FOUND:
|
|
if (millis() - t1 >= 1000) {
|
|
t1 = millis();
|
|
this->updateTime();
|
|
display->showVersionBelow(version->getCurrentVersion());
|
|
}
|
|
|
|
if (millis() - t2 >= 1000 * 10) {
|
|
t2 = millis();
|
|
this->serverFirmwareCheck();
|
|
}
|
|
break;
|
|
|
|
default: break;
|
|
}
|
|
|
|
buttonCont->loop();
|
|
}
|
|
|
|
void SimpleOTA::initDisplay() {
|
|
Serial.println("initDisplay");
|
|
display = new Display();
|
|
display->initTFT();
|
|
}
|
|
|
|
void SimpleOTA::initVersion() {
|
|
Serial.println("initVersion");
|
|
version = new VersionCont();
|
|
display->showVersion(version->getCurrentVersion());
|
|
}
|
|
|
|
void SimpleOTA::initNetwork() {
|
|
Serial.println("initNetwork");
|
|
network = new Network();
|
|
currentState = NETWORK_BEGIN;
|
|
network->WiFiBegin();
|
|
currentState = NETWORK_CONNECTED;
|
|
this->requestLocalServerTime();
|
|
}
|
|
|
|
void SimpleOTA::initFileIO() {
|
|
Serial.println("initFileIO");
|
|
fileIO = new FileIO();
|
|
//fileIO->format();
|
|
fileIO->listSPIFFS();
|
|
}
|
|
|
|
void SimpleOTA::initButton() {
|
|
Serial.println("initButton");
|
|
|
|
void (*ptr)(void) = &buttonCallbackEvent;
|
|
buttonCont = new ButtonCont(ptr);
|
|
}
|
|
|
|
void SimpleOTA::requestLocalServerTime() {
|
|
network->fetchLocalServerTime();
|
|
|
|
if (network->getLocalServerTime() != 0) {
|
|
rtc.setTime(network->getLocalServerTime());
|
|
display->fillBlackScreen();
|
|
currentState = SERVER_FOUND;
|
|
}
|
|
}
|
|
|
|
void SimpleOTA::updateTime() {
|
|
struct tm timeinfo = rtc.getTimeStruct();
|
|
display->timeUpdate(rtc.getDate(), rtc.getTime());
|
|
}
|
|
|
|
void SimpleOTA::serverFirmwareCheck() {
|
|
version->setNewFirmware(network->checkVersion());
|
|
if (version->newFirmwareVersion() == -1) {
|
|
display->newMessage("Server Not Responding");
|
|
} else {
|
|
if (version->hasNewUpdate()) {
|
|
display->newMessage("New Build Available! ->");
|
|
}
|
|
}
|
|
}
|
|
|
|
void SimpleOTA::startDownload() {
|
|
|
|
void (*ptr)(int) = &networkDownloadEvent;
|
|
|
|
bool compareMD5Checksum = version->md5CompareTo(network->fileDownload(ptr, &fileIO, version->getFirmwareServerPath()));
|
|
bool compareFileSize = version->fileSizeCompareTo(fileIO->getFileSize(FileIO::TEMP_BIN_FILE));
|
|
|
|
Serial.println("======compareMD5Checksum");
|
|
Serial.println(compareMD5Checksum);
|
|
Serial.println("======Downloaded File SIze");
|
|
Serial.println(compareFileSize);
|
|
|
|
if (compareMD5Checksum && compareFileSize) {
|
|
display->downloadSuccess();
|
|
this->updateFirmware();
|
|
} else {
|
|
display->downloadFailure(version->getCPName());
|
|
delay(5000);
|
|
display->fillBlackScreen();
|
|
currentState = SERVER_FOUND;
|
|
}
|
|
}
|
|
|
|
void SimpleOTA::updateFirmware() {
|
|
currentState = FIRMWARE_DOWNLOAD_START;
|
|
display->firmwareScreen(true, false);
|
|
Updater *updater = new Updater();
|
|
if (updater->updateFromFS(&fileIO)) {
|
|
Serial.println("UPDATE DONE");
|
|
|
|
currentState = FIRMWARE_UPDATED;
|
|
version->saveVersion(version->newFirmwareVersion());
|
|
display->firmwareScreen(false, true);
|
|
|
|
ESP.restart();
|
|
} else {
|
|
Serial.println("UPDATE FAILURE");
|
|
display->firmwareScreen(false, false);
|
|
delay(3000);
|
|
display->fillBlackScreen();
|
|
currentState = SERVER_FOUND;
|
|
}
|
|
delete updater;
|
|
}
|