134 lines
3.8 KiB
C++
134 lines
3.8 KiB
C++
// class header
|
|
#include "utils/MotorModelDatabase.h"
|
|
|
|
/// \cond
|
|
// C headers
|
|
// C++ headers
|
|
// 3rd party headers
|
|
#include <boost/property_tree/ptree.hpp>
|
|
#include <boost/property_tree/xml_parser.hpp>
|
|
/// \endcond
|
|
|
|
// qtrocket project headers
|
|
#include "QtRocket.h"
|
|
|
|
namespace utils
|
|
{
|
|
|
|
MotorModelDatabase::MotorModelDatabase()
|
|
: motorModelMap()
|
|
{
|
|
}
|
|
|
|
MotorModelDatabase::~MotorModelDatabase()
|
|
{
|
|
}
|
|
|
|
void MotorModelDatabase::addMotorModel(const model::MotorModel& m)
|
|
{
|
|
utils::Logger* logger = QtRocket::getInstance()->getLogger();
|
|
std::string name = m.data.commonName;
|
|
if(motorModelMap.find(name) != motorModelMap.end())
|
|
{
|
|
logger->debug("Replacing MotorModel " + name + " in MotorModelDatabase");
|
|
}
|
|
else
|
|
{
|
|
logger->info("Adding MotorModel " + name + " to MotorModelDatabase");
|
|
}
|
|
motorModelMap[name] = m;
|
|
}
|
|
|
|
void MotorModelDatabase::addMotorModels(const std::vector<model::MotorModel>& models)
|
|
{
|
|
utils::Logger* logger = QtRocket::getInstance()->getLogger();
|
|
for(const auto& i : models)
|
|
{
|
|
addMotorModel(i);
|
|
}
|
|
}
|
|
|
|
std::optional<model::MotorModel> MotorModelDatabase::getMotorModel(const std::string& name)
|
|
{
|
|
auto mm = motorModelMap.find(name);
|
|
if(mm == motorModelMap.end())
|
|
{
|
|
Logger::getInstance()->debug("Unable to locate " + name + " in MotorModel database");
|
|
|
|
return std::nullopt;
|
|
|
|
}
|
|
else
|
|
{
|
|
Logger::getInstance()->debug("Retrieved " + name + " from MotorModel database");
|
|
return motorModelMap[name];
|
|
}
|
|
}
|
|
|
|
void MotorModelDatabase::saveMotorDatabase(const std::string& filename)
|
|
{
|
|
|
|
namespace pt = boost::property_tree;
|
|
|
|
// top-level tree
|
|
pt::ptree tree;
|
|
tree.put("QtRocketMotorDatabase.<xmlattr>.version", "0.1");
|
|
for(const auto& i : motorModelMap)
|
|
{
|
|
pt::ptree motor;
|
|
const auto& m = i.second;
|
|
motor.put("<xmlattr>.name", m.data.commonName);
|
|
motor.put("availability", m.data.availability.str());
|
|
motor.put("avgThrust", m.data.avgThrust);
|
|
motor.put("burnTime", m.data.burnTime);
|
|
motor.put("certOrg", m.data.certOrg.str());
|
|
motor.put("commonName", m.data.commonName);
|
|
motor.put("designation", m.data.designation);
|
|
motor.put("diameter", m.data.diameter);
|
|
motor.put("impulseClass", m.data.impulseClass);
|
|
motor.put("infoUrl", m.data.infoUrl);
|
|
motor.put("length", m.data.length);
|
|
motor.put("manufacturer", m.data.manufacturer.str());
|
|
motor.put("maxThrust", m.data.maxThrust);
|
|
motor.put("motorIdTC", m.data.motorIdTC);
|
|
motor.put("propType", m.data.propType);
|
|
motor.put("sparky", m.data.sparky ? "true" : "false");
|
|
motor.put("totalImpulse", m.data.totalImpulse);
|
|
motor.put("totalWeight", m.data.totalWeight);
|
|
motor.put("type", m.data.type.str());
|
|
motor.put("lastUpdated", m.data.lastUpdated);
|
|
|
|
std::stringstream delays;
|
|
for (std::size_t i = 0; i < m.data.delays.size() - 1; ++i)
|
|
{
|
|
delays << std::to_string(m.data.delays[i]) << ",";
|
|
}
|
|
delays << std::to_string(m.data.delays[m.data.delays.size() - 1]);
|
|
motor.put("delays", delays.str());
|
|
|
|
// thrust data
|
|
{
|
|
pt::ptree tc;
|
|
std::vector<std::pair<double, double>> thrust = m.getThrustCurve().getThrustCurveData();
|
|
for(const auto& j : thrust)
|
|
{
|
|
pt::ptree thrustNode;
|
|
thrustNode.put("<xmlattr>.time", j.first);
|
|
thrustNode.put("<xmlattr>.force", j.second);
|
|
tc.add_child("thrust", thrustNode);
|
|
}
|
|
motor.add_child("thrustCurve", tc);
|
|
}
|
|
tree.add_child("QtRocketMotorDatabase.MotorModels.motor", motor);
|
|
}
|
|
pt::xml_writer_settings<std::string> settings(' ', 2);
|
|
pt::write_xml(filename, tree, std::locale(), settings);
|
|
}
|
|
|
|
void MotorModelDatabase::loadMotorDatabase(const std::string& filename)
|
|
{
|
|
|
|
}
|
|
|
|
} // namespace utils
|