#pragma once #include #include #if defined(ESP_PLATFORM) #include #include #include class ESP32Board : public mesh::MainBoard { protected: uint8_t startup_reason; public: void begin() { // for future use, sub-classes SHOULD call this from their begin() startup_reason = BD_STARTUP_NORMAL; #ifdef ESP32_CPU_FREQ setCpuFrequencyMhz(ESP32_CPU_FREQ); #endif #ifdef PIN_VBAT_READ // battery read support pinMode(PIN_VBAT_READ, INPUT); adcAttachPin(PIN_VBAT_READ); #endif #ifdef P_LORA_TX_LED pinMode(P_LORA_TX_LED, OUTPUT); digitalWrite(P_LORA_TX_LED, LOW); #endif #if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) #if PIN_BOARD_SDA >= 0 && PIN_BOARD_SCL >= 0 Wire.begin(PIN_BOARD_SDA, PIN_BOARD_SCL); #endif #else Wire.begin(); #endif } uint8_t getStartupReason() const override { return startup_reason; } #if defined(P_LORA_TX_LED) void onBeforeTransmit() override { digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on } void onAfterTransmit() override { digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off } #endif uint16_t getBattMilliVolts() override { #ifdef PIN_VBAT_READ analogReadResolution(12); uint32_t raw = 0; for (int i = 0; i < 4; i++) { raw += analogReadMilliVolts(PIN_VBAT_READ); } raw = raw / 4; return (2 * raw); #else return 0; // not supported #endif } const char* getManufacturerName() const override { return "Generic ESP32"; } void reboot() override { esp_restart(); } bool startOTAUpdate(const char* id, char reply[]) override; }; class ESP32RTCClock : public mesh::RTCClock { public: ESP32RTCClock() { } void begin() { esp_reset_reason_t reason = esp_reset_reason(); if (reason == ESP_RST_POWERON) { // start with some date/time in the recent past struct timeval tv; tv.tv_sec = 1715770351; // 15 May 2024, 8:50pm tv.tv_usec = 0; settimeofday(&tv, NULL); } } uint32_t getCurrentTime() override { time_t _now; time(&_now); return _now; } void setCurrentTime(uint32_t time) override { struct timeval tv; tv.tv_sec = time; tv.tv_usec = 0; settimeofday(&tv, NULL); } }; #endif