/* OTA MODULE Copyright (C) 2016-2018 by Xose PĂ©rez */ #include "ArduinoOTA.h" #include // ----------------------------------------------------------------------------- // OTA // ----------------------------------------------------------------------------- void _otaConfigure() { ArduinoOTA.setPort(OTA_PORT); ArduinoOTA.setHostname(getSetting("hostname").c_str()); #if USE_PASSWORD ArduinoOTA.setPassword(getSetting("adminPass", ADMIN_PASS).c_str()); #endif } #if TERMINAL_SUPPORT void _otaFrom(const char * url) { DEBUG_MSG_P(PSTR("[OTA] Downloading from '%s'\n"), url); #if WEB_SUPPORT wsSend_P(PSTR("{\"message\": 2}")); #endif ESPhttpUpdate.rebootOnUpdate(false); t_httpUpdate_return ret; if (strncmp(url, "https", 5) == 0) { String fp = getSetting("otafp", OTA_GITHUB_FP); DEBUG_MSG_P(PSTR("[OTA] Using fingerprint: '%s'\n"), fp.c_str()); ret = ESPhttpUpdate.update(url, APP_VERSION, fp.c_str()); } else { ret = ESPhttpUpdate.update(url, APP_VERSION); } switch(ret) { case HTTP_UPDATE_FAILED: DEBUG_MSG_P( PSTR("[OTA] Error (%d): %s\n"), ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str() ); break; case HTTP_UPDATE_NO_UPDATES: DEBUG_MSG_P(PSTR("[OTA] No updates available\n")); break; case HTTP_UPDATE_OK: DEBUG_MSG_P(PSTR("[OTA] Done, restarting...\n")); #if WEB_SUPPORT wsSend_P(PSTR("{\"action\": \"reload\"}")); #endif deferredReset(100, CUSTOM_RESET_OTA); break; } } void _otaInitCommands() { settingsRegisterCommand(F("OTA"), [](Embedis* e) { if (e->argc < 2) { DEBUG_MSG_P(PSTR("-ERROR: Wrong arguments\n")); } else { DEBUG_MSG_P(PSTR("+OK\n")); String url = String(e->argv[1]); _otaFrom(url.c_str()); } }); } #endif // TERMINAL_SUPPORT void _otaLoop() { ArduinoOTA.handle(); } // ----------------------------------------------------------------------------- void otaSetup() { _otaConfigure(); #if WEB_SUPPORT wsOnAfterParseRegister(_otaConfigure); #endif #if TERMINAL_SUPPORT _otaInitCommands(); #endif // Register loop espurnaRegisterLoop(_otaLoop); // ------------------------------------------------------------------------- ArduinoOTA.onStart([]() { DEBUG_MSG_P(PSTR("[OTA] Start\n")); #if WEB_SUPPORT wsSend_P(PSTR("{\"message\": 2}")); #endif }); ArduinoOTA.onEnd([]() { DEBUG_MSG_P(PSTR("\n")); DEBUG_MSG_P(PSTR("[OTA] Done, restarting...\n")); #if WEB_SUPPORT wsSend_P(PSTR("{\"action\": \"reload\"}")); #endif deferredReset(100, CUSTOM_RESET_OTA); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { DEBUG_MSG_P(PSTR("[OTA] Progress: %u%%\r"), (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { #if DEBUG_SUPPORT DEBUG_MSG_P(PSTR("\n[OTA] Error #%u: "), error); if (error == OTA_AUTH_ERROR) DEBUG_MSG_P(PSTR("Auth Failed\n")); else if (error == OTA_BEGIN_ERROR) DEBUG_MSG_P(PSTR("Begin Failed\n")); else if (error == OTA_CONNECT_ERROR) DEBUG_MSG_P(PSTR("Connect Failed\n")); else if (error == OTA_RECEIVE_ERROR) DEBUG_MSG_P(PSTR("Receive Failed\n")); else if (error == OTA_END_ERROR) DEBUG_MSG_P(PSTR("End Failed\n")); #endif }); ArduinoOTA.begin(); }