#include "Platform.h" #include #include "Static.h" #ifdef BOARD_ESP32 #include #include #include #elif defined(BOARD_ESP8266) #include #include #include #include WiFiUDP wifiUdp; //NTPClient timeClient(wifiUdp, "pool.ntp.org", 3600 * -7); NTPClient timeClient(wifiUdp, "10.0.0.1", 3600 * -7); #endif #ifdef PLATFORM_PHOTON STARTUP(BootOptions::initPins()); #else #include "platform/arduino/MQTTTelemetry.h" void printNewline(Print* logOutput) { logOutput->print("\r\n"); } int printEspLog(const char* fmt, va_list args) { Log.notice(fmt, args); return 1; } #endif int Platform::s_timezone = 0; const char* Platform::name() { #ifdef PLATFORM_PHOTON return "Photon"; #elif defined(BOARD_ESP8266) return "ESP8266"; #elif defined(BOARD_ESP32) return "ESP32"; #else return "Unknown!"; #endif } const char* Platform::version() { #ifdef PLATFORM_PHOTON return System.version().c_str(); #elif defined(BOARD_ESP32) return ESP.getSdkVersion(); #else return "Unknown!"; #endif } void Platform::preSetup() { Serial.begin(115200); delay(5000); #ifdef PLATFORM_PHOTON System.enableFeature(FEATURE_RETAINED_MEMORY); if (bootopts.isFlash) { System.dfu(); } if (bootopts.isSerial) { bootopts.waitForRelease(); while(!Serial.isConnected()) { Particle.process(); } Log.notice("\xf0\x9f\x94\x8c Serial connected"); } #else Log.begin(LOG_LEVEL_VERBOSE, Static::instance()->logPrinter()); Log.setSuffix(printNewline); #endif #ifdef BOARD_ESP32 esp_task_wdt_init(10, true); esp_task_wdt_add(NULL); esp_log_set_vprintf(printEspLog); #endif #ifdef BOARD_ESP8266 ESP.wdtEnable(0); #endif } void Platform::setup() { #ifdef PLATFORM_PHOTON Time.zone(Static::instance()->getTimezone()); #elif defined(BOARD_ESP32) constexpr int dst = 1; configTime(s_timezone* 3600, 3600 * dst, "pool.ntp.org"); #elif defined(BOARD_ESP8266) timeClient.begin(); #endif } void Platform::bootSplash() { #ifdef PLATFORM_PHOTON Log.notice(u8" Boot pin configuration:"); Log.notice(u8" 2: Setup - %d", bootopts.isSetup); Log.notice(u8" 3: Serial - %d", bootopts.isSerial); Log.notice(u8" 4: Flash - %d", bootopts.isFlash); #endif } void Platform::loop() { #ifdef BOARD_ESP8266 if (WiFi.status() == WL_CONNECTED) { timeClient.update(); } ESP.wdtFeed(); #elif defined(BOARD_ESP32) esp_task_wdt_reset(); #endif } bool Platform::getLocalTime(struct tm* timedata) { #ifdef PLATFORM_PHOTON if (Time.isValid()) { timedata->tm_hour = Time.hour(); timedata->tm_min = Time.minute(); return true; } return false; #elif defined(BOARD_ESP32) time_t rawtime; time(&rawtime); (*timedata) = (*localtime(&rawtime)); return (timedata->tm_year > (2016-1990)); //return getLocalTime(timedata); #else timedata->tm_hour = timeClient.getHours(); timedata->tm_min = timeClient.getMinutes(); return true; #endif } const char* Platform::deviceID() { uint64_t chipid; #ifdef BOARD_ESP32 chipid = ESP.getEfuseMac(); #elif defined(BOARD_ESP8266) chipid = ESP.getChipId(); #endif snprintf(s_deviceID, sizeof(s_deviceID), "%08X", (uint32_t)chipid); return s_deviceID; } BootOptions Platform::bootopts; char Platform::s_deviceID[15]; STATIC_ALLOC(Platform);