123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- #include "Document.h"
- #include <QJsonArray>
- #include <QJsonDocument>
- #include <QJsonObject>
- #include <QJsonParseError>
- #include <QJsonValue>
- #include <QFile>
- #include "VPGlobal.h"
- #include "VariablesManager.h"
- #include "PouManager.h"
- // QString Serializer::m_strSavePath;
- // 存档文件的版本
- #define DOC_VERSION QStringLiteral("1.0.0")
- // 存档文件中各个区段的名称
- #define SEG_VERSION QStringLiteral(".Version")
- #define SEG_CONFIG QStringLiteral("Config")
- #define SEG_GVL QStringLiteral("Variables")
- #define SEG_POU QStringLiteral("POUs")
- #define SEG_HARDWARE QStringLiteral("Hardwares")
- Document::Document()
- {
- m_pTotalDoc = nullptr;
- }
- Document::~Document()
- {
- if (m_pTotalDoc != nullptr)
- {
- delete m_pTotalDoc;
- }
- }
- /// <summary>
- /// 执行存档文件保存
- /// </summary>
- /// <returns></returns>
- bool Document::Save()
- {
- qDebug() << "Document save.";
- // 打开存档文件
- QFile file(m_strSavePath);
- if (!file.open(QFile::WriteOnly | QFile::Truncate))
- {
- Utility::VPCriticalMessageBox(m_strSavePath + " open failed!");
- return false;
- }
- file.resize(0);
- if (m_pTotalDoc != nullptr)
- {
- delete m_pTotalDoc;
- }
- m_pTotalDoc = new QJsonObject();
- // 写入当前版本号
- saveVersion();
- // 写入系统全局配置区段
- saveConfig();
- // 写入全局和局部变量区段
- saveGVLs();
- // 写入POU区段
- savePOUs();
- // 写入硬件区段
- saveHardwares();
- // 写入文件
- QJsonDocument jsonDoc;
- jsonDoc.setObject(*m_pTotalDoc);
- file.write(jsonDoc.toJson());
- // 关闭文件
- file.close();
- // 执行压缩
- compress();
-
- return true;
- }
- /// <summary>
- /// 执行存档文件加载
- /// </summary>
- /// <returns></returns>
- bool Document::Load(const QString& strFullPath)
- {
- qDebug() << "Load file : " << strFullPath;
- // 解压缩
- uncompress();
- return true;
- }
- /// <summary>
- /// 写入当前版本号
- /// </summary>
- /// <returns></returns>
- bool Document::saveVersion()
- {
- qDebug() << "Save [" << SEG_VERSION << "]: " + DOC_VERSION;
- m_pTotalDoc->insert(SEG_VERSION, DOC_VERSION);
- return true;
- }
- /// <summary>
- /// 写入系统全局配置区段
- /// </summary>
- /// <returns></returns>
- bool Document::saveConfig()
- {
- qDebug() << "Save [" << SEG_CONFIG << "]";
- m_pTotalDoc->insert(SEG_CONFIG, "");
- return true;
- }
- /// <summary>
- /// 写入全局和局部变量区段
- /// </summary>
- /// <returns></returns>
- bool Document::saveGVLs()
- {
- qDebug() << "Save [" << SEG_GVL << "]";
- VPGlobal::getVariableManager()->debugAllVariables();
- QJsonArray gvlArray;
- // 从公共区域获取全部变量
- QHash<QString, GVL*>* pAllVariables = VPGlobal::getVariableManager()->getAllVariables();
- // 遍历所有变量进行储存
- QHashIterator<QString, GVL*> it(*pAllVariables);
- while (it.hasNext())
- {
- // 找到当前变量集
- const GVL* pGvl = it.next().value();
- QJsonObject objGVL;
- //// 首先判断是全局变量还是局部变量
- //if (pGvl->Type != TOOL_TYPE::TOOL_TYPE_GLOBAL_VARIABLE)
- //{
- // continue;
- //}
- // 保存本变量集基本信息
- objGVL.insert("Type", pGvl->Type);
- objGVL.insert("Group", pGvl->strName);
- // 继续保存其中变量
- const VARIABLES& vars = it.value()->Variables;
- QJsonArray valueArray;
- // 继续添加变量
- for (const VARIABLE* var : vars)
- {
- QJsonObject varObject;
- varObject.insert("Name", var->strName);
- varObject.insert("Fullname", var->strFullName);
- varObject.insert("InfDirection", var->InfDirection);
- varObject.insert("InfCategory", var->InfCategory);
- varObject.insert("Index", var->nIndex);
- varObject.insert("Enable", var->bEnable);
- varObject.insert("Comment", var->strComment);
- varObject.insert("Persist", var->bPersist);
- varObject.insert("value.PassMode", var->value.PassMode);
- varObject.insert("value.Type", var->value.Type);
- // varObject.insert("value.Ptr", var->value.Type);
- // nRefCount
- // bWatch
- valueArray.append(varObject);
- }
-
- objGVL.insert("Values", valueArray);
- gvlArray.append(objGVL);
- }
- m_pTotalDoc->insert(SEG_GVL, gvlArray);
- return true;
- }
- /// <summary>
- /// 写入POU区段
- /// </summary>
- /// <returns></returns>
- bool Document::savePOUs()
- {
- qDebug() << "Save [" << SEG_POU << "]";
- QJsonArray pouArray;
- // 从公共区域获取全部变量
- QHash<QString, PouManager*>* allPous = VPGlobal::getAllPous();
- // 遍历所有的Pou信息
- QHashIterator<QString, PouManager*> it(*allPous);
- while (it.hasNext())
- {
- PouManager* pPouManager = it.next().value();
- QJsonObject objPou;
- savePOU(pPouManager, objPou);
- pouArray.append(objPou);
- }
- m_pTotalDoc->insert(SEG_POU, pouArray);
- return true;
- }
- bool Document::savePOU(PouManager* pPouManager, QJsonObject& objPou)
- {
- objPou.insert("Group", pPouManager->getGroup());
- // 遍历本Pou下的所有工具和接口
- QJsonArray toolArray;
- const QMap<QString, TOOL*>& allTools = pPouManager->GetAllRunningTools();
- QMapIterator<QString, TOOL*> i(allTools);
- while (i.hasNext())
- {
- const TOOL* pTool = i.next().value();
- QJsonObject toolObject;
- toolObject.insert("Type", pTool->Type);
- toolObject.insert("Name", pTool->strName);
- toolObject.insert("AliasName", pTool->strAliasName);
- toolObject.insert("InstanceName", pTool->strInstanceName);
- toolObject.insert("Enable", pTool->bEnable);
- // 继续遍历接口
- QJsonArray infArray;
- for (INTERFACE* pInf : pTool->Interfaces)
- {
- QJsonObject infObject;
- infObject.insert("Name", pInf->strName);
- infObject.insert("Fullname", pInf->strFullName);
- infObject.insert("InfDirection", pInf->InfDirection);
- infObject.insert("InfCategory", pInf->InfCategory);
- infObject.insert("Index", pInf->nIndex);
- infObject.insert("Enable", pInf->bEnable);
- infObject.insert("Watch", pInf->bWatch);
- infObject.insert("OriginalTool", pInf->pOriginalTool->strInstanceName);
- infObject.insert("value.PassMode", pInf->value.PassMode);
- infObject.insert("value.Type", pInf->value.Type);
- // 接口的link信息
- QJsonObject linkObject;
- // 上联接口
- if (pInf->pUpLinkInterface != nullptr)
- {
- linkObject.insert("UpLink", pInf->pUpLinkInterface->strFullName);
- }
- if (pInf->pDownLinkInterfaces.size() > 0)
- {
- QJsonArray downLinkArray;
- for (int i = 0; i < pInf->pDownLinkInterfaces.size(); i++)
- {
- downLinkArray.append(pInf->pDownLinkInterfaces[i]->strFullName);
- }
- linkObject.insert("DownLink", downLinkArray);
- }
- if (linkObject.size() > 0)
- {
- infObject.insert("Links", linkObject);
- }
- infArray.append(infObject);
- }
- toolObject.insert("Interfaces", infArray);
- toolArray.append(toolObject);
- }
- objPou.insert("Tools", toolArray);
- return true;
- }
- /// <summary>
- /// 写入硬件区段
- /// </summary>
- /// <returns></returns>
- bool Document::saveHardwares()
- {
- return true;
- }
- /// <summary>
- /// 压缩
- /// </summary>
- /// <returns></returns>
- bool Document::compress()
- {
- return true;
- }
- /// <summary>
- /// 解压缩
- /// </summary>
- /// <returns></returns>
- bool Document::uncompress()
- {
- return true;
- }
|