From 42298ca80104e6d0c747fbd8bc3224decf2d2d38 Mon Sep 17 00:00:00 2001 From: Travis Hunter Date: Thu, 4 May 2023 16:40:20 -0600 Subject: [PATCH] merge with upstream --- utils/MotorModelDatabase.cpp | 2 ++ utils/MotorModelDatabase.h | 2 +- utils/ThrustCurveAPI.cpp | 58 ++++++++++++++++++++++++++++++++++++ utils/ThrustCurveAPI.h | 3 ++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/utils/MotorModelDatabase.cpp b/utils/MotorModelDatabase.cpp index 23ffa0d..c36baa8 100644 --- a/utils/MotorModelDatabase.cpp +++ b/utils/MotorModelDatabase.cpp @@ -4,6 +4,8 @@ /// \cond // C headers // C++ headers +#include +#include // 3rd party headers #include #include diff --git a/utils/MotorModelDatabase.h b/utils/MotorModelDatabase.h index ea22557..3b734cb 100644 --- a/utils/MotorModelDatabase.h +++ b/utils/MotorModelDatabase.h @@ -74,4 +74,4 @@ private: } // namespace utils -#endif // UTILS_MOTORMODELDATABASE_H \ No newline at end of file +#endif // UTILS_MOTORMODELDATABASE_H diff --git a/utils/ThrustCurveAPI.cpp b/utils/ThrustCurveAPI.cpp index de3ff83..bd4c8c5 100644 --- a/utils/ThrustCurveAPI.cpp +++ b/utils/ThrustCurveAPI.cpp @@ -4,6 +4,7 @@ // C++ headers // 3rd party headers #include +#include /// \endcond // qtrocket headers @@ -25,6 +26,58 @@ ThrustCurveAPI::~ThrustCurveAPI() } +std::optional ThrustCurveAPI::getThrustCurve(const std::string& id) +{ + std::stringstream endpoint; + endpoint << hostname << "api/v1/download.json?motorId=" << id << "&data=samples"; + std::vector extraHeaders = {}; + + std::string res = curlConnection.get(endpoint.str(), extraHeaders); + model::MotorModel mm; + + if(!res.empty()) + { + try + { + Json::Reader reader; + Json::Value jsonResult; + reader.parse(res, jsonResult); + + std::vector> samples; + for(Json::ValueConstIterator iter = jsonResult["results"].begin(); + iter != jsonResult["results"].end(); + ++iter) + { + // if there are more than 1 items in the results list, we only want the RASP data + // Otherwise just take whatever is there + if(std::next(iter) != jsonResult["results"].end()) + { + if( (*iter)["format"].asString() != "RASP") + continue; + } + for(Json::ValueConstIterator samplesIter = (*iter)["samples"].begin(); + samplesIter != (*iter)["samples"].end(); + ++samplesIter) + { + samples.push_back(std::make_pair((*samplesIter)["time"].asDouble(), + (*samplesIter)["thrust"].asDouble())); + + } + } + return ThrustCurve(samples); + } + catch(const std::exception& e) + { + std::string err("Unable to parse JSON from Thrustcurve motor data request. Error: "); + err += e.what(); + + Logger::getInstance()->error(err); + } + } + + return std::nullopt; + +} model::MotorModel ThrustCurveAPI::getMotorData(const std::string& motorId) { @@ -227,6 +280,11 @@ std::vector ThrustCurveAPI::searchMotors(const SearchCriteria mm.type = model::MotorModel::MotorType(model::MotorModel::MOTORTYPE::HYBRID); motorModel.moveMetaData(std::move(mm)); + auto tc = getThrustCurve(mm.motorIdTC); + if(tc) + { + motorModel.addThrustCurve(*tc); + } retVal.push_back(motorModel); } } diff --git a/utils/ThrustCurveAPI.h b/utils/ThrustCurveAPI.h index eb63946..af09ecb 100644 --- a/utils/ThrustCurveAPI.h +++ b/utils/ThrustCurveAPI.h @@ -7,6 +7,7 @@ // C++ headers #include #include +#include // 3rd party headers /// \endcond @@ -91,6 +92,8 @@ private: const std::string hostname; CurlConnection curlConnection; + std::optional getThrustCurve(const std::string& id); + // no extra headers, but CurlConnection library wants them const std::vector extraHeaders{}; };