Skip to content

Commit effb162

Browse files
committed
feat: decoder consume with offset. testing: DecoderTester class
1 parent 06b50fa commit effb162

File tree

3 files changed

+79
-14
lines changed

3 files changed

+79
-14
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#pragma once
2+
#ifndef RPCLITE_DECODER_TESTER_H
3+
#define RPCLITE_DECODER_TESTER_H
4+
5+
class DecoderTester {
6+
7+
RpcDecoder<>& decoder;
8+
9+
public:
10+
11+
DecoderTester(RpcDecoder<>& _d): decoder(_d){}
12+
13+
void crop_bytes(size_t size, size_t offset){
14+
decoder.consume(size, offset);
15+
}
16+
17+
void print_raw_buf(){
18+
19+
Serial.print("Decoder raw buffer content: ");
20+
21+
for (size_t i = 0; i < decoder._bytes_stored; i++) {
22+
23+
Serial.print(decoder._raw_buffer[i], HEX);
24+
Serial.print(" ");
25+
}
26+
Serial.println("");
27+
}
28+
29+
};
30+
31+
#endif // RPCLITE_DECODER_TESTER_H

examples/decoder_tests/decoder_tests.ino

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <Arduino_RPClite.h>
22
#include "DummyTransport.h"
3+
#include "decoder_tester.h"
34

45
// Shorthand
56
MsgPack::Packer packer;
@@ -36,6 +37,35 @@ void runDecoderTest(const char* label) {
3637
Serial.println("-- Done --\n");
3738
}
3839

40+
void runDecoderConsumeTest(const char* label, size_t second_packet_sz) {
41+
Serial.println(label);
42+
43+
print_buf();
44+
DummyTransport dummy_transport(packer.data(), packer.size());
45+
RpcDecoder<> decoder(dummy_transport);
46+
47+
DecoderTester dt(decoder);
48+
49+
while (!decoder.packet_incoming()) {
50+
Serial.println("Packet not ready");
51+
decoder.decode();
52+
delay(50);
53+
}
54+
55+
size_t pack_size = decoder.get_packet_size();
56+
Serial.print("1st Packet size: ");
57+
Serial.println(pack_size);
58+
59+
Serial.print("Consuming 2nd packet of given size: ");
60+
Serial.println(second_packet_sz);
61+
62+
dt.crop_bytes(second_packet_sz, pack_size);
63+
64+
dt.print_raw_buf();
65+
66+
Serial.println("-- Done --\n");
67+
}
68+
3969
void testNestedArrayRequest() {
4070
packer.clear();
4171
MsgPack::arr_size_t outer_arr(3);
@@ -120,6 +150,9 @@ void testMultipleRpcPackets() {
120150
packer.serialize(req_sz, 0, 2, "echo", par_sz, "Hello", true);
121151

122152
runDecoderTest("== Test: Multiple RPCs in Buffer ==");
153+
154+
runDecoderConsumeTest("== Test: Mid-buffer consume ==", 5);
155+
123156
}
124157

125158
// Binary parameter (e.g., binary blob)
@@ -170,6 +203,8 @@ void testCombinedComplexBuffer() {
170203

171204
void setup() {
172205
Serial.begin(115200);
206+
while(!Serial);
207+
173208
delay(1000);
174209
Serial.println("=== RPC Decoder Nested Tests ===");
175210

src/decoder.h

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ class RpcDecoder {
151151

152152
inline size_t size() const {return _bytes_stored;}
153153

154+
friend class DecoderTester;
155+
154156
private:
155157
ITransport& _transport;
156158
uint8_t _raw_buffer[BufferSize];
@@ -188,22 +190,19 @@ class RpcDecoder {
188190
_packet_size = 0;
189191
}
190192

191-
size_t consume(size_t size) {
192-
193-
if (size > _bytes_stored) return 0;
194-
195-
const size_t remaining_bytes = _bytes_stored - size;
196-
197-
// Shift remaining data forward (manual memmove for compatibility)
198-
for (size_t i = 0; i < remaining_bytes; i++) {
199-
_raw_buffer[i] = _raw_buffer[size + i];
200-
}
201-
202-
_bytes_stored = remaining_bytes;
203-
204-
return size;
193+
size_t consume(size_t size, size_t offset = 0) {
194+
// Boundary checks
195+
if (offset + size >= _bytes_stored || size == 0) return 0;
196+
197+
size_t remaining_bytes = _bytes_stored - size;
198+
for (size_t i=offset; i<remaining_bytes; i++){
199+
_raw_buffer[i] = _raw_buffer[i+size];
205200
}
206201

202+
_bytes_stored = remaining_bytes;
203+
return size;
204+
}
205+
207206
};
208207

209208
#endif

0 commit comments

Comments
 (0)