Skip to content

Commit 060401f

Browse files
committed
mod: recv_msg in chunks up to buffer capacity
1 parent f0b85ec commit 060401f

File tree

3 files changed

+49
-47
lines changed

3 files changed

+49
-47
lines changed

src/SerialTransport.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,32 @@
88

99
class SerialTransport: public ITransport {
1010

11-
Stream* uart;
11+
Stream* _stream;
1212

1313
public:
1414

15-
SerialTransport(Stream* _uart): uart(_uart){}
15+
SerialTransport(Stream* stream): _stream(stream){}
1616

1717
void begin(){}
1818

1919
size_t write(const uint8_t* data, size_t size) override {
2020

2121
for (size_t i=0; i<size; i++){
22-
uart->write(data[i]);
22+
_stream->write(data[i]);
2323
}
2424

2525
return size;
2626
}
2727

2828
size_t read(uint8_t* buffer, size_t size) override {
29-
29+
3030
size_t r_size = 0;
3131

32-
while (uart->available()){
33-
// if (r_size == size){
34-
// return r_size; // ERROR
35-
// }
36-
buffer[r_size] = uart->read();
32+
while (_stream->available()){
33+
if (r_size == size){
34+
return r_size;
35+
}
36+
buffer[r_size] = _stream->read();
3737
r_size++;
3838
}
3939

src/client.h

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,32 +32,32 @@ class RPCClient {
3232

3333
MsgPack::Unpacker unpacker;
3434

35-
delay(100);
35+
// blocking call
36+
while (!recv_msg(transport, unpacker)){delay(1)};
3637

37-
if (recv_msg(transport, unpacker)) {
38-
39-
int r_msg_type;
40-
int r_msg_id;
41-
MsgPack::object::nil_t error;
38+
int r_msg_type;
39+
int r_msg_id;
40+
MsgPack::object::nil_t error;
4241

43-
MsgPack::arr_size_t resp_size(4);
42+
MsgPack::arr_size_t resp_size(4);
4443

45-
bool ok = unpacker.deserialize(resp_size, r_msg_type, r_msg_id, error, result);
44+
bool ok = unpacker.deserialize(resp_size, r_msg_type, r_msg_id, error, result);
4645

47-
if (!ok){
48-
//Serial.println("could not serialize resp");
49-
return false;
50-
}
46+
if (!ok){
47+
//Serial.println("could not serialize resp");
48+
return false;
49+
}
50+
51+
if (r_msg_id != msg_id){
52+
//Serial.println("msg_id mismatch");
53+
return false;
54+
}
5155

52-
if (r_msg_id != msg_id){
53-
//Serial.println("msg_id mismatch");
54-
return false;
55-
}
56+
msg_id += 1;
5657

57-
msg_id += 1;
58-
return true;
58+
flush_buffer();
59+
return true;
5960

60-
}
6161

6262
return false;
6363
}

src/rpc.h

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
#include "transport.h"
99
#include "MsgPack.h"
1010

11+
#define MAX_BUFFER_SIZE 1024
12+
#define CHUNK_SIZE 64
13+
14+
uint8_t raw_buffer[MAX_BUFFER_SIZE] = {0};
15+
size_t raw_buffer_fill = 0;
16+
1117
inline void send_msg(ITransport& transport, const MsgPack::bin_t<uint8_t>& buffer) {
1218
size_t size = buffer.size();
1319

@@ -23,34 +29,30 @@ inline void send_msg(ITransport& transport, const MsgPack::bin_t<uint8_t>& buffe
2329

2430
inline bool recv_msg(ITransport& transport, MsgPack::Unpacker& unpacker) {
2531

26-
size_t size = 256;
27-
uint8_t raw_buffer[size] = {0};
32+
uint8_t temp_buffer[CHUNK_SIZE] = {0};
2833

29-
int attempts = 0;
30-
31-
size_t bytes_read = 0;
32-
33-
while ((attempts<100) && (bytes_read == 0)) {
34-
bytes_read = transport.read(raw_buffer, size);
35-
attempts++;
36-
delay(10);
37-
}
34+
size_t bytes_read = transport.read(temp_buffer, CHUNK_SIZE);
3835

3936
if (bytes_read == 0){
4037
Serial.println("no bytes received");
4138
return false;
4239
}
4340

44-
unpacker.feed(raw_buffer, bytes_read);
45-
46-
Serial.println("got data");
47-
for (size_t i=0; i<bytes_read; i++){
48-
Serial.print(raw_buffer[i]);
49-
Serial.print(" ");
41+
if (raw_buffer_fill + bytes_read > MAX_BUFFER_SIZE){
42+
// ERROR: trying to recover flushing the buffer
43+
flush_buffer();
44+
return false;
5045
}
51-
Serial.println("");
5246

53-
return true;
47+
memcpy(raw_buffer + raw_buffer_fill, temp_buffer, bytes_read);
48+
raw_buffer_fill += bytes_read;
49+
50+
return unpacker.feed(raw_buffer, raw_buffer_fill);
51+
52+
}
53+
54+
inline void flush_buffer(){
55+
raw_buffer_fill = 0;
5456
}
5557

5658
#endif //RPCLITE_RPC_H

0 commit comments

Comments
 (0)