LocateRecord.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #pragma once
  2. #include <sys/timeb.h>
  3. #include <memory>
  4. using namespace std;
  5. namespace nspLocate{
  6. const int PERIOD_SYNCTIME = 15000; // 分站时间同步周期,约10秒,10000毫秒
  7. const double INTERVAL_SYNCTIME = 200.0; // 分站时间同步间隔,200毫秒
  8. const unsigned long long PERIOD_MAX_VALUE = 0xFFFFFFFFFF;
  9. const double PICOSECOND_COEFFICIENT = (15.65 * 1E-9);
  10. class LocateRecord
  11. {
  12. private:
  13. // 分站接收标识卡的时间,为线性插值后的时间,多个基站中,以参与算法最小的时间戳为准
  14. unsigned long long locateTime;
  15. // 本次记录时间的分站号
  16. int readerId ;
  17. // 本次记录分站时间同步序号
  18. int syncNum;
  19. // 卡时间戳
  20. int cardTimestamp;
  21. // 上位机接收时间,相当于time(NULL)
  22. unsigned long long receiveTime;
  23. //// 当前坐标
  24. //double x;
  25. //double y;
  26. //// 当前速度
  27. //double vx;
  28. //double vy;
  29. //double v; // 速度
  30. //double a; // 加速度
  31. //// 地图比例,用来将像素转为米
  32. //double scale;
  33. int deltaT;
  34. // 当前时间,1970年1月1日到现在的毫秒数
  35. unsigned long long millionSeconds(){
  36. struct timeb t1;
  37. ftime(&t1);
  38. return t1.millitm; // 毫秒数
  39. //t1.time // 秒数, 同time(NULL);
  40. }
  41. public:
  42. LocateRecord(void){}
  43. LocateRecord(unsigned long long revTime, int rid, int sn, int ct){
  44. this->locateTime = revTime;
  45. this->readerId = rid;
  46. this->syncNum = sn;
  47. this->cardTimestamp = ct;
  48. this->receiveTime = millionSeconds();
  49. deltaT = 0;
  50. }
  51. ~LocateRecord(void){}
  52. //// 根据上次的时间、位置计算速度、加速度
  53. //void getV(std::shared_ptr<LocateRecord> &lr){
  54. // double deltaT = getDeltaT(lr) / 1000.0; // 转为秒
  55. // // 时间差异常,应赋予默认值
  56. // if(0 == deltaT)
  57. // {
  58. // vx = lr->VX();
  59. // vy = lr->VY();
  60. // v = lr->V();
  61. // a = lr->A();
  62. // }
  63. // else
  64. // {
  65. // // 速度,加速度
  66. // vx = (x - lr->X()) * scale / deltaT;
  67. // vy = (y - lr->Y()) * scale / deltaT;
  68. // v = sqrt(pow(vx, 2) + pow(vy, 2));
  69. // double avx = (vx - lr->VX()) / deltaT;
  70. // double avy = (vy - lr->VY()) / deltaT;
  71. // a = sqrt(pow(avx,2) + pow(avy,2));
  72. // }
  73. //}
  74. //void SetReceiveTime(){ receiveTime = millionSeconds();}
  75. //void SetScale(double val){ scale = val;}
  76. unsigned long long ReceiveTime() const { return receiveTime; }
  77. unsigned long long LocateTime() const { return locateTime;}
  78. int SyncNum() const { return syncNum;}
  79. int CardTimestamp() const { return cardTimestamp;}
  80. int ReaderId() const { return readerId ;}
  81. int DeltaT() const { return deltaT; } // 毫秒
  82. double DeltaTSecond() const {return (double)deltaT/1000.0;}; // 秒
  83. // 获取两次定位的时间间隔,返回毫秒数
  84. void getDeltaT(std::shared_ptr<LocateRecord> &lr)
  85. {
  86. if(nullptr == lr)
  87. {
  88. return ;
  89. }
  90. unsigned long long ret = receiveTime - lr->ReceiveTime();
  91. // 跨时间同步周期了,以上位机时间receiveTime为准
  92. if( ret > PERIOD_SYNCTIME)
  93. {
  94. deltaT = (int)ret;
  95. }
  96. // 时间同步序号差500以上,认为root异常,时间同步序号重置,以上位机时间receiveTime为准
  97. else if((syncNum - lr->SyncNum())*INTERVAL_SYNCTIME > PERIOD_SYNCTIME) // 500
  98. {
  99. deltaT = (int)ret;
  100. }
  101. // 分站接收时间跨周期,并且在一个周期以内,以分站接收时间为主
  102. else if(locateTime < lr->LocateTime())
  103. {
  104. deltaT = (int)(((locateTime + PERIOD_MAX_VALUE - lr->LocateTime()) & PERIOD_MAX_VALUE) * PICOSECOND_COEFFICIENT);
  105. }
  106. // 在同一个周期内,以分站接收时间为准
  107. else
  108. {
  109. deltaT = (int)(((locateTime - lr->LocateTime()) & PERIOD_MAX_VALUE) * PICOSECOND_COEFFICIENT);
  110. }
  111. }
  112. //double VX() const { return vx;}
  113. //double VY() const { return vy;}
  114. //double V() const { return v;}
  115. //double A() const { return a;}
  116. //double X() const { return x;}
  117. //double Y() const { return y;}
  118. };
  119. }