PIDSServerResultMsg.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #pragma once
  2. #include <iostream>
  3. #include "PIDSDataDefine.h"
  4. #include <map>
  5. using namespace std;
  6. class PIDSServerResultMsg
  7. {
  8. public:
  9. // 当前站站号
  10. int CurrentSite;
  11. // 下一站站号
  12. int NextSite;
  13. // 起始站站号
  14. int StartSite;
  15. // 终点站站好
  16. int EndSite;
  17. // 时间是否有效
  18. bool TimeFlag;
  19. // 车门标志位
  20. uint8_t DoorFlag = 0;
  21. // TC2、TC1激活情况
  22. uint8_t PIDSFlag;
  23. std::map<int,int> DynamicLoad;
  24. public:
  25. PIDSServerResultMsg(){};
  26. ~PIDSServerResultMsg(){};
  27. // 反序列化
  28. int32_t Deserialization(uint8_t *data, int length)
  29. {
  30. // 协议规定数据长度为48
  31. if(length != 48) return ERR;
  32. // 检查数据头尾
  33. if(data[0] != PIDS_DATA_HEAD || data[length-1] != PIDS_DATA_END) {
  34. ErrorL << "Incorrect data head and tail";
  35. return ERR;
  36. }
  37. // 获取数据长度
  38. uint16_t DataLength = ((uint16_t)data[8] << 8 | data[7]);
  39. // 检查数据校验位
  40. int16_t crc = Crc16::GetCRC16(data, 9, DataLength);
  41. // 数据校验
  42. if(data[length-3] != ((crc & 0xFF00) >> 8) || data[length-2] != (crc & 0x00FF)){
  43. ErrorL << "Incorrect data check digit";
  44. return ERR;
  45. }
  46. // 数据校验通过提取数据
  47. this->CurrentSite = data[9];
  48. this->NextSite = data[10];
  49. this->StartSite = data[11];
  50. this->EndSite = data[12];
  51. this->TimeFlag = data[13] ? true:false;
  52. // 时间
  53. // 标志
  54. this->DoorFlag = data[21];
  55. this->PIDSFlag = data[22];
  56. // 提取动态负载
  57. int id = 1;
  58. for(int i = 0; i < 12; i+=2){
  59. this->DynamicLoad[id] = (uint16_t)data[24 + i] << 8 | data[23 + i];
  60. id++;
  61. }
  62. return OK;
  63. }
  64. };