-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtinyTransfer.h
More file actions
224 lines (187 loc) · 6.51 KB
/
tinyTransfer.h
File metadata and controls
224 lines (187 loc) · 6.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#pragma once
#define TINY_TRANSFER_UPDATE_SOH 0x4E4C444D
#define TINY_TRANSFER_UPDATE_MAX_PAYLOAD_LENGTH 2048
#define TINY_TRANSFER_UPDATE_MAX_LOG_LENGTH 1024
#define TINY_TRANSFER_RPC_SOH 0x49454D4E
#define TINY_TRANSFER_RPC_MAX_ARGS_SIZE 1024
#define TINY_TRANSFER_UPDATE_FLAGS_COMPRESSED 0x01
#define TINY_TRANSFER_UPDATE_FLAGS_INTEGRATOR_PACK 0x02
#include <initializer_list>
#include <cstdint>
/**
* This is a file for packaging data into packets for transfer over radio / written into FlashLog
* This will grab a serialized data, adding headers and checksums to it
*/
/**
* Checksum algorithm fletcher-16, produces a 2 byte checksum
* @param data Data to be made into a checksum
* @param length Length of input data
*/
uint16_t fletcher16(const uint8_t* data, uint64_t length);
/** Tiny Transfer Update Packet Structure
Header:
0x00: 0x4D 0x44 0x4C 0x4E // Start of Header (SOH)
0x04: uint32_t // Message ID
0x08: uint16_t // Packet flags
0x0A: uint16_t // Payload size (bytes)
0x0C: uint16_t // Payload checksum (fletcher16)
0x0E: uint16_t // Header Checksum (fletcher16)
Payload:
0x10: uint8_t* // Heatshrink compressed cache struct
*/
struct TinyTransferUpdatePacket {
public:
union {
struct {
uint32_t startOfHeader;
uint32_t packetId;
uint16_t packetFlags;
uint16_t payloadSize;
uint16_t payloadChecksum;
uint16_t logSize;
};
struct {
uint8_t header[16];
};
};
uint16_t headerChecksum;
uint8_t payload[TINY_TRANSFER_UPDATE_MAX_PAYLOAD_LENGTH] = {0};
uint8_t log[TINY_TRANSFER_UPDATE_MAX_LOG_LENGTH] = {0};
/**
* Initializes a TinyTransferUpdatePacket object
* @param _data Payload to be put into a packet
* @param _length Length of input payload
* @param _packetId Unique id of packet
* @param _log Data log to be put into object log
* @param _logSize Size of input data log
* @param compressed Whether or not the data is to be compressed
* @param isIntegrator Whether the data is from the integrator
*/
TinyTransferUpdatePacket(uint8_t* payload, uint16_t payloadSize, uint32_t packetId, char* log = NULL, uint16_t logSize = 0, bool compressed = true, bool isIntegrator = false);
TinyTransferUpdatePacket() {
startOfHeader = TINY_TRANSFER_UPDATE_SOH;
packetId = 0;
packetFlags = 0;
payloadSize = 0;
payloadChecksum = 0;
headerChecksum = 0;
logSize = 0;
};
/**
* Checks validity of update packet
* @return Whether a packet is a valid TinyTransferUpdatePacket
*/
bool isValid();
/**
* Packages data into packet structure to be sent
* @param output Input array to receive data in packet format
* @return size of packet
*/
uint16_t serialize(uint8_t* output);
/**
* Check if packet is compressed
* @return Packet compressed
*/
bool isCompressed();
/**
* Decompress given data into output
* @param output Input array to be given decompressed data
* @return Size of decompressed data
*/
uint16_t decompressPayload(uint8_t* output);
};
/** Tiny Transfer RPC Packet Structure
Header:
0x00: 0x4E 0x4D 0x45 0x49 // Start of Header (SOH)
0x04: uint32_t // Packet nonce
0x08: uint16_t // Procedure ID
0x0A: uint16_t // Args size (bytes)
0x0C: uint16_t // Args checksum (fletcher16)
0x0E: uint16_t // Header Checksum (fletcher16)
Payload:
0x10: uint8_t* // Heatshrink compressed args struct
*/
struct TinyTransferRPCPacket {
public:
union {
struct {
uint32_t startOfHeader;
uint32_t packetNonce;
uint16_t procId;
uint16_t procArgsLength;
uint16_t procArgsChecksum;
};
struct {
uint8_t header[14];
};
};
uint16_t headerChecksum;
uint8_t args[TINY_TRANSFER_RPC_MAX_ARGS_SIZE] = {0};
/**
* Initialize RPC packet object, responsible for executing hamster functions remotely (MAEVA)
* @param _data Payload to be made into an RPC packet
*/
TinyTransferRPCPacket(uint8_t* _data);
TinyTransferRPCPacket() {
startOfHeader = TINY_TRANSFER_RPC_SOH;
packetNonce = 0;
procId = 0;
procArgsLength = 0;
procArgsChecksum = 0;
headerChecksum = 0;
};
/**
* Check validity of RPC packet
* @return Whether RPC packet is valid
*/
bool isValid();
/**
* Packages data into packet structure to be sent
* @param output Input array to receive data in packet format
* @return size of packet
*/
uint16_t serialize(uint8_t* output);
};
#define TINY_TRANSFER_PARSER_SEARCHING_FOR_SOH 0
#define TINY_TRANSFER_PARSER_HEADER 1
#define TINY_TRANSFER_PARSER_HEADER_CHECKSUM 2
#define TINY_TRANSFER_PARSER_PAYLOAD 3
#define TINY_TRANSFER_PARSER_LOG 4
struct TinyTransferUpdateParser {
public:
/**
* Initialize Update Parser object
*/
TinyTransferUpdateParser();
/**
* Add a byte to update parser processing
* @param byte Input byte to be processed
* @return Whether or not a valid packet was found
*/
bool processByte(uint8_t);
int state;
uint32_t soh;
TinyTransferUpdatePacket inputPacket;
TinyTransferUpdatePacket completedPacket;
size_t position;
void init();
};
struct TinyTransferRPCParser {
public:
/**
* Initialize RPC Parser object
*/
TinyTransferRPCParser();
/**
* Add a byte to RPC parser processing
* @param byte Input byte to be processed
* @return Whether or not a packet is a valid RPC packet
*/
bool processByte(uint8_t);
int state;
uint32_t soh;
TinyTransferRPCPacket inputPacket;
TinyTransferRPCPacket completedPacket;
size_t position;
void init();
};