-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeviceCommand.h
More file actions
128 lines (109 loc) · 2.31 KB
/
DeviceCommand.h
File metadata and controls
128 lines (109 loc) · 2.31 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
#ifndef REMOTE_DEVICE_COMMAND_H
#define REMOTE_DEVICE_COMMAND_H
#include <cstdint>
#include <cstdlib>
#include <cstring>
namespace remote
{
enum class DeviceCommandType
{
None,
SetBrightness,
};
struct DeviceCommand
{
uint32_t id = 0;
DeviceCommandType type = DeviceCommandType::None;
uint8_t value = 0;
bool persist = false;
};
inline const char *findJsonField(const char *json, const char *field)
{
return json == nullptr ? nullptr : std::strstr(json, field);
}
inline bool parseJsonUnsigned(const char *json, const char *field, uint32_t &out)
{
const char *found = findJsonField(json, field);
if (found == nullptr)
{
return false;
}
const char *colon = std::strchr(found, ':');
if (colon == nullptr)
{
return false;
}
char *end = nullptr;
const unsigned long value = std::strtoul(colon + 1, &end, 10);
if (end == colon + 1)
{
return false;
}
out = static_cast<uint32_t>(value);
return true;
}
inline bool parseJsonBool(const char *json, const char *field, bool &out)
{
const char *found = findJsonField(json, field);
if (found == nullptr)
{
return false;
}
const char *colon = std::strchr(found, ':');
if (colon == nullptr)
{
return false;
}
const char *value = colon + 1;
while (*value == ' ')
{
++value;
}
if (std::strncmp(value, "true", 4) == 0)
{
out = true;
return true;
}
if (std::strncmp(value, "false", 5) == 0)
{
out = false;
return true;
}
return false;
}
inline bool parseDeviceCommand(const char *json, DeviceCommand &out)
{
if (json == nullptr)
{
return false;
}
const char *typeField = findJsonField(json, "\"type\"");
if (typeField == nullptr)
{
return false;
}
const char *typeValue = std::strstr(typeField, "\"set_brightness\"");
if (typeValue == nullptr)
{
return false;
}
uint32_t id = 0;
uint32_t value = 0;
bool persist = false;
if (!parseJsonUnsigned(json, "\"id\"", id) || !parseJsonUnsigned(json, "\"value\"", value) ||
!parseJsonBool(json, "\"persist\"", persist))
{
return false;
}
if (id == 0 || value > 100)
{
return false;
}
out.id = id;
out.type = DeviceCommandType::SetBrightness;
out.value = static_cast<uint8_t>(value);
out.persist = persist;
return true;
}
} // namespace remote
#endif // REMOTE_DEVICE_COMMAND_H