// SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once #include "Readers.h" #include "sls/ToString.h" #include "sls/sls_detector_defs.h" #include namespace sls::test::master_file { using ns = std::chrono::nanoseconds; /* --scalar reads-- */ template <> struct Reader { static int read(const JsonContext &ctx, const std::string &name, AccessType access) { return ctx.doc[name.c_str()].GetInt(); } }; template <> struct Reader { static uint32_t read(const JsonContext &ctx, const std::string &name, AccessType access) { return ctx.doc[name.c_str()].GetUint(); } }; template <> struct Reader { static uint64_t read(const JsonContext &ctx, const std::string &name, AccessType access) { return ctx.doc[name.c_str()].GetUint64(); } }; template <> struct Reader { static double read(const JsonContext &ctx, const std::string &name, AccessType access) { return ctx.doc[name.c_str()].GetDouble(); } }; template <> struct Reader { static std::string read(const JsonContext &ctx, const std::string &name, AccessType access) { return ctx.doc[name.c_str()].GetString(); } }; /** complex types */ template <> struct Reader { static defs::xy read(const JsonContext &ctx, const std::string &name, AccessType access) { defs::xy out{}; out.x = ctx.doc[name.c_str()]["x"].GetInt(); out.y = ctx.doc[name.c_str()]["y"].GetInt(); return out; } }; template <> struct Reader> { static std::vector read(const JsonContext &ctx, const std::string &name, AccessType access) { std::vector out{}; for (const auto &item : ctx.doc[name.c_str()].GetArray()) { defs::ROI r{}; r.xmin = item["xmin"].GetInt(); r.xmax = item["xmax"].GetInt(); r.ymin = item["ymin"].GetInt(); r.ymax = item["ymax"].GetInt(); out.push_back(r); } return out; } }; template <> struct Reader { static defs::scanParameters read(const JsonContext &ctx, const std::string &name, AccessType access) { defs::scanParameters out{}; const auto &s = ctx.doc[name.c_str()].GetObject(); out.enable = s["enable"].GetInt(); out.dacInd = static_cast(s["dacInd"].GetInt()); out.startOffset = s["start offset"].GetInt(); out.stopOffset = s["stop offset"].GetInt(); out.stepSize = s["step size"].GetInt(); out.dacSettleTime_ns = s["dac settle time ns"].GetInt64(); return out; } }; /** arrays/vectors/maps */ template <> struct Reader> { static std::array read(const JsonContext &ctx, const std::string &name, AccessType access) { const auto &arr = ctx.doc[name.c_str()].GetArray(); check_size(arr.Size(), 3, name, "JSON"); std::array out{}; for (size_t i = 0; i < 3; ++i) { out[i] = arr[i].GetInt(); } return out; } }; template <> struct Reader> { static std::array read(const JsonContext &ctx, const std::string &name, AccessType access) { const auto &arr = ctx.doc[name.c_str()].GetArray(); check_size(arr.Size(), 3, name, "JSON"); std::array out{}; for (size_t i = 0; i < 3; ++i) { std::string sval = arr[i].GetString(); out[i] = StringTo(sval); } return out; } }; template <> struct Reader> { static std::vector read(const JsonContext &ctx, const std::string &name, AccessType access) { std::vector out{}; for (const auto &item : ctx.doc[name.c_str()].GetArray()) { out.push_back(item.GetInt()); } return out; } }; template <> struct Reader> { static std::vector read(const JsonContext &ctx, const std::string &name, AccessType access) { std::vector out{}; for (const auto &item : ctx.doc[name.c_str()].GetArray()) { out.push_back(item.GetInt64()); } return out; } }; template <> struct Reader> { static std::vector read(const JsonContext &ctx, const std::string &name, AccessType access) { std::vector out{}; for (const auto &item : ctx.doc[name.c_str()].GetArray()) { out.push_back(item.GetString()); } return out; } }; template <> struct Reader> { static std::map read(const JsonContext &ctx, const std::string &name, AccessType access) { std::map out{}; for (const auto &m : ctx.doc[name.c_str()].GetObject()) { out[m.name.GetString()] = m.value.GetString(); } return out; } }; } // namespace sls::test::master_file