From cd81878e92ecdc6cc3746f2d007a4f4eebf08a2d Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Tue, 28 Jan 2025 23:26:55 +1100 Subject: * added helpers/ArduinoSerialInterface, for the 'companion radio' * .ini, target envs: Heltec_v3_companion_radio_usb & Heltec_v3_companion_radio_ble --- src/helpers/ArduinoSerialInterface.cpp | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/helpers/ArduinoSerialInterface.cpp (limited to 'src/helpers/ArduinoSerialInterface.cpp') 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; +} -- cgit v1.2.3-70-g09d2