-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathSPANParser.h
94 lines (85 loc) · 2.49 KB
/
SPANParser.h
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
// The parser with callback
#ifndef SPAN_PARSER_H
#define SPAN_PARSER_H
#include <functional>
#include <map>
#include <string>
#include <vector>
#include "SPANHeader.h"
namespace SPAN {
struct BESTSATS;
class Parser {
// Finite-state machine
enum struct ParseState {
IDLE,
Abbreviated,
ASCIIHeader,
ShortASCIIHeader,
ASCIIData,
ASCIICRC,
BinaryHeader,
ShortBinaryHeader,
BinaryData,
BinaryCRC
};
// The allowed data types.
// Short*** supported after OEM6
enum struct DataType {
Unknown,
Abbreviated,
ASCII,
ShortASCII,
Binary,
ShortBinary
};
public:
Parser();
~Parser();
// Register callbacks. Callbacks will be called blocking when the message is
// parsed.
#pragma region
template <typename T>
void RegisterCallback(std::function<void(const T*)> callback,
MessageID messageID);
void RegisterAbbreviatedCallback(
std::function<void(std::string)> abbreviatedCallback);
#pragma endregion
// get the message buf
void push(std::string buf);
private:
DataType dataType;
ParseState parseState;
std::map<MessageID, void*> callbacksType;
std::map<MessageID, void*> callbacks;
std::map<MessageID, void*> releaseCallbacks;
std::function<void(std::string)> abbreviatedCallback;
std::string msg;
uint32_t messageLength;
};
template <typename T>
void Parser::RegisterCallback(std::function<void(const T*)> callback,
MessageID messageID) {
if (callbacks[messageID] != nullptr) {
delete (std::function<void(const T*)>*)callbacks[messageID];
}
auto* newCallback = new std::function<void(const T*)>(
[callback](const T* msg) -> void { callback(msg); });
callbacks[messageID] = newCallback;
// std::swap(callback,callbacks[messageID]);
if (callbacksType[messageID] == nullptr) {
callbacksType[messageID] = new T();
}
if (releaseCallbacks[messageID] == nullptr) {
releaseCallbacks[messageID] =
new std::function<void()>([&, messageID]() -> void {
if (callbacksType[messageID] != nullptr) {
delete (T*)callbacksType[messageID];
}
if (callbacks[messageID] != nullptr) {
delete (std::function<void(const T*)>*)callbacks[messageID];
}
});
}
};
} // namespace SPAN
#endif