Skip to content

Commit 76f6514

Browse files
author
Richard Unger
committed
making TextIO more robust to bad input
1 parent d5748ec commit 76f6514

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

src/comms/streams/PacketCommander.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,32 @@ void PacketCommander::run() {
3939
handleRegisterPacket(!_io->is_complete(), curRegister);
4040
lastcommanderror = commanderror;
4141
lastcommandregister = curRegister;
42+
if (commanderror) {
43+
_io->in_sync = false;
44+
//*_io << START_PACKET(PacketType::ALERT, 1) << '?' << END_PACKET;
45+
}
4246
}
4347
else if (curr_packet.type == PacketType::SYNC) {
4448
*_io << START_PACKET(PacketType::SYNC, 1);
4549
*_io << (uint8_t)0x01;
4650
*_io << END_PACKET;
4751
// TODO flush packet
4852
}
49-
else
50-
_io->in_sync = false; // TODO flag in another way?
53+
else {
54+
_io->in_sync = false; // TODO it would be better just to reset the buffer, since we just saw a newline
55+
}
5156

5257
if (! _io->is_complete())
5358
_io->in_sync = false;
5459
}
5560
};
5661

5762

63+
5864
void PacketCommander::handleRegisterPacket(bool write, uint8_t reg) {
5965
if (write) {
6066
bool ok = commsToRegister(reg);
61-
commanderror = commanderror && !ok;
67+
commanderror = commanderror || !ok;
6268
}
6369
if (!write || echo) {
6470
uint8_t size = SimpleFOCRegisters::regs->sizeOfRegister(reg);
@@ -70,7 +76,7 @@ void PacketCommander::handleRegisterPacket(bool write, uint8_t reg) {
7076
// TODO flush packet
7177
}
7278
}
73-
}
79+
};
7480

7581

7682

@@ -87,23 +93,22 @@ bool PacketCommander::commsToRegister(uint8_t reg){
8793
default:
8894
return SimpleFOCRegisters::regs->commsToRegister(*_io, reg, motors[curMotor]);
8995
}
90-
}
96+
};
9197

9298

9399

94100
bool PacketCommander::registerToComms(uint8_t reg){
95101
switch (reg) {
96-
case REG_STATUS:
102+
case SimpleFOCRegister::REG_STATUS:
97103
// TODO implement status register
98104
return true;
99-
case REG_MOTOR_ADDRESS:
105+
case SimpleFOCRegister::REG_MOTOR_ADDRESS:
100106
*_io << curMotor;
101107
return true;
102-
case REG_NUM_MOTORS:
108+
case SimpleFOCRegister::REG_NUM_MOTORS:
103109
*_io << numMotors;
104110
return true;
105111
default:
106112
return SimpleFOCRegisters::regs->registerToComms(*_io, reg, motors[curMotor]);
107113
}
108-
}
109-
114+
};

src/comms/streams/TextIO.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ uint32_t TextIO::intFromBuffer() {
9090
}
9191
}
9292
return value;
93-
}
93+
};
9494

9595

9696
TextIO& TextIO::operator>>(float &value) {
@@ -150,7 +150,8 @@ TextIO& TextIO::operator>>(uint8_t &value) {
150150

151151
TextIO& TextIO::operator>>(Packet &value) {
152152
while (!in_sync && _io.available() > 0) {
153-
if (_io.read() == '\n') {
153+
char skip = _io.read();
154+
if (skip == '\n' || skip == '\r') {
154155
in_sync = true;
155156
buffer_len = 0;
156157
}
@@ -159,13 +160,16 @@ TextIO& TextIO::operator>>(Packet &value) {
159160
buffer_len = 0;
160161
buffer_index = 0;
161162
}
162-
while (in_sync && _io.available()>0) {
163+
int avail = _io.available();
164+
while (in_sync && avail>0) {
163165
uint8_t peek = _io.peek();
164166
if (peek == '\n' || peek == '\r') {
165167
// skip newlines and carriage returns
166-
while (_io.available()>0 && (peek == '\n' || peek == '\r')) {
168+
while (avail>0 && (peek == '\n' || peek == '\r')) {
167169
_io.read(); // discard the \n
168-
peek = _io.peek();
170+
avail = _io.available();
171+
if (avail>0)
172+
peek = _io.peek();
169173
}
170174
if (buffer_len>1) {
171175
value.type = buffer[0];
@@ -174,10 +178,14 @@ TextIO& TextIO::operator>>(Packet &value) {
174178
buffer_index = 1;
175179
return *this;
176180
}
181+
else
182+
buffer_len = 0;
177183
}
178184
else {
179-
if (buffer_len < SIMPLEFOC_TEXTIO_BUFFER_SIZE)
185+
if (buffer_len < SIMPLEFOC_TEXTIO_BUFFER_SIZE) {
180186
buffer[buffer_len++] = _io.read();
187+
avail = _io.available();
188+
}
181189
else {
182190
buffer_len = 0;
183191
in_sync = false;

0 commit comments

Comments
 (0)