1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #pragma once
- #include <iostream>
- #include "PIDSDataDefine.h"
- #include <map>
- 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<int,int> 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;
- }
- };
|