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