| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #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;
- }
|