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

◆ parseV2SegmentArray()

static bool fl::parseV2SegmentArray ( const fl::json & segmentsArr,
fl::flat_map< string, ScreenMap > * segmentMaps,
string * err )
static

Definition at line 114 of file screenmap.cpp.hpp.

116 {
117 if (!segmentsArr.has_value() || !segmentsArr.is_array()) {
118 *err = "v2 'segments' is not an array";
119 return false;
120 }
121
122 auto arrPtr = segmentsArr.as_array();
123 if (!arrPtr) {
124 *err = "v2 'segments' array could not be read";
125 return false;
126 }
127
128 for (const auto& elem : *arrPtr) {
129 if (!elem) {
130 *err = "v2 segment is null";
131 return false;
132 }
133 fl::json segVal(elem);
134 if (!segVal.has_value() || !segVal.is_object()) {
135 *err = "v2 segment is not an object";
136 return false;
137 }
138
139 // Required: id
140 if (!segVal.contains("id") || !segVal["id"].has_value()) {
141 *err = "v2 segment missing 'id'";
142 return false;
143 }
144 auto idOpt = segVal["id"].as_string();
145 if (!idOpt) {
146 *err = "v2 segment 'id' is not a string";
147 return false;
148 }
149 string id = *idOpt;
150
151 // Required: x
152 if (!segVal.contains("x") || !segVal["x"].has_value() || !segVal["x"].is_array()) {
153 *err = "v2 segment '" + id + "' missing or invalid 'x' array";
154 return false;
155 }
156 fl::vector<float> x_array = jsonArrayToFloatVector(segVal["x"]);
157
158 // Required: y
159 if (!segVal.contains("y") || !segVal["y"].has_value() || !segVal["y"].is_array()) {
160 *err = "v2 segment '" + id + "' missing or invalid 'y' array";
161 return false;
162 }
163 fl::vector<float> y_array = jsonArrayToFloatVector(segVal["y"]);
164
165 // Optional: diameter (not in canonical v2 but accepted as a backward-compat
166 // hint when present; otherwise the per-group `diameter` could be wired here
167 // in a future iteration).
168 float diameter = -1.0f;
169 if (segVal.contains("diameter") && segVal["diameter"].has_value()) {
170 auto diameterOpt = segVal["diameter"].as_float();
171 if (diameterOpt) {
172 diameter = static_cast<float>(*diameterOpt);
173 }
174 }
175
176 auto n = fl::min(x_array.size(), y_array.size());
177 ScreenMap segment_map(n, diameter);
178 for (size_t i = 0; i < n; i++) {
179 segment_map.set(i, vec2f{x_array[i], y_array[i]});
180 }
181 (*segmentMaps)[id] = fl::move(segment_map);
182 }
183 return true;
184}
const json_array * as_array() const FL_NOEXCEPT
Definition json.h:287
bool is_array() const FL_NOEXCEPT
Definition json.h:246
bool has_value() const FL_NOEXCEPT
Definition json.h:654
fl::size size() const FL_NOEXCEPT
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
Definition s16x16x4.h:28
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
Definition math.h:71
vec2< float > vec2f
Definition geometry.h:333
fl::vector< float > jsonArrayToFloatVector(const fl::json &jsonArray)

References fl::json::as_float(), fl::json::as_string(), fl::json::contains(), FL_NOEXCEPT, fl::json::has_value(), fl::json::is_array(), fl::json::is_object(), jsonArrayToFloatVector(), min(), fl::fl::move(), fl::ScreenMap::set(), and fl::vector_basic::size().

Referenced by fl::ScreenMap::ParseJson().

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