diff options
| author | Scott Powell <sqij@protonmail.com> | 2025-01-28 23:26:55 +1100 |
|---|---|---|
| committer | Scott Powell <sqij@protonmail.com> | 2025-01-28 23:26:55 +1100 |
| commit | cd81878e92ecdc6cc3746f2d007a4f4eebf08a2d (patch) | |
| tree | bba93767b79a20a95e58aef5bb6ff37caed68323 /src/helpers/ArduinoSerialInterface.cpp | |
| parent | d9dc76f1979906d1d0f294085fc931603aff170a (diff) | |
* added helpers/ArduinoSerialInterface, for the 'companion radio'
* .ini, target envs: Heltec_v3_companion_radio_usb & Heltec_v3_companion_radio_ble
Diffstat (limited to 'src/helpers/ArduinoSerialInterface.cpp')
| -rw-r--r-- | src/helpers/ArduinoSerialInterface.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/helpers/ArduinoSerialInterface.cpp b/src/helpers/ArduinoSerialInterface.cpp new file mode 100644 index 00000000..ac0bf848 --- /dev/null +++ b/src/helpers/ArduinoSerialInterface.cpp @@ -0,0 +1,66 @@ +#include "ArduinoSerialInterface.h" + +#define RECV_STATE_IDLE 0 +#define RECV_STATE_HDR_FOUND 1 +#define RECV_STATE_LEN_FOUND 2 + +void ArduinoSerialInterface::enable() { + _isEnabled = true; + _state = RECV_STATE_IDLE; +} +void ArduinoSerialInterface::disable() { + _isEnabled = false; +} + +bool ArduinoSerialInterface::isConnected() const { + return true; // no way of knowing, so assume yes +} + +bool ArduinoSerialInterface::isWriteBusy() const { + return false; +} + +size_t ArduinoSerialInterface::writeFrame(const uint8_t src[], size_t len) { + if (len > MAX_FRAME_SIZE) { + // frame is too big! + return 0; + } + + uint8_t hdr[2]; + hdr[0] = '>'; + hdr[1] = len; + _serial->write(hdr, 2); + return _serial->write(src, len); +} + +size_t ArduinoSerialInterface::checkRecvFrame(uint8_t dest[]) { + while (_serial->available()) { + int c = _serial->read(); + if (c < 0) break; + + switch (_state) { + case RECV_STATE_IDLE: + if (c == '<') { + _state = RECV_STATE_HDR_FOUND; + } + break; + case RECV_STATE_HDR_FOUND: + _frame_len = (uint8_t)c; + rx_len = 0; + _state = _frame_len > 0 ? RECV_STATE_LEN_FOUND : RECV_STATE_IDLE; + break; + default: + if (rx_len < MAX_FRAME_SIZE) { + rx_buf[rx_len] = (uint8_t)c; // rest of frame will be discarded if > MAX + } + rx_len++; + if (rx_len >= _frame_len) { // received a complete frame? + if (_frame_len > MAX_FRAME_SIZE) _frame_len = MAX_FRAME_SIZE; // truncate + memcpy(dest, rx_buf, _frame_len); + _state = RECV_STATE_IDLE; // reset state, for next frame + return _frame_len; + } + } + } + return 0; +} |
