Skip to content

Commit 2d33a66

Browse files
committed
improve input buffer validity and cleaning
1 parent b9e0466 commit 2d33a66

File tree

8 files changed

+27
-6
lines changed

8 files changed

+27
-6
lines changed

src/ConfiguratorAgents/agents/BLE/BLEAgent.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ ConfiguratorAgent::AgentConfiguratorStates BLEAgentClass::poll() {
110110
}
111111
break;
112112
case BLEEvent::DISCONNECTED:
113-
_inputStreamCharacteristic.writeValue("");
113+
clearInputBuffer();
114114
clear();
115115
_state = AgentConfiguratorStates::INIT;
116116
break;
@@ -190,15 +190,16 @@ int BLEAgentClass::writeBytes(const uint8_t *data, size_t len) {
190190
void BLEAgentClass::handleDisconnectRequest() {
191191
}
192192

193+
void BLEAgentClass::clearInputBuffer() {
194+
// clear the input buffer
195+
_inputStreamCharacteristic.writeValue("");
196+
}
197+
193198
ConfiguratorAgent::AgentConfiguratorStates BLEAgentClass::handlePeerConnected() {
194199
AgentConfiguratorStates nextState = _state;
195200

196201
TransmissionResult res = sendAndReceive();
197202
switch (res) {
198-
case TransmissionResult::INVALID_DATA:
199-
// clear the input buffer
200-
_inputStreamCharacteristic.writeValue("");
201-
break;
202203
case TransmissionResult::PEER_NOT_AVAILABLE:
203204
disconnectPeer();
204205
nextState = AgentConfiguratorStates::INIT;
@@ -246,7 +247,7 @@ bool BLEAgentClass::setManufacturerData() {
246247

247248

248249
void BLEAgentClass::disconnectPeer() {
249-
_inputStreamCharacteristic.writeValue("");
250+
clearInputBuffer();
250251
uint32_t start = millis();
251252
BLE.disconnect();
252253
do {

src/ConfiguratorAgents/agents/BLE/BLEAgent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class BLEAgentClass : public ConfiguratorAgent, BoardConfigurationProtocol {
5656
uint8_t readByte();
5757
int writeBytes(const uint8_t *data, size_t len);
5858
void handleDisconnectRequest();
59+
void clearInputBuffer();
5960
};
6061

6162
extern BLEAgentClass BLEAgent;

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ BoardConfigurationProtocol::TransmissionResult BoardConfigurationProtocol::sendA
115115
if (res == PacketManager::ReceivingState::ERROR) {
116116
DEBUG_DEBUG("BoardConfigurationProtocol::%s Error receiving packet", __FUNCTION__);
117117
sendNak();
118+
clearInputBuffer();
118119
transmissionRes = TransmissionResult::INVALID_DATA;
119120
break;
120121
} else if (res == PacketManager::ReceivingState::RECEIVED) {

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class BoardConfigurationProtocol {
3535
virtual int writeBytes(const uint8_t *data, size_t len) = 0;
3636
virtual void handleDisconnectRequest() = 0;
3737
virtual bool isPeerConnected() = 0;
38+
virtual void clearInputBuffer() = 0;
3839

3940
private:
4041
bool sendStatus(StatusMessage msg);

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/PacketManager.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ uint8_t PACKET_END[] = { 0xaa, 0x55 };
2525
#define CRC16_FINAL_XOR_VALUE 0xffff
2626
#define CRC16_REFLECT_DATA true
2727
#define CRC16_REFLECT_RESULT true
28+
#define BYTES_VALIDITY_MS 10000
2829

2930
bool PacketManager::createPacket(OutputPacketBuffer &outputMsg, MessageType type, const uint8_t *data, size_t len) {
3031
uint16_t packetLen = len + PACKET_HEADERS_OVERHEAD;
@@ -61,6 +62,12 @@ PacketManager::ReceivingState PacketManager::handleReceivedByte(ReceivedData &re
6162
_state = ReceivingState::WAITING_HEADER;
6263
}
6364

65+
if (millis() - _lastByteReceivedTs > BYTES_VALIDITY_MS) {
66+
clearInputBuffers();
67+
}
68+
69+
_lastByteReceivedTs = millis();
70+
6471
switch (_state) {
6572
case ReceivingState::WAITING_HEADER: _state = handle_WaitingHeader (byte); break;
6673
case ReceivingState::WAITING_PAYLOAD: _state = handle_WaitingPayload(byte); break;
@@ -89,6 +96,7 @@ void PacketManager::clear() {
8996
}
9097

9198
void PacketManager::clearInputBuffers() {
99+
_lastByteReceivedTs = 0;
92100
_tempInputMessageHeader.clear();
93101
_tempInputMessagePayload.reset();
94102
_tempInputMessageEnd.clear();

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/PacketManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class PacketManager {
3333
InputPacketBuffer _tempInputMessageHeader;
3434
InputPacketBuffer _tempInputMessagePayload;
3535
InputPacketBuffer _tempInputMessageEnd;
36+
uint32_t _lastByteReceivedTs = 0;
3637

3738
ReceivingState handle_WaitingHeader(uint8_t byte);
3839
ReceivingState handle_WaitingPayload(uint8_t byte);

src/ConfiguratorAgents/agents/Serial/SerialAgent.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ ConfiguratorAgent::AgentConfiguratorStates SerialAgentClass::handleInit() {
9696
} else if (res == PacketManager::ReceivingState::ERROR) {
9797
DEBUG_DEBUG("SerialAgentClass::%s Error receiving packet", __FUNCTION__);
9898
Packet.clear();
99+
clearInputBuffer();
99100
}
100101
}
101102
}
@@ -143,4 +144,10 @@ void SerialAgentClass::handleDisconnectRequest() {
143144
_disconnectRequest = true;
144145
}
145146

147+
void SerialAgentClass::clearInputBuffer() {
148+
while (Serial.available()) {
149+
Serial.read();
150+
}
151+
}
152+
146153
SerialAgentClass SerialAgent;

src/ConfiguratorAgents/agents/Serial/SerialAgent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class SerialAgentClass : public ConfiguratorAgent, BoardConfigurationProtocol {
3939
uint8_t readByte();
4040
int writeBytes(const uint8_t *data, size_t len);
4141
void handleDisconnectRequest();
42+
void clearInputBuffer();
4243
};
4344

4445
extern SerialAgentClass SerialAgent;

0 commit comments

Comments
 (0)