Skip to content

Commit f6e123a

Browse files
committed
initial radio protocol with checksum
1 parent 0001211 commit f6e123a

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

lib/data/Coder.h

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#pragma once
2+
3+
#include <cstring> // for memcpy
4+
5+
typedef struct {
6+
float f1;
7+
float f2;
8+
float f3;
9+
char c1;
10+
} placeholder;
11+
12+
// easy to change which struct is being encoded/decoded
13+
#define CODE_T placeholder
14+
15+
// can change to char, short, int, long etc for different reliability/length tradeoffs
16+
#define CSUM_T int
17+
18+
namespace Coder {
19+
int get_packet_size() { // todo: when i tried size_t for ret type it told me i needed to include stddef.h
20+
return sizeof(CODE_T) + sizeof(CSUM_T);
21+
}
22+
23+
// encodes into buffer. buffer should be get_packet_size() bytes long.
24+
void encode_packet(const CODE_T &data, char *buffer) {
25+
memcpy(buffer, &data, sizeof(CODE_T));
26+
27+
CSUM_T csum = 0;
28+
const char *data_bytes = (const char *)&data;
29+
for (size_t i = 0; i < sizeof(CODE_T); i++) {
30+
csum += data_bytes[i];
31+
}
32+
33+
memcpy(buffer + sizeof(CODE_T), &csum, sizeof(CSUM_T));
34+
}
35+
36+
// decodes into data. buffer should be get_packet_size() bytes long.
37+
bool decode_packet(const char *buffer, CODE_T &data) {
38+
CSUM_T received_csum;
39+
memcpy(&received_csum, buffer + sizeof(CODE_T), sizeof(CSUM_T));
40+
41+
memcpy(&data, buffer, sizeof(CODE_T));
42+
43+
CSUM_T csum = 0;
44+
const char *data_bytes = (const char *)&data;
45+
for (size_t i = 0; i < sizeof(CODE_T); i++) {
46+
csum += data_bytes[i];
47+
}
48+
49+
return received_csum == csum;
50+
}
51+
52+
bool test() {
53+
CODE_T original;
54+
original.f1 = 1.23f;
55+
original.f2 = 4.56f;
56+
original.f3 = 7.89f;
57+
original.c1 = 'A';
58+
59+
const int packet_size = get_packet_size();
60+
char *buffer = new char[packet_size];
61+
62+
encode_packet(original, buffer);
63+
64+
CODE_T decoded;
65+
bool success = decode_packet(buffer, decoded) && (original.f1 == decoded.f1) && (original.f2 == decoded.f2) && (original.f3 == decoded.f3) && (original.c1 == decoded.c1);
66+
67+
buffer[3]++; // corrupt.
68+
bool fail_detected = !decode_packet(buffer, decoded);
69+
return success && fail_detected;
70+
}
71+
72+
} // namespace Coder

src/main.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include "Coder.h"
12
#include "GPS.h"
23
#include "IMU.h"
34
#include "Mag.h"
@@ -14,6 +15,14 @@ void ping(const char *args) {
1415
Router::println(args == nullptr ? "null" : args);
1516
}
1617

18+
void test_coder() {
19+
if (Coder::test()) {
20+
Router::println("Coder test passed.");
21+
} else {
22+
Router::println("Coder test failed.");
23+
}
24+
}
25+
1726
void setup() {
1827
delay(3000);
1928
SPI.begin(); // spi is a shared interface, so we always begin here
@@ -30,6 +39,7 @@ void setup() {
3039

3140
Router::add({ping, "ping"}); // example registration
3241
Router::add({Router::print_all_cmds, "help"});
42+
Router::add({test_coder, "test_coder"});
3343
}
3444

3545
void loop() {

0 commit comments

Comments
 (0)