From 5143163d14ce1ad3ed8fce384351da52967cfbb4 Mon Sep 17 00:00:00 2001 From: wangxx1809 Date: Thu, 30 May 2024 11:18:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD=20machinecfg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrintS/Communication/BaseData.h | 16 ++ PrintS/Communication/ComServer.cpp | 12 +- PrintS/Config/ConfigManager.cpp | 18 ++- PrintS/Config/ConfigManager.h | 8 +- PrintS/Config/bean/IOCfg.cpp | 2 +- PrintS/Config/bean/MachineCfg.cpp | 142 ++++++++++++------ PrintS/Config/bean/MachineCfg.h | 66 ++++---- PrintS/Config/dao/IOCfgDao.cpp | 4 +- PrintS/Config/dao/MachineCfgDao.cpp | 110 +++++++------- PrintS/Controller/Base.h | 11 ++ PrintS/Controller/Controller.cpp | 2 +- PrintS/DataManage/ClientInfo.cpp | 1 + PrintS/DataManage/DataHandle.cpp | 8 +- PrintS/DataManage/RWData.h | 3 + PrintS/DataManage/StreamServer.cpp | 6 +- PrintS/HBDSystem.cpp | 2 +- PrintS/Machine/Machine.cpp | 26 ++-- PrintS/RecoatCheck/RecoatCheck.cpp | 10 +- PrintS/Registration/Registration.cpp | 12 +- PrintS/Remote/RemoteClient.cpp | 70 ++++----- PrintS/ScannerCtrl/RTC5Scanner.cpp | 6 +- PrintS/ScannerCtrl/Scanner.cpp | 2 +- PrintS/ScannerCtrl/ScannerCtrl.cpp | 9 +- .../additional/InfraredTemp/InfraredTemp.cpp | 10 +- PrintS/job/JobFileProcessor.cpp | 4 +- PrintS/job/MetaData.cpp | 2 +- PrintS/output/Release/log/2024.hbd | Bin 155648 -> 159744 bytes PrintS/utils/ConverType.hpp | 15 ++ TestClient/DataManage/DataHandle.cpp | 102 +++++++++---- TestClient/DataManage/DataHandle.h | 4 +- TestClient/DataManage/RWData.h | 4 + TestClient/DataManage/StreamClient.cpp | 2 +- TestClient/DataManage/StreamClient.h | 2 +- TestClient/utils/ConverType.h | 8 +- 34 files changed, 426 insertions(+), 273 deletions(-) diff --git a/PrintS/Communication/BaseData.h b/PrintS/Communication/BaseData.h index 9c8fad7..a1d20f4 100644 --- a/PrintS/Communication/BaseData.h +++ b/PrintS/Communication/BaseData.h @@ -16,6 +16,7 @@ public: virtual void SetValue(const std::string& str) {} virtual void SetValue(unsigned char uc) {} virtual void SetValue(double uc) {} + virtual void SetValue(const time_t value) {} std::string GetCode() { return m_code; } virtual std::string GetValueStr() { return ""; } @@ -162,4 +163,19 @@ public: std::string GetValueStr() { return std::to_string(m_value); } private: double m_value; +}; + +class TimetData : public BaseData { +public: + TimetData(const std::string& code, const std::string& context = u8"", const time_t val = 0.0) + : BaseData(code, context), m_value(val) { + } + ~TimetData() {} + + void SetValue(const time_t value) { m_value = value; } + DATATYPE GetDataType() { return iTIMET; } + time_t GetValue() { return m_value; } + std::string GetValueStr() { return std::to_string(m_value); } +private: + time_t m_value; }; \ No newline at end of file diff --git a/PrintS/Communication/ComServer.cpp b/PrintS/Communication/ComServer.cpp index 962f319..cb73934 100644 --- a/PrintS/Communication/ComServer.cpp +++ b/PrintS/Communication/ComServer.cpp @@ -144,13 +144,13 @@ void ComServer::Init() } if (communicationCfg->find("SIMPLE_SUPPLY") != communicationCfg->end()) { - if (m_MachineCfg->m_SupplyMachineVersion == MachineCfg::VERSION_1_0) { + if (m_MachineCfg->m_SupplyMachineVersion->GetValue() == MachineCfg::VERSION_1_0) { m_SimpleSupplyClient = new PowderSupplySimpleClient((*communicationCfg)["SIMPLE_SUPPLY"]); } - else if (m_MachineCfg->m_SupplyMachineVersion == MachineCfg::VERSION_2_1) { + else if (m_MachineCfg->m_SupplyMachineVersion->GetValue() == MachineCfg::VERSION_2_1) { m_SimpleSupplyClient = new PowderSupplySimpleClient2((*communicationCfg)["SIMPLE_SUPPLY"]); } - else if (m_MachineCfg->m_SupplyMachineVersion == MachineCfg::VERSION_2_2) { + else if (m_MachineCfg->m_SupplyMachineVersion->GetValue() == MachineCfg::VERSION_2_2) { m_SimpleSupplyClient = new PowderSupplySimpleClient3((*communicationCfg)["SIMPLE_SUPPLY"]); } else { @@ -294,13 +294,13 @@ void ComServer::SendToClients() { } if (m_SimpleSupplyClient) { - if (m_MachineCfg->m_SupplyMachineVersion == MachineCfg::VERSION_1_0) { + if (m_MachineCfg->m_SupplyMachineVersion->GetValue() == MachineCfg::VERSION_1_0) { m_SimpleSupplyClient->SendToClients(SIMPLESUPPLYPARAM_V10); } - else if (m_MachineCfg->m_SupplyMachineVersion == MachineCfg::VERSION_2_1) { + else if (m_MachineCfg->m_SupplyMachineVersion->GetValue() == MachineCfg::VERSION_2_1) { m_SimpleSupplyClient->SendToClients(SIMPLESUPPLYPARAM_V21); } - else if (m_MachineCfg->m_SupplyMachineVersion == MachineCfg::VERSION_2_2) { + else if (m_MachineCfg->m_SupplyMachineVersion->GetValue() == MachineCfg::VERSION_2_2) { m_SimpleSupplyClient->SendToClients(SIMPLESUPPLYPARAM_V22); } else { diff --git a/PrintS/Config/ConfigManager.cpp b/PrintS/Config/ConfigManager.cpp index 80228ab..879136b 100644 --- a/PrintS/Config/ConfigManager.cpp +++ b/PrintS/Config/ConfigManager.cpp @@ -110,7 +110,7 @@ void ConfigManager::Init() m_pMachineCfgDao = new MachineCfgDao(m_pDB); m_pMachineCfgDao->CreateTable(); m_pMachineCfgDao->Find(m_MachineCfg); - m_Machine = Machine::CreateInstance(m_MachineCfg.m_MachineType); + m_Machine = Machine::CreateInstance(m_MachineCfg.m_MachineType->GetValue()); /*m_AxisCfgs[GTS_AXIS_ID_MOLD] = new AxisCfg(GTS_AXIS_ID_MOLD); m_AxisCfgs[GTS_AXIS_ID_POWDER] = new AxisCfg(GTS_AXIS_ID_POWDER); @@ -164,12 +164,12 @@ bool ConfigManager::InitFromSetup(void) if (handle == INVALID_HANDLE_VALUE && __argc > 1) { int cnt = __argc; - m_MachineCfg.m_MachineType = stoi(__wargv[1]); + m_MachineCfg.m_MachineType->SetValue(stoi(__wargv[1])); Init(); - m_MachineCfg.m_MachineType = stoi(__wargv[1]); + m_MachineCfg.m_MachineType->SetValue(stoi(__wargv[1])); if (__argc > 2) - m_MachineCfg.m_IOVersion = stoi(__wargv[2]); + m_MachineCfg.m_IOVersion->SetValue(stoi(__wargv[2])); SaveConfig(); return true; } @@ -217,7 +217,7 @@ void ConfigManager::ReadConfig() m_pIOCfgDao->Find(m_IOCfgWrapper); m_IOCfgWrapper->Init(); //m_pComServerDao->Find(m_ComServerCfgMap); - m_pCommunicationCfgDao->Find(m_MachineCfg.m_MachineType); + m_pCommunicationCfgDao->Find(m_MachineCfg.m_MachineType->GetValue()); m_pAlarmCfgDao->Find(); //m_pAlarmCfgDao->FindStop(m_AlarmCfgWrapper); //m_pAlarmCfgDao->FindPause(m_AlarmCfgWrapper); @@ -226,7 +226,7 @@ void ConfigManager::ReadConfig() m_pParamSetCfgDao->Find(m_ParamSetCfg); //m_pLaserCfgDao->FindCfg(); m_ScannerControlCfgDao->FindCfg(); - m_PrepareJobCfgDao->Find(m_MachineCfg.m_MachineType, m_PrepareJobCfgs); + m_PrepareJobCfgDao->Find(m_MachineCfg.m_MachineType->GetValue(), m_PrepareJobCfgs); m_Machine->Init(); m_Machine->BindLaser(); m_IOVersionDao->Find(m_IOVersions); @@ -257,7 +257,7 @@ void ConfigManager::SaveConfig() m_pParamSetCfgDao->Save(m_ParamSetCfg); //m_pLaserCfgDao->Save(); m_ScannerControlCfgDao->Save(); - m_PrepareJobCfgDao->Save(m_MachineCfg.m_MachineType, m_PrepareJobCfgs); + m_PrepareJobCfgDao->Save(m_MachineCfg.m_MachineType->GetValue(), m_PrepareJobCfgs); transaction.commit(); } @@ -464,6 +464,8 @@ void ConfigManager::SendCfgToClients() { m_RunCfg.SendToClients(RUNCFGPARAM); m_InfraredTempCfg.SendToClients(INFRAREDTEMPCFGPARAM); + + m_MachineCfg.SendToClients(MACHINECFGPARAM); @@ -489,6 +491,8 @@ void ConfigManager::UpdateCfg(const ReadData& rd) { m_RunCfg.Update(rd, RUNCFGPARAM); break; case INFRAREDTEMPCFG: m_InfraredTempCfg.Update(rd, INFRAREDTEMPCFGPARAM); break; + case MACHINECFG: + m_MachineCfg.Update(rd, MACHINECFGPARAM); break; default: break; } diff --git a/PrintS/Config/ConfigManager.h b/PrintS/Config/ConfigManager.h index f50183d..e4c9efe 100644 --- a/PrintS/Config/ConfigManager.h +++ b/PrintS/Config/ConfigManager.h @@ -82,12 +82,12 @@ public: PowderEstimateCfg* GetPowderEstimateCfg() { return &m_PowderEstimateCfg; } //传 map* GetCommunicationCfg() { return m_pCommunicationCfgDao->GetCommunicationCfg(); } //传 - InfraredTempCfg* GetInfraredTempCfg() { //传 + InfraredTempCfg* GetInfraredTempCfg() { //已传 return &m_InfraredTempCfg; } - ParamLimitCfg* GetParamLimitCfg() { return &m_ParamLimitCfg; } //传 - MachineCfg* GetMachineCfg() { return &m_MachineCfg; } + ParamLimitCfg* GetParamLimitCfg() { return &m_ParamLimitCfg; } //已传 + MachineCfg* GetMachineCfg() { return &m_MachineCfg; } //已传 Machine* GetMachine() { return m_Machine; } AlarmCfgWrapper* GetAlarmCfg() { return m_AlarmCfgWrapper; } @@ -125,7 +125,7 @@ public: void UpdateZeroOffset(int id, long value); map* GetPreJobParamCfg() { return &m_PrepareJobCfgs; } - void SavePreJobParamCfg() { m_PrepareJobCfgDao->Save(m_MachineCfg.m_MachineType, m_PrepareJobCfgs); } + void SavePreJobParamCfg() { m_PrepareJobCfgDao->Save(m_MachineCfg.m_MachineType->GetValue(), m_PrepareJobCfgs); } void SendCfgToClients(); void UpdateCfg(const ReadData& rd); diff --git a/PrintS/Config/bean/IOCfg.cpp b/PrintS/Config/bean/IOCfg.cpp index 26fd245..1f7543d 100644 --- a/PrintS/Config/bean/IOCfg.cpp +++ b/PrintS/Config/bean/IOCfg.cpp @@ -117,7 +117,7 @@ IOCfgWrapper::IOCfgWrapper() { m_IsSystemCtrlPressure = true; MachineCfg* mcfg = ConfigManager::GetInstance()->GetMachineCfg(); - m_IOCtrlIndex = mcfg->m_MachineType * 1000 + mcfg->m_IOVersion; + m_IOCtrlIndex = mcfg->m_MachineType->GetValue() * 1000 + mcfg->m_IOVersion->GetValue(); m_IoVMap[MachineTypeCfg::HBD_1000 * 1000 + HBD1000::IO_V0] = &m_1000v0; m_IoVMap[MachineTypeCfg::HBD_1000 * 1000 + HBD1000::IO_V1] = &m_1000v1; m_IoVMap[MachineTypeCfg::HBD_1000 * 1000 + HBD1000::IO_V2] = &m_1000v2; diff --git a/PrintS/Config/bean/MachineCfg.cpp b/PrintS/Config/bean/MachineCfg.cpp index f300999..3b5c362 100644 --- a/PrintS/Config/bean/MachineCfg.cpp +++ b/PrintS/Config/bean/MachineCfg.cpp @@ -6,39 +6,81 @@ #include "IOVersion.h" MachineCfg::MachineCfg() + : m_serial(new StrData("serial", u8"")) + , m_Name(new StrData("Name", u8"","HBD E1000")) + , m_language(new IntData("language", u8"", HbdLanguage::zh_CN)) + , m_MachineType(new IntData("MachineType", u8"", MachineTypeCfg::HBD_E1000)) + , m_ScanControl(new IntData("ScanControl", u8"", RTC5)) + , m_IsIntelli(new BoolData("IsIntelli", u8"", true)) + , m_PulifierType(new IntData("PulifierType", u8"", PurifierTypeCfg::M1)) + , m_fontSize(new FloatData("fontSize", u8"", 25.0f)) + , m_fontScale(new FloatData("fontScale", u8"", 1.0f)) + , m_lastStartTime(new TimetData("lastStartTime", u8"", time(0))) + , m_lastShutdownTime(new TimetData("lastShutdownTime", u8"", time(0))) + , m_LockPassword(new StrData("LockPassword", u8"", "123")) + , m_LockAlpha(new FloatData("LockAlpha", u8"", 1.0f)) + , m_LockIdleTime(new IntData("LockIdleTime", u8"", 10)) + , m_ExpriedTime(new TimetData("ExpriedTime", u8"", time(0))) + , m_ConnectPassword(new StrData("ConnectPassword", u8"", "hbd_remote")) + , m_Location(new StrData("Location", u8"")) + , m_PlatformShape(new IntData("PlatformShape", u8"")) + , m_SupportNonEncMagic(new BoolData("SupportNonEncMagic", u8"",true)) + , m_PrintStrategy(new IntData("PrintStrategy", u8"多激光打印策略", DATA)) + , m_PlatformLength(new IntData("PlatformLength", u8"", 600)) + , m_PlatformWidth(new IntData("PlatformWidth", u8"", 600)) + , m_IOVersion(new IntData("IOVersion", u8"")) + , m_SupplyMachineVersion(new IntData("SupplyMachineVersion", u8"")) + , m_UseTouchScreen(new BoolData("UseTouchScreen", u8"",true)) + , m_MachineCode(new StrData("MachineCode", u8"")) + , m_MachineCodeAss(new StrData("MachineCodeAss", u8"")) { - m_serial = ""; - m_Name = "HBD E1000"; - m_language = HbdLanguage::zh_CN; - m_MachineType = MachineTypeCfg::HBD_E1000; - m_ScanControl = RTC5; - m_PulifierType = PurifierTypeCfg::M1; - m_fontSize = 25.0f; - m_fontScale = 1.0f; - m_lastStartTime = time(0); - m_lastShutdownTime = time(0); - m_LockPassword = "123"; - m_LockAlpha = 1.0f; - m_LockIdleTime = 10; - m_ExpriedTime = time(0); - //m_IsRemoteConnect = true; - m_ConnectPassword = "hbd_remote"; - m_Location = ""; - m_PlatformShape = 0; - m_SupportNonEncMagic = true; - m_PrintStrategy = DATA; //多激光打印策略 - m_PlatformLength = 600; - m_PlatformWidth = 600; - m_IsIntelli = true; - m_IOVersion = 0; - m_MachineCode = ""; + //m_serial = ""; + //m_Name = "HBD E1000"; + //m_language = HbdLanguage::zh_CN; + //m_MachineType = MachineTypeCfg::HBD_E1000; + //m_ScanControl = RTC5; + //m_PulifierType = PurifierTypeCfg::M1; + //m_fontSize = 25.0f; + //m_fontScale = 1.0f; + //m_lastStartTime = time(0); + //m_lastShutdownTime = time(0); + //m_LockPassword = "123"; + //m_LockAlpha = 1.0f; + //m_LockIdleTime = 10; + //m_ExpriedTime = time(0); + ////m_IsRemoteConnect = true; + //m_ConnectPassword = "hbd_remote"; + //m_Location = ""; + //m_PlatformShape = 0; + //m_SupportNonEncMagic = true; + //m_PrintStrategy = DATA; //多激光打印策略 + //m_PlatformLength = 600; + //m_PlatformWidth = 600; + //m_IsIntelli = true; + //m_IOVersion = 0; + //m_MachineCode = ""; m_CodeMap[MachineTypeCfg::HBD_1000].push_back("HBD 1000"); m_CodeMap[MachineTypeCfg::HBD_1200].push_back("HBD 1200"); m_CodeMap[MachineTypeCfg::HBD_1200_OLD].push_back("HBD 1200V0"); m_CodeMap[MachineTypeCfg::HBD_1500].push_back("HBD 1500"); m_CodeMap[MachineTypeCfg::HBD_E1000].push_back("HBD E1000"); - m_UseTouchScreen = true; + + size_t ptrSize = sizeof(nullptr); //指针大小 + void* startPtr = &m_startFlag + 1; + size_t count = ((size_t)&m_endFlag - (size_t)startPtr) / ptrSize; + InsertMp(startPtr, count); + + auto item = m_CodeMap.begin(); + while(item != m_CodeMap.end()) { +//#pragma pack(1) + string key = to_string(item->first); + BaseData* p = new StrData(key, u8"", item->second[0]); +//#pragma pack() + InsertMp(key,p); + ++item; + } + } @@ -51,76 +93,76 @@ void MachineCfg::GetUpdateSql(vector& ups) char buffer[512]; string updateSql = "UPDATE " + TABLE_NAME + " SET " + FIELD_VALUE + "='%s' WHERE " + FIELD_CODE + "='%s'"; - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_serial.c_str(), CODE_SERIAL.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_serial->GetValueStr().c_str(), CODE_SERIAL.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_Name.c_str(), CODE_NAME.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_Name->GetValueStr().c_str(), CODE_NAME.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_language).c_str(), CODE_LANGUAGE.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_language->GetValueStr().c_str(), CODE_LANGUAGE.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_MachineType).c_str(), CODE_MACHINE_TYPE.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_MachineType->GetValueStr().c_str(), CODE_MACHINE_TYPE.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_ScanControl).c_str(), CODE_SCAN_CONTROL.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_ScanControl->GetValue()).c_str(), CODE_SCAN_CONTROL.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PulifierType).c_str(), CODE_PULIFIER_TYPE.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PulifierType->GetValue()).c_str(), CODE_PULIFIER_TYPE.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_lastStartTime).c_str(), CODE_LAST_START_TIME.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_lastStartTime->GetValue()).c_str(), CODE_LAST_START_TIME.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_lastShutdownTime).c_str(), CODE_LAST_SHUTDOWN_TIME.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_lastShutdownTime->GetValue()).c_str(), CODE_LAST_SHUTDOWN_TIME.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_LockPassword.c_str(), CODE_LOCK_PASSWORD.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_LockPassword->GetValueStr().c_str(), CODE_LOCK_PASSWORD.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_LockAlpha).c_str(), CODE_LOCK_ALPHA.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_LockAlpha->GetValue()).c_str(), CODE_LOCK_ALPHA.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_LockIdleTime).c_str(), CODE_LOCK_IDLE_TIME.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_LockIdleTime->GetValue()).c_str(), CODE_LOCK_IDLE_TIME.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_ExpriedTime).c_str(), CODE_EXPIRED_TIME.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_ExpriedTime->GetValue()).c_str(), CODE_EXPIRED_TIME.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_ConnectPassword.c_str(), CODE_CONNECT_PASSWORD.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_ConnectPassword->GetValueStr().c_str(), CODE_CONNECT_PASSWORD.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_Location.c_str(), CODE_LOCATION.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_Location->GetValueStr().c_str(), CODE_LOCATION.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PlatformShape).c_str(), CODE_SHAPE.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PlatformShape->GetValue()).c_str(), CODE_SHAPE.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_SupportNonEncMagic).c_str(), CODE_SUPPORT_NON_ENC_MAGIC.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_SupportNonEncMagic->GetValue()).c_str(), CODE_SUPPORT_NON_ENC_MAGIC.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PrintStrategy).c_str(), CODE_PRINT_STRATEGY.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PrintStrategy->GetValue()).c_str(), CODE_PRINT_STRATEGY.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PlatformLength).c_str(), CODE_PLATFORM_LENGTH.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PlatformLength->GetValue()).c_str(), CODE_PLATFORM_LENGTH.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PlatformWidth).c_str(), CODE_PLATFORM_WIDTH.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_PlatformWidth->GetValue()).c_str(), CODE_PLATFORM_WIDTH.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_IsIntelli ? "1" : "0", CODE_IS_INTELLI.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_IsIntelli->GetValue() ? "1" : "0", CODE_IS_INTELLI.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_IOVersion).c_str(), CODE_IO_VERSION.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_IOVersion->GetValue()).c_str(), CODE_IO_VERSION.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_SupplyMachineVersion).c_str(), CODE_SUPPLY_MACHINE_VERSION.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_SupplyMachineVersion->GetValue()).c_str(), CODE_SUPPLY_MACHINE_VERSION.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_UseTouchScreen).c_str(), CODE_USE_TOUCH_SCREEN.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), to_string(m_UseTouchScreen->GetValue()).c_str(), CODE_USE_TOUCH_SCREEN.c_str()); ups.push_back(buffer); - sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_MachineCode.c_str(), CODE_MACHINE_CODE.c_str()); + sprintf_s(buffer, sizeof(buffer), updateSql.c_str(), m_MachineCode->GetValueStr().c_str(), CODE_MACHINE_CODE.c_str()); ups.push_back(buffer); } diff --git a/PrintS/Config/bean/MachineCfg.h b/PrintS/Config/bean/MachineCfg.h index 5e1946c..dcf455f 100644 --- a/PrintS/Config/bean/MachineCfg.h +++ b/PrintS/Config/bean/MachineCfg.h @@ -2,10 +2,13 @@ #include #include #include +#include "../Controller/Base.h" +#include "../Communication/BaseData.h" using namespace std; -class MachineCfg +#pragma pack(1) +class MachineCfg : public Base { public: enum PrintStrategy { @@ -35,14 +38,14 @@ public: } bool IsDataSeqStragegy() { - if (m_PrintStrategy == DATA_SEQ_OPT) { + if (m_PrintStrategy->GetValue() == DATA_SEQ_OPT) { return true; } else return false; } bool IsMassStrategy() { - if (m_PrintStrategy == Mass_Production_Strategy) + if (m_PrintStrategy->GetValue() == Mass_Production_Strategy) { return true; } @@ -50,33 +53,35 @@ public: } public: - string m_serial; - string m_Name; - int m_language; - int m_MachineType; - int m_ScanControl; - bool m_IsIntelli; - int m_PulifierType; - float m_fontSize; - float m_fontScale; - time_t m_lastStartTime; - time_t m_lastShutdownTime; - string m_LockPassword; - float m_LockAlpha; - int m_LockIdleTime; - time_t m_ExpriedTime; - string m_ConnectPassword; - string m_Location; - int m_PlatformShape; - bool m_SupportNonEncMagic; - int m_PrintStrategy; - int m_PlatformLength; - int m_PlatformWidth; - int m_IOVersion; - int m_SupplyMachineVersion; - bool m_UseTouchScreen; - string m_MachineCode; - char m_MachineCodeAss[64]; + char m_startFlag; + StrData* m_serial; + StrData* m_Name; + IntData* m_language; + IntData* m_MachineType; + IntData* m_ScanControl; + BoolData* m_IsIntelli; + IntData* m_PulifierType; + FloatData* m_fontSize; + FloatData* m_fontScale; + TimetData* m_lastStartTime; + TimetData* m_lastShutdownTime; + StrData* m_LockPassword; + FloatData* m_LockAlpha; + IntData* m_LockIdleTime; + TimetData* m_ExpriedTime; + StrData* m_ConnectPassword; + StrData* m_Location; + IntData* m_PlatformShape; + BoolData* m_SupportNonEncMagic; + IntData* m_PrintStrategy; + IntData* m_PlatformLength; + IntData* m_PlatformWidth; + IntData* m_IOVersion; + IntData* m_SupplyMachineVersion; + BoolData* m_UseTouchScreen; + StrData* m_MachineCode; + StrData* m_MachineCodeAss; //最少长度64 + char m_endFlag; //结束标记 public: static const string TABLE_NAME; static const string FIELD_CODE; @@ -113,4 +118,5 @@ public: static map> m_CodeMap; }; +#pragma pack() diff --git a/PrintS/Config/dao/IOCfgDao.cpp b/PrintS/Config/dao/IOCfgDao.cpp index 2be1a1c..6cf7c1f 100644 --- a/PrintS/Config/dao/IOCfgDao.cpp +++ b/PrintS/Config/dao/IOCfgDao.cpp @@ -1,4 +1,4 @@ -#include "IOCfgDao.h" +#include "IOCfgDao.h" #include "../ConfigManager.h" @@ -72,7 +72,7 @@ void IOCfgDao::Find(IOCfgWrapper* iowrapper) } vector ins; MachineCfg* mc = ConfigManager::GetInstance()->GetMachineCfg(); - machine->CheckIO(ins, iowrapper, mc->m_IOVersion); + machine->CheckIO(ins, iowrapper, mc->m_IOVersion->GetValue()); if (!ins.empty()) { SQLite::Transaction transaction(*m_pDB); diff --git a/PrintS/Config/dao/MachineCfgDao.cpp b/PrintS/Config/dao/MachineCfgDao.cpp index 619aacb..f3fc9e7 100644 --- a/PrintS/Config/dao/MachineCfgDao.cpp +++ b/PrintS/Config/dao/MachineCfgDao.cpp @@ -40,168 +40,164 @@ void MachineCfgDao::Find(MachineCfg& mcfg) values[query.getColumn(MachineCfg::FIELD_CODE.c_str()).getString()] = query.getColumn(MachineCfg::FIELD_VALUE.c_str()).getString(); } - if (values.find(MachineCfg::CODE_SERIAL.c_str()) != values.end())mcfg.m_serial = values[MachineCfg::CODE_SERIAL]; + if (values.find(MachineCfg::CODE_SERIAL.c_str()) != values.end())mcfg.m_serial->SetValue(values[MachineCfg::CODE_SERIAL]); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SERIAL.c_str(), mcfg.m_serial.c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SERIAL.c_str(), mcfg.m_serial->GetValueStr().c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_NAME.c_str()) != values.end())mcfg.m_Name = values[MachineCfg::CODE_NAME]; + if (values.find(MachineCfg::CODE_NAME.c_str()) != values.end())mcfg.m_Name->SetValue(values[MachineCfg::CODE_NAME]); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_NAME.c_str(), mcfg.m_Name.c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_NAME.c_str(), mcfg.m_Name->GetValueStr().c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_LANGUAGE.c_str()) != values.end())mcfg.m_language = stoi(values[MachineCfg::CODE_LANGUAGE]); + if (values.find(MachineCfg::CODE_LANGUAGE.c_str()) != values.end())mcfg.m_language->SetValue(stoi(values[MachineCfg::CODE_LANGUAGE])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LANGUAGE.c_str(), to_string(mcfg.m_language).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LANGUAGE.c_str(), to_string(mcfg.m_language->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_MACHINE_TYPE.c_str()) != values.end())mcfg.m_MachineType = stoi(values[MachineCfg::CODE_MACHINE_TYPE]); + if (values.find(MachineCfg::CODE_MACHINE_TYPE.c_str()) != values.end())mcfg.m_MachineType->SetValue(stoi(values[MachineCfg::CODE_MACHINE_TYPE])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_MACHINE_TYPE.c_str(), to_string(mcfg.m_MachineType).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_MACHINE_TYPE.c_str(), to_string(mcfg.m_MachineType->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_SCAN_CONTROL.c_str()) != values.end())mcfg.m_ScanControl = stoi(values[MachineCfg::CODE_SCAN_CONTROL]); + if (values.find(MachineCfg::CODE_SCAN_CONTROL.c_str()) != values.end())mcfg.m_ScanControl->SetValue(stoi(values[MachineCfg::CODE_SCAN_CONTROL])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SCAN_CONTROL.c_str(), to_string(mcfg.m_ScanControl).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SCAN_CONTROL.c_str(), to_string(mcfg.m_ScanControl->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_PULIFIER_TYPE.c_str()) != values.end())mcfg.m_PulifierType = stoi(values[MachineCfg::CODE_PULIFIER_TYPE]); + if (values.find(MachineCfg::CODE_PULIFIER_TYPE.c_str()) != values.end())mcfg.m_PulifierType->SetValue(stoi(values[MachineCfg::CODE_PULIFIER_TYPE])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PULIFIER_TYPE.c_str(), to_string(mcfg.m_PulifierType).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PULIFIER_TYPE.c_str(), to_string(mcfg.m_PulifierType->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_FONT_SIZE.c_str()) != values.end())mcfg.m_fontSize = stof(values[MachineCfg::CODE_FONT_SIZE]); + if (values.find(MachineCfg::CODE_FONT_SIZE.c_str()) != values.end())mcfg.m_fontSize->SetValue(stof(values[MachineCfg::CODE_FONT_SIZE])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_FONT_SIZE.c_str(), to_string(mcfg.m_fontSize).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_FONT_SIZE.c_str(), to_string(mcfg.m_fontSize->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_FONT_SCALE.c_str()) != values.end())mcfg.m_fontScale = stof(values[MachineCfg::CODE_FONT_SCALE]); + if (values.find(MachineCfg::CODE_FONT_SCALE.c_str()) != values.end())mcfg.m_fontScale->SetValue(stof(values[MachineCfg::CODE_FONT_SCALE])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_FONT_SCALE.c_str(), to_string(mcfg.m_fontScale).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_FONT_SCALE.c_str(), to_string(mcfg.m_fontScale->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_LAST_START_TIME.c_str()) != values.end())mcfg.m_lastStartTime = stoll(values[MachineCfg::CODE_LAST_START_TIME]); + if (values.find(MachineCfg::CODE_LAST_START_TIME.c_str()) != values.end())mcfg.m_lastStartTime->SetValue(stoll(values[MachineCfg::CODE_LAST_START_TIME])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LAST_START_TIME.c_str(), to_string(mcfg.m_lastStartTime).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LAST_START_TIME.c_str(), to_string(mcfg.m_lastStartTime->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_LAST_SHUTDOWN_TIME.c_str()) != values.end())mcfg.m_lastShutdownTime = stoll(values[MachineCfg::CODE_LAST_SHUTDOWN_TIME]); + if (values.find(MachineCfg::CODE_LAST_SHUTDOWN_TIME.c_str()) != values.end())mcfg.m_lastShutdownTime->SetValue(stoll(values[MachineCfg::CODE_LAST_SHUTDOWN_TIME])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LAST_SHUTDOWN_TIME.c_str(), to_string(mcfg.m_lastShutdownTime).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LAST_SHUTDOWN_TIME.c_str(), to_string(mcfg.m_lastShutdownTime->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_LOCK_PASSWORD.c_str()) != values.end())mcfg.m_LockPassword = values[MachineCfg::CODE_LOCK_PASSWORD]; + if (values.find(MachineCfg::CODE_LOCK_PASSWORD.c_str()) != values.end())mcfg.m_LockPassword->SetValue(values[MachineCfg::CODE_LOCK_PASSWORD]); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCK_PASSWORD.c_str(), mcfg.m_LockPassword.c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCK_PASSWORD.c_str(), mcfg.m_LockPassword->GetValueStr().c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_LOCK_ALPHA.c_str()) != values.end())mcfg.m_LockAlpha = stof(values[MachineCfg::CODE_LOCK_ALPHA]); + if (values.find(MachineCfg::CODE_LOCK_ALPHA.c_str()) != values.end())mcfg.m_LockAlpha->SetValue(stof(values[MachineCfg::CODE_LOCK_ALPHA])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCK_ALPHA.c_str(), to_string(mcfg.m_LockAlpha).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCK_ALPHA.c_str(), to_string(mcfg.m_LockAlpha->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_LOCK_IDLE_TIME.c_str()) != values.end())mcfg.m_LockIdleTime = stoi(values[MachineCfg::CODE_LOCK_IDLE_TIME]); + if (values.find(MachineCfg::CODE_LOCK_IDLE_TIME.c_str()) != values.end())mcfg.m_LockIdleTime->SetValue(stoi(values[MachineCfg::CODE_LOCK_IDLE_TIME])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCK_IDLE_TIME.c_str(), to_string(mcfg.m_LockIdleTime).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCK_IDLE_TIME.c_str(), to_string(mcfg.m_LockIdleTime->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_EXPIRED_TIME.c_str()) != values.end())mcfg.m_ExpriedTime = stoul(values[MachineCfg::CODE_EXPIRED_TIME]); + if (values.find(MachineCfg::CODE_EXPIRED_TIME.c_str()) != values.end())mcfg.m_ExpriedTime->SetValue(stoul(values[MachineCfg::CODE_EXPIRED_TIME])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_EXPIRED_TIME.c_str(), to_string(mcfg.m_ExpriedTime).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_EXPIRED_TIME.c_str(), to_string(mcfg.m_ExpriedTime->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_CONNECT_PASSWORD.c_str()) != values.end())mcfg.m_ConnectPassword = values[MachineCfg::CODE_CONNECT_PASSWORD]; + if (values.find(MachineCfg::CODE_CONNECT_PASSWORD.c_str()) != values.end())mcfg.m_ConnectPassword->SetValue(values[MachineCfg::CODE_CONNECT_PASSWORD]); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_CONNECT_PASSWORD.c_str(), mcfg.m_ConnectPassword.c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_CONNECT_PASSWORD.c_str(), mcfg.m_ConnectPassword->GetValueStr().c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_LOCATION.c_str()) != values.end())mcfg.m_Location = values[MachineCfg::CODE_LOCATION]; + if (values.find(MachineCfg::CODE_LOCATION.c_str()) != values.end())mcfg.m_Location->SetValue(values[MachineCfg::CODE_LOCATION]); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCATION.c_str(), mcfg.m_Location.c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_LOCATION.c_str(), mcfg.m_Location->GetValueStr().c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_SHAPE.c_str()) != values.end())mcfg.m_PlatformShape = stoi(values[MachineCfg::CODE_SHAPE]); + if (values.find(MachineCfg::CODE_SHAPE.c_str()) != values.end())mcfg.m_PlatformShape->SetValue(stoi(values[MachineCfg::CODE_SHAPE])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SHAPE.c_str(), to_string(mcfg.m_PlatformShape).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SHAPE.c_str(), to_string(mcfg.m_PlatformShape->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_SUPPORT_NON_ENC_MAGIC.c_str()) != values.end())mcfg.m_SupportNonEncMagic = (stoi(values[MachineCfg::CODE_SUPPORT_NON_ENC_MAGIC]) > 0 ? true : false); + if (values.find(MachineCfg::CODE_SUPPORT_NON_ENC_MAGIC.c_str()) != values.end())mcfg.m_SupportNonEncMagic->SetValue(stoi(values[MachineCfg::CODE_SUPPORT_NON_ENC_MAGIC]) > 0 ? true : false); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SUPPORT_NON_ENC_MAGIC.c_str(), to_string(mcfg.m_SupportNonEncMagic).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SUPPORT_NON_ENC_MAGIC.c_str(), to_string(mcfg.m_SupportNonEncMagic->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_PRINT_STRATEGY.c_str()) != values.end())mcfg.m_PrintStrategy = MachineCfg::PrintStrategy(stoi(values[MachineCfg::CODE_PRINT_STRATEGY])); + if (values.find(MachineCfg::CODE_PRINT_STRATEGY.c_str()) != values.end())mcfg.m_PrintStrategy->SetValue(MachineCfg::PrintStrategy(stoi(values[MachineCfg::CODE_PRINT_STRATEGY]))); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PRINT_STRATEGY.c_str(), to_string(mcfg.m_PrintStrategy).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PRINT_STRATEGY.c_str(), to_string(mcfg.m_PrintStrategy->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_PLATFORM_WIDTH.c_str()) != values.end())mcfg.m_PlatformWidth = stoi(values[MachineCfg::CODE_PLATFORM_WIDTH]); + if (values.find(MachineCfg::CODE_PLATFORM_WIDTH.c_str()) != values.end())mcfg.m_PlatformWidth->SetValue(stoi(values[MachineCfg::CODE_PLATFORM_WIDTH])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PLATFORM_WIDTH.c_str(), to_string(mcfg.m_PlatformWidth).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PLATFORM_WIDTH.c_str(), to_string(mcfg.m_PlatformWidth->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_PLATFORM_LENGTH.c_str()) != values.end())mcfg.m_PlatformLength = stoi(values[MachineCfg::CODE_PLATFORM_LENGTH]); + if (values.find(MachineCfg::CODE_PLATFORM_LENGTH.c_str()) != values.end())mcfg.m_PlatformLength->SetValue(stoi(values[MachineCfg::CODE_PLATFORM_LENGTH])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PLATFORM_LENGTH.c_str(), to_string(mcfg.m_PlatformLength).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_PLATFORM_LENGTH.c_str(), to_string(mcfg.m_PlatformLength->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_IS_INTELLI.c_str()) != values.end())mcfg.m_IsIntelli = (stoi(values[MachineCfg::CODE_IS_INTELLI]) > 0 ? true : false); + if (values.find(MachineCfg::CODE_IS_INTELLI.c_str()) != values.end())mcfg.m_IsIntelli->SetValue(stoi(values[MachineCfg::CODE_IS_INTELLI]) > 0 ? true : false); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_IS_INTELLI.c_str(), mcfg.m_IsIntelli ? "1" : "0"); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_IS_INTELLI.c_str(), mcfg.m_IsIntelli->GetValue() ? "1" : "0"); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_IO_VERSION.c_str()) != values.end())mcfg.m_IOVersion = stoi(values[MachineCfg::CODE_IO_VERSION]); + if (values.find(MachineCfg::CODE_IO_VERSION.c_str()) != values.end())mcfg.m_IOVersion->SetValue(stoi(values[MachineCfg::CODE_IO_VERSION])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_IO_VERSION.c_str(), to_string(mcfg.m_IOVersion).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_IO_VERSION.c_str(), to_string(mcfg.m_IOVersion->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_SUPPLY_MACHINE_VERSION.c_str()) != values.end())mcfg.m_SupplyMachineVersion = stoi(values[MachineCfg::CODE_SUPPLY_MACHINE_VERSION]); + if (values.find(MachineCfg::CODE_SUPPLY_MACHINE_VERSION.c_str()) != values.end())mcfg.m_SupplyMachineVersion->SetValue(stoi(values[MachineCfg::CODE_SUPPLY_MACHINE_VERSION])); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SUPPLY_MACHINE_VERSION.c_str(), to_string(mcfg.m_SupplyMachineVersion).c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_SUPPLY_MACHINE_VERSION.c_str(), to_string(mcfg.m_SupplyMachineVersion->GetValue()).c_str()); ins.push_back(buffer); } - if (values.find(MachineCfg::CODE_USE_TOUCH_SCREEN.c_str()) != values.end())mcfg.m_UseTouchScreen = (stoi(values[MachineCfg::CODE_USE_TOUCH_SCREEN]) > 0 ? true : false); + if (values.find(MachineCfg::CODE_USE_TOUCH_SCREEN.c_str()) != values.end())mcfg.m_UseTouchScreen->SetValue(stoi(values[MachineCfg::CODE_USE_TOUCH_SCREEN]) > 0 ? true : false); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_USE_TOUCH_SCREEN.c_str(), mcfg.m_UseTouchScreen ? "1" : "0"); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_USE_TOUCH_SCREEN.c_str(), mcfg.m_UseTouchScreen->GetValue() ? "1" : "0"); ins.push_back(buffer); } if (values.find(MachineCfg::CODE_MACHINE_CODE.c_str()) != values.end()) - mcfg.m_MachineCode = values[MachineCfg::CODE_MACHINE_CODE]; + mcfg.m_MachineCode->SetValue(values[MachineCfg::CODE_MACHINE_CODE]); else { - sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_MACHINE_CODE.c_str(), mcfg.m_MachineCode.c_str()); + sprintf_s(buffer, sizeof(buffer), insertSql.c_str(), MachineCfg::CODE_MACHINE_CODE.c_str(), mcfg.m_MachineCode->GetValueStr().c_str()); ins.push_back(buffer); } - memset(&mcfg.m_MachineCodeAss, '\0', sizeof(mcfg.m_MachineCodeAss)); - - for (int i = 0; i < mcfg.m_MachineCode.length(); i++) { - mcfg.m_MachineCodeAss[i] = mcfg.m_MachineCode[i]; - } + mcfg.m_MachineCodeAss->SetValue(mcfg.m_MachineCode->GetValueStr()); if (!ins.empty()) { SQLite::Transaction transaction(*m_pDB); diff --git a/PrintS/Controller/Base.h b/PrintS/Controller/Base.h index 7503d6b..cb7abc5 100644 --- a/PrintS/Controller/Base.h +++ b/PrintS/Controller/Base.h @@ -25,6 +25,14 @@ protected: else { m_baseMp.insert(make_pair(key, bd)); } } } + + void InsertMp(const std::string& key, BaseData* baseData, const std::string& suff = "") { + if (m_baseMp.find(key) != m_baseMp.end()) { + printf("%s is repeated...\n", key.data()); + } + else { m_baseMp.insert(make_pair(key, baseData)); } + } + public: Base() {} virtual ~Base() { @@ -80,6 +88,9 @@ public: else if (rd.valueType == iDOUBLE) { m_baseMp[rd.nameKey]->SetValue(ConverType::TryToD(rd.strValue)); } + else if (rd.valueType == iTIMET) { + m_baseMp[rd.nameKey]->SetValue((time_t)ConverType::TryToLL(rd.strValue)); + } } else { printf("error, %s do not find...", rd.nameKey.c_str()); diff --git a/PrintS/Controller/Controller.cpp b/PrintS/Controller/Controller.cpp index f9283ed..513e645 100644 --- a/PrintS/Controller/Controller.cpp +++ b/PrintS/Controller/Controller.cpp @@ -105,7 +105,7 @@ void Controller::Init(){ m_ScannerCtrl->SetMachineCtrl(m_MachineCtrl); - switch (m_MachineCfg->m_PulifierType) + switch (m_MachineCfg->m_PulifierType->GetValue()) { //case PurifierTypeCfg::HBD_PURIFIER_1: { // m_Purifier = new HBD1Purifier(m_GTSController->GetDacState(),m_ScannerCtrl); diff --git a/PrintS/DataManage/ClientInfo.cpp b/PrintS/DataManage/ClientInfo.cpp index cc86313..9aac2fa 100644 --- a/PrintS/DataManage/ClientInfo.cpp +++ b/PrintS/DataManage/ClientInfo.cpp @@ -34,6 +34,7 @@ void ClientWrapper::Clear() { std::lock_guard lck(m_mux); auto client = m_clientList.begin(); while (client != m_clientList.end()) { + (*client)->m_context->TryCancel(); if (*client) delete (*client); ++client; } diff --git a/PrintS/DataManage/DataHandle.cpp b/PrintS/DataManage/DataHandle.cpp index de8097c..0f1e5f0 100644 --- a/PrintS/DataManage/DataHandle.cpp +++ b/PrintS/DataManage/DataHandle.cpp @@ -81,8 +81,10 @@ void DataHandle::Run() { void DataHandle::Stop() { - if(m_streamServer) m_streamServer->Stop(); if (m_controller) m_controller->StopSend(); + + if(m_streamServer) m_streamServer->Stop(); + } @@ -124,6 +126,9 @@ void DataHandle::DataCallBackHandle(const ReadData& msg) { case INFRAREDTEMPCFG: ConfigManager::GetInstance()->GetInfraredTempCfg()->Update(msg, INFRAREDTEMPCFGPARAM); break; + case MACHINECFG: + ConfigManager::GetInstance()->GetMachineCfg()->Update(msg, MACHINECFGPARAM); + break; case REQUEST: if (msg.nameKey == "36") { printf("error,36 需要释放ScannerCtrl::Init()内部代码块...\n"); @@ -135,6 +140,7 @@ void DataHandle::DataCallBackHandle(const ReadData& msg) { else { ConfigManager::GetInstance()->SendCfgToClients(); //发送配置到客户端 } + break; default: break; diff --git a/PrintS/DataManage/RWData.h b/PrintS/DataManage/RWData.h index 689785f..786c6c8 100644 --- a/PrintS/DataManage/RWData.h +++ b/PrintS/DataManage/RWData.h @@ -25,6 +25,7 @@ enum READTYPE { EXTCFG, RUNCFG, INFRAREDTEMPCFG, + MACHINECFG, LOADPARAM, //装载参数 @@ -45,6 +46,7 @@ enum DATATYPE { iUCHAR, iWORD, iDOUBLE, + iTIMET, UNKNOW, }; @@ -95,6 +97,7 @@ enum WRITETYPE { EXTCFGPARAM, RUNCFGPARAM, //runcfg 参数 INFRAREDTEMPCFGPARAM, //InfraredTempCfg 参数 + MACHINECFGPARAM, //MachineCfg 参数 MOLDCFGPARAM, LOADCFGPARAM, diff --git a/PrintS/DataManage/StreamServer.cpp b/PrintS/DataManage/StreamServer.cpp index 11a28c4..9572162 100644 --- a/PrintS/DataManage/StreamServer.cpp +++ b/PrintS/DataManage/StreamServer.cpp @@ -125,13 +125,17 @@ void StreamServer::Run() { builder.RegisterService(this); m_server = builder.BuildAndStart(); m_server->Wait(); + }); } void StreamServer::Stop() { + ClientWrapper::Instance()->Clear(); + if(m_server.get()) m_server->Shutdown(); + if (m_listenTd.joinable()) { m_listenTd.join(); } @@ -140,5 +144,5 @@ void StreamServer::Stop() { if (m_checkCloseTd.joinable()) m_checkCloseTd.join(); - ClientWrapper::Instance()->Clear(); + } \ No newline at end of file diff --git a/PrintS/HBDSystem.cpp b/PrintS/HBDSystem.cpp index 2266485..5edcace 100644 --- a/PrintS/HBDSystem.cpp +++ b/PrintS/HBDSystem.cpp @@ -48,7 +48,7 @@ void HBDSystem::Init() { g_LngManager->Init(); ConfigManager::GetInstance()->Init(); g_SystemInfo = new SystemInfo(); - g_LngManager->Translation(HbdLanguage::Language(ConfigManager::GetInstance()->GetMachineCfg()->m_language)); + g_LngManager->Translation(HbdLanguage::Language(ConfigManager::GetInstance()->GetMachineCfg()->m_language->GetValue())); g_Toast = new Toast(); diff --git a/PrintS/Machine/Machine.cpp b/PrintS/Machine/Machine.cpp index 5102994..6cc79fa 100644 --- a/PrintS/Machine/Machine.cpp +++ b/PrintS/Machine/Machine.cpp @@ -139,27 +139,27 @@ Machine* Machine::CreateInstance(int type) void Machine::InitMachineCfg(MachineCfg* cfg) { - switch (cfg->m_MachineType) + switch (cfg->m_MachineType->GetValue()) { case MachineTypeCfg::HBD_1000: { - cfg->m_Name = "HBD1000"; - cfg->m_PlatformWidth = 600; - cfg->m_PlatformLength = 600; + cfg->m_Name->SetValue("HBD1000"); + cfg->m_PlatformWidth->SetValue( 600); + cfg->m_PlatformLength ->SetValue(600); }break; case MachineTypeCfg::HBD_1500: { - cfg->m_Name = "HBD1500"; - cfg->m_PlatformWidth = 600; - cfg->m_PlatformLength = 600; + cfg->m_Name->SetValue("HBD1500"); + cfg->m_PlatformWidth->SetValue(600); + cfg->m_PlatformLength->SetValue(600); }break; case MachineTypeCfg::HBD_1200_OLD: { - cfg->m_Name = "HBD1200_OLD"; - cfg->m_PlatformWidth = 600; - cfg->m_PlatformLength = 600; + cfg->m_Name->SetValue("HBD1200_OLD"); + cfg->m_PlatformWidth->SetValue(600); + cfg->m_PlatformLength->SetValue(600); }break; case MachineTypeCfg::HBD_1200: { - cfg->m_Name = "HBD1200"; - cfg->m_PlatformWidth = 600; - cfg->m_PlatformLength = 600; + cfg->m_Name->SetValue("HBD1200"); + cfg->m_PlatformWidth->SetValue(600); + cfg->m_PlatformLength->SetValue(600); }break; default:break; } diff --git a/PrintS/RecoatCheck/RecoatCheck.cpp b/PrintS/RecoatCheck/RecoatCheck.cpp index 4937a18..24000d0 100644 --- a/PrintS/RecoatCheck/RecoatCheck.cpp +++ b/PrintS/RecoatCheck/RecoatCheck.cpp @@ -778,11 +778,11 @@ bool RecoatCheck::CheckWP(MetaData* metadata, unsigned int layer, unsigned char* cv::Point2f tempTri[4], dstTri[4]; // Mat warp_mat = getPerspectiveTransform(srcTri, dstTri); - float plr = (float)mcfg->m_PlatformLength / mcfg->m_PlatformWidth; + float plr = (float)mcfg->m_PlatformLength->GetValue() / mcfg->m_PlatformWidth->GetValue(); int wwidth = 1000; int wheight = 1000.0f / plr; - float wr = 1000.0 / mcfg->m_PlatformLength; - float wh = (float)wheight / mcfg->m_PlatformWidth; + float wr = 1000.0 / mcfg->m_PlatformLength->GetValue(); + float wh = (float)wheight / mcfg->m_PlatformWidth->GetValue(); tempTri[0] = cv::Point2f(0.0f, 0.0f); tempTri[1] = cv::Point2f(wwidth, 0.0f); tempTri[2] = cv::Point2f(wwidth, wheight); @@ -909,8 +909,8 @@ bool RecoatCheck::CheckWP(MetaData* metadata, unsigned int layer, unsigned char* return true; } - float halfWidth = (float)mcfg->m_PlatformLength / 2.0f; - float halfHigh = (float)mcfg->m_PlatformWidth / 2.0f; + float halfWidth = (float)mcfg->m_PlatformLength->GetValue() / 2.0f; + float halfHigh = (float)mcfg->m_PlatformWidth->GetValue() / 2.0f; //imwrite("g:/testimage/ffc8.bmp", dataimg); diff --git a/PrintS/Registration/Registration.cpp b/PrintS/Registration/Registration.cpp index 344a3e8..7877f49 100644 --- a/PrintS/Registration/Registration.cpp +++ b/PrintS/Registration/Registration.cpp @@ -23,12 +23,12 @@ void Registration::Init() Registration::RegType Registration::CheckReg(time_t time) { - if (ConfigManager::GetInstance()->GetMachineCfg()->m_serial == m_key.get_key()) { + if (ConfigManager::GetInstance()->GetMachineCfg()->m_serial->GetValueStr() == m_key.get_key()) { if (ConfigManager::GetInstance()->GetMachineCfg()->m_ExpriedTime == 0) { return REG_SUCCESS; } - else if ((time > ConfigManager::GetInstance()->GetMachineCfg()->m_lastShutdownTime) && - (time < ConfigManager::GetInstance()->GetMachineCfg()->m_ExpriedTime)) { + else if ((time > ConfigManager::GetInstance()->GetMachineCfg()->m_lastShutdownTime->GetValue()) && + (time < ConfigManager::GetInstance()->GetMachineCfg()->m_ExpriedTime->GetValue())) { return REG_TRIAL; } } @@ -104,7 +104,7 @@ Registration::RegType Registration::CheckRegKey(std::string reg_file) { if (reg_key[32] == 'N') { - ConfigManager::GetInstance()->GetMachineCfg()->m_serial = str_reg_key; + ConfigManager::GetInstance()->GetMachineCfg()->m_serial->SetValue(str_reg_key); ConfigManager::GetInstance()->GetMachineCfg()->m_ExpriedTime = 0; ConfigManager::GetInstance()->SaveMachineConfig(); return REG_SUCCESS; @@ -118,8 +118,8 @@ Registration::RegType Registration::CheckRegKey(std::string reg_file) return REG_FAIL; else { - ConfigManager::GetInstance()->GetMachineCfg()->m_serial = str_reg_key; - ConfigManager::GetInstance()->GetMachineCfg()->m_ExpriedTime = expried_time; + ConfigManager::GetInstance()->GetMachineCfg()->m_serial->SetValue(str_reg_key); + ConfigManager::GetInstance()->GetMachineCfg()->m_ExpriedTime->SetValue(expried_time); ConfigManager::GetInstance()->SaveMachineConfig(); return REG_TRIAL; } diff --git a/PrintS/Remote/RemoteClient.cpp b/PrintS/Remote/RemoteClient.cpp index d4bfcc4..02142f6 100644 --- a/PrintS/Remote/RemoteClient.cpp +++ b/PrintS/Remote/RemoteClient.cpp @@ -253,18 +253,18 @@ bool RemoteClient::CheckLogin() if (!m_Client.IsOpen())return false; PrinterMsg::HMessage message; MachineMsg* machineMsg=message.mutable_request()->mutable_machinemsg(); - machineMsg->set_machineid(m_MachineCfg->m_serial); - machineMsg->set_machinetype(MachineMsg_MachineType(m_MachineCfg->m_MachineType)); - machineMsg->set_purifiertype(MachineMsg_PurifierType(m_MachineCfg->m_PulifierType)); - machineMsg->set_laststarttime(m_MachineCfg->m_lastStartTime); - machineMsg->set_lastshutdowntime(m_MachineCfg->m_lastShutdownTime); + machineMsg->set_machineid(m_MachineCfg->m_serial->GetValueStr()); + machineMsg->set_machinetype(MachineMsg_MachineType(m_MachineCfg->m_MachineType->GetValue())); + machineMsg->set_purifiertype(MachineMsg_PurifierType(m_MachineCfg->m_PulifierType->GetValue())); + machineMsg->set_laststarttime(m_MachineCfg->m_lastStartTime->GetValue()); + machineMsg->set_lastshutdowntime(m_MachineCfg->m_lastShutdownTime->GetValue()); //machineMsg->set_language(m_MachineCfg->m_language); machineMsg->set_language(0); - machineMsg->set_password(m_MachineCfg->m_ConnectPassword); - machineMsg->set_name(m_MachineCfg->m_Name); - machineMsg->set_location(m_MachineCfg->m_Location); + machineMsg->set_password(m_MachineCfg->m_ConnectPassword->GetValueStr()); + machineMsg->set_name(m_MachineCfg->m_Name->GetValueStr()); + machineMsg->set_location(m_MachineCfg->m_Location->GetValueStr()); message.set_type(PrinterMsg::LOGIN_REQUEST); - message.set_mcode(m_MachineCfg->m_MachineCode); + message.set_mcode(m_MachineCfg->m_MachineCode->GetValueStr()); // unsigned char sendBuffer[2048]; unsigned char rendBuffer[1024]; @@ -326,11 +326,11 @@ void RemoteClient::PushError(PrinterMsg::MSG msg,string id) PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(msg); respMsg->set_id(id); - respMsg->set_mcode(m_MachineCfg->m_MachineCode); + respMsg->set_mcode(m_MachineCfg->m_MachineCode->GetValueStr()); PrinterMsg::Response* resp = respMsg->mutable_response(); resp->set_result(false); ErrorMsg* emsg = resp->mutable_errormsg(); - emsg->set_machineid(m_MachineCfg->m_serial); + emsg->set_machineid(m_MachineCfg->m_serial->GetValueStr()); AddSendMessage(respMsg); } @@ -340,7 +340,7 @@ void RemoteClient::HandleStateRequest(RemoteClient* client,PrinterMsg::HMessage* PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::STATE_RESPONSE); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); EnvInfo info; g_SystemInfo->GetEnvInfo(info); StateMsg* stateMsg= respMsg->mutable_response()->mutable_statemsg(); @@ -359,7 +359,7 @@ void RemoteClient::HandleStateRequest(RemoteClient* client,PrinterMsg::HMessage* std::bitset<32> limit; stateMsg->set_limitflag(limit.to_ulong()); - stateMsg->set_machineid(client->m_MachineCfg->m_serial); + stateMsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); stateMsg->set_isdoorclose(info.m_EnvState.m_IsPrintCabinDoorClose); stateMsg->set_acctime(g_SystemInfo->m_StateBean.realCostSeconds*1000); stateMsg->set_remaintime(g_SystemInfo->m_StateBean.remainMil); @@ -386,13 +386,13 @@ void RemoteClient::HandleJobInfoRequest(RemoteClient* client, PrinterMsg::HMessa PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::JOB_INFO_RESPONSE); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); EnterCriticalSection(&client->m_JobController->m_cs); if (client->m_JobController->GetJob()==nullptr) { PrinterMsg::Response* resp = respMsg->mutable_response(); resp->set_result(false); ErrorMsg* emsg = resp->mutable_errormsg(); - emsg->set_machineid(client->m_MachineCfg->m_serial); + emsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); client->AddSendMessage(respMsg); LeaveCriticalSection(&client->m_JobController->m_cs); return; @@ -434,7 +434,7 @@ void RemoteClient::HandleJobInfoRequest(RemoteClient* client, PrinterMsg::HMessa } metaData->UnLockPart(); respMsg->mutable_response()->set_result(true); - jobmsg->set_machineid(client->m_MachineCfg->m_serial); + jobmsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); LeaveCriticalSection(&client->m_JobController->m_cs); time_t tnow; time(&tnow); @@ -447,7 +447,7 @@ void RemoteClient::HandleCtrlSystemPause(RemoteClient* client, PrinterMsg::HMess PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::CTRL_SYSTEM_PAUSE); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); PrinterMsg::Response* resp = respMsg->mutable_response(); if (!BaseCtrl::IsStandBy()) { bool rel=client->m_ScannerCtrl->PauseWork(); @@ -458,14 +458,14 @@ void RemoteClient::HandleCtrlSystemPause(RemoteClient* client, PrinterMsg::HMess else { resp->set_result(false); ErrorMsg* emsg = resp->mutable_errormsg(); - emsg->set_machineid(client->m_MachineCfg->m_serial); + emsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); emsg->set_errormsg(client->m_ScannerCtrl->m_PauseMsg); } } else { resp->set_result(false); ErrorMsg* emsg = resp->mutable_errormsg(); - emsg->set_machineid(client->m_MachineCfg->m_serial); + emsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); emsg->set_errormsg(u8"就绪状态不能暂停"); } client->AddSendMessage(respMsg); @@ -476,7 +476,7 @@ void RemoteClient::HandleCtrlSystemStop(RemoteClient* client, PrinterMsg::HMessa PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::CRTL_SYSTEM_STOP); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); PrinterMsg::Response* resp = respMsg->mutable_response(); if (!BaseCtrl::IsStop() && (BaseCtrl::GetState() != BaseCtrl::STANDBY_STOP)) { bool rel = client->m_ScannerCtrl->StopWork(); @@ -486,14 +486,14 @@ void RemoteClient::HandleCtrlSystemStop(RemoteClient* client, PrinterMsg::HMessa else { resp->set_result(false); ErrorMsg* emsg = resp->mutable_errormsg(); - emsg->set_machineid(client->m_MachineCfg->m_serial); + emsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); emsg->set_errormsg(client->m_ScannerCtrl->m_StopMsg); } } else { resp->set_result(false); ErrorMsg* emsg = resp->mutable_errormsg(); - emsg->set_machineid(client->m_MachineCfg->m_serial); + emsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); emsg->set_errormsg(u8"状态不能暂停"); } client->AddSendMessage(respMsg); @@ -572,11 +572,11 @@ void RemoteClient::HandleLayerDataRequest(RemoteClient* client, PrinterMsg::HMes PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::LAYER_DATA_RESPONSE); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); PrinterMsg::Response* rep= respMsg->mutable_response(); rep->set_result(true); LayerDataRespMsg* ldrm= rep->mutable_layerdatamsg(); - ldrm->set_machineid(client->m_MachineCfg->m_serial); + ldrm->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); ldrm->set_total(total); ldrm->set_index(index); ldrm->set_partid(part->id); @@ -663,7 +663,7 @@ void RemoteClient::HandleCameraDataRequest(RemoteClient* client, PrinterMsg::HMe PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::CAMERA_DATA_RESPONSE); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); HBDCamera* cam = client->m_Camera; PrinterMsg::Response* resp = respMsg->mutable_response(); CameraDataMsg* cdm = resp->mutable_cameradata(); @@ -779,7 +779,7 @@ void RemoteClient::HandleCameraDataRequest(RemoteClient* client, PrinterMsg::HMe } else { resp->set_result(true); - cdm->set_machineid(client->m_MachineCfg->m_serial); + cdm->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); cdm->set_imageformat("jpg"); cdm->set_imagewidth(fixImage.cols); cdm->set_imageheight(fixImage.rows); @@ -816,8 +816,8 @@ void RemoteClient::SendStateChangeMsg() return; PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::STATE_CHANGE); - respMsg->set_id(m_MachineCfg->m_serial); - respMsg->set_mcode(m_MachineCfg->m_MachineCode); + respMsg->set_id(m_MachineCfg->m_serial->GetValueStr()); + respMsg->set_mcode(m_MachineCfg->m_MachineCode->GetValueStr()); EnvInfo info; g_SystemInfo->GetEnvInfo(info); StateChangeMsg* stateMsg = respMsg->mutable_response()->mutable_statechangemsg(); @@ -835,7 +835,7 @@ void RemoteClient::SendStateChangeMsg() std::bitset<32> limit; stateMsg->set_limitflag(limit.to_ulong()); - stateMsg->set_machineid(m_MachineCfg->m_serial); + stateMsg->set_machineid(m_MachineCfg->m_serial->GetValueStr()); stateMsg->set_isdoorclose(info.m_EnvState.m_IsPrintCabinDoorClose); stateMsg->set_acctime(g_SystemInfo->m_StateBean.realCostSeconds * 1000); stateMsg->set_remaintime(g_SystemInfo->m_StateBean.remainMil); @@ -875,8 +875,8 @@ void RemoteClient::SendAlarmMsg(AlarmShowInfo* info) PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::ALARM_NOTIFY_REQUEST); - respMsg->set_id(m_MachineCfg->m_serial); - respMsg->set_mcode(m_MachineCfg->m_MachineCode); + respMsg->set_id(m_MachineCfg->m_serial->GetValueStr()); + respMsg->set_mcode(m_MachineCfg->m_MachineCode->GetValueStr()); AlarmNotifyMsg* msg = respMsg->mutable_request()->mutable_alarmnotifymsg(); msg->set_jobname(m_AlarmInfo.m_JobName); @@ -900,7 +900,7 @@ void RemoteClient::HandleRecordTasksMsg(RemoteClient* client, PrinterMsg::HMessa PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::LOG_RESPONSE_RECORD_TASK); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); PrinterMsg::Response* resp = respMsg->mutable_response(); vector logs; @@ -939,7 +939,7 @@ void RemoteClient::HandleRecordTasksListMsg(RemoteClient* client, PrinterMsg::HM PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::LOG_RESPONSE_RECORD_TASK_LIST); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); PrinterMsg::Response* resp = respMsg->mutable_response(); tm begin; time_t begin_t = msg->request().reqrecordtasklistmsg().beginsecond(); @@ -951,7 +951,7 @@ void RemoteClient::HandleRecordTasksListMsg(RemoteClient* client, PrinterMsg::HM if (end_t <= begin_t || (end_t-begin_t)>60*60*24*90) { respMsg->mutable_response()->set_result(true); ErrorMsg* emsg = resp->mutable_errormsg(); - emsg->set_machineid(client->m_MachineCfg->m_serial); + emsg->set_machineid(client->m_MachineCfg->m_serial->GetValueStr()); emsg->set_errormsg("error time params"); time_t tnow; time(&tnow); @@ -998,7 +998,7 @@ void RemoteClient::HandleVersionResMsg(RemoteClient* client, PrinterMsg::HMessag PrinterMsg::HMessage* respMsg = new PrinterMsg::HMessage(); respMsg->set_type(PrinterMsg::VERSION_RESPONSE); respMsg->set_id(msg->id()); - respMsg->set_mcode(client->m_MachineCfg->m_MachineCode); + respMsg->set_mcode(client->m_MachineCfg->m_MachineCode->GetValueStr()); PrinterMsg::Response* resp = respMsg->mutable_response(); VersionInfoResMsg* versionInfo = resp->mutable_versioninforesmsg(); versionInfo->set_version(g_SystemInfo->m_ProductVersion); diff --git a/PrintS/ScannerCtrl/RTC5Scanner.cpp b/PrintS/ScannerCtrl/RTC5Scanner.cpp index 34745fe..f93dcbf 100644 --- a/PrintS/ScannerCtrl/RTC5Scanner.cpp +++ b/PrintS/ScannerCtrl/RTC5Scanner.cpp @@ -171,7 +171,7 @@ bool RTC5Scanner::Init() n_set_end_of_list(m_ScannerControlCfg->m_ControlNo); ListExecute(1, true); - if (m_MachineCfg->m_IsIntelli) { + if (m_MachineCfg->m_IsIntelli->GetValue()) { StartGetScanInfo(); } @@ -615,7 +615,7 @@ void RTC5Scanner::ListNop() { void RTC5Scanner::CheckAlarm() { - if (!m_MachineCfg->m_IsIntelli)return; + if (!m_MachineCfg->m_IsIntelli->GetValue())return; n_control_command(m_ScannerControlCfg->m_ControlNo, 1, 1, CurrentOperationStateLowAddr); Sleep(2); int xlowstate = n_get_value(m_ScannerControlCfg->m_ControlNo, 1); @@ -707,7 +707,7 @@ void RTC5Scanner::CheckAlarm() void RTC5Scanner::UpdateScannerInfo() { - if (!m_MachineCfg->m_IsIntelli)return; + if (!m_MachineCfg->m_IsIntelli->GetValue())return; n_control_command(m_ScannerControlCfg->m_ControlNo, 1, 1, ActualPositionAddr); Sleep(2); diff --git a/PrintS/ScannerCtrl/Scanner.cpp b/PrintS/ScannerCtrl/Scanner.cpp index 1e68423..c6658e6 100644 --- a/PrintS/ScannerCtrl/Scanner.cpp +++ b/PrintS/ScannerCtrl/Scanner.cpp @@ -1193,7 +1193,7 @@ void Scanner::WaitHeatingScanner() void Scanner::StartGetScanInfo() { - if (!m_MachineCfg->m_IsIntelli)return; + if (!m_MachineCfg->m_IsIntelli->GetValue())return; if (m_InfoThread != INVALID_HANDLE_VALUE) { m_IsAutoInfo = false; m_InfoRunFlag = false; diff --git a/PrintS/ScannerCtrl/ScannerCtrl.cpp b/PrintS/ScannerCtrl/ScannerCtrl.cpp index 20e079c..5aed9f8 100644 --- a/PrintS/ScannerCtrl/ScannerCtrl.cpp +++ b/PrintS/ScannerCtrl/ScannerCtrl.cpp @@ -100,7 +100,7 @@ bool ScannerCtrl::Init() { cfg->m_SeqNo = scannerControlCfgsMap->size() + 1; cfg->m_CardName = "Laser" + to_string(cfg->m_SeqNo); cfg->m_ControlNo = s->first; - cfg->m_ControlType = m_MachineCfg->m_ScanControl; + cfg->m_ControlType = m_MachineCfg->m_ScanControl->GetValue(); cfg->m_SerialNo = s->second; cfg->m_HadMatch = false; cfg->m_IsEnable = true; @@ -119,6 +119,11 @@ bool ScannerCtrl::Init() { { g_log->TraceError(g_LngManager->Log_NoScannerCtrl->ShowText()); m_InitErrorInfos.push_back(g_LngManager->Log_NoScannerCtrl->ShowText()); + + //for (int i = 0; i < 4; ++i) { //wxxtest + // Scanner* scanner = new RTC5Scanner(nullptr, i); + // m_scan.push_back(scanner); + //} return false; } @@ -1241,7 +1246,7 @@ void ScannerCtrl::DispatchDataBlock() if (m_IsDownSkinContinue)m_DownSkinStopFlag++; else m_DownSkinStopFlag = 1; - if (m_MachineCfg->m_IsIntelli) { + if (m_MachineCfg->m_IsIntelli->GetValue()) { vector scannerStatus; vector focusStatus; diff --git a/PrintS/additional/InfraredTemp/InfraredTemp.cpp b/PrintS/additional/InfraredTemp/InfraredTemp.cpp index 0079110..b64adeb 100644 --- a/PrintS/additional/InfraredTemp/InfraredTemp.cpp +++ b/PrintS/additional/InfraredTemp/InfraredTemp.cpp @@ -800,9 +800,9 @@ void InfraredTemp::CalcPrintPlatform() cv::Point2f srcTri[4]; srcTri[0] = cv::Point2f(0, 0); - srcTri[1] = cv::Point2f(m_MachineCfg->m_PlatformLength, 0); - srcTri[2] = cv::Point2f(0, m_MachineCfg->m_PlatformWidth); - srcTri[3] = cv::Point2f(m_MachineCfg->m_PlatformLength, m_MachineCfg->m_PlatformWidth); + srcTri[1] = cv::Point2f(m_MachineCfg->m_PlatformLength->GetValue(), 0); + srcTri[2] = cv::Point2f(0, m_MachineCfg->m_PlatformWidth->GetValue()); + srcTri[3] = cv::Point2f(m_MachineCfg->m_PlatformLength->GetValue(), m_MachineCfg->m_PlatformWidth->GetValue()); cv::Point2f dstTri[4]; dstTri[0] = cv::Point2f(m_PrintPlatform.pa.x, m_PrintPlatform.pa.y); dstTri[1] = cv::Point2f(m_PrintPlatform.pb.x, m_PrintPlatform.pb.y); @@ -845,8 +845,8 @@ void InfraredTemp::CalcRefRegion(TempRegion* tr) { if (!tr)return; - float halfWidth = (float)m_MachineCfg->m_PlatformLength / 2.0f; - float halfHigh = (float)m_MachineCfg->m_PlatformWidth / 2.0f; + float halfWidth = (float)m_MachineCfg->m_PlatformLength->GetValue() / 2.0f; + float halfHigh = (float)m_MachineCfg->m_PlatformWidth->GetValue() / 2.0f; float ax = halfWidth + tr->m_PartMinX; float ay = halfHigh - tr->m_PartMaxY; float bx = halfWidth + tr->m_PartMaxX; diff --git a/PrintS/job/JobFileProcessor.cpp b/PrintS/job/JobFileProcessor.cpp index ea99367..afc7feb 100644 --- a/PrintS/job/JobFileProcessor.cpp +++ b/PrintS/job/JobFileProcessor.cpp @@ -1,4 +1,4 @@ -#include "JobFileProcessor.h" +#include "JobFileProcessor.h" #include "../utils/StringHelper.h" #include #include @@ -22,7 +22,7 @@ int JobFileProcessor::Process(string jobfile) if(!m_job_content.LoadFile(extpath))return BP_ERR_LOAD_CONTENT_FILE_FAILED; if (m_job_content.m_container_content->container_files->metadata_file->encryption_strategy_ref=="none") { - if (!m_MachineCfg->m_SupportNonEncMagic) { + if (!m_MachineCfg->m_SupportNonEncMagic->GetValue()) { return BP_ERR_NOT_SUPPORT_DATA; } } diff --git a/PrintS/job/MetaData.cpp b/PrintS/job/MetaData.cpp index e3656c3..c45f0ec 100644 --- a/PrintS/job/MetaData.cpp +++ b/PrintS/job/MetaData.cpp @@ -224,7 +224,7 @@ void MetaData::ReCalcEvaTime() } double milsec = 0.0; m_RemainTime = 0; - if (m_HasOrder && m_MachineCfg->m_MachineType == MachineTypeCfg::HBD_1000) { + if (m_HasOrder && m_MachineCfg->m_MachineType->GetValue() == MachineTypeCfg::HBD_1000) { map* laserCfgsMap = ConfigManager::GetInstance()->GetScannerControlCfg(); for (size_t layerindex = 0; layerindex < layers->vector_layers.size(); ++layerindex) { map areaTime; diff --git a/PrintS/output/Release/log/2024.hbd b/PrintS/output/Release/log/2024.hbd index d80e49ab1e3d796c85fdfdcc97c57cf3ba5684ac..77b6d43e74bae95cf9d4160859454c0f2da37e5d 100644 GIT binary patch delta 24787 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

RDKBiv|l5ld-A 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 yqEswSxrtk2GS^iTi)UiYdRl(cvExnv{e;h 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 + m_streamClient->PushMsg(msg); } } @@ -147,17 +150,19 @@ void DataHandle::ParamReadUsage() { printf(" 26: " COLOR_YELLOW "print extcfg param data...\n" COLOR_RESET); printf(" 27: " COLOR_YELLOW "print runcfg param data...\n" COLOR_RESET); printf(" 28: " COLOR_YELLOW "print infraredtemp cfg param data...\n" COLOR_RESET); - printf(" 29: " COLOR_YELLOW "print moldcfg param data...\n" COLOR_RESET); - printf(" 30: " COLOR_YELLOW "print loadcfg param data...\n" COLOR_RESET); - printf(" 31: " COLOR_YELLOW "print armcfgparam data...\n" COLOR_RESET); - printf(" 32: " COLOR_YELLOW "print supplycfgparam data...\n" COLOR_RESET); - printf(" 33: " COLOR_YELLOW "print cleancfgparam data...\n" COLOR_RESET); - printf(" 34: " COLOR_YELLOW "print elecfgparam data...\n" COLOR_RESET); - printf(" 35: " COLOR_YELLOW "print loadparamrsp data...\n" COLOR_RESET); - printf(" 36: " COLOR_YELLOW "print scan ctrl state data...\n" COLOR_RESET); - printf(" 37: " COLOR_YELLOW "print scan ctrl Param data...\n" COLOR_RESET); - printf(" 38: " COLOR_YELLOW "print xy scan state data...\n" COLOR_RESET); - printf(" 39: " COLOR_YELLOW "print camera param data...\n" COLOR_RESET); + printf(" 29: " COLOR_YELLOW "print machine cfg param data...\n" COLOR_RESET); + + printf(" 30: " COLOR_YELLOW "print moldcfg param data...\n" COLOR_RESET); + printf(" 31: " COLOR_YELLOW "print loadcfg param data...\n" COLOR_RESET); + printf(" 32: " COLOR_YELLOW "print armcfgparam data...\n" COLOR_RESET); + printf(" 33: " COLOR_YELLOW "print supplycfgparam data...\n" COLOR_RESET); + printf(" 34: " COLOR_YELLOW "print cleancfgparam data...\n" COLOR_RESET); + printf(" 35: " COLOR_YELLOW "print elecfgparam data...\n" COLOR_RESET); + printf(" 36: " COLOR_YELLOW "print loadparamrsp data...\n" COLOR_RESET); + printf(" 37: " COLOR_YELLOW "print scan ctrl state data...\n" COLOR_RESET); + printf(" 38: " COLOR_YELLOW "print scan ctrl Param data...\n" COLOR_RESET); + printf(" 39: " COLOR_YELLOW "print xy scan state data...\n" COLOR_RESET); + printf(" 40: " COLOR_YELLOW "print camera param data...\n" COLOR_RESET); } int DataHandle::Request(int index) { @@ -191,9 +196,14 @@ int DataHandle::Request(int index) { continue; } else if (userInput == "h") { - ParamReadUsage(); continue; + ParamReadUsage(); + } + else if (userInput.find("push") != string::npos) { + UpdateParam(userInput); + } + else { + ParamRequest(ConverType::TryToI(userInput)); } - ParamRequest(stoi(userInput)); } break; default: @@ -215,16 +225,16 @@ void DataHandle::AllTest() { void DataHandle::ParamRequest(int index) { if (index == VERSIONRSP) { - SetPushMsg(VERSIONREQ); //获取版本信息 + PushMsg(VERSIONREQ); //获取版本信息 } else if (index >= PARAMLIMITCFGPARAM && index <= ELECFGPARAM) { - SetPushMsg(REQUEST); + PushMsg(REQUEST); } else if(index == LOADPARAMRSP){ - SetPushMsg(LOADPARAM); + PushMsg(LOADPARAM); } else if (index == XYSCANSTATE) { - SetPushMsg(REQUEST,to_string(index)); + PushMsg(REQUEST,to_string(index)); } m_printIndex = index; @@ -239,9 +249,37 @@ void DataHandle::ParamRequest(int index) { } } +} + + +//选择一个参数更新到服务 +void DataHandle::UpdateParam(const string& input) { + + int index = ConverType::TryToI(input.substr(5)); + switch (index) { + case PARAMLIMITCFGPARAM: + break; + case EXTCFGPARAM: break; + case RUNCFGPARAM: + PushMsg(RUNCFG, "FanFreqLowLimit", to_string(11), iFLOAT);//runcfg test + break; + case INFRAREDTEMPCFGPARAM: + PushMsg(INFRAREDTEMPCFG, "ReflectTempAssist", to_string(11), iFLOAT); //infraredtempcfg test + break; + case MACHINECFGPARAM: + PushMsg(MACHINECFG, "lastStartTime", to_string(time(nullptr)), iTIMET); //machinecfg test + break; + case ELECFGPARAM: + break; + case LOADPARAMRSP: + break; + case XYSCANSTATE: + break; + default: + break; + } + - SetPushMsg(WRITETYPE::RUNCFG, "FanFreqLowLimit", to_string(11), iFLOAT); //runcfg test - SetPushMsg(WRITETYPE::INFRAREDTEMPCFG, "ReflectTempAssist", to_string(11), iFLOAT); //runcfg test } @@ -249,7 +287,7 @@ void DataHandle::ParamRequest(int index) { void DataHandle::AxisMoveTest() { int count =(int)MACHINEFUNC::END0; for (int i = 0; i < count; ++i) { - SetPushMsg(WRITETYPE::AXISMOVEFUNC,to_string(i)); + PushMsg(WRITETYPE::AXISMOVEFUNC,to_string(i)); printf("发送请求%d成功...\n", i); Sleep(100); } @@ -263,13 +301,13 @@ void DataHandle::ScanCtrlTest() { int count = (int)SCANCTRLFUNC::END1; for (int i = 0; i < count; ++i) { if (i == REMOVESCANNER) { - SetPushMsg(WRITETYPE::SCANCTRLFUNC, to_string(i), to_string(1),iINT); + PushMsg(WRITETYPE::SCANCTRLFUNC, to_string(i), to_string(1),iINT); } else if (i == STOPHEATINGMOTION) { - SetPushMsg(WRITETYPE::SCANCTRLFUNC, to_string(i),to_string(0),iBOOL); + PushMsg(WRITETYPE::SCANCTRLFUNC, to_string(i),to_string(0),iBOOL); } else { - SetPushMsg(WRITETYPE::SCANCTRLFUNC, to_string(i)); + PushMsg(WRITETYPE::SCANCTRLFUNC, to_string(i)); } printf("发送请求%d成功...\n", i); @@ -315,8 +353,8 @@ void DataHandle::CameraTest() { for (int i = 0; i < count; ++i) { if (i == GETSHOWIMAGE || i == GETSHOWIMAGES) continue; - if(i == SETDEMANDCATPURE) SetPushMsg(CAMERAFUNC, to_string(i),to_string(1),iBOOL); - else SetPushMsg(CAMERAFUNC, to_string(i)); + if(i == SETDEMANDCATPURE) PushMsg(CAMERAFUNC, to_string(i),to_string(1),iBOOL); + else PushMsg(CAMERAFUNC, to_string(i)); printf("发送请求%d成功...\n", i); Sleep(100); } @@ -343,16 +381,16 @@ void DataHandle::CameraTest() { Sleep(100); //修改参数 - SetPushMsg(WRITETYPE::CAMERAPARAMUPDATE,"LastMouRefImgPosX", to_string(10),iINT); - SetPushMsg(WRITETYPE::CAMERAPARAMUPDATE,"LastMouRefImgPosY", to_string(100),iINT); - SetPushMsg(WRITETYPE::CAMERAPARAMUPDATE,"ShowFlag", to_string(1),iBOOL); + PushMsg(WRITETYPE::CAMERAPARAMUPDATE,"LastMouRefImgPosX", to_string(10),iINT); + PushMsg(WRITETYPE::CAMERAPARAMUPDATE,"LastMouRefImgPosY", to_string(100),iINT); + PushMsg(WRITETYPE::CAMERAPARAMUPDATE,"ShowFlag", to_string(1),iBOOL); printf("CAMERAPARAMUPDATE update finish\n"); } void DataHandle::PurifierTest() { - SetPushMsg(PURIFIERFUNC, to_string(STARTAUTODEOXYGEN)); + PushMsg(PURIFIERFUNC, to_string(STARTAUTODEOXYGEN)); printf("STARTAUTODEOXYGEN is called...\n"); - SetPushMsg(PURIFIERFUNC, to_string(STOPAUTODEOXYGEN)); + PushMsg(PURIFIERFUNC, to_string(STOPAUTODEOXYGEN)); printf("STOPAUTODEOXYGEN is called...\n"); } diff --git a/TestClient/DataManage/DataHandle.h b/TestClient/DataManage/DataHandle.h index e7c62a8..ed7f6ac 100644 --- a/TestClient/DataManage/DataHandle.h +++ b/TestClient/DataManage/DataHandle.h @@ -19,7 +19,7 @@ public: static void DataCallBackProc(void* pthis, const ReadData& msg); - void SetPushMsg(WRITETYPE dataType, const string& nameKey = "", const string& strValue = "", DATATYPE valueType = UNKNOW); + void PushMsg(WRITETYPE dataType, const string& nameKey = "", const string& strValue = "", DATATYPE valueType = UNKNOW); string GetVersion()const {return m_version;} @@ -32,6 +32,8 @@ public: void CameraTest(); //相机功能测试 void PurifierTest(); //净化器功能测试 + void UpdateParam(const string& input); + void Usage(); void ParamReadUsage(); diff --git a/TestClient/DataManage/RWData.h b/TestClient/DataManage/RWData.h index 6398e0a..a864727 100644 --- a/TestClient/DataManage/RWData.h +++ b/TestClient/DataManage/RWData.h @@ -41,6 +41,7 @@ enum READTYPE { EXTCFGPARAM, RUNCFGPARAM, //runcfg 参数 INFRAREDTEMPCFGPARAM, //InfraredTempCfg 参数 + MACHINECFGPARAM, //MachineCfg 参数 MOLDCFGPARAM, LOADCFGPARAM, @@ -72,6 +73,7 @@ enum DATATYPE { iUCHAR, iWORD, iDOUBLE, + iTIMET, UNKNOW, }; @@ -114,6 +116,8 @@ enum WRITETYPE { EXTCFG, RUNCFG, INFRAREDTEMPCFG, + MACHINECFG, + LOADPARAM, //装载参数 diff --git a/TestClient/DataManage/StreamClient.cpp b/TestClient/DataManage/StreamClient.cpp index 7b7bbb2..86e6250 100644 --- a/TestClient/DataManage/StreamClient.cpp +++ b/TestClient/DataManage/StreamClient.cpp @@ -55,7 +55,7 @@ bool StreamClient::GetPushMsg(WriteData& msg) { } -void StreamClient::SetPushMsg(const WriteData& msg) { +void StreamClient::PushMsg(const WriteData& msg) { std::lock_guard lock(m_msgLock); m_msgList.emplace_back(msg); } diff --git a/TestClient/DataManage/StreamClient.h b/TestClient/DataManage/StreamClient.h index fbafb7f..4757079 100644 --- a/TestClient/DataManage/StreamClient.h +++ b/TestClient/DataManage/StreamClient.h @@ -31,7 +31,7 @@ public: m_dataCallBack = dataCallBack; } - void SetPushMsg(const WriteData& msg); + void PushMsg(const WriteData& msg); bool GetLayerByIndex(int index, ::stream::ResponseAny* response); int RegistRequest(const WriteData& writeData, ::stream::ResponseAny* response); int Request(const WriteData& writeData, ::stream::ResponseAny* response); diff --git a/TestClient/utils/ConverType.h b/TestClient/utils/ConverType.h index 71da78d..24f6c81 100644 --- a/TestClient/utils/ConverType.h +++ b/TestClient/utils/ConverType.h @@ -12,10 +12,10 @@ public: return ret; } catch (const std::invalid_argument& e) { - printf("input is not number...\n"); + printf("input is not number...error:%s\n", e.what()); } catch (const std::out_of_range& e) { - printf("input number is out of int range...\n"); + printf("input number is out of int range...error:%s\n", e.what()); } return ret; } @@ -27,10 +27,10 @@ public: return ret; } catch (const std::invalid_argument& e) { - printf("input is not float...\n"); + printf("input is not float...error:%s\n", e.what()); } catch (const std::out_of_range& e) { - printf("input number is out of float range...\n"); + printf("input number is out of float range...error:%s\n", e.what()); } return ret; }