diff --git a/PrintS/Config/ConfigManager.cpp b/PrintS/Config/ConfigManager.cpp index acabac9..74fe37e 100644 --- a/PrintS/Config/ConfigManager.cpp +++ b/PrintS/Config/ConfigManager.cpp @@ -525,6 +525,10 @@ void ConfigManager::CallFuncs(const ReadData& rd, const list& lst, ::strea RedTestCfgStart(); break; case REDTESTCFGSTOP: RedTestCfgStop(); break; + case SCANERCTRLCFGREQ: + ScanerCtrlCfgReq(response); + printf("SCANERCTRLCFG responded...\n"); + break; default: break; } @@ -532,7 +536,7 @@ void ConfigManager::CallFuncs(const ReadData& rd, const list& lst, ::strea } -void ConfigManager::ScanerCtrlCfgReq(const ReadData& rd, const list& lst, ::stream::ResponseAny** response) { +void ConfigManager::ScanerCtrlCfgReq(::stream::ResponseAny** response) { stream::ScannerCrtlCfgResp result; auto start = m_ScannerControlCfgDao->m_ScannerControlCfgMap.begin(); @@ -621,7 +625,7 @@ void ConfigManager::SendPowderCfg() { } -void ConfigManager::UpdateCfg(const ReadData& rd) { +void ConfigManager::UpdateCfg(const ReadData& rd,const list& lst) { switch (rd.dataType) { @@ -655,12 +659,12 @@ void ConfigManager::UpdateCfg(const ReadData& rd) { break; case POWDERSET: if (rd.handleType == TOTAL) { - m_ParamSetCfg.UpdatePowderCfg(rd); + m_ParamSetCfg.UpdatePowderCfg(rd,lst); SendPowderCfg(); } break; case SCANERCTRLCFG: - m_ScannerControlCfgDao->m_ScannerControlCfgMap[ConverType::TryToI(rd.nameKey)]->Update(rd); + m_ScannerControlCfgDao->m_ScannerControlCfgMap[ConverType::TryToI(rd.nameKey)]->Update(rd, lst); break; default: break; diff --git a/PrintS/Config/ConfigManager.h b/PrintS/Config/ConfigManager.h index 7e94421..1ee69e0 100644 --- a/PrintS/Config/ConfigManager.h +++ b/PrintS/Config/ConfigManager.h @@ -48,8 +48,7 @@ enum ConfigFunc{ REDTESTCFGSTART, //红光测试配置开始 REDTESTCFGSTOP, //红光测试配置结束 - //FIXPOINTDAOADD, //FixPointDao add - //FIXPOINTDAODEL, //FixPointDao del + SCANERCTRLCFGREQ, }; @@ -135,9 +134,9 @@ public: void SavePreJobParamCfg() { m_PrepareJobCfgDao->Save(m_MachineCfg.m_MachineType->GetValue(), m_PrepareJobCfgs); } //不传 void SendCfgToClients(); - void UpdateCfg(const ReadData& rd); + void UpdateCfg(const ReadData& rd, const list& lst); void CallFuncs(const ReadData& rd, const list& lst = list(), ::stream::ResponseAny** response = nullptr); - void ScanerCtrlCfgReq(const ReadData& rd, const list& lst, ::stream::ResponseAny** response); // + void ScanerCtrlCfgReq(::stream::ResponseAny** response); // private: ConfigManager(const ConfigManager&) {}; ConfigManager& operator=(const ConfigManager&) {}; diff --git a/PrintS/Config/bean/CorrectParamCfg.cpp b/PrintS/Config/bean/CorrectParamCfg.cpp index 6d58755..652a144 100644 --- a/PrintS/Config/bean/CorrectParamCfg.cpp +++ b/PrintS/Config/bean/CorrectParamCfg.cpp @@ -145,8 +145,8 @@ void CorrectParamCfg::SetCorrectCfg(stream::CorrectParamCfg* cp) { } -void CorrectParamCfg::Update(const ReadData& rd){ - for (auto start = rd.its.begin(); start != rd.its.end(); ++start) { +void CorrectParamCfg::Update(const ReadData& rd, const list& lst){ + for (auto start = lst.begin(); start != lst.end(); ++start) { if (start->nameKey == "xmeasure_min") m_xmeasure_min = ConverType::TryToD(start->strValue); else if (start->nameKey == "xmeasure_max") m_xmeasure_max = ConverType::TryToD(start->strValue); else if (start->nameKey == "ymeasure_min") m_ymeasure_min = ConverType::TryToD(start->strValue); diff --git a/PrintS/Config/bean/CorrectParamCfg.h b/PrintS/Config/bean/CorrectParamCfg.h index a16df91..d5fa0f2 100644 --- a/PrintS/Config/bean/CorrectParamCfg.h +++ b/PrintS/Config/bean/CorrectParamCfg.h @@ -13,7 +13,7 @@ public: void GetUpdateSql(int cno,vector& ups); void SetCorrectCfg(stream::CorrectParamCfg* cp); - void Update(const ReadData& rd); + void Update(const ReadData& rd, const list& lst); public: double m_xmeasure_min; //x可打印最小位置 double m_xmeasure_max; //x可打印最大位置 diff --git a/PrintS/Config/bean/ParamSetCfg.cpp b/PrintS/Config/bean/ParamSetCfg.cpp index a82ff08..4af6f58 100644 --- a/PrintS/Config/bean/ParamSetCfg.cpp +++ b/PrintS/Config/bean/ParamSetCfg.cpp @@ -171,7 +171,7 @@ void ParamSetCfg::GetUpdateSql(vector& ups) // return true; //} -void ParamSetCfg::UpdatePowderCfg(const ReadData& wd) { //全量更新层供粉量配置 +void ParamSetCfg::UpdatePowderCfg(const ReadData& wd, const list& lst) { //全量更新层供粉量配置 std::unique_lock lck(m_sMtx); if (ParamSetVec.empty()) return; @@ -182,7 +182,7 @@ void ParamSetCfg::UpdatePowderCfg(const ReadData& wd) { //全量更新层供 } ParamSetVec[0]->PowderSets.clear(); - for (auto item = wd.its.begin(); item != wd.its.end(); ++item) { + for (auto item = lst.begin(); item != lst.end(); ++item) { PowderSet* ppowder = new PowderSet(item->start_layer, item->end_layer, item->powder); ParamSetVec[0]->PowderSets.emplace_back(ppowder); } diff --git a/PrintS/Config/bean/ParamSetCfg.h b/PrintS/Config/bean/ParamSetCfg.h index c56fcb8..b9fe606 100644 --- a/PrintS/Config/bean/ParamSetCfg.h +++ b/PrintS/Config/bean/ParamSetCfg.h @@ -43,7 +43,7 @@ public: //bool Delete(string name); //没用到 void GetPowderCfg(vector& powderVec); - void UpdatePowderCfg(const ReadData& wd); + void UpdatePowderCfg(const ReadData& wd,const list& lst); public: static const string TABLE_NAME; static const string FIELD_ID; diff --git a/PrintS/Config/bean/PowerCompensate.cpp b/PrintS/Config/bean/PowerCompensate.cpp index a80af51..d6bc9b7 100644 --- a/PrintS/Config/bean/PowerCompensate.cpp +++ b/PrintS/Config/bean/PowerCompensate.cpp @@ -83,9 +83,9 @@ float PowerCompensateCfg::CalcPowerCompensate(float power) return rel; } -void PowerCompensateCfg::Update(const ReadData& rd) { - auto start = rd.its.begin(); - while (start != rd.its.end()) { +void PowerCompensateCfg::Update(const ReadData& rd, const list& lst) { + auto start = lst.begin(); + while (start != lst.end()) { int percent = ConverType::TryToI(start->nameKey); for (auto it = m_pcs.begin(); it != m_pcs.end(); ++it) { if ((*it)->m_percent == percent) { @@ -96,7 +96,6 @@ void PowerCompensateCfg::Update(const ReadData& rd) { ++start; } - } bool PowerCompensateLess(const PowerCompensate * m1, const PowerCompensate * m2) { diff --git a/PrintS/Config/bean/PowerCompensate.h b/PrintS/Config/bean/PowerCompensate.h index 92d2de8..8225d76 100644 --- a/PrintS/Config/bean/PowerCompensate.h +++ b/PrintS/Config/bean/PowerCompensate.h @@ -34,7 +34,7 @@ public: PowerCompensateCfg(); ~PowerCompensateCfg(); float CalcPowerCompensate(float power); - void Update(const ReadData& rd); + void Update(const ReadData& rd, const list& lst); public: vector m_pcs; }; diff --git a/PrintS/Config/bean/ScanParamCfg.cpp b/PrintS/Config/bean/ScanParamCfg.cpp index 50e6cb8..24b4af1 100644 --- a/PrintS/Config/bean/ScanParamCfg.cpp +++ b/PrintS/Config/bean/ScanParamCfg.cpp @@ -127,9 +127,9 @@ void ScanParamCfg::SetScanParam(stream::ScanParamCfg* sp) { } -void ScanParamCfg::Update(const ReadData& rd) { +void ScanParamCfg::Update(const ReadData& rd,const list& lst) { - for (auto start = rd.its.begin(); start != rd.its.end(); ++start) { + for (auto start = lst.begin(); start != lst.end(); ++start) { if (start->nameKey == "edge_level") m_edge_level = ConverType::TryToI(start->strValue); else if (start->nameKey == "edge_level_min") m_edge_level_min = ConverType::TryToI(start->strValue); else if (start->nameKey == "edge_level_max") m_edge_level_max = ConverType::TryToI(start->strValue); diff --git a/PrintS/Config/bean/ScanParamCfg.h b/PrintS/Config/bean/ScanParamCfg.h index b93a8ee..be54ca7 100644 --- a/PrintS/Config/bean/ScanParamCfg.h +++ b/PrintS/Config/bean/ScanParamCfg.h @@ -13,7 +13,7 @@ public: void GetUpdateSql(int cno,vector& ups); void SetScanParam(stream::ScanParamCfg* sp); - void Update(const ReadData& rd); + void Update(const ReadData& rd, const list& lst); public: string CONFIG_NAME; static string FIELD_EDGE_LEVEL; diff --git a/PrintS/Config/bean/ScanTestCfg.cpp b/PrintS/Config/bean/ScanTestCfg.cpp index e35c250..64abcce 100644 --- a/PrintS/Config/bean/ScanTestCfg.cpp +++ b/PrintS/Config/bean/ScanTestCfg.cpp @@ -120,8 +120,8 @@ void ScanTestCfg::SetScanTestCfg(stream::ScanTestCfg* cp) { } -void ScanTestCfg::Update(const ReadData& rd) { - for (auto start = rd.its.begin(); start != rd.its.end(); ++start) { +void ScanTestCfg::Update(const ReadData& rd, const list& lst) { + for (auto start = lst.begin(); start != lst.end(); ++start) { if (start->nameKey == "debug_shape") m_debug_shape = ConverType::TryToI(start->strValue); else if (start->nameKey == "shape_size") m_shape_size = ConverType::TryToI(start->strValue); else if (start->nameKey == "shape_size_min") m_shape_size_min = ConverType::TryToI(start->strValue); diff --git a/PrintS/Config/bean/ScanTestCfg.h b/PrintS/Config/bean/ScanTestCfg.h index 88f0092..0560fcb 100644 --- a/PrintS/Config/bean/ScanTestCfg.h +++ b/PrintS/Config/bean/ScanTestCfg.h @@ -14,7 +14,7 @@ public: void SetScanTestCfg(stream::ScanTestCfg* cp); - void Update(const ReadData& rd); + void Update(const ReadData& rd, const list& lst); public: int m_debug_shape; int m_shape_size; diff --git a/PrintS/Config/bean/ScannerControlCfg.cpp b/PrintS/Config/bean/ScannerControlCfg.cpp index 2520850..7b004f3 100644 --- a/PrintS/Config/bean/ScannerControlCfg.cpp +++ b/PrintS/Config/bean/ScannerControlCfg.cpp @@ -70,12 +70,12 @@ void ScannerControlCfg::SetScannerCtrlCfg(stream::ScannerCrtlCfgData* sccd) { sccd->set_hadmatch(m_HadMatch); } -void ScannerControlCfg::Update(const ReadData& rd) { +void ScannerControlCfg::Update(const ReadData& rd,const list& lst) { SCCFGP type = (SCCFGP)ConverType::TryToI(rd.strValue); if (type == CTRLCFG) { - auto start = rd.its.begin(); - while (start != rd.its.end()) { + auto start = lst.begin(); + while (start != lst.end()) { if (start->nameKey == "ControlNo") { m_ControlNo = ConverType::TryToI(start->strValue); } @@ -104,28 +104,28 @@ void ScannerControlCfg::Update(const ReadData& rd) { } } else if (type == SCANPARAMCFG) { - m_ScanCfgWrapper.m_ScanParamCfg.Update(rd); + m_ScanCfgWrapper.m_ScanParamCfg.Update(rd,lst); } else if (type == HATCHINGPARAMS) { - m_ScanCfgWrapper.m_HatchingParams.Update(rd); + m_ScanCfgWrapper.m_HatchingParams.Update(rd, lst); } else if (type == BORDERPARAMS) { - m_ScanCfgWrapper.m_BorderParams.Update(rd); + m_ScanCfgWrapper.m_BorderParams.Update(rd, lst); } else if (type == SUPPORTPARAMS) { - m_ScanCfgWrapper.m_SupportParams.Update(rd); + m_ScanCfgWrapper.m_SupportParams.Update(rd, lst); } else if (type == CORRECTPARAMCFG) { - m_ScanCfgWrapper.m_CorrectParamCfg.Update(rd); + m_ScanCfgWrapper.m_CorrectParamCfg.Update(rd, lst); } else if (type == SCANTESTCFG) { - m_ScanCfgWrapper.m_ScanTestCfg.Update(rd); + m_ScanCfgWrapper.m_ScanTestCfg.Update(rd, lst); } else if (type == SKYWRITINGCFG) { - m_ScanCfgWrapper.m_SkyWritingCfg.Update(rd); + m_ScanCfgWrapper.m_SkyWritingCfg.Update(rd, lst); } else if (type == POWERCOMPENSATECFG) { - m_ScanCfgWrapper.m_PowerCompensateCfg.Update(rd); + m_ScanCfgWrapper.m_PowerCompensateCfg.Update(rd, lst); } //else if (type == TIMEPOWERCOMPENSATECFG) { // m_ScanCfgWrapper.m_TimePowerCompensateCfg.Update(rd); diff --git a/PrintS/Config/bean/ScannerControlCfg.h b/PrintS/Config/bean/ScannerControlCfg.h index fc49571..ccdfeb8 100644 --- a/PrintS/Config/bean/ScannerControlCfg.h +++ b/PrintS/Config/bean/ScannerControlCfg.h @@ -41,7 +41,7 @@ public: void SetScannerCtrlCfg(stream::ScannerCrtlCfgData* ); - void Update(const ReadData& rd); + void Update(const ReadData& rd, const list& lst); public: //IntData* m_Index; int m_SeqNo; //编号 ConfigManager中的m_ScannerControlCfgMap的key diff --git a/PrintS/Config/bean/SkyWritingCfg.cpp b/PrintS/Config/bean/SkyWritingCfg.cpp index 6053df5..5a70958 100644 --- a/PrintS/Config/bean/SkyWritingCfg.cpp +++ b/PrintS/Config/bean/SkyWritingCfg.cpp @@ -87,8 +87,8 @@ void SkyWritingCfg::SetSkyWritingCfg(stream::SkyWritingCfg * cp) { cp->set_limitemax(m_LimiteMax); } -void SkyWritingCfg::Update(const ReadData& rd) { - for (auto start = rd.its.begin(); start != rd.its.end(); ++start) { +void SkyWritingCfg::Update(const ReadData& rd,const list& lst) { + for (auto start = lst.begin(); start != lst.end(); ++start) { if (start->nameKey == "IsEnable") m_IsEnable =(bool) ConverType::TryToI(start->strValue); else if (start->nameKey == "Timelag") m_Timelag = ConverType::TryToI(start->strValue); else if (start->nameKey == "TimelagMin") m_TimelagMin = ConverType::TryToI(start->strValue); diff --git a/PrintS/Config/bean/SkyWritingCfg.h b/PrintS/Config/bean/SkyWritingCfg.h index bc8c3a5..63db1ec 100644 --- a/PrintS/Config/bean/SkyWritingCfg.h +++ b/PrintS/Config/bean/SkyWritingCfg.h @@ -14,7 +14,7 @@ public: void GetUpdateSql(int cno,vector& ups); void SetSkyWritingCfg(stream::SkyWritingCfg* cp); - void Update(const ReadData& rd); + void Update(const ReadData& rd, const list& lst); public: bool m_IsEnable; double m_Timelag; diff --git a/PrintS/DataManage/DataHandle.cpp b/PrintS/DataManage/DataHandle.cpp index 4ccec2e..b855280 100644 --- a/PrintS/DataManage/DataHandle.cpp +++ b/PrintS/DataManage/DataHandle.cpp @@ -24,9 +24,6 @@ void DataHandle::FuncDataCallBackProc(void* pthis,const ReadData& msg, const lis else if ((READTYPE)msg.dataType == CONFIGFUNC) { p->m_config->CallFuncs(msg, lst, response); } - else if ((READTYPE)msg.dataType == SCANERCTRLCFG) { - p->m_config->ScanerCtrlCfgReq(msg, lst, response); - } else if ((READTYPE)msg.dataType == DIRCTROYFUNC) { p->m_controller->m_fileDialog.Request(msg,response); } @@ -126,7 +123,7 @@ void DataHandle::DataCallBackHandle(const ReadData& msg, const std::list& case ALARMCFG: case POWDERSET: case SCANERCTRLCFG: - ConfigManager::GetInstance()->UpdateCfg(msg); + ConfigManager::GetInstance()->UpdateCfg(msg, its); break; case JOBCONTROLLERFUNC: m_controller->m_jobController.CallFuncs(msg,its); break; diff --git a/PrintS/DataManage/RWData.h b/PrintS/DataManage/RWData.h index e7dc8c5..0edfcb0 100644 --- a/PrintS/DataManage/RWData.h +++ b/PrintS/DataManage/RWData.h @@ -120,7 +120,6 @@ enum WRITETYPE { PAUSEALARMCFGPARAM, //AlarmCfgWrapper pause参数 WARNALARMCFGPARAM, //AlarmCfgWrapper warn参数 POWDERSETPARAM, //PowderSet 参数 - //SCANNERCONTROLCFGPARAM, //ScannerControlCfg 参数 MOLDCFGPARAM, LOADCFGPARAM, @@ -135,7 +134,7 @@ enum WRITETYPE { XYSCANSTATE, //XYScanState参数 在参数更新的时候才会发送到客户端 CAMERAPARAM, //相机参数 - JOBCONTROLLER, //JobController 参数 + JOBCTRLPARAM, //JobController 参数 DEFAULT = 900, //默认值 TEST = 1000, //test diff --git a/PrintS/job/JobController.cpp b/PrintS/job/JobController.cpp index 7b94aac..8437132 100644 --- a/PrintS/job/JobController.cpp +++ b/PrintS/job/JobController.cpp @@ -88,7 +88,6 @@ bool JobController::LoadJob(string filepath) delete m_CurrentJob; m_CurrentJob = NULL; m_TempJob = NULL; - printf("m_CurrentJob:%p", m_CurrentJob); } m_LoadFlag = true; LeaveCriticalSection(&m_cs); @@ -181,7 +180,6 @@ void JobController::RemoveJob(string job_titel) delete m_CurrentJob; m_CurrentJob = NULL; m_TempJob = NULL; - printf("m_CurrentJob:%p", m_CurrentJob); } LeaveCriticalSection(&m_cs); } @@ -193,7 +191,6 @@ void JobController::RemoveAllJob() delete m_CurrentJob; m_CurrentJob = NULL; m_TempJob = NULL; - printf("m_CurrentJob:%p", m_CurrentJob); } LeaveCriticalSection(&m_cs); } @@ -376,17 +373,22 @@ void JobController::LayerInfoReq(JCONTROLLERFUNC type, ::stream::ResponseAny** r void JobController::MachineTypeReq(::stream::ResponseAny** response) { stream::MachineType result; - - for (auto it = m_CurrentJob->GetMetaData()->GetScanFields()->begin(); - it != m_CurrentJob->GetMetaData()->GetScanFields()->end(); ++it) { - auto sf = result.add_sf(); - sf->set_id((*it)->id); - sf->set_id((*it)->reference); - auto dim = sf->mutable_dimension(); - dim->set_xmax((*it)->dimension->xmax); - dim->set_xmin((*it)->dimension->xmax); - dim->set_ymax((*it)->dimension->ymax); - dim->set_ymin((*it)->dimension->ymin); + if (m_CurrentJob && m_CurrentJob->GetMetaData()) { + result.set_isok(false); + for (auto it = m_CurrentJob->GetMetaData()->GetScanFields()->begin(); + it != m_CurrentJob->GetMetaData()->GetScanFields()->end(); ++it) { + auto sf = result.add_sf(); + sf->set_id((*it)->id); + sf->set_id((*it)->reference); + auto dim = sf->mutable_dimension(); + dim->set_xmax((*it)->dimension->xmax); + dim->set_xmin((*it)->dimension->xmax); + dim->set_ymax((*it)->dimension->ymax); + dim->set_ymin((*it)->dimension->ymin); + } + } + else { + result.set_isok(false); } (*response)->mutable_data()->PackFrom(result); } @@ -438,7 +440,8 @@ void JobController::SendToClients() { lst.emplace_back(Item{ "LoadProgress", to_string(GetLoadProgress()), iFLOAT }); lst.emplace_back(Item{ "LoadInfo", GetLoadInfo(), iSTRING }); lst.emplace_back(Item{ "IsLoadFinished", to_string(IsLoadFinished()), iBOOL }); - ClientWrapper::Instance()->PushAllClient(WriteData(JOBCONTROLLER, lst)); + //printf("发送 LoadProgress:%f,LoadInfo:%s,IsLoadFinished:%d\n", GetLoadProgress(), GetLoadInfo().c_str(), IsLoadFinished()); + ClientWrapper::Instance()->PushAllClient(WriteData(JOBCTRLPARAM, lst)); } } diff --git a/PrintS/output/Release/config.hbd b/PrintS/output/Release/config.hbd index c6f4301..df3386b 100644 Binary files a/PrintS/output/Release/config.hbd and b/PrintS/output/Release/config.hbd differ diff --git a/PrintS/output/Release/log/2024.hbd b/PrintS/output/Release/log/2024.hbd index ce56799..ff996dd 100644 Binary files a/PrintS/output/Release/log/2024.hbd and b/PrintS/output/Release/log/2024.hbd differ diff --git a/TestClient/DataManage/DataHandle.cpp b/TestClient/DataManage/DataHandle.cpp index 5131109..af8a91e 100644 Binary files a/TestClient/DataManage/DataHandle.cpp and b/TestClient/DataManage/DataHandle.cpp differ diff --git a/TestClient/DataManage/DataHandle.h b/TestClient/DataManage/DataHandle.h index 3c0075b..05f54f2 100644 Binary files a/TestClient/DataManage/DataHandle.h and b/TestClient/DataManage/DataHandle.h differ diff --git a/TestClient/DataManage/FunC.h b/TestClient/DataManage/FunC.h index 9a1d2a4..e9f54f7 100644 Binary files a/TestClient/DataManage/FunC.h and b/TestClient/DataManage/FunC.h differ diff --git a/TestClient/DataManage/FuncTest.cpp b/TestClient/DataManage/FuncTest.cpp index 2ba6697..d6c6239 100644 Binary files a/TestClient/DataManage/FuncTest.cpp and b/TestClient/DataManage/FuncTest.cpp differ diff --git a/TestClient/DataManage/FuncTest.h b/TestClient/DataManage/FuncTest.h index a5e9ea1..0e465f4 100644 Binary files a/TestClient/DataManage/FuncTest.h and b/TestClient/DataManage/FuncTest.h differ diff --git a/TestClient/DataManage/RWData.h b/TestClient/DataManage/RWData.h index be61795..b75f4fa 100644 Binary files a/TestClient/DataManage/RWData.h and b/TestClient/DataManage/RWData.h differ diff --git a/TestClient/DataManage/StreamClient.cpp b/TestClient/DataManage/StreamClient.cpp index a0fdae9..d987764 100644 Binary files a/TestClient/DataManage/StreamClient.cpp and b/TestClient/DataManage/StreamClient.cpp differ diff --git a/TestClient/utils/StringHelper.cpp b/TestClient/utils/StringHelper.cpp index f119893..ab9f1bf 100644 Binary files a/TestClient/utils/StringHelper.cpp and b/TestClient/utils/StringHelper.cpp differ diff --git a/TestClient/utils/StringHelper.h b/TestClient/utils/StringHelper.h index 8485b47..fea5ab4 100644 Binary files a/TestClient/utils/StringHelper.h and b/TestClient/utils/StringHelper.h differ