Skip to content

Commit 67410de

Browse files
committed
fix: decoder parse_packet not working on buffers not containing exact packets. examples: decoder used on mixed incoming packets and pop_packet test
1 parent a436275 commit 67410de

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

examples/decoder_example/decoder_example.ino

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ void loop() {
7070
}
7171

7272
if (decoder2.packet_incoming()){
73-
Serial.print("packet ready. type: ");
73+
Serial.print("packet incoming. type: ");
7474
Serial.println(decoder2.packet_type());
7575
}
7676

@@ -94,7 +94,71 @@ void loop() {
9494
}
9595

9696
if (decoder3.packet_incoming()){
97-
Serial.print("packet ready. type: ");
97+
Serial.print("packet incoming. type: ");
9898
Serial.println(decoder3.packet_type());
9999
}
100+
101+
// MIXED INCOMING RESPONSE AND REQUEST
102+
blink_before();
103+
packer.clear();
104+
packer.serialize(resp_sz, 1, 1, nil, ret_sz, 3.0, 2);
105+
packer.serialize(req_sz, 0, 1, "method", par_sz, 1.0, 2.0);
106+
107+
DummyTransport dummy_transport4(packer.data(), packer.size());
108+
RpcDecoder<> decoder4(dummy_transport4);
109+
110+
while (!decoder4.packet_incoming()){
111+
decoder4.print_buffer();
112+
Serial.println("Packet not ready");
113+
decoder4.advance();
114+
decoder4.parse_packet();
115+
decoder4.print_buffer();
116+
delay(100);
117+
}
118+
119+
if (decoder4.packet_incoming()){
120+
Serial.print("packet ready. type: ");
121+
Serial.println(decoder4.packet_type());
122+
123+
// as client knows the expected response types/error
124+
MsgPack::arr_size_t r_resp_sz(4);
125+
MsgPack::object::nil_t nil;
126+
int r_type;
127+
int r_msg_id;
128+
MsgPack::arr_size_t r_ret_sz(2);
129+
float r_float;
130+
int r_int;
131+
132+
Serial.print("Total Decoder buf size: ");
133+
Serial.println(decoder4.size());
134+
for (size_t i=1; i<decoder4.size(); i++){
135+
136+
if (decoder4.get_next_packet(unpacker, i)){
137+
138+
if (unpacker.deserialize(r_resp_sz, r_type, r_msg_id)){
139+
// consistency checks
140+
if (unpacker.unpackable(nil)) { // No error case
141+
if (unpacker.deserialize(nil, r_ret_sz, r_float, r_int)){
142+
// do more checks
143+
// fill the response
144+
Serial.print("Full packet decoded size: ");
145+
Serial.println(i);
146+
decoder4.pop_packet(i);
147+
Serial.print("1st Packet popped. Decoder buf size: ");
148+
Serial.println(decoder4.size());
149+
decoder4.print_buffer();
150+
break; //exit the loop
151+
}
152+
} else {
153+
// unpack the error
154+
}
155+
156+
}
157+
158+
}
159+
160+
}
161+
162+
}
163+
100164
}

src/decoder.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class RpcDecoder {
4949

5050
static MsgPack::Unpacker unpacker;
5151
unpacker.clear();
52-
unpacker.feed(_raw_buffer, _bytes_stored);
52+
unpacker.feed(_raw_buffer, 2);
5353

5454
MsgPack::arr_size_t elem_size;
5555
int type;
@@ -94,10 +94,12 @@ class RpcDecoder {
9494

9595
_bytes_stored = remaining_bytes;
9696
_packet_type = NO_MSG;
97-
97+
9898
return size;
9999
}
100100

101+
inline size_t size() const {return _bytes_stored;}
102+
101103
#ifdef DEBUG
102104
void print_buffer(){
103105

0 commit comments

Comments
 (0)