#include "classxml.h"
|
#include "crc16.h"
|
#include "unistd.h"
|
#include <QDebug>
|
|
ClassXML::ClassXML()
|
{
|
|
}
|
|
bool ClassXML::CreateLOGOXml(WELCOME_LOGO ¶m)
|
{
|
QFile file(logoFile);
|
if(!file.exists())
|
{
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("LOGO_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("LOGOEN");
|
DE.appendChild(doc.createTextNode(QString::number(param.LOGOEN)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("ModelLogo");
|
DE.appendChild(doc.createTextNode(param.ModelLogo));
|
root.appendChild(DE);
|
|
DE = doc.createElement("MachineName");
|
DE.appendChild(doc.createTextNode(param.MachineName));
|
root.appendChild(DE);
|
|
DE = doc.createElement("CompanyCName");
|
DE.appendChild(doc.createTextNode(param.CompanyCName));
|
root.appendChild(DE);
|
|
DE = doc.createElement("CompanyEName");
|
DE.appendChild(doc.createTextNode(param.CompanyEName));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
file.close();
|
|
return true;
|
}
|
return false;
|
}
|
|
bool ClassXML::ReadLOGOXml(WELCOME_LOGO ¶m)
|
{
|
QDomDocument doc;
|
QFile file(logoFile);
|
if( !file.open( QFile::ReadOnly) )
|
return false;
|
|
if(!doc.setContent(&file))
|
return false;
|
|
file.close();
|
|
QDomElement root = doc.documentElement();
|
QDomNode DN;
|
|
if(!(DN=root.elementsByTagName("LOGOEN").at(0)).isNull())
|
{
|
param.LOGOEN = DN.toElement().text().toDouble();
|
}
|
if(!(DN=root.elementsByTagName("ModelLogo").at(0)).isNull())
|
{
|
param.ModelLogo = DN.toElement().text();
|
}
|
if(!(DN=root.elementsByTagName("MachineName").at(0)).isNull())
|
{
|
param.MachineName = DN.toElement().text();
|
}
|
if(!(DN=root.elementsByTagName("CompanyCName").at(0)).isNull())
|
{
|
param.CompanyCName = DN.toElement().text();
|
}
|
if(!(DN=root.elementsByTagName("CompanyEName").at(0)).isNull())
|
{
|
param.CompanyEName = DN.toElement().text();
|
}
|
return true;
|
}
|
|
bool ClassXML::ModifyLOGOXml(WELCOME_LOGO ¶m)
|
{
|
QFile file(logoFile);
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("LOGO_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("LOGOEN");
|
DE.appendChild(doc.createTextNode(QString::number(param.LOGOEN)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("ModelLogo");
|
DE.appendChild(doc.createTextNode(param.ModelLogo));
|
root.appendChild(DE);
|
|
DE = doc.createElement("MachineName");
|
DE.appendChild(doc.createTextNode(param.MachineName));
|
root.appendChild(DE);
|
|
DE = doc.createElement("CompanyCName");
|
DE.appendChild(doc.createTextNode(param.CompanyCName));
|
root.appendChild(DE);
|
|
DE = doc.createElement("CompanyEName");
|
DE.appendChild(doc.createTextNode(param.CompanyEName));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
|
file.flush();
|
int fd = file.handle();
|
fsync(fd);
|
|
file.close();
|
|
return true;
|
}
|
|
bool ClassXML::CreateFBO_Data(const QString &fname,FBO_DATA_HEAD_START &datainfo)
|
{
|
QFile file(fname);
|
|
if(!file.open(QIODevice::ReadWrite))
|
return false;
|
|
QDataStream dataStream(&file);
|
file.seek(0);
|
|
quint8 *pInfo = (quint8 *)&datainfo;
|
|
for(quint16 i=0;i<FBO_DATA_HEAD_START_LENTH;i++)
|
{
|
dataStream.operator << (*pInfo++);
|
}
|
|
for(int i=FBO_DATA_HEAD_START_LENTH;i<FBO_DATA_HEAD_INFO_LENTH;i++)
|
{
|
dataStream.operator << ((quint8)(0xFF));
|
}
|
|
file.close();
|
|
return true;
|
}
|
|
bool ClassXML::SaveFBO_Data(const QString &fname,FBO_DATA &fbo_data)
|
{
|
QFile file(fname);
|
|
if(!file.exists())
|
return false;
|
|
if(!file.open(QIODevice::ReadWrite))
|
return false;
|
|
QDataStream dataStream(&file);
|
file.seek(file.size());
|
|
const int datalen = sizeof(FBO_DATA) - MONOMER_NUM_MAX*sizeof(quint16) + fbo_data.BattSum*sizeof(quint16);
|
|
fbo_data.CRC16 = 0;
|
fbo_data.CRC16 = CRC16::CalCRC16(&fbo_data,datalen);
|
quint8 *pData = (quint8 *)&fbo_data;
|
for(int i=0;i<datalen;i++)
|
{
|
dataStream.operator <<(*pData++);
|
}
|
file.close();
|
|
return true;
|
}
|
|
bool ClassXML::CloseFBO_Data(const QString &fname,FBO_DATA_HEAD_STOP &datainfo)
|
{
|
QFile file(fname);
|
|
if(!file.exists())
|
return false;
|
|
if(!file.open(QIODevice::ReadWrite))
|
return false;
|
|
QDataStream dataStream(&file);
|
file.seek(FBO_DATA_HEAD_START_LENTH);
|
quint8 *pInfo = (quint8 *)&datainfo;
|
for(quint16 i=0;i<FBO_DATA_HEAD_STOP_LENTH;i++)
|
{
|
dataStream.operator <<(*pInfo++);
|
}
|
file.close();
|
|
return true;
|
}
|
|
//*************************处理设置参数xml文件******************************//
|
bool ClassXML::CreateTestParamXml(const QString &fname,
|
TEST_PARAM_XML ¶m)
|
{
|
QDir dir;
|
if(!dir.exists(dataDir+fname.trimmed())){
|
qDebug("dir no exist");
|
FileManage fileManage;
|
if(!fileManage.createDir(fname.trimmed())){
|
qDebug("creat false");
|
return false;
|
}
|
qDebug("creat success");
|
}
|
|
QFile file(dataDir+fname.trimmed()+paramFile);
|
if(file.exists())
|
return false;
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
// qDebug()<<"create "<<dataDir+fname.trimmed()+paramFile;
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("TEST_PARAM_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("test_mode");
|
DE.appendChild(doc.createTextNode(QString::number(param.test_mode)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("acstop_operation");
|
DE.appendChild(doc.createTextNode(QString::number(param.acstop_op)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("nominal_cap");
|
DE.appendChild(doc.createTextNode(QString::number(param.nominal_cap)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("hourly_rate");
|
DE.appendChild(doc.createTextNode(QString::number(param.hourly_rate)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_cur");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_cur)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_cap");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_cap)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_time");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_time)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("mon_vol");
|
DE.appendChild(doc.createTextNode(QString::number(param.mon_vol)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("mon_lower");
|
DE.appendChild(doc.createTextNode(QString::number(param.mon_lower)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("group_lower");
|
DE.appendChild(doc.createTextNode(QString::number(param.group_lower)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("mon_number");
|
DE.appendChild(doc.createTextNode(QString::number(param.mon_number)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("group_number");
|
DE.appendChild(doc.createTextNode(QString::number(param.group_number)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("lower_number");
|
DE.appendChild(doc.createTextNode(QString::number(param.lower_number)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("onlinevol_lowlimit");
|
DE.appendChild(doc.createTextNode(QString::number(param.onlinevol_lowlimit)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("booster_ceiling");
|
DE.appendChild(doc.createTextNode(QString::number(param.booster_ceiling)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("charge_limit");
|
DE.appendChild(doc.createTextNode(QString::number(param.charge_limit)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("discharge_mode");
|
DE.appendChild(doc.createTextNode(QString::number(param.discharge_mode)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_power");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_power)));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
file.close();
|
qDebug("create ok");
|
return true;
|
}
|
|
bool ClassXML::ReadTestParamXml(const QString &fname,
|
TEST_PARAM_XML ¶m)
|
{
|
QDomDocument doc;
|
// qDebug()<< "read "<<dataDir+fname+paramFile;
|
QFile file(dataDir+fname+paramFile);
|
if( !file.open( QFile::ReadOnly) )
|
return false;
|
|
if(!doc.setContent(&file))
|
return false;
|
|
file.close();
|
|
QDomElement root = doc.documentElement();
|
QDomNode DN;
|
|
|
if(!(DN=root.elementsByTagName("test_mode").at(0)).isNull())
|
{
|
param.test_mode = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("acstop_operation").at(0)).isNull())
|
{
|
param.acstop_op = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("nominal_cap").at(0)).isNull())
|
{
|
param.nominal_cap = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("hourly_rate").at(0)).isNull())
|
{
|
param.hourly_rate = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("preset_cur").at(0)).isNull())
|
{
|
param.preset_cur = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("preset_cap").at(0)).isNull())
|
{
|
param.preset_cap = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("preset_time").at(0)).isNull())
|
{
|
param.preset_time = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("mon_vol").at(0)).isNull())
|
{
|
param.mon_vol = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("mon_lower").at(0)).isNull())
|
{
|
param.mon_lower = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("group_lower").at(0)).isNull())
|
{
|
param.group_lower = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("mon_number").at(0)).isNull())
|
{
|
param.mon_number = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("group_number").at(0)).isNull())
|
{
|
param.group_number = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("lower_number").at(0)).isNull())
|
{
|
param.lower_number = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("onlinevol_lowlimit").at(0)).isNull())
|
{
|
param.onlinevol_lowlimit = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("booster_ceiling").at(0)).isNull())
|
{
|
param.booster_ceiling = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("charge_limit").at(0)).isNull())
|
{
|
param.charge_limit = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("discharge_mode").at(0)).isNull())
|
{
|
param.discharge_mode = DN.toElement().text().toInt();
|
}
|
|
if(!(DN=root.elementsByTagName("preset_power").at(0)).isNull())
|
{
|
param.preset_power = DN.toElement().text().toInt();
|
}
|
qDebug("read ok");
|
return true;
|
}
|
|
bool ClassXML::ModifyTestParamXml(
|
const QString &fname, TEST_PARAM_XML ¶m)
|
{
|
QFile file(dataDir+fname+paramFile);
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("TEST_PARAM_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("test_mode");
|
DE.appendChild(doc.createTextNode(QString::number(param.test_mode)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("acstop_operation");
|
DE.appendChild(doc.createTextNode(QString::number(param.acstop_op)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("nominal_cap");
|
DE.appendChild(doc.createTextNode(QString::number(param.nominal_cap)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("nominal_cap");
|
DE.appendChild(doc.createTextNode(QString::number(param.nominal_cap)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("hourly_rate");
|
DE.appendChild(doc.createTextNode(QString::number(param.hourly_rate)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_cur");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_cur)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_cap");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_cap)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_time");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_time)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("mon_vol");
|
DE.appendChild(doc.createTextNode(QString::number(param.mon_vol)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("mon_lower");
|
DE.appendChild(doc.createTextNode(QString::number(param.mon_lower)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("group_lower");
|
DE.appendChild(doc.createTextNode(QString::number(param.group_lower)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("mon_number");
|
DE.appendChild(doc.createTextNode(QString::number(param.mon_number)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("group_number");
|
DE.appendChild(doc.createTextNode(QString::number(param.group_number)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("lower_number");
|
DE.appendChild(doc.createTextNode(QString::number(param.lower_number)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("onlinevol_lowlimit");
|
DE.appendChild(doc.createTextNode(QString::number(param.onlinevol_lowlimit)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("booster_ceiling");
|
DE.appendChild(doc.createTextNode(QString::number(param.booster_ceiling)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("charge_limit");
|
DE.appendChild(doc.createTextNode(QString::number(param.charge_limit)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("discharge_mode");
|
DE.appendChild(doc.createTextNode(QString::number(param.discharge_mode)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("preset_power");
|
DE.appendChild(doc.createTextNode(QString::number(param.preset_power)));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
|
file.flush();
|
int fd = file.handle();
|
fsync(fd);
|
|
file.close();
|
|
return true;
|
}
|
|
bool ClassXML::CreateAdjParamXml(void)
|
{
|
QFile file(adjFile);
|
if(!file.exists())
|
{
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("ADJ_PARAM_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("onlinevol_slope");
|
DE.appendChild(doc.createTextNode("1.00000"));
|
root.appendChild(DE);
|
|
DE = doc.createElement("groupvol_slope");
|
DE.appendChild(doc.createTextNode("1.00000"));
|
root.appendChild(DE);
|
|
DE = doc.createElement("temp_slope");
|
DE.appendChild(doc.createTextNode("1.00000"));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
file.close();
|
return true;
|
}
|
|
return false;
|
}
|
|
bool ClassXML::ReadAdjParamXml(ADJ_PARAM_XML &adjparam)
|
{
|
QDomDocument doc;
|
QFile file(adjFile);
|
if( !file.open( QFile::ReadOnly) )
|
return false;
|
|
if(!doc.setContent(&file))
|
return false;
|
|
file.close();
|
|
QDomElement root = doc.documentElement();
|
QDomNode DN;
|
|
if(!(DN=root.elementsByTagName("onlinevol_slope").at(0)).isNull())
|
{
|
adjparam.onlinevol_slope = DN.toElement().text().toDouble();
|
}
|
if(!(DN=root.elementsByTagName("groupvol_slope").at(0)).isNull())
|
{
|
adjparam.groupvol_slope = DN.toElement().text().toDouble();
|
}
|
if(!(DN=root.elementsByTagName("temp_slope").at(0)).isNull())
|
{
|
adjparam.temp_slope = DN.toElement().text().toDouble();
|
}
|
|
return true;
|
}
|
|
bool ClassXML::ModifyAdjParamXml(ADJ_PARAM_XML &adjparam)
|
{
|
QFile file(adjFile);
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("ADJ_PARAM_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("onlinevol_slope");
|
DE.appendChild(doc.createTextNode(QString::number(adjparam.onlinevol_slope)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("groupvol_slope");
|
DE.appendChild(doc.createTextNode(QString::number(adjparam.groupvol_slope)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("temp_slope");
|
DE.appendChild(doc.createTextNode(QString::number(adjparam.temp_slope)));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
file.close();
|
|
return true;
|
}
|
|
bool ClassXML::ReadSysParamXml(SYS_PARAM &sysparam)
|
{
|
QDomDocument doc;
|
QFile file(sysFile);
|
if( !file.open( QFile::ReadOnly) )
|
return false;
|
|
if(!doc.setContent(&file))
|
return false;
|
|
file.close();
|
|
QDomElement root = doc.documentElement();
|
QDomNode DN;
|
|
if(!(DN=root.elementsByTagName("save_interval").at(0)).isNull())
|
{
|
sysparam.save_interval = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("monomerlow_act").at(0)).isNull())
|
{
|
sysparam.monomerlow_act = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("monomer_order").at(0)).isNull())
|
{
|
sysparam.monomer_order = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("monomer_fre").at(0)).isNull())
|
{
|
sysparam.monomer_fre = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("loader_plusEn").at(0)).isNull())
|
{
|
sysparam.loader_plusEn = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("tcp_ip_0").at(0)).isNull())
|
sysparam.tcp_ip[0] = DN.toElement().text().toUInt();
|
if(!(DN=root.elementsByTagName("tcp_ip_1").at(0)).isNull())
|
sysparam.tcp_ip[1] = DN.toElement().text().toUInt();
|
if(!(DN=root.elementsByTagName("tcp_ip_2").at(0)).isNull())
|
sysparam.tcp_ip[2] = DN.toElement().text().toUInt();
|
if(!(DN=root.elementsByTagName("tcp_ip_3").at(0)).isNull())
|
sysparam.tcp_ip[3] = DN.toElement().text().toUInt();
|
if(!(DN=root.elementsByTagName("tcp_port").at(0)).isNull())
|
sysparam.tcp_port = DN.toElement().text().toUInt();
|
|
if(!(DN=root.elementsByTagName("OnlineOffVol").at(0)).isNull())
|
{
|
sysparam.OnlineOffVol = DN.toElement().text().toInt();
|
}
|
if(!(DN=root.elementsByTagName("GroupOffVol").at(0)).isNull())
|
{
|
sysparam.GroupOffVol = DN.toElement().text().toInt();
|
}
|
|
return true;
|
}
|
|
bool ClassXML::ModifySysParamXml(SYS_PARAM &sysparam)
|
{
|
QFile file(sysFile);
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("SYS_PARAM_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("save_interval");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.save_interval)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("monomerlow_act");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.monomerlow_act)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("monomer_order");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.monomer_order)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("monomer_fre");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.monomer_fre)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("loader_plusEn");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.loader_plusEn)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("tcp_ip_0");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.tcp_ip[0])));
|
root.appendChild(DE);
|
DE = doc.createElement("tcp_ip_1");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.tcp_ip[1])));
|
root.appendChild(DE);
|
DE = doc.createElement("tcp_ip_2");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.tcp_ip[2])));
|
root.appendChild(DE);
|
DE = doc.createElement("tcp_ip_3");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.tcp_ip[3])));
|
root.appendChild(DE);
|
DE = doc.createElement("tcp_port");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.tcp_port)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("OnlineOffVol");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.OnlineOffVol)));
|
root.appendChild(DE);
|
|
DE = doc.createElement("GroupOffVol");
|
DE.appendChild(doc.createTextNode(QString::number(sysparam.GroupOffVol)));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
file.close();
|
|
return true;
|
}
|
|
//**********************FBO-数据界面简介*************************//
|
bool ClassXML::AnalysisDataFBO(const QString &fname,TEST_DATA_INFO &info)
|
{
|
QFile file(fname);
|
if( !file.open(QFile::ReadOnly) )
|
return false;
|
QDataStream dataStream(&file);
|
/*
|
qint64 length = file.size();
|
quint8 datas[length];
|
memset(datas,0,length*sizeof(char));
|
dataStream.readRawData((char *)&datas,length);
|
file.close();
|
memcpy(&info,datas,sizeof(TEST_DATA_INFO));
|
*/
|
quint8 datas[FBO_DATA_HEAD_INFO_LENTH];
|
memset(datas,0,FBO_DATA_HEAD_INFO_LENTH*sizeof(char));
|
dataStream.readRawData((char *)&datas,FBO_DATA_HEAD_INFO_LENTH);
|
file.close();
|
|
memcpy(&info,datas,sizeof(TEST_DATA_INFO));
|
|
return true;
|
}
|
|
//***********************FBO-图形显示界面**************************//
|
bool ClassXML::GetGroupVolFBO(const QString &fname, QVector<int> &vol,
|
QVector<int> &cur,QVector<int> &cap,
|
QVector<int> &second,QVector<QVector<int> > &mon)
|
{
|
vol.clear();
|
cur.clear();
|
cap.clear();
|
second.clear();
|
mon.clear();
|
QFile file(fname);
|
if( !file.open(QFile::ReadOnly) )
|
return false;
|
QDataStream dataStream(&file);
|
qint64 length = file.size();
|
quint8 *datas = new quint8[length];
|
memset(datas,0,length*sizeof(quint8));
|
dataStream.readRawData((char*)datas,length);
|
|
FBO_DATA_HEAD_START data_start;FBO_DATA fbo_data;
|
memcpy(&data_start,datas,sizeof(FBO_DATA_HEAD_START));
|
int fbo_length = data_start.BattGroup;
|
fbo_length *= data_start.BattSum;
|
fbo_length = sizeof(FBO_DATA)-MONOMER_NUM_MAX*2+fbo_length*2;
|
mon.resize(data_start.BattGroup*data_start.BattSum);
|
|
qint64 addr = 256;
|
while(addr<length)
|
{
|
if( (datas[addr] == 0xFD || datas[addr] == 0xFC) &&
|
datas[addr] == datas[addr+1] &&
|
datas[addr] == datas[addr+2] &&
|
datas[addr] == datas[addr+3] )
|
{
|
memcpy(&fbo_data,&datas[addr],fbo_length);
|
vol.append(fbo_data.SumVoltage);
|
cur.append(fbo_data.SumCurrent);
|
cap.append(fbo_data.AllCap);
|
|
second.append(fbo_data.m_TestTime.hour*3600+
|
fbo_data.m_TestTime.minute*60+
|
fbo_data.m_TestTime.second);
|
for(int i=0;i<mon.count();i++)
|
{
|
mon[i].append(fbo_data.SingleVol[i]);
|
}
|
addr += fbo_length;
|
}
|
else
|
{
|
addr += 2;
|
}
|
}
|
delete []datas;
|
file.close();
|
return true;
|
}
|
|
|
bool ClassXML::ReadSetMonData(void *data_buf,quint16 length)
|
{
|
QFile file(setmonFile);
|
if( !file.open(QFile::ReadOnly) )
|
return false;
|
|
QDataStream dataStream(&file);
|
if(file.size() < length)
|
length = file.size();
|
|
quint8 *datas = new quint8[length];
|
memset(datas,0,length*sizeof(quint8));
|
dataStream.readRawData((char*)datas,length);
|
file.close();
|
|
memcpy(data_buf,datas,length);
|
delete []datas;
|
return true;
|
}
|
bool ClassXML::ModifySetMonData(void *data_buf, quint16 length)
|
{
|
QFile file(setmonFile);
|
|
if(!file.open(QIODevice::ReadWrite|QFile::Truncate))
|
return false;
|
|
QDataStream dataStream(&file);
|
file.seek(0);
|
|
quint8 *pData = (quint8 *)data_buf;
|
for(int i=0;i<length;i++)
|
{
|
dataStream.operator <<(*pData++);
|
}
|
|
file.flush();
|
file.close();
|
|
return true;
|
}
|
|
//-------------------------------------------------------------------------------------------
|
int ClassXML::GetHourRate(int stdah, int current)
|
{
|
int index;
|
int tmpah = 0;
|
int value[11]={550,306,250,200,166,146,131,118,108,100,55};
|
tmpah = stdah/10;
|
if(tmpah == 0)
|
tmpah= 1;
|
int res = (current*100)/(tmpah);
|
if(res>=514) return 1;
|
else if(res<=55) return 20;
|
else
|
{
|
for(index=0; index<10; index++)
|
{
|
if((res<=value[index]) && (res>value[index+1])) break;
|
else continue;
|
}
|
if((value[index]-res) < (res-value[index+1]))
|
{
|
return (index+1);
|
}
|
else
|
{
|
if(index+2 > 10) return (20);
|
else return (index+2);
|
}
|
}
|
}
|
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
int ClassXML::GetFDCurrent(int stdcap,int hourrate)
|
{
|
int res = 55;
|
int current = 0;
|
switch(hourrate)
|
{
|
case 1: res = 550;break;
|
case 2: res = 306;break;
|
case 3: res = 250;break;
|
case 4: res = 200;break;
|
case 5: res = 166;break;
|
case 6: res = 146;break;
|
case 7: res = 131;break;
|
case 8: res = 118;break;
|
case 9: res = 108;break;
|
case 10: res = 100;break;
|
case 20: res = 55;break;
|
default: res = 55;break;
|
}
|
|
current = stdcap;
|
current *= res;
|
current *= 10;
|
current /= 1000;
|
return ((int)current);
|
}
|
//----------------------------------------------------------------------------------------
|
bool ClassXML::CreateNewestPNameXml(const QString &fname)
|
{
|
QFile file(newestPNameFile);
|
|
if(!file.exists())
|
{
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("NEWEST_NAME_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("newest_name");
|
DE.appendChild(doc.createTextNode(fname));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
file.flush();
|
file.close();
|
|
return true;
|
}
|
|
return false;
|
}
|
|
bool ClassXML::ReadNewestPNameXml(QString &fname)
|
{
|
QDomDocument doc;
|
QFile file(newestPNameFile);
|
if( !file.open( QFile::ReadOnly) )
|
return false;
|
|
if(!doc.setContent(&file))
|
return false;
|
|
file.close();
|
|
QDomElement root = doc.documentElement();
|
QDomNode DN;
|
|
if(!(DN=root.elementsByTagName("newest_name").at(0)).isNull())
|
{
|
fname = DN.toElement().text();
|
}
|
|
return true;
|
}
|
|
bool ClassXML::ModifyNewestPNameXml(const QString &fname)
|
{
|
QFile file(newestPNameFile);
|
|
if(!file.open(QIODevice::WriteOnly))
|
return false;
|
|
QDomDocument doc;
|
QDomProcessingInstruction instruction;
|
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
|
doc.appendChild(instruction);
|
QDomElement root=doc.createElement("NEWEST_NAME_ROOT");
|
doc.appendChild(root);
|
|
QDomElement DE = doc.createElement("newest_name");
|
DE.appendChild(doc.createTextNode(fname));
|
root.appendChild(DE);
|
|
QTextStream out( &file );
|
doc.save(out, 4);
|
file.flush();
|
file.close();
|
|
return true;
|
}
|
|
bool ClassXML::ReadsmallBlockDataFBO(const QString &fname,
|
quint8 *info,quint16 &Len, quint16 &TotalBlock,quint16 IndexBlock)
|
{
|
QFile file(fname);
|
if( !file.open(QFile::ReadOnly) )
|
return false;
|
QDataStream dataStream(&file);
|
qint64 length = file.size();
|
quint8 *datas = new quint8[length];
|
memset(datas,0,length*sizeof(quint8));
|
dataStream.readRawData((char*)datas,length);
|
file.close();
|
|
qint64 addr = 1024*IndexBlock;
|
TotalBlock = length/1024;
|
if(length%1024)
|
TotalBlock += 1;
|
|
#if 0
|
for(quint8 i=0;i<16 && addr<length;i++)
|
{
|
if(length-addr >= 64)
|
{
|
memcpy(info,&datas[addr],64);
|
*(quint16 *)(info + 64) = CRC16::CalCRC16(0,info,64);
|
info += 66;
|
addr += 64;
|
Len += 66;
|
}
|
else
|
{
|
memcpy(info,&datas[addr],length-addr);
|
*(quint16 *)(info + length-addr) = CRC16::CalCRC16(0,info,length-addr);
|
info += length-addr+2;
|
addr += length-addr;
|
Len += length-addr+2;
|
break;
|
}
|
}
|
#else
|
if(addr < length)
|
{
|
if(length-addr >= 1024)
|
{
|
memcpy(info,&datas[addr],1024);
|
*(quint16 *)(info + 1024) = CRC16::CalCRC16(info,1024);
|
Len += 1026;
|
}
|
else
|
{
|
memcpy(info,&datas[addr],length-addr);
|
*(quint16 *)(info + length-addr) = CRC16::CalCRC16(info,length-addr);
|
Len += length-addr+2;
|
}
|
}
|
#endif
|
delete []datas;
|
|
return true;
|
}
|
|
//---------------------------------------------------------------------
|
//-------------- 采集最后一个单体模块(解决不是4的倍数问题) -----------------
|
void ClassXML::GetLastModuleVol(const quint16 battsum,const quint16 *vol,quint16 *battVolData,
|
int Work_Order, int EachGroupBattSum)
|
{
|
if(Work_Order == MONOMER_ORDER_POS)//模块电池正序
|
{
|
switch(EachGroupBattSum % 4)
|
{
|
case 0: battVolData[battsum-4] = vol[0];
|
battVolData[battsum-3] = vol[1];
|
battVolData[battsum-2] = vol[2];
|
battVolData[battsum-1] = vol[3];
|
break;
|
case 1: battVolData[battsum-1] = vol[3];
|
break;
|
case 2: battVolData[battsum-2] = vol[2];
|
battVolData[battsum-1] = vol[3];
|
break;
|
case 3: battVolData[battsum-3] = vol[1];
|
battVolData[battsum-2] = vol[2];
|
battVolData[battsum-1] = vol[3];
|
break;
|
}
|
}
|
else
|
{
|
switch(EachGroupBattSum % 4)
|
{
|
case 0: battVolData[battsum-4] = vol[3];
|
battVolData[battsum-3] = vol[2];
|
battVolData[battsum-2] = vol[1];
|
battVolData[battsum-1] = vol[0];
|
break;
|
case 1: battVolData[battsum-1] = vol[3];
|
break;
|
case 2: battVolData[battsum-2] = vol[3];
|
battVolData[battsum-1] = vol[2];
|
break;
|
case 3: battVolData[battsum-3] = vol[3];
|
battVolData[battsum-2] = vol[2];
|
battVolData[battsum-1] = vol[1];
|
break;
|
}
|
}
|
}
|
|
void ClassXML::set_battVolData(const quint16 Addr, const quint16 *vol,quint16 *battVolData,
|
int Work_Order, int EachGroupBattSum, int EachGroupModule,quint16 BattGroup){
|
quint16 startindex = GetMonomerVolByLoRa(Addr,BattGroup,EachGroupModule,EachGroupBattSum);
|
|
if(((Addr)%EachGroupModule) == (EachGroupModule-1)){//最后一个模块
|
GetLastModuleVol(EachGroupBattSum*((Addr)/EachGroupModule + 1),vol,battVolData,Work_Order,EachGroupBattSum);
|
}
|
else{
|
if(Work_Order == MONOMER_ORDER_POS){//模块电池正序
|
for(int b=0;b<4;b++){
|
battVolData[startindex+b] = vol[b];
|
}
|
}
|
else{ //模块电池反序
|
for(int b=0;b<4;b++){
|
battVolData[startindex+b] = vol[3-b];
|
}
|
}
|
}
|
}
|
|
quint16 ClassXML::GetMonomerVolByLoRa(const quint16 module_index,quint16 BattGroup,int EachGroupModule,int EachGroupBattSum)
|
{
|
quint16 Module_Addr = module_index;
|
|
quint16 grpendmoduleaddr = 0;
|
quint16 grpbattindexstart = 0;
|
quint16 grpstartmoduleaddr = 0;
|
for (quint8 g=0;g<BattGroup;g++)
|
{
|
grpendmoduleaddr += EachGroupModule;
|
if (Module_Addr<grpendmoduleaddr)
|
{
|
break;
|
}
|
|
grpbattindexstart += EachGroupBattSum;
|
grpstartmoduleaddr +=EachGroupModule;
|
}
|
|
quint16 startindex = grpbattindexstart+(Module_Addr-grpstartmoduleaddr)*4;
|
return startindex;
|
}
|
|
quint8 ClassXML::getMonModuleAddr(quint16 index,int EachGroupModule, int EachGroupBattSum){//单体号index(经过减1)
|
int g_index = index/EachGroupBattSum;//对应组号
|
int m_index = index%EachGroupBattSum;//在组内单体号
|
quint8 m_addr = g_index*EachGroupModule+m_index/4;
|
return m_addr;
|
}
|
//校准时使用
|
void ClassXML::set_addr_VolData(const quint16 Addr, quint16 *vol,quint16 *battVolData,
|
int Work_Order,int EachGroupBattSum,int EachGroupModule,quint16 BattGroup){
|
quint16 startindex = GetMonomerVolByLoRa(Addr,BattGroup,EachGroupModule,EachGroupBattSum);
|
if(((Addr)%EachGroupModule) == (EachGroupModule-1)){//最后一个模块
|
setLastAddrVol(EachGroupBattSum*((Addr)/EachGroupModule + 1),battVolData,vol,Work_Order,EachGroupBattSum);
|
}
|
else{
|
if(Work_Order == MONOMER_ORDER_POS){//模块电池正序
|
for(int b=0;b<4;b++){
|
vol[b] = battVolData[startindex+b];
|
}
|
}
|
else{
|
for(int b=0;b<4;b++){
|
vol[3-b] = battVolData[startindex+b];
|
}
|
}
|
}
|
}
|
|
void ClassXML::setLastAddrVol(const quint16 battsum,const quint16 *battVolData, quint16 *vol,
|
int Work_Order,int EachGroupBattSum)
|
{
|
if(Work_Order == MONOMER_ORDER_POS)//模块电池正序
|
{
|
switch(EachGroupBattSum % 4)
|
{
|
case 0: vol[0] = battVolData[battsum-4];
|
vol[1] = battVolData[battsum-3];
|
vol[2] = battVolData[battsum-2];
|
vol[3] = battVolData[battsum-1];
|
break;
|
case 1: vol[3] = battVolData[battsum-1];
|
break;
|
case 2: vol[2] = battVolData[battsum-2];
|
vol[3] = battVolData[battsum-1];
|
break;
|
case 3: vol[1] = battVolData[battsum-3];
|
vol[2] = battVolData[battsum-2];
|
vol[3] = battVolData[battsum-1];
|
break;
|
}
|
}
|
else
|
{
|
switch(EachGroupBattSum % 4)
|
{
|
case 0: vol[3] = battVolData[battsum-4];
|
vol[2] = battVolData[battsum-3];
|
vol[1] = battVolData[battsum-2];
|
vol[0] = battVolData[battsum-1];
|
break;
|
case 1: vol[3] = battVolData[battsum-1];
|
break;
|
case 2: vol[3] = battVolData[battsum-2];
|
vol[2] = battVolData[battsum-1];
|
break;
|
case 3: vol[3] = battVolData[battsum-3];
|
vol[2] = battVolData[battsum-2];
|
vol[1] = battVolData[battsum-1];
|
break;
|
}
|
}
|
}
|
|
void ClassXML::set_adj_vol(const quint16 Addr,const quint16 mindex, quint16 *vol,quint16 adjvol,
|
int Work_Order,int EachGroupBattSum,int EachGroupModule){
|
if(((Addr)%EachGroupModule) == (EachGroupModule-1)){//最后一个模块
|
int battsum = EachGroupBattSum*((Addr)/EachGroupModule + 1);
|
if(Work_Order == MONOMER_ORDER_POS){//模块电池正序
|
int _mindex = 4-(battsum-mindex);
|
if(_mindex>=0 && _mindex <=3)
|
vol[_mindex] = adjvol;
|
}
|
else {
|
int _mindex=0;
|
switch(EachGroupBattSum % 4)
|
{
|
case 0: _mindex = (battsum-mindex)-1;
|
break;
|
case 1: _mindex = 3;
|
break;
|
case 2: _mindex = (battsum-mindex)+1;
|
break;
|
case 3: _mindex = (battsum-mindex);
|
break;
|
}
|
if(_mindex>=0 && _mindex <=3)
|
vol[_mindex] = adjvol;
|
}
|
}
|
else {
|
if(Work_Order == MONOMER_ORDER_POS){//模块电池正序
|
vol[mindex%4] = adjvol;
|
}
|
else {
|
vol[3-(mindex%4)] = adjvol;
|
}
|
}
|
}
|
|
QString ClassXML::readCoreVersion(){
|
QString version = "0.";
|
QFile file(coreFile);
|
if( !file.open(QFile::ReadOnly))
|
return version;
|
QTextStream textStream(&file);
|
QString lastline = textStream.readLine();
|
|
bool ok;
|
version= lastline.mid(8);
|
version.toInt(&ok);
|
if(!ok)
|
version = "0.";
|
else
|
version+=".";
|
file.close();
|
return version;
|
}
|
|
void ClassXML::write_config(QString str, const SYS_CONFIG config){
|
QFile file(dataDir+configFile);
|
|
if(!file.open(QIODevice::Append))
|
return;
|
|
QTextStream textStream(&file);
|
|
str+= " InnerCurrRange:"+QString::number(config.InnerCurrRange);
|
str+= " ExterCurrRange:"+QString::number(config.ExterCurrRange);
|
str+= " MashineCurr:"+QString::number(config.MashineCurr);
|
str+= " DCDC_Count:"+QString::number(config.DCDC_Count);
|
str+= " Mashine_Type:"+QString::number(config.Mashine_Type);
|
str+= " MashinePower:"+QString::number((double)config.MashinePower/10,'f',1);
|
str+= " TKQenable:"+QString::number(config.TKQenable);
|
textStream << str +"\r\n";
|
|
file.close();
|
|
return;
|
}
|
|
qint16 ClassXML::getMonomerVol(quint8 mon_type,quint16 vol)
|
{
|
qint16 vol1 = 0;
|
if(mon_type == MONO_TYPE_WIRED)
|
{
|
if(vol>=20000)
|
{
|
//vol -= 20000;
|
vol1 = vol - 20000;
|
}
|
else if(vol)
|
{
|
vol = 20000 - vol;
|
vol1 = -vol;
|
}
|
else
|
{
|
vol1 = vol;
|
}
|
}
|
else
|
{
|
vol1 = vol;
|
}
|
return vol1;
|
}
|