From 67b2b0986acd831ff037fb20c369dd0209e2f704 Mon Sep 17 00:00:00 2001 From: wangxx1809 Date: Thu, 30 May 2024 17:25:23 +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=EF=BC=8CFavoriteCfg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrintS/Config/ConfigManager.cpp | 1 + PrintS/Config/ConfigManager.h | 10 +- PrintS/Config/bean/FavoriteCfg.cpp | 35 +++++- PrintS/Config/bean/FavoriteCfg.h | 7 +- PrintS/Config/dao/BaseConfigDao.cpp | 6 + PrintS/Controller/Base.h | 11 +- PrintS/DataManage/DataHandle.cpp | 15 ++- PrintS/DataManage/RWData.h | 11 +- PrintS/DataManage/StreamServer.cpp | 1 + PrintS/HBDSystem.cpp | 2 +- PrintS/PrintS.vcxproj.filters | 24 ++-- PrintS/ScannerCtrl/ScannerCtrl.cpp | 10 +- PrintS/output/Release/log/2024.hbd | Bin 159744 -> 159744 bytes PrintS/protobuf/stream.pb.cc | 163 ++++++++++++++++--------- PrintS/protobuf/stream.pb.h | 86 ++++++++++++- PrintS/protobuf/stream.proto | 16 ++- TestClient/DataManage/DataHandle.cpp | 36 +++--- TestClient/DataManage/DataHandle.h | 2 +- TestClient/DataManage/RWData.h | 12 +- TestClient/DataManage/StreamClient.cpp | 1 + TestClient/protobuf/stream.pb.cc | 163 ++++++++++++++++--------- TestClient/protobuf/stream.pb.h | 86 ++++++++++++- TestClient/protobuf/stream.proto | 16 ++- 23 files changed, 537 insertions(+), 177 deletions(-) diff --git a/PrintS/Config/ConfigManager.cpp b/PrintS/Config/ConfigManager.cpp index 879136b..ecc0e07 100644 --- a/PrintS/Config/ConfigManager.cpp +++ b/PrintS/Config/ConfigManager.cpp @@ -466,6 +466,7 @@ void ConfigManager::SendCfgToClients() { m_InfraredTempCfg.SendToClients(INFRAREDTEMPCFGPARAM); m_MachineCfg.SendToClients(MACHINECFGPARAM); + m_FavoriteCfg.SendToClients(FAVORITECFGPARAM); diff --git a/PrintS/Config/ConfigManager.h b/PrintS/Config/ConfigManager.h index e4c9efe..0f8f832 100644 --- a/PrintS/Config/ConfigManager.h +++ b/PrintS/Config/ConfigManager.h @@ -93,20 +93,20 @@ public: RecoatCheckCfg* GetRecoatCheckCfg() { return &m_RecoatCheckCfg; } - HbdLanguage* GetLanguage(int id); - void GetDefaultText(map& textmap); + HbdLanguage* GetLanguage(int id); //无用 + void GetDefaultText(map& textmap); //无用 - ParamSetCfg* GetParamSetCfg() { return &m_ParamSetCfg; } + ParamSetCfg* GetParamSetCfg() { return &m_ParamSetCfg; } //传 困难 //map* GetLaserCfgMap() { return &m_pLaserCfgDao->m_LaserCfgMap; } //vector* GetLaserCfgs() { return &m_pLaserCfgDao->m_LaserCfgs; } map* GetScannerControlCfg() { return &m_ScannerControlCfgDao->m_ScannerControlCfgMap; } vector* GetScannerControlCfgs() { return &m_ScannerControlCfgDao->m_ScannerControlCfgs; } vector* GetMatchScannerControlCfg() { return &m_ScannerControlCfgDao->m_MatchCfg; } - ScannerControlCfgDao* GetScannerControlCfgDao() { return m_ScannerControlCfgDao; } + ScannerControlCfgDao* GetScannerControlCfgDao() { return m_ScannerControlCfgDao; } //不用 //vector *GetMatchLaser() { return &m_pLaserCfgDao->m_MatchLaser; } //LaserCfgDao* GetLaserCfgDao() { return m_pLaserCfgDao; } - FavoriteCfg* GetFavoriteCfg() { return &m_FavoriteCfg; } + FavoriteCfg* GetFavoriteCfg() { return &m_FavoriteCfg; } //已传 FixPointDao* GetFixPointDao() { return m_ScannerControlCfgDao->GetFixPointDao(); } CameraCalibrationCfg* GetCameraCalibrationCfg() { return &m_CameraCalibrationCfg; } void SaveCameraCalibrationCfg() { diff --git a/PrintS/Config/bean/FavoriteCfg.cpp b/PrintS/Config/bean/FavoriteCfg.cpp index 9f0b7e1..ecfaaa1 100644 --- a/PrintS/Config/bean/FavoriteCfg.cpp +++ b/PrintS/Config/bean/FavoriteCfg.cpp @@ -1,8 +1,11 @@ -#include "FavoriteCfg.h" +#include "FavoriteCfg.h" #include "BaseConfig.h" FavoriteCfg::FavoriteCfg() -{} +{ + + +} FavoriteCfg::~FavoriteCfg() {} @@ -35,4 +38,32 @@ void FavoriteCfg::Add(std::string name, std::string value) mFavoriteMap[name] = value; } + +void FavoriteCfg::UpdateSub(const ReadData& rd) { + { + std::unique_lock lock(m_mtx); //写锁 + if (rd.handleType == UPDATE) { + mFavoriteMap[rd.nameKey] = rd.strValue; + m_baseMp[rd.nameKey]->SetValue(rd.strValue); + } + else if (rd.handleType == ADD) { + if (mFavoriteMap.find(rd.nameKey) == mFavoriteMap.end()) { + mFavoriteMap[rd.nameKey] = rd.strValue; + m_baseMp[rd.nameKey] = new StrData(rd.nameKey, u8"", rd.strValue); + } + else { + mFavoriteMap[rd.nameKey] = rd.strValue; + m_baseMp[rd.nameKey]->SetValue(rd.strValue); + } + } + else if (rd.handleType == DEL) { + if (mFavoriteMap.find(rd.nameKey) != mFavoriteMap.end()) { + mFavoriteMap.erase(rd.nameKey); + DelMp(rd.nameKey); + } + } + } + SendToClients(FAVORITECFGPARAM); //客户端更新后在发送给客户端 +} + string FavoriteCfg::CONFIG_NAME ="Favorite"; diff --git a/PrintS/Config/bean/FavoriteCfg.h b/PrintS/Config/bean/FavoriteCfg.h index c75f5bc..0c6f724 100644 --- a/PrintS/Config/bean/FavoriteCfg.h +++ b/PrintS/Config/bean/FavoriteCfg.h @@ -1,10 +1,11 @@ -#pragma once +#pragma once #include #include #include +#include "../Controller/Base.h" -class FavoriteCfg +class FavoriteCfg :public Base { public: FavoriteCfg(); @@ -12,6 +13,8 @@ public: void GetUpdateSql(std::vector& ups); void Add(std::string name, std::string value); + void UpdateSub(const ReadData& rd); + public: static std::string CONFIG_NAME; std::map mFavoriteMap; diff --git a/PrintS/Config/dao/BaseConfigDao.cpp b/PrintS/Config/dao/BaseConfigDao.cpp index 9631520..c200c8d 100644 --- a/PrintS/Config/dao/BaseConfigDao.cpp +++ b/PrintS/Config/dao/BaseConfigDao.cpp @@ -1558,6 +1558,12 @@ void BaseConfigDao::FindFavoriteCfg(FavoriteCfg& fcfg) { map valuemap; FindValue(FavoriteCfg::CONFIG_NAME, fcfg.mFavoriteMap); + + auto item = fcfg.mFavoriteMap.begin(); + while (item != fcfg.mFavoriteMap.end()) { + BaseData* p = new StrData(item->first, u8"", item->second); + fcfg.InsertMp(item->first,p); + } } void BaseConfigDao::FindPowderEstimate(PowderEstimateCfg& cfg) diff --git a/PrintS/Controller/Base.h b/PrintS/Controller/Base.h index cb7abc5..74bf255 100644 --- a/PrintS/Controller/Base.h +++ b/PrintS/Controller/Base.h @@ -26,7 +26,16 @@ protected: } } + void DelMp(const std::string& key) { + std::unique_lock lock(m_mtx); + if (m_baseMp.find(key) != m_baseMp.end()) { + m_baseMp.erase(key); + } + } + +public: void InsertMp(const std::string& key, BaseData* baseData, const std::string& suff = "") { + std::unique_lock lock(m_mtx); if (m_baseMp.find(key) != m_baseMp.end()) { printf("%s is repeated...\n", key.data()); } @@ -95,7 +104,7 @@ public: else { printf("error, %s do not find...", rd.nameKey.c_str()); } - + if(type != DEFAULT) SendToClients(type); //客户端更新后在发送给客户端 } diff --git a/PrintS/DataManage/DataHandle.cpp b/PrintS/DataManage/DataHandle.cpp index 0f1e5f0..3610612 100644 --- a/PrintS/DataManage/DataHandle.cpp +++ b/PrintS/DataManage/DataHandle.cpp @@ -129,13 +129,16 @@ void DataHandle::DataCallBackHandle(const ReadData& msg) { case MACHINECFG: ConfigManager::GetInstance()->GetMachineCfg()->Update(msg, MACHINECFGPARAM); break; + case FAVORITECFG: + ConfigManager::GetInstance()->GetFavoriteCfg()->UpdateSub(msg); + break; case REQUEST: - if (msg.nameKey == "36") { - printf("error,36 需要释放ScannerCtrl::Init()内部代码块...\n"); - //for (int i = 0; i < 4; ++i) { //需要先打开ScannerCtrl::Init()代码块 - // Scanner* p = (m_controller->m_ScannerCtrl->GetScanners())->at(i); - // p->GetScanStateXY().SendToClients(XYSCANSTATE, "_" + to_string(i)); - //} + if (ConverType::TryToI( msg.nameKey) == XYSCANSTATE) { + printf("error,40 需要释放ScannerCtrl::Init()内部代码块...\n"); + for (int i = 0; i < 4; ++i) { //需要先打开ScannerCtrl::Init()代码块 + Scanner* p = (m_controller->m_ScannerCtrl->GetScanners())->at(i); + p->GetScanStateXY().SendToClients(XYSCANSTATE, "_" + to_string(i)); + } } else { ConfigManager::GetInstance()->SendCfgToClients(); //发送配置到客户端 diff --git a/PrintS/DataManage/RWData.h b/PrintS/DataManage/RWData.h index 786c6c8..e2bf00b 100644 --- a/PrintS/DataManage/RWData.h +++ b/PrintS/DataManage/RWData.h @@ -26,6 +26,7 @@ enum READTYPE { RUNCFG, INFRAREDTEMPCFG, MACHINECFG, + FAVORITECFG, LOADPARAM, //装载参数 @@ -51,12 +52,19 @@ enum DATATYPE { UNKNOW, }; +enum DATAHANDLE { + UPDATE = 0, + ADD, + DEL, +}; + class ClientInfo; struct ReadData { READTYPE dataType; std::string nameKey; //参数key std::string strValue; //value DATATYPE valueType; + DATAHANDLE handleType; //增删改 ClientInfo* clientPtr; }; @@ -95,9 +103,10 @@ enum WRITETYPE { /********************配置信息******************/ PARAMLIMITCFGPARAM, //paramlimit配置参数 EXTCFGPARAM, - RUNCFGPARAM, //runcfg 参数 + RUNCFGPARAM, //runcfg 参数 INFRAREDTEMPCFGPARAM, //InfraredTempCfg 参数 MACHINECFGPARAM, //MachineCfg 参数 + FAVORITECFGPARAM, //FavoriteCfg 参数 MOLDCFGPARAM, LOADCFGPARAM, diff --git a/PrintS/DataManage/StreamServer.cpp b/PrintS/DataManage/StreamServer.cpp index 9572162..b87129c 100644 --- a/PrintS/DataManage/StreamServer.cpp +++ b/PrintS/DataManage/StreamServer.cpp @@ -52,6 +52,7 @@ Status StreamServer::AllStream(ServerContext* context, grpc::ServerReaderWriter< readData.nameKey = request.namekey(); readData.strValue = request.strvalue(); readData.valueType = (DATATYPE)request.valuetype(); + readData.handleType = (DATAHANDLE)request.handletype(); readData.clientPtr = cinfo; printf("客户端消息:dataType:%d,nameKey:%s, strValue:%s,valueType:%d\n", diff --git a/PrintS/HBDSystem.cpp b/PrintS/HBDSystem.cpp index 5edcace..7453c0d 100644 --- a/PrintS/HBDSystem.cpp +++ b/PrintS/HBDSystem.cpp @@ -41,7 +41,7 @@ void HBDSystem::Init() { #ifdef _DEBUG g_isDebug = true; #else - g_isDebug = false; + g_isDebug = true; #endif g_LngManager = new LanguageManager(); diff --git a/PrintS/PrintS.vcxproj.filters b/PrintS/PrintS.vcxproj.filters index 2c000a9..a9d4725 100644 --- a/PrintS/PrintS.vcxproj.filters +++ b/PrintS/PrintS.vcxproj.filters @@ -149,12 +149,6 @@ DataManage - - protobuf - - - protobuf - PLC @@ -762,6 +756,12 @@ Communication + + protobuf + + + protobuf + @@ -781,12 +781,6 @@ DataManage - - protobuf - - - protobuf - PLC @@ -1897,6 +1891,12 @@ Communication + + protobuf + + + protobuf + diff --git a/PrintS/ScannerCtrl/ScannerCtrl.cpp b/PrintS/ScannerCtrl/ScannerCtrl.cpp index 5aed9f8..70479ef 100644 --- a/PrintS/ScannerCtrl/ScannerCtrl.cpp +++ b/PrintS/ScannerCtrl/ScannerCtrl.cpp @@ -76,7 +76,7 @@ bool ScannerCtrl::Init() { bool rel = false; unsigned int card_num = 0; - if (!RTC5Scanner::PreInit(card_num)) + if (!g_isDebug && !RTC5Scanner::PreInit(card_num)) { return false; } @@ -120,10 +120,10 @@ 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); - //} + for (int i = 0; i < 4; ++i) { //wxxtest + Scanner* scanner = new RTC5Scanner(nullptr, i); + m_scan.push_back(scanner); + } return false; } diff --git a/PrintS/output/Release/log/2024.hbd b/PrintS/output/Release/log/2024.hbd index 77b6d43e74bae95cf9d4160859454c0f2da37e5d..780f7def8c06477195c6d572d55ccf011b135525 100644 GIT binary patch delta 16533 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 M?);2T(?D{bUaqAGwEzGB diff --git a/PrintS/protobuf/stream.pb.cc b/PrintS/protobuf/stream.pb.cc index ad77b52..f6a0f17 100644 --- a/PrintS/protobuf/stream.pb.cc +++ b/PrintS/protobuf/stream.pb.cc @@ -58,6 +58,7 @@ PROTOBUF_CONSTEXPR RequestInfo::RequestInfo(::_pbi::ConstantInitialized) }, /*decltype(_impl_.datatype_)*/ 0u, /*decltype(_impl_.valuetype_)*/ 0, + /*decltype(_impl_.handletype_)*/ 0, /*decltype(_impl_._cached_size_)*/ {}, } {} struct RequestInfoDefaultTypeInternal { @@ -235,7 +236,7 @@ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ImgInfoResponceDefaultTypeInternal _ImgInfoResponce_default_instance_; } // namespace stream static ::_pb::Metadata file_level_metadata_stream_2eproto[11]; -static const ::_pb::EnumDescriptor* file_level_enum_descriptors_stream_2eproto[1]; +static const ::_pb::EnumDescriptor* file_level_enum_descriptors_stream_2eproto[2]; static constexpr const ::_pb::ServiceDescriptor** file_level_service_descriptors_stream_2eproto = nullptr; const ::uint32_t TableStruct_stream_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE( @@ -263,6 +264,7 @@ const ::uint32_t TableStruct_stream_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.namekey_), PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.strvalue_), PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.valuetype_), + PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.handletype_), ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::stream::ResponseInfo, _internal_metadata_), ~0u, // no _extensions_ @@ -369,15 +371,15 @@ static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { {0, -1, -1, sizeof(::stream::ParamInfo)}, {11, -1, -1, sizeof(::stream::RequestInfo)}, - {23, -1, -1, sizeof(::stream::ResponseInfo)}, - {34, 43, -1, sizeof(::stream::ResponseAny)}, - {44, -1, -1, sizeof(::stream::LayerData)}, - {57, -1, -1, sizeof(::stream::LayerDataBlock)}, - {71, -1, -1, sizeof(::stream::VectorDataBlock)}, - {83, -1, -1, sizeof(::stream::ChainDataBlock)}, - {93, -1, -1, sizeof(::stream::Point)}, - {103, -1, -1, sizeof(::stream::RegResponce)}, - {112, -1, -1, sizeof(::stream::ImgInfoResponce)}, + {24, -1, -1, sizeof(::stream::ResponseInfo)}, + {35, 44, -1, sizeof(::stream::ResponseAny)}, + {45, -1, -1, sizeof(::stream::LayerData)}, + {58, -1, -1, sizeof(::stream::LayerDataBlock)}, + {72, -1, -1, sizeof(::stream::VectorDataBlock)}, + {84, -1, -1, sizeof(::stream::ChainDataBlock)}, + {94, -1, -1, sizeof(::stream::Point)}, + {104, -1, -1, sizeof(::stream::RegResponce)}, + {113, -1, -1, sizeof(::stream::ImgInfoResponce)}, }; static const ::_pb::Message* const file_default_instances[] = { @@ -397,38 +399,41 @@ const char descriptor_table_protodef_stream_2eproto[] PROTOBUF_SECTION_VARIABLE( "\n\014stream.proto\022\006stream\032\031google/protobuf/" "any.proto\"O\n\tParamInfo\022\017\n\007nameKey\030\001 \001(\014\022" "\020\n\010strValue\030\002 \001(\014\022\037\n\tvalueType\030\003 \001(\0162\014.s" - "tream.TYPE\"c\n\013RequestInfo\022\020\n\010dataType\030\001 " - "\001(\r\022\017\n\007nameKey\030\002 \001(\014\022\020\n\010strValue\030\003 \001(\014\022\037" - "\n\tvalueType\030\004 \001(\0162\014.stream.TYPE\"Q\n\014Respo" - "nseInfo\022\020\n\010dataType\030\001 \001(\r\022\016\n\006result\030\002 \001(" - "\010\022\037\n\004item\030\003 \003(\0132\021.stream.ParamInfo\"1\n\013Re" - "sponseAny\022\"\n\004data\030\001 \001(\0132\024.google.protobu" - "f.Any\"\210\001\n\tLayerData\022\023\n\013zCooldinate\030\001 \001(\002" - "\022\016\n\006powder\030\002 \001(\002\022\026\n\016layerThickness\030\003 \001(\002" - "\022.\n\016layerDataBlock\030\004 \003(\0132\026.stream.LayerD" - "ataBlock\022\016\n\006result\030\005 \001(\010\"\266\001\n\016LayerDataBl" - "ock\022\021\n\telementId\030\001 \001(\005\022\026\n\016elementParamId" - "\030\002 \001(\005\022\021\n\tblockType\030\003 \001(\r\022*\n\tvecBlocks\030\004" - " \003(\0132\027.stream.VectorDataBlock\022+\n\013chainBl" - "ocks\030\005 \003(\0132\026.stream.ChainDataBlock\022\r\n\005or" - "der\030\006 \001(\r\"M\n\017VectorDataBlock\022\016\n\006startX\030\001" - " \001(\002\022\016\n\006startY\030\002 \001(\002\022\014\n\004endX\030\003 \001(\002\022\014\n\004en" - "dY\030\004 \001(\002\"A\n\016ChainDataBlock\022\016\n\006dotNum\030\001 \001" - "(\r\022\037\n\010pointVec\030\002 \003(\0132\r.stream.Point\"#\n\005P" - "oint\022\014\n\004xPos\030\001 \001(\002\022\014\n\004yPos\030\002 \001(\002\"\033\n\013RegR" - "esponce\022\014\n\004data\030\001 \001(\005\"D\n\017ImgInfoResponce" - "\022\022\n\nlevelImage\030\001 \001(\r\022\r\n\005width\030\002 \001(\005\022\016\n\006h" - "eight\030\003 \001(\005*X\n\004TYPE\022\t\n\005iBOOL\020\000\022\n\n\006iSHORT" - "\020\001\022\013\n\007iUSHORT\020\002\022\010\n\004iINT\020\003\022\t\n\005iUINT\020\004\022\n\n\006" - "iFLOAT\020\005\022\013\n\007iSTRING\020\0062\372\001\n\006Stream\0224\n\006Simp" - "le\022\023.stream.RequestInfo\032\023.stream.Respons" - "eAny\"\000\022=\n\014ServerStream\022\023.stream.RequestI" - "nfo\032\024.stream.ResponseInfo\"\0000\001\022=\n\014ClientS" - "tream\022\023.stream.RequestInfo\032\024.stream.Resp" - "onseInfo\"\000(\001\022<\n\tAllStream\022\023.stream.Reque" - "stInfo\032\024.stream.ResponseInfo\"\000(\0010\001B-\n\027io" - ".grpc.examples.streamB\013StreamProtoP\001\242\002\002S" - "Tb\006proto3" + "tream.TYPE\"\213\001\n\013RequestInfo\022\020\n\010dataType\030\001" + " \001(\r\022\017\n\007nameKey\030\002 \001(\014\022\020\n\010strValue\030\003 \001(\014\022" + "\037\n\tvalueType\030\004 \001(\0162\014.stream.TYPE\022&\n\nhand" + "leType\030\005 \001(\0162\022.stream.DATAHANDLE\"Q\n\014Resp" + "onseInfo\022\020\n\010dataType\030\001 \001(\r\022\016\n\006result\030\002 \001" + "(\010\022\037\n\004item\030\003 \003(\0132\021.stream.ParamInfo\"1\n\013R" + "esponseAny\022\"\n\004data\030\001 \001(\0132\024.google.protob" + "uf.Any\"\210\001\n\tLayerData\022\023\n\013zCooldinate\030\001 \001(" + "\002\022\016\n\006powder\030\002 \001(\002\022\026\n\016layerThickness\030\003 \001(" + "\002\022.\n\016layerDataBlock\030\004 \003(\0132\026.stream.Layer" + "DataBlock\022\016\n\006result\030\005 \001(\010\"\266\001\n\016LayerDataB" + "lock\022\021\n\telementId\030\001 \001(\005\022\026\n\016elementParamI" + "d\030\002 \001(\005\022\021\n\tblockType\030\003 \001(\r\022*\n\tvecBlocks\030" + "\004 \003(\0132\027.stream.VectorDataBlock\022+\n\013chainB" + "locks\030\005 \003(\0132\026.stream.ChainDataBlock\022\r\n\005o" + "rder\030\006 \001(\r\"M\n\017VectorDataBlock\022\016\n\006startX\030" + "\001 \001(\002\022\016\n\006startY\030\002 \001(\002\022\014\n\004endX\030\003 \001(\002\022\014\n\004e" + "ndY\030\004 \001(\002\"A\n\016ChainDataBlock\022\016\n\006dotNum\030\001 " + "\001(\r\022\037\n\010pointVec\030\002 \003(\0132\r.stream.Point\"#\n\005" + "Point\022\014\n\004xPos\030\001 \001(\002\022\014\n\004yPos\030\002 \001(\002\"\033\n\013Reg" + "Responce\022\014\n\004data\030\001 \001(\005\"D\n\017ImgInfoResponc" + "e\022\022\n\nlevelImage\030\001 \001(\r\022\r\n\005width\030\002 \001(\005\022\016\n\006" + "height\030\003 \001(\005*\223\001\n\004TYPE\022\t\n\005iBOOL\020\000\022\n\n\006iSHO" + "RT\020\001\022\013\n\007iUSHORT\020\002\022\010\n\004iINT\020\003\022\t\n\005iUINT\020\004\022\n" + "\n\006iFLOAT\020\005\022\013\n\007iSTRING\020\006\022\t\n\005iCHAR\020\007\022\n\n\006iU" + "CHAR\020\010\022\t\n\005iWORD\020\t\022\013\n\007iDOUBLE\020\n\022\n\n\006iTIMET" + "\020\013**\n\nDATAHANDLE\022\n\n\006UPDATE\020\000\022\007\n\003ADD\020\001\022\007\n" + "\003DEL\020\0022\372\001\n\006Stream\0224\n\006Simple\022\023.stream.Req" + "uestInfo\032\023.stream.ResponseAny\"\000\022=\n\014Serve" + "rStream\022\023.stream.RequestInfo\032\024.stream.Re" + "sponseInfo\"\0000\001\022=\n\014ClientStream\022\023.stream." + "RequestInfo\032\024.stream.ResponseInfo\"\000(\001\022<\n" + "\tAllStream\022\023.stream.RequestInfo\032\024.stream" + ".ResponseInfo\"\000(\0010\001B-\n\027io.grpc.examples." + "streamB\013StreamProtoP\001\242\002\002STb\006proto3" }; static const ::_pbi::DescriptorTable* const descriptor_table_stream_2eproto_deps[1] = { @@ -438,7 +443,7 @@ static ::absl::once_flag descriptor_table_stream_2eproto_once; const ::_pbi::DescriptorTable descriptor_table_stream_2eproto = { false, false, - 1369, + 1514, descriptor_table_protodef_stream_2eproto, "stream.proto", &descriptor_table_stream_2eproto_once, @@ -484,6 +489,25 @@ bool TYPE_IsValid(int value) { case 4: case 5: case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + return true; + default: + return false; + } +} +const ::google::protobuf::EnumDescriptor* DATAHANDLE_descriptor() { + ::google::protobuf::internal::AssignDescriptors(&descriptor_table_stream_2eproto); + return file_level_enum_descriptors_stream_2eproto[1]; +} +bool DATAHANDLE_IsValid(int value) { + switch (value) { + case 0: + case 1: + case 2: return true; default: return false; @@ -760,6 +784,7 @@ RequestInfo::RequestInfo(const RequestInfo& from) : ::google::protobuf::Message( decltype(_impl_.strvalue_){}, decltype(_impl_.datatype_){}, decltype(_impl_.valuetype_){}, + decltype(_impl_.handletype_){}, /*decltype(_impl_._cached_size_)*/ {}, }; _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( @@ -779,8 +804,8 @@ RequestInfo::RequestInfo(const RequestInfo& from) : ::google::protobuf::Message( _this->_impl_.strvalue_.Set(from._internal_strvalue(), _this->GetArenaForAllocation()); } ::memcpy(&_impl_.datatype_, &from._impl_.datatype_, - static_cast<::size_t>(reinterpret_cast(&_impl_.valuetype_) - - reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.valuetype_)); + static_cast<::size_t>(reinterpret_cast(&_impl_.handletype_) - + reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.handletype_)); // @@protoc_insertion_point(copy_constructor:stream.RequestInfo) } @@ -791,6 +816,7 @@ inline void RequestInfo::SharedCtor(::_pb::Arena* arena) { decltype(_impl_.strvalue_){}, decltype(_impl_.datatype_){0u}, decltype(_impl_.valuetype_){0}, + decltype(_impl_.handletype_){0}, /*decltype(_impl_._cached_size_)*/ {}, }; _impl_.namekey_.InitDefault(); @@ -825,8 +851,8 @@ PROTOBUF_NOINLINE void RequestInfo::Clear() { _impl_.namekey_.ClearToEmpty(); _impl_.strvalue_.ClearToEmpty(); ::memset(&_impl_.datatype_, 0, static_cast<::size_t>( - reinterpret_cast(&_impl_.valuetype_) - - reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.valuetype_)); + reinterpret_cast(&_impl_.handletype_) - + reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.handletype_)); _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); } @@ -838,23 +864,21 @@ const char* RequestInfo::_InternalParse( PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 -const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { +const ::_pbi::TcParseTable<3, 5, 0, 0, 2> RequestInfo::_table_ = { { 0, // no _has_bits_ 0, // no _extensions_ - 4, 24, // max_field_number, fast_idx_mask + 5, 56, // max_field_number, fast_idx_mask offsetof(decltype(_table_), field_lookup_table), - 4294967280, // skipmap + 4294967264, // skipmap offsetof(decltype(_table_), field_entries), - 4, // num_field_entries + 5, // num_field_entries 0, // num_aux_entries offsetof(decltype(_table_), field_names), // no aux_entries &_RequestInfo_default_instance_._instance, ::_pbi::TcParser::GenericFallback, // fallback }, {{ - // .stream.TYPE valueType = 4; - {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.valuetype_), 63>(), - {32, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_)}}, + {::_pbi::TcParser::MiniParse, {}}, // uint32 dataType = 1; {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.datatype_), 63>(), {8, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.datatype_)}}, @@ -864,6 +888,14 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { // bytes strValue = 3; {::_pbi::TcParser::FastBS1, {26, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.strvalue_)}}, + // .stream.TYPE valueType = 4; + {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.valuetype_), 63>(), + {32, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_)}}, + // .stream.DATAHANDLE handleType = 5; + {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.handletype_), 63>(), + {40, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.handletype_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, }}, {{ 65535, 65535 }}, {{ @@ -879,6 +911,9 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { // .stream.TYPE valueType = 4; {PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_), 0, 0, (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)}, + // .stream.DATAHANDLE handleType = 5; + {PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.handletype_), 0, 0, + (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)}, }}, // no aux_entries {{ @@ -918,6 +953,13 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { 4, this->_internal_valuetype(), target); } + // .stream.DATAHANDLE handleType = 5; + if (this->_internal_handletype() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteEnumToArray( + 5, this->_internal_handletype(), target); + } + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( @@ -959,6 +1001,12 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { ::_pbi::WireFormatLite::EnumSize(this->_internal_valuetype()); } + // .stream.DATAHANDLE handleType = 5; + if (this->_internal_handletype() != 0) { + total_size += 1 + + ::_pbi::WireFormatLite::EnumSize(this->_internal_handletype()); + } + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); } @@ -989,6 +1037,9 @@ void RequestInfo::MergeImpl(::google::protobuf::Message& to_msg, const ::google: if (from._internal_valuetype() != 0) { _this->_internal_set_valuetype(from._internal_valuetype()); } + if (from._internal_handletype() != 0) { + _this->_internal_set_handletype(from._internal_handletype()); + } _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); } @@ -1013,8 +1064,8 @@ void RequestInfo::InternalSwap(RequestInfo* other) { ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.strvalue_, lhs_arena, &other->_impl_.strvalue_, rhs_arena); ::google::protobuf::internal::memswap< - PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_) - + sizeof(RequestInfo::_impl_.valuetype_) + PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.handletype_) + + sizeof(RequestInfo::_impl_.handletype_) - PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.datatype_)>( reinterpret_cast(&_impl_.datatype_), reinterpret_cast(&other->_impl_.datatype_)); diff --git a/PrintS/protobuf/stream.pb.h b/PrintS/protobuf/stream.pb.h index 49d210c..d988498 100644 --- a/PrintS/protobuf/stream.pb.h +++ b/PrintS/protobuf/stream.pb.h @@ -104,6 +104,11 @@ enum TYPE : int { iUINT = 4, iFLOAT = 5, iSTRING = 6, + iCHAR = 7, + iUCHAR = 8, + iWORD = 9, + iDOUBLE = 10, + iTIMET = 11, TYPE_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::int32_t>::min(), TYPE_INT_MAX_SENTINEL_DO_NOT_USE_ = @@ -112,8 +117,8 @@ enum TYPE : int { bool TYPE_IsValid(int value); constexpr TYPE TYPE_MIN = static_cast(0); -constexpr TYPE TYPE_MAX = static_cast(6); -constexpr int TYPE_ARRAYSIZE = 6 + 1; +constexpr TYPE TYPE_MAX = static_cast(11); +constexpr int TYPE_ARRAYSIZE = 11 + 1; const ::google::protobuf::EnumDescriptor* TYPE_descriptor(); template @@ -126,13 +131,46 @@ const std::string& TYPE_Name(T value) { template <> inline const std::string& TYPE_Name(TYPE value) { return ::google::protobuf::internal::NameOfDenseEnum( + 0, 11>( static_cast(value)); } inline bool TYPE_Parse(absl::string_view name, TYPE* value) { return ::google::protobuf::internal::ParseNamedEnum( TYPE_descriptor(), name, value); } +enum DATAHANDLE : int { + UPDATE = 0, + ADD = 1, + DEL = 2, + DATAHANDLE_INT_MIN_SENTINEL_DO_NOT_USE_ = + std::numeric_limits<::int32_t>::min(), + DATAHANDLE_INT_MAX_SENTINEL_DO_NOT_USE_ = + std::numeric_limits<::int32_t>::max(), +}; + +bool DATAHANDLE_IsValid(int value); +constexpr DATAHANDLE DATAHANDLE_MIN = static_cast(0); +constexpr DATAHANDLE DATAHANDLE_MAX = static_cast(2); +constexpr int DATAHANDLE_ARRAYSIZE = 2 + 1; +const ::google::protobuf::EnumDescriptor* +DATAHANDLE_descriptor(); +template +const std::string& DATAHANDLE_Name(T value) { + static_assert(std::is_same::value || + std::is_integral::value, + "Incorrect type passed to DATAHANDLE_Name()."); + return DATAHANDLE_Name(static_cast(value)); +} +template <> +inline const std::string& DATAHANDLE_Name(DATAHANDLE value) { + return ::google::protobuf::internal::NameOfDenseEnum( + static_cast(value)); +} +inline bool DATAHANDLE_Parse(absl::string_view name, DATAHANDLE* value) { + return ::google::protobuf::internal::ParseNamedEnum( + DATAHANDLE_descriptor(), name, value); +} // =================================================================== @@ -465,6 +503,7 @@ class RequestInfo final : kStrValueFieldNumber = 3, kDataTypeFieldNumber = 1, kValueTypeFieldNumber = 4, + kHandleTypeFieldNumber = 5, }; // bytes nameKey = 2; void clear_namekey() ; @@ -517,13 +556,23 @@ class RequestInfo final : ::stream::TYPE _internal_valuetype() const; void _internal_set_valuetype(::stream::TYPE value); + public: + // .stream.DATAHANDLE handleType = 5; + void clear_handletype() ; + ::stream::DATAHANDLE handletype() const; + void set_handletype(::stream::DATAHANDLE value); + + private: + ::stream::DATAHANDLE _internal_handletype() const; + void _internal_set_handletype(::stream::DATAHANDLE value); + public: // @@protoc_insertion_point(class_scope:stream.RequestInfo) private: class _Internal; friend class ::google::protobuf::internal::TcParser; - static const ::google::protobuf::internal::TcParseTable<2, 4, 0, 0, 2> _table_; + static const ::google::protobuf::internal::TcParseTable<3, 5, 0, 0, 2> _table_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; @@ -532,6 +581,7 @@ class RequestInfo final : ::google::protobuf::internal::ArenaStringPtr strvalue_; ::uint32_t datatype_; int valuetype_; + int handletype_; mutable ::google::protobuf::internal::CachedSize _cached_size_; PROTOBUF_TSAN_DECLARE_MEMBER }; @@ -2513,6 +2563,28 @@ inline void RequestInfo::_internal_set_valuetype(::stream::TYPE value) { _impl_.valuetype_ = value; } +// .stream.DATAHANDLE handleType = 5; +inline void RequestInfo::clear_handletype() { + _impl_.handletype_ = 0; +} +inline ::stream::DATAHANDLE RequestInfo::handletype() const { + // @@protoc_insertion_point(field_get:stream.RequestInfo.handleType) + return _internal_handletype(); +} +inline void RequestInfo::set_handletype(::stream::DATAHANDLE value) { + _internal_set_handletype(value); + // @@protoc_insertion_point(field_set:stream.RequestInfo.handleType) +} +inline ::stream::DATAHANDLE RequestInfo::_internal_handletype() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return static_cast<::stream::DATAHANDLE>(_impl_.handletype_); +} +inline void RequestInfo::_internal_set_handletype(::stream::DATAHANDLE value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.handletype_ = value; +} + // ------------------------------------------------------------------- // ResponseInfo @@ -3350,6 +3422,12 @@ template <> inline const EnumDescriptor* GetEnumDescriptor<::stream::TYPE>() { return ::stream::TYPE_descriptor(); } +template <> +struct is_proto_enum<::stream::DATAHANDLE> : std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor<::stream::DATAHANDLE>() { + return ::stream::DATAHANDLE_descriptor(); +} } // namespace protobuf } // namespace google diff --git a/PrintS/protobuf/stream.proto b/PrintS/protobuf/stream.proto index a94d3bf..8b9b9fa 100644 --- a/PrintS/protobuf/stream.proto +++ b/PrintS/protobuf/stream.proto @@ -20,6 +20,17 @@ enum TYPE{ iUINT = 4; iFLOAT = 5; iSTRING = 6; + iCHAR = 7; + iUCHAR = 8; + iWORD = 9; + iDOUBLE = 10; + iTIMET = 11; +} + +enum DATAHANDLE { + UPDATE = 0; + ADD = 1; + DEL = 2; } /*==================begin 通用通信结构体====================*/ @@ -32,11 +43,11 @@ message ParamInfo{ } message RequestInfo { - uint32 dataType = 1; //信息类型 bytes nameKey = 2; //参数key bytes strValue = 3; //value值 - TYPE valueType = 4; //value数据类型 + TYPE valueType = 4; //value数据类型 + DATAHANDLE handleType = 5; //增删改 } message ResponseInfo { @@ -47,6 +58,7 @@ message ResponseInfo { /*==================end 通用通信结构体====================*/ + message ResponseAny{ google.protobuf.Any data = 1; } diff --git a/TestClient/DataManage/DataHandle.cpp b/TestClient/DataManage/DataHandle.cpp index a764d25..993496d 100644 --- a/TestClient/DataManage/DataHandle.cpp +++ b/TestClient/DataManage/DataHandle.cpp @@ -58,13 +58,14 @@ void DataHandle::Stop() { DELP(m_streamClient); } -void DataHandle::PushMsg(WRITETYPE dataType, const string& nameKey, const string& strValue, DATATYPE valueType) { +void DataHandle::PushMsg(WRITETYPE dataType, const string& nameKey, const string& strValue, DATATYPE valueType, DATAHANDLE handleType) { if (m_streamClient) { WriteData msg; msg.dataType = dataType; msg.nameKey = nameKey; msg.strValue = strValue; msg.valueType = valueType; + msg.handleType = handleType; m_streamClient->PushMsg(msg); } } @@ -80,7 +81,7 @@ void DataHandle::PrintValue(const ReadData& msg){ ++it; } printf("共有参数%zd个...\n", msg.its.size()); - if(m_printIndex == 9 || m_printIndex == 36){ + if(m_printIndex == LASERPARAM || m_printIndex == XYSCANSTATE){ static int count = 0; ++count; if (count == 4) { count = 0; m_printIndex = -1; } //激光参数默认4个 @@ -99,6 +100,7 @@ void DataHandle::DataCallBackHandle(const ReadData& msg) { m_printIndex = -1; } else { + if (msg.dataType == 40) printf("recv 40 data...\n"); PrintValue(msg); } @@ -151,18 +153,19 @@ void DataHandle::ParamReadUsage() { 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 machine cfg param data...\n" COLOR_RESET); + printf(" 30: " COLOR_YELLOW "print favorite 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); + printf(" 31: " COLOR_YELLOW "print moldcfg param data...\n" COLOR_RESET); + printf(" 32: " COLOR_YELLOW "print loadcfg param data...\n" COLOR_RESET); + printf(" 33: " COLOR_YELLOW "print armcfgparam data...\n" COLOR_RESET); + printf(" 34: " COLOR_YELLOW "print supplycfgparam data...\n" COLOR_RESET); + printf(" 35: " COLOR_YELLOW "print cleancfgparam data...\n" COLOR_RESET); + printf(" 36: " COLOR_YELLOW "print elecfgparam data...\n" COLOR_RESET); + printf(" 37: " COLOR_YELLOW "print loadparamrsp data...\n" COLOR_RESET); + printf(" 38: " COLOR_YELLOW "print scan ctrl state data...\n" COLOR_RESET); + printf(" 39: " COLOR_YELLOW "print scan ctrl Param data...\n" COLOR_RESET); + printf(" 40: " COLOR_YELLOW "print xy scan state data...\n" COLOR_RESET); + printf(" 41: " COLOR_YELLOW "print camera param data...\n" COLOR_RESET); } int DataHandle::Request(int index) { @@ -239,10 +242,10 @@ void DataHandle::ParamRequest(int index) { m_printIndex = index; while (m_printIndex >= 0) { - Sleep(100); + Sleep(20); static int count = 0; ++count; - if (count == 10 && m_printIndex >= 0) { //等待1s,没用收到消息,判断为服务器没用发送 + if (count == 50 && m_printIndex >= 0) { //等待1s,没用收到消息,判断为服务器没用发送 count = 0; printf("服务器没有发送此参数...\n"); break; @@ -269,6 +272,9 @@ void DataHandle::UpdateParam(const string& input) { case MACHINECFGPARAM: PushMsg(MACHINECFG, "lastStartTime", to_string(time(nullptr)), iTIMET); //machinecfg test break; + case FAVORITECFGPARAM: + PushMsg(FAVORITECFG, "lastStartTime", to_string(time(nullptr)), iSTRING,ADD); //machinecfg test + break; case ELECFGPARAM: break; case LOADPARAMRSP: diff --git a/TestClient/DataManage/DataHandle.h b/TestClient/DataManage/DataHandle.h index ed7f6ac..3bf9384 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 PushMsg(WRITETYPE dataType, const string& nameKey = "", const string& strValue = "", DATATYPE valueType = UNKNOW); + void PushMsg(WRITETYPE dataType, const string& nameKey = "", const string& strValue = "", DATATYPE valueType = UNKNOW, DATAHANDLE handleType = UPDATE); string GetVersion()const {return m_version;} diff --git a/TestClient/DataManage/RWData.h b/TestClient/DataManage/RWData.h index a864727..bace02a 100644 --- a/TestClient/DataManage/RWData.h +++ b/TestClient/DataManage/RWData.h @@ -42,6 +42,7 @@ enum READTYPE { RUNCFGPARAM, //runcfg 参数 INFRAREDTEMPCFGPARAM, //InfraredTempCfg 参数 MACHINECFGPARAM, //MachineCfg 参数 + FAVORITECFGPARAM, //FavoriteCfg 参数 MOLDCFGPARAM, LOADCFGPARAM, @@ -54,7 +55,7 @@ enum READTYPE { LOADPARAMRSP, //装载参数 SCANCTRLSTATE, //BaseCtrl参数 SCANCTRLPARAM, //scanctrl参数 - XYSCANSTATE, //XYScanState参数 在参数更新的时候才会发送到客户端 + XYSCANSTATE, //XYScanState参数 服务端g_isDebug = true && 放开代码才能测试 CAMERAPARAM, //相机参数 @@ -117,7 +118,7 @@ enum WRITETYPE { RUNCFG, INFRAREDTEMPCFG, MACHINECFG, - + FAVORITECFG, LOADPARAM, //装载参数 @@ -126,9 +127,16 @@ enum WRITETYPE { REQUEST = 100, //获取配置信息 test用 }; +enum DATAHANDLE { + UPDATE = 0, + ADD = 1, + DEL = 2, +}; + struct WriteData { WRITETYPE dataType; std::string nameKey; //参数key std::string strValue; //value DATATYPE valueType; + DATAHANDLE handleType = UPDATE; }; diff --git a/TestClient/DataManage/StreamClient.cpp b/TestClient/DataManage/StreamClient.cpp index 86e6250..e2f13a5 100644 --- a/TestClient/DataManage/StreamClient.cpp +++ b/TestClient/DataManage/StreamClient.cpp @@ -94,6 +94,7 @@ void StreamClient::AllStream() { request.set_datatype(writeData.dataType); request.set_strvalue(writeData.strValue); request.set_valuetype((::stream::TYPE)writeData.valueType); + request.set_handletype((::stream::DATAHANDLE)writeData.handleType); stream->Write(request); } else { diff --git a/TestClient/protobuf/stream.pb.cc b/TestClient/protobuf/stream.pb.cc index ad77b52..f6a0f17 100644 --- a/TestClient/protobuf/stream.pb.cc +++ b/TestClient/protobuf/stream.pb.cc @@ -58,6 +58,7 @@ PROTOBUF_CONSTEXPR RequestInfo::RequestInfo(::_pbi::ConstantInitialized) }, /*decltype(_impl_.datatype_)*/ 0u, /*decltype(_impl_.valuetype_)*/ 0, + /*decltype(_impl_.handletype_)*/ 0, /*decltype(_impl_._cached_size_)*/ {}, } {} struct RequestInfoDefaultTypeInternal { @@ -235,7 +236,7 @@ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ImgInfoResponceDefaultTypeInternal _ImgInfoResponce_default_instance_; } // namespace stream static ::_pb::Metadata file_level_metadata_stream_2eproto[11]; -static const ::_pb::EnumDescriptor* file_level_enum_descriptors_stream_2eproto[1]; +static const ::_pb::EnumDescriptor* file_level_enum_descriptors_stream_2eproto[2]; static constexpr const ::_pb::ServiceDescriptor** file_level_service_descriptors_stream_2eproto = nullptr; const ::uint32_t TableStruct_stream_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE( @@ -263,6 +264,7 @@ const ::uint32_t TableStruct_stream_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.namekey_), PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.strvalue_), PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.valuetype_), + PROTOBUF_FIELD_OFFSET(::stream::RequestInfo, _impl_.handletype_), ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::stream::ResponseInfo, _internal_metadata_), ~0u, // no _extensions_ @@ -369,15 +371,15 @@ static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { {0, -1, -1, sizeof(::stream::ParamInfo)}, {11, -1, -1, sizeof(::stream::RequestInfo)}, - {23, -1, -1, sizeof(::stream::ResponseInfo)}, - {34, 43, -1, sizeof(::stream::ResponseAny)}, - {44, -1, -1, sizeof(::stream::LayerData)}, - {57, -1, -1, sizeof(::stream::LayerDataBlock)}, - {71, -1, -1, sizeof(::stream::VectorDataBlock)}, - {83, -1, -1, sizeof(::stream::ChainDataBlock)}, - {93, -1, -1, sizeof(::stream::Point)}, - {103, -1, -1, sizeof(::stream::RegResponce)}, - {112, -1, -1, sizeof(::stream::ImgInfoResponce)}, + {24, -1, -1, sizeof(::stream::ResponseInfo)}, + {35, 44, -1, sizeof(::stream::ResponseAny)}, + {45, -1, -1, sizeof(::stream::LayerData)}, + {58, -1, -1, sizeof(::stream::LayerDataBlock)}, + {72, -1, -1, sizeof(::stream::VectorDataBlock)}, + {84, -1, -1, sizeof(::stream::ChainDataBlock)}, + {94, -1, -1, sizeof(::stream::Point)}, + {104, -1, -1, sizeof(::stream::RegResponce)}, + {113, -1, -1, sizeof(::stream::ImgInfoResponce)}, }; static const ::_pb::Message* const file_default_instances[] = { @@ -397,38 +399,41 @@ const char descriptor_table_protodef_stream_2eproto[] PROTOBUF_SECTION_VARIABLE( "\n\014stream.proto\022\006stream\032\031google/protobuf/" "any.proto\"O\n\tParamInfo\022\017\n\007nameKey\030\001 \001(\014\022" "\020\n\010strValue\030\002 \001(\014\022\037\n\tvalueType\030\003 \001(\0162\014.s" - "tream.TYPE\"c\n\013RequestInfo\022\020\n\010dataType\030\001 " - "\001(\r\022\017\n\007nameKey\030\002 \001(\014\022\020\n\010strValue\030\003 \001(\014\022\037" - "\n\tvalueType\030\004 \001(\0162\014.stream.TYPE\"Q\n\014Respo" - "nseInfo\022\020\n\010dataType\030\001 \001(\r\022\016\n\006result\030\002 \001(" - "\010\022\037\n\004item\030\003 \003(\0132\021.stream.ParamInfo\"1\n\013Re" - "sponseAny\022\"\n\004data\030\001 \001(\0132\024.google.protobu" - "f.Any\"\210\001\n\tLayerData\022\023\n\013zCooldinate\030\001 \001(\002" - "\022\016\n\006powder\030\002 \001(\002\022\026\n\016layerThickness\030\003 \001(\002" - "\022.\n\016layerDataBlock\030\004 \003(\0132\026.stream.LayerD" - "ataBlock\022\016\n\006result\030\005 \001(\010\"\266\001\n\016LayerDataBl" - "ock\022\021\n\telementId\030\001 \001(\005\022\026\n\016elementParamId" - "\030\002 \001(\005\022\021\n\tblockType\030\003 \001(\r\022*\n\tvecBlocks\030\004" - " \003(\0132\027.stream.VectorDataBlock\022+\n\013chainBl" - "ocks\030\005 \003(\0132\026.stream.ChainDataBlock\022\r\n\005or" - "der\030\006 \001(\r\"M\n\017VectorDataBlock\022\016\n\006startX\030\001" - " \001(\002\022\016\n\006startY\030\002 \001(\002\022\014\n\004endX\030\003 \001(\002\022\014\n\004en" - "dY\030\004 \001(\002\"A\n\016ChainDataBlock\022\016\n\006dotNum\030\001 \001" - "(\r\022\037\n\010pointVec\030\002 \003(\0132\r.stream.Point\"#\n\005P" - "oint\022\014\n\004xPos\030\001 \001(\002\022\014\n\004yPos\030\002 \001(\002\"\033\n\013RegR" - "esponce\022\014\n\004data\030\001 \001(\005\"D\n\017ImgInfoResponce" - "\022\022\n\nlevelImage\030\001 \001(\r\022\r\n\005width\030\002 \001(\005\022\016\n\006h" - "eight\030\003 \001(\005*X\n\004TYPE\022\t\n\005iBOOL\020\000\022\n\n\006iSHORT" - "\020\001\022\013\n\007iUSHORT\020\002\022\010\n\004iINT\020\003\022\t\n\005iUINT\020\004\022\n\n\006" - "iFLOAT\020\005\022\013\n\007iSTRING\020\0062\372\001\n\006Stream\0224\n\006Simp" - "le\022\023.stream.RequestInfo\032\023.stream.Respons" - "eAny\"\000\022=\n\014ServerStream\022\023.stream.RequestI" - "nfo\032\024.stream.ResponseInfo\"\0000\001\022=\n\014ClientS" - "tream\022\023.stream.RequestInfo\032\024.stream.Resp" - "onseInfo\"\000(\001\022<\n\tAllStream\022\023.stream.Reque" - "stInfo\032\024.stream.ResponseInfo\"\000(\0010\001B-\n\027io" - ".grpc.examples.streamB\013StreamProtoP\001\242\002\002S" - "Tb\006proto3" + "tream.TYPE\"\213\001\n\013RequestInfo\022\020\n\010dataType\030\001" + " \001(\r\022\017\n\007nameKey\030\002 \001(\014\022\020\n\010strValue\030\003 \001(\014\022" + "\037\n\tvalueType\030\004 \001(\0162\014.stream.TYPE\022&\n\nhand" + "leType\030\005 \001(\0162\022.stream.DATAHANDLE\"Q\n\014Resp" + "onseInfo\022\020\n\010dataType\030\001 \001(\r\022\016\n\006result\030\002 \001" + "(\010\022\037\n\004item\030\003 \003(\0132\021.stream.ParamInfo\"1\n\013R" + "esponseAny\022\"\n\004data\030\001 \001(\0132\024.google.protob" + "uf.Any\"\210\001\n\tLayerData\022\023\n\013zCooldinate\030\001 \001(" + "\002\022\016\n\006powder\030\002 \001(\002\022\026\n\016layerThickness\030\003 \001(" + "\002\022.\n\016layerDataBlock\030\004 \003(\0132\026.stream.Layer" + "DataBlock\022\016\n\006result\030\005 \001(\010\"\266\001\n\016LayerDataB" + "lock\022\021\n\telementId\030\001 \001(\005\022\026\n\016elementParamI" + "d\030\002 \001(\005\022\021\n\tblockType\030\003 \001(\r\022*\n\tvecBlocks\030" + "\004 \003(\0132\027.stream.VectorDataBlock\022+\n\013chainB" + "locks\030\005 \003(\0132\026.stream.ChainDataBlock\022\r\n\005o" + "rder\030\006 \001(\r\"M\n\017VectorDataBlock\022\016\n\006startX\030" + "\001 \001(\002\022\016\n\006startY\030\002 \001(\002\022\014\n\004endX\030\003 \001(\002\022\014\n\004e" + "ndY\030\004 \001(\002\"A\n\016ChainDataBlock\022\016\n\006dotNum\030\001 " + "\001(\r\022\037\n\010pointVec\030\002 \003(\0132\r.stream.Point\"#\n\005" + "Point\022\014\n\004xPos\030\001 \001(\002\022\014\n\004yPos\030\002 \001(\002\"\033\n\013Reg" + "Responce\022\014\n\004data\030\001 \001(\005\"D\n\017ImgInfoResponc" + "e\022\022\n\nlevelImage\030\001 \001(\r\022\r\n\005width\030\002 \001(\005\022\016\n\006" + "height\030\003 \001(\005*\223\001\n\004TYPE\022\t\n\005iBOOL\020\000\022\n\n\006iSHO" + "RT\020\001\022\013\n\007iUSHORT\020\002\022\010\n\004iINT\020\003\022\t\n\005iUINT\020\004\022\n" + "\n\006iFLOAT\020\005\022\013\n\007iSTRING\020\006\022\t\n\005iCHAR\020\007\022\n\n\006iU" + "CHAR\020\010\022\t\n\005iWORD\020\t\022\013\n\007iDOUBLE\020\n\022\n\n\006iTIMET" + "\020\013**\n\nDATAHANDLE\022\n\n\006UPDATE\020\000\022\007\n\003ADD\020\001\022\007\n" + "\003DEL\020\0022\372\001\n\006Stream\0224\n\006Simple\022\023.stream.Req" + "uestInfo\032\023.stream.ResponseAny\"\000\022=\n\014Serve" + "rStream\022\023.stream.RequestInfo\032\024.stream.Re" + "sponseInfo\"\0000\001\022=\n\014ClientStream\022\023.stream." + "RequestInfo\032\024.stream.ResponseInfo\"\000(\001\022<\n" + "\tAllStream\022\023.stream.RequestInfo\032\024.stream" + ".ResponseInfo\"\000(\0010\001B-\n\027io.grpc.examples." + "streamB\013StreamProtoP\001\242\002\002STb\006proto3" }; static const ::_pbi::DescriptorTable* const descriptor_table_stream_2eproto_deps[1] = { @@ -438,7 +443,7 @@ static ::absl::once_flag descriptor_table_stream_2eproto_once; const ::_pbi::DescriptorTable descriptor_table_stream_2eproto = { false, false, - 1369, + 1514, descriptor_table_protodef_stream_2eproto, "stream.proto", &descriptor_table_stream_2eproto_once, @@ -484,6 +489,25 @@ bool TYPE_IsValid(int value) { case 4: case 5: case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + return true; + default: + return false; + } +} +const ::google::protobuf::EnumDescriptor* DATAHANDLE_descriptor() { + ::google::protobuf::internal::AssignDescriptors(&descriptor_table_stream_2eproto); + return file_level_enum_descriptors_stream_2eproto[1]; +} +bool DATAHANDLE_IsValid(int value) { + switch (value) { + case 0: + case 1: + case 2: return true; default: return false; @@ -760,6 +784,7 @@ RequestInfo::RequestInfo(const RequestInfo& from) : ::google::protobuf::Message( decltype(_impl_.strvalue_){}, decltype(_impl_.datatype_){}, decltype(_impl_.valuetype_){}, + decltype(_impl_.handletype_){}, /*decltype(_impl_._cached_size_)*/ {}, }; _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( @@ -779,8 +804,8 @@ RequestInfo::RequestInfo(const RequestInfo& from) : ::google::protobuf::Message( _this->_impl_.strvalue_.Set(from._internal_strvalue(), _this->GetArenaForAllocation()); } ::memcpy(&_impl_.datatype_, &from._impl_.datatype_, - static_cast<::size_t>(reinterpret_cast(&_impl_.valuetype_) - - reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.valuetype_)); + static_cast<::size_t>(reinterpret_cast(&_impl_.handletype_) - + reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.handletype_)); // @@protoc_insertion_point(copy_constructor:stream.RequestInfo) } @@ -791,6 +816,7 @@ inline void RequestInfo::SharedCtor(::_pb::Arena* arena) { decltype(_impl_.strvalue_){}, decltype(_impl_.datatype_){0u}, decltype(_impl_.valuetype_){0}, + decltype(_impl_.handletype_){0}, /*decltype(_impl_._cached_size_)*/ {}, }; _impl_.namekey_.InitDefault(); @@ -825,8 +851,8 @@ PROTOBUF_NOINLINE void RequestInfo::Clear() { _impl_.namekey_.ClearToEmpty(); _impl_.strvalue_.ClearToEmpty(); ::memset(&_impl_.datatype_, 0, static_cast<::size_t>( - reinterpret_cast(&_impl_.valuetype_) - - reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.valuetype_)); + reinterpret_cast(&_impl_.handletype_) - + reinterpret_cast(&_impl_.datatype_)) + sizeof(_impl_.handletype_)); _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); } @@ -838,23 +864,21 @@ const char* RequestInfo::_InternalParse( PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 -const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { +const ::_pbi::TcParseTable<3, 5, 0, 0, 2> RequestInfo::_table_ = { { 0, // no _has_bits_ 0, // no _extensions_ - 4, 24, // max_field_number, fast_idx_mask + 5, 56, // max_field_number, fast_idx_mask offsetof(decltype(_table_), field_lookup_table), - 4294967280, // skipmap + 4294967264, // skipmap offsetof(decltype(_table_), field_entries), - 4, // num_field_entries + 5, // num_field_entries 0, // num_aux_entries offsetof(decltype(_table_), field_names), // no aux_entries &_RequestInfo_default_instance_._instance, ::_pbi::TcParser::GenericFallback, // fallback }, {{ - // .stream.TYPE valueType = 4; - {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.valuetype_), 63>(), - {32, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_)}}, + {::_pbi::TcParser::MiniParse, {}}, // uint32 dataType = 1; {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.datatype_), 63>(), {8, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.datatype_)}}, @@ -864,6 +888,14 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { // bytes strValue = 3; {::_pbi::TcParser::FastBS1, {26, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.strvalue_)}}, + // .stream.TYPE valueType = 4; + {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.valuetype_), 63>(), + {32, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_)}}, + // .stream.DATAHANDLE handleType = 5; + {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(RequestInfo, _impl_.handletype_), 63>(), + {40, 63, 0, PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.handletype_)}}, + {::_pbi::TcParser::MiniParse, {}}, + {::_pbi::TcParser::MiniParse, {}}, }}, {{ 65535, 65535 }}, {{ @@ -879,6 +911,9 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { // .stream.TYPE valueType = 4; {PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_), 0, 0, (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)}, + // .stream.DATAHANDLE handleType = 5; + {PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.handletype_), 0, 0, + (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)}, }}, // no aux_entries {{ @@ -918,6 +953,13 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { 4, this->_internal_valuetype(), target); } + // .stream.DATAHANDLE handleType = 5; + if (this->_internal_handletype() != 0) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteEnumToArray( + 5, this->_internal_handletype(), target); + } + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( @@ -959,6 +1001,12 @@ const ::_pbi::TcParseTable<2, 4, 0, 0, 2> RequestInfo::_table_ = { ::_pbi::WireFormatLite::EnumSize(this->_internal_valuetype()); } + // .stream.DATAHANDLE handleType = 5; + if (this->_internal_handletype() != 0) { + total_size += 1 + + ::_pbi::WireFormatLite::EnumSize(this->_internal_handletype()); + } + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); } @@ -989,6 +1037,9 @@ void RequestInfo::MergeImpl(::google::protobuf::Message& to_msg, const ::google: if (from._internal_valuetype() != 0) { _this->_internal_set_valuetype(from._internal_valuetype()); } + if (from._internal_handletype() != 0) { + _this->_internal_set_handletype(from._internal_handletype()); + } _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); } @@ -1013,8 +1064,8 @@ void RequestInfo::InternalSwap(RequestInfo* other) { ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.strvalue_, lhs_arena, &other->_impl_.strvalue_, rhs_arena); ::google::protobuf::internal::memswap< - PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.valuetype_) - + sizeof(RequestInfo::_impl_.valuetype_) + PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.handletype_) + + sizeof(RequestInfo::_impl_.handletype_) - PROTOBUF_FIELD_OFFSET(RequestInfo, _impl_.datatype_)>( reinterpret_cast(&_impl_.datatype_), reinterpret_cast(&other->_impl_.datatype_)); diff --git a/TestClient/protobuf/stream.pb.h b/TestClient/protobuf/stream.pb.h index 49d210c..d988498 100644 --- a/TestClient/protobuf/stream.pb.h +++ b/TestClient/protobuf/stream.pb.h @@ -104,6 +104,11 @@ enum TYPE : int { iUINT = 4, iFLOAT = 5, iSTRING = 6, + iCHAR = 7, + iUCHAR = 8, + iWORD = 9, + iDOUBLE = 10, + iTIMET = 11, TYPE_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::int32_t>::min(), TYPE_INT_MAX_SENTINEL_DO_NOT_USE_ = @@ -112,8 +117,8 @@ enum TYPE : int { bool TYPE_IsValid(int value); constexpr TYPE TYPE_MIN = static_cast(0); -constexpr TYPE TYPE_MAX = static_cast(6); -constexpr int TYPE_ARRAYSIZE = 6 + 1; +constexpr TYPE TYPE_MAX = static_cast(11); +constexpr int TYPE_ARRAYSIZE = 11 + 1; const ::google::protobuf::EnumDescriptor* TYPE_descriptor(); template @@ -126,13 +131,46 @@ const std::string& TYPE_Name(T value) { template <> inline const std::string& TYPE_Name(TYPE value) { return ::google::protobuf::internal::NameOfDenseEnum( + 0, 11>( static_cast(value)); } inline bool TYPE_Parse(absl::string_view name, TYPE* value) { return ::google::protobuf::internal::ParseNamedEnum( TYPE_descriptor(), name, value); } +enum DATAHANDLE : int { + UPDATE = 0, + ADD = 1, + DEL = 2, + DATAHANDLE_INT_MIN_SENTINEL_DO_NOT_USE_ = + std::numeric_limits<::int32_t>::min(), + DATAHANDLE_INT_MAX_SENTINEL_DO_NOT_USE_ = + std::numeric_limits<::int32_t>::max(), +}; + +bool DATAHANDLE_IsValid(int value); +constexpr DATAHANDLE DATAHANDLE_MIN = static_cast(0); +constexpr DATAHANDLE DATAHANDLE_MAX = static_cast(2); +constexpr int DATAHANDLE_ARRAYSIZE = 2 + 1; +const ::google::protobuf::EnumDescriptor* +DATAHANDLE_descriptor(); +template +const std::string& DATAHANDLE_Name(T value) { + static_assert(std::is_same::value || + std::is_integral::value, + "Incorrect type passed to DATAHANDLE_Name()."); + return DATAHANDLE_Name(static_cast(value)); +} +template <> +inline const std::string& DATAHANDLE_Name(DATAHANDLE value) { + return ::google::protobuf::internal::NameOfDenseEnum( + static_cast(value)); +} +inline bool DATAHANDLE_Parse(absl::string_view name, DATAHANDLE* value) { + return ::google::protobuf::internal::ParseNamedEnum( + DATAHANDLE_descriptor(), name, value); +} // =================================================================== @@ -465,6 +503,7 @@ class RequestInfo final : kStrValueFieldNumber = 3, kDataTypeFieldNumber = 1, kValueTypeFieldNumber = 4, + kHandleTypeFieldNumber = 5, }; // bytes nameKey = 2; void clear_namekey() ; @@ -517,13 +556,23 @@ class RequestInfo final : ::stream::TYPE _internal_valuetype() const; void _internal_set_valuetype(::stream::TYPE value); + public: + // .stream.DATAHANDLE handleType = 5; + void clear_handletype() ; + ::stream::DATAHANDLE handletype() const; + void set_handletype(::stream::DATAHANDLE value); + + private: + ::stream::DATAHANDLE _internal_handletype() const; + void _internal_set_handletype(::stream::DATAHANDLE value); + public: // @@protoc_insertion_point(class_scope:stream.RequestInfo) private: class _Internal; friend class ::google::protobuf::internal::TcParser; - static const ::google::protobuf::internal::TcParseTable<2, 4, 0, 0, 2> _table_; + static const ::google::protobuf::internal::TcParseTable<3, 5, 0, 0, 2> _table_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; @@ -532,6 +581,7 @@ class RequestInfo final : ::google::protobuf::internal::ArenaStringPtr strvalue_; ::uint32_t datatype_; int valuetype_; + int handletype_; mutable ::google::protobuf::internal::CachedSize _cached_size_; PROTOBUF_TSAN_DECLARE_MEMBER }; @@ -2513,6 +2563,28 @@ inline void RequestInfo::_internal_set_valuetype(::stream::TYPE value) { _impl_.valuetype_ = value; } +// .stream.DATAHANDLE handleType = 5; +inline void RequestInfo::clear_handletype() { + _impl_.handletype_ = 0; +} +inline ::stream::DATAHANDLE RequestInfo::handletype() const { + // @@protoc_insertion_point(field_get:stream.RequestInfo.handleType) + return _internal_handletype(); +} +inline void RequestInfo::set_handletype(::stream::DATAHANDLE value) { + _internal_set_handletype(value); + // @@protoc_insertion_point(field_set:stream.RequestInfo.handleType) +} +inline ::stream::DATAHANDLE RequestInfo::_internal_handletype() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + return static_cast<::stream::DATAHANDLE>(_impl_.handletype_); +} +inline void RequestInfo::_internal_set_handletype(::stream::DATAHANDLE value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + ; + _impl_.handletype_ = value; +} + // ------------------------------------------------------------------- // ResponseInfo @@ -3350,6 +3422,12 @@ template <> inline const EnumDescriptor* GetEnumDescriptor<::stream::TYPE>() { return ::stream::TYPE_descriptor(); } +template <> +struct is_proto_enum<::stream::DATAHANDLE> : std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor<::stream::DATAHANDLE>() { + return ::stream::DATAHANDLE_descriptor(); +} } // namespace protobuf } // namespace google diff --git a/TestClient/protobuf/stream.proto b/TestClient/protobuf/stream.proto index a94d3bf..8b9b9fa 100644 --- a/TestClient/protobuf/stream.proto +++ b/TestClient/protobuf/stream.proto @@ -20,6 +20,17 @@ enum TYPE{ iUINT = 4; iFLOAT = 5; iSTRING = 6; + iCHAR = 7; + iUCHAR = 8; + iWORD = 9; + iDOUBLE = 10; + iTIMET = 11; +} + +enum DATAHANDLE { + UPDATE = 0; + ADD = 1; + DEL = 2; } /*==================begin 通用通信结构体====================*/ @@ -32,11 +43,11 @@ message ParamInfo{ } message RequestInfo { - uint32 dataType = 1; //信息类型 bytes nameKey = 2; //参数key bytes strValue = 3; //value值 - TYPE valueType = 4; //value数据类型 + TYPE valueType = 4; //value数据类型 + DATAHANDLE handleType = 5; //增删改 } message ResponseInfo { @@ -47,6 +58,7 @@ message ResponseInfo { /*==================end 通用通信结构体====================*/ + message ResponseAny{ google.protobuf.Any data = 1; }