#include ESPMegaPRO::ESPMegaPRO() { } bool ESPMegaPRO::begin() { Wire.begin(14, 33); fram.begin(FRAM_ADDRESS); Serial.begin(115200); this->installCard(1, &outputs); outputs.bindFRAM(&fram,0); outputs.loadFromFRAM(); if(!this->installCard(0, &inputs)) { Serial.println("Failed to initialize inputs"); Serial.println("Is this an ESPMegaPRO device?"); return false; } uint8_t pinMap[16] = {0, 1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8}; inputs.loadPinMap(pinMap); return true; } void ESPMegaPRO::loop() { inputs.loop(); outputs.loop(); for (int i = 0; i < 255; i++) { if (cardInstalled[i]) { cards[i]->loop(); } } iot.loop(); } bool ESPMegaPRO::installCard(uint8_t slot, ExpansionCard* card) { if (slot > 255) return false; if (cardInstalled[slot]) { Serial.println("Card already installed"); return false; } if (!card->begin()) { Serial.print("Failed to install card at slot "); Serial.println(slot); return false; } cards[slot] = card; cardInstalled[slot] = true; cardCount++; return true; } bool ESPMegaPRO::updateTimeFromNTP() { struct tm timeinfo; if (getLocalTime(&timeinfo)) { rtctime_t rtctime = this->getTime(); if (rtctime.hours != timeinfo.tm_hour || rtctime.minutes != timeinfo.tm_min || rtctime.seconds != timeinfo.tm_sec || rtctime.day != timeinfo.tm_mday || rtctime.month != timeinfo.tm_mon + 1 || rtctime.year != timeinfo.tm_year + 1900) { this->setTime(timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, timeinfo.tm_mday, timeinfo.tm_mon + 1, timeinfo.tm_year + 1900); } return true; } return false; } rtctime_t ESPMegaPRO::getTime() { tmElements_t timeElement; RTC.read(timeElement); rtctime_t time; time.hours = timeElement.Hour; time.minutes = timeElement.Minute; time.seconds = timeElement.Second; time.day = timeElement.Day; time.month = timeElement.Month; time.year = timeElement.Year + 1970; return time; } void ESPMegaPRO::setTime(int hours, int minutes, int seconds, int day, int month, int year) { tmElements_t timeElement; timeElement.Hour = hours; timeElement.Minute = minutes; timeElement.Second = seconds; timeElement.Day = day; timeElement.Month = month; timeElement.Year = year - 1970; RTC.write(timeElement); } void ESPMegaPRO::enableIotModule() { iot.intr_begin(cards); }