From 38536b87397c2564c92160d853bfd0e400cb1671 Mon Sep 17 00:00:00 2001 From: wangxx1809 Date: Thu, 27 Jun 2024 14:39:53 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF=E4=BC=A0?= =?UTF-8?q?=E8=BE=93=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrintS/Config/ConfigManager.cpp | 3 + PrintS/Config/bean/PowerCompensate.cpp | 20 +++++- PrintS/Config/bean/PowerCompensate.h | 2 + PrintS/Config/bean/ScannerControlCfg.cpp | 41 ++++++++++- PrintS/Config/bean/ScannerControlCfg.h | 17 ++++- PrintS/DataManage/DataHandle.cpp | 1 + PrintS/DataManage/RWData.h | 16 ----- PrintS/DataManage/StreamServer.cpp | 18 ----- PrintS/output/Release/log/2024.hbd | Bin 176128 -> 176128 bytes PrintS/protobuf/stream.proto | 8 --- TestClient/DataManage/DataHandle.cpp | 85 ++++++++++++----------- TestClient/DataManage/DataHandle.h | 2 +- TestClient/DataManage/FunC.h | 13 ++++ TestClient/DataManage/RWData.h | 15 +--- TestClient/DataManage/StreamClient.cpp | 3 +- 15 files changed, 141 insertions(+), 103 deletions(-) diff --git a/PrintS/Config/ConfigManager.cpp b/PrintS/Config/ConfigManager.cpp index 5bc8622..acabac9 100644 --- a/PrintS/Config/ConfigManager.cpp +++ b/PrintS/Config/ConfigManager.cpp @@ -659,6 +659,9 @@ void ConfigManager::UpdateCfg(const ReadData& rd) { SendPowderCfg(); } break; + case SCANERCTRLCFG: + m_ScannerControlCfgDao->m_ScannerControlCfgMap[ConverType::TryToI(rd.nameKey)]->Update(rd); + break; default: break; } diff --git a/PrintS/Config/bean/PowerCompensate.cpp b/PrintS/Config/bean/PowerCompensate.cpp index 2eff2c1..a80af51 100644 --- a/PrintS/Config/bean/PowerCompensate.cpp +++ b/PrintS/Config/bean/PowerCompensate.cpp @@ -1,6 +1,6 @@ #include "PowerCompensate.h" - - +#include "../DataManage/RWData.h" +#include "../utils/ConverType.hpp" PowerCompensate::PowerCompensate() { @@ -83,6 +83,22 @@ float PowerCompensateCfg::CalcPowerCompensate(float power) return rel; } +void PowerCompensateCfg::Update(const ReadData& rd) { + auto start = rd.its.begin(); + while (start != rd.its.end()) { + int percent = ConverType::TryToI(start->nameKey); + for (auto it = m_pcs.begin(); it != m_pcs.end(); ++it) { + if ((*it)->m_percent == percent) { + (*it)->m_value = ConverType::TryToF(start->strValue); + break; + } + } + ++start; + } + + +} + bool PowerCompensateLess(const PowerCompensate * m1, const PowerCompensate * m2) { return m1->m_percent < m2->m_percent; } \ No newline at end of file diff --git a/PrintS/Config/bean/PowerCompensate.h b/PrintS/Config/bean/PowerCompensate.h index 44da056..92d2de8 100644 --- a/PrintS/Config/bean/PowerCompensate.h +++ b/PrintS/Config/bean/PowerCompensate.h @@ -2,6 +2,7 @@ #include #include #include "../protobuf/stream.pb.h" +#include "../DataManage/RWData.h" using namespace std; class PowerCompensate @@ -33,6 +34,7 @@ public: PowerCompensateCfg(); ~PowerCompensateCfg(); float CalcPowerCompensate(float power); + void Update(const ReadData& rd); public: vector m_pcs; }; diff --git a/PrintS/Config/bean/ScannerControlCfg.cpp b/PrintS/Config/bean/ScannerControlCfg.cpp index 31fecc9..8ef85e7 100644 --- a/PrintS/Config/bean/ScannerControlCfg.cpp +++ b/PrintS/Config/bean/ScannerControlCfg.cpp @@ -1,5 +1,5 @@ #include "ScannerControlCfg.h" - +#include "../utils/ConverType.hpp" ScannerControlCfg::ScannerControlCfg() @@ -70,6 +70,45 @@ void ScannerControlCfg::SetScannerCtrlCfg(stream::ScannerCrtlCfgData* sccd) { sccd->set_hadmatch(m_HadMatch); } +void ScannerControlCfg::Update(const ReadData& rd) { + + SCCFGP type = (SCCFGP)ConverType::TryToI(rd.strValue); + if (type == CTRLCFG) { + auto start = rd.its.begin(); + while (start != rd.its.end()) { + if (start->nameKey == "ControlNo") { + m_ControlNo = ConverType::TryToI(start->strValue); + } + else if (start->nameKey == "SerialNo") { + m_SerialNo = ConverType::TryToI(start->strValue); + } + else if (start->nameKey == "ControlType") { + m_ControlType = ConverType::TryToI(start->strValue); + } + else if (start->nameKey == "CardName") { + m_CardName = start->strValue; + } + else if (start->nameKey == "CardIP") { + m_CardIP = start->strValue; + } + else if (start->nameKey == "IsEnable") { + m_IsEnable = (bool)ConverType::TryToI(start->strValue); + } + else if (start->nameKey == "HadAssign") { + m_HadAssign = (bool)ConverType::TryToI(start->strValue); + } + else if (start->nameKey == "HadMatch") { + m_HadMatch =(bool)ConverType::TryToI(start->strValue); + } + ++start; + } + } + else if (type == POWERCOMPENSATECFG) { + m_ScanCfgWrapper.m_PowerCompensateCfg.Update(rd); + } + +} + const string ScannerControlCfg::TABLE_NAME="ScannerControlCfg"; const string ScannerControlCfg::FIELD_SEQ_NO="SeqNo"; const string ScannerControlCfg::FIELD_CONTROL_NO="ControlNo"; diff --git a/PrintS/Config/bean/ScannerControlCfg.h b/PrintS/Config/bean/ScannerControlCfg.h index 0dc5700..fc49571 100644 --- a/PrintS/Config/bean/ScannerControlCfg.h +++ b/PrintS/Config/bean/ScannerControlCfg.h @@ -16,7 +16,20 @@ struct CardSerialPair { string cardIP; }; -class ScannerControlCfg: public Base +enum SCCFGP { + CTRLCFG= 0, + SCANPARAMCFG, + HATCHINGPARAMS, + BORDERPARAMS, + SUPPORTPARAMS, + CORRECTPARAMCFG, + SCANTESTCFG, + SKYWRITINGCFG, + POWERCOMPENSATECFG, + TIMEPOWERCOMPENSATECFG, +}; + +class ScannerControlCfg { public: ScannerControlCfg(); @@ -27,6 +40,8 @@ public: ScanParamCfg* GetScanParamCfg(string str); void SetScannerCtrlCfg(stream::ScannerCrtlCfgData* ); + + void Update(const ReadData& rd); public: //IntData* m_Index; int m_SeqNo; //编号 ConfigManager中的m_ScannerControlCfgMap的key diff --git a/PrintS/DataManage/DataHandle.cpp b/PrintS/DataManage/DataHandle.cpp index 1518e2a..5ca7c64 100644 --- a/PrintS/DataManage/DataHandle.cpp +++ b/PrintS/DataManage/DataHandle.cpp @@ -124,6 +124,7 @@ void DataHandle::DataCallBackHandle(const ReadData& msg, const std::list& case COMMUNICATIONCFG: case ALARMCFG: case POWDERSET: + case SCANERCTRLCFG: ConfigManager::GetInstance()->UpdateCfg(msg); break; case REQUEST: diff --git a/PrintS/DataManage/RWData.h b/PrintS/DataManage/RWData.h index 5aed65e..bd3c2b5 100644 --- a/PrintS/DataManage/RWData.h +++ b/PrintS/DataManage/RWData.h @@ -160,22 +160,6 @@ struct Item { int end_layer; float powder; Item(int start_layer,int end_layer,float powder) :start_layer(start_layer), end_layer(end_layer), powder(powder){} - - // - int seqNo; //ScannerControlCfg使用 - int controlNo; - int serialNo; - int controlType; - std::string cardName; - std::string cardIP; - //bool isEnable; //是否启动 - bool hadAssign; - bool hadMatch; - Item(int seqNo, int controlNo, int serialNo, int controlType,const std::string& cardName,const std::string& cardIP, bool isEnable, bool hadAssign, bool hadMatch) - :seqNo(seqNo), controlNo(controlNo), serialNo(serialNo), controlType(controlType), - cardName(cardName), cardIP(cardIP), isEnable(isEnable), hadAssign(hadAssign), hadMatch(hadMatch) { - - } }; class ClientInfo; diff --git a/PrintS/DataManage/StreamServer.cpp b/PrintS/DataManage/StreamServer.cpp index 7e16107..c901383 100644 --- a/PrintS/DataManage/StreamServer.cpp +++ b/PrintS/DataManage/StreamServer.cpp @@ -75,14 +75,6 @@ Status StreamServer::AllStream(ServerContext* context, grpc::ServerReaderWriter< temp.end_layer = it.endlayer(); temp.powder = it.powder(); - temp.seqNo = it.seqno(); - temp.controlNo = it.controlno(); - temp.serialNo = it.serialno(); - temp.controlType = it.controltype(); - temp.cardName = it.cardname(); - temp.cardIP = it.cardip(); - temp.hadAssign = it.hadassign(); - temp.hadMatch = it.hadmatch(); paramLst.emplace_back(std::move(temp)); //直接加到readData.its上面,后续的请求无法收到,不知道为啥 } @@ -119,16 +111,6 @@ Status StreamServer::AllStream(ServerContext* context, grpc::ServerReaderWriter< paramInfo->set_startlayer(wd->start_layer); paramInfo->set_endlayer(wd->end_layer); paramInfo->set_powder(wd->powder); - - paramInfo->set_seqno(wd->seqNo); - paramInfo->set_controlno(wd->controlNo); - paramInfo->set_serialno(wd->serialNo); - paramInfo->set_controltype(wd->controlType); - paramInfo->set_cardname(wd->cardName); - paramInfo->set_cardip(wd->cardIP); - paramInfo->set_isenable(wd->isEnable); - paramInfo->set_hadassign(wd->hadAssign); - paramInfo->set_hadmatch(wd->hadMatch); } stream->Write(response); } diff --git a/PrintS/output/Release/log/2024.hbd b/PrintS/output/Release/log/2024.hbd index 2ca961924e80526e3e9f896c8f509c0423a8f26d..a2c5d51defbd531e636df6f0cbca453bc64a4188 100644 GIT binary patch delta 16533 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 Mu|Y{qSgf=ehB)CZKL7v# delta 16533 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 MdF-f8iN&s@wyPu(+yDRo diff --git a/PrintS/protobuf/stream.proto b/PrintS/protobuf/stream.proto index d5ff934..87ebead 100644 --- a/PrintS/protobuf/stream.proto +++ b/PrintS/protobuf/stream.proto @@ -49,14 +49,6 @@ message ParamInfo{ int32 endLayer = 9; float powder = 10; - int32 seqNo = 11; //ScannerControlCfg使用 - int32 controlNo = 12; - int32 serialNo = 13; - int32 controlType = 14; - bytes cardName = 15; - bytes cardIP = 16; - bool hadAssign = 17; - bool hadMatch = 18; //isEnable公用 } message RequestInfo { //读 diff --git a/TestClient/DataManage/DataHandle.cpp b/TestClient/DataManage/DataHandle.cpp index ba4cd32..edda213 100644 --- a/TestClient/DataManage/DataHandle.cpp +++ b/TestClient/DataManage/DataHandle.cpp @@ -77,46 +77,42 @@ void DataHandle::PushMsg(const WriteData& wd) { } void DataHandle::PrintValue(const ReadData& msg){ - if (m_printIndex == msg.dataType) { - auto it = msg.its.begin(); - while (it != msg.its.end()) { - it->nameKey; - string valueType = m_dataTypeMp[(*it).valueType]; - if (msg.dataType >= STOPALARMCFGPARAM && msg.dataType <= WARNALARMCFGPARAM) { - printf("接收:dataType:%d,nameKey:%*s, content:%s,isEnable:%d,isAlarm:%d,isShow:%d\n", - msg.dataType, 33, it->nameKey.data(), it->content.c_str(), it->isEnable, it->isAlarm, it->isShow); - } - else if (msg.dataType == POWDERSETPARAM) { - printf("接收:dataType:%d,startLayer:%d,endLayer:%d,powder:%.2f\n", - msg.dataType,it->start_layer, it->end_layer, it->powder); - } - //else if (msg.dataType == SCANNERCONTROLCFGPARAM) { - // printf("接收:dataType:%d,seqNo:%d,controlNo:%d,serialNo:%d,controlType:%d,cardName:%s,cardIP:%s,isEnable:%d,hadAssign:%d,hadMatch:%d\n", - // msg.dataType, it->seqNo, it->controlNo, it->serialNo, it->controlType, - // it->cardName.data(), it->cardIP.data(),it->isEnable, it->hadAssign,it->hadMatch); - //} - else { - printf("接收:dataType:%d,nameKey:%*s, strvalue:%*s, valueType:%s\n", - msg.dataType, 33, it->nameKey.data(), 13, it->strValue.data(), valueType.data()); - } - ++it; - } - printf("共有参数%zd个...\n", msg.its.size()); + if (m_printIndex != msg.dataType) return; - if(m_printIndex == LASERPARAM || m_printIndex == XYSCANSTATE){ - static int count = 0; - ++count; - if (count == 4) { count = 0; m_printIndex = -1; } //激光参数默认4个 + auto it = msg.its.begin(); + while (it != msg.its.end()) { + it->nameKey; + string valueType = m_dataTypeMp[(*it).valueType]; + if (msg.dataType >= STOPALARMCFGPARAM && msg.dataType <= WARNALARMCFGPARAM) { + printf("接收:dataType:%d,nameKey:%*s, content:%s,isEnable:%d,isAlarm:%d,isShow:%d\n", + msg.dataType, 33, it->nameKey.data(), it->content.c_str(), it->isEnable, it->isAlarm, it->isShow); } - else if (m_printIndex == COMMUNICATIONCFGPARAM) { - static int count = 0; - ++count; - if (count == 23) { count = 0; m_printIndex = -1; } //激光参数默认4个 + else if (msg.dataType == POWDERSETPARAM) { + printf("接收:dataType:%d,startLayer:%d,endLayer:%d,powder:%.2f\n", + msg.dataType,it->start_layer, it->end_layer, it->powder); } else { - m_printIndex = -1; + printf("接收:dataType:%d,nameKey:%*s, strvalue:%*s, valueType:%s\n", + msg.dataType, 33, it->nameKey.data(), 13, it->strValue.data(), valueType.data()); } + ++it; } + printf("共有参数%zd个...\n", msg.its.size()); + + if(m_printIndex == LASERPARAM || m_printIndex == XYSCANSTATE){ + static int count = 0; + ++count; + if (count == 4) { count = 0; m_printIndex = -1; } //激光参数默认4个 + } + else if (m_printIndex == COMMUNICATIONCFGPARAM) { + static int count = 0; + ++count; + if (count == 23) { count = 0; m_printIndex = -1; } //激光参数默认4个 + } + else { + m_printIndex = -1; + } + } void DataHandle::DataCallBackHandle(const ReadData& msg) { @@ -236,17 +232,17 @@ int DataHandle::Request(int index) { if (userInput == "q") { printf("返回上一级...\n"); break; } - else if (userInput.empty()) { + else if (userInput.empty()) { continue; } - else if (userInput == "h") { + else if (userInput == "h") { //打印用法 ParamReadUsage(); } - else if (userInput.find("push") != string::npos) { + else if (userInput.find("push") != string::npos) { //更新数据到服务器 UpdateParamToService(userInput); } - else { - ParamRequest(ConverType::TryToI(userInput)); + else { //接收指定的参数 + ReceiveParam(ConverType::TryToI(userInput)); } } break; @@ -268,7 +264,7 @@ void DataHandle::AllTest() { } -void DataHandle::ParamRequest(int index) { +void DataHandle::ReceiveParam(int index) { if (index == VERSIONRSP) { PushMsg(VERSIONREQ); //获取版本信息 } @@ -412,7 +408,14 @@ void DataHandle::UpdateParamToService(const string& input) { writeData.items.emplace_back(Item{"","",UNKNOW,"",0,0,0,1,100,2}); PushMsg(writeData); break; - case SCANERCTRLCFGPARAM: + case SCANERCTRLCFGPARAM: + writeData = WriteData{ SCANERCTRLCFG, "1", to_string(SCCFGP::CTRLCFG), UNKNOW,UPDATE }; + writeData.items.emplace_back(Item{ "CardIP","127.0.0.1",iSTRING}); + PushMsg(writeData); + + writeData = WriteData{ SCANERCTRLCFG, "1",to_string(SCCFGP::POWERCOMPENSATECFG), UNKNOW,UPDATE }; + writeData.items.emplace_back(Item{ "10","1.323",iFLOAT }); + PushMsg(writeData); break; case ELECFGPARAM: break; diff --git a/TestClient/DataManage/DataHandle.h b/TestClient/DataManage/DataHandle.h index 4b11389..dd7fe4e 100644 --- a/TestClient/DataManage/DataHandle.h +++ b/TestClient/DataManage/DataHandle.h @@ -24,7 +24,7 @@ public: string GetVersion()const {return m_version;} - void ParamRequest(int index); + void ReceiveParam(int index); int Request(int index); void AllTest(); void AxisMoveTest(); //轴运动测试 diff --git a/TestClient/DataManage/FunC.h b/TestClient/DataManage/FunC.h index 192583c..08b161a 100644 --- a/TestClient/DataManage/FunC.h +++ b/TestClient/DataManage/FunC.h @@ -112,4 +112,17 @@ enum ConfigFunc { }; +enum SCCFGP { + CTRLCFG = 0, + SCANPARAMCFG, + HATCHINGPARAMS, + BORDERPARAMS, + SUPPORTPARAMS, + CORRECTPARAMCFG, + SCANTESTCFG, + SKYWRITINGCFG, + POWERCOMPENSATECFG, + TIMEPOWERCOMPENSATECFG, +}; + #define OUTPUTNAME(x) #x \ No newline at end of file diff --git a/TestClient/DataManage/RWData.h b/TestClient/DataManage/RWData.h index 6d91078..845021c 100644 --- a/TestClient/DataManage/RWData.h +++ b/TestClient/DataManage/RWData.h @@ -91,10 +91,9 @@ enum DATATYPE { struct Item { - std::string nameKey; //参数key + std::string nameKey; //参数key std::string strValue; //value - //bool isOutPut; //是否只读 false:只读 - DATATYPE valueType; //数据类型 + DATATYPE valueType; //数据类型 std::string content; //alarmcfgwrapper使用 bool isEnable; @@ -105,16 +104,6 @@ struct Item { int start_layer; int end_layer; float powder; - - int seqNo; //ScannerControlCfg使用 - int controlNo; - int serialNo; - int controlType; - std::string cardName; - std::string cardIP; - //bool isEnable; //是否启动 - bool hadAssign; - bool hadMatch; }; struct ReadData { diff --git a/TestClient/DataManage/StreamClient.cpp b/TestClient/DataManage/StreamClient.cpp index bc336e9..d77caa7 100644 --- a/TestClient/DataManage/StreamClient.cpp +++ b/TestClient/DataManage/StreamClient.cpp @@ -74,8 +74,7 @@ void StreamClient::AllStream() { for (const ::stream::ParamInfo& it : readInfo.item()) { readData.its.emplace_back(Item{ it.namekey(),it.strvalue(),(DATATYPE)it.valuetype() ,it.context(),it.isenable(),it.isalarm(),it.isshow() - ,it.startlayer(),it.endlayer(),it.powder(),it.seqno(),it.controlno(),it.serialno() - ,it.controltype(),it.cardname(),it.cardip(),it.hadassign(),it.hadmatch()}); + ,it.startlayer(),it.endlayer(),it.powder()}); //printf("接收到服务端消息:dataType:%d,nameKey:%s, strvalue:%s,valueType:%d\n", // readData.dataType, it.namekey().data(), it.strvalue().c_str(), it.valuetype()); }