#pragma once #include #include #include #include #include "../protobuf/stream.grpc.pb.h" using grpc::ServerContext; enum READTYPE { GET = 0, SET, LOAD, //载入 LOADOUT, //载出 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, //获取版本信息 }; enum DATATYPE { iBOOL = 0, iSHORT, iUSHORT, iINT, iUINT, iFLOAT, iSTRING, iWORD, }; class ClientInfo; struct ReadData { READTYPE dataType; std::string nameKey; //参数key std::string strValue; //value DATATYPE valueType; ClientInfo* clientPtr; }; enum WRITETYPE { ProcReadPLC0=0, //snap7 数据 ProcReadPLC1, ProcReadPLC2, ProcReadPLC3, ProcReadPLC4, ProcReadPLC5, ProcReadPLC6, ProcReadPLCData0 = 100, ALARM , //报警 RESPOND, //回应 TIMEDATA, //定时数据 INITERRORINFOSRSP, //返回初始化错误信息 VERSIONRSP, //返回版本信息 }; struct WriteData { WRITETYPE dataType; bool result; std::string nameKey; //参数key std::string strValue; //value DATATYPE valueType; //数据类型 }; class ClientInfo { public: ClientInfo() : m_clientAddr("0.0.0.0:0") , m_readQuitFlag(false) , m_writeQuitFlag(false) , m_context(nullptr) { } ~ClientInfo() { m_readQuitFlag = true; m_writeQuitFlag = true; } bool IsConnect() { return m_context && !m_context->IsCancelled(); } bool GetPushMsg(WriteData& msg) { std::lock_guard lock(m_msgLock); if (m_msgList.empty()) { return false; } else { WriteData* wd = m_msgList.front(); if (!wd) return false; msg = *wd; delete wd; m_msgList.pop_front(); return true; } } void SetPushMsg(WriteData* msg) { std::lock_guard lock(m_msgLock); m_msgList.push_back(msg); } public: std::string m_clientAddr; //客户端地址 bool m_readQuitFlag; //读线程退出标致 bool m_writeQuitFlag; //写线程退出标致 ServerContext* m_context; //上下文 private: std::list m_msgList; //信息缓存区 std::mutex m_msgLock; //信息锁 };