#pragma once #include #include "PIDSDataDefine.h" #include using namespace std; class PIDSServerResultMsg { public: // 当前站站号 int CurrentSite; // 下一站站号 int NextSite; // 起始站站号 int StartSite; // 终点站站好 int EndSite; // 时间是否有效 bool TimeFlag; // 车门标志位 uint8_t DoorFlag = 0; // TC2、TC1激活情况 uint8_t PIDSFlag; std::map DynamicLoad; public: PIDSServerResultMsg(){}; ~PIDSServerResultMsg(){}; // 反序列化 int32_t Deserialization(uint8_t *data, int length) { // 协议规定数据长度为48 if(length != 48) return ERR; // 检查数据头尾 if(data[0] != PIDS_DATA_HEAD || data[length-1] != PIDS_DATA_END) { ErrorL << "Incorrect data head and tail"; return ERR; } // 获取数据长度 uint16_t DataLength = ((uint16_t)data[8] << 8 | data[7]); // 检查数据校验位 int16_t crc = Crc16::GetCRC16(data, 9, DataLength); // 数据校验 if(data[length-3] != ((crc & 0xFF00) >> 8) || data[length-2] != (crc & 0x00FF)){ ErrorL << "Incorrect data check digit"; return ERR; } // 数据校验通过提取数据 this->CurrentSite = data[9]; this->NextSite = data[10]; this->StartSite = data[11]; this->EndSite = data[12]; this->TimeFlag = data[13] ? true:false; // 时间 // 标志 this->DoorFlag = data[21]; this->PIDSFlag = data[22]; // 提取动态负载 int id = 1; for(int i = 0; i < 12; i+=2){ this->DynamicLoad[id] = (uint16_t)data[24 + i] << 8 | data[23 + i]; id++; } return OK; } };