extern "C" { void app_loop(); void eraseMcuConfig(); void restartMCU(); } #include "Settings.h" #include #ifndef BLYNK_NEW_LIBRARY #error "Old version of Blynk library is in use. Please replace it with the new one." #endif #if !defined(BLYNK_TEMPLATE_ID) || !defined(BLYNK_DEVICE_NAME) #error "Please specify your BLYNK_TEMPLATE_ID and BLYNK_DEVICE_NAME" #endif #include "BlynkState.h" #include "ConfigStore.h" #include "ResetButton.h" #include "ConfigMode.h" #include "Indicator.h" #include "OTA.h" #include "Console.h" inline void BlynkState::set(State m) { if (state != m && m < MODE_MAX_VALUE) { DEBUG_PRINT(String(StateStr[state]) + " => " + StateStr[m]); state = m; // You can put your state handling here, // i.e. implement custom indication } } void printDeviceBanner() { Blynk.printBanner(); DEBUG_PRINT("--------------------------"); DEBUG_PRINT(String("Product: ") + BLYNK_DEVICE_NAME); DEBUG_PRINT(String("Firmware: ") + BLYNK_FIRMWARE_VERSION " (build " __DATE__ " " __TIME__ ")"); if (configStore.getFlag(CONFIG_FLAG_VALID)) { DEBUG_PRINT(String("Token: ...") + (configStore.cloudToken+28)); } DEBUG_PRINT(String("Device: ") + BLYNK_INFO_DEVICE + " @ " + ESP.getCpuFreqMHz() + "MHz"); DEBUG_PRINT(String("MAC: ") + WiFi.macAddress()); DEBUG_PRINT(String("Flash: ") + ESP.getFlashChipSize() / 1024 + "K"); DEBUG_PRINT(String("ESP sdk: ") + ESP.getSdkVersion()); DEBUG_PRINT(String("Chip rev: ") + ESP.getChipRevision()); DEBUG_PRINT(String("Free mem: ") + ESP.getFreeHeap()); DEBUG_PRINT("--------------------------"); } void runBlynkWithChecks() { Blynk.run(); if (BlynkState::get() == MODE_RUNNING) { if (!Blynk.connected()) { if (WiFi.status() == WL_CONNECTED) { BlynkState::set(MODE_CONNECTING_CLOUD); } else { BlynkState::set(MODE_CONNECTING_NET); } } } } class Edgent { public: void begin() { WiFi.persistent(false); WiFi.enableSTA(true); // Needed to get MAC indicator_init(); button_init(); config_init(); console_init(); printDeviceBanner(); if (configStore.getFlag(CONFIG_FLAG_VALID)) { BlynkState::set(MODE_CONNECTING_NET); } else if (config_load_blnkopt()) { DEBUG_PRINT("Firmware is preprovisioned"); BlynkState::set(MODE_CONNECTING_NET); } else { BlynkState::set(MODE_WAIT_CONFIG); } } void run() { app_loop(); switch (BlynkState::get()) { case MODE_WAIT_CONFIG: case MODE_CONFIGURING: enterConfigMode(); break; case MODE_CONNECTING_NET: enterConnectNet(); break; case MODE_CONNECTING_CLOUD: enterConnectCloud(); break; case MODE_RUNNING: runBlynkWithChecks(); break; case MODE_OTA_UPGRADE: enterOTA(); break; case MODE_SWITCH_TO_STA: enterSwitchToSTA(); break; case MODE_RESET_CONFIG: enterResetConfig(); break; default: enterError(); break; } } }; Edgent BlynkEdgent; BlynkTimer edgentTimer; void app_loop() { edgentTimer.run(); edgentConsole.run(); }