101 lines
3.5 KiB
C++
101 lines
3.5 KiB
C++
#include "dc_signal_internal.h"
|
||
#include "tinyxml2.h"
|
||
void dc_param_cfg_check(const std::string &path)
|
||
{
|
||
if (false == dc_get_param_cfg_change()) return;
|
||
|
||
using namespace tinyxml2;
|
||
|
||
XMLDocument doc;
|
||
doc.InsertEndChild(doc.NewDeclaration());
|
||
|
||
XMLElement *root = doc.NewElement("Root");
|
||
doc.InsertEndChild(root);
|
||
|
||
int ao_no = 0, param_no = 0;
|
||
|
||
XMLElement *ao_elem = doc.NewElement("Ao");
|
||
|
||
// for(auto it = g_datacenter.signal_ao.map_signals.begin(); it != g_datacenter.signal_ao.map_signals.end(); it++)
|
||
for(uint32_t i = 0; i < g_datacenter.signal_ao.signal_id; i++)
|
||
{
|
||
stru_signal *p_ao = dc_find_signal_by_id(i, g_datacenter.signal_ao);
|
||
if(nullptr == p_ao)
|
||
{
|
||
MY_LOG_E("ao id %d not found", i);
|
||
continue;
|
||
}
|
||
|
||
XMLElement *sig_elem = doc.NewElement("Signal");
|
||
sig_elem->SetAttribute("id", p_ao->id);
|
||
sig_elem->SetAttribute("saddr", p_ao->saddr.c_str());
|
||
sig_elem->SetAttribute("desc", p_ao->desc.c_str());
|
||
sig_elem->SetAttribute("type", dc_get_data_type_str_by_id(p_ao->data_type).c_str());
|
||
sig_elem->SetAttribute("min", p_ao->param.min);
|
||
sig_elem->SetAttribute("max", p_ao->param.max);
|
||
sig_elem->SetAttribute("step", p_ao->param.step);
|
||
sig_elem->SetAttribute("unit", p_ao->param.unit.c_str());
|
||
sig_elem->SetAttribute("value", dc_get_signal_val(p_ao->vec_p_data[0], p_ao->data_type).c_str());
|
||
|
||
ao_elem->InsertEndChild(sig_elem);
|
||
}
|
||
|
||
XMLElement *param_elem = doc.NewElement("Param");
|
||
|
||
// for(auto it = g_datacenter.signal_param.map_signals.begin(); it != g_datacenter.signal_param.map_signals.end(); it++)
|
||
for(uint32_t i = 0; i < g_datacenter.signal_param.signal_id; i++)
|
||
{
|
||
stru_signal *p_param = dc_find_signal_by_id(i, g_datacenter.signal_param);
|
||
if(nullptr == p_param)
|
||
{
|
||
MY_LOG_E("param id %d not found", i);
|
||
continue;
|
||
}
|
||
|
||
XMLElement *sig_elem = doc.NewElement("Signal");
|
||
sig_elem->SetAttribute("saddr", p_param->saddr.c_str());
|
||
sig_elem->SetAttribute("desc", p_param->desc.c_str());
|
||
sig_elem->SetAttribute("type", dc_get_data_type_str_by_id(p_param->data_type).c_str());
|
||
sig_elem->SetAttribute("min", p_param->param.min);
|
||
sig_elem->SetAttribute("max", p_param->param.max);
|
||
sig_elem->SetAttribute("step", p_param->param.step);
|
||
sig_elem->SetAttribute("unit", p_param->param.unit.c_str());
|
||
sig_elem->SetAttribute("num", p_param->vec_p_data.size());
|
||
|
||
|
||
for(int i = 0; i < p_param->vec_p_data.size(); i++)
|
||
{
|
||
std::string val = dc_get_signal_val(p_param->vec_p_data[i], p_param->data_type);
|
||
|
||
XMLElement *item_elem = doc.NewElement("Item");
|
||
item_elem->SetAttribute("index", i+1);
|
||
item_elem->SetAttribute("value", val.c_str());
|
||
|
||
sig_elem->InsertEndChild(item_elem);
|
||
}
|
||
|
||
param_elem->InsertEndChild(sig_elem);
|
||
}
|
||
|
||
root->InsertEndChild(ao_elem);
|
||
root->InsertEndChild(param_elem);
|
||
|
||
// 保存到 self_param.xml,不覆盖参数模板 param.xml
|
||
std::string self_path = path;
|
||
size_t pos = self_path.rfind("param.xml");
|
||
if (pos != std::string::npos)
|
||
self_path.replace(pos, 9, "self_param.xml");
|
||
|
||
if (XML_SUCCESS == doc.SaveFile(self_path.c_str()))
|
||
{
|
||
dc_set_param_cfg_change(false);
|
||
MY_LOG_I("param runtime saved to %s", self_path.c_str());
|
||
}
|
||
else
|
||
{
|
||
MY_LOG_E("failed to save param runtime to %s", self_path.c_str());
|
||
}
|
||
}
|
||
|
||
|