#include "classxml.h" #include "crc16.h" #include "unistd.h" #include 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 &vol, QVector &cur,QVector &cap, QVector &second,QVector > &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=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= 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=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; }