classdef.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  1. #ifndef YASERVER_CLASSDEF_H_
  2. #define YASERVER_CLASSDEF_H_
  3. #define MAX_DIST_CACHE 4 //5
  4. #define DIST_COUNT 4
  5. #define ANCHOR_COUNT 4
  6. #define KALMAN_OFFSET_COOR 0.01
  7. #define KALMAN_OFFSET_MOVE 1
  8. #define KALMAN_OFFSET_RANGING 0.01
  9. #define KALMAN_INTERVAL 0.3
  10. #define KALMAN_OFFSET_COOR_TRI 0.01
  11. #define KALMAN_OFFSET_MOVE_TRI 1
  12. #define KALMAN_OFFSET_RANGING_TRI 0.09
  13. #define KALMAN_INTERVAL_TRI 1
  14. #define ANTENNA_COUNT 2
  15. #define ADHOC_COUNT 10
  16. #define READER_TIMEOUT 20
  17. #define OVER_TIME 480 * 60
  18. //#define CARD_TYPE_ADHOC 3
  19. #define MAX_SEMACOUNT 64
  20. #define INVALID_COORDINATE -1
  21. //算法类型
  22. //#define ALGORITHM_TYPE_TOF
  23. #define ALGORITHM_TYPE_TDOA
  24. //#define ALGORITHM_TYPE_INS //使用惯导判断
  25. //滤波功能开启
  26. //#define FILTER_KALMAN
  27. #include <string>
  28. #include <ctime>
  29. #include <map>
  30. #include <iostream>
  31. #include <string>
  32. #include <vector>
  33. #include <unordered_map>
  34. #include <deque>
  35. //#include "winsock2.h"
  36. #include <kalman\locate.h>
  37. #include "Filter\KalmanFilter.h"
  38. #define MIN(x,y) (x < y ? x : y)
  39. #define MAX(x,y) (x > y ? x : y)
  40. using namespace std;
  41. //算法中使用的常量定义
  42. const int MAX_CALC_POINTS = 30;
  43. const double INS_WEIGHT = 9.0; //惯导权重
  44. const double UWB_WEIGHT = 1.0; //UWB权重
  45. const double MAX_VECHILE_SPEED = 25.0;
  46. const double VECHILE_ACCELERATE_THRESHOLD = 5;
  47. const double PERSON_ACCELERATE_THRESHOLD = 3;
  48. enum TIMER_ID
  49. {
  50. TMR_SEND_COUNTING = 1,
  51. TMR_SEND_ALARM,
  52. TMR_SEND_DEVICE_STATE,
  53. TMR_SEND_POSTION,
  54. TMR_SYNC_READER_TIME,
  55. TMR_CLEAR_CALL_TIMER,
  56. TMR_SEND_CALL
  57. };
  58. enum ALARM_FLAG{
  59. AF_CARD_OVER_COUNT = 1,
  60. AF_CARD_OVER_TIME,
  61. AF_CARD_OVER_SPEED,
  62. AF_CARD_AREA_OVER_TIME,
  63. AF_CARD_AREA_OVER_COUNT,
  64. AF_CARD_AREA_FORBIDDEN,//1 这两个需要处理s
  65. AF_AREA_OVER_COUNT,
  66. AF_AREA_OVER_TIME,
  67. AF_AREA_FORBIDDEN //2
  68. };
  69. enum EDIT_TYPE_ID{
  70. ET_INSERT = 0,
  71. ET_UPDATE,
  72. ET_DELETE
  73. };
  74. enum ALARM_TYPE_ID
  75. {
  76. ATID_OVER_COUNT_PERSON = 1,
  77. ATID_OVER_TIME_PERSON,
  78. ATID_AREA_OVER_COUNT_PERSON,
  79. ATID_AREA_OVER_TIME_PERSON,
  80. ATID_AREA_LIMIT_PERSON,
  81. ATID_AREA_FORBIDDEN_PERSON,
  82. ATID_READER,
  83. ATID_OVER_SPEED,
  84. ATID_RUN_THE_RED_LIGHT,
  85. ATID_POWER,
  86. ATID_OVER_COUNT_VEHICLE,
  87. ATID_OVER_TIME_VEHICLE,
  88. ATID_AREA_OVER_COUNT_VEHICLE,
  89. ATID_AREA_OVER_TIME_VEHICLE,
  90. ATID_AREA_LIMIT_VEHICLE,
  91. ATID_AREA_FORBIDDEN_VEHICLE
  92. };
  93. enum STATUS_DEVICE{
  94. STATUS_DEVICE_NORMAL = 0,
  95. STATUS_DEVICE_ERROR,
  96. };
  97. enum STATUS_CARD
  98. {
  99. STATUS_NORMAL = 0, //正常
  100. STATUS_ERROR = 1,
  101. STATUS_ERROR_SERIOUS = 2,
  102. STATUS_POWER_LOWER = 1, //电量低
  103. STATUS_POWER_LOWER_SERIOUS = 2, //电量极低
  104. STATUS_OVER_TIME = 4, //超时
  105. //STATUS_OVER_COUNT = 1,
  106. STATUS_OVER_SPEED = 8, //超速
  107. STATUS_AREA_OVER_TIME = 16, //区域超时
  108. //STATUS_AREA_OVER_COUNT = 1,
  109. STATUS_AREA_OVER_SPEED = 32, //区域超速
  110. STATUS_AREA_FORBIDDEN = 64, //进入限制区域
  111. STATUS_HELP = 128, //呼救
  112. STATUS_HELP_DEALED = 256, //
  113. STATUS_CALL = 512, //呼叫
  114. STATUS_LOST = 1024 //清除盲区
  115. //STATUS_ERROR_DEALED,
  116. };
  117. enum STORE_CARD_DATA_FLAG{
  118. TEST_LOCATE_COMPARE = 0,
  119. TEST_LOCATE_DATA,
  120. HIS_LOCATION,
  121. HIS_RAW_DATA,
  122. HIS_AREA_LOCATION_ENTER,
  123. HIS_AREA_LOCATION_LEAVE,
  124. RPT_ATTEND_DOWN,
  125. RPT_ATTEND_UP,
  126. ALARM_CARD_OVER_TIME_START,
  127. ALARM_CARD_OVER_TIME_END,
  128. ALARM_CARD_OVER_SPEED_START,
  129. ALARM_CARD_OVER_SPEED_END,
  130. //ALARM_CARD_LOST_START,
  131. //ALARM_CARD_LOST_END,
  132. ALARM_CARD_LOW_POWER_START,
  133. ALARM_CARD_LOW_POWER_END,
  134. ALARM_CARD_OVER_TIME_AREA_START,
  135. ALARM_CARD_OVER_TIME_AREA_END,
  136. ALARM_CARD_OVER_SPEED_AREA_START,
  137. ALARM_CARD_OVER_SPEED_AREA_END,
  138. ALARM_CARD_AREA_FORBIDDEN_START,
  139. ALARM_CARD_AREA_FORBIDDEN_END,
  140. ALARM_CARD_HELP_START,
  141. ALARM_CARD_HELP_END
  142. };
  143. enum STORE_AREA_DATA_FLAG{
  144. ALARM_AREA_OVER_COUNT_PERSON_START = 0,
  145. ALARM_AREA_OVER_COUNT_PERSON_END,
  146. ALARM_AREA_OVER_COUNT_VEHICLE_START,
  147. ALARM_AREA_OVER_COUNT_VEHICLE_END,
  148. ALARM_AREA_FORBIDDEN_PERSON_START,
  149. ALARM_AREA_FORBIDDEN_PERSON_END,
  150. ALARM_AREA_FORBIDDEN_VEHICLE_START,
  151. ALARM_AREA_FORBIDDEN_VEHICLE_END,
  152. };
  153. enum STORE_READER_DATA_FLAG{
  154. ALARM_READER = 0,
  155. ALARM_READER_LOST_START,
  156. ALARM_READER_LOST_END
  157. };
  158. enum STORE_MINE_DATA_FLAG{
  159. ALARM_MINE_OVER_COUNT_PERSON_START = 0,
  160. ALARM_MINE_OVER_COUNT_PERSON_END,
  161. ALARM_MINE_OVER_COUNT_VEHICLE_START,
  162. ALARM_MINE_OVER_COUNT_VEHICLE_END
  163. };
  164. enum LOCATE_TYPE
  165. {
  166. LT_COORDINATE = 0,
  167. LT_READER,
  168. LT_TDOA,
  169. };
  170. enum FILTER_TYPE{
  171. NO_FILTER = 0,
  172. FILTER_KALMAN = 1,
  173. };
  174. struct SQLTHREAD_DATA//写数据库线程传递的参数
  175. {
  176. char* pText;//数据库语句地址指针
  177. int nRepeatTimes;//已经重试几次
  178. };
  179. // 定位坐标
  180. struct _coordinate{
  181. _coordinate(){
  182. t = 0;
  183. reader_id = 0;
  184. tt = 0;
  185. d = 0.0;
  186. st = 0;
  187. x = 0.0;
  188. y = 0.0;
  189. z = 0.0;
  190. a = 0.0;
  191. v = 0.0;
  192. antenna_id = 0;
  193. d_offset = 0.0;
  194. special = 0;
  195. acceleration = 0;
  196. acce_state = 0;
  197. acce_state_last = 0;
  198. }
  199. int t; // 定位时间戳
  200. int reader_id;
  201. unsigned long long tt;
  202. double d; // 距离
  203. double x; // x坐标
  204. double y; // y坐标
  205. double z; // z坐标
  206. double a; // 平面角度
  207. double v; // 速度
  208. int antenna_id;
  209. double d_offset; // 与显示距离的偏移,用来修正单基站的情况
  210. int st; //同步序号
  211. double acceleration; //加速度
  212. int acce_state; //加速度状态
  213. int acce_state_last; //加速度计上一次状态
  214. int special; //分站是否属于特殊分站,0属于特殊分站,1普通分站
  215. _coordinate& operator=(_coordinate &tmp){
  216. t = tmp.t;
  217. reader_id = tmp.reader_id;
  218. tt = tmp.tt;
  219. d = tmp.d;
  220. st = tmp.st;
  221. x = tmp.x;
  222. y = tmp.y;
  223. z = tmp.z;
  224. a = tmp.a;
  225. v = tmp.v;
  226. antenna_id = tmp.antenna_id;
  227. d_offset = tmp.d_offset;
  228. special = tmp.special;
  229. acceleration = tmp.acceleration;
  230. acce_state = tmp.acce_state;
  231. acce_state_last = tmp.acce_state_last;
  232. return *this;
  233. }
  234. };
  235. struct _point{ // 坐标
  236. double x;
  237. double y;
  238. double z;
  239. };
  240. struct sync_data{
  241. double x;
  242. double y;
  243. double vx;
  244. double vy;
  245. int sync_num; //本次同步号
  246. bool update;
  247. sync_data(){
  248. x = 0.0;
  249. y = 0.0;
  250. vx = 0.0;
  251. vy = 0.0;
  252. sync_num = 0;
  253. update = false;
  254. }
  255. sync_data& operator=(sync_data&tmp){
  256. x = tmp.x;
  257. y = tmp.y;
  258. vx = tmp.vx;
  259. vy = tmp.vy;
  260. sync_num = tmp.sync_num;
  261. update = tmp.update;
  262. return *this;
  263. }
  264. };
  265. struct _call_info_card
  266. {
  267. int card_id;
  268. int card_type;
  269. int call_type;
  270. string str_card_id;
  271. time_t start_time;
  272. int time_out;
  273. bool is_success;
  274. };
  275. typedef map<std::string, _call_info_card*> CallInfoCardMap;
  276. struct _call_info_reader
  277. {
  278. bool is_call_all;
  279. bool is_start_call; //true,开始呼叫;false,取消呼叫
  280. BYTE call_type;
  281. int cards_count;
  282. CallInfoCardMap mpCard;
  283. };
  284. typedef map<int, _call_info_reader*> CallInfoReaderMap;
  285. // 分站接收时间定义
  286. struct ReceiveData{
  287. unsigned int reader_id; // 分站号
  288. unsigned short antenna_id; // 天线号
  289. long long rec_time_stamp; // 分站接收时间,一个5字节的无符号数
  290. int special;
  291. double x; //分站的x坐标
  292. double y; //分站的y坐标
  293. double z; //分站的z坐标
  294. ReceiveData(){
  295. reader_id = -1;
  296. antenna_id = -1;
  297. rec_time_stamp = 0;
  298. x = y = z = 0.0;
  299. special = -1;
  300. };
  301. };
  302. typedef unordered_map<int,ReceiveData> ReceiveDataMap;
  303. //typedef unordered_map<int,ReceiveData*> ReceiveDataMap;
  304. struct INFO_PRE{
  305. int t;
  306. long long detaT;
  307. double dist;
  308. int ant;
  309. int sta_num;
  310. };
  311. struct POS{
  312. double posx;
  313. double posy;
  314. double posz;
  315. double pos_radius;
  316. //保存定位结果的两个分站信息
  317. int nFirstReader;
  318. int nSecondReader;
  319. //精度参考
  320. double dFirstDiff;
  321. double dSecondDiff;
  322. POS(){
  323. nFirstReader = INVALID_COORDINATE;
  324. nSecondReader = INVALID_COORDINATE;
  325. posx = 0;
  326. posy = 0;
  327. posz = 0;
  328. dFirstDiff = 0;
  329. dSecondDiff = 0;
  330. pos_radius = 0;
  331. }
  332. POS& operator=(POS& tmp){
  333. nFirstReader = tmp.nFirstReader;
  334. nSecondReader = tmp.nSecondReader;
  335. posx = tmp.posx;
  336. posy = tmp.posy;
  337. posz = tmp.posz;
  338. dFirstDiff = tmp.dFirstDiff;
  339. dSecondDiff = tmp.dSecondDiff;
  340. pos_radius = tmp.pos_radius;
  341. return *this;
  342. }
  343. };
  344. struct RESULT{
  345. double x[3];
  346. double y[3];
  347. double z[3];
  348. int nCount;
  349. };
  350. class Mine;
  351. class Area;
  352. class Reader;
  353. class Card;
  354. class MapInfo;
  355. class Dept;
  356. class ReaderPath;
  357. typedef map<string, Card*> CardMap;
  358. typedef map<int, Area*> AreaMap;
  359. typedef map<int, Reader*> ReaderMap;
  360. typedef map<int, MapInfo*> MapInfoMap;
  361. typedef map<int, Dept*> DeptMap;
  362. typedef map<int, string> AlarmTypeMap;
  363. typedef map<int,ReaderPath*> ReaderPathMap;
  364. typedef unordered_map<int,ReaderPathMap*> TDOAReaderPathMap;
  365. typedef unordered_map<string, _coordinate*> DistMap;
  366. struct DistQueMapItem
  367. {
  368. WORD cardstamp;
  369. DistMap distmap;
  370. };
  371. typedef deque<DistQueMapItem> DistQueMap;
  372. // 地图
  373. class MapInfo{
  374. public:
  375. MapInfo(void);
  376. ~MapInfo(void);
  377. public:
  378. int map_id;
  379. string map_path;
  380. string map_name;
  381. double map_width;
  382. double map_height;
  383. double map_scale;
  384. int map_type;
  385. AreaMap map_area_list;
  386. ReaderMap map_reader_list;
  387. CardMap map_card_list_person;
  388. CardMap map_card_list_vehicle;
  389. };
  390. // 区域
  391. class Area // 矩形
  392. {
  393. private:
  394. std::vector<std::string> split(std::string str,std::string pattern);
  395. double get_vertex(std::string src); // 顶点
  396. public:
  397. Area(void);
  398. ~Area(void);
  399. void init_border(string sz_path);
  400. bool is_in_polygon(_point p);
  401. public:
  402. int map_id;
  403. int area_id;
  404. string area_name;
  405. string area_type_name;
  406. int area_type_id;
  407. string path; // 多边形
  408. // 人员
  409. int over_count_person;
  410. int over_time_person;
  411. int under_count_person;
  412. int under_time_person;
  413. // 车辆
  414. int over_count_vehicle;
  415. int over_time_vehicle;
  416. int under_count_vehicle;
  417. int under_time_vehicle;
  418. int polygon_count;
  419. _point* polygon;
  420. // 坐标
  421. //double x;
  422. //double y;
  423. //double z;
  424. //double sr; // 短半径
  425. //double lr; // 长半径
  426. //double x1, y1, z1; // 矩形四个顶点
  427. //double x2, y2, z2;
  428. //double x3, y3, z3;
  429. //double x4, y4, z4;
  430. double rect_left;
  431. double rect_right;
  432. double rect_top;
  433. double rect_bottom;
  434. // 区域人数
  435. int count_person;
  436. int count_vehicle;
  437. int count_card;
  438. // 是否写考勤
  439. int is_att; // 0 停车场外,1 停车场内
  440. //
  441. bool is_area_over_time_person; // 车辆超时
  442. bool is_area_over_time_vehicle; // 人员超时
  443. int count_area_over_time_person; // 超时人数
  444. int count_area_over_time_vehicle; // 超时车数
  445. time_t time_over_time_person; // 开始超时时间
  446. time_t time_over_time_vehicle; // 开始超时时间
  447. bool is_area_over_count_person; // 人员超员
  448. bool is_area_over_count_vehicle; // 车辆超员
  449. int count_area_over_count_person;
  450. int count_area_over_count_vehicle;
  451. time_t time_over_count_person; // 开始时间
  452. time_t time_over_count_vehicle; // 开始时间
  453. bool is_area_forbidden_person;
  454. bool is_area_forbidden_vehicle;
  455. int count_area_forbidden_person;
  456. int count_area_forbidden_vehicle;
  457. time_t time_forbidden_person; // 开始时间
  458. time_t time_forbidden_vehicle; // 开始时间
  459. CardMap area_card_list_person;
  460. CardMap area_card_list_vehicle;
  461. };
  462. // 自组网预置坐标
  463. class Adhoc
  464. {
  465. public:
  466. Adhoc();
  467. ~Adhoc();
  468. public:
  469. int adhoc_id;
  470. double x;
  471. double y;
  472. double z;
  473. int idx;
  474. };
  475. // 天线
  476. class Antenna
  477. {
  478. public:
  479. Antenna(void);
  480. ~Antenna(void);
  481. public:
  482. int antenna_id;
  483. double antenna_x;
  484. double antenna_y;
  485. double antenna_z;
  486. double antenna_angle;
  487. };
  488. // 分站
  489. class Reader
  490. {
  491. public:
  492. Reader(void);
  493. ~Reader(void);
  494. public:
  495. int reader_id; // 分站号
  496. string reader_name; // 分站名称
  497. int device_type_id;
  498. int pos_state; // 位置状态 1井上,2井下
  499. string ip;
  500. double reader_x;
  501. double reader_y;
  502. double reader_z;
  503. double reader_angle;
  504. double reader_interval_time;
  505. int map_id; // 所在地图
  506. int area_id; // 所属区域
  507. double map_scale; // 比例尺
  508. //double rec_time; // 接收数据时间
  509. time_t rec_time;
  510. time_t reader_time; // 分站时间
  511. time_t lost_time;
  512. int temperature; // 温度
  513. int tick_count; // 计数器
  514. int state; // 状态 0 正常, 1 故障
  515. int sync_level;
  516. int state_old; // 上一次状态
  517. Antenna* ant[ANTENNA_COUNT]; // 两个天线
  518. Adhoc* adhoc[ADHOC_COUNT];// 自组网节点预置坐标
  519. map<int,_point> readerCoveragePath;
  520. bool bIsInitCoverage;
  521. int m_nIsSpecial;
  522. public:
  523. string get_state_text();
  524. };
  525. // 卡
  526. class Card
  527. {
  528. public:
  529. Card(void);
  530. ~Card(void);
  531. Card(string cardid, int cardtype,double z_offset, double offset_x = 12.0, double offset_y =12.0);
  532. public:
  533. CRITICAL_SECTION m_csCard;
  534. public:
  535. int card_type; // 卡类型 0x01人, 0x02车
  536. //int64_t card_id; // 卡唯一标识, 高位为卡号,低位为卡类型, ((card_id << 8) | card_type)
  537. string card_id;
  538. // 人员
  539. string level; // 级别
  540. string occupation; // 职务
  541. // 人员、车辆
  542. string id; // 编号,人员或车辆
  543. string name; // 姓名、车辆名称
  544. string number; // 身份证号码,车牌号码
  545. string photo; // 照片
  546. string company; // 单位
  547. string department; // 部门
  548. int dept_id;
  549. int group_id;
  550. string group; // 班组
  551. string worktype; // 工种、车辆类型
  552. //time_t deal_time; // 最后处理卡逻辑时间
  553. SYSTEMTIME deal_time;
  554. //SYSTEMTIME down_time;
  555. time_t rec_time; // 最后接收时间
  556. time_t down_time; // 入井时间
  557. time_t up_time; // 升井时间
  558. time_t enter_area_time; // 进入区域时间
  559. time_t enter_reader_time; // 进入分站时间
  560. time_t low_power_time; // 电量低开始时间
  561. //time_t enter_park_time; // 回场时间
  562. //time_t leave_park_time; // 出场时间, 开始工作时间
  563. double coor_offset_x;
  564. double coor_offset_y;
  565. double x;
  566. double y;
  567. double z;
  568. double a; // 上次定位时的角度
  569. int t; // 上次定位时的时间戳
  570. double z_offset;
  571. bool init_postion;
  572. bool is_first_location;
  573. double v; //速度
  574. double m_dAverageV; //平均速度
  575. double xx;
  576. double yy;
  577. double zz;
  578. double x1, x2, x3, x4;
  579. double y1, y2, y3, y4;
  580. double z1, z2, z3, z4;
  581. double last_x;
  582. double last_y;
  583. double last_z;
  584. double stored_x;
  585. double stored_y;
  586. double stored_z;
  587. double last_vx;
  588. double last_vy;
  589. int state; // 0 正常, 共32bit,每个bit代表一个状态,从右起:
  590. // 第一位 0x01 井下超时, 第二位 0x02 区域超时, 第三位 0x04 超速, 第四位 0x08, 进入限制区域
  591. // 状态,故障、电量低等
  592. int state_moving; // 运动状态, 0 静止,1 启动
  593. int state_biz; //业务状态,呼叫/超时/进入禁区等
  594. // 电量低、 呼叫、呼救
  595. int status_over_time; // 0 未超时,1 超时
  596. int status_over_speed; // 0 未超速,1 超速
  597. int status_area_over_time; // 0 未区域超时, 1 区域超时
  598. int status_area_over_speed; // 0 未区域超速, 1 区域超速
  599. int status_area_forbidden; // 0 未进入限制区域, 1 进入限制区域
  600. int status_help; // 0 未呼救, 1 呼救, 2 已处理呼救
  601. int status_call; // 0 未呼叫 1 呼叫
  602. int status_power; // 0 电量正常,1 电量低
  603. int status_lost; // 0 未进入盲区,1 盲区状态
  604. int map_id; // 当前地图
  605. double map_scale; // 地图比例尺
  606. int map_id_old; // 上次测距所在地图
  607. int area_id; // 当前区域
  608. int reader_id; // 当前分站
  609. Reader* p_reader;
  610. ReaderPathMap* pReaderPathMap;
  611. TDOAReaderPathMap* pTdoaReaderPathMap;
  612. _coordinate** p_dists;
  613. _coordinate** p_dists_locate;
  614. _coordinate last_locate;
  615. _coordinate origin_locate;
  616. double m_dFirstDiff;
  617. double m_dSecondDiff;
  618. DistQueMap _dists;
  619. int time_stamp_max; // 最大时间戳,即需要计算定位的时间戳
  620. int time_stamp_cal;
  621. //int get_pos_state() const { return pos_state; }
  622. //void set_pos_state(int val) ;
  623. //int get_pos_state_count() const { return pos_state_count; }
  624. int pos_state; // 位置状态,0初始化,1井下,2井上,3车场分站
  625. int pos_state_old;
  626. //int pos_state_last;
  627. int pos_state_count; // 当前位置状态确认次数
  628. int pos_state_park; // 在停车场区域状态
  629. int pos_state_park_old;
  630. //int pos_state_park_last;
  631. int pos_state_park_count;
  632. int m_nFilterType;
  633. int m_nLastLocateT;
  634. int m_nCalcSyncNum; //卡在算法中的同步号,此同步号和卡的实时同步号并不一定一致
  635. int m_nSyncNumInList; //从队列中取出的大于5的同步号
  636. //int last_area_type_id;
  637. //int cur_area_type_id;
  638. bool issent; // true 已发送至客户端,false 新数据,需要发送至客户端
  639. bool issaved; //true 已保存到数据库,false 生成新的考勤记录,需要保存到数据库
  640. bool isdealed; // 已经处理
  641. bool isreceive; // 接收到
  642. bool is_pos_changed;
  643. bool is_deal_by_algo;
  644. bool is_hist;
  645. bool is_need_cal;
  646. bool m_bUseFilter;
  647. bool is_mine_over_time; // 是否井下超时
  648. bool is_area_over_time; // 是否区域超时, 区域超时分车辆超时、人员超时
  649. time_t time_area_over_time; // 区域超时开始时间
  650. time_t time_over_time; // 井下超时开始时间
  651. time_t time_area_forbidden; // 进入限制区域时间
  652. time_t time_over_speed; // 超速开始时间
  653. time_t time_low_power;
  654. void set_reader(Reader* preader);
  655. bool is_pos_state_changed(int nval); // 入\升井状态变化
  656. bool is_pos_state_pack_changed(int nval);
  657. void add_dist(_coordinate* dist);
  658. void remove_dist_head();
  659. string concat(int reader_id, int ant_id);
  660. time_t get_working_time();
  661. string get_state_text();
  662. string get_acc_text();
  663. double get_speed();
  664. int get_effictive_dist_count(int offset = 0);
  665. void set_reader_path(ReaderPathMap *rpm);
  666. void set_reader_path(TDOAReaderPathMap* trpm);
  667. void inspect_coordinate(int acce_state,int acce_state_last);
  668. void algo_tof(int cnt);
  669. void algo_tdoa(int cnt);
  670. public:
  671. // 滤波算法相关
  672. CKalmanFilter* m_pKalmanFilter;
  673. //int m_max_stamp; // 最大的时间戳,即最近采集的数据
  674. list<sync_data> m_syncNumList;
  675. int last_s_locate_reader[2]; //上一次定位成功的分站信息
  676. double ins_weight;
  677. double uwb_weight;
  678. double weight;
  679. int acc_change_state; //加速度计状态改变,0为未改变,1为改变
  680. int acce_cur_state; //在算法中保存当前加速度状态,保存这两个值的原因是在多线程情况下accelerate_state和accelerate_state_last状态可能变化
  681. int acce_last_state; //在算法中保存上一次加速度状态
  682. bool is_anchor_changed;
  683. void get_coordinate();
  684. void get_coordinate(int cnt);
  685. void get_coordinate_3d(int cnt);
  686. void get_coordinate_2d(int cnt);
  687. void set_anchors(int cnt);
  688. void EnableFilter(int nType);
  689. int FindDistMap(int cardstamp);
  690. private:
  691. bool b_long_interval; //上一次定位的间隔时间差大于10s
  692. public:
  693. bool b_pos_change; //位置发生了改变
  694. public: // 采集到的底层数据
  695. int reader_tickcount;
  696. int time_stamp; // 定位时间戳
  697. int ranging_type; // 报文类型 tof,tdoa
  698. int accelerate_state; // 加速度
  699. int antenna_id; // 天线号
  700. double antenna_angle; // 天线角度
  701. double distance; // 距离
  702. int64_t flying_time; // 飞行时间
  703. int power_state; // 电量
  704. int sync_num;
  705. int time_stamp_last; // 定位时间戳
  706. int context_type_last; // 报文类型 tof,tdoa
  707. int accelerate_state_last; // 加速度
  708. int antenna_id_last; // 天线号
  709. double antenna_angle_last; // 天线角度
  710. double distance_last; // 距离
  711. int64_t flying_time_last; // 飞行时间
  712. int power_state_last; // 电量
  713. int reader_id_last; //上一次定位时间戳的分站id
  714. string str_his_time;
  715. string str_rec_time;
  716. };
  717. class Dept
  718. {
  719. public:
  720. Dept();
  721. ~Dept();
  722. Dept(int id, string name);
  723. private:
  724. public:
  725. int dept_id;
  726. string dept_name;
  727. CardMap dept_card_list_person;
  728. CardMap dept_card_list_vehicle;
  729. };
  730. /*
  731. * 地图集路径描述
  732. */
  733. class ReaderPath{
  734. public:
  735. ReaderPath(){
  736. bIsInit = false;
  737. nRealCalcPoints = 0;
  738. x[0] = x[1] = y[0] = y[1] = 0;
  739. for(int i=0;i<MAX_CALC_POINTS;i++){
  740. px[i] = py[i] = pz[i] = 0;
  741. }
  742. }
  743. public:
  744. //对于TOF而言,x,y表示1,2天线对应的坐标
  745. //对于TDOA而言,x,y表示焦点F1,F2(等同于分站i,i+1)的坐标
  746. int nRealCalcPoints;
  747. double x[2];
  748. double y[2];
  749. double z[2];
  750. double px[MAX_CALC_POINTS];
  751. double py[MAX_CALC_POINTS];
  752. double pz[MAX_CALC_POINTS];
  753. bool bIsInit;
  754. };
  755. #endif //YASERVER_CLASSDEF_H_