|
@@ -0,0 +1,122 @@
|
|
|
|
|
+#if NBUS_NODE_TYPE_BRIDGE
|
|
|
|
|
+
|
|
|
|
|
+#include "NbusCommunicatorEsp32.h"
|
|
|
|
|
+
|
|
|
|
|
+NbusCommunicatorEsp32::NbusCommunicatorEsp32(Stream &uartNbus, Stream &uartMaster, uint32_t timeout)
|
|
|
|
|
+: NbusLoopEsp32(uartMaster, timeout), _uart_nbus{uartNbus}, _uart_master{uartMaster}
|
|
|
|
|
+{
|
|
|
|
|
+ NbusLoopEsp32::setData(_data_packet_master_rx, NBUS_COMM_MAX_FRAME_SIZE);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void NbusCommunicatorEsp32::sendToMaster(DataFrame *master_frame)
|
|
|
|
|
+{
|
|
|
|
|
+ if (master_frame == nullptr || master_frame->IsEmpty())
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ _uart_master.write(master_frame->GetFrame(), master_frame->GetLength());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+DataFrame* NbusCommunicatorEsp32::receiveFromMaster()
|
|
|
|
|
+{
|
|
|
|
|
+ int32_t rx_size = NbusLoopEsp32::receiveData();
|
|
|
|
|
+
|
|
|
|
|
+ _packet_master_rx.Init();
|
|
|
|
|
+ _packet_master_rx.FromArray(_data_packet_master_rx, rx_size);
|
|
|
|
|
+ _packet_master_rx.Commit();
|
|
|
|
|
+
|
|
|
|
|
+ return &_packet_master_rx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void NbusCommunicatorEsp32::sendToSlave(DataFrame *slaveFrame)
|
|
|
|
|
+{
|
|
|
|
|
+ setLedOn();
|
|
|
|
|
+ _uart_nbus.write(slaveFrame->GetFrame(), slaveFrame->GetLength());
|
|
|
|
|
+ setLedOff();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+DataFrame* NbusCommunicatorEsp32::sendAndReceiveSlave(DataFrame *slave_frame)
|
|
|
|
|
+{
|
|
|
|
|
+ this->sendToSlave(slave_frame);
|
|
|
|
|
+ return this->receiveFromSlave();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+DataFrame* NbusCommunicatorEsp32::receiveFromSlave()
|
|
|
|
|
+{
|
|
|
|
|
+ int16_t packet_size = 0;
|
|
|
|
|
+ int16_t received_size = 0;
|
|
|
|
|
+ int16_t in_bytes = 0;
|
|
|
|
|
+ //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
|
|
|
|
|
+
|
|
|
|
|
+ // reference time
|
|
|
|
|
+ time_t time0 = millis();
|
|
|
|
|
+
|
|
|
|
|
+ // read packet length
|
|
|
|
|
+ while (packet_size == 0 && millis() - time0 <= NBUS_COMM_UART_RX_TIMEOUT)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (_uart_nbus.available())
|
|
|
|
|
+ {
|
|
|
|
|
+ packet_size = _uart_nbus.read();
|
|
|
|
|
+ _data_packet_slave_rx[received_size++] = packet_size;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // read rest of the packet
|
|
|
|
|
+ while (received_size < packet_size && millis() - time0 <= NBUS_COMM_UART_RX_TIMEOUT)
|
|
|
|
|
+ {
|
|
|
|
|
+ in_bytes = _uart_nbus.available();
|
|
|
|
|
+
|
|
|
|
|
+ if (in_bytes > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ _uart_nbus.readBytes(_data_packet_slave_rx + received_size, in_bytes);
|
|
|
|
|
+ received_size += in_bytes;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _packet_slave_rx.Init();
|
|
|
|
|
+
|
|
|
|
|
+ if (received_size > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ _packet_slave_rx.FromArray(_data_packet_slave_rx, received_size);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
|
|
|
|
|
+
|
|
|
|
|
+ _packet_slave_rx.Commit();
|
|
|
|
|
+ return &_packet_slave_rx;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void NbusCommunicatorEsp32::setLedOn()
|
|
|
|
|
+{
|
|
|
|
|
+#if NBUS_USE_LED
|
|
|
|
|
+ #if NBUS_LED_POLARITY_REVERSED
|
|
|
|
|
+ digitalWrite(NBUS_LED_PIN, LOW);
|
|
|
|
|
+ #else
|
|
|
|
|
+ digitalWrite(NBUS_LED_PIN, HIGH);
|
|
|
|
|
+ #endif // POLARITY
|
|
|
|
|
+#endif // NBUS_USE_LED
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void NbusCommunicatorEsp32::setLedOff()
|
|
|
|
|
+{
|
|
|
|
|
+#if NBUS_USE_LED
|
|
|
|
|
+ #if NBUS_LED_POLARITY_REVERSED
|
|
|
|
|
+ digitalWrite(NBUS_LED_PIN, HIGH);
|
|
|
|
|
+ #else
|
|
|
|
|
+ digitalWrite(NBUS_LED_PIN, LOW);
|
|
|
|
|
+ #endif // POLARITY
|
|
|
|
|
+#endif // NBUS_USE_LED
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void NbusCommunicatorEsp32::toggleLed()
|
|
|
|
|
+{
|
|
|
|
|
+#if NBUS_USE_LED
|
|
|
|
|
+ digitalWrite(NBUS_LED_PIN, !digitalRead(NBUS_LED_PIN));
|
|
|
|
|
+#endif // NBUS_USE_LED
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+uint32_t NbusCommunicatorEsp32::getTime()
|
|
|
|
|
+{
|
|
|
|
|
+ return millis();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+#endif // NBUS_NODE_TYPE
|