diff --git a/include/Huawei_can.h b/include/Huawei_can.h index 5867998d0..fd3ccbe7f 100644 --- a/include/Huawei_can.h +++ b/include/Huawei_can.h @@ -89,7 +89,7 @@ class HuaweiCanClass { MCP_CAN *CAN; uint8_t _huawei_irq; uint8_t _huawei_power; - + bool initialized = false; }; extern HuaweiCanClass HuaweiCan; diff --git a/platformio.ini b/platformio.ini index 9a8019e1e..fef70c0ac 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 @@ -180,4 +180,4 @@ build_flags = ${env.build_flags} -DHOYMILES_PIN_SCLK=12 -DHOYMILES_PIN_CS=10 -DHOYMILES_PIN_IRQ=4 - -DHOYMILES_PIN_CE=5 \ No newline at end of file + -DHOYMILES_PIN_CE=5 diff --git a/src/Huawei_can.cpp b/src/Huawei_can.cpp index 30b190641..ce1863787 100644 --- a/src/Huawei_can.cpp +++ b/src/Huawei_can.cpp @@ -14,35 +14,37 @@ 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) { + initialized = false; - const CONFIG_T& config = Configuration.get(); + 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); - digitalWrite(huawei_cs, HIGH); + if (!config.Huawei_Enabled) { + return; + } - pinMode(huawei_irq, INPUT_PULLUP); - _huawei_irq = huawei_irq; + spi = new SPIClass(VSPI); + spi->begin(huawei_clk, huawei_miso, huawei_mosi, huawei_cs); + pinMode(huawei_cs, OUTPUT); + digitalWrite(huawei_cs, HIGH); - CAN = new MCP_CAN(spi, huawei_cs); - if(CAN->begin(MCP_ANY, CAN_125KBPS, MCP_8MHZ) == CAN_OK) { - MessageOutput.println("MCP2515 Initialized Successfully!"); - } - else { - MessageOutput.println("Error Initializing MCP2515..."); - } + pinMode(huawei_irq, INPUT_PULLUP); + _huawei_irq = huawei_irq; - CAN->setMode(MCP_NORMAL); // Change to normal mode to allow messages to be transmitted + CAN = new MCP_CAN(spi, huawei_cs); + if (!CAN->begin(MCP_ANY, CAN_125KBPS, MCP_8MHZ) == CAN_OK) { + MessageOutput.println("Error Initializing MCP2515..."); + return; + } + + MessageOutput.println("MCP2515 Initialized Successfully!"); + initialized = true; - pinMode(huawei_power, OUTPUT); - digitalWrite(huawei_power,HIGH); - _huawei_power = huawei_power; + // Change to normal mode to allow messages to be transmitted + CAN->setMode(MCP_NORMAL); + pinMode(huawei_power, OUTPUT); + digitalWrite(huawei_power, HIGH); + _huawei_power = huawei_power; } RectifierParameters_t * HuaweiCanClass::get() @@ -60,13 +62,12 @@ uint8_t data[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; void HuaweiCanClass::sendRequest() { if (previousMillis < millis()) { - // Send extended message byte sndStat = CAN->sendMsgBuf(0x108040FE, 1, 8, data); - if(sndStat == CAN_OK){ - MessageOutput.println("Message Sent Successfully!"); + if(sndStat == CAN_OK) { + MessageOutput.println("Message Sent Successfully!"); } else { - MessageOutput.println("Error Sending Message..."); + MessageOutput.println("Error Sending Message..."); } previousMillis += 5000; @@ -96,7 +97,8 @@ void HuaweiCanClass::onReceive(uint8_t* frame, uint8_t len) case R48xx_DATA_OUTPUT_POWER: _rp.output_power = value / 1024.0; - lastUpdate = millis(); // We'll only update last update on the important params + // We'll only update last update on the important params + lastUpdate = millis(); break; case R48xx_DATA_EFFICIENCY: @@ -155,12 +157,12 @@ void HuaweiCanClass::loop() const CONFIG_T& config = Configuration.get(); - if (!config.Huawei_Enabled) { + if (!config.Huawei_Enabled || !initialized) { return; } - if(!digitalRead(_huawei_irq)) // If CAN_INT pin is low, read receive buffer - { + 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) if((rxId & 0x80000000) == 0x80000000) { // Determine if ID is standard (11 bits) or extended (29 bits) @@ -191,15 +193,13 @@ void HuaweiCanClass::setValue(float in, uint8_t parameterType) // Send extended message byte sndStat = CAN->sendMsgBuf(0x108180FE, 1, 8, data); - if(sndStat == CAN_OK){ - MessageOutput.println("Message Sent Successfully!"); + if (sndStat == CAN_OK) { + MessageOutput.println("Message Sent Successfully!"); } else { - MessageOutput.println("Error Sending Message..."); + MessageOutput.println("Error Sending Message..."); } } void HuaweiCanClass::setPower(bool power) { - digitalWrite(_huawei_power, !power); + digitalWrite(_huawei_power, !power); } - - diff --git a/src/WebApi_Huawei.cpp b/src/WebApi_Huawei.cpp index 981324cc2..cd296cc04 100644 --- a/src/WebApi_Huawei.cpp +++ b/src/WebApi_Huawei.cpp @@ -255,14 +255,14 @@ void WebApiHuaweiClass::onAdminPost(AsyncWebServerRequest* request) 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")); - } + 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);