diff --git a/lib/HwTools/include/HwTools.h b/lib/HwTools/include/HwTools.h index 945555bf..653115f4 100644 --- a/lib/HwTools/include/HwTools.h +++ b/lib/HwTools/include/HwTools.h @@ -42,7 +42,8 @@ struct AdcConfig { class HwTools { public: - void setup(GpioConfig*, AmsConfiguration*); + bool applyBoardConfig(uint8_t boardType, GpioConfig& gpioConfig, MeterConfig& meterConfig, uint8_t hanPin); + void setup(GpioConfig*); float getVcc(); uint8_t getTempSensorCount(); TempSensorData* getTempSensorData(uint8_t); @@ -64,7 +65,6 @@ private: esp_adc_cal_characteristics_t* voltAdcChar, tempAdcChar; #endif GpioConfig* config; - AmsConfiguration* amsConf; bool tempSensorInit; OneWire *oneWire = NULL; DallasTemperature *sensorApi = NULL; diff --git a/lib/HwTools/src/HwTools.cpp b/lib/HwTools/src/HwTools.cpp index dd807f92..556c9e44 100644 --- a/lib/HwTools/src/HwTools.cpp +++ b/lib/HwTools/src/HwTools.cpp @@ -6,9 +6,146 @@ #include "HwTools.h" -void HwTools::setup(GpioConfig* config, AmsConfiguration* amsConf) { +bool HwTools::applyBoardConfig(uint8_t boardType, GpioConfig& gpioConfig, MeterConfig& meterConfig, uint8_t hanPin) { + #if defined(CONFIG_IDF_TARGET_ESP32S2) + switch(boardType) { + case 5: // Pow-K+ + meterConfig.txPin = 9; + case 7: // Pow-U+ + case 6: // Pow-P1 + meterConfig.rxPin = 16; + gpioConfig.apPin = 0; + gpioConfig.ledPinRed = 13; + gpioConfig.ledPinGreen = 14; + gpioConfig.ledRgbInverted = true; + gpioConfig.vccPin = 10; + gpioConfig.vccResistorGnd = 22; + gpioConfig.vccResistorVcc = 33; + gpioConfig.ledDisablePin = 6; + return true; + case 51: // Wemos S2 mini + gpioConfig.ledPin = 15; + gpioConfig.ledInverted = false; + gpioConfig.apPin = 0; + meterConfig.rxPin = hanPin > 0 ? hanPin : 18; + if(meterConfig.rxPin != 18) { + gpioConfig.vccPin = 18; + gpioConfig.vccResistorGnd = 45; + gpioConfig.vccResistorVcc = 10; + } + return true; + case 50: // Generic ESP32-S2 + meterConfig.rxPin = hanPin > 0 ? hanPin : 18; + return true; + } + #elif defined(CONFIG_IDF_TARGET_ESP32C3) + switch(boardType) { + case 8: // dbeinder: HAN mosquito + meterConfig.rxPin = 7; + meterConfig.rxPinPullup = false; + gpioConfig.apPin = 9; + gpioConfig.ledRgbInverted = true; + gpioConfig.ledPinRed = 5; + gpioConfig.ledPinGreen = 6; + gpioConfig.ledPinBlue = 4; + return true; + case 71: // ESP32-C3-DevKitM-1 + gpioConfig.apPin = 9; + case 70: // Generic ESP32-C3 + meterConfig.rxPin = hanPin > 0 ? hanPin : 7; + return true; + } + #elif defined(CONFIG_IDF_TARGET_ESP32S3) + switch(boardType) { + case 80: // Generic ESP32-S3 + meterConfig.rxPin = hanPin > 0 ? hanPin : 18; + return true; + } + #elif defined(ESP32) + switch(boardType) { + case 241: // LilyGO T-ETH-POE + gpioConfig.apPin = 0; + meterConfig.rxPin = hanPin > 0 ? hanPin : 39; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = true; + return true; + case 242: // M5 PoESP32 + meterConfig.rxPin = hanPin > 0 ? hanPin : 16; + return true; + case 243: // WT32-ETH01 + meterConfig.rxPin = hanPin > 0 ? hanPin : 39; + return true; + case 201: // D32 + meterConfig.rxPin = hanPin > 0 ? hanPin : 16; + gpioConfig.apPin = 4; + gpioConfig.ledPin = 5; + gpioConfig.ledInverted = true; + return true; + case 202: // Feather + case 203: // DevKitC + case 200: // ESP32 + meterConfig.rxPin = hanPin > 0 ? hanPin : 16; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = false; + return true; + } + #elif defined(ESP8266) + switch(boardType) { + case 2: // spenceme + gpioConfig.vccBootLimit = 32; + meterConfig.rxPin = 3; + gpioConfig.apPin = 0; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = true; + gpioConfig.tempSensorPin = 5; + return true; + case 0: // roarfred + meterConfig.rxPin = 3; + gpioConfig.apPin = 0; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = true; + gpioConfig.tempSensorPin = 5; + return true; + case 1: // Arnio Kamstrup + case 3: // Pow-K UART0 + case 4: // Pow-U UART0 + meterConfig.rxPin = 3; + gpioConfig.apPin = 0; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = true; + gpioConfig.ledPinRed = 13; + gpioConfig.ledPinGreen = 14; + gpioConfig.ledRgbInverted = true; + return true; + case 5: // Pow-K GPIO12 + case 7: // Pow-U GPIO12 + meterConfig.rxPin = 12; + gpioConfig.apPin = 0; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = true; + gpioConfig.ledPinRed = 13; + gpioConfig.ledPinGreen = 14; + gpioConfig.ledRgbInverted = true; + return true; + case 101: // D1 + meterConfig.rxPin = hanPin > 0 ? hanPin : 5; + gpioConfig.apPin = 4; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = true; + gpioConfig.vccMultiplier = 1100; + return true; + case 100: // ESP8266 + meterConfig.rxPin = hanPin > 0 ? hanPin : 3; + gpioConfig.ledPin = 2; + gpioConfig.ledInverted = true; + return true; + } + #endif + return false; +} + +void HwTools::setup(GpioConfig* config) { this->config = config; - this->amsConf = amsConf; this->tempSensorInit = false; if(sensorApi != NULL) delete sensorApi; diff --git a/lib/SvelteUi/src/AmsWebServer.cpp b/lib/SvelteUi/src/AmsWebServer.cpp index bcd61109..edcd8b6c 100644 --- a/lib/SvelteUi/src/AmsWebServer.cpp +++ b/lib/SvelteUi/src/AmsWebServer.cpp @@ -1081,155 +1081,8 @@ void AmsWebServer::handleSave() { MeterConfig meterConfig; config->getMeterConfig(meterConfig); - - #if defined(CONFIG_IDF_TARGET_ESP32S2) - switch(boardType) { - case 5: // Pow-K+ - case 7: // Pow-U+ - case 6: // Pow-P1 - config->clearGpio(*gpioConfig); - meterConfig.rxPin = 16; - gpioConfig->apPin = 0; - gpioConfig->ledPinRed = 13; - gpioConfig->ledPinGreen = 14; - gpioConfig->ledRgbInverted = true; - gpioConfig->vccPin = 10; - gpioConfig->vccResistorGnd = 22; - gpioConfig->vccResistorVcc = 33; - gpioConfig->ledDisablePin = 6; - break; - case 51: // Wemos S2 mini - gpioConfig->ledPin = 15; - gpioConfig->ledInverted = false; - gpioConfig->apPin = 0; - meterConfig.rxPin = hanPin > 0 ? hanPin : 18; - if(meterConfig.rxPin != 18) { - gpioConfig->vccPin = 18; - gpioConfig->vccResistorGnd = 45; - gpioConfig->vccResistorVcc = 10; - } - break; - case 50: // Generic ESP32-S2 - meterConfig.rxPin = hanPin > 0 ? hanPin : 18; - break; - default: - success = false; - } - #elif defined(CONFIG_IDF_TARGET_ESP32C3) - switch(boardType) { - case 8: // dbeinder: HAN mosquito - meterConfig.rxPin = 7; - meterConfig.rxPinPullup = false; - gpioConfig->apPin = 9; - gpioConfig->ledRgbInverted = true; - gpioConfig->ledPinRed = 5; - gpioConfig->ledPinGreen = 6; - gpioConfig->ledPinBlue = 4; - break; - case 71: // ESP32-C3-DevKitM-1 - gpioConfig->apPin = 9; - case 70: // Generic ESP32-C3 - meterConfig.rxPin = hanPin > 0 ? hanPin : 7; - break; - default: - success = false; - } - #elif defined(CONFIG_IDF_TARGET_ESP32S3) - switch(boardType) { - case 80: // Generic ESP32-S3 - meterConfig.rxPin = hanPin > 0 ? hanPin : 18; - break; - default: - success = false; - } - #elif defined(ESP32) - switch(boardType) { - case 241: // LilyGO T-ETH-POE - gpioConfig->apPin = 0; - meterConfig.rxPin = hanPin > 0 ? hanPin : 39; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = true; - break; - case 242: // M5 PoESP32 - meterConfig.rxPin = hanPin > 0 ? hanPin : 16; - break; - case 243: // WT32-ETH01 - meterConfig.rxPin = hanPin > 0 ? hanPin : 39; - break; - case 201: // D32 - meterConfig.rxPin = hanPin > 0 ? hanPin : 16; - gpioConfig->apPin = 4; - gpioConfig->ledPin = 5; - gpioConfig->ledInverted = true; - break; - case 202: // Feather - case 203: // DevKitC - case 200: // ESP32 - meterConfig.rxPin = hanPin > 0 ? hanPin : 16; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = false; - break; - default: - success = false; - } - #elif defined(ESP8266) - switch(boardType) { - case 2: // spenceme - config->clearGpio(*gpioConfig); - gpioConfig->vccBootLimit = 32; - meterConfig.rxPin = 3; - gpioConfig->apPin = 0; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = true; - gpioConfig->tempSensorPin = 5; - break; - case 0: // roarfred - config->clearGpio(*gpioConfig); - meterConfig.rxPin = 3; - gpioConfig->apPin = 0; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = true; - gpioConfig->tempSensorPin = 5; - break; - case 1: // Arnio Kamstrup - case 3: // Pow-K UART0 - case 4: // Pow-U UART0 - config->clearGpio(*gpioConfig); - meterConfig.rxPin = 3; - gpioConfig->apPin = 0; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = true; - gpioConfig->ledPinRed = 13; - gpioConfig->ledPinGreen = 14; - gpioConfig->ledRgbInverted = true; - break; - case 5: // Pow-K GPIO12 - case 7: // Pow-U GPIO12 - config->clearGpio(*gpioConfig); - meterConfig.rxPin = 12; - gpioConfig->apPin = 0; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = true; - gpioConfig->ledPinRed = 13; - gpioConfig->ledPinGreen = 14; - gpioConfig->ledRgbInverted = true; - break; - case 101: // D1 - meterConfig.rxPin = hanPin > 0 ? hanPin : 5; - gpioConfig->apPin = 4; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = true; - gpioConfig->vccMultiplier = 1100; - break; - case 100: // ESP8266 - meterConfig.rxPin = hanPin > 0 ? hanPin : 3; - gpioConfig->ledPin = 2; - gpioConfig->ledInverted = true; - break; - default: - success = false; - } - #endif + config->clearGpio(*gpioConfig); + hw->applyBoardConfig(boardType, *gpioConfig, meterConfig, hanPin); if(success) { config->setGpioConfig(*gpioConfig); config->setMeterConfig(meterConfig); @@ -1673,7 +1526,7 @@ void AmsWebServer::handleSave() { if(config->isNetworkConfigChanged() || performRestart) { performRestart = true; } else { - hw->setup(gpioConfig, config); + hw->setup(gpioConfig); } } else { success = false; diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index bf6a504c..d1f48f68 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -276,22 +276,13 @@ void setup() { config.clearGpio(gpioConfig); } if(config.getSystemConfig(sysConfig)) { - switch(sysConfig.boardType) { - case 5: - case 6: - case 7: - config.clearGpio(gpioConfig); - gpioConfig.apPin = 0; - gpioConfig.ledPinRed = 13; - gpioConfig.ledPinGreen = 14; - gpioConfig.ledRgbInverted = true; - gpioConfig.vccPin = 10; - gpioConfig.vccResistorGnd = 22; - gpioConfig.vccResistorVcc = 33; - gpioConfig.ledDisablePin = 6; - break; + config.getMeterConfig(meterConfig); + if(sysConfig.boardType < 20) { + config.clearGpio(gpioConfig); + hw.applyBoardConfig(sysConfig.boardType, gpioConfig, meterConfig, 0); } } else { + config.clearMeter(meterConfig); sysConfig.boardType = 0; sysConfig.vendorConfigured = false; sysConfig.userConfigured = false; @@ -299,7 +290,7 @@ void setup() { } delay(1); - hw.setup(&gpioConfig, &config); + hw.setup(&gpioConfig); if(gpioConfig.apPin >= 0) { pinMode(gpioConfig.apPin, INPUT_PULLUP); @@ -345,16 +336,6 @@ void setup() { bool shared = false; Serial.flush(); Serial.end(); - config.getMeterConfig(meterConfig); - switch(sysConfig.boardType) { - case 5: - case 6: - case 7: - meterConfig.rxPin = 16; - meterConfig.txPin = 9; - break; - } - if(meterConfig.rxPin == 3) { shared = true; #if defined(ESP8266)