|
|
@@ -0,0 +1,89 @@
|
|
|
+#include "nbus_app_driver.h"
|
|
|
+
|
|
|
+NbusAppDriver::NbusAppDriver(Stream *stream_obj, uint8_t *data, int16_t size, int32_t timeout)
|
|
|
+: _stream_obj{stream_obj}, _data{data}, _size{size}, _timeout{timeout}
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void NbusAppDriver::setData(uint8_t *data, int16_t size)
|
|
|
+{
|
|
|
+ _data = data;
|
|
|
+ _size = size;
|
|
|
+}
|
|
|
+
|
|
|
+int16_t NbusAppDriver::receiveFromMaster()
|
|
|
+{
|
|
|
+ // check if timeout elapsed
|
|
|
+ if (_checkTimeout() == 1)
|
|
|
+ {
|
|
|
+ _resetRxState();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // get incoming bytes
|
|
|
+ int32_t in_bytes = _stream_obj->available();
|
|
|
+
|
|
|
+ // check if empty
|
|
|
+ if (in_bytes == 0)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // read length
|
|
|
+ if (_rx_size == 0)
|
|
|
+ {
|
|
|
+ _rx_size = _stream_obj->read();
|
|
|
+
|
|
|
+ // check length size
|
|
|
+ if (_rx_size < NBUS_APP_DRIVER_PAYLOAD_MIN || _rx_size > NBUS_APP_DRIVER_PAYLOAD_MAX)
|
|
|
+ {
|
|
|
+ _resetRxState();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ _time0 = millis();
|
|
|
+ in_bytes--;
|
|
|
+ }
|
|
|
+
|
|
|
+ // read payload
|
|
|
+ if (in_bytes > 0 && _rx_index < _rx_size)
|
|
|
+ {
|
|
|
+ // handle overflow
|
|
|
+ if (in_bytes + _rx_index > _size)
|
|
|
+ {
|
|
|
+ _resetRxState();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ _rx_index += _stream_obj->readBytes(_data + _rx_index, in_bytes);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_rx_index >= _rx_size)
|
|
|
+ {
|
|
|
+ int16_t length = _rx_index;
|
|
|
+ _resetRxState();
|
|
|
+ return length;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+bool NbusAppDriver::_checkTimeout()
|
|
|
+{
|
|
|
+ if (_time0 == INT64_MAX)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return millis() - _time0 > _timeout;
|
|
|
+}
|
|
|
+
|
|
|
+void NbusAppDriver::_resetRxState()
|
|
|
+{
|
|
|
+ _rx_index = 0;
|
|
|
+ _rx_size = 0;
|
|
|
+ _time0 = INT64_MAX;
|
|
|
+}
|