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

◆ toJson()

void fl::ScreenMap::toJson ( const fl::flat_map< string, ScreenMap > & segmentMaps,
fl::json * doc )
static

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

370 {
371
372#if FASTLED_NO_JSON
373 FL_WARN("ScreenMap::toJson called with FASTLED_NO_JSON");
374 return;
375#else
376 if (!doc) {
377 FL_WARN("ScreenMap::toJson called with nullptr doc");
378 return;
379 }
380
381 // Emits the v2 screenmap shape (issue ledmapper#143):
382 // { "version": 2,
383 // "groups": { "<name>": { "color": "#hex" } },
384 // "segments": [ { "id": "<name>", "pin": "pin1", "group": "<name>",
385 // "x": [...], "y": [...], "diameter": ... } ] }
386 // Bilingual readers (`ScreenMap::ParseJson`, ledmapper) accept both v1
387 // and v2, so any existing on-disk v1 JSON keeps loading. v1 emission
388 // is no longer supported.
389 *doc = fl::json::object();
390
391 fl::json groupsObj = fl::json::object();
392 fl::json segmentsArr = fl::json::array();
393
394 // Distinct palette so each strip lights up differently in the editor
395 // preview without the user having to pick a colour. Cycle on overflow.
396 static const char *const kPalette[] = {
397 "#3b82f6", "#10b981", "#f59e0b", "#ef4444",
398 "#a855f7", "#06b6d4", "#ec4899", "#84cc16",
399 };
400 constexpr size_t kPaletteSize = sizeof(kPalette) / sizeof(kPalette[0]);
401
402 size_t idx = 0;
403 for (const auto& kv : segmentMaps) {
404 if (kv.second.getLength() == 0) {
405 FL_WARN("ScreenMap::toJson called with empty segment: " << fl::string(kv.first));
406 continue;
407 }
408
409 const auto& name = kv.first;
410 const auto& segment = kv.second;
411 const float diameter = segment.getDiameter();
412
413 fl::json xArray = fl::json::array();
414 for (u16 i = 0; i < segment.getLength(); i++) {
415 xArray.push_back(fl::json(static_cast<double>(segment[i].x)));
416 }
417 fl::json yArray = fl::json::array();
418 for (u16 i = 0; i < segment.getLength(); i++) {
419 yArray.push_back(fl::json(static_cast<double>(segment[i].y)));
420 }
421
422 fl::json groupObj = fl::json::object();
423 groupObj.set("color", fl::json(fl::string(kPalette[idx % kPaletteSize])));
424 groupsObj.set(name, groupObj);
425
426 fl::json segmentObj = fl::json::object();
427 segmentObj.set("id", fl::json(fl::string(name)));
428 segmentObj.set("pin", fl::json(fl::string("pin1")));
429 segmentObj.set("group", fl::json(fl::string(name)));
430 segmentObj.set("x", xArray);
431 segmentObj.set("y", yArray);
432 segmentObj.set("diameter", fl::json(static_cast<double>(diameter)));
433 segmentsArr.push_back(segmentObj);
434
435 idx++;
436 }
437
438 doc->set("version", fl::json(static_cast<double>(2)));
439 doc->set("groups", groupsObj);
440 doc->set("segments", segmentsArr);
441
442 fl::string debugStr = doc->to_string();
443 FL_WARN("ScreenMap::toJson generated JSON: " << debugStr);
444#endif
445}
void push_back(const json &value) FL_NOEXCEPT
Definition json.h:745
fl::string to_string() const FL_NOEXCEPT
Definition json.h:671
void set(const fl::string &key, const json &value) FL_NOEXCEPT
Definition json.h:701
static json object() FL_NOEXCEPT
Definition json.h:692
static json array() FL_NOEXCEPT
Definition json.h:688
#define FL_WARN(X)
Definition log.h:276

References fl::json::array(), FL_WARN, fl::json::object(), fl::json::push_back(), fl::json::set(), fl::json::to_string(), fl::x, and fl::y.

Referenced by toJsonStr().

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