Razorbotz RMC 2021-2022 Documentation
Loading...
Searching...
No Matches
BinaryMessage.hpp
1#pragma once
2#include <string>
3#include <list>
4#include <utility>
5#include <memory>
6#include <vector>
7#include <cstdarg>
8#include <string>
9
10enum TYPE {
11 OBJECT = 0,
12 BOOLEAN = 1,
13 CHARACTER = 2,
14 INT8 = 3,
15 INT16 = 4,
16 INT32 = 5,
17 INT64 = 6,
18 UINT8 = 7,
19 UINT16 = 8,
20 UINT32 = 9,
21 UINT64 = 10,
22 FLOAT32 = 11,
23 FLOAT64 = 12,
24 STRING = 13,
25 ARRAYBOOLEAN = 14,
26 ARRAYCHARACTER = 15,
27 ARRAYINT8 = 16,
28 ARRAYINT16 = 17,
29 ARRAYINT32 = 18,
30 ARRAYINT64 = 19,
31 ARRAYUINT8 = 20,
32 ARRAYUINT16 = 21,
33 ARRAYUINT32 = 22,
34 ARRAYUINT64 = 23,
35 ARRAYFLOAT32 = 24,
36 ARRAYFLOAT64 = 25
37};
38
39union Data{
40 bool boolean;
41 char character;
42 int8_t int8;
43 int16_t int16;
44 int32_t int32;
45 int64_t int64;
46 uint8_t uint8;
47 uint16_t uint16;
48 uint32_t uint32;
49 uint64_t uint64;
50 float float32;
51 double float64;
52};
53
54struct Element{
55
56 Element(std::string label, std::list<Data> data, uint8_t type);
57 Element(std::string label, std::list<Data> data, uint8_t type, size_t dimensionCount, ...);
58 Element(std::string label, std::list<Data> data, uint8_t type, size_t dimensionCount, std::vector<size_t> sizeList);
59// Element(std::string label, std::list<Data> data, uint8_t type){
60// this->label = std::move(label);
61// this->type = type;
62// this->dimensionCount = 1;
63// this->sizeList.push_back(1);
64// this->data = std::move(data);
65// }
66// Element(std::string label, std::list<Data> data, uint8_t type, size_t dimensionCount, ...){
67// this->label = std::move(label);
68// this->data = std::move(data);
69// this->type = type;
70//
71// this->dimensionCount = dimensionCount;
72// va_list va;
73// va_start(va, dimensionCount);
74// for(int index=0; index < dimensionCount; index++){
75// size_t x=va_arg(va, size_t);
76// this->sizeList.push_back(x);
77// }
78// va_end(va);
79// }
80// Element(std::string label, std::list<Data> data, uint8_t type, size_t dimensionCount, std::vector<size_t> sizeList){
81// this->label = std::move(label);
82// this->data = std::move(data);
83// this->type = type;
84// this->dimensionCount = dimensionCount;
85// this->sizeList = std::move(sizeList);
86// }
87 std::string label;
88 uint8_t type;
89 size_t dimensionCount;
90 std::vector<size_t> sizeList;
91 std::list<Data> data;
92
93 void print();
94};
95
96struct Object{
97 std::string label;
98 uint8_t type;
99 std::vector<Element> elementList;
100 std::vector<Object> children;
101
102 void print();
103};
104
105class BinaryMessage {
106
107 Object topObject;
108
109public:
110 BinaryMessage(std::string label);
111 BinaryMessage(std::list<uint8_t>& bytes);
112 void print();
113 void printObject(Object object);
114 void printElement(Element element);
115
116 std::string getLabel();
117 Object getObject();
118
119 static bool hasSize(std::list<uint8_t>& message);
120 static bool hasMessage(std::list<uint8_t>& message);
121 static uint64_t decodeSizeBytes(std::list<uint8_t>& bytes);
122 uint64_t decodeSizeBytes(std::list<uint8_t>::iterator& currentByte);
123 std::string decodeLabel(std::list<uint8_t>::iterator& currentByte);
124 Object decodeObject(std::list<uint8_t>::iterator& currentByte);
125 Element decodeElement(std::list<uint8_t>::iterator& currentByte);
126 uint8_t decodeType(std::list<uint8_t>::iterator& currentByte);
127
128 std::list<uint8_t> encodeSizeBytes(uint64_t number);
129 void encodeSizeBytes(std::shared_ptr<std::list<uint8_t>>bytes, uint64_t number);
130 void encodeMessageSizeBytes(std::shared_ptr<std::list<uint8_t>> bytes);
131 void addElementBoolean(std::string label, bool boolean);
132 void addElementCharacter(std::string label, char character);
133 void addElementInt8(std::string label, int8_t int8);
134 void addElementInt16(std::string label, int16_t int16);
135 void addElementInt32(std::string label, int32_t int32);
136 void addElementInt64(std::string label, int64_t int64);
137 void addElementUInt8(std::string label, uint8_t uint8);
138 void addElementUInt16(std::string label, uint16_t uint16);
139 void addElementUInt32(std::string label, uint32_t uint32);
140 void addElementUInt64(std::string label, uint64_t uint64);
141 void addElementFloat32(std::string label, float float32);
142 void addElementFloat64(std::string label, double float64);
143 void addElementString(std::string label, std::string string);
144 void addElementBooleanArray(std::string label, std::vector<bool> booleanList, size_t dimensionCount, std::vector<size_t> sizeList);
145 void addElementCharacterArray(std::string label, std::vector<char> characterList, size_t dimensionCount, std::vector<size_t> sizeList);
146 void addElementInt8Array(std::string label, std::vector<int8_t> int8List, size_t dimensionCount, std::vector<size_t> sizeList);
147 void addElementInt16Array(std::string label, std::vector<int16_t> int16List, size_t dimensionCount, std::vector<size_t> sizeList);
148 void addElementInt32Array(std::string label, std::vector<int32_t> int32List, size_t dimensionCount, std::vector<size_t> sizeList);
149 void addElementInt64Array(std::string label, std::vector<int64_t> int64List, size_t dimensionCount, std::vector<size_t> sizeList);
150 void addElementUInt8Array(std::string label, std::vector<uint8_t> uint8List, size_t dimensionCount, std::vector<size_t> sizeList);
151 void addElementUInt16Array(std::string label, std::vector<uint16_t> uint16List, size_t dimensionCount, std::vector<size_t> sizeList);
152 void addElementUInt32Array(std::string label, std::vector<uint32_t> uint32List, size_t dimensionCount, std::vector<size_t> sizeList);
153 void addElementUInt64Array(std::string label, std::vector<uint64_t> uint64List, size_t dimensionCount, std::vector<size_t> sizeList);
154 void addElementFloat32Array(std::string label, std::vector<float> floatList, size_t dimensionCount, std::vector<size_t> sizeList);
155 void addElementFloat64Array(std::string label, std::vector<double> doubleList, size_t dimensionCount, std::vector<size_t> sizeList);
156 void addChild(Object childObject);
157
158 void addElementBoolean(Object& object, std::string label, bool boolean);
159 void addElementCharacter(Object& object, std::string label, char character);
160 void addElementInt8(Object& object, std::string label, int8_t int8);
161 void addElementInt16(Object& object, std::string label, int16_t int16);
162 void addElementInt32(Object& object, std::string label, int32_t int32);
163 void addElementInt64(Object& object, std::string label, int64_t int64);
164 void addElementUInt8(Object& object, std::string label, uint8_t uint8);
165 void addElementUInt16(Object& object, std::string label, uint16_t uint16);
166 void addElementUInt32(Object& object, std::string label, uint32_t uint32);
167 void addElementUInt64(Object& object, std::string label, uint64_t uint64);
168 void addElementFloat32(Object& object, std::string label, float float32);
169 void addElementFloat64(Object& object, std::string label, double float64);
170 void addElementString(Object& object, std::string label, std::string string);
171 void addElementBooleanArray(Object& object, std::string label, std::vector<bool> booleanList, size_t dimensionCount, std::vector<size_t> sizeList);
172 void addElementCharacterArray(Object& object, std::string label, std::vector<char> booleanList, size_t dimensionCount, std::vector<size_t> sizeList);
173 void addElementInt8Array(Object& object, std::string label, std::vector<int8_t> int8List, size_t dimensionCount, std::vector<size_t> sizeList);
174 void addElementInt16Array(Object& object, std::string label, std::vector<int16_t> int16List, size_t dimensionCount, std::vector<size_t> sizeList);
175 void addElementInt32Array(Object& object, std::string label, std::vector<int32_t> int32List, size_t dimensionCount, std::vector<size_t> sizeList);
176 void addElementInt64Array(Object& object, std::string label, std::vector<int64_t> int64List, size_t dimensionCount, std::vector<size_t> sizeList);
177 void addElementUInt8Array(Object& object, std::string label, std::vector<uint8_t> uint8List, size_t dimensionCount, std::vector<size_t> sizeList);
178 void addElementUInt16Array(Object& object, std::string label, std::vector<uint16_t> uint16List, size_t dimensionCount, std::vector<size_t> sizeList);
179 void addElementUInt32Array(Object& object, std::string label, std::vector<uint32_t> uint32List, size_t dimensionCount, std::vector<size_t> sizeList);
180 void addElementUInt64Array(Object& object, std::string label, std::vector<uint64_t> uint64List, size_t dimensionCount, std::vector<size_t> sizeList);
181 void addElementFloat32Array(Object& object, std::string label, std::vector<float> floatList, size_t dimensionCount, std::vector<size_t> sizeList);
182 void addElementFloat64Array(Object& object, std::string label, std::vector<double> doubleList, size_t dimensionCount, std::vector<size_t> sizeList);
183 void addChild(Object& object, Object childObject);
184
185 void encodeBytes(std::shared_ptr<std::list<uint8_t>> bytes, Object object);
186 void encodeBytes(std::shared_ptr<std::list<uint8_t>> bytes, Element element);
187 void encodeLabelBytes(std::shared_ptr<std::list<uint8_t>> bytes, std::string label);
188 void addSizeBytes(std::shared_ptr<std::list<uint8_t>> bytes, uint64_t size);
189
190 std::shared_ptr<std::list<uint8_t>> getBytes();
191
192 //Object getObject();
193};
194
195
void encodeLabelBytes(std::shared_ptr< std::list< uint8_t > > bytes, std::string label)
Encodes the label of an object or element (strings)
Definition BinaryMessage.cpp:1540
void encodeBytes(std::shared_ptr< std::list< uint8_t > > bytes, Object object)
Encodes an object struct into a list of bytes.
Definition BinaryMessage.cpp:1579
void addSizeBytes(std::shared_ptr< std::list< uint8_t > > bytes, uint64_t size)
Returns a list of bytes that represent the size.
Definition BinaryMessage.cpp:1500
Definition BinaryMessage.hpp:54
Definition BinaryMessage.hpp:96
Definition BinaryMessage.hpp:39