#ifndef SLAVECTRL_H #define SLAVECTRL_H #include #include #include #include #include #include "WorkForm/working_page.h" typedef struct _MASTER_CMD_ { quint16 CMD; quint8 RecState; quint8 Cid1; quint8 Cid2; quint8 Alarm; }MASTER_CMD; class SlaveCtrl :public QThread { Q_OBJECT public: SlaveCtrl(Working_Page *page=0); virtual void run(); ~SlaveCtrl(); public: Working_Page *work_page; enum CMD_TYPE { Heartbea = 0x0A01, ExitSlave, EnterSlave, GetDischargeParam, SetDischargeParam, //0A05 GetCellData, GetFileInfo, GetFile, SetChargeParam, GetChargeParam, //0A0A StartDischarge, PausetDischarge, GetDischargeData, StartCharge, PauseCharge, //0A0F GetChargeData, //0A10 GetAdjustData, SetAdjustParm, Adjust_StartDischarge, Adjust_StartCharge, Adjust_Stop, //0A15 EnterHome, GetCycleParam, SetCycleParam, NewBatt, //0A19 设置电池组名 ChangedBatt, //0A1A DelBatt, StopDischarge, StopCharge, ClearAlarm, StartCycle, PauseCycle, //0A20 StopCycle, GetBattName, //0A22 获取电池组列表 GetFileName, GetSelectFile, SetTKQState, SetFanState, A27, A28, A29, GetVersion //0A2A }; enum RTN_TYPE { SUCCEED = 0, LEN_ERR, CRC_ERR, SLAVEMODE_ERR, FILE_DATA_ERR, START_ERR, OTHER_ERR, SYSTEM_WORKING }; static void setMasterCmd(CMD_TYPE CMD, quint8 status=0, quint8 Cid1=0, quint8 Cid2=0, quint8 arm=0); bool isConnect(void); void sentClientConnect(const QString &hostName, quint16 port); void Restartlisten(void); private: quint8 waitRecvCnt; QTcpServer *tcpServer; QTcpSocket *tcpSocket; bool IF_CLOSEServer; bool IF_CLOSEClient; quint8 ServerFlag; quint8 ClientFlag; QTcpSocket *tcpClient; QString ClienthostName; quint16 Clientport; private: bool CheckLen(FRAME_DATA *recv); bool CheckSYNCode(FRAME_DATA *recv); bool CheckCRC(FRAME_DATA *recv); bool ReadFrameHead(FRAME_DATA *recv, FRAME_DATA *Sent); bool WriteFrameData(FRAME_DATA *Sent); bool ReadFrameData(FRAME_DATA &recv, FRAME_DATA &Sent); quint16 getMonData(quint8 *info, quint16 MonNum); //quint16 getAdjData(quint8 *info); quint16 getTestData(quint8 *info); quint8 *getFileDataHead(FILE_LIST_DATA &data,TEST_DATA_INFO &test_info, quint8 total, quint8 Index); quint16 getPageFileData(FRAME_DATA &recv, FRAME_DATA &Sent); quint16 getFileSmallBlock(FRAME_DATA &recv, FRAME_DATA &Sent); quint16 getBattName(FRAME_DATA &recv, FRAME_DATA &Sent); quint16 getfileName(FRAME_DATA &recv, FRAME_DATA &Sent); quint16 getSelectFile(FRAME_DATA &recv, FRAME_DATA &Sent); void SaveTestParam(const QString &fname,TEST_PARAM_XML &test_param); void NewBattFile(quint8 *info); bool SelectBatt(quint8 *info); void DeleteBatt(quint8 *info); void SlaveClearHeart(); void SlaveDisposeCMD(FRAME_DATA &recv, FRAME_DATA &Sent); void SlaveSentFrame(FRAME_DATA &recv, FRAME_DATA &Sent); void SlaveResponse(FRAME_DATA &recv, FRAME_DATA &Sent); void SlaveMode(FRAME_DATA &recv, FRAME_DATA &Sent); bool MasterSentFrame(MASTER_CMD cmd_data); void MasterDisposeCMD(FRAME_DATA &recv); void MasterMode(FRAME_DATA &recv, FRAME_DATA &Sent); void setTestCommParam(TEST_PARAM_XML &test_param, void *comm_param); void getTestCommParam(TEST_PARAM_XML &test_param, void *comm_param); void dataReceived();//解析数据 quint16 getVersion(FRAME_DATA &recv, FRAME_DATA &Sent); signals: void sendStart(int,QString); void SendCurrAdjCMD(int,int); void SendInterface(int); void sendParam(int); protected slots: void deleteSocket(); }; #endif // RS485DRIVER_PC_H