From 3e8d350e966359d8fbda05c86ab4211bc5d58f79 Mon Sep 17 00:00:00 2001 From: wangxx1809 Date: Wed, 15 May 2024 13:38:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BF=80=E5=85=89=E5=99=A8=E5=8F=8A=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E9=80=9A=E4=BF=A1=E5=8A=9F=E8=83=BD=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrintS/Controller/Controller.cpp | 27 +- PrintS/DataManage/DataHandle.cpp | 80 +-- PrintS/DataManage/DataHandle.h | 4 +- PrintS/DataManage/RWData.h | 18 +- PrintS/DataManage/StreamServer.cpp | 18 +- PrintS/DataManage/StreamServer.h | 4 +- PrintS/PLC/AxisState.cpp | 282 ++++++----- PrintS/PLC/AxisState.h | 455 +++++++++--------- PrintS/ScannerCtrl/IntelliScanState.h | 240 +++++++-- PrintS/ScannerCtrl/RTC5Scanner.cpp | 175 +++---- PrintS/ScannerCtrl/RTC5Scanner.h | 5 +- PrintS/ScannerCtrl/Scanner.cpp | 18 +- PrintS/ScannerCtrl/Scanner.h | 7 +- PrintS/ScannerCtrl/ScannerCtrl.cpp | 71 ++- PrintS/ScannerCtrl/ScannerCtrl.h | 22 +- .../AxisCfg.cpp | 75 --- PrintS/job/H3DMetaData.cpp | 10 +- PrintS/job/H3DMetaData.h | 2 +- PrintS/job/JobMetaData.cpp | 9 +- PrintS/job/JobMetaData.h | 2 +- PrintS/job/MetaData.h | 2 +- PrintS/output/Release/log/2024.hbd | Bin 135168 -> 139264 bytes PrintS/protobuf/stream.grpc.pb.cc | 22 +- PrintS/protobuf/stream.grpc.pb.h | 68 +-- PrintS/protobuf/stream.pb.cc | 315 ++++++++++-- PrintS/protobuf/stream.pb.h | 274 ++++++++++- PrintS/protobuf/stream.proto | 8 +- TestClient/DataManage/DataHandle.cpp | 84 ++-- TestClient/DataManage/FunC.h | 1 - TestClient/DataManage/RWData.h | 48 +- TestClient/utils/LocalAddr.h | 152 ++++++ 31 files changed, 1679 insertions(+), 819 deletions(-) delete mode 100644 PrintS/enc_temp_folder/3951ff932cdd959898890bc5f61814d/AxisCfg.cpp create mode 100644 TestClient/utils/LocalAddr.h diff --git a/PrintS/Controller/Controller.cpp b/PrintS/Controller/Controller.cpp index 444238a..02f4343 100644 --- a/PrintS/Controller/Controller.cpp +++ b/PrintS/Controller/Controller.cpp @@ -120,23 +120,40 @@ void Controller::Init(){ m_Purifier->Init(); m_jobController.StartLoadPrepareJob(); - - - //ConfigManager::GetInstance()->SendCfgToClients(); //发送配置到客户端 - //BaseCtrl::SendToClients(); //发送控制参数到客户端 } void Controller::StartSend() { StopSend(); + m_sendTdExitFlag = false; m_sendParamThread = std::thread([this] { while (!m_sendTdExitFlag) { m_ComServer->SendToClients(); m_Purifier->SendToClients(); - this_thread::sleep_for(std::chrono::milliseconds(150)); + //轴参数 + m_Axis->m_Mold->GetState()->SendToClients(AXISMOLD); + m_Axis->m_MoldSlave->GetState()->SendToClients(AXISMOLDSLAVE); + m_Axis->m_Clean->GetState()->SendToClients(AXISCLEAN); + m_Axis->m_CleanSlave->GetState()->SendToClients(AXISCLEANSLAVE); + m_Axis->m_Load->GetState()->SendToClients(AXISLOAD); + m_Axis->m_Arm->GetState()->SendToClients(AXISMARM); + m_Axis->m_Supply->GetState()->SendToClients(AXISMSUPPLY); + m_Axis->m_Ele->GetState()->SendToClients(AXISELE); + m_Axis->m_EleSlave->GetState()->SendToClients(AXISELESLAVE); + + //扫描参数 + static int count = 0; + ++count; + if (count == 2) { //发送频率降低 + m_ScannerCtrl->SendToClients(); + count = 0; + } + + + this_thread::sleep_for(std::chrono::milliseconds(250)); } }); diff --git a/PrintS/DataManage/DataHandle.cpp b/PrintS/DataManage/DataHandle.cpp index 9099b9b..b3002aa 100644 --- a/PrintS/DataManage/DataHandle.cpp +++ b/PrintS/DataManage/DataHandle.cpp @@ -8,14 +8,20 @@ void DataHandle::DataCallBackProc(void* pthis, const ReadData& msg) { p->DataCallBackHandle(msg); } -void DataHandle::LayersDataCallBackProc(void* pthis,const ReadData& msg, ::stream::LayerData** response) { +void DataHandle::LayersDataCallBackProc(void* pthis,const ReadData& msg, ::stream::ResponseAny** response) { DataHandle* p = (DataHandle*)pthis; int index = atoi(msg.strValue.data()); + if ((READTYPE)msg.dataType == LAYERDATAREQ) { + int size = (int)p->m_controller->m_jobController.m_PrepareJob->GetMetaData()->GetLayersVec().size(); + if (!p || index<1 || index>(int)size) return; + p->m_controller->m_jobController.m_PrepareJob->GetMetaData()->GetLayerByIndex(index - 1, response); + } + //else if ((READTYPE)msg.dataType == XYSCANSTATE) { + // + //} + - int size = (int)p->m_controller->m_jobController.m_PrepareJob->GetMetaData()->GetLayersVec().size(); - if (!p || index<1 || index>(int)size) return; - p->m_controller->m_jobController.m_PrepareJob->GetMetaData()->GetLayerByIndex(index-1,response); } DataHandle::DataHandle() @@ -93,33 +99,33 @@ void DataHandle::DataCallBackHandle(const ReadData& msg) { printf("没有准备好哦,无法操作\n"); return; } m_controller->m_Machine->CallAxisFunc(msg); break; - case SCANERSTART: //开始扫描 - scanners = m_controller->m_ScannerCtrl->GetScanners(); - index = atoi(msg.strValue.c_str()); - if (index >= (*scanners).size()) return; - if ((*scanners)[index]) (*scanners)[index]->StartDebugTest(); - break; - case SCANERSTOP: //停止扫描 - scanners = m_controller->m_ScannerCtrl->GetScanners(); - index = atoi(msg.strValue.c_str()); - if (index >= (*scanners).size()) return; - if ((*scanners)[index]) (*scanners)[index]->StopDebugTest(); - break; - case STARTHEATINGSCANNERTEST: //开始振镜预热测试 - scanners = m_controller->m_ScannerCtrl->GetScanners(); - index = atoi(msg.strValue.c_str()); - if (index >= (*scanners).size()) return; - if((*scanners)[index]) (*scanners)[index]->StartHeatingScannerTest(); - break; - case STOPHEATINGSCANNERTEST: //停止振镜预热 - scanners = m_controller->m_ScannerCtrl->GetScanners(); - index = atoi(msg.strValue.c_str()); - if (index >= (*scanners).size()) return; - if ((*scanners)[index]) (*scanners)[index]->StopHeatingScannerTest(); - break; - case INITERRORINFOSREQ: //初始化错误信息 - msg.clientPtr->PushMsg(new WriteData(INITERRORINFOSRSP, { {string(""), m_controller->m_ScannerCtrl->GetInitErrorInfos(), iSTRING} })); - break; + //case SCANERSTART: //开始扫描 + // scanners = m_controller->m_ScannerCtrl->GetScanners(); + // index = atoi(msg.strValue.c_str()); + // if (index >= (*scanners).size()) return; + // if ((*scanners)[index]) (*scanners)[index]->StartDebugTest(); + // break; + //case SCANERSTOP: //停止扫描 + // scanners = m_controller->m_ScannerCtrl->GetScanners(); + // index = atoi(msg.strValue.c_str()); + // if (index >= (*scanners).size()) return; + // if ((*scanners)[index]) (*scanners)[index]->StopDebugTest(); + // break; + //case STARTHEATINGSCANNERTEST: //开始振镜预热测试 + // scanners = m_controller->m_ScannerCtrl->GetScanners(); + // index = atoi(msg.strValue.c_str()); + // if (index >= (*scanners).size()) return; + // if((*scanners)[index]) (*scanners)[index]->StartHeatingScannerTest(); + // break; + //case STOPHEATINGSCANNERTEST: //停止振镜预热 + // scanners = m_controller->m_ScannerCtrl->GetScanners(); + // index = atoi(msg.strValue.c_str()); + // if (index >= (*scanners).size()) return; + // if ((*scanners)[index]) (*scanners)[index]->StopHeatingScannerTest(); + // break; + //case INITERRORINFOSREQ: //初始化错误信息 + // msg.clientPtr->PushMsg(new WriteData(INITERRORINFOSRSP, { {string(""), m_controller->m_ScannerCtrl->GetInitErrorInfos(), iSTRING} })); + // break; case VERSIONREQ: //获取版本信息 msg.clientPtr->PushMsg(new WriteData(VERSIONRSP, { { string(""), g_SystemInfo->m_ProductVersion, iSTRING } })); break; @@ -137,8 +143,16 @@ void DataHandle::DataCallBackHandle(const ReadData& msg) { m_controller->m_ScannerCtrl->CallFunc(msg); break; case REQUEST: - ConfigManager::GetInstance()->SendCfgToClients(); //发送配置到客户端 - + 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)); + //} + } + else { + ConfigManager::GetInstance()->SendCfgToClients(); //发送配置到客户端 + } default: break; diff --git a/PrintS/DataManage/DataHandle.h b/PrintS/DataManage/DataHandle.h index 17c1415..2ad7fb2 100644 --- a/PrintS/DataManage/DataHandle.h +++ b/PrintS/DataManage/DataHandle.h @@ -7,7 +7,7 @@ class DataHandle{ typedef void (*DataCallBack)(void* pthis, const ReadData& msg); - typedef void (*LayersDataCallBack)(void* pthis, const ReadData& msg, ::stream::LayerData** response); + typedef void (*LayersDataCallBack)(void* pthis, const ReadData& msg, ::stream::ResponseAny** response); public: DataHandle(); ~DataHandle(); @@ -17,7 +17,7 @@ public: void Stop(); static void DataCallBackProc(void* pthis, const ReadData& msg); - static void LayersDataCallBackProc(void* pthis, const ReadData& msg,::stream::LayerData** response); + static void LayersDataCallBackProc(void* pthis, const ReadData& msg,::stream::ResponseAny** response); private: //DataCallBack m_dataCallBack; std::thread m_testTd; diff --git a/PrintS/DataManage/RWData.h b/PrintS/DataManage/RWData.h index 3293bed..4e6fadf 100644 --- a/PrintS/DataManage/RWData.h +++ b/PrintS/DataManage/RWData.h @@ -7,12 +7,7 @@ enum READTYPE { GET = 0, SET, AXISMOVEFUNC, //轴运动函数 - - SCANERSTART, //开始扫描 - SCANERSTOP, //停止扫描 - STARTHEATINGSCANNERTEST, //开始振镜预热测试 - STOPHEATINGSCANNERTEST, //停止振镜预热 - INITERRORINFOSREQ, //初始化错误信息 + VERSIONREQ, //获取版本信息 IOSIGNAL, //io 信号 @@ -62,7 +57,7 @@ struct ReadData { enum WRITETYPE { ALARM = 0, //报警 - INITERRORINFOSRSP, //返回初始化错误信息 + //INITERRORINFOSRSP, //返回初始化错误信息 VERSIONRSP, //返回版本信息 IOSIGNALRSP, //io信号返回数据 SYSPARAMDATA, //系统参数 @@ -94,7 +89,7 @@ enum WRITETYPE { AXISELESLAVE, /********************配置信息******************/ - PARAMLIMITCFGPARAM, + PARAMLIMITCFGPARAM, //paramlimit配置参数 EXTCFGPARAM, MOLDCFGPARAM, @@ -106,7 +101,10 @@ enum WRITETYPE { LOADPARAMRSP, //装载参数 - SCANCTRLSTATE, //scanctrl参数 + SCANCTRLSTATE, //BaseCtrl参数 + SCANCTRLPARAM, //scanctrl参数 + XYSCANSTATE, //XYScanState参数 在参数更新的时候才会发送到客户端 + TEST = 1000, //test }; @@ -124,7 +122,7 @@ struct WriteData { WriteData() {} WriteData(WRITETYPE dt,const std::list& its ) - : dataType(dt), items(its){} + : dataType(dt), result(true), items(its){} }; diff --git a/PrintS/DataManage/StreamServer.cpp b/PrintS/DataManage/StreamServer.cpp index 9843147..7a4bdda 100644 --- a/PrintS/DataManage/StreamServer.cpp +++ b/PrintS/DataManage/StreamServer.cpp @@ -19,18 +19,22 @@ StreamServer::~StreamServer() { //回复后连接中断 请求打印文件层 -::grpc::Status StreamServer::Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response) { - +::grpc::Status StreamServer::Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response) { ReadData readData; readData.dataType = (READTYPE)(request->datatype()); readData.nameKey = request->namekey(); readData.strValue = request->strvalue(); readData.valueType = (DATATYPE)request->valuetype(); - if ((READTYPE)(request->datatype()) == LAYERDATAREQ) { - if (m_layerDataCallBack) - m_layerDataCallBack(m_handlePtr, readData, &response); - - } + //if ((READTYPE)(request->datatype()) == LAYERDATAREQ) { + // if (m_layerDataCallBack) + // m_layerDataCallBack(m_handlePtr, readData, &response); + //} + //else if((READTYPE)(request->datatype()) == XYSCANSTATE){ + // if (m_layerDataCallBack) + // m_layerDataCallBack(m_handlePtr, readData, &response); + //} + if (m_layerDataCallBack) + m_layerDataCallBack(m_handlePtr, readData, &response); return Status::OK; } diff --git a/PrintS/DataManage/StreamServer.h b/PrintS/DataManage/StreamServer.h index b20e865..b2496a4 100644 --- a/PrintS/DataManage/StreamServer.h +++ b/PrintS/DataManage/StreamServer.h @@ -19,7 +19,7 @@ using stream::ResponseInfo; class StreamServer final : public Stream::Service { typedef void (*DataCallBack)(void* pthis,const ReadData& msg); - typedef void (*LayerDataCallBack)(void* pthis, const ReadData& msg, ::stream::LayerData** response); + typedef void (*LayerDataCallBack)(void* pthis, const ReadData& msg, ::stream::ResponseAny** response); public: @@ -38,7 +38,7 @@ public: private: Status AllStream(ServerContext* context, grpc::ServerReaderWriter* stream) override; - ::grpc::Status Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response); + ::grpc::Status Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response); private: std::thread m_checkCloseTd; //检测客户端关闭线程 diff --git a/PrintS/PLC/AxisState.cpp b/PrintS/PLC/AxisState.cpp index 8a605e3..04cc006 100644 --- a/PrintS/PLC/AxisState.cpp +++ b/PrintS/PLC/AxisState.cpp @@ -4,191 +4,223 @@ #include "../Logger.h" AxisState::AxisState() + : m_ServoOn(new BoolData("ServoOn", u8"轴伺服ON_RW")) + , m_ServoHomeIndexOn(new BoolData("ServoHomeIndexOn", u8"轴伺服成立原点_RW")) + , m_ServoReset(new BoolData("ServoReset", u8"轴伺服复位_RW")) + , m_MoveP(new BoolData("MoveP", u8"轴相对左运动_手动_RW")) + , m_MoveN(new BoolData("MoveN", u8"轴相对右运动_手动_RW")) + , m_MovePContinue(new BoolData("MovePContinue", u8"轴左JOG_手动_RW")) + , m_MoveNContinue(new BoolData("MoveNContinue", u8"轴右JOG_手动_RW")) + , m_MoveAbsPos(new BoolData("MoveAbsPos", u8"轴绝对值运动_手动_RW")) + , m_MotionStop(new BoolData("MotionStop", u8"轴急停_RW")) + , m_ServoRDY(new BoolData("ServoRDY", u8"轴伺服RDY状态_R")) + , m_ServoHomeDone(new BoolData("ServoHomeDone", u8"轴指令运行HOME_Done_R")) + , m_ResetDone(new BoolData("ResetDone", u8"轴指令运行RESET_Done_R")) + , m_ServoBusy(new BoolData("ServoBusy", u8"轴伺服BUSY_R")) + , m_ServoException(new BoolData("ServoException", u8"轴伺服异常_R")) + , m_Runable(new BoolData("Runable", u8"轴可运行状态_R")) + , m_ExceptionCode(new ShortData("ExceptionCode", u8"轴伺服异常字_R")) + , m_Pos(new FloatData("Pos", u8"当前位置")) + , m_Torque(new FloatData("Torque", u8"当前扭矩")) + , m_ShowPos(new FloatData("ShowPos")) + , m_RPos(new FloatData("RPos")) { - + size_t ptrSize = sizeof(nullptr); //指针大小 + void* startPtr = &m_startFlag + 1; + size_t count = ((size_t)&m_endFlag - (size_t)startPtr) / ptrSize; + InsertMp(startPtr, count); } + void AxisState::GetValue(AxisStateValue& value) { std::shared_lock lock(mtx); - value.ServoOn = m_ServoOn; - value.ServoHomeIndexOn = m_ServoHomeIndexOn; - value.ServoReset = m_ServoReset; - value.MoveP = m_MoveP; - value.MoveN = m_MoveN; - value.MovePContinue = m_MovePContinue; - value.MoveNContinue = m_MoveNContinue; - value.MoveAbsPos = m_MoveAbsPos; - value.MotionStop = m_MotionStop; - value.ServoRDY = m_ServoRDY; - value.ServoHomeDone = m_ServoHomeDone; - value.ResetDone = m_ResetDone; - value.ServoException = m_ServoException; - value.Runable = m_Runable; - value.ExceptionCode = m_ExceptionCode; - value.Pos = m_Pos; - value.Torque = m_Torque; - value.ServoBusy = m_ServoBusy; + value.ServoOn = m_ServoOn->GetValue(); + value.ServoHomeIndexOn = m_ServoHomeIndexOn->GetValue(); + value.ServoReset = m_ServoReset->GetValue(); + value.MoveP = m_MoveP->GetValue(); + value.MoveN = m_MoveN->GetValue(); + value.MovePContinue = m_MovePContinue->GetValue(); + value.MoveNContinue = m_MoveNContinue->GetValue(); + value.MoveAbsPos = m_MoveAbsPos->GetValue(); + value.MotionStop = m_MotionStop->GetValue(); + value.ServoRDY = m_ServoRDY->GetValue(); + value.ServoHomeDone = m_ServoHomeDone->GetValue(); + value.ResetDone = m_ResetDone->GetValue(); + value.ServoException = m_ServoException->GetValue(); + value.Runable = m_Runable->GetValue(); + value.ExceptionCode = m_ExceptionCode->GetValue(); + value.Pos = m_Pos->GetValue(); + value.Torque = m_Torque->GetValue(); + value.ServoBusy = m_ServoBusy->GetValue(); + value.ShowPos = m_ShowPos->GetValue(); + value.RPos = m_RPos->GetValue(); } void AxisState::Update(unsigned char* addr) { std::unique_lock lock(mtx); - m_ServoOn= ((addr[0] & 0x1)>0 ? true : false); - m_ServoHomeIndexOn= ((addr[0] & 0x2)>0 ? true : false); - m_ServoReset= ((addr[0] & 0x4)>0 ? true : false); - m_MoveP= ((addr[0] & 0x8)>0 ? true : false); - m_MoveN= ((addr[0] & 0x10)>0 ? true : false); - m_MovePContinue= ((addr[0] & 0x20)>0 ? true : false); - m_MoveNContinue= ((addr[0] & 0x40)>0 ? true : false); - m_MoveAbsPos= ((addr[0] & 0x80)>0 ? true : false); - m_MotionStop= ((addr[1] & 0x1)>0 ? true : false); - m_ServoRDY= ((addr[1] & 0x2)>0 ? true : false); - m_ServoHomeDone= ((addr[1] & 0x4)>0 ? true : false); - m_ResetDone= ((addr[1] & 0x8)>0 ? true : false); - m_ServoBusy= ((addr[1] & 0x10)>0 ? true : false); - m_ServoException= ((addr[1] & 0x20)>0 ? true : false); - m_Runable= ((addr[1] & 0x40)>0 ? true : false); - m_ExceptionCode = S7WORDDATA(addr[3], addr[2]).wValue; + m_ServoOn->SetValue(((addr[0] & 0x1) > 0 ? true : false)); + m_ServoHomeIndexOn->SetValue(((addr[0] & 0x2) > 0 ? true : false)); + m_ServoReset->SetValue(((addr[0] & 0x4) > 0 ? true : false)); + m_MoveP->SetValue(((addr[0] & 0x8) > 0 ? true : false)); + m_MoveN->SetValue(((addr[0] & 0x10) > 0 ? true : false)); + m_MovePContinue->SetValue(((addr[0] & 0x20) > 0 ? true : false)); + m_MoveNContinue->SetValue(((addr[0] & 0x40) > 0 ? true : false)); + m_MoveAbsPos->SetValue(((addr[0] & 0x80) > 0 ? true : false)); + m_MotionStop->SetValue(((addr[1] & 0x1) > 0 ? true : false)); + m_ServoRDY->SetValue(((addr[1] & 0x2) > 0 ? true : false)); + m_ServoHomeDone->SetValue(((addr[1] & 0x4) > 0 ? true : false)); + m_ResetDone->SetValue(((addr[1] & 0x8) > 0 ? true : false)); + m_ServoBusy->SetValue(((addr[1] & 0x10) > 0 ? true : false)); + m_ServoException->SetValue(((addr[1] & 0x20) > 0 ? true : false)); + m_Runable->SetValue( ((addr[1] & 0x40)>0 ? true : false)); + m_ExceptionCode ->SetValue( S7WORDDATA(addr[3], addr[2]).wValue); } void AxisState::UpdatePosAndLoad(unsigned char* addr) { int index = 0; std::unique_lock lock(mtx); - m_Pos = (S7FLOATDATA(addr[index + 3], addr[index + 2], addr[index + 1], addr[index]).fValue); index += 4; - m_Torque = (S7FLOATDATA(addr[index + 3], addr[index + 2], addr[index + 1], addr[index]).fValue); index += 4; + m_Pos->SetValue((S7FLOATDATA(addr[index + 3], addr[index + 2], addr[index + 1], addr[index]).fValue)); index += 4; + m_Torque->SetValue((S7FLOATDATA(addr[index + 3], addr[index + 2], addr[index + 1], addr[index]).fValue)); index += 4; if (!m_AxisCfg->m_ShowPosInv) { - m_ShowPos = m_Pos - m_AxisCfg->m_ShowRefZero->GetValue(); + m_ShowPos->SetValue(m_Pos->GetValue() - m_AxisCfg->m_ShowRefZero->GetValue()); } else { - m_ShowPos = -(m_Pos - m_AxisCfg->m_ShowRefZero->GetValue()); + m_ShowPos->SetValue(-(m_Pos->GetValue() - m_AxisCfg->m_ShowRefZero->GetValue())); } - m_RPos = m_ShowPos / (m_AxisCfg->m_active_limit - m_AxisCfg->m_negactive_limit); + m_RPos->SetValue(m_ShowPos->GetValue() / (m_AxisCfg->m_active_limit - m_AxisCfg->m_negactive_limit)); } float AxisState::GetShowPos() { float showPos = 0.0f; - std::unique_lock lock(mtx); - showPos = m_ShowPos; + std::shared_lock lock(mtx); + showPos = m_ShowPos->GetValue(); return showPos; } void AxisState::SetZeroPos() { - m_AxisCfg->m_ShowRefZero ->SetValue(m_Pos); + m_AxisCfg->m_ShowRefZero ->SetValue(m_Pos->GetValue()); ConfigManager::GetInstance()->UpdateZeroOffset(m_AxisCfg->m_axis_id, (long)m_AxisCfg->m_ShowRefZero->GetValue()); } +//void AxisState::SendToClients() { +// /*m_controller->m_Axis->m_Mold->GetState()->Update(msg);*/ +// +//} + + void MainAxisState::GetValue(AxisStateValue& value) { std::shared_lock lock(mtx); - value.ServoOn = m_ServoOn; - value.ServoHomeIndexOn = m_ServoHomeIndexOn; - value.ServoReset = m_ServoReset; - value.MoveP = m_MoveP; - value.MoveN = m_MoveN; - value.MovePContinue = m_MovePContinue; - value.MoveNContinue = m_MoveNContinue; - value.MoveAbsPos = m_MoveAbsPos; - value.MotionStop = m_MotionStop; - value.ServoRDY = m_ServoRDY; - value.ServoHomeDone = m_ServoHomeDone; - value.ResetDone = m_ResetDone; - value.ServoException = m_ServoException; - value.Runable = m_Runable; - value.ExceptionCode = m_ExceptionCode; - value.Pos = m_Pos; - value.Torque = m_Torque; - value.ShowPos = m_ShowPos; - value.RPos = m_RPos; - value.ServoBreakOn = m_ServoBreakOn; - value.BindSlaveOn = m_BindSlaveOn; - value.BindSlaveFinish = m_BindSlaveFinish; - value.ServoBusy = m_ServoBusy; + value.ServoOn = m_ServoOn->GetValue(); + value.ServoHomeIndexOn = m_ServoHomeIndexOn->GetValue(); + value.ServoReset = m_ServoReset->GetValue(); + value.MoveP = m_MoveP->GetValue(); + value.MoveN = m_MoveN->GetValue(); + value.MovePContinue = m_MovePContinue->GetValue(); + value.MoveNContinue = m_MoveNContinue->GetValue(); + value.MoveAbsPos = m_MoveAbsPos->GetValue(); + value.MotionStop = m_MotionStop->GetValue(); + value.ServoRDY = m_ServoRDY->GetValue(); + value.ServoHomeDone = m_ServoHomeDone->GetValue(); + value.ResetDone = m_ResetDone->GetValue(); + value.ServoException = m_ServoException->GetValue(); + value.Runable = m_Runable->GetValue(); + value.ExceptionCode = m_ExceptionCode->GetValue(); + value.Pos = m_Pos->GetValue(); + value.Torque = m_Torque->GetValue(); + value.ShowPos = m_ShowPos->GetValue(); + value.RPos = m_RPos->GetValue(); + value.ServoBreakOn = m_ServoBreakOn->GetValue(); + value.BindSlaveOn = m_BindSlaveOn->GetValue(); + value.BindSlaveFinish = m_BindSlaveFinish->GetValue(); + value.ServoBusy = m_ServoBusy->GetValue(); } void MainAxisState::Update(unsigned char* addr) { std::unique_lock lock(mtx); - m_ServoOn= ((addr[0] & 0x1)>0 ? true : false); - m_ServoHomeIndexOn= ((addr[0] & 0x2)>0 ? true : false); - m_ServoReset= ((addr[0] & 0x4)>0 ? true : false); - m_ServoBreakOn= ((addr[0] & 0x8)>0 ? true : false); - m_BindSlaveOn= ((addr[0] & 0x10)>0 ? true : false); - m_MoveP= ((addr[0] & 0x20)>0 ? true : false); - m_MoveN= ((addr[0] & 0x40)>0 ? true : false); - m_MovePContinue= ((addr[0] & 0x80)>0 ? true : false); - m_MoveNContinue= ((addr[1] & 0x1)>0 ? true : false); - m_MoveAbsPos= ((addr[1] & 0x2)>0 ? true : false); - m_MotionStop= ((addr[1] & 0x4)>0 ? true : false); - m_ServoRDY= ((addr[1] & 0x8)>0 ? true : false); - m_ServoHomeDone= ((addr[1] & 0x10)>0 ? true : false); - m_ResetDone= ((addr[1] & 0x20)>0 ? true : false); + m_ServoOn->SetValue((addr[0] & 0x1) > 0 ? true : false); + m_ServoHomeIndexOn->SetValue((addr[0] & 0x2) > 0 ? true : false); + m_ServoReset->SetValue((addr[0] & 0x4) > 0 ? true : false); + m_ServoBreakOn->SetValue((addr[0] & 0x8) > 0 ? true : false); + m_BindSlaveOn->SetValue((addr[0] & 0x10) > 0 ? true : false); + m_MoveP->SetValue((addr[0] & 0x20) > 0 ? true : false); + m_MoveN->SetValue((addr[0] & 0x40) > 0 ? true : false); + m_MovePContinue->SetValue((addr[0] & 0x80) > 0 ? true : false); + m_MoveNContinue->SetValue((addr[1] & 0x1) > 0 ? true : false); + m_MoveAbsPos->SetValue((addr[1] & 0x2) > 0 ? true : false); + m_MotionStop->SetValue((addr[1] & 0x4) > 0 ? true : false); + m_ServoRDY->SetValue((addr[1] & 0x8) > 0 ? true : false); + m_ServoHomeDone->SetValue((addr[1] & 0x10) > 0 ? true : false); + m_ResetDone->SetValue((addr[1] & 0x20) > 0 ? true : false); bool lastServoBusy = m_ServoBusy; - m_ServoBusy= ((addr[1] & 0x40)>0 ? true : false); + m_ServoBusy->SetValue((addr[1] & 0x40) > 0 ? true : false); // if (lastServoBusy && !m_ServoBusy) { // g_log->TraceInfo("轴忙转换为:%d",m_ServoBusy?1:0); // } - m_ServoException= ((addr[1] & 0x80)>0 ? true : false); - m_BindSlaveFinish= ((addr[2] & 0x1)>0 ? true : false); - m_Runable= ((addr[2] & 0x2)>0 ? true : false); - m_ExceptionCode = S7WORDDATA(addr[5], addr[4]).wValue; + m_ServoException->SetValue((addr[1] & 0x80) > 0 ? true : false); + m_BindSlaveFinish->SetValue((addr[2] & 0x1) > 0 ? true : false); + m_Runable->SetValue((addr[2] & 0x2) > 0 ? true : false); + m_ExceptionCode->SetValue(S7WORDDATA(addr[5], addr[4]).wValue); } void SlaveAxisState::GetValue(AxisStateValue& value) { std::shared_lock lock(mtx); - value.ServoOn = m_ServoOn; - value.ServoHomeIndexOn = m_ServoHomeIndexOn; - value.ServoReset = m_ServoReset; - value.MoveP = m_MoveP; - value.MoveN = m_MoveN; - value.MovePContinue = m_MovePContinue; - value.MoveNContinue = m_MoveNContinue; - value.MoveAbsPos = m_MoveAbsPos; - value.MotionStop = m_MotionStop; - value.ServoRDY = m_ServoRDY; - value.ServoHomeDone = m_ServoHomeDone; - value.ResetDone = m_ResetDone; - value.ServoException = m_ServoException; - value.Runable = m_Runable; - value.ExceptionCode = m_ExceptionCode; - value.Pos = m_Pos; - value.Torque = m_Torque; - value.ShowPos = m_ShowPos; - value.RPos = m_RPos; - value.SlaveServoBreakOn = m_ServoBreakOn; - value.SlaveUnbind = m_Unbind; - value.ServoBusy = m_ServoBusy; + value.ServoOn = m_ServoOn->GetValue(); + value.ServoHomeIndexOn = m_ServoHomeIndexOn->GetValue(); + value.ServoReset = m_ServoReset->GetValue(); + value.MoveP = m_MoveP->GetValue(); + value.MoveN = m_MoveN->GetValue(); + value.MovePContinue = m_MovePContinue->GetValue(); + value.MoveNContinue = m_MoveNContinue->GetValue(); + value.MoveAbsPos = m_MoveAbsPos->GetValue(); + value.MotionStop = m_MotionStop->GetValue(); + value.ServoRDY = m_ServoRDY->GetValue(); + value.ServoHomeDone = m_ServoHomeDone->GetValue(); + value.ResetDone = m_ResetDone->GetValue(); + value.ServoException = m_ServoException->GetValue(); + value.Runable = m_Runable->GetValue(); + value.ExceptionCode = m_ExceptionCode->GetValue(); + value.Pos = m_Pos->GetValue(); + value.Torque = m_Torque->GetValue(); + value.ShowPos = m_ShowPos->GetValue(); + value.RPos = m_RPos->GetValue(); + value.SlaveServoBreakOn = m_ServoBreakOn->GetValue(); + value.SlaveUnbind = m_Unbind->GetValue(); + value.ServoBusy = m_ServoBusy->GetValue(); } void SlaveAxisState::Update(unsigned char* addr) { std::unique_lock lock(mtx); - m_ServoOn= ((addr[0] & 0x1)>0 ? true : false); - m_ServoHomeIndexOn= ((addr[0] & 0x2)>0 ? true : false); - m_ServoReset= ((addr[0] & 0x4)>0 ? true : false); - m_ServoBreakOn= ((addr[0] & 0x8)>0 ? true : false); - m_Unbind= ((addr[0] & 0x10)>0 ? true : false); - m_MoveP= ((addr[0] & 0x20)>0 ? true : false); - m_MoveN= ((addr[0] & 0x40)>0 ? true : false); - m_MovePContinue= ((addr[0] & 0x80)>0 ? true : false); - m_MoveNContinue= ((addr[1] & 0x1)>0 ? true : false); - m_MoveAbsPos= ((addr[1] & 0x2)>0 ? true : false); - m_MotionStop= ((addr[1] & 0x4)>0 ? true : false); - m_ServoRDY= ((addr[1] & 0x8)>0 ? true : false); - m_ServoHomeDone= ((addr[1] & 0x10)>0 ? true : false); - m_ResetDone= ((addr[1] & 0x20)>0 ? true : false); - m_ServoBusy= ((addr[1] & 0x40)>0 ? true : false); - m_ServoException= ((addr[1] & 0x80)>0 ? true : false); - m_Runable= ((addr[2] & 0x1)>0 ? true : false); - m_ExceptionCode = S7WORDDATA(addr[5], addr[4]).wValue; + m_ServoOn->SetValue((addr[0] & 0x1) > 0 ? true : false); + m_ServoHomeIndexOn->SetValue((addr[0] & 0x2) > 0 ? true : false); + m_ServoReset->SetValue((addr[0] & 0x4) > 0 ? true : false); + m_ServoBreakOn->SetValue((addr[0] & 0x8) > 0 ? true : false); + m_Unbind->SetValue((addr[0] & 0x10) > 0 ? true : false); + m_MoveP->SetValue((addr[0] & 0x20) > 0 ? true : false); + m_MoveN->SetValue((addr[0] & 0x40) > 0 ? true : false); + m_MovePContinue->SetValue((addr[0] & 0x80) > 0 ? true : false); + m_MoveNContinue->SetValue((addr[1] & 0x1) > 0 ? true : false); + m_MoveAbsPos->SetValue((addr[1] & 0x2) > 0 ? true : false); + m_MotionStop->SetValue((addr[1] & 0x4) > 0 ? true : false); + m_ServoRDY->SetValue((addr[1] & 0x8) > 0 ? true : false); + m_ServoHomeDone->SetValue((addr[1] & 0x10) > 0 ? true : false); + m_ResetDone->SetValue((addr[1] & 0x20) > 0 ? true : false); + m_ServoBusy->SetValue((addr[1] & 0x40) > 0 ? true : false); + m_ServoException->SetValue((addr[1] & 0x80) > 0 ? true : false); + m_Runable->SetValue((addr[2] & 0x1) > 0 ? true : false); + m_ExceptionCode->SetValue(S7WORDDATA(addr[5], addr[4]).wValue); } diff --git a/PrintS/PLC/AxisState.h b/PrintS/PLC/AxisState.h index 3416f82..2be3ebe 100644 --- a/PrintS/PLC/AxisState.h +++ b/PrintS/PLC/AxisState.h @@ -1,31 +1,33 @@ -#pragma once +#pragma once #include #include "../config/bean/AxisCfg.h" -// ڶȡʱصĽṹ +#include "../Controller/Base.h" + +// 用于读取时返回的结构体 typedef struct { - bool ServoOn; //ŷON_RW - bool ServoHomeIndexOn; //ŷԭ_RW - bool ServoReset; //ŷλ_RW - bool MoveP; //˶_ֶ_RW - bool MoveN; //˶_ֶ_RW - bool MovePContinue; //JOG_ֶ_RW - bool MoveNContinue; //JOG_ֶ_RW - bool MoveAbsPos; //ֵ˶_ֶ_RW - bool MotionStop; //ἱͣ_RW - bool ServoRDY; //ŷRDY״̬_R - bool ServoHomeDone; //ָHOME_Done_R - bool ResetDone; //ָRESET_Done_R - bool ServoBusy; //ŷBUSY_R - bool ServoException; //ŷ쳣_R - bool Runable; //״̬_R - short ExceptionCode; //ŷ쳣_R + bool ServoOn; //轴伺服ON_RW + bool ServoHomeIndexOn; //轴伺服成立原点_RW + bool ServoReset; //轴伺服复位_RW + bool MoveP; //轴相对左运动_手动_RW + bool MoveN; //轴相对右运动_手动_RW + bool MovePContinue; //轴左JOG_手动_RW + bool MoveNContinue; //轴右JOG_手动_RW + bool MoveAbsPos; //轴绝对值运动_手动_RW + bool MotionStop; //轴急停_RW + bool ServoRDY; //轴伺服RDY状态_R + bool ServoHomeDone; //轴指令运行HOME_Done_R + bool ResetDone; //轴指令运行RESET_Done_R + bool ServoBusy; //轴伺服BUSY_R + bool ServoException; //轴伺服异常_R + bool Runable; //轴可运行状态_R + short ExceptionCode; //轴伺服异常字_R - bool ServoBreakOn; //ŷɲ_RW - bool BindSlaveOn; //ŷ󶨴_RW - bool BindSlaveFinish; //Ѿ_R + bool ServoBreakOn; //主轴伺服刹车_RW + bool BindSlaveOn; //主轴伺服绑定从轴_RW + bool BindSlaveFinish; //主从轴已经绑定_R - bool SlaveServoBreakOn; //ŷɲ_RW - bool SlaveUnbind; //ŷ_RW + bool SlaveServoBreakOn; //从轴伺服刹车_RW + bool SlaveUnbind; //从轴伺服解除绑定_RW float Pos; float Torque; @@ -34,7 +36,9 @@ typedef struct { float RPos; } AxisStateValue; -class AxisState + +#pragma pack(1) +class AxisState :public Base { public: AxisState(); @@ -46,54 +50,71 @@ public: virtual void SetZeroPos(); virtual float GetShowPos(); public: - bool m_ServoOn; //ŷON_RW - bool m_ServoHomeIndexOn; //ŷԭ_RW - bool m_ServoReset; //ŷλ_RW - bool m_MoveP; //˶_ֶ_RW - bool m_MoveN; //˶_ֶ_RW - bool m_MovePContinue; //JOG_ֶ_RW - bool m_MoveNContinue; //JOG_ֶ_RW - bool m_MoveAbsPos; //ֵ˶_ֶ_RW - bool m_MotionStop; //ἱͣ_RW - bool m_ServoRDY; //ŷRDY״̬_R - bool m_ServoHomeDone; //ָHOME_Done_R - bool m_ResetDone; //ָRESET_Done_R - bool m_ServoBusy; //ŷBUSY_R - bool m_ServoException; //ŷ쳣_R - bool m_Runable; //״̬_R - short m_ExceptionCode; //ŷ쳣_R - float m_Pos; //ǰλ - float m_Torque; //ǰŤ - float m_ShowPos; - float m_RPos; + char m_startFlag; //开始标志 + BoolData* m_ServoOn; //轴伺服ON_RW + BoolData* m_ServoHomeIndexOn; //轴伺服成立原点_RW + BoolData* m_ServoReset; //轴伺服复位_RW + BoolData* m_MoveP; //轴相对左运动_手动_RW + BoolData* m_MoveN; //轴相对右运动_手动_RW + BoolData* m_MovePContinue; //轴左JOG_手动_RW + BoolData* m_MoveNContinue; //轴右JOG_手动_RW + BoolData* m_MoveAbsPos; //轴绝对值运动_手动_RW + BoolData* m_MotionStop; //轴急停_RW + BoolData* m_ServoRDY; //轴伺服RDY状态_R + BoolData* m_ServoHomeDone; //轴指令运行HOME_Done_R + BoolData* m_ResetDone; //轴指令运行RESET_Done_R + BoolData* m_ServoBusy; //轴伺服BUSY_R + BoolData* m_ServoException; //轴伺服异常_R + BoolData* m_Runable; //轴可运行状态_R + ShortData* m_ExceptionCode; //轴伺服异常字_R + FloatData* m_Pos; //当前位置 + FloatData* m_Torque; //当前扭矩 + FloatData* m_ShowPos; + FloatData* m_RPos; + char m_endFlag; //结束标志 + std::shared_mutex mtx; AxisCfg* m_AxisCfg; }; +#pragma pack() + class MainAxisState : public AxisState { public: - MainAxisState(){} + MainAxisState() + : m_ServoBreakOn(new BoolData("ServoBreakOn", u8"主轴伺服刹车_RW")) + , m_BindSlaveOn(new BoolData("BindSlaveOn", u8"主轴伺服绑定从轴_RW")) + , m_BindSlaveFinish(new BoolData("BindSlaveFinish", u8"主从轴已经绑定_R")) { + InsertMp(&m_ServoBreakOn, 1); + InsertMp(&m_BindSlaveOn, 1); + InsertMp(&m_BindSlaveFinish, 1); + } ~MainAxisState(){} void GetValue(AxisStateValue& value); void Update(unsigned char* addr); public: - bool m_ServoBreakOn; //ŷɲ_RW - bool m_BindSlaveOn; //ŷ󶨴_RW - bool m_BindSlaveFinish; //Ѿ_R + BoolData* m_ServoBreakOn; //主轴伺服刹车_RW + BoolData* m_BindSlaveOn; //主轴伺服绑定从轴_RW + BoolData* m_BindSlaveFinish; //主从轴已经绑定_R }; class SlaveAxisState : public AxisState { public: - SlaveAxisState(){} + SlaveAxisState() + : m_ServoBreakOn(new BoolData("ServoBreakOn", u8"从轴伺服刹车_RW")) + , m_Unbind(new BoolData("Unbind", u8"从轴伺服解除绑定_RW")) { + InsertMp(&m_ServoBreakOn, 1); + InsertMp(&m_Unbind, 1); + } ~SlaveAxisState(){} void GetValue(AxisStateValue& value); void Update(unsigned char* addr); public: - bool m_ServoBreakOn; //ŷɲ_RW - bool m_Unbind; //ŷ_RW + BoolData* m_ServoBreakOn; //从轴伺服刹车_RW + BoolData* m_Unbind; //从轴伺服解除绑定_RW }; @@ -105,172 +126,172 @@ public: ~AxisState(); public: - bool m_MoldMainServoOn; //ӡŷON_RW - bool m_MoldMainServoHomeIndexOn; //ӡŷON_RW - bool m_MoldMainServoReset; //ӡŷλ_RW - bool m_MoldMainServoBreakOn; //ӡŷɲ_RW - bool m_MoldMainBindSlaveOn; //ӡŷ󶨴_RW - bool m_MoldMainMoveUp; //ӡ˶_ֶ_RW - bool m_MoldMainMoveDown; //ӡ˶_ֶ_RW - bool m_MoldMainMoveUpContinue; //ӡJOG_ֶ_RW - bool m_MoldMainMoveDownContinue; //ӡJOG_ֶ_RW - bool m_MoldMainMoveAbsPos; //ӡֵ˶_ֶ_RW - bool m_MoldMainMotionStop; //ӡἱͣ_RW - bool m_MoldMainServoRDY; //ӡŷRDY״̬_R - bool m_MoldMainServoHomeDone; //ӡָHOME_Done_R - bool m_MoldMainResetDone; //ӡָRESET_Done_R - bool m_MoldMainServoBusy; //ӡŷBUSY_R - bool m_MoldMainServoException; //ӡŷ쳣_R - bool m_MoldMainBindSlaveFinish; //ӡѾ_R - bool m_MoldMainRunable; //ӡ״̬_R - short m_MoldMainServoExceptionCode; //ӡŷ쳣_R - bool m_MoldSlaveServoOn; //ӡŷON_RW - bool m_MoldSlaveServoHomeIndexOn; //ӡŷԭ_RW - bool m_MoldSlaveServoReset; //ӡŷλ_RW - bool m_MoldSlaveServoBreakOn; //ӡŷɲ_RW - bool m_MoldSlaveUnbind; //ӡŷ_RW - bool m_MoldSlaveMoveUp; //ӡ˶_ֶ_RW - bool m_MoldSlaveMoveDown; //ӡ˶_ֶ_RW - bool m_MoldSlaveMoveUpContinue; //ӡJOG_ֶ_RW - bool m_MoldSlaveMoveDownContinue; //ӡJOG_ֶ_RW - bool m_MoldSlaveMoveAbsPos; //ӡֵ˶_ֶ_RW - bool m_MoldSlaveMotionStop; //ӡἱͣ_RW - bool m_MoldSlaveServoRDY; //ӡŷRDY״̬_R - bool m_MoldSlaveServoHomeDone; //ӡָHOME_Done_R - bool m_MoldSlaveResetDone; //ӡָRESET_Done_R - bool m_MoldSlaveServoBusy; //ӡŷBUSY_R - bool m_MoldSlaveServoException; //ӡŷ쳣_R - bool m_MoldSlaveRunable; //ӡ״̬_R - short m_MoldSlaveServoExceptionCode; //ӡŷ쳣_R - bool m_CleanMainServoOn; //ŷON_RW - bool m_CleanMainServoHomeIndexOn; //ŷԭ_RW - bool m_CleanMainServoReset; //ŷλ_RW - bool m_CleanMainServoBreakOn; //ŷɲ_RW - bool m_CleanMainBindSlaveOn; //ŷ󶨴_RW - bool m_CleanMainMoveUp; //˶_ֶ_RW - bool m_CleanMainMoveDown; //˶_ֶ_RW - bool m_CleanMainMoveUpContinue; //JOG_ֶ_RW - bool m_CleanMainMoveDownContinue; //JOG_ֶ_RW - bool m_CleanMainMoveAbsPos; //ֵ˶_ֶ_RW - bool m_CleanMainMotionStop; //ἱͣ_RW - bool m_CleanMainServoRDY; //ŷRDY״̬_R - bool m_CleanMainServoHomeDone; //ָHOME_Done_R - bool m_CleanMainResetDone; //ָRESET_Done_R - bool m_CleanMainServoBusy; //ŷBUSY_R - bool m_CleanMainServoException; //ŷ쳣_R - bool m_CleanMainBindSlaveFinish; //Ѿ_R - bool m_CleanMainRunable; //״̬_R - short m_CleanMainServoExceptionCode; //ŷ쳣_R - bool m_CleanSlaveServoOn; //۴ŷON_RW - bool m_CleanSlaveServoHomeIndexOn; //۴ŷԭ_RW - bool m_CleanSlaveServoReset; //۴ŷλ_RW - bool m_CleanSlaveServoBreakOn; //۴ŷɲ_RW - bool m_CleanSlaveUnbind; //۴ŷ_RW - bool m_CleanSlaveMoveUp; //۴˶_ֶ_RW - bool m_CleanSlaveMoveDown; //۴˶_ֶ_RW - bool m_CleanSlaveMoveUpContinue; //۴JOG_ֶ_RW - bool m_CleanSlaveMoveDownContinue; //۴JOG_ֶ_RW - bool m_CleanSlaveMoveAbsPos; //۴ֵ˶_ֶ_RW - bool m_CleanSlaveMotionStop; //۴ἱͣ_RW - bool m_CleanSlaveServoRDY; //۴ŷRDY״̬_R - bool m_CleanSlaveServoHomeDone; //۴ָHOME_Done_R - bool m_CleanSlaveResetDone; //۴ָRESET_Done_R - bool m_CleanSlaveServoBusy; //۴ŷBUSY_R - bool m_CleanSlaveServoException; //۴ŷ쳣_R - bool m_CleanSlaveRunable; //۴״̬_R - short m_CleanSlaveServoExceptionCode; //۴ŷ쳣_R - bool m_LoadAxisServoOn; //ŷON_RW - bool m_LoadAxisServoHomeIndexOn; //ŷԭ_RW - bool m_LoadAxisServoReset; //ŷλ_RW - bool m_LoadAxisMoveLeft; //˶_ֶ_RW - bool m_LoadAxisMoveRight; //˶_ֶ_RW - bool m_LoadAxisMoveLeftContinue; //JOG_ֶ_RW - bool m_LoadAxisMoveRightContinue; //JOG_ֶ_RW - bool m_LoadAxisMoveAbsPos; //ֵ˶_ֶ_RW - bool m_LoadAxisMotionStop; //ἱͣ_RW - bool m_LoadAxisServoRDY; //ŷRDY״̬_R - bool m_LoadAxisServoHomeDone; //ָHOME_Done_R - bool m_LoadAxisResetDone; //ָRESET_Done_R - bool m_LoadAxisServoBusy; //ŷBUSY_R - bool m_LoadAxisServoException; //ŷ쳣_R - bool m_LoadAxisRunable; //״̬_R - short m_LoadAxisServoExceptionCode; //ŷ쳣_R - bool m_ArmServoOn; //̷ŷON_RW - bool m_ArmServoHomeIndexOn; //̷ŷԭ_RW - bool m_ArmServoReset; //̷ŷλ_RW - bool m_ArmMoveFront; //̷ǰ˶_ֶ_RW - bool m_ArmMoveBack; //̷Ժ˶_ֶ_RW - bool m_ArmMoveFrontContinue; //̷ǰJOG_ֶ_RW - bool m_ArmMoveBackContinue; //̷JOG_ֶ_RW - bool m_ArmMoveAbsPos; //̷ֵ˶_ֶ_RW - bool m_ArmMotionStop; //̷ἱͣ_RW - bool m_ArmServoRDY; //̷ŷRDY״̬_R - bool m_ArmServoHomeDone; //̷ָHOME_Done_R - bool m_ArmResetDone; //̷ָRESET_Done_R - bool m_ArmServoBusy; //̷ŷBUSY_R - bool m_ArmServoException; //̷ŷ쳣_R - bool m_ArmRunable; //̷״̬_R - short m_ArmServoExceptionCode; //̷ŷ쳣_R - bool m_SupplyServoOn; //תŷON_RW - bool m_SupplyServoHomeIndexOn; //תŷԭ_RW - bool m_SupplyServoReset; //תŷλ_RW - bool m_SupplyMovePositive; //תת˶_ֶ_RW - bool m_SupplyMoveNegative; //תԷת˶_ֶ_RW - bool m_SupplyMovePositiveContinue; //תתJOG_ֶ_RW - bool m_SupplyMoveNegativeContinue; //תᷴתJOG_ֶ_RW - bool m_SupplyMoveAbsPos; //תֵ˶_ֶ_RW - bool m_SupplyMotionStop; //תἱͣ_RW - bool m_SupplyServoRDY; //תŷRDY״̬_R - bool m_SupplyServoHomeDone; //תָHOME_Done_R - bool m_SupplyResetDone; //תָRESET_Done_R - bool m_SupplyServoBusy; //תŷBUSY_R - bool m_SupplyServoException; //תŷ쳣_R - bool m_SupplyRunable; //ת״̬_R - short m_SupplyServoExceptionCode; //תŷ쳣_R + bool m_MoldMainServoOn; //打印主轴伺服ON_RW + bool m_MoldMainServoHomeIndexOn; //打印主轴伺服ON_RW + bool m_MoldMainServoReset; //打印主轴伺服复位_RW + bool m_MoldMainServoBreakOn; //打印主轴伺服刹车_RW + bool m_MoldMainBindSlaveOn; //打印主轴伺服绑定从轴_RW + bool m_MoldMainMoveUp; //打印主轴相对上运动_手动_RW + bool m_MoldMainMoveDown; //打印主轴相对下运动_手动_RW + bool m_MoldMainMoveUpContinue; //打印主轴上JOG_手动_RW + bool m_MoldMainMoveDownContinue; //打印主轴下JOG_手动_RW + bool m_MoldMainMoveAbsPos; //打印主轴绝对值运动_手动_RW + bool m_MoldMainMotionStop; //打印主轴急停_RW + bool m_MoldMainServoRDY; //打印主轴伺服RDY状态_R + bool m_MoldMainServoHomeDone; //打印主轴指令运行HOME_Done_R + bool m_MoldMainResetDone; //打印主轴指令运行RESET_Done_R + bool m_MoldMainServoBusy; //打印主轴伺服BUSY_R + bool m_MoldMainServoException; //打印主轴伺服异常_R + bool m_MoldMainBindSlaveFinish; //打印主从轴已经绑定_R + bool m_MoldMainRunable; //打印主轴可运行状态_R + short m_MoldMainServoExceptionCode; //打印主轴伺服异常字_R + bool m_MoldSlaveServoOn; //打印从轴伺服ON_RW + bool m_MoldSlaveServoHomeIndexOn; //打印从轴伺服成立原点_RW + bool m_MoldSlaveServoReset; //打印从轴伺服复位_RW + bool m_MoldSlaveServoBreakOn; //打印从轴伺服刹车_RW + bool m_MoldSlaveUnbind; //打印从轴伺服解除绑定_RW + bool m_MoldSlaveMoveUp; //打印从轴相对上运动_手动_RW + bool m_MoldSlaveMoveDown; //打印从轴相对下运动_手动_RW + bool m_MoldSlaveMoveUpContinue; //打印从轴上JOG_手动_RW + bool m_MoldSlaveMoveDownContinue; //打印从轴下JOG_手动_RW + bool m_MoldSlaveMoveAbsPos; //打印从轴绝对值运动_手动_RW + bool m_MoldSlaveMotionStop; //打印从轴急停_RW + bool m_MoldSlaveServoRDY; //打印从轴伺服RDY状态_R + bool m_MoldSlaveServoHomeDone; //打印从轴指令运行HOME_Done_R + bool m_MoldSlaveResetDone; //打印从轴指令运行RESET_Done_R + bool m_MoldSlaveServoBusy; //打印从轴伺服BUSY_R + bool m_MoldSlaveServoException; //打印从轴伺服异常_R + bool m_MoldSlaveRunable; //打印从轴可运行状态_R + short m_MoldSlaveServoExceptionCode; //打印从轴伺服异常字_R + bool m_CleanMainServoOn; //清粉主轴伺服ON_RW + bool m_CleanMainServoHomeIndexOn; //清粉主轴伺服成立原点_RW + bool m_CleanMainServoReset; //清粉主轴伺服复位_RW + bool m_CleanMainServoBreakOn; //清粉主轴伺服刹车_RW + bool m_CleanMainBindSlaveOn; //清粉主轴伺服绑定从轴_RW + bool m_CleanMainMoveUp; //清粉主轴相对上运动_手动_RW + bool m_CleanMainMoveDown; //清粉主轴相对下运动_手动_RW + bool m_CleanMainMoveUpContinue; //清粉主轴上JOG_手动_RW + bool m_CleanMainMoveDownContinue; //清粉主轴下JOG_手动_RW + bool m_CleanMainMoveAbsPos; //清粉主轴绝对值运动_手动_RW + bool m_CleanMainMotionStop; //清粉主轴急停_RW + bool m_CleanMainServoRDY; //清粉主轴伺服RDY状态_R + bool m_CleanMainServoHomeDone; //清粉主轴指令运行HOME_Done_R + bool m_CleanMainResetDone; //清粉主轴指令运行RESET_Done_R + bool m_CleanMainServoBusy; //清粉主轴伺服BUSY_R + bool m_CleanMainServoException; //清粉主轴伺服异常_R + bool m_CleanMainBindSlaveFinish; //清粉主从轴已经绑定_R + bool m_CleanMainRunable; //清粉主轴可运行状态_R + short m_CleanMainServoExceptionCode; //清粉主轴伺服异常字_R + bool m_CleanSlaveServoOn; //清粉从轴伺服ON_RW + bool m_CleanSlaveServoHomeIndexOn; //清粉从轴伺服成立原点_RW + bool m_CleanSlaveServoReset; //清粉从轴伺服复位_RW + bool m_CleanSlaveServoBreakOn; //清粉从轴伺服刹车_RW + bool m_CleanSlaveUnbind; //清粉从轴伺服解除绑定_RW + bool m_CleanSlaveMoveUp; //清粉从轴相对上运动_手动_RW + bool m_CleanSlaveMoveDown; //清粉从轴相对下运动_手动_RW + bool m_CleanSlaveMoveUpContinue; //清粉从轴上JOG_手动_RW + bool m_CleanSlaveMoveDownContinue; //清粉从轴下JOG_手动_RW + bool m_CleanSlaveMoveAbsPos; //清粉从轴绝对值运动_手动_RW + bool m_CleanSlaveMotionStop; //清粉从轴急停_RW + bool m_CleanSlaveServoRDY; //清粉从轴伺服RDY状态_R + bool m_CleanSlaveServoHomeDone; //清粉从轴指令运行HOME_Done_R + bool m_CleanSlaveResetDone; //清粉从轴指令运行RESET_Done_R + bool m_CleanSlaveServoBusy; //清粉从轴伺服BUSY_R + bool m_CleanSlaveServoException; //清粉从轴伺服异常_R + bool m_CleanSlaveRunable; //清粉从轴可运行状态_R + short m_CleanSlaveServoExceptionCode; //清粉从轴伺服异常字_R + bool m_LoadAxisServoOn; //移载轴伺服ON_RW + bool m_LoadAxisServoHomeIndexOn; //移载轴伺服成立原点_RW + bool m_LoadAxisServoReset; //移载轴伺服复位_RW + bool m_LoadAxisMoveLeft; //移载轴相对左运动_手动_RW + bool m_LoadAxisMoveRight; //移载轴相对右运动_手动_RW + bool m_LoadAxisMoveLeftContinue; //移载轴左JOG_手动_RW + bool m_LoadAxisMoveRightContinue; //移载轴右JOG_手动_RW + bool m_LoadAxisMoveAbsPos; //移载轴绝对值运动_手动_RW + bool m_LoadAxisMotionStop; //移载轴急停_RW + bool m_LoadAxisServoRDY; //移载轴伺服RDY状态_R + bool m_LoadAxisServoHomeDone; //移载轴指令运行HOME_Done_R + bool m_LoadAxisResetDone; //移载轴指令运行RESET_Done_R + bool m_LoadAxisServoBusy; //移载轴伺服BUSY_R + bool m_LoadAxisServoException; //移载轴伺服异常_R + bool m_LoadAxisRunable; //移载轴可运行状态_R + short m_LoadAxisServoExceptionCode; //移载轴伺服异常字_R + bool m_ArmServoOn; //铺粉轴伺服ON_RW + bool m_ArmServoHomeIndexOn; //铺粉轴伺服成立原点_RW + bool m_ArmServoReset; //铺粉轴伺服复位_RW + bool m_ArmMoveFront; //铺粉轴相对前运动_手动_RW + bool m_ArmMoveBack; //铺粉轴相对后运动_手动_RW + bool m_ArmMoveFrontContinue; //铺粉轴前JOG_手动_RW + bool m_ArmMoveBackContinue; //铺粉轴后JOG_手动_RW + bool m_ArmMoveAbsPos; //铺粉轴绝对值运动_手动_RW + bool m_ArmMotionStop; //铺粉轴急停_RW + bool m_ArmServoRDY; //铺粉轴伺服RDY状态_R + bool m_ArmServoHomeDone; //铺粉轴指令运行HOME_Done_R + bool m_ArmResetDone; //铺粉轴指令运行RESET_Done_R + bool m_ArmServoBusy; //铺粉轴伺服BUSY_R + bool m_ArmServoException; //铺粉轴伺服异常_R + bool m_ArmRunable; //铺粉轴可运行状态_R + short m_ArmServoExceptionCode; //铺粉轴伺服异常字_R + bool m_SupplyServoOn; //供粉转轴伺服ON_RW + bool m_SupplyServoHomeIndexOn; //供粉转轴伺服成立原点_RW + bool m_SupplyServoReset; //供粉转轴伺服复位_RW + bool m_SupplyMovePositive; //供粉转轴相对正转运动_手动_RW + bool m_SupplyMoveNegative; //供粉转轴相对反转运动_手动_RW + bool m_SupplyMovePositiveContinue; //供粉转轴正转JOG_手动_RW + bool m_SupplyMoveNegativeContinue; //供粉转轴反转JOG_手动_RW + bool m_SupplyMoveAbsPos; //供粉转轴绝对值运动_手动_RW + bool m_SupplyMotionStop; //供粉转轴急停_RW + bool m_SupplyServoRDY; //供粉转轴伺服RDY状态_R + bool m_SupplyServoHomeDone; //供粉转轴指令运行HOME_Done_R + bool m_SupplyResetDone; //供粉转轴指令运行RESET_Done_R + bool m_SupplyServoBusy; //供粉转轴伺服BUSY_R + bool m_SupplyServoException; //供粉转轴伺服异常_R + bool m_SupplyRunable; //供粉转轴可运行状态_R + short m_SupplyServoExceptionCode; //供粉转轴伺服异常字_R - bool m_MoldCylinderSeparatePosRecord; //ӡλ¼_RW - bool m_Print3RSeparateRecord; //ӡ3Rλ¼__RW - bool m_Print3RSeparateCheckDistanceRecord; //ӡ3R¼__RW - bool m_PrintJackupDeoxygenMinPosRecord; //ӡѹ͵¼__RW - bool m_PrintJackupPlatformBottomPosRecord; //ӡƽλü¼__RW - bool m_PrintJackupPlatformPlanePosRecord; //ӡƽλü¼_RW - bool m_PrintPlatformHightRecord; //ӡȼ__RW - bool m_MoldUpLimitPosRecord; //ӡλ¼_RW - bool m_MoldDownLimitPosRecord; //ӡλ¼_RW - bool m_CleanTrackConnectPosRecord; //Խλ¼_RW - bool m_CleanBoxCylinderConnectPosRecord; //Խλ¼_RW - bool m_Clean3RSeparatePosRecord; //3RԽӷλ¼_RW - bool m_Clean3RSeparateCheckDistanceRecord; //3R¼_RW - bool m_CleanLowestPosRecord; //͵¼_RW - bool m_CleanUpLimitRecord; //λ¼_RW - bool m_CleanDownLimitRecord; //λ¼_RW - bool m_LoadAxisTrackPrintPosRecord; //ӡλ¼_RW - bool m_LoadAxisTrackCleanPosRecord; //λ¼_RW - bool m_LoadAxisTrackWaitPosRecord; //ȴλ¼_RW - bool m_LoadAxisLeftLimitRecord; //λ¼_RW - bool m_LoadAxisRightLimitRecord; //λ¼_RW - bool m_ArmPowderAcceptPosRecord; //̷ӷλ¼_RW - bool m_ArmPowderDropFrontPosRecord; //̷ǰ·λ¼_RW - bool m_ArmPrintFrontLimitRecord; //̷ӡǰλ¼_RW - bool m_ArmPrintBackLimitRecord; //̷ӡλ¼_RW - bool m_ArmFrontLimitRecord; //̷ǰλ¼_RW - bool m_ArmBackLimitRecord; //̷λ¼_RW - bool m_BlockMoldSoftPosLimit; //δӡλ_RW - bool m_BlockCleanSoftPosLimit; //λ_RW - bool m_BlockLoadAxisSoftPosLimit; //λ_RW - bool m_BlockArmSoftPosLimit; //̷λ_RW - bool m_SupplySoftPosLimit; //ιתλ_RW - bool m_MoldMainHomeIndexRecord; //ӡԭλ¼_RW - bool m_MoldMainAlignRecord; //ӡλ¼_RW - bool m_MoldMainAlignHomeIndexRelRecord; //ӡλԭֵ¼_RW - bool m_MoldSlaveHomeIndexRecord; //ӡԭλ¼_RW - bool m_MoldSlaveAlignRecord; //ӡλ¼_RW - bool m_MoldSlaveAlignHomeIndexRelRecord; //ӡλԭֵ¼_RW - bool m_CleanMainHomeIndexRecord; //ԭλ¼_RW - bool m_CleanMainAlignRecord; //λ¼_RW - bool m_CleanMainAlignHomeIndexRelRecord; //λԭֵ¼_RW - bool m_CleanSlaveHomeIndexRecord; //۴ԭλ¼_RW - bool m_CleanSlaveAlignRecord; //۴λ¼_RW - bool m_CleanSlaveAlignHomeIndexRelRecord; //۴λԭֵ¼_RW + bool m_MoldCylinderSeparatePosRecord; //打印升降与缸体分离位记录_RW + bool m_Print3RSeparateRecord; //打印3R脱离位记录__RW + bool m_Print3RSeparateCheckDistanceRecord; //打印3R脱离检测距离记录__RW + bool m_PrintJackupDeoxygenMinPosRecord; //打印顶升轴除氧压缩最低点记录__RW + bool m_PrintJackupPlatformBottomPosRecord; //打印顶升轴基板底座缸平面位置记录__RW + bool m_PrintJackupPlatformPlanePosRecord; //打印顶升轴基板缸平面位置记录_RW + bool m_PrintPlatformHightRecord; //打印基板厚度计算__RW + bool m_MoldUpLimitPosRecord; //打印轴上软限位记录_RW + bool m_MoldDownLimitPosRecord; //打印升降轴下软限位记录_RW + bool m_CleanTrackConnectPosRecord; //清粉升降轨道对接位记录_RW + bool m_CleanBoxCylinderConnectPosRecord; //清粉箱与缸体对接位记录_RW + bool m_Clean3RSeparatePosRecord; //清粉升降3R对接分离位记录_RW + bool m_Clean3RSeparateCheckDistanceRecord; //清粉升降3R分离检测距离记录_RW + bool m_CleanLowestPosRecord; //清粉升降最低点记录_RW + bool m_CleanUpLimitRecord; //清粉升降上软限位记录_RW + bool m_CleanDownLimitRecord; //清粉升降下软限位记录_RW + bool m_LoadAxisTrackPrintPosRecord; //移载轴轨道打印位记录_RW + bool m_LoadAxisTrackCleanPosRecord; //移载轴轨道清粉位记录_RW + bool m_LoadAxisTrackWaitPosRecord; //移载轴轨道等待位记录_RW + bool m_LoadAxisLeftLimitRecord; //移载轴轨道左软限位记录_RW + bool m_LoadAxisRightLimitRecord; //移载轴轨道右软限位记录_RW + bool m_ArmPowderAcceptPosRecord; //铺粉轴接粉位记录_RW + bool m_ArmPowderDropFrontPosRecord; //铺粉轴前下粉位记录_RW + bool m_ArmPrintFrontLimitRecord; //铺粉轴打印面前限位记录_RW + bool m_ArmPrintBackLimitRecord; //铺粉轴打印面后限位记录_RW + bool m_ArmFrontLimitRecord; //铺粉轴前软限位记录_RW + bool m_ArmBackLimitRecord; //铺粉轴后软限位记录_RW + bool m_BlockMoldSoftPosLimit; //屏蔽打印轴软件位置限制_RW + bool m_BlockCleanSoftPosLimit; //屏蔽清粉轴软件位置限制_RW + bool m_BlockLoadAxisSoftPosLimit; //屏蔽移载轴软件位置限制_RW + bool m_BlockArmSoftPosLimit; //屏蔽铺粉轴软件位置限制_RW + bool m_SupplySoftPosLimit; //屏蔽供粉转轴软件位置限制_RW + bool m_MoldMainHomeIndexRecord; //打印主轴原点位记录_RW + bool m_MoldMainAlignRecord; //打印主轴对齐位记录_RW + bool m_MoldMainAlignHomeIndexRelRecord; //打印主轴对齐位与原点相对值记录_RW + bool m_MoldSlaveHomeIndexRecord; //打印从轴原点位记录_RW + bool m_MoldSlaveAlignRecord; //打印从轴对齐位记录_RW + bool m_MoldSlaveAlignHomeIndexRelRecord; //打印从轴对齐位与原点相对值记录_RW + bool m_CleanMainHomeIndexRecord; //清粉主轴原点位记录_RW + bool m_CleanMainAlignRecord; //清粉主轴对齐位记录_RW + bool m_CleanMainAlignHomeIndexRelRecord; //清粉主轴对齐位与原点相对值记录_RW + bool m_CleanSlaveHomeIndexRecord; //清粉从轴原点位记录_RW + bool m_CleanSlaveAlignRecord; //清粉从轴对齐位记录_RW + bool m_CleanSlaveAlignHomeIndexRelRecord; //清粉从轴对齐位与原点相对值记录_RW }; #endif diff --git a/PrintS/ScannerCtrl/IntelliScanState.h b/PrintS/ScannerCtrl/IntelliScanState.h index 9258e7d..132d6c2 100644 --- a/PrintS/ScannerCtrl/IntelliScanState.h +++ b/PrintS/ScannerCtrl/IntelliScanState.h @@ -1,20 +1,126 @@ #pragma once #include "../LanguageManager.h" +#include "../Controller/Base.h" -class IntelliScanState { +struct IntelliScanStateSCT { + bool m_GalvanometerScannerTempOK; //振镜预热完成 + float m_ActualPosition; //真实位置 + float m_SetPosition; //设值位置 + float m_PositionError; //位置误差 + float m_GalvanometerScannerTemp; //振镜温度 + float m_ServoBoardTemp; //伺服板卡温度 + float m_PDSupplyVoltage; //PD供电电压 + float m_DSPCoreSupplyVoltage; //DSP核心供电电压 + float m_DSPIOVoltage; //DSP输入输出电压 + float m_AnalogSectionVoltage; //模拟区电压 + float m_ADConverterSupplyVoltage; //AD转换供电电压 + float m_PDSupplyCurrent; //PD供电电流 + bool m_IsGalvanometerScannerOutputStageOn; //振镜输出级生效 + bool m_IsGalvanometerScannerHeaterOutputStageOn; //振镜加热器输出级生效 + bool m_IsInternalVoltagesNormal; //内部电压正常 + bool m_IsPositionErrorNormalRange; //位置误差正常 + bool m_IsScannerAndServoBoradTempNormal; //振镜和伺服温度正常 + bool m_IsBootingProcessCompleted; //启动处理完成 + bool m_IsCriticalError; //发生严重错误 + bool m_IsExternalPowderLow; //外部电压欠压 + bool m_IsScanSystemTempOverLimit; //扫描系统超温 + bool m_IsADConverterSuccessfullyInit; //AD转换初始化成功 + bool m_IsScannerReachedCriticalEdgePos; //振镜到达临界边缘位置 + bool m_IsAllControlParametersValid; //允许控制参数 + bool m_IsADConverterVoltageOK; //AD转换供电正常 + bool m_IsAnalogSetionVoltageOK; //模拟区电压正常 + bool m_IsDSPIOVoltageOK; //DSP 输入输出电压正常 + bool m_IsDSPCoreVoltageOK; //DSP核心供电正常 + bool m_IsAGCVoltageOK; //AGC电压正常 + bool m_IsServoBoradOperationTempNormal; //伺服板卡操作温度正常 + bool m_IsGalvanometerScannerOperationTempNormal; //振镜操作温度正常 + int m_LowState; + int m_HighState; + int m_StopEven; + +}; + +#pragma pack(1) +class IntelliScanState{ public: - IntelliScanState() { - m_GalvanometerScannerTemp = 0.0f; - m_ServoBoardTemp = 0.0f; - m_PDSupplyVoltage = 0.0f; - m_DSPCoreSupplyVoltage = 0.0f; - m_DSPIOVoltage = 0.0f; - m_AnalogSectionVoltage = 0.0f; - m_ADConverterSupplyVoltage = 0.0f; - m_PDSupplyCurrent = 0.0f; + IntelliScanState() + : m_GalvanometerScannerTempOK(new BoolData("GalvanometerScannerTempOK", u8"振镜预热完成")) + , m_ActualPosition(new FloatData("m_ActualPosition", u8"真实位置")) + , m_SetPosition(new FloatData("SetPosition", u8"设值位置")) + , m_PositionError(new FloatData("PositionError", u8"位置误差")) + , m_GalvanometerScannerTemp(new FloatData("GalvanometerScannerTemp", u8"振镜温度")) + , m_ServoBoardTemp(new FloatData("ServoBoardTemp", u8"伺服板卡温度")) + , m_PDSupplyVoltage(new FloatData("PDSupplyVoltage", u8"PD供电电压")) + , m_DSPCoreSupplyVoltage(new FloatData("DSPCoreSupplyVoltage", u8"DSP核心供电电压")) + , m_DSPIOVoltage(new FloatData("DSPIOVoltage", u8"DSP输入输出电压")) + , m_AnalogSectionVoltage(new FloatData("AnalogSectionVoltage", u8"模拟区电压")) + , m_ADConverterSupplyVoltage(new FloatData("ADConverterSupplyVoltage", u8"AD转换供电电压")) + , m_PDSupplyCurrent(new FloatData("PDSupplyCurrent", u8"PD供电电流")) + , m_IsGalvanometerScannerOutputStageOn(new BoolData("IsGalvanometerScannerOutputStageOn", u8"振镜输出级生效")) + , m_IsGalvanometerScannerHeaterOutputStageOn(new BoolData("IsGalvanometerScannerHeaterOutputStageOn", u8"振镜加热器输出级生效")) + , m_IsInternalVoltagesNormal(new BoolData("IsInternalVoltagesNormal", u8"内部电压正常")) + , m_IsPositionErrorNormalRange(new BoolData("IsPositionErrorNormalRange", u8"位置误差正常")) + , m_IsScannerAndServoBoradTempNormal(new BoolData("IsScannerAndServoBoradTempNormal", u8"振镜和伺服温度正常")) + , m_IsBootingProcessCompleted(new BoolData("IsBootingProcessCompleted", u8"启动处理完成")) + , m_IsCriticalError(new BoolData("IsCriticalError", u8"发生严重错误")) + , m_IsExternalPowderLow(new BoolData("IsExternalPowderLow", u8"外部电压欠压")) + , m_IsScanSystemTempOverLimit(new BoolData("IsScanSystemTempOverLimit", u8"扫描系统超温")) + , m_IsADConverterSuccessfullyInit(new BoolData("IsADConverterSuccessfullyInit", u8"AD转换初始化成功")) + , m_IsScannerReachedCriticalEdgePos(new BoolData("IsScannerReachedCriticalEdgePos", u8"振镜到达临界边缘位置")) + , m_IsAllControlParametersValid(new BoolData("IsAllControlParametersValid", u8"允许控制参数")) + , m_IsADConverterVoltageOK(new BoolData("IsADConverterVoltageOK", u8"AD转换供电正常")) + , m_IsAnalogSetionVoltageOK(new BoolData("IsAnalogSetionVoltageOK", u8"模拟区电压正常")) + , m_IsDSPIOVoltageOK(new BoolData("IsDSPIOVoltageOK", u8"DSP 输入输出电压正常")) + , m_IsDSPCoreVoltageOK(new BoolData("IsDSPCoreVoltageOK", u8"DSP核心供电正常")) + , m_IsAGCVoltageOK(new BoolData("IsAGCVoltageOK", u8"AGC电压正常")) + , m_IsServoBoradOperationTempNormal(new BoolData("IsServoBoradOperationTempNormal", u8"伺服板卡操作温度正常")) + , m_IsGalvanometerScannerOperationTempNormal(new BoolData("IsGalvanometerScannerOperationTempNormal", u8"振镜操作温度正常")) + , m_LowState(new IntData("LowState")) + , m_HighState(new IntData("HighState")) + , m_StopEven(new IntData("StopEven")){ + } + ~IntelliScanState() {} + + void GetState(IntelliScanStateSCT& intelS) { + intelS.m_GalvanometerScannerTempOK = m_GalvanometerScannerTempOK->GetValue(); + intelS.m_ActualPosition = m_ActualPosition->GetValue(); + intelS.m_SetPosition = m_SetPosition->GetValue(); + intelS.m_PositionError = m_PositionError->GetValue(); + intelS.m_GalvanometerScannerTemp = m_GalvanometerScannerTemp->GetValue(); + intelS.m_ServoBoardTemp = m_ServoBoardTemp->GetValue(); + intelS.m_PDSupplyVoltage = m_PDSupplyVoltage->GetValue(); + intelS.m_DSPCoreSupplyVoltage = m_DSPCoreSupplyVoltage->GetValue(); + intelS.m_DSPIOVoltage = m_DSPIOVoltage->GetValue(); + intelS.m_AnalogSectionVoltage = m_AnalogSectionVoltage->GetValue(); + intelS.m_ADConverterSupplyVoltage = m_ADConverterSupplyVoltage->GetValue(); + intelS.m_PDSupplyCurrent = m_PDSupplyCurrent->GetValue(); + intelS.m_IsGalvanometerScannerOutputStageOn = m_IsGalvanometerScannerOutputStageOn->GetValue(); + intelS.m_IsGalvanometerScannerHeaterOutputStageOn = m_IsGalvanometerScannerHeaterOutputStageOn->GetValue(); + intelS.m_IsInternalVoltagesNormal = m_IsInternalVoltagesNormal->GetValue(); + intelS.m_IsPositionErrorNormalRange = m_IsPositionErrorNormalRange->GetValue(); + intelS.m_IsScannerAndServoBoradTempNormal = m_IsScannerAndServoBoradTempNormal->GetValue(); + intelS.m_IsBootingProcessCompleted = m_IsBootingProcessCompleted->GetValue(); + intelS.m_IsCriticalError = m_IsCriticalError->GetValue(); + intelS.m_IsExternalPowderLow = m_IsExternalPowderLow->GetValue(); + intelS.m_IsScanSystemTempOverLimit = m_IsScanSystemTempOverLimit->GetValue(); + intelS.m_IsADConverterSuccessfullyInit = m_IsADConverterSuccessfullyInit->GetValue(); + intelS.m_IsScannerReachedCriticalEdgePos = m_IsScannerReachedCriticalEdgePos->GetValue(); + intelS.m_IsAllControlParametersValid = m_IsAllControlParametersValid->GetValue(); + intelS.m_IsADConverterVoltageOK = m_IsADConverterVoltageOK->GetValue(); + intelS.m_IsAnalogSetionVoltageOK = m_IsAnalogSetionVoltageOK->GetValue(); + intelS.m_IsDSPIOVoltageOK = m_IsDSPIOVoltageOK->GetValue(); + intelS.m_IsDSPCoreVoltageOK = m_IsDSPCoreVoltageOK->GetValue(); + intelS.m_IsAGCVoltageOK = m_IsAGCVoltageOK->GetValue(); + intelS.m_IsServoBoradOperationTempNormal = m_IsServoBoradOperationTempNormal->GetValue(); + intelS.m_IsGalvanometerScannerOperationTempNormal = m_IsGalvanometerScannerOperationTempNormal->GetValue(); + intelS.m_LowState = m_LowState->GetValue(); + intelS.m_HighState = m_HighState->GetValue(); + intelS.m_StopEven = m_StopEven->GetValue(); + } + static string GetStopEventInfo(int ivalue, bool& bvalue) { string info = _(u8"没有").c_str(); @@ -52,53 +158,87 @@ public: return info; } public: - //bool m_IsInternalVoltagesNormal; //内部电压正常 - bool m_GalvanometerScannerTempOK; //振镜预热完成 - float m_ActualPosition; //真实位置 - float m_SetPosition; //设值位置 - float m_PositionError; //位置误差 - //float m_ActualCurrent; //真实电流 - //float m_ActualVelocity; //真实速度 - float m_GalvanometerScannerTemp; //振镜温度 - float m_ServoBoardTemp; //伺服板卡温度 - float m_PDSupplyVoltage; //PD供电电压 - float m_DSPCoreSupplyVoltage; //DSP核心供电电压 - float m_DSPIOVoltage; //DSP输入输出电压 - float m_AnalogSectionVoltage; //模拟区电压 - float m_ADConverterSupplyVoltage; //AD转换供电电压 - float m_PDSupplyCurrent; //PD供电电流 - bool m_IsGalvanometerScannerOutputStageOn; //振镜输出级生效 - bool m_IsGalvanometerScannerHeaterOutputStageOn; //振镜加热器输出级生效 - bool m_IsInternalVoltagesNormal; //内部电压正常 - bool m_IsPositionErrorNormalRange; //位置误差正常 - bool m_IsScannerAndServoBoradTempNormal; //振镜和伺服温度正常 - bool m_IsBootingProcessCompleted; //启动处理完成 - bool m_IsCriticalError; //发生严重错误 - bool m_IsExternalPowderLow; //外部电压欠压 - bool m_IsScanSystemTempOverLimit; //扫描系统超温 - bool m_IsADConverterSuccessfullyInit; //AD转换初始化成功 - bool m_IsScannerReachedCriticalEdgePos; //振镜到达临界边缘位置 - bool m_IsAllControlParametersValid; //允许控制参数 - bool m_IsADConverterVoltageOK; //AD转换供电正常 - bool m_IsAnalogSetionVoltageOK; //模拟区电压正常 - bool m_IsDSPIOVoltageOK; //DSP 输入输出电压正常 - bool m_IsDSPCoreVoltageOK; //DSP核心供电正常 - bool m_IsAGCVoltageOK; //AGC电压正常 - bool m_IsServoBoradOperationTempNormal; //伺服板卡操作温度正常 - bool m_IsGalvanometerScannerOperationTempNormal; //振镜操作温度正常 - int m_LowState; - int m_HighState; - int m_StopEven; -}; + char m_startFlag; //开始标记 -class ScanStateXY { + //bool m_IsInternalVoltagesNormal; //内部电压正常 + BoolData* m_GalvanometerScannerTempOK; //振镜预热完成 + FloatData* m_ActualPosition; //真实位置 + FloatData* m_SetPosition; //设值位置 + FloatData* m_PositionError; //位置误差 + //FloatData* m_ActualCurrent; //真实电流 + //FloatData* m_ActualVelocity; //真实速度 + FloatData* m_GalvanometerScannerTemp; //振镜温度 + FloatData* m_ServoBoardTemp; //伺服板卡温度 + FloatData* m_PDSupplyVoltage; //PD供电电压 + FloatData* m_DSPCoreSupplyVoltage; //DSP核心供电电压 + FloatData* m_DSPIOVoltage; //DSP输入输出电压 + FloatData* m_AnalogSectionVoltage; //模拟区电压 + FloatData* m_ADConverterSupplyVoltage; //AD转换供电电压 + FloatData* m_PDSupplyCurrent; //PD供电电流 + BoolData* m_IsGalvanometerScannerOutputStageOn; //振镜输出级生效 + BoolData* m_IsGalvanometerScannerHeaterOutputStageOn; //振镜加热器输出级生效 + BoolData* m_IsInternalVoltagesNormal; //内部电压正常 + BoolData* m_IsPositionErrorNormalRange; //位置误差正常 + BoolData* m_IsScannerAndServoBoradTempNormal; //振镜和伺服温度正常 + BoolData* m_IsBootingProcessCompleted; //启动处理完成 + BoolData* m_IsCriticalError; //发生严重错误 + BoolData* m_IsExternalPowderLow; //外部电压欠压 + BoolData* m_IsScanSystemTempOverLimit; //扫描系统超温 + BoolData* m_IsADConverterSuccessfullyInit; //AD转换初始化成功 + BoolData* m_IsScannerReachedCriticalEdgePos; //振镜到达临界边缘位置 + BoolData* m_IsAllControlParametersValid; //允许控制参数 + BoolData* m_IsADConverterVoltageOK; //AD转换供电正常 + BoolData* m_IsAnalogSetionVoltageOK; //模拟区电压正常 + BoolData* m_IsDSPIOVoltageOK; //DSP 输入输出电压正常 + BoolData* m_IsDSPCoreVoltageOK; //DSP核心供电正常 + BoolData* m_IsAGCVoltageOK; //AGC电压正常 + BoolData* m_IsServoBoradOperationTempNormal; //伺服板卡操作温度正常 + BoolData* m_IsGalvanometerScannerOperationTempNormal; //振镜操作温度正常 + IntData* m_LowState; + IntData* m_HighState; + IntData* m_StopEven; + + char m_endFlag; //开始标记 +}; +#pragma pack() + + +class ScanStateXY :public Base { public: - ScanStateXY() {} + ScanStateXY() :m_IsConnected(false), m_LastError(0) + , m_ScanStateUpdateTime(new StrData("ScanStateUpdateTime","更新时间")) { + size_t ptrSize = sizeof(nullptr); //指针大小 + void* startPtr = &m_X.m_startFlag + 1; + size_t count = ((size_t)&m_X.m_endFlag - (size_t)startPtr) / ptrSize; + InsertMp(startPtr, count, "_X"); + + startPtr = &m_Y.m_startFlag + 1; + count = ((size_t)&m_Y.m_endFlag - (size_t)startPtr) / ptrSize; + InsertMp(startPtr, count, "_Y"); + + startPtr = &m_Focus.m_startFlag + 1; + count = ((size_t)&m_Focus.m_endFlag - (size_t)startPtr) / ptrSize; + InsertMp(startPtr, count, "_Focus"); + + InsertMp(&m_ScanStateUpdateTime, 1); + } ~ScanStateXY() {} + + public: bool m_IsConnected; UINT m_LastError; IntelliScanState m_X; IntelliScanState m_Y; IntelliScanState m_Focus; + StrData* m_ScanStateUpdateTime; //time_t用string表示 +}; + + +struct ScanStateXYSCT { +public: + IntelliScanStateSCT m_X; + IntelliScanStateSCT m_Y; + IntelliScanStateSCT m_Focus; + }; \ No newline at end of file diff --git a/PrintS/ScannerCtrl/RTC5Scanner.cpp b/PrintS/ScannerCtrl/RTC5Scanner.cpp index 4a25e7b..5861e1c 100644 --- a/PrintS/ScannerCtrl/RTC5Scanner.cpp +++ b/PrintS/ScannerCtrl/RTC5Scanner.cpp @@ -7,7 +7,8 @@ #include "../LanguageManager.h" #include "../PLC/SignalService.h" -RTC5Scanner::RTC5Scanner(ScannerControlCfg* cfg) :Scanner(cfg) +RTC5Scanner::RTC5Scanner(ScannerControlCfg* cfg,int scanIndex) + :Scanner(cfg), m_scanIndex(scanIndex) { //n_get_serial_number(); @@ -796,74 +797,75 @@ void RTC5Scanner::UpdateScannerInfo() int ystopeven = n_get_value(m_ScannerControlCfg->m_ControlNo, 2); EnterCriticalSection(&m_ScannerInfoCS); - m_ScanState.m_X.m_ActualPosition = xap; - m_ScanState.m_Y.m_ActualPosition = yap; - m_ScanState.m_X.m_SetPosition = xsp;// / m_xfactor - m_CorrectParamCfg->m_xposfix / m_xfactor; - m_ScanState.m_Y.m_SetPosition = ysp;// / m_yfactor - m_CorrectParamCfg->m_xposfix / m_yfactor; - m_ScanState.m_X.m_PositionError = xpe;// / m_xfactor; - m_ScanState.m_Y.m_PositionError = ype;// / m_yfactor; + m_ScanState.m_X.m_ActualPosition->SetValue(xap); + m_ScanState.m_Y.m_ActualPosition->SetValue(yap); + m_ScanState.m_X.m_SetPosition->SetValue(xsp);// / m_xfactor - m_CorrectParamCfg->m_xposfix / m_xfactor; + m_ScanState.m_Y.m_SetPosition->SetValue(ysp);// / m_yfactor - m_CorrectParamCfg->m_xposfix / m_yfactor; + m_ScanState.m_X.m_PositionError->SetValue(xpe);// / m_xfactor; + m_ScanState.m_Y.m_PositionError->SetValue(ype);// / m_yfactor; bitset<32> xstaBit(xsta); bitset<32> ystaBit(ysta); - m_ScanState.m_X.m_GalvanometerScannerTempOK = xstaBit[18]; - m_ScanState.m_Y.m_GalvanometerScannerTempOK = ystaBit[18]; - m_ScanState.m_X.m_GalvanometerScannerTemp = xgst; - m_ScanState.m_Y.m_GalvanometerScannerTemp = ygst; - m_ScanState.m_X.m_ServoBoardTemp = xsbt; - m_ScanState.m_Y.m_ServoBoardTemp = ysbt; + m_ScanState.m_X.m_GalvanometerScannerTempOK->SetValue(xstaBit[18]); + m_ScanState.m_Y.m_GalvanometerScannerTempOK->SetValue(ystaBit[18]); + m_ScanState.m_X.m_GalvanometerScannerTemp->SetValue(xgst); + m_ScanState.m_Y.m_GalvanometerScannerTemp->SetValue(ygst); + m_ScanState.m_X.m_ServoBoardTemp->SetValue(xsbt); + m_ScanState.m_Y.m_ServoBoardTemp->SetValue(ysbt); bitset<32> xlowstateBit(xlowstate); - m_ScanState.m_X.m_IsAllControlParametersValid = xlowstateBit[8]; - m_ScanState.m_X.m_IsScannerReachedCriticalEdgePos = !xlowstateBit[9]; - m_ScanState.m_X.m_IsADConverterSuccessfullyInit = xlowstateBit[10]; - m_ScanState.m_X.m_IsScanSystemTempOverLimit = !xlowstateBit[11]; - m_ScanState.m_X.m_IsExternalPowderLow = !xlowstateBit[12]; - m_ScanState.m_X.m_IsCriticalError = !xlowstateBit[13]; - m_ScanState.m_X.m_IsBootingProcessCompleted = xlowstateBit[14]; - m_ScanState.m_X.m_IsScannerAndServoBoradTempNormal = xlowstateBit[15]; - m_ScanState.m_X.m_IsPositionErrorNormalRange = xlowstateBit[16]; - m_ScanState.m_X.m_IsInternalVoltagesNormal = xlowstateBit[17]; - m_ScanState.m_X.m_IsGalvanometerScannerHeaterOutputStageOn = xlowstateBit[18]; - m_ScanState.m_X.m_IsGalvanometerScannerOutputStageOn = xlowstateBit[19]; + m_ScanState.m_X.m_IsAllControlParametersValid->SetValue(xlowstateBit[8]); + m_ScanState.m_X.m_IsScannerReachedCriticalEdgePos->SetValue(!xlowstateBit[9]); + m_ScanState.m_X.m_IsADConverterSuccessfullyInit->SetValue(xlowstateBit[10]); + m_ScanState.m_X.m_IsScanSystemTempOverLimit->SetValue(!xlowstateBit[11]); + m_ScanState.m_X.m_IsExternalPowderLow->SetValue(!xlowstateBit[12]); + m_ScanState.m_X.m_IsCriticalError->SetValue(!xlowstateBit[13]); + m_ScanState.m_X.m_IsBootingProcessCompleted->SetValue(xlowstateBit[14]); + m_ScanState.m_X.m_IsScannerAndServoBoradTempNormal->SetValue(xlowstateBit[15]); + m_ScanState.m_X.m_IsPositionErrorNormalRange->SetValue(xlowstateBit[16]); + m_ScanState.m_X.m_IsInternalVoltagesNormal->SetValue(xlowstateBit[17]); + m_ScanState.m_X.m_IsGalvanometerScannerHeaterOutputStageOn->SetValue(xlowstateBit[18]); + m_ScanState.m_X.m_IsGalvanometerScannerOutputStageOn->SetValue(xlowstateBit[19]); bitset<32> ylowstateBit(ylowstate); - m_ScanState.m_Y.m_IsAllControlParametersValid = ylowstateBit[8]; - m_ScanState.m_Y.m_IsScannerReachedCriticalEdgePos = !ylowstateBit[9]; - m_ScanState.m_Y.m_IsADConverterSuccessfullyInit = ylowstateBit[10]; - m_ScanState.m_Y.m_IsScanSystemTempOverLimit = !ylowstateBit[11]; - m_ScanState.m_Y.m_IsExternalPowderLow = !ylowstateBit[12]; - m_ScanState.m_Y.m_IsCriticalError = !ylowstateBit[13]; - m_ScanState.m_Y.m_IsBootingProcessCompleted = ylowstateBit[14]; - m_ScanState.m_Y.m_IsScannerAndServoBoradTempNormal = ylowstateBit[15]; - m_ScanState.m_Y.m_IsPositionErrorNormalRange = ylowstateBit[16]; - m_ScanState.m_Y.m_IsInternalVoltagesNormal = ylowstateBit[17]; - m_ScanState.m_Y.m_IsGalvanometerScannerHeaterOutputStageOn = ylowstateBit[18]; - m_ScanState.m_Y.m_IsGalvanometerScannerOutputStageOn = ylowstateBit[19]; + m_ScanState.m_Y.m_IsAllControlParametersValid->SetValue(ylowstateBit[8]); + m_ScanState.m_Y.m_IsScannerReachedCriticalEdgePos->SetValue(!ylowstateBit[9]); + m_ScanState.m_Y.m_IsADConverterSuccessfullyInit->SetValue(ylowstateBit[10]); + m_ScanState.m_Y.m_IsScanSystemTempOverLimit->SetValue(!ylowstateBit[11]); + m_ScanState.m_Y.m_IsExternalPowderLow->SetValue(!ylowstateBit[12]); + m_ScanState.m_Y.m_IsCriticalError->SetValue(!ylowstateBit[13]); + m_ScanState.m_Y.m_IsBootingProcessCompleted->SetValue(ylowstateBit[14]); + m_ScanState.m_Y.m_IsScannerAndServoBoradTempNormal->SetValue(ylowstateBit[15]); + m_ScanState.m_Y.m_IsPositionErrorNormalRange->SetValue(ylowstateBit[16]); + m_ScanState.m_Y.m_IsInternalVoltagesNormal->SetValue(ylowstateBit[17]); + m_ScanState.m_Y.m_IsGalvanometerScannerHeaterOutputStageOn->SetValue(ylowstateBit[18]); + m_ScanState.m_Y.m_IsGalvanometerScannerOutputStageOn->SetValue(ylowstateBit[19]); bitset<32> xhighstateBit(xhighstate); - m_ScanState.m_X.m_IsGalvanometerScannerOperationTempNormal = xhighstateBit[13]; - m_ScanState.m_X.m_IsServoBoradOperationTempNormal = xhighstateBit[14]; - m_ScanState.m_X.m_IsAGCVoltageOK = xhighstateBit[15]; - m_ScanState.m_X.m_IsDSPCoreVoltageOK = xhighstateBit[16]; - m_ScanState.m_X.m_IsDSPIOVoltageOK = xhighstateBit[17]; - m_ScanState.m_X.m_IsAnalogSetionVoltageOK = xhighstateBit[18]; - m_ScanState.m_X.m_IsADConverterVoltageOK = xhighstateBit[19]; + m_ScanState.m_X.m_IsGalvanometerScannerOperationTempNormal->SetValue(xhighstateBit[13]); + m_ScanState.m_X.m_IsServoBoradOperationTempNormal->SetValue(xhighstateBit[14]); + m_ScanState.m_X.m_IsAGCVoltageOK->SetValue(xhighstateBit[15]); + m_ScanState.m_X.m_IsDSPCoreVoltageOK->SetValue(xhighstateBit[16]); + m_ScanState.m_X.m_IsDSPIOVoltageOK->SetValue(xhighstateBit[17]); + m_ScanState.m_X.m_IsAnalogSetionVoltageOK->SetValue(xhighstateBit[18]); + m_ScanState.m_X.m_IsADConverterVoltageOK->SetValue(xhighstateBit[19]); bitset<32> yhighstateBit(yhighstate); - m_ScanState.m_Y.m_IsGalvanometerScannerOperationTempNormal = yhighstateBit[13]; - m_ScanState.m_Y.m_IsServoBoradOperationTempNormal = yhighstateBit[14]; - m_ScanState.m_Y.m_IsAGCVoltageOK = yhighstateBit[15]; - m_ScanState.m_Y.m_IsDSPCoreVoltageOK = yhighstateBit[16]; - m_ScanState.m_Y.m_IsDSPIOVoltageOK = yhighstateBit[17]; - m_ScanState.m_Y.m_IsAnalogSetionVoltageOK = yhighstateBit[18]; - m_ScanState.m_Y.m_IsADConverterVoltageOK = yhighstateBit[19]; + m_ScanState.m_Y.m_IsGalvanometerScannerOperationTempNormal->SetValue(yhighstateBit[13]); + m_ScanState.m_Y.m_IsServoBoradOperationTempNormal->SetValue(yhighstateBit[14]); + m_ScanState.m_Y.m_IsAGCVoltageOK->SetValue(yhighstateBit[15]); + m_ScanState.m_Y.m_IsDSPCoreVoltageOK->SetValue(yhighstateBit[16]); + m_ScanState.m_Y.m_IsDSPIOVoltageOK->SetValue(yhighstateBit[17]); + m_ScanState.m_Y.m_IsAnalogSetionVoltageOK->SetValue(yhighstateBit[18]); + m_ScanState.m_Y.m_IsADConverterVoltageOK->SetValue(yhighstateBit[19]); time(&m_ScanStateUpdateTime); + m_ScanState.m_ScanStateUpdateTime->SetValue(to_string(m_ScanStateUpdateTime)); - m_ScanState.m_X.m_LowState = xlowstate; - m_ScanState.m_X.m_HighState = xhighstate; - m_ScanState.m_Y.m_LowState = ylowstate; - m_ScanState.m_Y.m_HighState = yhighstate; - m_ScanState.m_X.m_StopEven = xstopeven; - m_ScanState.m_Y.m_StopEven = ystopeven; + m_ScanState.m_X.m_LowState->SetValue(xlowstate); + m_ScanState.m_X.m_HighState->SetValue(xhighstate); + m_ScanState.m_Y.m_LowState->SetValue(ylowstate); + m_ScanState.m_Y.m_HighState->SetValue(yhighstate); + m_ScanState.m_X.m_StopEven->SetValue(xstopeven); + m_ScanState.m_Y.m_StopEven->SetValue(ystopeven); LeaveCriticalSection(&m_ScannerInfoCS); if (m_ScannerControlCfg->m_ScanCfgWrapper.m_CorrectParamCfg.m_IsDynamicFocus) { @@ -909,40 +911,40 @@ void RTC5Scanner::UpdateScannerInfo() int zstopeven = n_get_value(m_ScannerControlCfg->m_ControlNo, 4); EnterCriticalSection(&m_ScannerInfoCS); - m_ScanState.m_Focus.m_ServoBoardTemp = ysbtz; - m_ScanState.m_Focus.m_PDSupplyVoltage = pdsv; - m_ScanState.m_Focus.m_DSPCoreSupplyVoltage = dspcsv; - m_ScanState.m_Focus.m_DSPIOVoltage = dspiov; - m_ScanState.m_Focus.m_AnalogSectionVoltage = asv; - m_ScanState.m_Focus.m_ADConverterSupplyVoltage = adcsv; - m_ScanState.m_Focus.m_PDSupplyCurrent = pdsc; + m_ScanState.m_Focus.m_ServoBoardTemp->SetValue(ysbtz); + m_ScanState.m_Focus.m_PDSupplyVoltage->SetValue(pdsv); + m_ScanState.m_Focus.m_DSPCoreSupplyVoltage->SetValue(dspcsv); + m_ScanState.m_Focus.m_DSPIOVoltage->SetValue(dspiov); + m_ScanState.m_Focus.m_AnalogSectionVoltage->SetValue(asv); + m_ScanState.m_Focus.m_ADConverterSupplyVoltage->SetValue(adcsv); + m_ScanState.m_Focus.m_PDSupplyCurrent->SetValue(pdsc); bitset<32> ylowstatezBit(ylowstatez); - m_ScanState.m_Focus.m_IsAllControlParametersValid = ylowstatezBit[8]; - m_ScanState.m_Focus.m_IsScannerReachedCriticalEdgePos = !ylowstatezBit[9]; - m_ScanState.m_Focus.m_IsADConverterSuccessfullyInit = ylowstatezBit[10]; - m_ScanState.m_Focus.m_IsScanSystemTempOverLimit = !ylowstatezBit[11]; - m_ScanState.m_Focus.m_IsExternalPowderLow = !ylowstatezBit[12]; - m_ScanState.m_Focus.m_IsCriticalError = !ylowstatezBit[13]; - m_ScanState.m_Focus.m_IsBootingProcessCompleted = ylowstatezBit[14]; - m_ScanState.m_Focus.m_IsScannerAndServoBoradTempNormal = ylowstatezBit[15]; - m_ScanState.m_Focus.m_IsPositionErrorNormalRange = ylowstatezBit[16]; - m_ScanState.m_Focus.m_IsInternalVoltagesNormal = ylowstatezBit[17]; - m_ScanState.m_Focus.m_IsGalvanometerScannerHeaterOutputStageOn = ylowstatezBit[18]; - m_ScanState.m_Focus.m_IsGalvanometerScannerOutputStageOn = ylowstatezBit[19]; + m_ScanState.m_Focus.m_IsAllControlParametersValid->SetValue(ylowstatezBit[8]); + m_ScanState.m_Focus.m_IsScannerReachedCriticalEdgePos->SetValue(!ylowstatezBit[9]); + m_ScanState.m_Focus.m_IsADConverterSuccessfullyInit->SetValue(ylowstatezBit[10]); + m_ScanState.m_Focus.m_IsScanSystemTempOverLimit->SetValue(!ylowstatezBit[11]); + m_ScanState.m_Focus.m_IsExternalPowderLow->SetValue(!ylowstatezBit[12]); + m_ScanState.m_Focus.m_IsCriticalError->SetValue(!ylowstatezBit[13]); + m_ScanState.m_Focus.m_IsBootingProcessCompleted->SetValue(ylowstatezBit[14]); + m_ScanState.m_Focus.m_IsScannerAndServoBoradTempNormal->SetValue(ylowstatezBit[15]); + m_ScanState.m_Focus.m_IsPositionErrorNormalRange->SetValue(ylowstatezBit[16]); + m_ScanState.m_Focus.m_IsInternalVoltagesNormal->SetValue(ylowstatezBit[17]); + m_ScanState.m_Focus.m_IsGalvanometerScannerHeaterOutputStageOn->SetValue(ylowstatezBit[18]); + m_ScanState.m_Focus.m_IsGalvanometerScannerOutputStageOn->SetValue(ylowstatezBit[19]); bitset<32> yhighstatezBit(yhighstatez); - m_ScanState.m_Focus.m_IsGalvanometerScannerOperationTempNormal = yhighstatezBit[13]; - m_ScanState.m_Focus.m_IsServoBoradOperationTempNormal = yhighstatezBit[14]; - m_ScanState.m_Focus.m_IsAGCVoltageOK = yhighstatezBit[15]; - m_ScanState.m_Focus.m_IsDSPCoreVoltageOK = yhighstatezBit[16]; - m_ScanState.m_Focus.m_IsDSPIOVoltageOK = yhighstatezBit[17]; - m_ScanState.m_Focus.m_IsAnalogSetionVoltageOK = yhighstatezBit[18]; - m_ScanState.m_Focus.m_IsADConverterVoltageOK = yhighstatezBit[19]; + m_ScanState.m_Focus.m_IsGalvanometerScannerOperationTempNormal->SetValue(yhighstatezBit[13]); + m_ScanState.m_Focus.m_IsServoBoradOperationTempNormal->SetValue(yhighstatezBit[14]); + m_ScanState.m_Focus.m_IsAGCVoltageOK->SetValue(yhighstatezBit[15]); + m_ScanState.m_Focus.m_IsDSPCoreVoltageOK->SetValue(yhighstatezBit[16]); + m_ScanState.m_Focus.m_IsDSPIOVoltageOK->SetValue(yhighstatezBit[17]); + m_ScanState.m_Focus.m_IsAnalogSetionVoltageOK->SetValue(yhighstatezBit[18]); + m_ScanState.m_Focus.m_IsADConverterVoltageOK->SetValue(yhighstatezBit[19]); - m_ScanState.m_Focus.m_LowState = ylowstatez; - m_ScanState.m_Focus.m_HighState = yhighstatez; - m_ScanState.m_Focus.m_StopEven = zstopeven; + m_ScanState.m_Focus.m_LowState->SetValue(ylowstatez); + m_ScanState.m_Focus.m_HighState->SetValue(yhighstatez); + m_ScanState.m_Focus.m_StopEven->SetValue(zstopeven); LeaveCriticalSection(&m_ScannerInfoCS); } } @@ -970,6 +972,7 @@ void RTC5Scanner::ScannerInfoRun() } if (updateFlag % 10 == 0) { UpdateScannerInfo(); + m_ScanState.SendToClients(XYSCANSTATE, "_" + to_string(m_scanIndex)); } updateFlag++; if (updateFlag > 1000) { updateFlag = 0; } diff --git a/PrintS/ScannerCtrl/RTC5Scanner.h b/PrintS/ScannerCtrl/RTC5Scanner.h index 11e7419..73f0e4f 100644 --- a/PrintS/ScannerCtrl/RTC5Scanner.h +++ b/PrintS/ScannerCtrl/RTC5Scanner.h @@ -1,10 +1,10 @@ -#pragma once +#pragma once #include "Scanner.h" class RTC5Scanner : public Scanner { public: - RTC5Scanner(ScannerControlCfg* cfg); + RTC5Scanner(ScannerControlCfg* cfg,int scanIndex); ~RTC5Scanner(); bool Init(); bool StopWork(); @@ -55,6 +55,7 @@ private: void ScanTestProc(); private: + int m_scanIndex; const uint32_t ScanStatusAddr = 0x0500; const uint32_t ActualPositionAddr = 0x0501; diff --git a/PrintS/ScannerCtrl/Scanner.cpp b/PrintS/ScannerCtrl/Scanner.cpp index 9fa0fc4..77c9458 100644 --- a/PrintS/ScannerCtrl/Scanner.cpp +++ b/PrintS/ScannerCtrl/Scanner.cpp @@ -1,4 +1,4 @@ -#include "Scanner.h" +#include "Scanner.h" #include "../global.h" #include "../SystemInfo.h" #include "../Logger.h" @@ -26,6 +26,7 @@ Scanner::Scanner(ScannerControlCfg* cfg) m_ExtCfg = ConfigManager::GetInstance()->GetExtCfg(); m_ScannerIO = ConfigManager::GetInstance()->GetIoCfgWrapper()->m_Laser; time(&m_ScanStateUpdateTime); + m_ScanState.m_ScanStateUpdateTime->SetValue(to_string(m_ScanStateUpdateTime)); InitializeCriticalSection(&m_ScannerInfoCS); m_XOffsetAssist = 0.0f; @@ -186,12 +187,12 @@ DWORD WINAPI Scanner::ScanProc(Scanner* _this) void Scanner::WaitFinish() { if (m_Thread == INVALID_HANDLE_VALUE)return; - if (m_RunCfg->m_LogDebugInfo)g_log->TraceInfo(u8"ʼȴ%dɨ", m_ScannerControlCfg->m_SeqNo); + if (m_RunCfg->m_LogDebugInfo)g_log->TraceInfo(u8"开始等待振镜%d完成扫描", m_ScannerControlCfg->m_SeqNo); WaitForSingleObject(m_Thread, INFINITE); Clean(); CloseHandle(m_Thread); m_Thread = INVALID_HANDLE_VALUE; - if (m_RunCfg->m_LogDebugInfo)g_log->TraceInfo(u8"%dɨ", m_ScannerControlCfg->m_SeqNo); + if (m_RunCfg->m_LogDebugInfo)g_log->TraceInfo(u8"振镜%d完成扫描", m_ScannerControlCfg->m_SeqNo); } void Scanner::Clean() @@ -1082,16 +1083,19 @@ void Scanner::SetAutoUpdateScanInfo(bool isauto) m_IsAutoInfo = isauto; } -void Scanner::GetXYScanState(ScanStateXY* scanstate, time_t &t) +void Scanner::GetXYScanState(ScanStateXYSCT* scanstate, time_t &t) { EnterCriticalSection(&m_ScannerInfoCS); t = m_ScanStateUpdateTime; - memcpy_s(&scanstate->m_X, sizeof(IntelliScanState), &m_ScanState.m_X, sizeof(IntelliScanState)); - memcpy_s(&scanstate->m_Y, sizeof(IntelliScanState), &m_ScanState.m_Y, sizeof(IntelliScanState)); + + m_ScanState.m_X.GetState(scanstate->m_X); + m_ScanState.m_Y.GetState(scanstate->m_Y); + m_ScanState.m_Focus.GetState(scanstate->m_Focus); + //memcpy_s(&scanstate->m_X, sizeof(IntelliScanState), &m_ScanState.m_X, sizeof(IntelliScanState)); + //memcpy_s(&scanstate->m_Y, sizeof(IntelliScanState), &m_ScanState.m_Y, sizeof(IntelliScanState)); LeaveCriticalSection(&m_ScannerInfoCS); } - /*bool Scanner::IsUpScanner() { if (m_LaserCfg->m_Cno < 3) { diff --git a/PrintS/ScannerCtrl/Scanner.h b/PrintS/ScannerCtrl/Scanner.h index 92d2fa9..bfb6695 100644 --- a/PrintS/ScannerCtrl/Scanner.h +++ b/PrintS/ScannerCtrl/Scanner.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "../stdafx.h" #include "../job/BPBinary.h" #include "../job/MetaData.h" @@ -98,7 +98,7 @@ public: void StartGetScanInfo(); void StopGetScanInfo(); void SetAutoUpdateScanInfo(bool isauto); - void GetXYScanState(ScanStateXY* scanstate, time_t &t); + void GetXYScanState(ScanStateXYSCT* scanstate, time_t &t); //咋办 virtual void UpdateScannerInfo() {} //bool IsUpScanner(); @@ -114,6 +114,9 @@ public: void SetPairScan(Scanner* sc) { m_PairScan = sc; } virtual void UpdateScanParamByCfg(ScanParamCfg* cfg) = 0; + + ScanStateXY& GetScanStateXY() { return m_ScanState; } + protected: static DWORD WINAPI DebugProc(Scanner* _this); virtual void ScanDebug() {} diff --git a/PrintS/ScannerCtrl/ScannerCtrl.cpp b/PrintS/ScannerCtrl/ScannerCtrl.cpp index a896cd1..bac47a3 100644 --- a/PrintS/ScannerCtrl/ScannerCtrl.cpp +++ b/PrintS/ScannerCtrl/ScannerCtrl.cpp @@ -11,6 +11,8 @@ #include "../utils/StringHelper.h" #include "../Remote/RemoteClient.h" #include "../utils/TimeHelper.h" +#include "../DataManage/ClientInfo.h" + ScannerCtrl::ScannerCtrl() :m_print_thread(INVALID_HANDLE_VALUE) @@ -113,10 +115,16 @@ bool ScannerCtrl::Init() { { g_log->TraceError(_(u8"没有振镜控制卡").c_str()); m_InitErrorInfos.push_back(_(u8"没有振镜控制卡").c_str()); + + //for (int i = 0; i < 4; ++i) { //wxxtest + // Scanner* scanner = new RTC5Scanner(nullptr, i); + // m_scan.push_back(scanner); + //} + return false; } - + int scanIndex = 0; for (map::iterator sit = scannerControlCfgsMap->begin(); sit != scannerControlCfgsMap->end(); sit++) { ScannerControlCfg* cfg = sit->second; if (m_IOCfgWrapper->m_LaserIOMap.find(cfg->m_SeqNo) != m_IOCfgWrapper->m_LaserIOMap.end()) { @@ -124,7 +132,7 @@ bool ScannerCtrl::Init() { cfg->m_LaserStart = m_IOCfgWrapper->m_LaserIOMap[cfg->m_SeqNo]->m_LaserStart; cfg->m_LaserEnable = m_IOCfgWrapper->m_LaserIOMap[cfg->m_SeqNo]->m_LaserEnable; } - Scanner* scanner = new RTC5Scanner(cfg); + Scanner* scanner = new RTC5Scanner(cfg, scanIndex); if (scanner->Init()) @@ -742,12 +750,12 @@ void ScannerCtrl::CtrlWhenStop() CtrlIoWhenExit(); } -void ScannerCtrl::GetInitErrorInfos(vector& vec) -{ - for (size_t i = 0; i < m_InitErrorInfos.size(); ++i) { - vec.push_back(m_InitErrorInfos[i]); - } -} +//void ScannerCtrl::GetInitErrorInfos(vector& vec) +//{ +// for (size_t i = 0; i < m_InitErrorInfos.size(); ++i) { +// vec.push_back(m_InitErrorInfos[i]); +// } +//} string ScannerCtrl::GetInitErrorInfos() { @@ -1163,8 +1171,9 @@ void ScannerCtrl::DispatchDataBlock() vector focusStatus; for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) { m_scan[scanIndex]->UpdateScannerInfo(); + m_scan[scanIndex]->GetScanStateXY().SendToClients(XYSCANSTATE,"_"+to_string(scanIndex)); ScannerStatus* sstatus = new ScannerStatus(); - ScanStateXY sxy; + ScanStateXYSCT sxy; m_scan[scanIndex]->GetXYScanState(&sxy, sstatus->m_InsertTime); sstatus->m_ScanTempX = sxy.m_X.m_GalvanometerScannerTemp; sstatus->m_ScanServoTempX = sxy.m_X.m_ServoBoardTemp; @@ -1611,7 +1620,7 @@ bool ScannerCtrl::IsHeatingScannerEnable() for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) { Scanner* scanner = m_scan[scanIndex]; - if (scanner->GetConfig()->m_ScanCfgWrapper.m_ScanTestCfg.m_IsAutoHeatingScanner) + if (scanner && scanner->GetConfig() && scanner->GetConfig()->m_ScanCfgWrapper.m_ScanTestCfg.m_IsAutoHeatingScanner) { rel = true; break; @@ -1778,10 +1787,52 @@ void ScannerCtrl::CallFunc(const ReadData& rd) { case STOPHEATINGMOTION: StopHeatingMotion((bool)stoi(rd.strValue)); break; + case STARTDEBUGTEST: + m_scan[stoi(rd.strValue)]->StartDebugTest(); + break; + case STOPDEBUGTEST: + m_scan[stoi(rd.strValue)]->StopDebugTest(); + break; + case STARTHEATINGSCANNERTEST: + m_scan[stoi(rd.strValue)]->StartHeatingScannerTest(); + break; + case STOPHEATINGSCANNERTEST: + m_scan[stoi(rd.strValue)]->StopHeatingScannerTest(); + break; + case STARTGETSCANINFO: + m_scan[stoi(rd.strValue)]->StartGetScanInfo(); + break; + case STOPGETSCANINFO: + m_scan[stoi(rd.strValue)]->StopGetScanInfo(); + break; default: printf("参数不对...\n"); break; } +} + +void ScannerCtrl::SendToClients() { + std::shared_lock lck(m_mtx); + + list lst; + lst.emplace_back(Item{ "IsTestLayerEnable", to_string(IsTestLayerEnable()), iBOOL}); + lst.emplace_back(Item{ "IsHeatingScannerEnable", to_string(IsHeatingScannerEnable()), iBOOL}); + lst.emplace_back(Item{ "InitErrorInfos", GetInitErrorInfos(), iSTRING}); + int count = m_scan.size(); + lst.emplace_back(Item{ "ScanCount", to_string(count), iINT}); + for (int i = 0; i < count; ++i) { + lst.emplace_back(Item{ "IsDebugEnable_"+to_string(i), to_string(m_scan[i]->IsDebugEnable()), iBOOL}); + lst.emplace_back(Item{ "IsHeatingScannerTest_"+to_string(i), to_string(m_scan[i]->IsHeatingScannerTest()), iBOOL}); + } + + auto iter = Scanner::m_CurrentSerio.begin(); + while (iter != Scanner::m_CurrentSerio.end()) { + lst.emplace_back(Item{ to_string(iter->first), to_string(iter->second), iUINT }); + ++iter; + } + + + ClientWrapper::Instance()->PushAllClient(WriteData(SCANCTRLPARAM,lst)); } \ No newline at end of file diff --git a/PrintS/ScannerCtrl/ScannerCtrl.h b/PrintS/ScannerCtrl/ScannerCtrl.h index 5a90ce5..aa72e59 100644 --- a/PrintS/ScannerCtrl/ScannerCtrl.h +++ b/PrintS/ScannerCtrl/ScannerCtrl.h @@ -21,6 +21,13 @@ enum FUNCNAME { REMOVESCANNER, STARTHEATINGMOTION, STOPHEATINGMOTION, + + STARTDEBUGTEST, //scanner函数 + STOPDEBUGTEST, + STARTHEATINGSCANNERTEST, + STOPHEATINGSCANNERTEST, + STARTGETSCANINFO, + STOPGETSCANINFO, }; @@ -39,10 +46,10 @@ public: void PauseAuto(); bool StopWork(); - bool IsTestLayerEnable(); //留着 + bool IsTestLayerEnable(); void StopRedTest(); void TestLayer(); - vector* GetScanners() { return &m_scan; } + vector* GetScanners() { return &m_scan; } //待处理 JobController* GetJobController() { return m_job_controller; } void RemoveScanner(int seq); @@ -50,9 +57,9 @@ public: m_PurifierClient = purifierClient; } void SetScannerPowerClient(ScannerPowerClient* spc) { m_ScannerPowerClient = spc; } - void GetInitErrorInfos(vector& vec); + //void GetInitErrorInfos(vector& vec); string GetInitErrorInfos(); - bool HasInitError() { return !m_InitErrorInfos.empty(); } + bool HasInitError() { return !m_InitErrorInfos.empty(); } //不需要传客户端,先请求一次GetInitErrorInfos void ModelScan(void); void StopModelScan(void); @@ -60,7 +67,7 @@ public: m_MachineCtrl = machineCtrl; } - bool IsHeatingScannerEnable(); + bool IsHeatingScannerEnable(); //在客户端判断,不传客户端 void SetCamera(HBDCamera* camera) { m_Camera = camera; } //void SetRecoatCheck(RecoatCheck* rc) { m_RecoatCheck = rc; } @@ -72,6 +79,8 @@ public: void SetRemoteClient(RemoteClient* rc) { m_RemoteClient = rc; } void CallFunc(const ReadData& rd); + + void SendToClients(); private: static DWORD WINAPI PrintProc(thisClass* _this); static DWORD WINAPI RedPrintTestProc(thisClass* _this); @@ -139,5 +148,8 @@ private: vector m_RedTestDBS; vector m_ModeTestDBS; + + + std::shared_mutex m_mtx; }; diff --git a/PrintS/enc_temp_folder/3951ff932cdd959898890bc5f61814d/AxisCfg.cpp b/PrintS/enc_temp_folder/3951ff932cdd959898890bc5f61814d/AxisCfg.cpp deleted file mode 100644 index 34002ab..0000000 --- a/PrintS/enc_temp_folder/3951ff932cdd959898890bc5f61814d/AxisCfg.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "AxisCfg.h" -AxisCfg::AxisCfg(short id) - :m_axis_id(id) - , m_active_limit(new IntData("active_limit", u8"活性限制微米")) - , m_negactive_limit(new IntData("negactive_limit", u8"消极限制微米")) - , m_active_direct(new IntData("active_direct", u8"消极限制微米")) - , m_OverLoadLimit(new FloatData("OverLoadLimit", u8"消极限制微米")) - , m_ShowRefZero(new FloatData("ShowRefZero", u8"消极限制微米")) - , m_ShowPosInv(new BoolData("ShowPosInv", u8"消极限制微米")) - , m_IsUse(new BoolData("IsUse", u8"是否有用", true)) - , m_MaxLoadValue(new FloatData("MaxLoadValue", u8"最大加载值")) - , m_SafeLimit(new BoolData("SafeLimit", u8"安全限制", false)) -{ - size_t ptrSize = sizeof(nullptr); //指针大小 - void* startPtr = &m_startFlag + 1; - size_t count = ((size_t)&m_endFlag - (size_t)startPtr) / ptrSize; - InsertMp(startPtr, count); -} - - -AxisCfg::~AxisCfg() -{ -} - - - -void AxisCfg::GetUpdateSql(vector& vec) -{ - char buffer[2048]; - sprintf_s(buffer, sizeof(buffer), "UPDATE %s SET %s=",TABLE_NAME.c_str(),FIELD_VALUE.c_str() ); - string strhead = string(buffer); - sprintf_s(buffer, sizeof(buffer), " WHERE %s=%d AND %s=", FIELD_AXIS_ID.c_str(), m_axis_id,FIELD_CODE.c_str()); - string strtail = string(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), to_string(m_active_limit->GetValue()).c_str(), strtail.c_str(), CODE_ACTIVE_LIMIT.c_str()); - vec.push_back(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), to_string(m_negactive_limit->GetValue()).c_str(), strtail.c_str(), CODE_NEGACTIVE_LIMIT.c_str()); - vec.push_back(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), to_string(m_active_direct->GetValue()).c_str(), strtail.c_str(), CODE_ACTIVE_DIRECT.c_str()); - vec.push_back(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), to_string(m_OverLoadLimit->GetValue()).c_str(), strtail.c_str(), CODE_OVER_LOAD_LIMIT.c_str()); - vec.push_back(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), to_string(m_ShowRefZero->GetValue()).c_str(), strtail.c_str(), CODE_SHOW_REF_ZERO.c_str()); - vec.push_back(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), to_string(m_ShowPosInv->GetValue()).c_str(), strtail.c_str(), CODE_SHOW_POS_INV.c_str()); - vec.push_back(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), to_string(m_MaxLoadValue->GetValue()).c_str(), strtail.c_str(), CODE_MAX_LOAD_VALUE.c_str()); - vec.push_back(buffer); - - sprintf_s(buffer, sizeof(buffer), "%s'%s'%s'%s'", strhead.c_str(), m_SafeLimit?"1":"0", strtail.c_str(), CODE_SAFE_LIMIT.c_str()); - vec.push_back(buffer); -} - -string AxisCfg::TABLE_NAME = "AxisConfig"; -string AxisCfg::FIELD_ID = "Id"; -string AxisCfg::FIELD_AXIS_ID = "Axis_Id"; -string AxisCfg::FIELD_CODE = "Axis_Code"; -string AxisCfg::FIELD_VALUE = "Axis_Value"; - - -string AxisCfg::CODE_NAME= "Name"; -string AxisCfg::CODE_ACTIVE_LIMIT = "Active_Limit"; -string AxisCfg::CODE_NEGACTIVE_LIMIT = "Negactive_Limit"; -string AxisCfg::CODE_ACTIVE_DIRECT = "acitve_direct"; -string AxisCfg::CODE_OVER_LOAD_LIMIT = "OverLoadLimit"; -string AxisCfg::CODE_SHOW_POS_INV="ShowPosInv"; //显示位置置反 -string AxisCfg::CODE_SHOW_REF_ZERO="ShowRefZero"; -string AxisCfg::CODE_MAX_LOAD_VALUE = "MaxLoadValue"; -string AxisCfg::CODE_SAFE_LIMIT = "SafeLimit"; \ No newline at end of file diff --git a/PrintS/job/H3DMetaData.cpp b/PrintS/job/H3DMetaData.cpp index 7da07ff..785681a 100644 --- a/PrintS/job/H3DMetaData.cpp +++ b/PrintS/job/H3DMetaData.cpp @@ -136,13 +136,15 @@ bool H3DMetaData::LoadLayerByIndex(unsigned int lindex) } //lindex是第几层 -bool H3DMetaData::GetLayerByIndex(unsigned int lindex, ::stream::LayerData** response) +bool H3DMetaData::GetLayerByIndex(unsigned int lindex, ::stream::ResponseAny** response) { bool rel = true; if (lindex >= layers->vector_layers.size())return false; LockMainDB(); Layer* layer = layers->vector_layers[lindex]; ClearBlockMap(); + + stream::LayerData result; vector datablocks = layer->data_blocks; for (size_t i = 0; i < datablocks.size(); ++i) { DataBlock* db = datablocks[i]; @@ -160,7 +162,8 @@ bool H3DMetaData::GetLayerByIndex(unsigned int lindex, ::stream::LayerData** res } m_block_map[db] = pbindb; - stream::LayerDataBlock* p = (*response)->add_layerdatablock(); + //stream::LayerDataBlock* p = (*response)->add_layerdatablock(); + stream::LayerDataBlock* p = result.add_layerdatablock(); p->set_order(datablocks[i]->order); p->set_blocktype(pbindb->type); size_t count = pbindb->point_indexs.size(); @@ -188,7 +191,8 @@ bool H3DMetaData::GetLayerByIndex(unsigned int lindex, ::stream::LayerData** res } } } - (*response)->set_result(rel); + result.set_result(rel); + (*response)->mutable_data()->PackFrom(result); m_currentLayer = layer; UnLockMainDB(); diff --git a/PrintS/job/H3DMetaData.h b/PrintS/job/H3DMetaData.h index ce7cfb8..906b460 100644 --- a/PrintS/job/H3DMetaData.h +++ b/PrintS/job/H3DMetaData.h @@ -10,7 +10,7 @@ public: ~H3DMetaData(); bool LoadLayerByIndex(unsigned int lindex); - bool GetLayerByIndex(unsigned int lindex, ::stream::LayerData** response); + bool GetLayerByIndex(unsigned int lindex, ::stream::ResponseAny** response); bool LoadLayer(Layer* layer); bool LoadPrevLayer(Layer* layer); bool LoadRemoteLayerByIndex(unsigned int index); diff --git a/PrintS/job/JobMetaData.cpp b/PrintS/job/JobMetaData.cpp index 6b458b2..b65a9ef 100644 --- a/PrintS/job/JobMetaData.cpp +++ b/PrintS/job/JobMetaData.cpp @@ -307,13 +307,14 @@ bool JobMetaData::LoadLayerByIndex(unsigned int lindex) return rel; } -bool JobMetaData::GetLayerByIndex(unsigned int lindex, ::stream::LayerData** response) { +bool JobMetaData::GetLayerByIndex(unsigned int lindex, ::stream::ResponseAny** response) { bool rel = true; if (lindex >= layers->vector_layers.size())return false; LockMainDB(); Layer* layer = layers->vector_layers[lindex]; ClearBlockMap(); vector datablocks = layer->data_blocks; + stream::LayerData result; for (size_t i = 0; i < datablocks.size(); ++i) { BinaryFile* pbf = binary_files[datablocks[i]->bin->file_id]; if (!pbf)break; @@ -329,8 +330,7 @@ bool JobMetaData::GetLayerByIndex(unsigned int lindex, ::stream::LayerData** res m_block_map[datablocks[i]] = pbindb; - - stream::LayerDataBlock* p = (*response)->add_layerdatablock(); + stream::LayerDataBlock* p = result.add_layerdatablock(); p->set_order(datablocks[i]->order); p->set_blocktype(m_block_map[datablocks[i]]->type); size_t count = m_block_map[datablocks[i]]->point_indexs.size(); @@ -358,7 +358,8 @@ bool JobMetaData::GetLayerByIndex(unsigned int lindex, ::stream::LayerData** res } } } - (*response)->set_result(rel); + result.set_result(rel); + (*response)->mutable_data()->PackFrom(result); m_currentLayer = layer; UnLockMainDB(); return rel; diff --git a/PrintS/job/JobMetaData.h b/PrintS/job/JobMetaData.h index be1e1ad..1f71681 100644 --- a/PrintS/job/JobMetaData.h +++ b/PrintS/job/JobMetaData.h @@ -40,7 +40,7 @@ public: ~JobMetaData(); bool LoadFile(string path, string filename, vector& bfileinfos,string binpath); bool LoadLayerByIndex(unsigned int lindex); - bool GetLayerByIndex(unsigned int lindex, ::stream::LayerData** response); + bool GetLayerByIndex(unsigned int lindex, ::stream::ResponseAny** response); bool LoadLayer(Layer* layer); void SetJobContent(JobContent* job_content); bool LoadPrevLayer(Layer* layer); diff --git a/PrintS/job/MetaData.h b/PrintS/job/MetaData.h index 786b772..4a80212 100644 --- a/PrintS/job/MetaData.h +++ b/PrintS/job/MetaData.h @@ -423,7 +423,7 @@ public: virtual ~MetaData(); static void InitTypeMap(); virtual bool LoadLayerByIndex(unsigned int lindex) = 0; - virtual bool GetLayerByIndex(unsigned int lindex, ::stream::LayerData** response) = 0; + virtual bool GetLayerByIndex(unsigned int lindex, ::stream::ResponseAny** response) = 0; virtual bool LoadLayer(Layer* layer) = 0; virtual bool LoadPrevLayer(Layer* layer) = 0; virtual bool LoadPrevLayerByIndex(unsigned int lindex) = 0; diff --git a/PrintS/output/Release/log/2024.hbd b/PrintS/output/Release/log/2024.hbd index d34d62421bde7c06c65f7d99bf8d0f752b83fb28..e84a6872c9aa138131f063c2481aaccc44a590ef 100644 GIT binary patch delta 24783 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%0DVg zy5Aoz6$052uGAN;vCZa`I)4$lRKtU)sMG+Hb%XQ=64R14w|&b)MvdZL;y`sETJ1b2 z*N$(s!o7UE^I*_TlGJPG+YvvZ_g$>*cjAoR4%a30Uu8zXt8?TTz0o5r#m|yjlBU{D z?x{Qc(124~3@E`XP&bo`Y6OpZ`9cE)>IUUQ8Y8p5P zawO##=~8MzHrZ;$S$~|4)8e0<7@}rVGx)tedSSH^`|99b59ieSrOC5mLPF#m?CoIN zg+@WkD;38QJ!J$)VktEf39{+M>9a}lcBdd!NbFCGK4fw? zgp8B-K`du&>n5(a&Vm8G-*{ihO|2)qJoc-x-jv3bG=iT!EPv$EzNYdxK{SM zC}0?_S-L6zHf6cc?C%zrRZM^d5R9n86C6Nuh(SAxi>Oy&R8}FUCx-1_GPgChWT9;3 zsXkJ~2)vsrbTmO(?MArcaIO}w$rTgSm# zy;I2BkJvpvHh;ZetEJ@y;~!;o6>(_w?>M39B{2}+FZ{=2{Pogut5eE{3#!wrNF~cL zjUi7(EB$Z`Ak43|#qtTYdY0S&iI#9&Mw9;!q#ot#zLQ&iizfWSqBV-Rkwg3VI-cJB zJa=%->j@Vqh+cxbk-Zwc=#>VGE#Ju?;5S^>Z0J3cj6ASGOD zxuOQZ1hdR2zZ`=;-I#g;V&mv*7r*tOV^Y~-LrJF1 zejs|BdVkn4N}~#Ev1K7wzd6AI+-cXbbLaY5h35k;9H3(HVJ`adOOXb+Ih)gW=4Fc> zEZgUPr6J4eXwg@a$9C!MSxs}9_=qJo;Pj@tCpHM!5CwUXe( z4K_8YqL!bx@is37z@3;d+*|aa^r^(INk{|qMt_k_`mb6|05Irn8o_Di-S5KGp3JhC zhav(h{LYHXWVg-oK-h_n!%e`R*IZb9)im>14Bf3D4O-x~$_^L?T(?rKra^H*d72dzo=XLmtKZ^VpsJa<9ZfG6ds?vZS4Al~wot{x(= zLCxTSo8W_4m=nMACWfqQ336ac>{Is9WG4JB3Kf2$TAMWD`OhYYilI_-B9i z;Kj!%2J*#tE!QGaWgt~<#D6s< zia#BBAF`6QMYzSCee`2%$ZgD%aa{MPB93DD*Ag`1t%&Igt$%0{LLIm76|R5^*!WrO$+ zI3Q6+SAoH>ZMX}xzQ(G_PT#l2knwYRo1B-ITj%QMXebEC%n~)TmvxA2Lr{4iI6I67 zO!`GwU%2;Rq9celQ;*q&eOMV%%E?B{gy}Vf;vuM)ku=I;bils}&-cnD)PK7L`KfOP z>i(Jd@DG0`e%hLUt)m=V90ppHty*bYfucG?)5tFE5D!|Ml+0$8K0Oa&u}Q+WOqg6; zSGF7nLi?;RuEwv)p&4@yvB&;@BHoQ{A7Q0kJ$F6R(|3p!D z4njEp<^&AXO-`l;L4##lOBxss&r0ED1Te1H|8`u)9x`P6U@s8Ama23S|Y!SC`w1R3KfovUrp-oNht&e zt8j8oniSLxkdw3;zeMg_NKsI46f7tT9w~)W?tt%U&s}txxRs+lPN$U#5x4mkj-oRg zf1J@1>hz`V?8^v{c=xJz(+V@Wkw&B;KBjQ7(?8C=HBMBy^h<}G8GOh*4o`D2nBYJ z$T03wvvHs3P8_lN%yi*H_a>E##EIqH&O%8s3+VuVFbpZ7nZV|cN=zmbUAwo;;@fw}3HL4FvmwyZh zQfZNGwYLS?H5Mrzgs8;~)@Ax}#cN$CmURGoGE?ZdN5CDpt>2kzFFEC(*0==Ggr)gb zby}u#nY|4WW-Njh4X|v`VX@puumnU=tf_CRPk#2bm=q&(@P_||t&tV2wzGTgTnpOH zbrtZy1Amu99@&9tGf$(A313*rcnP8$`3XD(8`&$DWVr43d>xc4$$))>-WO$s>yH#K z+TR@A-pG6*Dk$8HxQQq{eKaOg9NT3SsTGq2+|goX7M4BgN@=vaIjw2Q4#Fvknd4`KcpN{^nWOoKZFCa9aj;$>e``==twn%R!~pq3%O>PEU^OvP0^ zk#bz<78qIlg9wku>c!gK;AnSKx%bU$fHCrO4${5ahW$ zF2ql0lM;k4?g@Cf@h62*dXbZdT&mOe5fDaTbqs^^iPBM+%u_7Yg^iB*ZCnF2pTFYAu;AR0s*;QVSC%JbVJ!0ac{ogT?_yZQSRPV_jpM{Ka0z@Ck2n zhaE)`u3W`^K*a4=?r#klUew>)8dH2`T06Y^QcxN&fWh$03rHfJ4L6aJJ$`}btABTq z&xuqgVrPRp&MLrKaJlnhlt!BI$(=_lfqvA<^{~cOyyWe3hl}&I)YL=~%%)e>XH;@*cg>J|ZJ0)O`Eb-!(l_=0c2)?z6SVN`_*r*YG6IEU(jQNcH> zEg`b)hR23=F+$W`F&4u0D_L7cv3tLq&oViAawXrSV4F4du*9`9a6A5R6w@mJeEH-hVw_wGf=g?u^Y$au0*GA$9c-R6K=och)KPtIfv4DB4tH1`c?! z2J&=6QO5d!X6us#CjgcRo;#0cJx9&4nN2pCk8zL>R?71HJxUk#w@T0p7~Ff7=!6I| z#S%A-x-M?I{_TMWkm8-uGo0X6{N|qvl?kQo z5%W7RU(np5BHe256adWbkk=|h!-h9gi2{iBw|9{|N9Q0*c7mT%lk^<}v15`Qm8l0S zl$jT5KIL$qU`GrnJ=iVQ0dOBz%_NhhUsbRnsZf z%$}MkY@O1w^+5p)q88o>-b?ul@8Y2FL#gi|NPqOps6cPwSqRD zp}TQ((&;#hUvYtzwK}_!Ry#PspY`o!tyi4{nXvw_SPp2q6J(R60CLG1c04_tduzH8 zB%I-xZ}}-jbPDle4%ZO_!2Z?k7!qMrycYBEuEV1; zQd6sp{OFOnebvWyk+TPycn$IDu$bY}bWYHR~hrkZeY9|9CA<#Zo{F#+L zqtdzw?+zT;u;z>kq^^H4ZDPPn?yLjzpUUsy&%tu2zvK=kqNYsUrp$=mrfZ<_s1>^L zVzMWfr;dVV{h@H~RWG7<>+7eB%Ep6}c%QFz$nk4z6b1P)bt3UTET zc7Lc_Xcjn+2_w7S`%Obx|rjG_e zQqN&^I@bNFPk2M;D$r?vkQ=#NE}-Pe)`Vy?^eT&PYgyn&O4}M!FQ|*@GGb*KE_>Kj-jaHX+{Zc@XrtXiRKYa{(to2YzZSv zHjJ??Gf7z6j+;BPZo!>)ZaL@(YQtJ+EX{}fL}%{4UYoEa02*`lgQ9Iefpt5&+(Z50 z`ss822a&}K9f-xM@G-cDbsefLo*SWWt(v}98QPrYE&I_~^JVCgr7D#hNxrV04 za18|NChsciFn7>r>(D%w`dw}&dyjYtErAK;K!LhKwSDcVqKTjKvm(8D?3gq_@QC`K zzm!>3B@HI$NbLkV1~Sl({1hNmud!0S4H`hTB#HpIMb zdGD>IdT>^t|Aj1^9$ww(K)<7oTNM!cU<}F{a zyDU9aQigYh=ZB%Eshu(#@Kod&dYwn z?M6{3>B!r2R^zJ0@RsT5*lDD^&AXY6I=XYd*a}NQfgQvd|}bpxdOz1yv-1r zC{e}(l_ZWk%dvqO%bN$gB%ZNkU?vcdMU|v^pN~NU05ocgoJ_OkDWuA%HIH^ph3bDp zMxf<&0Yfk|YfH(S5}0{iF!n0@+A!Ve1S^y={g1m>hxi723IxRjt&}b2i}+q*mgE7`)Jx~pwc7nQ^BSMF z!4Aeo=9+Y&F_GS7xfA(ShXCgGz`lRsysr5VwG@evqBGTjy5}QB#V@VS?ZCH;aA)p- zo=`Vh_5huwbKt`8NTtTph>#DU^XlndgincZ@mA*HFEOkb{>?}x&W-KjyE?6dJ1&Lmw=zBemp8@ak?9K6Z4-NV=_YnE-LPtKyt%q-0Ib45vDkEu}?gE#k zb}mPxlu;Le!djV%=-fp4Fb(~g)H90VP>p|r_0j+2Ed>GpAFFCEr)twIX@=@AlJn8r z^n@s@-kxW$(70D0%&nfU95nG>nSldc9mF?k4rXeW+^(-NoTC1tf@x=;!~B8qFkL}g znLAx290ZDKZicy_Q^kK$7sd}z?}A_z?KIM)r0#j?8L_^U=9HN|| zrIxH1#fK-v@2A13vUPu%QJY5sMX2K*v$ z_QZY@JU-~^sj~9J6ag*wp`r$XY=j|D%l0|Mo-*AcpZ-E2FzB@MRb;}oX4GX5DK@@= z1O;`k9}A8WlOcZ{GJ9`uFlwl|^mree3@nXt2TNM7OHY6;uRzDUY+(Vnd}7haN^Vc3 z%qh1{^CK9fwPbUwA0ym{xBzIfaw|l@qmtu_1exq`e_Dc0C$lyT8`~NrJ-cKX8o>vz z?q|wwhyz`lgB8hj2~vFDT|`|ryb)pbQ+;aE|M^7Y8mWH^6-wrM%^C+FsXIBmu#x`y zY~>~`nR;}SYMk|zjStS%q32c4jt8&E1SZNjQ(yA^p*lp?3;E;RYxsI7{}UwIp)p9x z9JF*atq*Oi3km&Xug+uGr;58R(#aO|Z3TYw1#qAt zeaL+AH&uTDLUHtJsTr#oHU>LA zzeMfw$*p(>!1Ek*(gW)tDzH}OIA1XAk?EZ~c%Fa%fc(Glnh7=~$HMSB!U*}kk%M7( zi8Am)g5N*KYX<(Vr`21bS84U9*tddPVIOmC1UF6;nfl{ z$^_Zu8uok_MZJj|K(!=s@!BSwG};{oPKIa&JZFO2ir!vEw+NBp${TB73x~pWnmBQG!cGh|{evKc5JEw-5%@qBn64yoIf(tPReg7{z zC=b`=VJ~L7FA*c>Ce~ELlNZnZjf^fD( z@APUta-{Xk5?lt61FvYptouEuK@%wT7~x%)RQOM?X#s88(U}*86mXG}&8k8c5VeLQaw-(|{;63=*Rd4P*n{KJycSjW99mRlhz(Iu{v`5OlAF zgA~P;O6@=S)BBK7un)rU#tVN$5_>C4dw%d7`TgOlS&P2c6A)pHIKwBgJ1rlgfS;mw zqg0D-@`hU_P3C8SNplsm=mfboLl+qbWCC+?4H^c9$G5N7TCjmO1T?Gn|2(53yli5+k^{g9lf8F&UA{H%s$OATZ-t8&ii7owk zv~2`&J#yFc+>Bb$=mUQo(a7*{0rJ%usVk?tAl2WJTr(O|)Gme^w* zTDx8^Ak(^VchaNSrW{2BOh03@{>AoR$or0S#xLKUi#oN|K`S67nt z2oCVmz`E|))^%MO!mdIz5oJQS;v`53Sm(bLA2$SqKYod6xMF2gjR}>qUC+-9(Vs82 zN&UohWtS1k4jXK5;y<}pbS(zNk~-nABsDeS@r=`?Jxqopnvr@$Bl@v3#a^tPI*5cE zLqXMh30{APKVXI*Wt?-IC$IX(?({Gv*tc)>1M4N*rA=;L|`w_~d_|BzBMQ&ITLt7qidN~LIG0AIY{i2nPK+&^mV z`yR&wc85tTzWj`i+Z+~iB6!-; zo&Rsku;0ea?$C?D+c?q!Zzw$MrOm3>I(ZC^sn09)Qr((~#XXd-tbfs$V_9ZsSXfmby zTl;@5W!5(O_0shVDfx$1>R21%*dx$TzO53X_AydmBQ+7vZjpyyg^3hoV~GyEfawqu zB_>i_SYN{^C@&X;2h;UNeIP#vx1xVyl2&9?5>&%QaPldaxLnw5K?b6=emEA z8%5rhFSzdwEhPX$X)COw@+RU%_=0XMga5n$LexO|8{xQT=f;cIT&Z#lUL~3ynP_>cBDhUocn-Hs=UJ)Dhb!Sf=kV)aX3M&5Ed4P&XLofuH zVMlZ$6;8v4HVUTehrmOKuOi9!{QG~6J3_ytjLi>K)P+Rd!=Qt;YJD3buyk<+u{3af|t zoe(v8qqGiFx?h$~8hA{5|u!i*umc z;sANgi3Se$l7v3`WA5+8-!6+spV81_+m0DtnpU;rj+fCvOiu zc`$UxF0@j&3=(ldh4M9fB@v|C>&f_N+sm8~s9DoeXpd& channel, co , rpcmethod_AllStream_(Stream_method_names[3], options.suffix_for_stats(),::grpc::internal::RpcMethod::BIDI_STREAMING, channel) {} -::grpc::Status Stream::Stub::Simple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::stream::LayerData* response) { - return ::grpc::internal::BlockingUnaryCall< ::stream::RequestInfo, ::stream::LayerData, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Simple_, context, request, response); +::grpc::Status Stream::Stub::Simple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::stream::ResponseAny* response) { + return ::grpc::internal::BlockingUnaryCall< ::stream::RequestInfo, ::stream::ResponseAny, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Simple_, context, request, response); } -void Stream::Stub::async::Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response, std::function f) { - ::grpc::internal::CallbackUnaryCall< ::stream::RequestInfo, ::stream::LayerData, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Simple_, context, request, response, std::move(f)); +void Stream::Stub::async::Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response, std::function f) { + ::grpc::internal::CallbackUnaryCall< ::stream::RequestInfo, ::stream::ResponseAny, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Simple_, context, request, response, std::move(f)); } -void Stream::Stub::async::Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response, ::grpc::ClientUnaryReactor* reactor) { +void Stream::Stub::async::Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response, ::grpc::ClientUnaryReactor* reactor) { ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Simple_, context, request, response, reactor); } -::grpc::ClientAsyncResponseReader< ::stream::LayerData>* Stream::Stub::PrepareAsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { - return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::stream::LayerData, ::stream::RequestInfo, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Simple_, context, request); +::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>* Stream::Stub::PrepareAsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { + return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::stream::ResponseAny, ::stream::RequestInfo, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Simple_, context, request); } -::grpc::ClientAsyncResponseReader< ::stream::LayerData>* Stream::Stub::AsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { +::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>* Stream::Stub::AsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { auto* result = this->PrepareAsyncSimpleRaw(context, request, cq); result->StartCall(); @@ -116,11 +116,11 @@ Stream::Service::Service() { AddMethod(new ::grpc::internal::RpcServiceMethod( Stream_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, - new ::grpc::internal::RpcMethodHandler< Stream::Service, ::stream::RequestInfo, ::stream::LayerData, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( + new ::grpc::internal::RpcMethodHandler< Stream::Service, ::stream::RequestInfo, ::stream::ResponseAny, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( [](Stream::Service* service, ::grpc::ServerContext* ctx, const ::stream::RequestInfo* req, - ::stream::LayerData* resp) { + ::stream::ResponseAny* resp) { return service->Simple(ctx, req, resp); }, this))); AddMethod(new ::grpc::internal::RpcServiceMethod( @@ -158,7 +158,7 @@ Stream::Service::Service() { Stream::Service::~Service() { } -::grpc::Status Stream::Service::Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response) { +::grpc::Status Stream::Service::Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response) { (void) context; (void) request; (void) response; diff --git a/PrintS/protobuf/stream.grpc.pb.h b/PrintS/protobuf/stream.grpc.pb.h index f5a022a..f4a53ec 100644 --- a/PrintS/protobuf/stream.grpc.pb.h +++ b/PrintS/protobuf/stream.grpc.pb.h @@ -37,12 +37,12 @@ class Stream final { class StubInterface { public: virtual ~StubInterface() {} - virtual ::grpc::Status Simple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::stream::LayerData* response) = 0; - std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::LayerData>> AsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { - return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::LayerData>>(AsyncSimpleRaw(context, request, cq)); + virtual ::grpc::Status Simple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::stream::ResponseAny* response) = 0; + std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::ResponseAny>> AsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::ResponseAny>>(AsyncSimpleRaw(context, request, cq)); } - std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::LayerData>> PrepareAsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { - return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::LayerData>>(PrepareAsyncSimpleRaw(context, request, cq)); + std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::ResponseAny>> PrepareAsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stream::ResponseAny>>(PrepareAsyncSimpleRaw(context, request, cq)); } std::unique_ptr< ::grpc::ClientReaderInterface< ::stream::ResponseInfo>> ServerStream(::grpc::ClientContext* context, const ::stream::RequestInfo& request) { return std::unique_ptr< ::grpc::ClientReaderInterface< ::stream::ResponseInfo>>(ServerStreamRaw(context, request)); @@ -74,8 +74,8 @@ class Stream final { class async_interface { public: virtual ~async_interface() {} - virtual void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response, std::function) = 0; - virtual void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response, ::grpc::ClientUnaryReactor* reactor) = 0; + virtual void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response, std::function) = 0; + virtual void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response, ::grpc::ClientUnaryReactor* reactor) = 0; virtual void ServerStream(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::grpc::ClientReadReactor< ::stream::ResponseInfo>* reactor) = 0; virtual void ClientStream(::grpc::ClientContext* context, ::stream::ResponseInfo* response, ::grpc::ClientWriteReactor< ::stream::RequestInfo>* reactor) = 0; virtual void AllStream(::grpc::ClientContext* context, ::grpc::ClientBidiReactor< ::stream::RequestInfo,::stream::ResponseInfo>* reactor) = 0; @@ -84,8 +84,8 @@ class Stream final { virtual class async_interface* async() { return nullptr; } class async_interface* experimental_async() { return async(); } private: - virtual ::grpc::ClientAsyncResponseReaderInterface< ::stream::LayerData>* AsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) = 0; - virtual ::grpc::ClientAsyncResponseReaderInterface< ::stream::LayerData>* PrepareAsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) = 0; + virtual ::grpc::ClientAsyncResponseReaderInterface< ::stream::ResponseAny>* AsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) = 0; + virtual ::grpc::ClientAsyncResponseReaderInterface< ::stream::ResponseAny>* PrepareAsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) = 0; virtual ::grpc::ClientReaderInterface< ::stream::ResponseInfo>* ServerStreamRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request) = 0; virtual ::grpc::ClientAsyncReaderInterface< ::stream::ResponseInfo>* AsyncServerStreamRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq, void* tag) = 0; virtual ::grpc::ClientAsyncReaderInterface< ::stream::ResponseInfo>* PrepareAsyncServerStreamRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) = 0; @@ -99,12 +99,12 @@ class Stream final { class Stub final : public StubInterface { public: Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions()); - ::grpc::Status Simple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::stream::LayerData* response) override; - std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::LayerData>> AsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { - return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::LayerData>>(AsyncSimpleRaw(context, request, cq)); + ::grpc::Status Simple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::stream::ResponseAny* response) override; + std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>> AsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>>(AsyncSimpleRaw(context, request, cq)); } - std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::LayerData>> PrepareAsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { - return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::LayerData>>(PrepareAsyncSimpleRaw(context, request, cq)); + std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>> PrepareAsyncSimple(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>>(PrepareAsyncSimpleRaw(context, request, cq)); } std::unique_ptr< ::grpc::ClientReader< ::stream::ResponseInfo>> ServerStream(::grpc::ClientContext* context, const ::stream::RequestInfo& request) { return std::unique_ptr< ::grpc::ClientReader< ::stream::ResponseInfo>>(ServerStreamRaw(context, request)); @@ -136,8 +136,8 @@ class Stream final { class async final : public StubInterface::async_interface { public: - void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response, std::function) override; - void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response, ::grpc::ClientUnaryReactor* reactor) override; + void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response, std::function) override; + void Simple(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response, ::grpc::ClientUnaryReactor* reactor) override; void ServerStream(::grpc::ClientContext* context, const ::stream::RequestInfo* request, ::grpc::ClientReadReactor< ::stream::ResponseInfo>* reactor) override; void ClientStream(::grpc::ClientContext* context, ::stream::ResponseInfo* response, ::grpc::ClientWriteReactor< ::stream::RequestInfo>* reactor) override; void AllStream(::grpc::ClientContext* context, ::grpc::ClientBidiReactor< ::stream::RequestInfo,::stream::ResponseInfo>* reactor) override; @@ -152,8 +152,8 @@ class Stream final { private: std::shared_ptr< ::grpc::ChannelInterface> channel_; class async async_stub_{this}; - ::grpc::ClientAsyncResponseReader< ::stream::LayerData>* AsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) override; - ::grpc::ClientAsyncResponseReader< ::stream::LayerData>* PrepareAsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) override; + ::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>* AsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) override; + ::grpc::ClientAsyncResponseReader< ::stream::ResponseAny>* PrepareAsyncSimpleRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) override; ::grpc::ClientReader< ::stream::ResponseInfo>* ServerStreamRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request) override; ::grpc::ClientAsyncReader< ::stream::ResponseInfo>* AsyncServerStreamRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq, void* tag) override; ::grpc::ClientAsyncReader< ::stream::ResponseInfo>* PrepareAsyncServerStreamRaw(::grpc::ClientContext* context, const ::stream::RequestInfo& request, ::grpc::CompletionQueue* cq) override; @@ -174,7 +174,7 @@ class Stream final { public: Service(); virtual ~Service(); - virtual ::grpc::Status Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response); + virtual ::grpc::Status Simple(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response); virtual ::grpc::Status ServerStream(::grpc::ServerContext* context, const ::stream::RequestInfo* request, ::grpc::ServerWriter< ::stream::ResponseInfo>* writer); virtual ::grpc::Status ClientStream(::grpc::ServerContext* context, ::grpc::ServerReader< ::stream::RequestInfo>* reader, ::stream::ResponseInfo* response); virtual ::grpc::Status AllStream(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< ::stream::ResponseInfo, ::stream::RequestInfo>* stream); @@ -191,11 +191,11 @@ class Stream final { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method - ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::LayerData* /*response*/) override { + ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::ResponseAny* /*response*/) override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } - void RequestSimple(::grpc::ServerContext* context, ::stream::RequestInfo* request, ::grpc::ServerAsyncResponseWriter< ::stream::LayerData>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) { + void RequestSimple(::grpc::ServerContext* context, ::stream::RequestInfo* request, ::grpc::ServerAsyncResponseWriter< ::stream::ResponseAny>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) { ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag); } }; @@ -267,25 +267,25 @@ class Stream final { public: WithCallbackMethod_Simple() { ::grpc::Service::MarkMethodCallback(0, - new ::grpc::internal::CallbackUnaryHandler< ::stream::RequestInfo, ::stream::LayerData>( + new ::grpc::internal::CallbackUnaryHandler< ::stream::RequestInfo, ::stream::ResponseAny>( [this]( - ::grpc::CallbackServerContext* context, const ::stream::RequestInfo* request, ::stream::LayerData* response) { return this->Simple(context, request, response); }));} + ::grpc::CallbackServerContext* context, const ::stream::RequestInfo* request, ::stream::ResponseAny* response) { return this->Simple(context, request, response); }));} void SetMessageAllocatorFor_Simple( - ::grpc::MessageAllocator< ::stream::RequestInfo, ::stream::LayerData>* allocator) { + ::grpc::MessageAllocator< ::stream::RequestInfo, ::stream::ResponseAny>* allocator) { ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(0); - static_cast<::grpc::internal::CallbackUnaryHandler< ::stream::RequestInfo, ::stream::LayerData>*>(handler) + static_cast<::grpc::internal::CallbackUnaryHandler< ::stream::RequestInfo, ::stream::ResponseAny>*>(handler) ->SetMessageAllocator(allocator); } ~WithCallbackMethod_Simple() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method - ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::LayerData* /*response*/) override { + ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::ResponseAny* /*response*/) override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } virtual ::grpc::ServerUnaryReactor* Simple( - ::grpc::CallbackServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::LayerData* /*response*/) { return nullptr; } + ::grpc::CallbackServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::ResponseAny* /*response*/) { return nullptr; } }; template class WithCallbackMethod_ServerStream : public BaseClass { @@ -368,7 +368,7 @@ class Stream final { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method - ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::LayerData* /*response*/) override { + ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::ResponseAny* /*response*/) override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } @@ -436,7 +436,7 @@ class Stream final { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method - ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::LayerData* /*response*/) override { + ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::ResponseAny* /*response*/) override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } @@ -519,7 +519,7 @@ class Stream final { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method - ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::LayerData* /*response*/) override { + ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::ResponseAny* /*response*/) override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } @@ -601,10 +601,10 @@ class Stream final { WithStreamedUnaryMethod_Simple() { ::grpc::Service::MarkMethodStreamed(0, new ::grpc::internal::StreamedUnaryHandler< - ::stream::RequestInfo, ::stream::LayerData>( + ::stream::RequestInfo, ::stream::ResponseAny>( [this](::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< - ::stream::RequestInfo, ::stream::LayerData>* streamer) { + ::stream::RequestInfo, ::stream::ResponseAny>* streamer) { return this->StreamedSimple(context, streamer); })); @@ -613,12 +613,12 @@ class Stream final { BaseClassMustBeDerivedFromService(this); } // disable regular version of this method - ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::LayerData* /*response*/) override { + ::grpc::Status Simple(::grpc::ServerContext* /*context*/, const ::stream::RequestInfo* /*request*/, ::stream::ResponseAny* /*response*/) override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } // replace default version of method with streamed unary - virtual ::grpc::Status StreamedSimple(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::stream::RequestInfo,::stream::LayerData>* server_unary_streamer) = 0; + virtual ::grpc::Status StreamedSimple(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::stream::RequestInfo,::stream::ResponseAny>* server_unary_streamer) = 0; }; typedef WithStreamedUnaryMethod_Simple StreamedUnaryService; template diff --git a/PrintS/protobuf/stream.pb.cc b/PrintS/protobuf/stream.pb.cc index 5dcdb95..80d4d87 100644 --- a/PrintS/protobuf/stream.pb.cc +++ b/PrintS/protobuf/stream.pb.cc @@ -89,6 +89,23 @@ struct ResponseInfoDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ResponseInfoDefaultTypeInternal _ResponseInfo_default_instance_; template +PROTOBUF_CONSTEXPR ResponseAny::ResponseAny(::_pbi::ConstantInitialized) + : _impl_{ + /*decltype(_impl_._has_bits_)*/ {}, + /*decltype(_impl_._cached_size_)*/ {}, + /*decltype(_impl_.data_)*/ nullptr, + } {} +struct ResponseAnyDefaultTypeInternal { + PROTOBUF_CONSTEXPR ResponseAnyDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} + ~ResponseAnyDefaultTypeInternal() {} + union { + ResponseAny _instance; + }; +}; + +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT + PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ResponseAnyDefaultTypeInternal _ResponseAny_default_instance_; + template PROTOBUF_CONSTEXPR LayerData::LayerData(::_pbi::ConstantInitialized) : _impl_{ /*decltype(_impl_.layerdatablock_)*/ {}, @@ -183,7 +200,7 @@ struct PointDefaultTypeInternal { PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 PointDefaultTypeInternal _Point_default_instance_; } // namespace stream -static ::_pb::Metadata file_level_metadata_stream_2eproto[8]; +static ::_pb::Metadata file_level_metadata_stream_2eproto[9]; static const ::_pb::EnumDescriptor* file_level_enum_descriptors_stream_2eproto[1]; static constexpr const ::_pb::ServiceDescriptor** file_level_service_descriptors_stream_2eproto = nullptr; @@ -223,6 +240,16 @@ const ::uint32_t TableStruct_stream_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE PROTOBUF_FIELD_OFFSET(::stream::ResponseInfo, _impl_.datatype_), PROTOBUF_FIELD_OFFSET(::stream::ResponseInfo, _impl_.result_), PROTOBUF_FIELD_OFFSET(::stream::ResponseInfo, _impl_.item_), + PROTOBUF_FIELD_OFFSET(::stream::ResponseAny, _impl_._has_bits_), + PROTOBUF_FIELD_OFFSET(::stream::ResponseAny, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + ~0u, // no _split_ + ~0u, // no sizeof(Split) + PROTOBUF_FIELD_OFFSET(::stream::ResponseAny, _impl_.data_), + 0, ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::stream::LayerData, _internal_metadata_), ~0u, // no _extensions_ @@ -289,17 +316,19 @@ static const ::_pbi::MigrationSchema {0, -1, -1, sizeof(::stream::ParamInfo)}, {11, -1, -1, sizeof(::stream::RequestInfo)}, {23, -1, -1, sizeof(::stream::ResponseInfo)}, - {34, -1, -1, sizeof(::stream::LayerData)}, - {47, -1, -1, sizeof(::stream::LayerDataBlock)}, - {61, -1, -1, sizeof(::stream::VectorDataBlock)}, - {73, -1, -1, sizeof(::stream::ChainDataBlock)}, - {83, -1, -1, sizeof(::stream::Point)}, + {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)}, }; static const ::_pb::Message* const file_default_instances[] = { &::stream::_ParamInfo_default_instance_._instance, &::stream::_RequestInfo_default_instance_._instance, &::stream::_ResponseInfo_default_instance_._instance, + &::stream::_ResponseAny_default_instance_._instance, &::stream::_LayerData_default_instance_._instance, &::stream::_LayerDataBlock_default_instance_._instance, &::stream::_VectorDataBlock_default_instance_._instance, @@ -307,30 +336,32 @@ static const ::_pb::Message* const file_default_instances[] = { &::stream::_Point_default_instance_._instance, }; const char descriptor_table_protodef_stream_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { - "\n\014stream.proto\022\006stream\"O\n\tParamInfo\022\017\n\007n" - "ameKey\030\001 \001(\014\022\020\n\010strValue\030\002 \001(\014\022\037\n\tvalueT" - "ype\030\003 \001(\0162\014.stream.TYPE\"c\n\013RequestInfo\022\020" - "\n\010dataType\030\001 \001(\r\022\017\n\007nameKey\030\002 \001(\014\022\020\n\010str" - "Value\030\003 \001(\014\022\037\n\tvalueType\030\004 \001(\0162\014.stream." - "TYPE\"Q\n\014ResponseInfo\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.Pa" - "ramInfo\"\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.Laye" - "rDataBlock\022\016\n\006result\030\005 \001(\010\"\266\001\n\016LayerData" - "Block\022\021\n\telementId\030\001 \001(\005\022\026\n\016elementParam" - "Id\030\002 \001(\005\022\021\n\tblockType\030\003 \001(\r\022*\n\tvecBlocks" - "\030\004 \003(\0132\027.stream.VectorDataBlock\022+\n\013chain" - "Blocks\030\005 \003(\0132\026.stream.ChainDataBlock\022\r\n\005" - "order\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\004" - "endY\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" - "\005Point\022\014\n\004xPos\030\001 \001(\002\022\014\n\004yPos\030\002 \001(\002*X\n\004TY" - "PE\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\006iFLOAT\020\005\022\013\n\007iSTRI" - "NG\020\0062\370\001\n\006Stream\0222\n\006Simple\022\023.stream.Reque" - "stInfo\032\021.stream.LayerData\"\000\022=\n\014ServerStr" + "\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*X\n\004TYPE" + "\022\t\n\005iBOOL\020\000\022\n\n\006iSHORT\020\001\022\013\n\007iUSHORT\020\002\022\010\n\004" + "iINT\020\003\022\t\n\005iUINT\020\004\022\n\n\006iFLOAT\020\005\022\013\n\007iSTRING" + "\020\0062\372\001\n\006Stream\0224\n\006Simple\022\023.stream.Request" + "Info\032\023.stream.ResponseAny\"\000\022=\n\014ServerStr" "eam\022\023.stream.RequestInfo\032\024.stream.Respon" "seInfo\"\0000\001\022=\n\014ClientStream\022\023.stream.Requ" "estInfo\032\024.stream.ResponseInfo\"\000(\001\022<\n\tAll" @@ -338,17 +369,21 @@ const char descriptor_table_protodef_stream_2eproto[] PROTOBUF_SECTION_VARIABLE( "ponseInfo\"\000(\0010\001B-\n\027io.grpc.examples.stre" "amB\013StreamProtoP\001\242\002\002STb\006proto3" }; +static const ::_pbi::DescriptorTable* const descriptor_table_stream_2eproto_deps[1] = + { + &::descriptor_table_google_2fprotobuf_2fany_2eproto, +}; static ::absl::once_flag descriptor_table_stream_2eproto_once; const ::_pbi::DescriptorTable descriptor_table_stream_2eproto = { false, false, - 1190, + 1270, descriptor_table_protodef_stream_2eproto, "stream.proto", &descriptor_table_stream_2eproto_once, - nullptr, - 0, - 8, + descriptor_table_stream_2eproto_deps, + 1, + 9, schemas, file_default_instances, TableStruct_stream_2eproto::offsets, @@ -1163,6 +1198,208 @@ void ResponseInfo::InternalSwap(ResponseInfo* other) { } // =================================================================== +class ResponseAny::_Internal { + public: + using HasBits = decltype(std::declval()._impl_._has_bits_); + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(ResponseAny, _impl_._has_bits_); + static const ::google::protobuf::Any& data(const ResponseAny* msg); + static void set_has_data(HasBits* has_bits) { + (*has_bits)[0] |= 1u; + } +}; + +const ::google::protobuf::Any& ResponseAny::_Internal::data(const ResponseAny* msg) { + return *msg->_impl_.data_; +} +void ResponseAny::clear_data() { + if (_impl_.data_ != nullptr) _impl_.data_->Clear(); + _impl_._has_bits_[0] &= ~0x00000001u; +} +ResponseAny::ResponseAny(::google::protobuf::Arena* arena) + : ::google::protobuf::Message(arena) { + SharedCtor(arena); + // @@protoc_insertion_point(arena_constructor:stream.ResponseAny) +} +ResponseAny::ResponseAny(const ResponseAny& from) : ::google::protobuf::Message() { + ResponseAny* const _this = this; + (void)_this; + new (&_impl_) Impl_{ + decltype(_impl_._has_bits_){from._impl_._has_bits_}, + /*decltype(_impl_._cached_size_)*/ {}, + decltype(_impl_.data_){nullptr}, + }; + _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( + from._internal_metadata_); + if ((from._impl_._has_bits_[0] & 0x00000001u) != 0) { + _this->_impl_.data_ = new ::google::protobuf::Any(*from._impl_.data_); + } + + // @@protoc_insertion_point(copy_constructor:stream.ResponseAny) +} +inline void ResponseAny::SharedCtor(::_pb::Arena* arena) { + (void)arena; + new (&_impl_) Impl_{ + decltype(_impl_._has_bits_){}, + /*decltype(_impl_._cached_size_)*/ {}, + decltype(_impl_.data_){nullptr}, + }; +} +ResponseAny::~ResponseAny() { + // @@protoc_insertion_point(destructor:stream.ResponseAny) + _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); + SharedDtor(); +} +inline void ResponseAny::SharedDtor() { + ABSL_DCHECK(GetArenaForAllocation() == nullptr); + if (this != internal_default_instance()) delete _impl_.data_; +} +void ResponseAny::SetCachedSize(int size) const { + _impl_._cached_size_.Set(size); +} + +PROTOBUF_NOINLINE void ResponseAny::Clear() { +// @@protoc_insertion_point(message_clear_start:stream.ResponseAny) + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000001u) { + ABSL_DCHECK(_impl_.data_ != nullptr); + _impl_.data_->Clear(); + } + _impl_._has_bits_.Clear(); + _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); +} + +const char* ResponseAny::_InternalParse( + const char* ptr, ::_pbi::ParseContext* ctx) { + ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header); + return ptr; +} + + +PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 +const ::_pbi::TcParseTable<0, 1, 1, 0, 2> ResponseAny::_table_ = { + { + PROTOBUF_FIELD_OFFSET(ResponseAny, _impl_._has_bits_), + 0, // no _extensions_ + 1, 0, // max_field_number, fast_idx_mask + offsetof(decltype(_table_), field_lookup_table), + 4294967294, // skipmap + offsetof(decltype(_table_), field_entries), + 1, // num_field_entries + 1, // num_aux_entries + offsetof(decltype(_table_), aux_entries), + &_ResponseAny_default_instance_._instance, + ::_pbi::TcParser::GenericFallback, // fallback + }, {{ + // .google.protobuf.Any data = 1; + {::_pbi::TcParser::FastMtS1, + {10, 0, 0, PROTOBUF_FIELD_OFFSET(ResponseAny, _impl_.data_)}}, + }}, {{ + 65535, 65535 + }}, {{ + // .google.protobuf.Any data = 1; + {PROTOBUF_FIELD_OFFSET(ResponseAny, _impl_.data_), _Internal::kHasBitsOffset + 0, 0, + (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)}, + }}, {{ + {::_pbi::TcParser::GetTable<::google::protobuf::Any>()}, + }}, {{ + }}, +}; + +::uint8_t* ResponseAny::_InternalSerialize( + ::uint8_t* target, + ::google::protobuf::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:stream.ResponseAny) + ::uint32_t cached_has_bits = 0; + (void)cached_has_bits; + + cached_has_bits = _impl_._has_bits_[0]; + // .google.protobuf.Any data = 1; + if (cached_has_bits & 0x00000001u) { + target = ::google::protobuf::internal::WireFormatLite:: + InternalWriteMessage(1, _Internal::data(this), + _Internal::data(this).GetCachedSize(), target, stream); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = + ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:stream.ResponseAny) + return target; +} + +::size_t ResponseAny::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:stream.ResponseAny) + ::size_t total_size = 0; + + ::uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // .google.protobuf.Any data = 1; + cached_has_bits = _impl_._has_bits_[0]; + if (cached_has_bits & 0x00000001u) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize( + *_impl_.data_); + } + + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); +} + +const ::google::protobuf::Message::ClassData ResponseAny::_class_data_ = { + ::google::protobuf::Message::CopyWithSourceCheck, + ResponseAny::MergeImpl +}; +const ::google::protobuf::Message::ClassData*ResponseAny::GetClassData() const { return &_class_data_; } + + +void ResponseAny::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) { + auto* const _this = static_cast(&to_msg); + auto& from = static_cast(from_msg); + // @@protoc_insertion_point(class_specific_merge_from_start:stream.ResponseAny) + ABSL_DCHECK_NE(&from, _this); + ::uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + if ((from._impl_._has_bits_[0] & 0x00000001u) != 0) { + _this->_internal_mutable_data()->::google::protobuf::Any::MergeFrom( + from._internal_data()); + } + _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); +} + +void ResponseAny::CopyFrom(const ResponseAny& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:stream.ResponseAny) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +PROTOBUF_NOINLINE bool ResponseAny::IsInitialized() const { + return true; +} + +void ResponseAny::InternalSwap(ResponseAny* other) { + using std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); + swap(_impl_.data_, other->_impl_.data_); +} + +::google::protobuf::Metadata ResponseAny::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_stream_2eproto_getter, &descriptor_table_stream_2eproto_once, + file_level_metadata_stream_2eproto[3]); +} +// =================================================================== + class LayerData::_Internal { public: }; @@ -1483,7 +1720,7 @@ void LayerData::InternalSwap(LayerData* other) { ::google::protobuf::Metadata LayerData::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_stream_2eproto_getter, &descriptor_table_stream_2eproto_once, - file_level_metadata_stream_2eproto[3]); + file_level_metadata_stream_2eproto[4]); } // =================================================================== @@ -1792,7 +2029,7 @@ void LayerDataBlock::InternalSwap(LayerDataBlock* other) { ::google::protobuf::Metadata LayerDataBlock::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_stream_2eproto_getter, &descriptor_table_stream_2eproto_once, - file_level_metadata_stream_2eproto[4]); + file_level_metadata_stream_2eproto[5]); } // =================================================================== @@ -2090,7 +2327,7 @@ void VectorDataBlock::InternalSwap(VectorDataBlock* other) { ::google::protobuf::Metadata VectorDataBlock::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_stream_2eproto_getter, &descriptor_table_stream_2eproto_once, - file_level_metadata_stream_2eproto[5]); + file_level_metadata_stream_2eproto[6]); } // =================================================================== @@ -2289,7 +2526,7 @@ void ChainDataBlock::InternalSwap(ChainDataBlock* other) { ::google::protobuf::Metadata ChainDataBlock::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_stream_2eproto_getter, &descriptor_table_stream_2eproto_once, - file_level_metadata_stream_2eproto[6]); + file_level_metadata_stream_2eproto[7]); } // =================================================================== @@ -2513,7 +2750,7 @@ void Point::InternalSwap(Point* other) { ::google::protobuf::Metadata Point::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_stream_2eproto_getter, &descriptor_table_stream_2eproto_once, - file_level_metadata_stream_2eproto[7]); + file_level_metadata_stream_2eproto[8]); } // @@protoc_insertion_point(namespace_scope) } // namespace stream diff --git a/PrintS/protobuf/stream.pb.h b/PrintS/protobuf/stream.pb.h index 71d53c0..f2960a0 100644 --- a/PrintS/protobuf/stream.pb.h +++ b/PrintS/protobuf/stream.pb.h @@ -33,6 +33,7 @@ #include "google/protobuf/extension_set.h" // IWYU pragma: export #include "google/protobuf/generated_enum_reflection.h" #include "google/protobuf/unknown_field_set.h" +#include "google/protobuf/any.pb.h" // @@protoc_insertion_point(includes) // Must be included last. @@ -73,6 +74,9 @@ extern PointDefaultTypeInternal _Point_default_instance_; class RequestInfo; struct RequestInfoDefaultTypeInternal; extern RequestInfoDefaultTypeInternal _RequestInfo_default_instance_; +class ResponseAny; +struct ResponseAnyDefaultTypeInternal; +extern ResponseAnyDefaultTypeInternal _ResponseAny_default_instance_; class ResponseInfo; struct ResponseInfoDefaultTypeInternal; extern ResponseInfoDefaultTypeInternal _ResponseInfo_default_instance_; @@ -719,6 +723,170 @@ class ResponseInfo final : friend struct ::TableStruct_stream_2eproto; };// ------------------------------------------------------------------- +class ResponseAny final : + public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:stream.ResponseAny) */ { + public: + inline ResponseAny() : ResponseAny(nullptr) {} + ~ResponseAny() override; + template + explicit PROTOBUF_CONSTEXPR ResponseAny(::google::protobuf::internal::ConstantInitialized); + + ResponseAny(const ResponseAny& from); + ResponseAny(ResponseAny&& from) noexcept + : ResponseAny() { + *this = ::std::move(from); + } + + inline ResponseAny& operator=(const ResponseAny& from) { + CopyFrom(from); + return *this; + } + inline ResponseAny& operator=(ResponseAny&& from) noexcept { + if (this == &from) return *this; + if (GetOwningArena() == from.GetOwningArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetOwningArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); + } + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); + } + + static const ::google::protobuf::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::google::protobuf::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::google::protobuf::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const ResponseAny& default_instance() { + return *internal_default_instance(); + } + static inline const ResponseAny* internal_default_instance() { + return reinterpret_cast( + &_ResponseAny_default_instance_); + } + static constexpr int kIndexInFileMessages = + 3; + + friend void swap(ResponseAny& a, ResponseAny& b) { + a.Swap(&b); + } + inline void Swap(ResponseAny* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetOwningArena() != nullptr && + GetOwningArena() == other->GetOwningArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetOwningArena() == other->GetOwningArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::google::protobuf::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ResponseAny* other) { + if (other == this) return; + ABSL_DCHECK(GetOwningArena() == other->GetOwningArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ResponseAny* New(::google::protobuf::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::google::protobuf::Message::CopyFrom; + void CopyFrom(const ResponseAny& from); + using ::google::protobuf::Message::MergeFrom; + void MergeFrom( const ResponseAny& from) { + ResponseAny::MergeImpl(*this, from); + } + private: + static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + ::size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::google::protobuf::Arena* arena); + void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(ResponseAny* other); + + private: + friend class ::google::protobuf::internal::AnyMetadata; + static ::absl::string_view FullMessageName() { + return "stream.ResponseAny"; + } + protected: + explicit ResponseAny(::google::protobuf::Arena* arena); + public: + + static const ClassData _class_data_; + const ::google::protobuf::Message::ClassData*GetClassData() const final; + + ::google::protobuf::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kDataFieldNumber = 1, + }; + // .google.protobuf.Any data = 1; + bool has_data() const; + void clear_data() ; + const ::google::protobuf::Any& data() const; + PROTOBUF_NODISCARD ::google::protobuf::Any* release_data(); + ::google::protobuf::Any* mutable_data(); + void set_allocated_data(::google::protobuf::Any* value); + void unsafe_arena_set_allocated_data(::google::protobuf::Any* value); + ::google::protobuf::Any* unsafe_arena_release_data(); + + private: + const ::google::protobuf::Any& _internal_data() const; + ::google::protobuf::Any* _internal_mutable_data(); + + public: + // @@protoc_insertion_point(class_scope:stream.ResponseAny) + private: + class _Internal; + + friend class ::google::protobuf::internal::TcParser; + static const ::google::protobuf::internal::TcParseTable<0, 1, 1, 0, 2> _table_; + template friend class ::google::protobuf::Arena::InternalHelper; + typedef void InternalArenaConstructable_; + typedef void DestructorSkippable_; + struct Impl_ { + ::google::protobuf::internal::HasBits<1> _has_bits_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + ::google::protobuf::Any* data_; + PROTOBUF_TSAN_DECLARE_MEMBER + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_stream_2eproto; +};// ------------------------------------------------------------------- + class LayerData final : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:stream.LayerData) */ { public: @@ -775,7 +943,7 @@ class LayerData final : &_LayerData_default_instance_); } static constexpr int kIndexInFileMessages = - 3; + 4; friend void swap(LayerData& a, LayerData& b) { a.Swap(&b); @@ -989,7 +1157,7 @@ class LayerDataBlock final : &_LayerDataBlock_default_instance_); } static constexpr int kIndexInFileMessages = - 4; + 5; friend void swap(LayerDataBlock& a, LayerDataBlock& b) { a.Swap(&b); @@ -1223,7 +1391,7 @@ class VectorDataBlock final : &_VectorDataBlock_default_instance_); } static constexpr int kIndexInFileMessages = - 5; + 6; friend void swap(VectorDataBlock& a, VectorDataBlock& b) { a.Swap(&b); @@ -1417,7 +1585,7 @@ class ChainDataBlock final : &_ChainDataBlock_default_instance_); } static constexpr int kIndexInFileMessages = - 6; + 7; friend void swap(ChainDataBlock& a, ChainDataBlock& b) { a.Swap(&b); @@ -1595,7 +1763,7 @@ class Point final : &_Point_default_instance_); } static constexpr int kIndexInFileMessages = - 7; + 8; friend void swap(Point& a, Point& b) { a.Swap(&b); @@ -2095,6 +2263,102 @@ ResponseInfo::_internal_mutable_item() { // ------------------------------------------------------------------- +// ResponseAny + +// .google.protobuf.Any data = 1; +inline bool ResponseAny::has_data() const { + bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; + PROTOBUF_ASSUME(!value || _impl_.data_ != nullptr); + return value; +} +inline const ::google::protobuf::Any& ResponseAny::_internal_data() const { + PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race); + const ::google::protobuf::Any* p = _impl_.data_; + return p != nullptr ? *p : reinterpret_cast(::google::protobuf::_Any_default_instance_); +} +inline const ::google::protobuf::Any& ResponseAny::data() const { + // @@protoc_insertion_point(field_get:stream.ResponseAny.data) + return _internal_data(); +} +inline void ResponseAny::unsafe_arena_set_allocated_data(::google::protobuf::Any* value) { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (GetArenaForAllocation() == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + _impl_.data_ = reinterpret_cast<::google::protobuf::Any*>(value); + if (value != nullptr) { + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:stream.ResponseAny.data) +} +inline ::google::protobuf::Any* ResponseAny::release_data() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::protobuf::Any* released = _impl_.data_; + _impl_.data_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArenaForAllocation() == nullptr) { + delete old; + } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArenaForAllocation() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return released; +} +inline ::google::protobuf::Any* ResponseAny::unsafe_arena_release_data() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + // @@protoc_insertion_point(field_release:stream.ResponseAny.data) + + _impl_._has_bits_[0] &= ~0x00000001u; + ::google::protobuf::Any* temp = _impl_.data_; + _impl_.data_ = nullptr; + return temp; +} +inline ::google::protobuf::Any* ResponseAny::_internal_mutable_data() { + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + _impl_._has_bits_[0] |= 0x00000001u; + if (_impl_.data_ == nullptr) { + auto* p = CreateMaybeMessage<::google::protobuf::Any>(GetArenaForAllocation()); + _impl_.data_ = reinterpret_cast<::google::protobuf::Any*>(p); + } + return _impl_.data_; +} +inline ::google::protobuf::Any* ResponseAny::mutable_data() { + ::google::protobuf::Any* _msg = _internal_mutable_data(); + // @@protoc_insertion_point(field_mutable:stream.ResponseAny.data) + return _msg; +} +inline void ResponseAny::set_allocated_data(::google::protobuf::Any* value) { + ::google::protobuf::Arena* message_arena = GetArenaForAllocation(); + PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race); + if (message_arena == nullptr) { + delete reinterpret_cast<::google::protobuf::MessageLite*>(_impl_.data_); + } + + if (value != nullptr) { + ::google::protobuf::Arena* submessage_arena = + ::google::protobuf::Arena::InternalGetOwningArena(reinterpret_cast<::google::protobuf::MessageLite*>(value)); + if (message_arena != submessage_arena) { + value = ::google::protobuf::internal::GetOwnedMessage(message_arena, value, submessage_arena); + } + _impl_._has_bits_[0] |= 0x00000001u; + } else { + _impl_._has_bits_[0] &= ~0x00000001u; + } + + _impl_.data_ = reinterpret_cast<::google::protobuf::Any*>(value); + // @@protoc_insertion_point(field_set_allocated:stream.ResponseAny.data) +} + +// ------------------------------------------------------------------- + // LayerData // float zCooldinate = 1; diff --git a/PrintS/protobuf/stream.proto b/PrintS/protobuf/stream.proto index 731e56f..c8d4d53 100644 --- a/PrintS/protobuf/stream.proto +++ b/PrintS/protobuf/stream.proto @@ -1,8 +1,11 @@ //bytes替代string 防止乱码 syntax = "proto3"; + +import "google/protobuf/any.proto"; package stream; + //ption cc_generic_services = true; option java_multiple_files = true; option java_package = "io.grpc.examples.stream"; @@ -44,6 +47,9 @@ message ResponseInfo { /*==================end 通用通信结构体====================*/ +message ResponseAny{ + google.protobuf.Any data = 1; +} /*==================begin h3d图层结构体===================*/ message LayerData{ @@ -95,7 +101,7 @@ message Point{ service Stream { - rpc Simple(RequestInfo) returns (LayerData) {} // 简单模式 + rpc Simple(RequestInfo) returns (ResponseAny) {} // 简单模式 rpc ServerStream (RequestInfo) returns (stream ResponseInfo) {} // 服务端数据流模式 rpc ClientStream (stream RequestInfo) returns (ResponseInfo) {} // 客户端数据流模式 rpc AllStream (stream RequestInfo) returns (stream ResponseInfo) {} // 双向数据流模式 diff --git a/TestClient/DataManage/DataHandle.cpp b/TestClient/DataManage/DataHandle.cpp index bdc6784..5d49757 100644 --- a/TestClient/DataManage/DataHandle.cpp +++ b/TestClient/DataManage/DataHandle.cpp @@ -75,15 +75,14 @@ void DataHandle::PrintValue(const ReadData& msg){ ++it; } printf("共有参数%zd个...\n", msg.its.size()); - if (m_printIndex != 9) { - m_printIndex = -1; - } - else { + if(m_printIndex == 9 || m_printIndex == 36){ static int count = 0; ++count; if (count == 4) { count = 0; m_printIndex = -1; } //激光参数默认4个 } - + else { + m_printIndex = -1; + } } } @@ -115,41 +114,42 @@ void DataHandle::ParamReadUsage() { printf(" h: " COLOR_YELLOW "print this information...\n" COLOR_RESET); printf(" q: " COLOR_YELLOW "return to the previous level...\n" COLOR_RESET); printf(" 0: " COLOR_YELLOW "print alarm param...\n" COLOR_RESET); - printf(" 1: " COLOR_YELLOW "print init error infos rsp...\n" COLOR_RESET); - printf(" 2: " COLOR_YELLOW "print version rsp...\n" COLOR_RESET); - printf(" 3: " COLOR_YELLOW "print io signal rsp...\n" COLOR_RESET); - printf(" 4: " COLOR_YELLOW "print system param data...\n" COLOR_RESET); - printf(" 5: " COLOR_YELLOW "print laserchiller data...\n" COLOR_RESET); - printf(" 6: " COLOR_YELLOW "print ups param data...\n" COLOR_RESET); - printf(" 7: " COLOR_YELLOW "print temp ctrl param data...\n" COLOR_RESET); - printf(" 8: " COLOR_YELLOW "print oxygenparam data...\n" COLOR_RESET); - printf(" 9: " COLOR_YELLOW "print laser param data...\n" COLOR_RESET); - printf(" 10: " COLOR_YELLOW "print simplesupplyparam_v10 data...\n" COLOR_RESET); - printf(" 11: " COLOR_YELLOW "print SIMPLESUPPLYPARAM_V21 data...\n" COLOR_RESET); - printf(" 12: " COLOR_YELLOW "print SIMPLESUPPLYPARAM_V22 data...\n" COLOR_RESET); - printf(" 13: " COLOR_YELLOW "print purifier param data...\n" COLOR_RESET); - printf(" 14: " COLOR_YELLOW "print power meter param data...\n" COLOR_RESET); - printf(" 15: " COLOR_YELLOW "print powder supply simple param data...\n" COLOR_RESET); - printf(" 16: " COLOR_YELLOW "print scanner power param data...\n" COLOR_RESET); - printf(" 17: " COLOR_YELLOW "print axismold data...\n" COLOR_RESET); - printf(" 18: " COLOR_YELLOW "print axismold slave data...\n" COLOR_RESET); - printf(" 19: " COLOR_YELLOW "print axisclean data...\n" COLOR_RESET); - printf(" 20: " COLOR_YELLOW "print axisclean slave data...\n" COLOR_RESET); - printf(" 21: " COLOR_YELLOW "print axisload data...\n" COLOR_RESET); - printf(" 22: " COLOR_YELLOW "print axismarm data...\n" COLOR_RESET); - printf(" 23: " COLOR_YELLOW "print axismsupply data...\n" COLOR_RESET); - printf(" 24: " COLOR_YELLOW "print axisele data...\n" COLOR_RESET); - printf(" 25: " COLOR_YELLOW "print axisele slave data...\n" COLOR_RESET); - printf(" 26: " COLOR_YELLOW "print paramlimitcfg param data...\n" COLOR_RESET); - printf(" 27: " COLOR_YELLOW "print extcfg param data...\n" COLOR_RESET); - printf(" 28: " COLOR_YELLOW "print moldcfg param data...\n" COLOR_RESET); - printf(" 29: " COLOR_YELLOW "print loadcfg param data...\n" COLOR_RESET); - printf(" 30: " COLOR_YELLOW "print armcfgparam data...\n" COLOR_RESET); - printf(" 31: " COLOR_YELLOW "print supplycfgparam data...\n" COLOR_RESET); - printf(" 32: " COLOR_YELLOW "print cleancfgparam data...\n" COLOR_RESET); - printf(" 33: " COLOR_YELLOW "print elecfgparam data...\n" COLOR_RESET); - printf(" 34: " COLOR_YELLOW "print loadparamrsp data...\n" COLOR_RESET); - printf(" 35: " COLOR_YELLOW "print scanctrlstate data...\n" COLOR_RESET); + printf(" 1: " COLOR_YELLOW "print version rsp...\n" COLOR_RESET); + printf(" 2: " COLOR_YELLOW "print io signal rsp...\n" COLOR_RESET); + printf(" 3: " COLOR_YELLOW "print system param data...\n" COLOR_RESET); + printf(" 4: " COLOR_YELLOW "print laserchiller data...\n" COLOR_RESET); + printf(" 5: " COLOR_YELLOW "print ups param data...\n" COLOR_RESET); + printf(" 6: " COLOR_YELLOW "print temp ctrl param data...\n" COLOR_RESET); + printf(" 7: " COLOR_YELLOW "print oxygenparam data...\n" COLOR_RESET); + printf(" 8: " COLOR_YELLOW "print laser param data...\n" COLOR_RESET); + printf(" 9: " COLOR_YELLOW "print simplesupplyparam_v10 data...\n" COLOR_RESET); + printf(" 10: " COLOR_YELLOW "print SIMPLESUPPLYPARAM_V21 data...\n" COLOR_RESET); + printf(" 11: " COLOR_YELLOW "print SIMPLESUPPLYPARAM_V22 data...\n" COLOR_RESET); + printf(" 12: " COLOR_YELLOW "print purifier param data...\n" COLOR_RESET); + printf(" 13: " COLOR_YELLOW "print power meter param data...\n" COLOR_RESET); + printf(" 14: " COLOR_YELLOW "print powder supply simple param data...\n" COLOR_RESET); + printf(" 15: " COLOR_YELLOW "print scanner power param data...\n" COLOR_RESET); + printf(" 16: " COLOR_YELLOW "print axismold data...\n" COLOR_RESET); + printf(" 17: " COLOR_YELLOW "print axismold slave data...\n" COLOR_RESET); + printf(" 18: " COLOR_YELLOW "print axisclean data...\n" COLOR_RESET); + printf(" 19: " COLOR_YELLOW "print axisclean slave data...\n" COLOR_RESET); + printf(" 20: " COLOR_YELLOW "print axisload data...\n" COLOR_RESET); + printf(" 21: " COLOR_YELLOW "print axismarm data...\n" COLOR_RESET); + printf(" 22: " COLOR_YELLOW "print axismsupply data...\n" COLOR_RESET); + printf(" 23: " COLOR_YELLOW "print axisele data...\n" COLOR_RESET); + printf(" 24: " COLOR_YELLOW "print axisele slave data...\n" COLOR_RESET); + printf(" 25: " COLOR_YELLOW "print paramlimitcfg param data...\n" COLOR_RESET); + printf(" 26: " COLOR_YELLOW "print extcfg param data...\n" COLOR_RESET); + printf(" 27: " COLOR_YELLOW "print moldcfg param data...\n" COLOR_RESET); + printf(" 28: " COLOR_YELLOW "print loadcfg param data...\n" COLOR_RESET); + printf(" 29: " COLOR_YELLOW "print armcfgparam data...\n" COLOR_RESET); + printf(" 30: " COLOR_YELLOW "print supplycfgparam data...\n" COLOR_RESET); + printf(" 31: " COLOR_YELLOW "print cleancfgparam data...\n" COLOR_RESET); + printf(" 32: " COLOR_YELLOW "print elecfgparam data...\n" COLOR_RESET); + printf(" 33: " COLOR_YELLOW "print loadparamrsp data...\n" COLOR_RESET); + printf(" 34: " COLOR_YELLOW "print scan ctrl state data...\n" COLOR_RESET); + printf(" 35: " COLOR_YELLOW "print scan ctrl Param data...\n" COLOR_RESET); + printf(" 36: " COLOR_YELLOW "print xy scan state data...\n" COLOR_RESET); } @@ -172,6 +172,9 @@ void DataHandle::Request(int index) { else if(index == 34){ SetPushMsg(LOADPARAM,""); } + else if (index == 36) { + SetPushMsg(REQUEST,to_string(index)); + } m_printIndex = index; while (m_printIndex >= 0) { @@ -217,4 +220,5 @@ void DataHandle::ScanCtrlTest() { printf("发送请求%d成功...\n", i); Sleep(1000); } + } \ No newline at end of file diff --git a/TestClient/DataManage/FunC.h b/TestClient/DataManage/FunC.h index b098629..6f27849 100644 --- a/TestClient/DataManage/FunC.h +++ b/TestClient/DataManage/FunC.h @@ -47,6 +47,5 @@ enum SCANCTRLFUNC { STARTHEATINGMOTION, STOPHEATINGMOTION, - END1 //结束标记 }; \ No newline at end of file diff --git a/TestClient/DataManage/RWData.h b/TestClient/DataManage/RWData.h index 160dc4c..93a55f4 100644 --- a/TestClient/DataManage/RWData.h +++ b/TestClient/DataManage/RWData.h @@ -4,7 +4,6 @@ enum READTYPE { ALARM = 0, //报警 - INITERRORINFOSRSP, //返回初始化错误信息 VERSIONRSP, //返回版本信息 IOSIGNALRSP, //io信号返回数据 SYSPARAMDATA, //系统参数 @@ -21,8 +20,8 @@ enum READTYPE { PURIFIERPARAM, //净化器参数 POWERMETERPARAM, //电能参数 - POWDERSUPPLYSIMPLEPARAM, //PowderSupplySimpleClient 参数 已写,还没有发送 - SCANNERPOWERPARAM, //ScannerPower 参数 //配置参数是0,待处理 + POWDERSUPPLYSIMPLEPARAM, //PowderSupplySimpleClient 参数 已写但没用到,暂没有发送 + SCANNERPOWERPARAM, //ScannerPower 参数 /*************axis相关*************/ AXISMOLD, @@ -48,10 +47,12 @@ enum READTYPE { LOADPARAMRSP, //装载参数 + SCANCTRLSTATE, //BaseCtrl参数 + SCANCTRLPARAM, //scanctrl参数 + XYSCANSTATE, //XYScanState参数 在参数更新的时候才会发送到客户端 - SCANCTRLSTATE, //scanctrl参数 - + TEST = 1000, //test }; enum DATATYPE { @@ -89,41 +90,7 @@ enum WRITETYPE { GET = 0, SET, AXISMOVEFUNC, //轴运动函数 - //LOADIN, //载入 - //LOADOUT, //载出 - //INTERCEPTLOAD, //中断载入/载出 - //SUPPLYAXLEAFTER, //供粉轴后移 - //SUPPLYAXLEFRONT, //供粉轴前移 - //SUPPLYAXLEAFTERCONTSTART, //供粉轴后移连续开始 - //SUPPLYAXLEAFTERCONTSTOP, //供粉轴后移连续停止 - //SUPPLYAXLEFRONTCONTSTART, //供粉轴前移连续开始 - //SUPPLYAXLEFRONTCONTSTOP, //供粉轴前移连续停止 - //PAVEAXLEFRONT, // 铺粉臂前移 - //PAVEAXLEFRONTCONTSTART, //铺粉臂前移连续 - //PAVEAXLEFRONTCONTSTOP, //铺粉臂前移连续 - //PAVEAXLEAFTER, //铺粉臂后移 - //PAVEAXLEAFTERCONTSTART, //铺粉臂后移连续开始 - //PAVEAXLEAFTERCONTSTOP, //铺粉臂后移连续停止 - //PAVEAXLECLEAR, //铺粉臂清零 - //PRINTAXLEUP, //成型缸上升 - //PRINTAXLEUPCONTSTART, //成型缸连续上升开始 - //PRINTAXLEUPCONTSTOP, //成型缸连续上升停止 - //PRINTAXLEDOWN, //成型缸下降 - //PRINTAXLEDOWNCONTSTART, //成型缸连续下降开始 - //PRINTAXLEDOWNCONTSTOP, //成型缸连续下降停止 - //PRINTAXLECLEAR, //成型缸清零 - //TRANSFERAXIELEFT, //移载轴左移 - //TRANSFERAXIELEFTCONTSTART, //移载轴连续左移开始 - //TRANSFERAXIELEFTCONTSTOP, //移载轴连续左移停止 - //TRANSFERAXIERIGHT, //移载轴右移 - //TRANSFERAXIERIGHTCONTSTART, //移载轴连续右移开始 - //TRANSFERAXIERIGHTCONTSTOP, //移载轴连续右移停止 - //TRANSFERAXIECLEAR, //移载轴清零 - SCANERSTART, //开始扫描 - SCANERSTOP, //停止扫描 - STARTHEATINGSCANNERTEST, //开始振镜预热测试 - STOPHEATINGSCANNERTEST, //停止振镜预热 - INITERRORINFOSREQ, //初始化错误信息 + VERSIONREQ, //获取版本信息 IOSIGNAL, //io 信号 @@ -140,6 +107,7 @@ enum WRITETYPE { LOADPARAM, //装载参数 + /********************振镜控制******************/ SCANCTRLFUNC, //振镜控制函数 diff --git a/TestClient/utils/LocalAddr.h b/TestClient/utils/LocalAddr.h new file mode 100644 index 0000000..d8dccb3 --- /dev/null +++ b/TestClient/utils/LocalAddr.h @@ -0,0 +1,152 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma comment(lib,"ws2_32.lib") +#pragma comment(lib, "iphlpapi.lib") + +class LocalAddr { + +private: + void FreeIpForwardTable(PMIB_IPFORWARDTABLE pIpRouteTab) + { + if (pIpRouteTab != NULL) + { + ::GlobalFree(pIpRouteTab); + pIpRouteTab = NULL; + } + } + + PMIB_IPFORWARDTABLE GetIpForwardTable(BOOL bOrder) + { + PMIB_IPFORWARDTABLE pIpRouteTab = NULL; + DWORD dwActualSize = 0; + + // 查询所需缓冲区的大小 + if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER) + { + // 为MIB_IPFORWARDTABLE结构申请内存 + pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(GPTR, dwActualSize); + // 获取路由表 + if (::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR) + return pIpRouteTab; + ::GlobalFree(pIpRouteTab); + } + return NULL; + } + +public: + std::string GetSystemIpAddress() + { + std::string strLoalhostIp; + PMIB_IPFORWARDTABLE pIpRouteTable = GetIpForwardTable(TRUE); + if (pIpRouteTable != NULL) + { + DWORD dwCurrIndex; + struct in_addr inadDest; + struct in_addr inadMask; + struct in_addr inadGateway; + char szDestIp[128] = { 0 }; + char szMaskIp[128] = { 0 }; + char szGatewayIp[128] = { 0 }; + DWORD IfIndex = 0; + DWORD ForwardMetric1 = 0; + if (pIpRouteTable->dwNumEntries > 0) + { + char ip[INET_ADDRSTRLEN] = {0}; + for (DWORD i = 0; i < pIpRouteTable->dwNumEntries; i++){ + dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex; + // 目的地址 + inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest; + strcpy_s(szDestIp, sizeof(szDestIp), inet_ntop(AF_INET, &inadDest, ip, INET_ADDRSTRLEN)); + // 子网掩码 + inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask; + strcpy_s(szMaskIp, sizeof(szDestIp), inet_ntop(AF_INET, &inadMask, ip, INET_ADDRSTRLEN)); + // 网关地址 + inadGateway.s_addr = pIpRouteTable->table[i].dwForwardNextHop; + strcpy_s(szGatewayIp, sizeof(szDestIp), inet_ntop(AF_INET, &inadGateway, ip, INET_ADDRSTRLEN)); + if ((strcmp(szDestIp, "0.0.0.0") == 0) && (strcmp(szMaskIp, "0.0.0.0") == 0)) + { + + if (i == 0) + { + ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1; + IfIndex = pIpRouteTable->table[i].dwForwardIfIndex; + struct in_addr inadDest; + inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest; + } + else if (ForwardMetric1 > pIpRouteTable->table[i].dwForwardMetric1) + { + ForwardMetric1 = pIpRouteTable->table[i].dwForwardMetric1; + IfIndex = pIpRouteTable->table[i].dwForwardIfIndex; + struct in_addr inadDest; + inadDest.s_addr = pIpRouteTable->table[i].dwForwardDest; + } + } + } + } + else + { + FreeIpForwardTable(pIpRouteTable); + return ""; + } + FreeIpForwardTable(pIpRouteTable); + + + if (IfIndex > 0) + { + DWORD ipdwSize = 0; + PBYTE m_pBuffer = new BYTE[MAX_PATH]; + ULONG m_ulSize = MAX_PATH; + DWORD m_dwResult; + PMIB_IPADDRTABLE pAddrTable; + PMIB_IPADDRROW pAddrRow; + in_addr ia; + GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE); + delete[] m_pBuffer; + m_pBuffer = new BYTE[m_ulSize]; + if (NULL != m_pBuffer) + { + m_dwResult = GetIpAddrTable((PMIB_IPADDRTABLE)m_pBuffer, &m_ulSize, TRUE); + if (m_dwResult == NO_ERROR) + { + pAddrTable = (PMIB_IPADDRTABLE)m_pBuffer; + + for (DWORD x = 0; x < pAddrTable->dwNumEntries; ++x) + { + pAddrRow = (PMIB_IPADDRROW) & (pAddrTable->table[x]); + + ia.S_un.S_addr = pAddrRow->dwAddr; + char IPMsg[100] = { 0 }; + if (IfIndex == pAddrRow->dwIndex) + { + char ip[INET_ADDRSTRLEN] = {0}; + LPCSTR psz = inet_ntop(AF_INET, &ia, ip, INET_ADDRSTRLEN); + if (psz) + { + strLoalhostIp = psz; + } + delete[] m_pBuffer; + return strLoalhostIp; + } + } + } + delete[] m_pBuffer; + } + } + } + else + { + FreeIpForwardTable(pIpRouteTable); + return ""; + } + return ""; + } + +}; \ No newline at end of file