diff --git a/include/PinMapping.h b/include/PinMapping.h index 1d0ad4d9..cdd1e73d 100644 --- a/include/PinMapping.h +++ b/include/PinMapping.h @@ -29,6 +29,8 @@ struct PinMapping_t { uint8_t display_clk; uint8_t display_cs; uint8_t display_reset; + uint8_t victron_tx; + uint8_t victron_rx; }; class PinMappingClass { @@ -39,6 +41,7 @@ public: bool isValidNrf24Config(); bool isValidEthConfig(); + bool isValidVictronConfig(); private: PinMapping_t _pinMapping; diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp index 7ece5dc7..6682a822 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.cpp @@ -56,9 +56,9 @@ VeDirectFrameHandler::VeDirectFrameHandler() : { } -void VeDirectFrameHandler::init() +void VeDirectFrameHandler::init(int8_t rx, int8_t tx) { - VedirectSerial.begin(19200, SERIAL_8N1, VICTRON_PIN_RX, VICTRON_PIN_TX); + VedirectSerial.begin(19200, SERIAL_8N1, rx, tx); VedirectSerial.flush(); } diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h index 71343041..fefbb639 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h @@ -29,7 +29,7 @@ class VeDirectFrameHandler { public: VeDirectFrameHandler(); - void init(); // initialize HardewareSerial + void init(int8_t rx, int8_t tx); // initialize HardewareSerial void setPollInterval(unsigned long interval); // set poll intervall in seconds void loop(); // main loop to read ve.direct data unsigned long getLastUpdate(); // timestamp of last successful frame read diff --git a/platformio.ini b/platformio.ini index ab4da9b7..be0f55e5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -51,6 +51,8 @@ build_flags = ${env.build_flags} -DHOYMILES_PIN_IRQ=16 -DHOYMILES_PIN_CE=4 -DHOYMILES_PIN_CS=5 + -DVICTRON_PIN_TX=21 + -DVICTRON_PIN_RX=22 [env:olimex_esp32_poe] diff --git a/platformio_override.ini b/platformio_override.ini index ccf4d2e7..03996e14 100644 --- a/platformio_override.ini +++ b/platformio_override.ini @@ -30,5 +30,7 @@ upload_port = COM4 ; -DHOYMILES_PIN_IRQ=4 ; -DHOYMILES_PIN_CE=5 ; -DHOYMILES_PIN_CS=6 +; -DVICTRON_PIN_TX=21 +; -DVICTRON_PIN_RX=22 ;monitor_port = /dev/ttyACM0 ;upload_port = /dev/ttyACM0 diff --git a/src/PinMapping.cpp b/src/PinMapping.cpp index 621d16b3..486834d7 100644 --- a/src/PinMapping.cpp +++ b/src/PinMapping.cpp @@ -60,6 +60,9 @@ PinMappingClass::PinMappingClass() _pinMapping.display_clk = DISPLAY_CLK; _pinMapping.display_cs = DISPLAY_CS; _pinMapping.display_reset = DISPLAY_RESET; + + _pinMapping.victron_tx = VICTRON_PIN_TX; + _pinMapping.victron_rx = VICTRON_PIN_RX; } @@ -113,6 +116,9 @@ bool PinMappingClass::init(const String& deviceMapping) _pinMapping.display_cs = doc[i]["display"]["cs"] | DISPLAY_CS; _pinMapping.display_reset = doc[i]["display"]["reset"] | DISPLAY_RESET; + _pinMapping.victron_rx = doc[i]["victron"]["rx"] | VICTRON_PIN_RX; + _pinMapping.victron_tx = doc[i]["victron"]["tx"] | VICTRON_PIN_TX; + return true; } } @@ -133,4 +139,10 @@ bool PinMappingClass::isValidNrf24Config() bool PinMappingClass::isValidEthConfig() { return _pinMapping.eth_enabled; +} + +bool PinMappingClass::isValidVictronConfig() +{ + return _pinMapping.victron_rx > 0 + && _pinMapping.victron_tx > 0; } \ No newline at end of file diff --git a/src/WebApi_device.cpp b/src/WebApi_device.cpp index 44f6824a..abde3123 100644 --- a/src/WebApi_device.cpp +++ b/src/WebApi_device.cpp @@ -69,6 +69,10 @@ void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request) display[F("screensaver")] = config.Display_ScreenSaver; display[F("contrast")] = config.Display_Contrast; + JsonObject victronPinObj = curPin.createNestedObject("victron"); + victronPinObj[F("rx")] = pin.victron_rx; + victronPinObj[F("tx")] = pin.victron_tx; + response->setLength(); request->send(response); } diff --git a/src/main.cpp b/src/main.cpp index e15dbf6a..87e8a840 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -165,9 +165,13 @@ void setup() // Initialize ve.direct communication MessageOutput.println(F("Initialize ve.direct interface... ")); - VeDirect.init(); - VeDirect.setPollInterval(config.Vedirect_PollInterval); - MessageOutput.println(F("done")); + if (PinMapping.isValidVictronConfig()) { + VeDirect.init(pin.victron_rx, pin.victron_tx); + VeDirect.setPollInterval(config.Vedirect_PollInterval); + MessageOutput.println(F("done")); + } else { + MessageOutput.println(F("Invalid pin config")); + } } void loop() diff --git a/webapp/src/components/PinInfo.vue b/webapp/src/components/PinInfo.vue index de7524b7..1458b4f4 100644 --- a/webapp/src/components/PinInfo.vue +++ b/webapp/src/components/PinInfo.vue @@ -81,7 +81,7 @@ - Display + Display type {{ selectedPinAssignment?.display?.type }} {{ currentPinAssignment?.display?.type }} @@ -107,6 +107,18 @@ {{ currentPinAssignment?.display?.reset }} + + Victron + RX + {{ selectedPinAssignment?.victron?.rx }} + {{ currentPinAssignment?.victron?.rx }} + + + TX + {{ selectedPinAssignment?.victron?.tx }} + {{ currentPinAssignment?.victron?.tx }} + + diff --git a/webapp/src/types/PinMapping.ts b/webapp/src/types/PinMapping.ts index 0445c1f8..e185b0d2 100644 --- a/webapp/src/types/PinMapping.ts +++ b/webapp/src/types/PinMapping.ts @@ -25,11 +25,17 @@ export interface Display { reset: number; } +export interface Victron { + rx: number; + tx: number; +} + export interface Device { name: string; nrf24: Nrf24; eth: Ethernet; display: Display; + victron: Victron; } export interface PinMapping extends Array{} \ No newline at end of file diff --git a/webapp_dist/js/app.js.gz b/webapp_dist/js/app.js.gz index 1aa26ee9..677042a5 100644 Binary files a/webapp_dist/js/app.js.gz and b/webapp_dist/js/app.js.gz differ