mirror of https://github.com/meshcore-dev/MeshCore
Browse Source
* .ini, target envs: Heltec_v3_companion_radio_usb & Heltec_v3_companion_radio_blepull/10/head
4 changed files with 125 additions and 16 deletions
@ -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; |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
#pragma once |
|||
|
|||
#include "BaseSerialInterface.h" |
|||
#include <Arduino.h> |
|||
|
|||
class ArduinoSerialInterface : public BaseSerialInterface { |
|||
bool _isEnabled; |
|||
uint8_t _state; |
|||
uint8_t _frame_len; |
|||
uint8_t rx_len; |
|||
HardwareSerial* _serial; |
|||
uint8_t rx_buf[MAX_FRAME_SIZE]; |
|||
|
|||
public: |
|||
ArduinoSerialInterface() { _isEnabled = false; _state = 0; } |
|||
|
|||
void begin(HardwareSerial& serial) { _serial = &serial; } |
|||
|
|||
// BaseSerialInterface methods
|
|||
void enable() override; |
|||
void disable() override; |
|||
bool isEnabled() const override { return _isEnabled; } |
|||
|
|||
bool isConnected() const override; |
|||
|
|||
bool isWriteBusy() const override; |
|||
size_t writeFrame(const uint8_t src[], size_t len) override; |
|||
size_t checkRecvFrame(uint8_t dest[]) override; |
|||
}; |
|||
Loading…
Reference in new issue