diff --git a/include/Huawei_can.h b/include/Huawei_can.h index 296bc488..5867998d 100644 --- a/include/Huawei_can.h +++ b/include/Huawei_can.h @@ -75,14 +75,14 @@ public: void setPower(bool power); RectifierParameters_t * get(); - unsigned long getLastUpdate(); + uint32_t getLastUpdate(); private: void sendRequest(); void onReceive(uint8_t* frame, uint8_t len); - unsigned long previousMillis; - unsigned long lastUpdate; + uint32_t previousMillis; + uint32_t lastUpdate; RectifierParameters_t _rp; SPIClass *spi; diff --git a/platformio.ini b/platformio.ini index f3697d37..9a8019e1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -58,7 +58,7 @@ build_flags = ${env.build_flags} -DHOYMILES_PIN_CE=4 -DHOYMILES_PIN_CS=5 -DVICTRON_PIN_TX=21 - -DVICTRON_PIN_RX=22 + -DVICTRON_PIN_RX=22 -DPYLONTECH_PIN_RX=27 -DPYLONTECH_PIN_TX=14 -DHUAWEI_PIN_MISO=12 diff --git a/src/Huawei_can.cpp b/src/Huawei_can.cpp index 9d6fce3a..30b19064 100644 --- a/src/Huawei_can.cpp +++ b/src/Huawei_can.cpp @@ -4,6 +4,7 @@ */ #include "Huawei_can.h" #include "MessageOutput.h" +#include "Configuration.h" #include #include @@ -14,6 +15,12 @@ HuaweiCanClass HuaweiCan; void HuaweiCanClass::init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huawei_clk, uint8_t huawei_irq, uint8_t huawei_cs, uint8_t huawei_power) { + const CONFIG_T& config = Configuration.get(); + + if (!config.Huawei_Enabled) { + return; + } + spi = new SPIClass(VSPI); spi->begin(huawei_clk, huawei_miso, huawei_mosi, huawei_cs); pinMode(huawei_cs, OUTPUT); @@ -43,7 +50,7 @@ RectifierParameters_t * HuaweiCanClass::get() return &_rp; } -unsigned long HuaweiCanClass::getLastUpdate() +uint32_t HuaweiCanClass::getLastUpdate() { return lastUpdate; } @@ -142,10 +149,16 @@ void HuaweiCanClass::onReceive(uint8_t* frame, uint8_t len) void HuaweiCanClass::loop() { - long unsigned int rxId; + INT32U rxId; unsigned char len = 0; unsigned char rxBuf[8]; - + + const CONFIG_T& config = Configuration.get(); + + if (!config.Huawei_Enabled) { + return; + } + if(!digitalRead(_huawei_irq)) // If CAN_INT pin is low, read receive buffer { CAN->readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s) diff --git a/src/PowerMeter.cpp b/src/PowerMeter.cpp index 19eac501..a27297e8 100644 --- a/src/PowerMeter.cpp +++ b/src/PowerMeter.cpp @@ -27,10 +27,20 @@ void PowerMeterClass::init() CONFIG_T& config = Configuration.get(); - MqttSettings.subscribe(config.PowerMeter_MqttTopicPowerMeter1, 0, std::bind(&PowerMeterClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); - MqttSettings.subscribe(config.PowerMeter_MqttTopicPowerMeter2, 0, std::bind(&PowerMeterClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); - MqttSettings.subscribe(config.PowerMeter_MqttTopicPowerMeter3, 0, std::bind(&PowerMeterClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); - + if (config.PowerMeter_Enabled && config.PowerMeter_Source == 0) { + if (strlen(config.PowerMeter_MqttTopicPowerMeter1) > 0) { + MqttSettings.subscribe(config.PowerMeter_MqttTopicPowerMeter1, 0, std::bind(&PowerMeterClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); + } + + if (strlen(config.PowerMeter_MqttTopicPowerMeter2) > 0) { + MqttSettings.subscribe(config.PowerMeter_MqttTopicPowerMeter2, 0, std::bind(&PowerMeterClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); + } + + if (strlen(config.PowerMeter_MqttTopicPowerMeter3) > 0) { + MqttSettings.subscribe(config.PowerMeter_MqttTopicPowerMeter3, 0, std::bind(&PowerMeterClass::onMqttMessage, this, _1, _2, _3, _4, _5, _6)); + } + } + mqttInitDone = true; sdm.begin(); diff --git a/src/WebApi_Huawei.cpp b/src/WebApi_Huawei.cpp index 1b2cd5b4..981324cc 100644 --- a/src/WebApi_Huawei.cpp +++ b/src/WebApi_Huawei.cpp @@ -5,6 +5,8 @@ #include "WebApi_Huawei.h" #include "Huawei_can.h" #include "Configuration.h" +#include "MessageOutput.h" +#include "PinMapping.h" #include "WebApi.h" #include "WebApi_errors.h" #include @@ -198,7 +200,7 @@ void WebApiHuaweiClass::onAdminPost(AsyncWebServerRequest* request) if (!WebApi.checkCredentials(request)) { return; } - + AsyncJsonResponse* response = new AsyncJsonResponse(); JsonObject retMsg = response->getRoot(); retMsg[F("type")] = F("warning"); @@ -251,5 +253,17 @@ void WebApiHuaweiClass::onAdminPost(AsyncWebServerRequest* request) response->setLength(); request->send(response); + const PinMapping_t& pin = PinMapping.get(); + if (config.Huawei_Enabled) { + MessageOutput.println(F("Initialize Huawei AC charger interface... ")); + if (PinMapping.isValidHuaweiConfig()) { + MessageOutput.printf("Huawei AC-charger miso = %d, mosi = %d, clk = %d, irq = %d, cs = %d, power_pin = %d\r\n", pin.huawei_miso, pin.huawei_mosi, pin.huawei_clk, pin.huawei_irq, pin.huawei_cs, pin.huawei_power); + HuaweiCan.init(pin.huawei_miso, pin.huawei_mosi, pin.huawei_clk, pin.huawei_irq, pin.huawei_cs, pin.huawei_power); + MessageOutput.println(F("done")); + } else { + MessageOutput.println(F("Invalid pin config")); + } + } + HuaweiCan.setPower(config.Huawei_Enabled); } diff --git a/src/WebApi_device.cpp b/src/WebApi_device.cpp index 1a4674d7..c27116a4 100644 --- a/src/WebApi_device.cpp +++ b/src/WebApi_device.cpp @@ -77,6 +77,14 @@ void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request) batteryPinObj[F("rx")] = pin.battery_rx; batteryPinObj[F("tx")] = pin.battery_tx; + JsonObject huaweiPinObj = curPin.createNestedObject("huawei"); + huaweiPinObj[F("miso")] = pin.huawei_miso; + huaweiPinObj[F("mosi")] = pin.huawei_mosi; + huaweiPinObj[F("clk")] = pin.huawei_clk; + huaweiPinObj[F("irq")] = pin.huawei_irq; + huaweiPinObj[F("cs")] = pin.huawei_cs; + huaweiPinObj[F("power")] = pin.huawei_power; + response->setLength(); request->send(response); }