diff options
Diffstat (limited to 'pid/buildjson.cpp')
-rw-r--r-- | pid/buildjson.cpp | 81 |
1 files changed, 62 insertions, 19 deletions
diff --git a/pid/buildjson.cpp b/pid/buildjson.cpp index ad51d9b..5e90c47 100644 --- a/pid/buildjson.cpp +++ b/pid/buildjson.cpp @@ -37,36 +37,79 @@ void from_json(const json& j, conf::ControllerInfo& c) * accordingly. */ auto p = j.at("pid"); - p.at("samplePeriod").get_to(c.pidInfo.ts); - p.at("proportionalCoeff").get_to(c.pidInfo.proportionalCoeff); - p.at("integralCoeff").get_to(c.pidInfo.integralCoeff); - p.at("feedFwdOffsetCoeff").get_to(c.pidInfo.feedFwdOffset); - p.at("feedFwdGainCoeff").get_to(c.pidInfo.feedFwdGain); - p.at("integralLimit_min").get_to(c.pidInfo.integralLimit.min); - p.at("integralLimit_max").get_to(c.pidInfo.integralLimit.max); - p.at("outLim_min").get_to(c.pidInfo.outLim.min); - p.at("outLim_max").get_to(c.pidInfo.outLim.max); - p.at("slewNeg").get_to(c.pidInfo.slewNeg); - p.at("slewPos").get_to(c.pidInfo.slewPos); auto positiveHysteresis = p.find("positiveHysteresis"); - if (positiveHysteresis == p.end()) + auto negativeHysteresis = p.find("negativeHysteresis"); + auto positiveHysteresisValue = 0.0; + auto negativeHysteresisValue = 0.0; + if (positiveHysteresis != p.end()) { - c.pidInfo.positiveHysteresis = 0.0; + p.at("positiveHysteresis").get_to(positiveHysteresisValue); } - else + if (negativeHysteresis != p.end()) { - p.at("positiveHysteresis").get_to(c.pidInfo.positiveHysteresis); + p.at("negativeHysteresis").get_to(negativeHysteresisValue); } - auto negativeHysteresis = p.find("negativeHysteresis"); - if (negativeHysteresis == p.end()) + if (c.type != "stepwise") { - c.pidInfo.negativeHysteresis = 0.0; + p.at("samplePeriod").get_to(c.pidInfo.ts); + p.at("proportionalCoeff").get_to(c.pidInfo.proportionalCoeff); + p.at("integralCoeff").get_to(c.pidInfo.integralCoeff); + p.at("feedFwdOffsetCoeff").get_to(c.pidInfo.feedFwdOffset); + p.at("feedFwdGainCoeff").get_to(c.pidInfo.feedFwdGain); + p.at("integralLimit_min").get_to(c.pidInfo.integralLimit.min); + p.at("integralLimit_max").get_to(c.pidInfo.integralLimit.max); + p.at("outLim_min").get_to(c.pidInfo.outLim.min); + p.at("outLim_max").get_to(c.pidInfo.outLim.max); + p.at("slewNeg").get_to(c.pidInfo.slewNeg); + p.at("slewPos").get_to(c.pidInfo.slewPos); + + c.pidInfo.positiveHysteresis = positiveHysteresisValue; + c.pidInfo.negativeHysteresis = negativeHysteresisValue; } else { - p.at("negativeHysteresis").get_to(c.pidInfo.negativeHysteresis); + p.at("samplePeriod").get_to(c.stepwiseInfo.ts); + p.at("isCeiling").get_to(c.stepwiseInfo.isCeiling); + + for (size_t i = 0; i < ec::maxStepwisePoints; i++) + { + c.stepwiseInfo.reading[i] = + std::numeric_limits<double>::quiet_NaN(); + c.stepwiseInfo.output[i] = std::numeric_limits<double>::quiet_NaN(); + } + + auto reading = p.find("reading"); + if (reading != p.end()) + { + auto r = p.at("reading"); + for (size_t i = 0; i < ec::maxStepwisePoints; i++) + { + auto n = r.find(std::to_string(i)); + if (n != r.end()) + { + r.at(std::to_string(i)).get_to(c.stepwiseInfo.reading[i]); + } + } + } + + auto output = p.find("output"); + if (output != p.end()) + { + auto o = p.at("output"); + for (size_t i = 0; i < ec::maxStepwisePoints; i++) + { + auto n = o.find(std::to_string(i)); + if (n != o.end()) + { + o.at(std::to_string(i)).get_to(c.stepwiseInfo.output[i]); + } + } + } + + c.stepwiseInfo.positiveHysteresis = positiveHysteresisValue; + c.stepwiseInfo.negativeHysteresis = negativeHysteresisValue; } } } // namespace conf |