nbus_app_driver.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "nbus_app_driver.h"
  2. NbusAppDriver::NbusAppDriver(Stream *stream_obj, uint8_t *data, int16_t size, int32_t timeout)
  3. : _stream_obj{stream_obj}, _data{data}, _size{size}, _timeout{timeout}
  4. {
  5. }
  6. void NbusAppDriver::setData(uint8_t *data, int16_t size)
  7. {
  8. _data = data;
  9. _size = size;
  10. }
  11. int16_t NbusAppDriver::receiveFromMaster()
  12. {
  13. // check if timeout elapsed
  14. if (_checkTimeout() == 1)
  15. {
  16. _resetRxState();
  17. return 0;
  18. }
  19. // get incoming bytes
  20. int32_t in_bytes = _stream_obj->available();
  21. // check if empty
  22. if (in_bytes == 0)
  23. {
  24. return 0;
  25. }
  26. // read length
  27. if (_rx_size == 0)
  28. {
  29. _rx_size = _stream_obj->read();
  30. // check length size
  31. if (_rx_size < NBUS_APP_DRIVER_PAYLOAD_MIN || _rx_size > NBUS_APP_DRIVER_PAYLOAD_MAX)
  32. {
  33. _resetRxState();
  34. return 0;
  35. }
  36. _time0 = millis();
  37. in_bytes--;
  38. }
  39. // read payload
  40. if (in_bytes > 0 && _rx_index < _rx_size)
  41. {
  42. // handle overflow
  43. if (in_bytes + _rx_index > _size)
  44. {
  45. _resetRxState();
  46. return 0;
  47. }
  48. _rx_index += _stream_obj->readBytes(_data + _rx_index, in_bytes);
  49. }
  50. if (_rx_index >= _rx_size)
  51. {
  52. int16_t length = _rx_index;
  53. _resetRxState();
  54. return length;
  55. }
  56. else
  57. {
  58. return 0;
  59. }
  60. }
  61. bool NbusAppDriver::_checkTimeout()
  62. {
  63. if (_time0 == INT64_MAX)
  64. {
  65. return 0;
  66. }
  67. return millis() - _time0 > _timeout;
  68. }
  69. void NbusAppDriver::_resetRxState()
  70. {
  71. _rx_index = 0;
  72. _rx_size = 0;
  73. _time0 = INT64_MAX;
  74. }