FastLED 3.9.15
Loading...
Searching...
No Matches

◆ ParseJson() [2/2]

bool fl::ScreenMap::ParseJson ( const char * jsonStrScreenMap,
fl::fl_map< string, ScreenMap > * segmentMaps,
string * err = nullptr )
static

Definition at line 82 of file screenmap.cpp.

83 {
84
85#if FASTLED_NO_JSON
86 FL_UNUSED(jsonStrScreenMap);
87 FL_UNUSED(segmentMaps);
88 FL_UNUSED(err);
89 FL_WARN("ScreenMap::ParseJson called with FASTLED_NO_JSON");
90 if (err) {
91 *err = "JSON is not supported in this build";
92 }
93 return false;
94#else
95 //FL_WARN_SCREENMAP("ParseJson called with JSON: " << jsonStrScreenMap);
96
97 string _err;
98 if (!err) {
99 err = &_err;
100 }
101
102 auto jsonDoc = fl::Json::parse(jsonStrScreenMap);
103 if (!jsonDoc.has_value()) {
104 *err = "Failed to parse JSON";
105 FL_WARN("Failed to parse JSON");
106 return false;
107 }
108
109 if (!jsonDoc.is_object()) {
110 *err = "JSON root is not an object";
111 FL_WARN("JSON root is not an object");
112 return false;
113 }
114
115 // Check if "map" key exists and is an object
116 if (!jsonDoc.contains("map")) {
117 *err = "Missing 'map' key in JSON";
118 FL_WARN("Missing 'map' key in JSON");
119 return false;
120 }
121
122 // Get the map object
123 auto mapObj = jsonDoc["map"];
124 if (!mapObj.has_value() || !mapObj.is_object()) {
125 *err = "Invalid 'map' object in JSON";
126 FL_WARN("Invalid 'map' object in JSON");
127 return false;
128 }
129
130 auto jsonMapOpt = mapObj.as_object();
131 if (!jsonMapOpt || jsonMapOpt->empty()) {
132 *err = "Failed to parse map from JSON or map is empty";
133 FL_WARN("Failed to parse map from JSON or map is empty");
134 return false;
135 }
136
137 auto& jsonMap = *jsonMapOpt;
138
139
140 for (const auto& kv : jsonMap) {
141 auto name = kv.first;
142
143
144 // Check that the value is not null before creating Json object
145 if (!kv.second) {
146 *err = "Null value for segment " + name;
147 return false;
148 }
149
150 // Create Json object directly from shared_ptr
151 fl::Json val(kv.second);
152 if (!val.has_value()) {
153 *err = "Invalid value for segment " + name;
154 return false;
155 }
156
157 if (!val.is_object()) {
158 *err = "Segment value for " + name + " is not an object";
159 return false;
160 }
161
162 // Check if x array exists and is actually an array
163 if (!val.contains("x")) {
164 *err = "Missing x array for " + name;
165 return false;
166 }
167
168 if (!val["x"].has_value() || !val["x"].is_array()) {
169 *err = "Invalid x array for " + name;
170 return false;
171 }
172
173 // Extract x array using our helper function
174 fl::vector<float> x_array = jsonArrayToFloatVector(val["x"]);
175
176 // Check if y array exists and is actually an array
177 if (!val.contains("y")) {
178 *err = "Missing y array for " + name;
179 return false;
180 }
181
182 if (!val["y"].has_value() || !val["y"].is_array()) {
183 *err = "Invalid y array for " + name;
184 return false;
185 }
186
187 // Extract y array using our helper function
188 fl::vector<float> y_array = jsonArrayToFloatVector(val["y"]);
189
190 // Get diameter (optional) with default value
191 float diameter = -1.0f; // default value
192 if (val.contains("diameter") && val["diameter"].has_value()) {
193 auto diameterOpt = val["diameter"].as_float();
194 if (diameterOpt) {
195 diameter = static_cast<float>(*diameterOpt);
196 }
197 }
198
199 auto n = MIN(x_array.size(), y_array.size());
200 if (n != x_array.size() || n != y_array.size()) {
201 if (n != x_array.size()) {
202 }
203 if (n != y_array.size()) {
204 }
205 }
206
207 ScreenMap segment_map(n, diameter);
208 for (size_t i = 0; i < n; i++) {
209 segment_map.set(i, vec2f{x_array[i], y_array[i]});
210 }
211 (*segmentMaps)[name] = fl::move(segment_map);
212 }
213 return true;
214#endif
215}
fl::size size() const
Definition vector.h:545
static Json parse(const fl::string &txt)
Definition json.h:2126
ScreenMap()=default
#define MIN(a, b)
Definition math_macros.h:41
constexpr remove_reference< T >::type && move(T &&t) noexcept
Definition move.h:27
vec2< float > vec2f
Definition geometry.h:333
HeapVector< T, Allocator > vector
Definition vector.h:1214
fl::vector< float > jsonArrayToFloatVector(const fl::Json &jsonArray)
Definition screenmap.cpp:23
#define FL_UNUSED(x)
Definition unused.h:8
#define FL_WARN
Definition warn.h:12

References ScreenMap(), fl::Json::as_float(), fl::Json::contains(), FL_UNUSED, FL_WARN, fl::Json::has_value(), fl::Json::is_object(), fl::jsonArrayToFloatVector(), MIN, fl::move(), fl::Json::parse(), set(), and fl::HeapVector< T, Allocator >::size().

Referenced by ParseJson(), fl::FileSystem::readScreenMap(), and fl::FileSystem::readScreenMaps().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: