classdef.h 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585
  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 MINE_EVENT_COUNT 3
  7. #define SECTION_EVENT_COUNT 6
  8. #define AREA_EVENT_COUNT 5
  9. #define CARD_EVENT_COUNT 30
  10. #define READER_EVENT_COUNT 12
  11. #define KALMAN_OFFSET_COOR 0.01
  12. #define KALMAN_OFFSET_MOVE 1
  13. #define KALMAN_OFFSET_RANGING 0.01
  14. #define KALMAN_INTERVAL 0.3
  15. #define KALMAN_OFFSET_COOR_TRI 0.01
  16. #define KALMAN_OFFSET_MOVE_TRI 1
  17. #define KALMAN_OFFSET_RANGING_TRI 0.09
  18. #define KALMAN_INTERVAL_TRI 1
  19. #define ANTENNA_COUNT 2
  20. #define ADHOC_COUNT 10
  21. #define READER_TIMEOUT 20
  22. #define CARD_LOST_TIME_OUT 30
  23. #define READER_SEND_STATE_TIMEOUT 10 // (2* 60 * 60)
  24. #define OVER_TIME (480 * 60)
  25. //#define CARD_TYPE_ADHOC 3
  26. #define MAX_SEMACOUNT 64
  27. //#define INVALID_COORDINATE -1
  28. //算法类型
  29. //#define ALGORITHM_TYPE_TOF
  30. #define ALGORITHM_TYPE_TDOA
  31. //#define ALGORITHM_TYPE_INS //使用惯导判断
  32. #include <string>
  33. #include <ctime>
  34. #include <map>
  35. #include <iostream>
  36. #include <string>
  37. #include <vector>
  38. #include <unordered_map>
  39. #include <deque>
  40. #include <mutex>
  41. #include <thread>
  42. //#include "winsock2.h"
  43. #include <kalman\locate.h>
  44. #include "Filter\KalmanFilter.h"
  45. #include "algorithm\FittingPosition.h"
  46. #include "LocateRecord.h"
  47. #define MIN(x,y) (x < y ? x : y)
  48. #define MAX(x,y) (x > y ? x : y)
  49. using namespace std;
  50. //算法中使用的常量定义
  51. const int MAX_CALC_POINTS = 30;
  52. const double INS_WEIGHT = 9.0; //惯导权重
  53. const double UWB_WEIGHT = 1.0; //UWB权重
  54. const double MAX_VECHILE_SPEED = 30.0; //25
  55. const double NEAR_READER = 4.0;
  56. const double MIN_DIFFER_DISTANCE = 10.0;
  57. const double VECHILE_ACCELERATE_THRESHOLD = 10;
  58. const double PERSON_ACCELERATE_THRESHOLD = 3;
  59. const int ACCELERATE_INIT_STATE = -10;
  60. const double INVALID_COORDINATE = -1000.0;
  61. const double CHAMBER_WIDTH = 10.0; //特指前端展现巷道的宽度,单位为像素
  62. const double VEHICLE_WIDTH = 10.0;
  63. const int MAX_READER_TDOA_PATH_NUMS = 10; //主要是因为拐弯处可能存在多解的原因
  64. const int LIGHT_CTRL_DELAY = 2000;
  65. enum ALARM_FLAG{
  66. //AF_CARD_OVER_COUNT = 1,
  67. //AF_CARD_AREA_OVER_COUNT,
  68. AF_CARD_OVER_TIME,
  69. AF_CARD_OVER_SPEED,
  70. AF_CARD_AREA_OVER_SPEED,
  71. AF_CARD_AREA_OVER_TIME,
  72. AF_CARD_LOW_POWER,
  73. AF_CARD_LOW_POWER_SERIOUS,
  74. AF_CARD_AREA_FORBIDDEN,
  75. AF_AREA_OVER_COUNT,
  76. AF_AREA_OVER_TIME,
  77. AF_AREA_FORBIDDEN,
  78. AF_CARD_OVER_COUNT
  79. };
  80. enum EDIT_TYPE_ID{
  81. ET_INSERT = 0, // 新增
  82. ET_UPDATE, // 修改
  83. ET_DELETE // 删除
  84. };
  85. enum ALARM_TYPE_ID
  86. {
  87. ATID_OVER_COUNT_PERSON = 1,
  88. ATID_POWER,
  89. ATID_OVER_COUNT_VEHICLE,
  90. };
  91. enum STATUS_DEVICE{
  92. STATUS_DEVICE_NORMAL = 0,
  93. STATUS_DEVICE_ERROR,
  94. };
  95. enum STATUS_CARD
  96. {
  97. STATUS_NORMAL = 0, //正常
  98. STATUS_ERROR = 1,
  99. STATUS_ERROR_SERIOUS = 2,
  100. STATUS_POWER_LOWER = 1, //电量低
  101. STATUS_POWER_LOWER_SERIOUS = 2, //电量极低
  102. STATUS_OVER_TIME = 4, //超时
  103. //STATUS_OVER_COUNT = 1,
  104. STATUS_OVER_SPEED = 8, //超速
  105. STATUS_AREA_OVER_TIME = 16, //区域超时
  106. //STATUS_AREA_OVER_COUNT = 1,
  107. STATUS_AREA_OVER_SPEED = 32, //区域超速
  108. STATUS_AREA_FORBIDDEN = 64, //进入限制区域
  109. STATUS_HELP = 128, //呼救
  110. STATUS_HELP_DEALED = 256, //
  111. STATUS_CALL = 512, //呼叫
  112. STATUS_LOST = 1024 //进入盲区
  113. //STATUS_ERROR_DEALED,
  114. };
  115. enum STORE_CARD_DATA_FLAG{
  116. HIS_LOCATION = 0,
  117. HIS_RAW_DATA,
  118. HIS_AREA_LOCATION_ENTER,
  119. HIS_AREA_LOCATION_LEAVE,
  120. RPT_ATTEND_DOWN,
  121. RPT_ATTEND_UP
  122. };
  123. enum STORE_MINE_DATA_FLAG{
  124. ALARM_MINE_OVER_COUNT_PERSON_START = 0,
  125. ALARM_MINE_OVER_COUNT_PERSON_END,
  126. ALARM_MINE_OVER_COUNT_VEHICLE_START,
  127. ALARM_MINE_OVER_COUNT_VEHICLE_END
  128. };
  129. enum STORE_LIGHT_DATA_FLAG{
  130. ALARM_LIGHT_FAULT_START= 0, //故障开始
  131. ALARM_LIGHT_FAULT_END, //故障结束
  132. ALARM_LIGHT_NETWORK_START, //网络故障开始
  133. ALARM_LIGHT_NETWORK_END, //网络故障结束
  134. ALARM_LIGHT_CONTROL_FAILE //控制失败
  135. };
  136. enum STORE_SECTION_DATA_FLAG{
  137. ALARM_SECTION_START = 0, // 区段告警开始
  138. ALARM_SECTION_END // 区段告警结束
  139. };
  140. enum LIGHT_STATE{
  141. LIGHT_NORMAL = 0, // 正常
  142. LIGHT_FAULT, // 异常
  143. LIGHT_NETWORK_ERROR, // 网络故障
  144. LIGHT_CONTROL_ERROR // 控制失败
  145. };
  146. enum LOCATE_TYPE
  147. {
  148. LT_COORDINATE = 0, // 使用坐标定位
  149. LT_READER, // 使用分站定位
  150. };
  151. enum FILTER_TYPE{
  152. NO_FILTER = 0, // 不使用滤波
  153. FILTER_KALMAN = 1, // 使用kalman滤波
  154. };
  155. enum SECTION_STATE{
  156. SECTION_STATE_NORMAL = 0, //正常
  157. SECTION_STATE_BUSY = 1, //繁忙
  158. SECTION_STATE_CONGESTION = 2, //拥堵
  159. };
  160. enum LIGHT_SHAPE{
  161. RED_CIRCLE_SOLID = 1, //红色实心圆
  162. RED_CIRCLE = 2, //红色空心圆
  163. RED_CROSS = 3, //红色叉形
  164. GREEN_UP = 4, //绿色上箭头
  165. GREEN_DOWN = 5, //绿色下箭头
  166. GREEN_LEFT = 6, //绿色左箭头
  167. GREEN_RIGHT = 7, //绿色右箭头
  168. RED_SPARK = 8, //红色闪烁
  169. GREEN_SPARK = 9 //绿色闪烁
  170. };
  171. enum LIGHT_STREAM{
  172. UP_STREAM = 1, //上行
  173. DOWN_STREAM = 2, //下行
  174. };
  175. enum LIGHT_COLOR{
  176. COLOR_RED = 1, // 红色
  177. COLOR_GREEN = 2, // 绿色
  178. };
  179. enum LIGHT_CTRL_STATE{
  180. CTRL_STATE_AUTO = 1, // 自动控制
  181. CTRL_STATE_MANUAL = 2, // 手动控制
  182. };
  183. enum LIGHTS_SELECT_TYPE
  184. {
  185. LST_ALL_LIGHTS = 0, // 所有灯
  186. LST_ALL_UP_LIGHTS = 1, // 所有上行
  187. LST_ALL_DWON_LIGHTS = 2,// 所有下行
  188. LST_SOME_LIGHTS = 3 // 指定灯
  189. };
  190. enum AREA_PROPERTY{
  191. MAIN_TUNNEL = 0, // 主巷道
  192. BRANCH_TUNNEL = 1, // 分支巷道
  193. };
  194. enum OUTPUT_POS{
  195. CENTRAL_POS = 0, // 居中
  196. LEFT_POS, // 靠左
  197. RIGHT_POS // 靠右
  198. };
  199. enum PATROL_STATE
  200. {
  201. PS_NORMAL = 0, // 正常
  202. PS_EARLY, // 早到
  203. PS_LATE, // 迟到
  204. PS_NON_ARRIVAL // 未到
  205. };
  206. enum PATROL_STAY_STATE
  207. {
  208. PSS_NORMAL = 0, // 正常
  209. PSS_TOO_LONG, // 停留过长
  210. PSS_TOO_SHORT // 停留太短
  211. };
  212. enum ALGO_LOC_TYPE{
  213. ALGO_LOC_SUCCESSED = 0, //算法定位成功
  214. ALGO_FAILED_CONDITION_1, //同步序号相差大于5
  215. ALGO_FAILED_CONDITION_2, //相同卡序列号,时间同步序号却相差大于5
  216. ALGO_FAILED_CONDITION_3, //时间同步戳值存在异常
  217. ALGO_FAILED_CONDITION_4, //卡的上次时间戳大于卡的本次时间戳
  218. ALGO_FAILED_CONDITION_5, //人卡加速度超限
  219. ALGO_FAILED_CONDITION_6, //车卡加速度超限
  220. ALGO_FAILED_CONDITION_7, //车卡速度超限
  221. ALGO_FAILED_CONDITION_8, //卡尔曼连续2s定位失败等
  222. ALGO_FAILED_CONDITION_9, //分站时间戳的距离差值大于分站之间的距离
  223. ALGO_FAILED_CONDITION_10, //分站之间无地图集
  224. ALGO_FAILED_CONDITION_11, //定位无解or解的个数为0
  225. ALGO_FAILED_CONDITION_12, //分站附近(小于4m),分站不是特殊分站
  226. ALGO_FAILED_CONDITION_13, //解与无地图集两分站之间的距离差(大于10m)
  227. ALGO_FAILED_CONDITION_14, //定位结果距离定位分站之间的距离差大于4
  228. ALGO_FAILED_CONDITION_15, //参与定位的数据条数小于2
  229. ALGO_LOC_TOTAL
  230. };
  231. enum ALGO_RETURN_VALUE{
  232. DIST_COUNT_LESS_THAN_TWO = 10001,
  233. DIST_COUNT_LESS_FOR_TIMESTAMP_ERROR,
  234. DIST_COUNT_LESS_FOR_SYNC_NUM_DIFFER_FIVE,
  235. ALGO_CALC_SOLUTION = 30001,
  236. ALGO_CALC_NO_SOLUTION_WITH_TWO_DATA,
  237. ALGO_CALC_ONE_DATA,
  238. SOLUTION_NO_SOLUTION = 40001,
  239. SOLUTION_NEAR_READER,
  240. SOLUTION_TWO_SOLUTION,
  241. SOLUTION_ERROR_STREAM,
  242. POSITION_INVALID,
  243. CHECK_PERSON_ACCE_OVER_SPEED = 50001,
  244. CHECK_VEHICLE_ACCE_OVER_SPEED,
  245. CHECK_VEHICLE_OVER_SPEED,
  246. KALMAN_FILTER_LONG_INTERVAL = 60001,
  247. ALGO_USE_KALMAN_FILTER = 70001,
  248. };
  249. extern unsigned int g_nAlgoFailedCounts[ALGO_LOC_TOTAL]; //全局的统计所有次数
  250. extern unsigned int g_nAlgoFailedCycleCounts[ALGO_LOC_TOTAL]; //指定周期内的所有统计次数
  251. extern ULONGLONG g_ullCurTime;
  252. #define ALGORITHM_FAILED(nType) { \
  253. g_nAlgoFailedCounts[nType]++; \
  254. }
  255. struct AlgoFailedMsg{
  256. std::string strCardId;
  257. int nCardStamp;
  258. int nType;
  259. SYSTEMTIME st;
  260. bool bStatus;
  261. AlgoFailedMsg(){
  262. strCardId = "";
  263. nCardStamp = 0;
  264. nType = 0;
  265. bStatus = false;
  266. }
  267. };
  268. enum DEVICE_TYPE{
  269. DT_CARD_READER = 0, //读卡分站
  270. DT_CTRL_READER = 1, // 控制分站
  271. DT_LIGHT = 3, // 红绿灯
  272. DT_SPEAKER = 4, // 告警器
  273. DT_TURNOUT = 5, // 道岔
  274. DT_LED = 6 // 显示屏
  275. };
  276. enum CALL_STATE{
  277. CALL_NONE = 0, //无呼叫信息
  278. CALL_SUCCESSED = 1, //呼叫成功
  279. CALL_ING = 2, //呼叫中
  280. CALL_FAILED = 3, //呼叫失败
  281. };
  282. struct SQLTHREAD_DATA//写数据库线程传递的参数
  283. {
  284. char* pText;//数据库语句地址指针
  285. int nRepeatTimes;//已经重试几次
  286. };
  287. // 定位坐标
  288. struct _coordinate{
  289. _coordinate(){
  290. t = 0;
  291. reader_id = 0;
  292. tt = 0;
  293. d = 0.0;
  294. sync_num = 0;
  295. x = 0.0;
  296. y = 0.0;
  297. z = 0.0;
  298. a = 0.0;
  299. v = 0.0;
  300. antenna_id = 0;
  301. d_offset = 0.0;
  302. special = 0;
  303. acceleration = 0;
  304. acce_state = 0;
  305. acce_state_last = 0;
  306. ins_direction = 0;
  307. }
  308. int t; // 定位时间戳
  309. int reader_id;
  310. unsigned long long syncRootId;
  311. unsigned long long tt;
  312. double d; // 距离
  313. double x; // x坐标
  314. double y; // y坐标
  315. double z; // z坐标
  316. double a; // 平面角度
  317. double v; // 速度
  318. int antenna_id;
  319. double d_offset; // 与显示距离的偏移,用来修正单基站的情况
  320. int sync_num; //同步序号
  321. double acceleration; //加速度
  322. int acce_state; //加速度状态
  323. int acce_state_last; //加速度计上一次状态
  324. int ins_direction; //惯导方向
  325. int special; //分站是否属于特殊分站,0属于特殊分站,1普通分站
  326. int reason;
  327. _coordinate& operator=(_coordinate &tmp){
  328. t = tmp.t;
  329. reader_id = tmp.reader_id;
  330. tt = tmp.tt;
  331. d = tmp.d;
  332. sync_num = tmp.sync_num;
  333. x = tmp.x;
  334. y = tmp.y;
  335. z = tmp.z;
  336. a = tmp.a;
  337. v = tmp.v;
  338. antenna_id = tmp.antenna_id;
  339. d_offset = tmp.d_offset;
  340. special = tmp.special;
  341. acceleration = tmp.acceleration;
  342. acce_state = tmp.acce_state;
  343. acce_state_last = tmp.acce_state_last;
  344. ins_direction = tmp.ins_direction;
  345. reason = ALGO_LOC_SUCCESSED;
  346. return *this;
  347. }
  348. };
  349. struct _point{ // 坐标
  350. double x;
  351. double y;
  352. double z;
  353. _point(){
  354. x=y=z=0;
  355. }
  356. _point(double a, double b, double c){
  357. x=a, y=b, z=c;
  358. }
  359. };
  360. struct sync_data{
  361. double x;
  362. double y;
  363. double vx;
  364. double vy;
  365. int sync_num; //本次同步号
  366. bool update;
  367. std::shared_ptr<nspLocate::LocateRecord> locate;
  368. sync_data(){
  369. x = 0.0;
  370. y = 0.0;
  371. vx = 0.0;
  372. vy = 0.0;
  373. sync_num = 0;
  374. update = false;
  375. locate = nullptr;
  376. }
  377. sync_data& operator=(sync_data&tmp){
  378. x = tmp.x;
  379. y = tmp.y;
  380. vx = tmp.vx;
  381. vy = tmp.vy;
  382. sync_num = tmp.sync_num;
  383. update = tmp.update;
  384. locate = tmp.locate;
  385. return *this;
  386. }
  387. };
  388. struct _call_info_card
  389. {
  390. int card_id;
  391. int card_type;
  392. int call_type;
  393. string str_card_id;
  394. time_t start_time;
  395. int time_out;
  396. //bool is_success;
  397. int call_state;
  398. };
  399. //typedef map<std::string, _call_info_card*> CallInfoCardMap;
  400. typedef map<std::string, std::shared_ptr<_call_info_card>> CallInfoCardMap;
  401. struct _call_info_reader
  402. {
  403. bool is_call_all;
  404. bool is_start_call; //true,开始呼叫;false,取消呼叫
  405. BYTE call_type;
  406. int cards_count;
  407. CallInfoCardMap mpCard;
  408. };
  409. typedef map<int, std::shared_ptr<_call_info_reader>> CallInfoReaderMap;
  410. struct _call_info_user
  411. {
  412. std::string user_name;
  413. CallInfoReaderMap mpReader;
  414. };
  415. typedef map<string, std::shared_ptr<_call_info_user>> CallInfoUserMap;
  416. // 分站接收时间定义
  417. struct ReceiveData{
  418. unsigned int reader_id; // 分站号
  419. unsigned short antenna_id; // 天线号
  420. long long rec_time_stamp; // 分站接收时间,一个5字节的无符号数
  421. int special;
  422. double x; //分站的x坐标
  423. double y; //分站的y坐标
  424. double z; //分站的z坐标
  425. ReceiveData(){
  426. reader_id = -1;
  427. antenna_id = -1;
  428. rec_time_stamp = 0;
  429. x = y = z = 0.0;
  430. special = -1;
  431. };
  432. };
  433. struct INFO_PRE{
  434. int t;
  435. long long detaT;
  436. double dist;
  437. int ant;
  438. int sta_num;
  439. };
  440. struct POS{
  441. double posx;
  442. double posy;
  443. double posz;
  444. double pos_radius;
  445. double cx;
  446. double cy;
  447. double cz;
  448. //三个方向的速度
  449. double cvx;
  450. double cvy;
  451. double cvz;
  452. //加速度
  453. double av;
  454. //保存定位结果的两个分站信息
  455. int nFirstReader;
  456. int nSecondReader;
  457. //精度参考
  458. double dDiff[MAX_READER_TDOA_PATH_NUMS];
  459. double dis_diff;
  460. int reason;
  461. int status;
  462. int card_count; //卡的ct号
  463. bool update;
  464. bool is_fit;
  465. //当前分站同步序号与参考数据的分站同步序号时间差值
  466. double diff_reader_sync_num;
  467. //参考数据的定位坐标
  468. double ref_x;
  469. double ref_y;
  470. double ref_z;
  471. double origin_speed; //原始定位结果算的速度
  472. double sumVariance; // 保存各定位解之间差值的和
  473. POS(){
  474. nFirstReader = 0;
  475. nSecondReader = 0;
  476. pos_radius = 0;
  477. posx = posy = posz = INVALID_COORDINATE;
  478. cx = cy = cz = cvx = cvy = cvz = 0.0;
  479. av = 0.0;
  480. status = 0;
  481. for (int i=0;i<MAX_READER_TDOA_PATH_NUMS;i++)
  482. {
  483. dDiff[i] = 0;
  484. }
  485. dis_diff = 999999.9;
  486. update = false;
  487. is_fit = false;
  488. origin_speed = 0;
  489. sumVariance = 0;
  490. diff_reader_sync_num = 0;
  491. ref_x = ref_y = ref_z = 0;
  492. reason = -1;
  493. reason = ALGO_LOC_SUCCESSED;
  494. }
  495. POS& operator=(POS& tmp){
  496. nFirstReader = tmp.nFirstReader;
  497. nSecondReader = tmp.nSecondReader;
  498. posx = tmp.posx;
  499. posy = tmp.posy;
  500. posz = tmp.posz;
  501. cx = tmp.cx;
  502. cy = tmp.cy;
  503. cz = tmp.cz;
  504. cvx = tmp.cvx;
  505. cvy = tmp.cvy;
  506. cvz = tmp.cvz;
  507. av = tmp.av;
  508. update = tmp.update;
  509. origin_speed = tmp.origin_speed;
  510. status = tmp.status;
  511. diff_reader_sync_num = tmp.diff_reader_sync_num;
  512. dis_diff = tmp.dis_diff;
  513. ref_x = tmp.ref_x;
  514. ref_y = tmp.ref_y;
  515. ref_z = tmp.ref_z;
  516. sumVariance = tmp.sumVariance;
  517. for (int i=0;i<MAX_READER_TDOA_PATH_NUMS;i++)
  518. {
  519. dDiff[i] = tmp.dDiff[i];
  520. }
  521. pos_radius = tmp.pos_radius;
  522. reason = ALGO_LOC_SUCCESSED;
  523. return *this;
  524. }
  525. };
  526. //解的结构体
  527. struct SOLUTION{
  528. double x[3];
  529. double y[3];
  530. double z[3];
  531. int nCount;
  532. SOLUTION(){
  533. for (int i =0;i<3;i++)
  534. {
  535. x[i] = y[i] = z[i] = INVALID_COORDINATE;
  536. nCount = 0;
  537. }
  538. }
  539. };
  540. class Mine;
  541. class Area;
  542. class SpecialAreaEntry;
  543. class DrivingfaceRender;
  544. class Reader;
  545. class Card;
  546. class MapInfo;
  547. class Dept;
  548. class ReaderPath;
  549. class PatrolPoint;
  550. class PatrolTask;
  551. class Section;
  552. class Chamber;
  553. class Light;
  554. class LightsGroup;
  555. class LightCallInfo;
  556. class StorePostion;
  557. class LandmarkInfo;
  558. class MapDirectoryInfo;
  559. typedef map<string, std::shared_ptr<Card>> CardMap;
  560. typedef map<int, std::shared_ptr<Area>> AreaMap;
  561. typedef map<int, std::shared_ptr<SpecialAreaEntry>> SpecilaAreaEntryMap;
  562. typedef map<int, std::shared_ptr<DrivingfaceRender>> DrivingfaceRenderMap;
  563. typedef map<int, std::shared_ptr<Reader>> ReaderMap;
  564. typedef map<int, std::shared_ptr<MapInfo>> MapInfoMap;
  565. typedef map<int, std::shared_ptr<MapDirectoryInfo>>MapDirectoryInfoMap;
  566. typedef map<int, std::shared_ptr<LandmarkInfo>>LandmarkInfoMap;
  567. typedef map<int, std::shared_ptr<Dept>> DeptMap;
  568. typedef map<int, string> AlarmTypeMap;
  569. typedef map<int,std::shared_ptr<ReaderPath>> ReaderPathMap;
  570. typedef unordered_map<int,std::shared_ptr<ReaderPathMap>> TDOAReaderPathMap;
  571. typedef unordered_map<std::string, std::shared_ptr<_coordinate>> DistMap;
  572. typedef map<unsigned long long ,std::shared_ptr<ReceiveData>> ReceiveDataMap;
  573. typedef map<int,std::shared_ptr<Section>> SectionMap; //路段信息
  574. typedef map<int,std::shared_ptr<Chamber>> ChamberMap; //硐室信息
  575. typedef map<int,std::shared_ptr<Light>> LightMap; //红绿灯信息
  576. typedef map<int,std::shared_ptr<LightsGroup>> LightGroupMap; //红绿灯组信息
  577. typedef map<unsigned int, std::shared_ptr<PatrolPoint>> PatrolPointMap;
  578. typedef map<unsigned int, std::shared_ptr<PatrolTask>> PatrolTaskMap;
  579. typedef map<std::string, std::shared_ptr<PatrolTask>> PatrolTaskCheckMap;
  580. typedef map<unsigned int, std::shared_ptr<PatrolPoint>> PatrolPointMap;
  581. typedef map<unsigned int, std::shared_ptr<PatrolTask>> PatrolTaskMap;
  582. typedef map<std::string, std::shared_ptr<PatrolTask>> PatrolTaskCheckMap;
  583. typedef deque<std::shared_ptr<StorePostion>> QueStrorePos;
  584. struct DistQueMapItem
  585. {
  586. WORD cardstamp;
  587. DistMap distmap;
  588. };
  589. typedef deque<DistQueMapItem> DistQueMap;
  590. // 地图
  591. class MapInfo{
  592. public:
  593. MapInfo(void);
  594. ~MapInfo(void);
  595. public:
  596. int map_id;
  597. string map_path;
  598. string map_name;
  599. double map_width;
  600. double map_height;
  601. double map_scale;
  602. int map_type;
  603. AreaMap map_area_list;
  604. ReaderMap map_reader_list;
  605. ReaderMap map_ctrl_reader_list;
  606. CardMap map_card_list_person;
  607. CardMap map_card_list_vehicle;
  608. ChamberMap map_chamber_list;
  609. SectionMap map_section_list;
  610. LightMap map_light_list;
  611. LightGroupMap map_light_group_list;
  612. };
  613. class LandmarkInfo
  614. {
  615. public:
  616. int landmark_id;
  617. string landmark_name;
  618. int map_id;
  619. double x;
  620. double y;
  621. double z;
  622. };
  623. class MapDirectoryInfo
  624. {
  625. public:
  626. int map_directory_id;
  627. int map_id;
  628. int north_angle;
  629. };
  630. // 区域
  631. class Area // 矩形
  632. {
  633. private:
  634. std::vector<std::string> split(std::string str,std::string pattern);
  635. double get_vertex(std::string src); // 顶点
  636. public:
  637. Area(void);
  638. ~Area(void);
  639. void init_border(string sz_path);
  640. bool is_in_polygon(_point p);
  641. public:
  642. int map_id;
  643. int area_id;
  644. string area_name;
  645. string area_type_name;
  646. string path; // 多边形
  647. int area_type_id;
  648. // 人员
  649. int over_count_person;
  650. int over_time_person;
  651. int under_count_person;
  652. int under_time_person;
  653. // 车辆
  654. int over_count_vehicle;
  655. int over_time_vehicle;
  656. int under_count_vehicle;
  657. int under_time_vehicle;
  658. double over_speed_vehicle; //区域车辆速度阈值
  659. int polygon_count;
  660. _point* polygon;
  661. double rect_left;
  662. double rect_right;
  663. double rect_top;
  664. double rect_bottom;
  665. // 区域人数
  666. int count_person;
  667. int count_vehicle;
  668. int count_card;
  669. // 是否写考勤
  670. int is_att; // 0 停车场外,1 停车场内
  671. bool is_area_over_time_person; // 车辆超时
  672. bool is_area_over_time_vehicle; // 人员超时
  673. int count_area_over_time_person; // 超时人数
  674. int count_area_over_time_vehicle; // 超时车数
  675. time_t time_over_time_person; // 开始超时时间
  676. time_t time_over_time_vehicle; // 开始超时时间
  677. bool is_area_over_count_person; // 人员超员
  678. bool is_area_over_count_vehicle; // 车辆超员
  679. int count_area_over_count_person;
  680. int count_area_over_count_vehicle;
  681. time_t time_over_count_person; // 开始时间
  682. time_t time_over_count_vehicle; // 开始时间
  683. bool is_area_forbidden_person;
  684. bool is_area_forbidden_vehicle;
  685. int count_area_forbidden_person;
  686. int count_area_forbidden_vehicle;
  687. time_t time_forbidden_person; // 开始时间
  688. time_t time_forbidden_vehicle; // 开始时间
  689. std::shared_ptr<CardMap> area_card_list_person;
  690. std::shared_ptr<CardMap> area_card_list_vehicle;
  691. INT64 m_event_list[AREA_EVENT_COUNT]; // 保存事件Id
  692. };
  693. class SpecialAreaEntry
  694. {
  695. public:
  696. SpecialAreaEntry(){}
  697. public:
  698. double start_point_x;
  699. double start_point_y;
  700. double start_point_z;
  701. double end_point_x;
  702. double end_point_y;
  703. double end_point_z;
  704. int special_area_id;
  705. };
  706. class DrivingfaceRender
  707. {
  708. public:
  709. DrivingfaceRender(){}
  710. public:
  711. INT drivingface_id;
  712. INT reader_id;
  713. double vertical_distance;
  714. double x;
  715. double y;
  716. double z;
  717. };
  718. // 自组网预置坐标
  719. class Adhoc
  720. {
  721. public:
  722. Adhoc();
  723. ~Adhoc();
  724. public:
  725. int adhoc_id;
  726. double x;
  727. double y;
  728. double z;
  729. int idx;
  730. };
  731. // 天线
  732. class Antenna
  733. {
  734. public:
  735. Antenna(void);
  736. ~Antenna(void);
  737. public:
  738. int antenna_id;
  739. double antenna_x;
  740. double antenna_y;
  741. double antenna_z;
  742. double antenna_angle;
  743. };
  744. // 分站
  745. class Reader
  746. {
  747. public:
  748. Reader(void);
  749. ~Reader(void);
  750. public:
  751. int reader_id; // 分站号
  752. string reader_name; // 分站名称
  753. int device_type_id;
  754. int pos_state; // 位置状态 1井上,2井下
  755. string ip;
  756. double reader_x;
  757. double reader_y;
  758. double reader_z;
  759. double reader_angle;
  760. double reader_interval_time;
  761. int map_id; // 所在地图
  762. int area_id; // 所属区域
  763. double map_scale; // 比例尺
  764. time_t rec_time;
  765. time_t reader_time; // 分站时间
  766. time_t lost_time;
  767. time_t last_send_time; // 最后向前端发送时间
  768. int temperature; // 温度
  769. int tick_count; // 计数器
  770. int reader_state; // 状态 0 正常, 1 故障
  771. int reader_state_old;
  772. int sync_level;
  773. unsigned long long sync_rootId;
  774. std::shared_ptr<Antenna> ant[ANTENNA_COUNT];
  775. std::shared_ptr<Adhoc> adhoc[ADHOC_COUNT];
  776. map<int,_point> readerCoveragePath;
  777. bool bIsInitCoverage;
  778. int m_nIsSpecial;
  779. bool init_ctrl_reader_state; //当为控制分站时,第一次需要获得此控制分站下的红绿灯状态
  780. INT64 m_event_list[READER_EVENT_COUNT]; // 保存事件Id
  781. public:
  782. string get_state_text();
  783. };
  784. class StorePostion
  785. {
  786. public:
  787. StorePostion(){
  788. x = y = z = 0;
  789. GetLocalTime(&save_time);
  790. };
  791. ~StorePostion();
  792. double x, y, z;
  793. SYSTEMTIME save_time;
  794. };
  795. // 卡
  796. class Card
  797. {
  798. public:
  799. Card(void);
  800. ~Card(void);
  801. Card(string cardid, int cardtype,double z_offset, double offset_x = 12.0, double offset_y =12.0);
  802. public:
  803. CRITICAL_SECTION m_csCard;
  804. public:
  805. int card_type; // 卡类型 0x01人, 0x02车
  806. //int64_t card_id; // 卡唯一标识, 高位为卡号,低位为卡类型, ((card_id << 8) | card_type)
  807. string card_id;
  808. // 人员
  809. string level; // 级别
  810. string occupation; // 职务
  811. // 人员、车辆
  812. string id; // 编号,人员或车辆
  813. string name; // 姓名、车辆名称
  814. string number; // 身份证号码,车牌号码
  815. string photo; // 照片
  816. string company; // 单位
  817. string department; // 部门
  818. int dept_id;
  819. int group_id;
  820. string group; // 班组
  821. string worktype; // 工种、车辆类型
  822. string driver_id; //如果是车辆,则有司机id
  823. int light_id;
  824. //time_t deal_time; // 最后处理卡逻辑时间
  825. SYSTEMTIME deal_time;
  826. SYSTEMTIME enter_area_time;
  827. //driving face write database time
  828. ULONGLONG drive_face_location_write_time;
  829. ULONGLONG drive_face_location_end_time;
  830. //SYSTEMTIME down_time;
  831. time_t rec_time; // 最后接收时间
  832. time_t down_time; // 入井时间
  833. time_t up_time; // 升井时间
  834. time_t enter_reader_time; // 进入分站时间
  835. time_t low_power_time; // 电量低开始时间
  836. double coor_offset_x;
  837. double coor_offset_y;
  838. double x;
  839. double y;
  840. double z;
  841. double driving_face_x;
  842. double driving_face_y;
  843. double driving_face_z;
  844. double driving_face_finsh_length;
  845. double a; // 上次定位时的角度
  846. int t; // 上次定位时的时间戳
  847. double z_offset;
  848. bool init_postion;
  849. bool is_first_location;
  850. int is_driving_face_start;
  851. double v; //速度
  852. double mileage;
  853. double xx;
  854. double yy;
  855. double zz;
  856. double x1, x2, x3, x4;
  857. double y1, y2, y3, y4;
  858. double z1, z2, z3, z4;
  859. double right_x,right_y,right_z; //分别指卡位置右边偏移的x,y,z坐标
  860. double left_x,left_y,left_z; //分别指卡位置左边偏移的x,y,z坐标
  861. double last_x;
  862. double last_y;
  863. double last_z;
  864. double stored_x;
  865. double stored_y;
  866. double stored_z;
  867. double output_x;
  868. double output_y;
  869. double last_vx;
  870. double last_vy;
  871. int state; // 0 正常, 共32bit,每个bit代表一个状态,从右起:
  872. // 第一位 0x01 井下超时, 第二位 0x02 区域超时, 第三位 0x04 超速, 第四位 0x08, 进入限制区域
  873. // 状态,故障、电量低等
  874. int state_moving; // 运动状态, 0 静止,1 启动
  875. int state_biz; //业务状态,呼叫/超时/进入禁区等
  876. // 电量低、 呼叫、呼救
  877. int status_over_time; // 0 未超时,1 超时
  878. int status_over_speed; // 0 未超速,1 超速
  879. int status_area_over_time; // 0 未区域超时, 1 区域超时
  880. int status_area_over_speed; // 0 未区域超速, 1 区域超速
  881. int status_area_forbidden; // 0 未进入限制区域, 1 进入限制区域
  882. int status_help; // 0 未呼救, 1 呼救, 2 已处理呼救
  883. int status_call; // 0 未呼叫 1 呼叫
  884. int status_power; // 0 电量正常,1 电量低
  885. int status_lost; // 0 未进入盲区,1 盲区状态
  886. int map_id; // 当前地图
  887. double map_scale; // 地图比例尺
  888. int map_id_old; // 上次测距所在地图
  889. int area_id; // 当前区域
  890. int landmark_id;
  891. double landmark_dis;
  892. int directory;
  893. int reader_id; // 当前分站
  894. Reader* p_reader;
  895. std::shared_ptr<ReaderPathMap> pReaderPathMap;
  896. std::shared_ptr<TDOAReaderPathMap> pTdoaReaderPathMap;
  897. _coordinate** p_dists_locate;
  898. map<unsigned long long,std::shared_ptr<_coordinate>> mp_dists_locate;
  899. _coordinate last_locate;
  900. _coordinate origin_locate;
  901. _coordinate kalman_locate;
  902. double m_dFirstDiff;
  903. double m_dSecondDiff;
  904. QueStrorePos _storepostions;
  905. DistQueMap _dists;
  906. int time_stamp_max; // 最大时间戳,即需要计算定位的时间戳
  907. int time_stamp_cal;
  908. int pos_state; // 位置状态,0初始化,1井下,2井上,3车场分站
  909. int pos_state_old;
  910. int pos_state_count; // 当前位置状态确认次数
  911. int m_nFilterType;
  912. int m_nLastLocateT;
  913. int m_nCalcSyncNum; //卡在算法中的同步号,此同步号和卡的实时同步号并不一定一致
  914. int m_nSyncNumInList; //从队列中取出的大于5的同步号
  915. int m_nStream; //上行、下行
  916. int m_nLightGroupId;
  917. int m_nMoveDirection; //1为正向运动,-1为负向运动
  918. int m_nIsRailroad; //是否为有轨车,0为无轨车,1为有轨车
  919. int m_nOutputPosState; //0为正常输出中间坐标,1为输出靠左偏移坐标,2为输出靠右偏移坐标
  920. bool issent; // true 已发送至客户端,false 新数据,需要发送至客户端
  921. bool issaved; //true 已保存到数据库,false 生成新的考勤记录,需要保存到数据库
  922. bool isdealed; // 已经处理
  923. bool isreceive; // 接收到
  924. bool is_pos_changed;
  925. bool is_deal_by_algo;
  926. bool is_hist;
  927. bool is_need_cal;
  928. bool m_bUseFilter;
  929. bool isoutput; //是否输出到json
  930. bool is_red_light;
  931. bool is_mine_over_time; // 是否井下超时
  932. bool is_mine_over_speed;
  933. bool is_area_over_time; // 是否区域超时, 区域超时分车辆超时、人员超时
  934. bool is_area_over_speed; // 是否区域超速
  935. time_t time_area_over_time; // 区域超时开始时间
  936. time_t time_over_time; // 井下超时开始时间
  937. time_t time_area_forbidden; // 进入限制区域时间
  938. time_t time_over_speed; // 超速开始时间
  939. time_t time_area_over_speed;
  940. time_t time_low_power;
  941. time_t time_red_light; //闯红灯时间
  942. time_t last_locate_time; // 最后定位时间
  943. void reset();
  944. void set_reader(std::shared_ptr<Reader> preader);
  945. //void set_reader(std::weak_ptr<Reader> preader);
  946. bool is_pos_state_changed(int nval); // 入\升井状态变化
  947. void add_dist(_coordinate* dist);
  948. void add_dist(std::shared_ptr<_coordinate> dist);
  949. void remove_dist_head();
  950. string concat(int reader_id, int ant_id);
  951. time_t get_working_time();
  952. string get_state_text();
  953. string get_acc_text();
  954. double get_speed();
  955. void set_speed(double v);
  956. int get_effictive_dist_count(int offset = 0);
  957. void set_reader_path_tof(std::shared_ptr<ReaderPathMap> rpm);
  958. void set_reader_path_tdoa(std::shared_ptr<TDOAReaderPathMap> trpm);
  959. void inspect_coordinate(int acce_state);
  960. INT64 m_event_list[CARD_EVENT_COUNT]; // 保存事件Id
  961. public:
  962. std::shared_ptr<nspLocate::LocateRecord> locate;
  963. void algo_tof(int cnt);
  964. void algo_tdoa(int cnt);
  965. int algo_tdoa_1d(int cnt); //一维定位
  966. int algo_tdoa_2d(int cnt); //二维定位
  967. int algo_tdoa_3d(int cnt); //三维定位
  968. void algo_calc_offset(); //计算偏移坐标
  969. bool algo_is_same_direction(double x,double y,double z); //检查此次方向
  970. int CheckDistData(int cnt);
  971. int AssembleDistData(std::shared_ptr<ReceiveDataMap> pRdm);
  972. int GetDeltaT(map<unsigned long long,std::shared_ptr<_coordinate>> dl);
  973. int SaveCardAlgoData(std::shared_ptr<POS>& pos);
  974. int SaveOriginDataBeforeFilter(std::shared_ptr<POS> pos);
  975. int ChooseOneSolution(std::shared_ptr<ReceiveDataMap> pRdm, std::vector<std::shared_ptr<POS>> udm_pos, std::shared_ptr<POS>& pos);// 输出唯一解
  976. int CheckSolution(std::shared_ptr<POS>& p); // 验证唯一解合法性,如速度、加速度
  977. int CheckSulutionByStream(std::shared_ptr<POS> p); //参数使用非引用,即不可修改其值
  978. bool IsExistPath(int left,int right);
  979. public:
  980. // 滤波算法相关
  981. std::unique_ptr<CKalmanFilter> m_pKalmanFilter;
  982. list<sync_data> m_syncNumList;
  983. int last_s_locate_reader[2]; //上一次定位成功的分站信息
  984. double ins_weight; //加速度计状态权重
  985. double uwb_weight; //uwb状态权重
  986. int diff_direction_counts;
  987. int acce_cur_state; //在算法中保存当前加速度状态,保存这两个值的原因是在多线程情况下accelerate_state和accelerate_state_last状态可能变化
  988. int acce_last_state; //在算法中保存上一次加速度状态
  989. std::list<double> vt_his_speed;
  990. void get_coordinate();
  991. void get_coordinate(int cnt);
  992. void get_coordinate_3d(int cnt);
  993. void set_anchors(int cnt);
  994. void EnableFilter(int nType);
  995. int FindDistMap(int cardstamp);
  996. int KalmanFilterProcess(std::shared_ptr<POS>& pos);
  997. int InitAlgoParam();
  998. bool CheckCrossCycle();
  999. public:
  1000. //在长时间无法定位的情况下使用拟合算法输出点
  1001. std::list<std::shared_ptr<POS>> his_pos; //保存之前5个点的信息
  1002. bool is_ref_pos; //判断是否作为参考点
  1003. bool have_fit_pos;
  1004. bool have_long_fit_pos;
  1005. int count_idle; //统计坐标连续有多少次没变化了,用于判断车辆是否怠速,统计5次
  1006. int cur_fit_nums; //当前拟合次数,当有新数据放入his_pos即重置它
  1007. int cur_ref_totals;
  1008. int count_change_direction; // 统计方向改变后的的连续定位次数,大于3次,改变行驶方向。
  1009. double fitting_v[REF_POSITION_NUM];
  1010. double fitting_ct[REF_POSITION_NUM];
  1011. double fitting_x[REF_POSITION_NUM];
  1012. double fitting_y[REF_POSITION_NUM];
  1013. double fit_new_x[FIT_POSITION_NUM];
  1014. double fit_new_y[FIT_POSITION_NUM];
  1015. //第二种拟合
  1016. std::list<std::shared_ptr<POS>> long_his_pos; //保存之前20个点的信息,此信息必须是UWB定位信息
  1017. double long_fitting_ct[REF_POSITION_NUM];
  1018. double long_fitting_x[REF_POSITION_NUM];
  1019. double long_fitting_y[REF_POSITION_NUM];
  1020. double long_fit_new_x[FIT_POSITION_NUM*4];
  1021. double long_fit_new_y[FIT_POSITION_NUM*4];
  1022. int UpdateFittingData(std::shared_ptr<POS> pos); //更新拟合基础数据
  1023. int CalcFittingData(); //计算拟合数据
  1024. int CalcLongFittingData();
  1025. int CalcFittingData(int ret,std::shared_ptr<POS>& pos);
  1026. int CalcLongFittingData(int ret,std::shared_ptr<POS>& pos);
  1027. int GetPosFromFittingData(std::shared_ptr<POS>& pos);
  1028. std::shared_ptr<POS> GetPosFromFittingData(); //从拟合数据获取定位坐标
  1029. int CheckSolutionByFit(int ret,std::shared_ptr<POS>& pos);
  1030. int CheckSolutionBySpeed(std::shared_ptr<POS>& pos);
  1031. private:
  1032. bool b_long_interval; //上一次定位的间隔时间差大于10s
  1033. public:
  1034. AlgoFailedMsg m_afmData;
  1035. public:
  1036. bool b_pos_change; //位置发生了改变
  1037. bool b_enter_intersection; //车辆是否进入过路口区域
  1038. public: // 采集到的底层数据
  1039. int reader_tickcount;
  1040. int time_stamp; // 定位时间戳
  1041. int ranging_type; // 报文类型 tof,tdoa
  1042. int accelerate_state; // 加速度
  1043. int antenna_id; // 天线号
  1044. double antenna_angle; // 天线角度
  1045. double distance; // 距离
  1046. int64_t flying_time; // 飞行时间
  1047. int power_state; // 电量
  1048. int sync_num;
  1049. int time_stamp_last; // 定位时间戳
  1050. int context_type_last; // 报文类型 tof,tdoa
  1051. int accelerate_state_last; // 上一次加速度状态
  1052. int antenna_id_last; // 天线号
  1053. double antenna_angle_last; // 天线角度
  1054. double distance_last; // 距离
  1055. int64_t flying_time_last; // 飞行时间
  1056. int power_state_last; // 电量
  1057. int ins_direction; //上一次的惯导合成方向
  1058. int direction; //上下行概念
  1059. int reader_id_last; //上一次定位时间戳的分站id
  1060. string str_his_time;
  1061. string str_rec_time;
  1062. public:
  1063. //测试函数
  1064. int OutputCmdLog(int n);
  1065. //呼叫信息
  1066. int call_type;
  1067. std::vector<int> vt_deal_call_reader_id;
  1068. time_t recv_call_time; //卡接收到呼叫的时间戳
  1069. };
  1070. class Dept
  1071. {
  1072. public:
  1073. Dept();
  1074. ~Dept();
  1075. Dept(int id, string name);
  1076. private:
  1077. public:
  1078. int dept_id;
  1079. string dept_name;
  1080. CardMap dept_card_list_person;
  1081. CardMap dept_card_list_vehicle;
  1082. };
  1083. /*
  1084. * 地图集路径描述
  1085. */
  1086. class ReaderPath{
  1087. public:
  1088. ReaderPath(){
  1089. bIsInit = false;
  1090. nRealCalcPoints = 0;
  1091. x[0] = x[1] = y[0] = y[1] = 0;
  1092. for(int i=0;i<MAX_CALC_POINTS;i++){
  1093. px[i] = py[i] = pz[i] = 0;
  1094. }
  1095. }
  1096. public:
  1097. //对于TOF而言,x,y表示1,2天线对应的坐标
  1098. //对于TDOA而言,x,y表示焦点F1,F2(等同于分站i,i+1)的坐标
  1099. int nRealCalcPoints;
  1100. double x[2];
  1101. double y[2];
  1102. double z[2];
  1103. double px[MAX_CALC_POINTS];
  1104. double py[MAX_CALC_POINTS];
  1105. double pz[MAX_CALC_POINTS];
  1106. bool bIsInit;
  1107. };
  1108. //红绿灯
  1109. class Light{
  1110. public:
  1111. int m_nID; //红绿灯id
  1112. int m_nMapID; //地图id
  1113. int m_nReaderID; //传输分站id
  1114. int m_nAreaID; //区域id
  1115. int m_nSectionID; //路段id
  1116. int m_nLightsGroupID; //红绿灯组id
  1117. int m_nPort; //与分站之间通信的路数
  1118. int m_nState; //红绿灯是否可用状态,0可用,1不可用
  1119. int m_nOldState;
  1120. int device_type_id; //设备类型
  1121. double x; //x坐标
  1122. double y; //y坐标
  1123. double z; //z坐标
  1124. std::string m_strIP; //红绿灯ip
  1125. std::string m_strName; //红绿灯名字
  1126. std::string m_strLabel;
  1127. time_t rec_time;
  1128. time_t last_send_time;
  1129. public:
  1130. Light();
  1131. ~Light(){}
  1132. public:
  1133. int get_light_state();
  1134. public:
  1135. int m_nStream; //0为上行,1为下行
  1136. int m_nColor; //0x01 红色, 0x02 绿色
  1137. int m_nShape; // 形状 0x01 实心圆形,0x02 空心圆形,0x03 叉形,0x04 - 0x07 上下左右箭头,0xFF 警告闪烁
  1138. int m_nStateBiz; //0为正常,1为网络故障,2为控制失败,3为灯故障
  1139. int m_nIsCtrl; // 设备控制状态 0x01 自动控制,0x02手动控制
  1140. time_t alarm_start_time;
  1141. };
  1142. class LightsGroup{
  1143. public:
  1144. int m_nID;
  1145. int m_nState;
  1146. bool m_bIsUsed;
  1147. std::string m_strName;
  1148. std::string m_strLabel;
  1149. public:
  1150. int m_nSectionId; //灯组所在的路口区域
  1151. std::string m_strVechileId; //控制此灯组的车辆id
  1152. map<int,std::shared_ptr<Light>> mp_lights_list;
  1153. public:
  1154. LightsGroup();
  1155. ~LightsGroup(){};
  1156. public:
  1157. bool isExist(std::shared_ptr<Light> pLight);
  1158. bool isAllLightColor(int nColor);
  1159. };
  1160. class BaseArea{
  1161. public:
  1162. BaseArea(){
  1163. m_nPolygonCount = 0;
  1164. m_pPolygon = NULL;
  1165. }
  1166. ~BaseArea(){
  1167. if (m_pPolygon)
  1168. {
  1169. delete[] m_pPolygon;
  1170. m_pPolygon = NULL;
  1171. }
  1172. }
  1173. public:
  1174. int init_border(string path);
  1175. bool IsInPolygon(_point p);
  1176. private:
  1177. double GetVertex(std::string src); // 顶点
  1178. std::vector<std::string> Split(std::string str,std::string pattern);
  1179. public:
  1180. int m_nProperty;
  1181. int m_nPolygonCount;
  1182. _point* m_pPolygon;
  1183. };
  1184. //硐室
  1185. class Chamber:public BaseArea{
  1186. public:
  1187. int m_nID; //硐室编号
  1188. int m_nState; //使用状态,特指此硐室是否处于可用
  1189. int m_nIsUsed; //硐室内是否有车
  1190. int m_nSectionID; //硐室所属路段ID
  1191. int m_nMapID; //硐室所属地图ID
  1192. std::string m_strPath; //硐室区域
  1193. std::string m_strName; //硐室名称
  1194. std::string m_strLabel; //硐室描述
  1195. public:
  1196. Chamber();
  1197. ~Chamber();
  1198. };
  1199. //路段
  1200. class Section:public BaseArea{
  1201. public:
  1202. int m_nID;
  1203. int m_nMapId;
  1204. std::string m_strPath;
  1205. std::string m_strName;
  1206. std::string m_strLabel;
  1207. public:
  1208. int m_nState; //0---正常,1---繁忙,2---拥堵
  1209. time_t alarm_start_time;
  1210. ChamberMap mp_champer_list;
  1211. LightMap mp_light_list;
  1212. CardMap mp_vehicle_list;
  1213. CardMap mp_staffer_list;
  1214. INT64 m_event_list[SECTION_EVENT_COUNT];
  1215. public:
  1216. Section();
  1217. ~Section(){}
  1218. public:
  1219. bool is_has_chamber(); //是否有未使用的躲避硐室
  1220. int get_section_state(); //路段状态
  1221. int get_section_vehicle_counts(); //路段内车辆总数
  1222. int get_section_staffer_counts(); //路段内人员总数
  1223. };
  1224. class PatrolTask
  1225. {
  1226. public:
  1227. PatrolTask();
  1228. ~PatrolTask();
  1229. private:
  1230. public:
  1231. int patrol_task_id;
  1232. int patrol_path_id;
  1233. string card_id;
  1234. string starffer_id;
  1235. time_t start_time;
  1236. time_t end_time;
  1237. PatrolPointMap mpPoint;
  1238. bool is_in_cur_point;
  1239. int cur_point_idx;
  1240. int state; // 巡检状态
  1241. int stay_state; // 停留时长状态
  1242. int duration_stay; //停留时长
  1243. time_t enter_time; // 进入该节点时间
  1244. time_t leave_time; // 离开当前节点时间
  1245. };
  1246. class PatrolPoint
  1247. {
  1248. public:
  1249. PatrolPoint();
  1250. ~PatrolPoint();
  1251. private:
  1252. public:
  1253. int idx; // 在路径中的索引
  1254. int patrol_point_id;
  1255. int map_id;
  1256. double x; // 区域范围圆心
  1257. double y;
  1258. double z;
  1259. double ranging; // 距离范围
  1260. int duration_last; // 距离上个节点时长
  1261. int duration_stay_min; // 本节点最小时长
  1262. int duration_stay_max; // 本节点最大时长
  1263. int duration_ranging; // 距离上个节点时长最大偏差,含正负
  1264. };
  1265. enum EVENT_TYPE{ // 事件类型
  1266. ET_UNKNOWN = 0,
  1267. ET_OVER_COUNT_PERSON = 1, // 井下人员超员
  1268. ET_OVER_COUNT_VEHICLE = 2, // 井下车辆超员
  1269. ET_AREA_OVER_COUNT_PERSON = 3, // 区域人员超员
  1270. ET_AREA_OVER_COUNT_VEHICLE = 4, // 区域车辆超员
  1271. ET_SECTION_OVER_COUNT = 5, // 路段拥堵
  1272. ET_READER_ERROR = 6, // 分站通信异常
  1273. ET_ctrl_reader_ERROR = 7, // 控制分站异常
  1274. ET_LIGHT_ERROR = 8, // 交通灯异常
  1275. ET_READER_CALL = 9, // 分站呼叫标识卡
  1276. ET_READER_CALL_CANCEL = 10, // 取消呼叫分站
  1277. ET_CARD_LOW_POWER = 11, // 电量低
  1278. ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
  1279. ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时
  1280. ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时
  1281. ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
  1282. ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
  1283. ET_CARD_AREA_LIMIT_PERSON = 17, // 人员进入限制区域
  1284. ET_CARD_AREA_LIMIT_VEHICLE = 18, // 车辆进入限制区域
  1285. ET_CARD_AREA_FORBIDDEN_PERSON = 19, // 人员进入禁止区域
  1286. ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
  1287. ET_CARD_OVER_SPEED = 21, // 车辆超速
  1288. ET_CARD_AREA_OVER_SPEED = 22, // 车辆区域超速
  1289. ET_CARD_RUN_THE_RED_LIGHT = 23, // 车辆闯红灯
  1290. ET_CARD_HELP = 24, // 人员呼救
  1291. ET_CARD_CALLED = 25, // 人员已被呼叫
  1292. ET_CARD_PATROL_ERROR = 26, // 人员巡检异常
  1293. ET_CARD_LOST = 27, // 标识卡信号丢失
  1294. };
  1295. enum OBJECT_TYPE // 对象类型
  1296. {
  1297. OT_MINE = 1, // 矿井
  1298. OT_AREA = 2, // 区域
  1299. OT_SECTION = 3, // 路段
  1300. OT_DEVICE_READER = 4, // 分站
  1301. OT_DEVICE_LIGHT = 5, // 交通灯
  1302. OT_DEVICE_ctrl_reader = 6, // 控制分站
  1303. OT_DEVICE_LED = 7, // led屏
  1304. OT_DEVICE_SPEAKER = 8, // 防爆音箱
  1305. OT_CARD = 9 // 标识卡,包括人员、车辆、自组网等
  1306. };
  1307. enum EVENT_STATUS{ // 事件状态
  1308. ES_START = 0, // 事件开始
  1309. ES_END = 100 // 事件结束
  1310. };
  1311. enum REQUEST_COUNTS_TYPE{
  1312. REQUEST_ALL = 0,
  1313. REQUEST_ALL_OVER_TIME_PERSON,
  1314. REQUEST_AREA_OVER_TIME_PERSON,
  1315. REQUEST_SPECIAL_ERROR_PERSON,
  1316. REQUEST_ALL_OVER_TIME_VEHICLE,
  1317. REQUEST_AREA_OVER_TIME_VEHICLE,
  1318. REQUEST_ALL_OVER_PERSON,
  1319. REQUEST_AREA_OVER_PERSON,
  1320. REQUEST_ALL_OVER_VEHICLE,
  1321. REQUEST_AREA_OVER_VEHICLE
  1322. };
  1323. class YaEvent
  1324. {
  1325. private:
  1326. INT64 ev_id;
  1327. public:
  1328. YaEvent(){};
  1329. YaEvent(INT64 e_id){
  1330. ev_id = e_id;
  1331. obj_id = "";
  1332. cur_time = time(NULL);
  1333. map_id = 0;
  1334. area_id = 0;
  1335. x = 0;
  1336. y = 0;
  1337. limit_value = 0;
  1338. cur_value = 0;
  1339. desc = "";
  1340. is_count = false;
  1341. };
  1342. ~YaEvent(){};
  1343. public:
  1344. EVENT_STATUS status;
  1345. EVENT_TYPE ev_type;
  1346. OBJECT_TYPE obj_type;
  1347. std::string obj_id;
  1348. time_t cur_time;
  1349. int map_id;
  1350. int area_id;
  1351. double x;
  1352. double y;
  1353. double limit_value;
  1354. double cur_value;
  1355. std::string desc;
  1356. bool is_sent; // 已发送
  1357. bool is_count;
  1358. INT64 get_id(){return ev_id;};
  1359. };
  1360. class LightCallInfo{
  1361. public:
  1362. LightCallInfo(){
  1363. light_id = 0;
  1364. ctrl_type = 0;
  1365. ctrl_color = 0;
  1366. light_state = 0;
  1367. task_id = "";
  1368. }
  1369. public:
  1370. int light_id;
  1371. int ctrl_type;
  1372. int ctrl_color;
  1373. int light_state;
  1374. std::string task_id;
  1375. };
  1376. enum DIRECTORY_TYPE{
  1377. NODIRECTORY = 0,
  1378. EAST = 1,
  1379. SOURTH = 2,
  1380. WEST = 3,
  1381. NORTH = 4
  1382. };
  1383. #endif //YASERVER_CLASSDEF_H_