classdef.h 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520
  1. #ifndef YASERVER_CLASSDEF_H_
  2. #define YASERVER_CLASSDEF_H_
  3. #define MAX_LOG_LENGTH 500
  4. #define MAX_DIST_CACHE 2 //5
  5. #define DIST_COUNT 4
  6. #define ANCHOR_COUNT 4
  7. #define MINE_EVENT_COUNT 3
  8. #define SECTION_EVENT_COUNT 6
  9. #define AREA_EVENT_COUNT 5
  10. #define CARD_EVENT_COUNT 88
  11. #define READER_EVENT_COUNT 88
  12. #define KALMAN_OFFSET_COOR 0.01
  13. #define KALMAN_OFFSET_MOVE 1
  14. #define KALMAN_OFFSET_RANGING 0.01
  15. #define KALMAN_INTERVAL 1.0 // 以秒为单位
  16. #define KALMAN_OFFSET_COOR_TRI 0.01
  17. #define KALMAN_OFFSET_MOVE_TRI 1
  18. #define KALMAN_OFFSET_RANGING_TRI 0.09
  19. #define KALMAN_INTERVAL_TRI 2.0 //以秒为单位
  20. #define ANTENNA_COUNT 4
  21. #define ADHOC_COUNT 10
  22. #define READER_TIMEOUT 20
  23. #define CARD_LOST_TIME_OUT 30 // (30)
  24. #define CARD_ATTENDANCE_TIMEOUT (60*60)
  25. #define CARD_LOST_TIME_CAL 5 // 卡未收到数据后,利用缓存的数据计算间隔
  26. #define CARD_LOST_TIME_OUT_SPECIAL_AREA 1800
  27. #define READER_SEND_STATE_TIMEOUT 30
  28. #define LIGHT_SEND_STATE_TIMEOUT 30
  29. #define OVER_TIME (480 * 60)
  30. #define MAX_SEMACOUNT 64
  31. //算法类型
  32. //#define ALGORITHM_TYPE_TOF
  33. //#define ALGORITHM_TYPE_TDOA
  34. //#define ALGORITHM_TYPE_INS //使用惯导判断
  35. #define ENABLE_MY_LOG
  36. #define ENABLE_DEBUG_PERSON_IN_CAR_LOG 1
  37. #define ENABLE_DEBUG_2D_TEST_LOG 0
  38. #define NEED_DISPLAY_RULES 1 // lemon 2017/08/01
  39. #define NEED_DISPLAY_VALID 0
  40. #define NEED_DISPLAY_INVALID 1
  41. #define PATROL_LEVEL_ID 3
  42. #define INDEXFORRECONEREADER 10 //如果持续10次都只被一个分站接收,则速度为0
  43. #define SUSTAINEDOVERSPEED 5 // 如果连续5次都是超速,则告警.
  44. #define WRITE_DRIVINGFACE_REAL_PER_TIME 20000
  45. #define STR_LEN_TIME 50
  46. //lemon 2017/10/14
  47. #define DRIVINGFACE_X_CONST 1 //X 不变
  48. #define DRIVINGFACE_Y_CONST 2 // Y 不变
  49. #define DRIVINGFACE_XY_CONST 3
  50. #define STARTUP_STATE_COUNT 10
  51. #define SHUTDOWN_STATE_COUNT 5
  52. #define SEC_TO_HOUR 3600.0
  53. //area
  54. #define AREA_WORK_AREA 1 //工作区域
  55. #define AREA_NON_WORK_AREA 0 //非工作区域
  56. //card
  57. #define CARD_FRONT_LINE_WORKERS 1 //一线工人
  58. #define CARD_SECONT_LINE_WORKERS 2 //二线工人
  59. #include <string>
  60. #include <ctime>
  61. #include <map>
  62. #include <iostream>
  63. #include <string>
  64. #include <vector>
  65. #include <unordered_map>
  66. #include <deque>
  67. #include <mutex>
  68. #include <thread>
  69. #include <boost/shared_ptr.hpp>
  70. #include <kalman\locate.h>
  71. #include "Filter\KalmanFilter.h"
  72. #include "algorithm\FittingPosition.h"
  73. #include "algorithm\Fit.h"
  74. #include "LocateRecord.h"
  75. #include "algorithm/tdoa/taylor_wls_tdoa.h"
  76. #include "algorithm/base/sensor_manager.h"
  77. //#include "algorithm/AjustPosition.h"
  78. #include <boost/circular_buffer.hpp>
  79. #include "car.h"
  80. struct card;
  81. #define MIN(x,y) (x < y ? x : y)
  82. #define MAX(x,y) (x > y ? x : y)
  83. using namespace std;
  84. using namespace algorithm;
  85. //算法中使用的常量定义
  86. const int MAX_CALC_POINTS = 30;
  87. const int ACCELERATE_INIT_STATE = -10;
  88. const int IDLE_CONFIRM_TIME = 4;
  89. const int LIGHT_CTRL_DELAY = 1000;
  90. const int MAX_REBOUND_COUNTS = 5;
  91. const double INS_WEIGHT = 9.0; //惯导权重
  92. const double UWB_WEIGHT = 1.0; //UWB权重
  93. const double MAX_VECHILE_SPEED = 30.0; //车卡运动速度阈值,超过此阈值,定位数据被抛弃
  94. const double MAX_PERSON_SPEED = 15.0; //人卡运动速度阈值,超过此阈值,定位数据被抛弃
  95. const double NEAR_READER = 4.0;
  96. const double MIN_DIFFER_DISTANCE = 10.0; // 使用其他分站校验计算结果时,判断该结果到校验分站的距离差允许的范围
  97. const double MIN_IDLE_THRESHOLD = 0.5;
  98. const double VECHILE_ACCELERATE_THRESHOLD = 3; // 校验加速度阈值
  99. const double PERSON_ACCELERATE_THRESHOLD = 1.5; // 校验速度阈值
  100. const int POS_NO_CHANGE_TIMES = 15; // lihongzhen 2017/8/19 位置连续未改变次数,每次0.5秒,约7秒
  101. const double CHAMBER_WIDTH = 4.0; //特指前端展现巷道的宽度,单位为像素
  102. const double VEHICLE_WIDTH = 10.0;
  103. const double TOF_HEIGHT_ERROR = 2; //tof定位时的高度误差,单位为米
  104. const double READER_SYNC_INTERVAL_TIME = 0.2; //分站同步序号的时间差,估计值
  105. const int CONFIRM_ON_VEHICLE_COUNTS = 3; //人上车条件确认次数
  106. const int CONFIRM_OFF_VEHICLE_COUNTS = 3; //人下车条件确认次数
  107. const double THRE_MOVING_READER_DISTANCE = 3.0; //人卡与移动分站的距离阈值,上下车通用
  108. const double THRE_RELATIVE_SPEED = 3.6; //人卡与从移动分站对应的车卡的相对速度阈值,单位为3.6km/h
  109. #define OFFSET_THRE_IN_LINE 1 //判断是否在线段上,允许的误差为1米,用于isinline
  110. #define ZERO_PRECISION 1E-3 //为零的精度
  111. #define HIGH_ZERO_PRECISION 1E-6 //高精度零判断
  112. //added by zhuyf 2018/07/06
  113. const double MAX_SPEED = 1.87; //井下人/车移动的最大速度,1.67m/s 约合 6km/h,考虑到0.2米的误差,还要+0.2。
  114. const int IGNORE_H_DISTANCE = 10; //可忽略高差的距离,大于此距离时,高差可以忽略不计
  115. const double ABSOLUTE0 = 0.00001;
  116. const int H = 2; //卡与天线的高差,是个概值
  117. const double E = 0.2; //测距精度
  118. const int SIMULATOR_CARD_START_NO = 60000;
  119. const uint64_t MAX_SMALL_READER_SIZES = 10;
  120. enum ALARM_FLAG{
  121. //AF_CARD_OVER_COUNT = 1,
  122. //AF_CARD_AREA_OVER_COUNT,
  123. AF_CARD_OVER_TIME,
  124. AF_CARD_OVER_SPEED,
  125. AF_CARD_AREA_OVER_SPEED,
  126. AF_CARD_AREA_OVER_TIME,
  127. AF_CARD_LOW_POWER,
  128. AF_CARD_LOW_POWER_SERIOUS,
  129. AF_CARD_AREA_FORBIDDEN,
  130. AF_AREA_OVER_COUNT,
  131. AF_AREA_OVER_TIME,
  132. AF_AREA_FORBIDDEN,
  133. AF_CARD_OVER_COUNT,
  134. AF_CARD_NEAR_WARNING_POINT,//lemon
  135. AF_CARD_NEAR_DRRIVINGFACE_VEHICLE, //lemon 2017/08/01
  136. AF_CARD_NEAR_GEOFAULT,
  137. AF_CARD_MOTIONLESS
  138. };
  139. enum AREA_TYPE
  140. {
  141. AREA_TYPE_FORBIDDEN = 3, // 限制区域
  142. AREA_TYPE_NO_COVER = 1000, // 非覆盖区域,车辆信号消失后,定位到附近非覆盖区域内
  143. AREA_TYPE_SPECIAL = 1001 // 特殊区域,只给你前端用来标识是否显示图标,胶轮车硐室
  144. };
  145. enum EDIT_TYPE_ID{
  146. ET_INSERT = 0, // 新增
  147. ET_UPDATE, // 修改
  148. ET_DELETE // 删除
  149. };
  150. //车辆烈性
  151. enum VECHILE_TYPE_ID
  152. {
  153. VT_DIGGINGCOAL_MACHINE=25,
  154. VT_DRIVINGFACE_MACHINE=26
  155. };
  156. enum ALARM_TYPE_ID
  157. {
  158. ATID_OVER_COUNT_PERSON = 1,
  159. ATID_POWER,
  160. ATID_OVER_COUNT_VEHICLE
  161. };
  162. enum STATUS_DEVICE{
  163. STATUS_DEVICE_NORMAL = 0,
  164. STATUS_DEVICE_ERROR
  165. };
  166. enum STATUS_CARD
  167. {
  168. STATUS_NORMAL = 0, //正常
  169. STATUS_ERROR = 1,
  170. STATUS_ERROR_SERIOUS = 2,
  171. STATUS_POWER_LOWER = 1, //电量低
  172. STATUS_POWER_LOWER_SERIOUS = 2, //电量极低
  173. STATUS_OVER_TIME = 4, //超时
  174. //STATUS_OVER_COUNT = 1,
  175. STATUS_OVER_SPEED = 8, //超速
  176. STATUS_AREA_OVER_TIME = 16, //区域超时
  177. //STATUS_AREA_OVER_COUNT = 1,
  178. STATUS_AREA_OVER_SPEED = 32, //区域超速
  179. STATUS_AREA_FORBIDDEN = 64, //进入限制区域
  180. STATUS_HELP = 128, //呼救
  181. STATUS_HELP_DEALED = 256, //呼救已处理
  182. STATUS_CALL = 512, //呼叫
  183. STATUS_LOST = 1024 //进入盲区
  184. //STATUS_ERROR_DEALED,
  185. };
  186. enum STORE_CARD_DATA_FLAG{
  187. HIS_LOCATION = 0,
  188. HIS_RAW_DATA,
  189. HIS_AREA_LOCATION_ENTER,
  190. HIS_AREA_LOCATION_LEAVE,
  191. RPT_ATTEND_DOWN,
  192. RPT_ATTEND_UP
  193. };
  194. enum STORE_MINE_DATA_FLAG{
  195. ALARM_MINE_OVER_COUNT_PERSON_START = 0,
  196. ALARM_MINE_OVER_COUNT_PERSON_END,
  197. ALARM_MINE_OVER_COUNT_VEHICLE_START,
  198. ALARM_MINE_OVER_COUNT_VEHICLE_END
  199. };
  200. enum STORE_LIGHT_DATA_FLAG{
  201. ALARM_LIGHT_FAULT_START= 0, //故障开始
  202. ALARM_LIGHT_FAULT_END, //故障结束
  203. ALARM_LIGHT_NETWORK_START, //网络故障开始
  204. ALARM_LIGHT_NETWORK_END, //网络故障结束
  205. ALARM_LIGHT_CONTROL_FAILE //控制失败
  206. };
  207. enum STORE_SECTION_DATA_FLAG{
  208. ALARM_SECTION_START = 0, // 区段告警开始
  209. ALARM_SECTION_END // 区段告警结束
  210. };
  211. enum LIGHT_STATE{
  212. LIGHT_NORMAL = 0, // 正常
  213. LIGHT_FAULT, // 异常
  214. LIGHT_NETWORK_ERROR, // 网络故障
  215. LIGHT_CONTROL_ERROR // 控制失败
  216. };
  217. enum LOCATE_TYPE
  218. {
  219. LT_COORDINATE = 0, // 使用坐标定位
  220. LT_READER // 使用分站定位
  221. };
  222. enum FILTER_TYPE{
  223. NO_FILTER = 0, // 不使用滤波
  224. FILTER_KALMAN = 1 // 使用kalman滤波
  225. };
  226. enum SECTION_STATE{
  227. SECTION_STATE_NORMAL = 0, //正常
  228. SECTION_STATE_BUSY = 1, //繁忙
  229. SECTION_STATE_CONGESTION = 2 //拥堵
  230. };
  231. enum LIGHT_SHAPE{
  232. INIT_SHAPE=0,
  233. RED_CIRCLE_SOLID = 1, //红色实心圆
  234. RED_CIRCLE = 2, //红色空心圆
  235. RED_CROSS = 3, //红色叉形
  236. GREEN_UP = 4, //绿色上箭头
  237. GREEN_DOWN = 5, //绿色下箭头
  238. GREEN_LEFT = 6, //绿色左箭头
  239. GREEN_RIGHT = 7, //绿色右箭头
  240. RED_SPARK = 8, //红色闪烁
  241. GREEN_SPARK = 9, //绿色闪烁
  242. GREEN_ALL_ON=10, //绿色全亮
  243. GREEN_ALL_OFF=11, //绿色全灭
  244. RED_ALL_ON=12, //红色全亮
  245. RED_ALL_OFF=13 //红色全灭
  246. };
  247. enum LIGHT_STREAM{
  248. INIT_STREAM = 0,
  249. UP_STREAM = 1, //上行
  250. DOWN_STREAM = 2 //下行
  251. };
  252. enum LIGHT_COLOR{
  253. COLOR_RED = 1, // 红色
  254. COLOR_GREEN = 2 // 绿色
  255. };
  256. enum LIGHT_CTRL_STATE{
  257. CTRL_STATE_AUTO = 1, // 自动控制
  258. CTRL_STATE_MANUAL = 2 // 手动控制
  259. };
  260. enum LIGHTS_SELECT_TYPE
  261. {
  262. LST_ALL_LIGHTS = 0, // 所有灯
  263. LST_ALL_UP_LIGHTS = 1, // 所有上行
  264. LST_ALL_DWON_LIGHTS = 2,// 所有下行
  265. LST_SOME_LIGHTS = 3 // 指定灯
  266. };
  267. enum AREA_PROPERTY{
  268. MAIN_TUNNEL = 0, // 主巷道
  269. BRANCH_TUNNEL = 1 // 分支巷道
  270. };
  271. enum OUTPUT_POS{
  272. CENTRAL_POS = 0, // 居中
  273. LEFT_POS, // 靠左
  274. RIGHT_POS // 靠右
  275. };
  276. enum PATROL_STATE
  277. {
  278. PS_NORMAL = 0, // 正常
  279. PS_EARLY, // 早到
  280. PS_LATE, // 迟到
  281. PS_NON_ARRIVAL // 未到
  282. };
  283. enum PATROL_STAY_STATE
  284. {
  285. PSS_NORMAL = 0, // 正常
  286. PSS_TOO_LONG, // 停留过长
  287. PSS_TOO_SHORT // 停留太短
  288. };
  289. enum ALGO_RETURN_VALUE{
  290. DIST_COUNT_LESS_THAN_TWO = 10001,
  291. DIST_COUNT_LESS_FOR_TIMESTAMP_ERROR,
  292. DIST_COUNT_LESS_FOR_SYNC_NUM_DIFFER_FIVE,
  293. DIST_COUNT_CARD_CUR_CT_LESS_LAST,
  294. ALGO_CALC_SOLUTION = 30001,
  295. ALGO_CALC_NO_SOLUTION_WITH_TWO_DATA,
  296. ALGO_CALC_ONE_DATA,
  297. SOLUTION_NO_SOLUTION = 40001,
  298. SOLUTION_NOT_EXIST_READRE,
  299. SOLUTION_NEAR_READER,
  300. SOLUTION_TWO_SOLUTION,
  301. SOLUTION_ERROR_STREAM,
  302. POSITION_INVALID,
  303. SOLUTION_IDLE_STATUS,
  304. CHECK_PERSON_ACCE_OVER_SPEED = 50001,
  305. CHECK_VEHICLE_ACCE_OVER_SPEED,
  306. CHECK_VEHICLE_OVER_SPEED,
  307. KALMAN_FILTER_LONG_INTERVAL = 60001,
  308. ALGO_USE_KALMAN_FILTER = 70001,
  309. ALGO_DIVIDE_ZERO = 80001,
  310. };
  311. extern unsigned int g_nAlgoFailedCounts[ALGO_LOC_TOTAL]; //全局的统计所有次数
  312. extern unsigned int g_nAlgoFailedCycleCounts[ALGO_LOC_TOTAL]; //指定周期内的所有统计次数
  313. extern DWORD g_ullCurTime;
  314. extern unsigned long long m_Start_time;
  315. #define ALGORITHM_FAILED(nType) { \
  316. g_nAlgoFailedCounts[nType]++; \
  317. }
  318. struct AlgoFailedMsg{
  319. std::string strCardId;
  320. int nCardStamp;
  321. int nType;
  322. SYSTEMTIME st;
  323. bool bStatus;
  324. AlgoFailedMsg(){
  325. strCardId = "";
  326. nCardStamp = 0;
  327. nType = 0;
  328. bStatus = false;
  329. }
  330. };
  331. enum DEVICE_TYPE{
  332. DT_BIG_READER = 1, // 大分站
  333. DT_SMALL_READER = 2, // 小分站
  334. DT_CARD_READER = 3, // 读卡分站
  335. DT_CTRL_READER = 4, // 通信分站
  336. DT_LIGHT = 5, // 红绿灯
  337. DT_SPEAKER = 6, // 告警器
  338. DT_TURNOUT = 7, // 道岔
  339. DT_LED = 8, // 显示屏
  340. };
  341. enum CALL_STATE{
  342. CALL_NONE = 0, //无呼叫信息
  343. CALL_SUCCESSED = 1, //呼叫成功
  344. CALL_ING = 2, //呼叫中
  345. CALL_FAILED = 3, //呼叫失败
  346. };
  347. enum CALL_CARD_TYPE
  348. {
  349. CCT_CALL_ALL = 0, // 全员呼叫
  350. CCT_CALL_APOINT, // 定员
  351. };
  352. enum LOCATEDATATYPE // 定位数据类型
  353. {
  354. LDT_TOF = 0, //TOF
  355. LDT_TDOA, //TDOA
  356. LDT_BROAD, //Braodcast
  357. LDT_TOF_INS,
  358. LDT_TDOA_INS
  359. };
  360. enum LOCATE_DATA_NUMS{
  361. ONE = 1,
  362. TWO,
  363. THREE,
  364. FOUR
  365. };
  366. enum Orientation{
  367. LEFT = 0,
  368. UP,
  369. RIGHT,
  370. DOWN,
  371. LEFT_UP,
  372. LEFT_DOWN,
  373. RIGHT_UP,
  374. RIGHT_DOWN,
  375. };
  376. enum INS_REQUEST_STATUS{
  377. NO_INS_REQUEST = 0, //不校准
  378. YES_INS_REQUEST //请求校准
  379. };
  380. enum SEND_CAL_DATA_STATUS{
  381. CAL_DATA_ALL = 0, //所有校准数据
  382. CAL_DATA_POS, //校准坐标
  383. CAL_DATA_ANGLE //校准角度
  384. };
  385. enum PERSON_ON_VEHICLE_STATUS{
  386. PERSON_OFF_VEHICLE = 0,
  387. PERSON_ON_VEHICLE
  388. };
  389. struct OnVehicleData{
  390. int counts;
  391. std::map<string,int> person_cards;
  392. OnVehicleData(){
  393. counts = 0;
  394. }
  395. };
  396. struct SQLTHREAD_DATA//写数据库线程传递的参数
  397. {
  398. char* pText;//数据库语句地址指针
  399. int nRepeatTimes;//已经重试几次
  400. };
  401. struct _point{ // 坐标
  402. double x;
  403. double y;
  404. double z;
  405. _point(){
  406. x = y = z = 0;
  407. }
  408. _point(double a,double b,double c){
  409. x = a;
  410. y = b;
  411. z = c;
  412. }
  413. _point(double a,double b){
  414. x = a;
  415. y = b;
  416. z = 0;
  417. }
  418. };
  419. struct TimePosition{
  420. time_t cur_time;
  421. _point p;
  422. TimePosition(){
  423. cur_time = time(NULL);
  424. p.x = p.y = p.z = 0;
  425. }
  426. TimePosition(double x_,double y_){
  427. cur_time = time(NULL);
  428. p.x = x_;
  429. p.y = y_;
  430. }
  431. };
  432. struct AlgoParamData{
  433. _point ant[2]; //双天线坐标
  434. uint16_t ct; //当前双天线测距信息
  435. double distance[2]; //双天线的测距距离
  436. uint32_t anchor_id; //分站号
  437. AlgoParamData(){
  438. ant[0].x=ant[0].y=ant[1].x=ant[1].y = 0;
  439. ct = 0;
  440. distance[0] = distance[1] = 0;
  441. }
  442. };
  443. struct sync_data{
  444. double x;
  445. double y;
  446. double z;
  447. double vx;
  448. double vy;
  449. double vz;
  450. int sync_num; //本次同步号
  451. bool update;
  452. std::shared_ptr<nspLocate::LocateRecord> locate;
  453. sync_data(){
  454. x = 0.0;
  455. y = 0.0;
  456. z = 0.0;
  457. vx = 0.0;
  458. vy = 0.0;
  459. vz = 0.0;
  460. sync_num = 0;
  461. update = false;
  462. locate = nullptr;
  463. }
  464. sync_data& operator=(sync_data&tmp){
  465. x = tmp.x;
  466. y = tmp.y;
  467. z = tmp.z;
  468. vx = tmp.vx;
  469. vy = tmp.vy;
  470. vz = tmp.vz;
  471. sync_num = tmp.sync_num;
  472. update = tmp.update;
  473. locate = tmp.locate;
  474. return *this;
  475. }
  476. inline bool operator == (const sync_data& rhs) const
  477. {
  478. return x == rhs.x &&
  479. y == rhs.y &&
  480. vx == rhs.vx &&
  481. vy == rhs.vy &&
  482. sync_num == rhs.sync_num &&
  483. update == rhs.update;
  484. }
  485. };
  486. struct _call_info_card
  487. {
  488. int card_id; // 呼叫卡号
  489. int card_type; // 呼叫类型,全员、定员
  490. int call_level; // 呼叫级别,一般、紧急
  491. string str_card_id; // 呼叫卡号,带卡类型
  492. time_t start_time; // 开始呼叫时间
  493. int time_out; // 呼叫时长,单位分钟
  494. //bool is_success;
  495. int call_state; // 呼叫状态,正在呼叫、呼叫成功
  496. };
  497. //typedef map<std::string, _call_info_card*> CallInfoCardMap;
  498. typedef map<std::string, std::shared_ptr<_call_info_card>> CallInfoCardMap;
  499. struct _call_info_reader
  500. {
  501. bool is_call_all; // 呼叫类型, 全员、定员
  502. bool is_start_call; //true,开始呼叫;false,取消呼叫
  503. BYTE call_level; // 一般,紧急
  504. //int call_type;
  505. int cards_count; // 呼叫的卡数,0为全员呼叫
  506. int time_out; // 呼叫时长
  507. time_t start_time; // 开始呼叫时间
  508. CallInfoCardMap mpCard; // 呼叫卡列表
  509. };
  510. typedef map<int, std::shared_ptr<_call_info_reader>> CallInfoReaderMap;
  511. struct _call_info_user
  512. {
  513. std::string user_name; // 发出呼叫指令的用户
  514. CallInfoReaderMap mpReader; // 呼叫分站列表
  515. };
  516. typedef map<string, std::shared_ptr<_call_info_user>> CallInfoUserMap;
  517. // 分站接收时间定义
  518. struct ReceiveData{
  519. unsigned int reader_id; // 分站号
  520. unsigned short antenna_id; // 天线号
  521. long long rec_time_stamp; // 分站接收时间,一个7字节的无符号数
  522. int special;
  523. double x; //分站的x坐标
  524. double y; //分站的y坐标
  525. double z; //分站的z坐标
  526. ReceiveData(){
  527. reader_id = -1;
  528. antenna_id = -1;
  529. rec_time_stamp = 0;
  530. x = y = z = 0.0;
  531. special = -1;
  532. };
  533. };
  534. // 分站接收tof数据
  535. struct ReceiveDataTof:public ReceiveData{
  536. double distance;
  537. ReceiveDataTof(){
  538. distance = 0.0;
  539. };
  540. };
  541. struct INFO_PRE{
  542. int t;
  543. long long detaT;
  544. double dist;
  545. int ant;
  546. int sta_num;
  547. };
  548. //TOF定位时参考的数据结构
  549. struct TOF_REFER_DATA{
  550. unsigned int nCardTimeStamp; // 卡的ct号
  551. long long llDeltaTime; //
  552. double dDistance; // 距离
  553. unsigned int nAntennaIndex; // 分站天线索引号
  554. unsigned int nReaderId; // 分站id
  555. double x; // 参考点x坐标
  556. double y; // 参考点y坐标
  557. double z; // 参考点z坐标
  558. int a; // 加速度状态
  559. TOF_REFER_DATA(){
  560. nCardTimeStamp = 0;
  561. llDeltaTime = 0;
  562. dDistance = 0.0;
  563. nAntennaIndex = nReaderId = 0;
  564. x = y = z = 0.0;
  565. a = 0;
  566. }
  567. };
  568. //解的结构体
  569. struct SOLUTION{
  570. double x[3];
  571. double y[3];
  572. double z[3];
  573. int nCount;
  574. SOLUTION(){
  575. for (int i =0;i<3;i++)
  576. {
  577. x[i] = y[i] = z[i] = INVALID_COORDINATE;
  578. nCount = 0;
  579. }
  580. }
  581. };
  582. //惯导数据校准的数据结构:坐标(x,y),角度angle
  583. struct CAL_DATA{
  584. float x;
  585. float y;
  586. float angle;
  587. int status;
  588. int card_type; //卡类型
  589. std::string card_id; //卡id
  590. CAL_DATA(){
  591. x = y = angle = 0.0f;
  592. status = 0;
  593. card_type = 0;
  594. card_id = "";
  595. }
  596. };
  597. // 采煤机起始位置
  598. struct CoalFaceStartPos
  599. {
  600. float x; // 起始位置x坐标
  601. float y; // 起始位置y坐标
  602. time_t rec_time; // 起始坐标接收时间
  603. };
  604. //综采面信息
  605. class CoalMiningArea
  606. {
  607. public:
  608. //区域编号
  609. INT coalface_id;
  610. //综采面端点1
  611. double x1;
  612. double y1;
  613. //综采面端点2
  614. double x2;
  615. double y2;
  616. //认为到达端点的距离范围
  617. double distance;
  618. //采煤机的坐标偏移量,单位是像素
  619. double m_x_offset;
  620. double m_y_offset;
  621. CoalMiningArea():m_x_offset(0.0),m_y_offset(0.0){}
  622. };
  623. //挖煤机正规循环率的中间参数
  624. class CoalMiningRegularCycle
  625. {
  626. public:
  627. //卡Id
  628. INT vehicle_id;
  629. //区域编号
  630. INT coalface_id;
  631. //是否开始计算
  632. bool IsWorking;
  633. // 未达机头/机尾标记
  634. bool bNoTarget;
  635. //半刀计数标记
  636. bool bHalfKnife;
  637. //目标序号
  638. INT tgPointNum;
  639. //运动方向 true-机头《-》机尾,false-机尾《-》机头
  640. INT bDirection;
  641. //上次发送位置时间
  642. time_t last_time;
  643. //开始时间;
  644. time_t start_time;
  645. //记录最小距离的时间
  646. time_t mindis_time;
  647. //离目标点的最小距离
  648. double mindistance;
  649. //计划刀数
  650. double schedule_times;
  651. //开始位置
  652. double start_x;
  653. double start_y;
  654. //结束位置
  655. double end_x;
  656. double end_y;
  657. //时间和位置记录
  658. string pos_record;
  659. };
  660. //挖煤机每刀详细参数
  661. class CoalminingRegularCycleDetail
  662. {
  663. public:
  664. INT vehicle_id;// 卡号;
  665. //区域编号
  666. INT coalface_id;
  667. time_t start_time;//开始时间;
  668. time_t end_time;//结束时间;
  669. int dept_id;//对应队组ID;
  670. double start_x;//开始x坐标;
  671. double start_y;//开始y坐标;
  672. double end_x;//结束x坐标;
  673. double end_y;//结束y坐标;
  674. int move_direction;
  675. };
  676. //掘进面用于定位的分站拓扑关系
  677. struct DrivinfaceReaderTopology{
  678. uint64_t m_big_reader_id; //大分站id
  679. uint64_t m_small_reader_id[MAX_SMALL_READER_SIZES]; //其中0为小分站id,1为中继分站id
  680. uint64_t m_counts; //记录有效可使用的小分站数据(即m_small_reader_id)大小
  681. DrivinfaceReaderTopology():m_big_reader_id(0),m_counts(0){
  682. for (uint64_t i = 0;i<MAX_SMALL_READER_SIZES;++i)
  683. {
  684. m_small_reader_id[i] = 0;
  685. }
  686. }
  687. };
  688. //采煤机、挖掘机、司机的求和坐标
  689. struct VehicleDriverPos
  690. {
  691. VehicleDriverPos()
  692. :PointNum(0)
  693. ,Sum_x(0.)
  694. ,Sum_y(0.)
  695. ,isOn(false)
  696. {
  697. }
  698. //开始时间
  699. time_t starttime;
  700. //车或者对应的车是否开机
  701. bool isOn;
  702. //定位点个数
  703. int PointNum;
  704. //x坐标和
  705. double Sum_x;
  706. //y坐标和
  707. double Sum_y;
  708. };
  709. //部门与采煤机及司机的对应关系
  710. struct DeptVehicleDriver
  711. {
  712. //部门ID
  713. int Dept_id;
  714. //采煤机和司机的对应关系
  715. std::map<int ,std::vector<int>> CoalMiningDriver;
  716. //掘进机与司机的对应关系
  717. std::map<int ,std::vector<int>> DrivingDriver;
  718. };
  719. //工作面司机和机器告警参数
  720. struct WorkfaceDriverAlarm
  721. {
  722. //车辆ID
  723. int Vehicle_id;
  724. //告警距离
  725. double dist;
  726. //告警时间
  727. int dist_time;
  728. };
  729. class Mine;
  730. class Area;
  731. class SpecialAreaEntry;
  732. class DrivingfaceRender;
  733. class DrivingfaceCard;
  734. class DrivingfaceWarningPoint;
  735. class VehicleTypeAttRule;
  736. class Reader;
  737. class Card;
  738. class MapInfo;
  739. class Dept;
  740. class BanShift;
  741. class OccLevel;
  742. class ReaderPath;
  743. class PatrolPoint;
  744. class PatrolTask;
  745. class LeaderArrange;
  746. class Section;
  747. class Chamber;
  748. class Light;
  749. class LightsGroup;
  750. class LightCallInfo;
  751. class StorePostion;
  752. class LandmarkInfo;
  753. class MapDirectionInfo;
  754. class HandUpVehicle;
  755. class MovingReader;
  756. class WarningPoint;
  757. typedef map<string, std::shared_ptr<Card>> CardMap;
  758. typedef map<int, std::shared_ptr<Area>> AreaMap;
  759. typedef map<int, std::shared_ptr<DrivingfaceWarningPoint>>DrivingfaceWarningPointMap;
  760. typedef map<int,std::vector<std::shared_ptr<DrivingfaceWarningPoint>>> DrivingfaceWarningPointMapAll;
  761. typedef map<uint64_t,std::list<std::shared_ptr<WarningPoint>>> WarningPoint_Map;
  762. typedef map<int, std::shared_ptr<SpecialAreaEntry>> SpecilaAreaEntryMap;
  763. typedef map<int, std::shared_ptr<DrivingfaceRender>> DrivingfaceRenderMap;
  764. typedef map<string,std::shared_ptr<DrivingfaceCard>> DrivingfaceCardMap;
  765. typedef map<int, std::shared_ptr<Reader>> ReaderMap;
  766. typedef map<int, std::shared_ptr<MapInfo>> MapInfoMap;
  767. typedef map<int, std::shared_ptr<MapDirectionInfo>>MapDirectionInfoMap;
  768. typedef map<int, std::shared_ptr<LandmarkInfo>>LandmarkInfoMap;
  769. typedef map<int, std::shared_ptr<Dept>> DeptMap;
  770. typedef map<int, std::shared_ptr<BanShift>> BanShiftMap;
  771. typedef map<int, std::shared_ptr<OccLevel>> OccLevelMap;
  772. typedef map<int, string> AlarmTypeMap;
  773. typedef map<int,std::shared_ptr<ReaderPath>> ReaderPathMap;
  774. typedef map<int,std::shared_ptr<ReaderPath>> TOFReaderPathMap;
  775. typedef unordered_map<int,std::shared_ptr<ReaderPathMap>> TDOAReaderPathMap;
  776. typedef unordered_map<std::string, std::shared_ptr<_coordinate>> DistMap;
  777. typedef map<unsigned long long ,std::shared_ptr<ReceiveData>> ReceiveDataMap;
  778. typedef vector<std::shared_ptr<ReceiveDataTof>> ReceiveDataTofVector;
  779. typedef unordered_map<unsigned long long ,std::shared_ptr<ReceiveData>> ReceiveDataUnorderedMap;
  780. typedef map<int,std::shared_ptr<Section>> SectionMap; //路段信息
  781. typedef map<int,std::shared_ptr<Chamber>> ChamberMap; //硐室信息
  782. typedef map<int,std::shared_ptr<Light>> LightMap; //红绿灯信息
  783. typedef map<int,std::shared_ptr<LightsGroup>> LightGroupMap; //红绿灯组信息
  784. typedef map<unsigned int, std::shared_ptr<PatrolPoint>> PatrolPointMap;
  785. typedef map<unsigned int, std::shared_ptr<PatrolTask>> PatrolTaskMap;
  786. typedef map<std::string, std::shared_ptr<PatrolTask>> PatrolTaskCheckMap;
  787. typedef map<unsigned int, std::shared_ptr<PatrolPoint>> PatrolPointMap;
  788. typedef map<unsigned int, std::shared_ptr<PatrolTask>> PatrolTaskMap;
  789. typedef map<std::string, std::shared_ptr<PatrolTask>> PatrolTaskCheckMap;
  790. typedef deque<std::shared_ptr<StorePostion>> QueStrorePos;
  791. typedef map<std::string, std::shared_ptr<LeaderArrange>> LeaderArrangeMap;
  792. typedef map<int,string> WorkTypePermissionMap;
  793. typedef map<int,int> RulesMap; //lemon 2017/08/01
  794. typedef map<int, std::shared_ptr<VehicleTypeAttRule>> VehicleTypeAttRuleMap;
  795. typedef map<std::string,std::shared_ptr<CAL_DATA>> CardCalData; //第一个元素string是卡号,第二个元素是此卡的校准数据
  796. typedef map<int,std::shared_ptr<CardCalData>> CalDataMap; //所有的校准数据,int为分站号,第二个元素是通过此分站要下发的所有卡的校准数据
  797. typedef map<int,std::map<int,std::shared_ptr<Reader>>> BigSmallReaderMap; //key为大分站信息,vector为此大分站下的所有大小分站信息
  798. //typedef std::map<int,std::shared_ptr<MonkeyCarInfo>> MonkeyCarInfoMap;
  799. typedef std::map<std::string,std::shared_ptr<HandUpVehicle>> HandUpVehicleMap;
  800. typedef std::map<int,std::shared_ptr<MovingReader>> MovingReaderMap;
  801. typedef map<int,std::shared_ptr<CoalMiningArea> > CoalMiningAreaMap; //综采面区域信息
  802. typedef map<int,std::shared_ptr<CoalMiningRegularCycle>> CoalMiningRegularCycleMap;//采煤机正规循环率计算参数,编号和参数
  803. typedef map<int, int> CoalWorkfaceVehicleMap; // 采煤机工作面与车卡绑定表
  804. typedef map<string, std::shared_ptr<Card>> CoalDrvingfaceCardMap; // 采煤机/掘进机卡
  805. typedef map<string, int> CardVehicleMap; // 车卡和卡号对应表
  806. typedef map<string, int> CardWorkfaceMap; // 车卡和工作面对应表
  807. typedef map<int,std::shared_ptr<VehicleDriverPos>> VehicleDriverPosMap;
  808. typedef map<int,std::shared_ptr<DeptVehicleDriver>> DeptVehicleDriverMap;
  809. typedef map<int,std::shared_ptr<WorkfaceDriverAlarm>> WorkfaceDriverAlarmMap;
  810. typedef struct key_value_pair
  811. {
  812. int key;
  813. int value;
  814. struct key_value_pair* next;
  815. }KeyValuePair;
  816. typedef struct statistic_data_str
  817. {
  818. int index;
  819. KeyValuePair* data_info;
  820. struct statistic_data_str* next;
  821. }StatisticDataStr;
  822. struct DistQueMapItem
  823. {
  824. WORD cardstamp;
  825. DistMap distmap;
  826. };
  827. struct MeetingInfo
  828. {
  829. std::string keyValue; // 卡号组合,小号在前,0020000001011 0020000001022 - > 1011-1022
  830. std::string card_id_first; // 第一个卡号
  831. std::string card_id_second; // 第二个卡号
  832. double distance; // 两车之间的距离
  833. int reduce_counter; // 两车靠近计数器
  834. };
  835. typedef deque<DistQueMapItem> DistQueMap;
  836. typedef map<std::string, MeetingInfo> MeetingInfoMap;
  837. // 地图
  838. class MapInfo{
  839. public:
  840. MapInfo(void);
  841. ~MapInfo(void);
  842. public:
  843. int map_id;
  844. string map_path; // 地图文件路径
  845. string map_name; // 地图名称
  846. double map_width; // 地图宽度
  847. double map_height; // 地图高度
  848. double map_scale; // 地图比例尺
  849. int map_type; // 地图文件类型,弃用
  850. AreaMap map_area_list; // 本地图上的区域列表
  851. ReaderMap map_reader_list; // 本地图上的分站列表
  852. ReaderMap map_ctrl_reader_list; // 本地图上的控制分站列表
  853. CardMap map_card_list_person; // 本地图上的人员列表
  854. CardMap map_card_list_vehicle; // 本地图上的车辆
  855. ChamberMap map_chamber_list; // 本地图上的硐室
  856. SectionMap map_section_list; // 本地图上的路段
  857. LightMap map_light_list; // 本地图上的交通灯
  858. LightGroupMap map_light_group_list; // 本地图上的交通灯灯组
  859. };
  860. class LandmarkInfo
  861. {
  862. public:
  863. int landmark_id; // 地标编号
  864. string landmark_name; // 地标名称
  865. int map_id; // 所属地图
  866. int area_id; // 所属区域
  867. double x;
  868. double y;
  869. double z;
  870. };
  871. class MapDirectionInfo
  872. {
  873. public:
  874. MapDirectionInfo(){};
  875. ~MapDirectionInfo(){};
  876. public:
  877. int map_direction_id; // 地图方向
  878. int map_id; // 地图编号
  879. int north_angle; // 当前地图向上方向与北方的夹角,用来判断当前地图哪个方向是北
  880. };
  881. // 区域
  882. class Area // 矩形
  883. {
  884. private:
  885. std::vector<std::string> split(std::string str,std::string pattern); // 将path分割成点集数组
  886. double get_vertex(std::string src); // 顶点
  887. public:
  888. Area(void);
  889. ~Area(void);
  890. void init_border(string sz_path); // 初始化边界
  891. bool is_in_polygon(_point p); // 判断点是否在多边形内
  892. bool is_special(); // 是否为特殊区域
  893. public:
  894. int map_id; // 所在地图
  895. int area_id; // 区域编号
  896. string area_name; // 区域名称
  897. string area_type_name; // 区域类型名称
  898. string path; // 多边形
  899. int area_type_id; // 所属区域类型
  900. /*
  901. *@brief
  902. 是否为工作区域标识
  903. #define AREA_WORK_AREA 1 //工作区域
  904. #define AREA_NON_WORK_AREA 0 //非工作区域
  905. */
  906. bool m_is_work_area;
  907. // 人员
  908. int over_count_person; // 最大人数
  909. int over_time_person; // 最大时长
  910. int under_count_person; // 最小人数
  911. int under_time_person; // 最小时长
  912. // 车辆
  913. int over_count_vehicle;
  914. int over_time_vehicle;
  915. int under_count_vehicle;
  916. int under_time_vehicle;
  917. double over_speed_vehicle; //区域车辆速度阈值
  918. int polygon_count; // 顶点个数
  919. _point* polygon; // 顶点数组
  920. // 区域人数
  921. int count_person; // 当前区域人数
  922. int count_vehicle; // 当前区域车数
  923. int count_card; // 当前区域卡数
  924. // 是否写考勤
  925. int is_att; // 0 停车场外,1 停车场内
  926. bool is_area_over_time_person; // 车辆超时
  927. bool is_area_over_time_vehicle; // 人员超时
  928. int count_area_over_time_person; // 超时人数
  929. int count_area_over_time_vehicle; // 超时车数
  930. time_t time_over_time_person; // 开始超时时间
  931. time_t time_over_time_vehicle; // 开始超时时间
  932. bool is_area_over_count_person; // 人员超员
  933. bool is_area_over_count_vehicle; // 车辆超员
  934. int count_area_over_count_person; // 人员超员数量
  935. int count_area_over_count_vehicle; // 车辆超员数量
  936. time_t time_over_count_person; // 开始时间
  937. time_t time_over_count_vehicle; // 开始时间
  938. // 区域为限制区域时有效
  939. bool is_area_forbidden_person; // 是否有人进入禁区
  940. bool is_area_forbidden_vehicle; // 是否有车进入禁区
  941. int count_area_forbidden_person; // 进入进入人数
  942. int count_area_forbidden_vehicle; // 进入进入车数
  943. time_t time_forbidden_person; // 开始时间
  944. time_t time_forbidden_vehicle; // 开始时间
  945. std::shared_ptr<CardMap> area_card_list_person; // 区域内的人员
  946. std::shared_ptr<CardMap> area_card_list_vehicle; // 区域内的车
  947. std::shared_ptr<CardMap> area_card_list_over_speed; // 区域内超速的车
  948. INT64 m_event_list[AREA_EVENT_COUNT]; // 保存事件Id
  949. };
  950. class WarningPoint
  951. {
  952. public:
  953. int warning_point_id;
  954. std::string warning_point_name;
  955. std::vector<NAMESPACE_POINT::point> vp;
  956. std::string to_string()
  957. {
  958. std::stringstream ss;
  959. ss<<"point_id:"<<warning_point_id<<" name:"<<warning_point_name;
  960. for (const auto &p:vp)
  961. ss<<"("<<p.x<<","<<p.y<<")";
  962. ss<<"-----";
  963. return ss.str();
  964. }
  965. };
  966. // 危险点定义
  967. class DrivingfaceWarningPoint
  968. {
  969. public:
  970. int warning_point_id; // 危险点编号
  971. string warning_point_name;
  972. int driving_face_id; // 掘进面编号
  973. float point_x; // 危险点位置
  974. float point_y;
  975. float point_z;
  976. float warning_threshold; // 报警门限(距离)
  977. int is_valid; // 危险点是否有效
  978. };
  979. class SpecialAreaEntry
  980. {
  981. public:
  982. SpecialAreaEntry(){}
  983. public:
  984. double start_point_x; // 特殊区域入口,对角线两顶点
  985. double start_point_y;
  986. double start_point_z;
  987. double end_point_x;
  988. double end_point_y;
  989. double end_point_z;
  990. int special_area_id; // 特殊区域编号
  991. std::string car_type;
  992. int union_area_id;
  993. };
  994. class DrivingfaceRender
  995. {
  996. public:
  997. DrivingfaceRender(){}
  998. public:
  999. INT drivingface_id;
  1000. INT reader_id;
  1001. double vertical_distance;
  1002. double x;
  1003. double y;
  1004. double z;
  1005. };
  1006. // 工作面与卡绑定信息
  1007. class DrivingfaceCard
  1008. {
  1009. public:
  1010. DrivingfaceCard():m_total_ref_point_dist(0.0){
  1011. x = y = z = m_schedule_work_times = m_schedule_tunnelling_times = m_drifting_footage_unit = m_fOffset=0.0;
  1012. drivingface_id = area_id = m_overcount = m_mapId = m_drivingface_type = m_relay_small_reader_id = m_small_reader_id = m_big_reader_id = 0;
  1013. m_old_state = m_cur_state = false;m_sensor_id.clear();
  1014. m_vt_ref_point_list.resize(0);
  1015. }
  1016. ~DrivingfaceCard(){}
  1017. public:
  1018. double x;
  1019. double y;
  1020. double z;
  1021. INT drivingface_id;
  1022. string card_id;
  1023. INT area_id;
  1024. float warning_threshold;
  1025. int m_overcount;
  1026. int m_mapId;
  1027. int m_drivingface_type;
  1028. int m_relay_small_reader_id; //中继小分站
  1029. int m_small_reader_id; //小分站
  1030. int m_big_reader_id; //大分站
  1031. int m_dept_id; //部门
  1032. double m_schedule_work_times; //计划工作时长
  1033. double m_schedule_tunnelling_times; //计划排数
  1034. double m_drifting_footage_unit; //排数的间距
  1035. bool m_old_state; //之前的掘进机状态
  1036. bool m_cur_state; //当前的掘进机状态
  1037. double m_driver_dist; //工作面车和司机告警距离,米
  1038. int m_driver_dist_time;//工作面车司机的告警间隔。秒
  1039. std::vector<op::point> m_vt_ref_point_list;
  1040. double m_total_ref_point_dist; //基准点之间的累计距离
  1041. double m_fOffset;
  1042. std::vector<int> m_sensor_id;
  1043. struct TAirSensor{
  1044. TAirSensor()
  1045. :bigger(-1),count(0),sum(0),ct(-1),stime(0),flag(false),rid(0)
  1046. {}
  1047. void clear()
  1048. {
  1049. count=sum=0;stime=0;flag=false;
  1050. }
  1051. std::array<op::point,2> ant;
  1052. std::array<double,2> dist;
  1053. int8_t bigger;
  1054. uint32_t count,sum;
  1055. uint16_t ct;
  1056. uint64_t stime;
  1057. bool flag;
  1058. uint16_t rid;
  1059. std::list<double> his_data;
  1060. };
  1061. TAirSensor m_tas;
  1062. bool timeout()
  1063. {
  1064. time_t t=time(NULL);
  1065. return m_tas.flag && t-m_tas.stime>10*60;
  1066. }
  1067. bool check_location_reversal(std::string & str)
  1068. {
  1069. time_t t=time(NULL);
  1070. time_t tval= t-m_tas.stime;
  1071. bool f=false;
  1072. if (tval !=0 && m_tas.sum*1.0/tval > 0.8 && m_tas.count*1.0/m_tas.sum <0.2)
  1073. f=true;
  1074. char buf[1024]={0};
  1075. sprintf(buf,"[reverse_alarm_checking]%s,count:%d,sum:%d,val:%d,s:%.2f,v:%.2f,alarm:%d",
  1076. card_id.c_str(),m_tas.count,m_tas.sum,tval,(m_tas.sum*1.0/tval),(m_tas.count*1.0/m_tas.sum),f);
  1077. str=buf;
  1078. return f;
  1079. }
  1080. void make_reverse_condition(int16_t antid,uint16_t ct,double d)
  1081. {
  1082. m_tas.dist[antid]=d;
  1083. if(m_tas.ct == ct){
  1084. m_tas.sum++;
  1085. int b=-1;
  1086. if (m_tas.dist[0]>m_tas.dist[1]) b=0 ;else b =1;
  1087. if(b==m_tas.bigger) m_tas.count++; //合格的点
  1088. }
  1089. m_tas.ct = ct;
  1090. }
  1091. void set(const op::point &p0,const op::point &p1,int id)
  1092. {
  1093. int8_t b=0;
  1094. m_tas.ant[0].set(p0);m_tas.ant[1].set(p1);
  1095. op::point bp(x,y);
  1096. double d0=bp.dist(p0);double d1=bp.dist(p1);
  1097. if(d0>d1)b=1;else b=0;
  1098. if (m_tas.bigger!=-1 && b!=m_tas.bigger){
  1099. m_tas.count=m_tas.sum=0;m_tas.stime=time(0);
  1100. }
  1101. m_tas.bigger=b;m_tas.rid=id;
  1102. }
  1103. bool push(double d){
  1104. bool f=true;
  1105. m_tas.his_data.push_back(d);
  1106. if (m_tas.his_data.size()==3){
  1107. double da=0;
  1108. for (const auto &d:m_tas.his_data){
  1109. if(da>d || d-da<0.004){f=false;break;}
  1110. da=d;
  1111. }
  1112. m_tas.his_data.pop_front();
  1113. }
  1114. else f=false;
  1115. return f;
  1116. }
  1117. op::point &operator[](int i){return m_tas.ant[i];}
  1118. const op::point &operator[](int i)const {return m_tas.ant[i];}
  1119. void set_true(){m_tas.flag=true;m_tas.stime=time(NULL);}
  1120. bool warning(){return m_tas.flag;}
  1121. bool empty(){return m_tas.his_data.empty();}
  1122. double back(){return m_tas.his_data.back();}
  1123. void clear_sensor(){m_tas.clear();}
  1124. int reader_id(){return m_tas.rid;}
  1125. };
  1126. // 自组网预置坐标
  1127. class Adhoc
  1128. {
  1129. public:
  1130. Adhoc();
  1131. ~Adhoc();
  1132. public:
  1133. int adhoc_id;
  1134. double x;
  1135. double y;
  1136. double z;
  1137. int idx; // 节点级别
  1138. };
  1139. // 天线
  1140. class Antenna
  1141. {
  1142. public:
  1143. Antenna(void);
  1144. ~Antenna(void);
  1145. public:
  1146. int antenna_id;
  1147. double antenna_x;
  1148. double antenna_y;
  1149. double antenna_z;
  1150. double antenna_angle;
  1151. };
  1152. class BaseArea{
  1153. public:
  1154. BaseArea(){
  1155. m_nPolygonCount = 0;
  1156. m_pPolygon = NULL;
  1157. }
  1158. ~BaseArea(){
  1159. if (m_pPolygon)
  1160. {
  1161. delete[] m_pPolygon;
  1162. m_pPolygon = NULL;
  1163. }
  1164. }
  1165. public:
  1166. int init_border(string path);
  1167. bool IsInPolygon(_point p);
  1168. private:
  1169. double GetVertex(std::string src); // 顶点
  1170. std::vector<std::string> Split(std::string str,std::string pattern);
  1171. public:
  1172. int m_nProperty;
  1173. int m_nPolygonCount;
  1174. _point* m_pPolygon;
  1175. };
  1176. // 区域边界定义
  1177. class BoundaryArea:public BaseArea{
  1178. public:
  1179. BoundaryArea(){
  1180. boundary_area_id = map_id = reader_id = 0;
  1181. name = path = "";
  1182. };
  1183. ~BoundaryArea(){};
  1184. public:
  1185. int boundary_area_id;
  1186. int map_id;
  1187. int reader_id;
  1188. string name;
  1189. string path;
  1190. };
  1191. // 分站
  1192. class Reader
  1193. {
  1194. public:
  1195. Reader(void);
  1196. ~Reader(void);
  1197. public:
  1198. int reader_id; // 分站号
  1199. string reader_name; // 分站名称
  1200. int device_type_id; // 设备类型,分站、通信分站、交通灯等
  1201. int pos_state; // 位置状态 1井上,2井下
  1202. string ip;
  1203. double reader_x;
  1204. double reader_y;
  1205. double reader_z;
  1206. double reader_angle;
  1207. double reader_interval_time; // 分站接收数据间隔,单位秒
  1208. int map_id; // 所在地图
  1209. int area_id; // 所属区域
  1210. double map_scale; // 比例尺
  1211. time_t rec_time;
  1212. time_t reader_time; // 分站时间
  1213. time_t lost_time; // 丢失时间
  1214. time_t last_send_time; // 最后向前端发送时间
  1215. int temperature; // 温度
  1216. int tick_count; // 计数器
  1217. int reader_state; // 状态 0 正常, 1 故障
  1218. int reader_state_old;
  1219. int dimension; // 指定分站定位类型:一维定位,二维定位,三维定位
  1220. int sync_level; // 时间同步级别
  1221. unsigned long long sync_rootId; // 时间同步主分站编号,用来区分同时存在多个主节点的情况
  1222. std::shared_ptr<Antenna> ant[ANTENNA_COUNT]; // 天线数组
  1223. std::shared_ptr<Adhoc> adhoc[ADHOC_COUNT]; // 自组网设备数组
  1224. map<int,_point> readerCoveragePath; // 分站覆盖范围,tof使用
  1225. bool bIsInitCoverage;
  1226. int m_nIsSpecial; // 是否为特殊分站,定位结果与分站间距4米以内,如果是特殊分站就将定位点定位在分站附近,否则抛弃计算结果
  1227. bool init_ctrl_reader_state; //当为控制分站时,第一次需要获得此控制分站下的红绿灯状态
  1228. INT64 m_event_list[READER_EVENT_COUNT]; // 保存事件Id
  1229. unsigned int reader_package_end_pos; // 分站数据包结束位置
  1230. std::string last_parse_card_id; // 解析的上一个卡号
  1231. std::shared_ptr<BoundaryArea> pBoundaryArea; // 定位分站边界,用于二维定位分站
  1232. bool is_parent; // 是否为带ip的大分站
  1233. unsigned int parent_anchor_id; // 如果为不带ip的大分站或者挂载在大分站下的小分站,指出其所属大分站的id
  1234. std::vector<TimePosition> m_vt_his_position;
  1235. int is_simulation_card; // 表示此分站是否可以模拟成车卡,1表示可以模拟车卡,0表示无法模拟车卡
  1236. bool b_simulation_status; // 分站模拟车卡的状态,为true,表示开始模拟,false表示分站结束模拟车卡
  1237. time_t m_start_simulation_time; // 小分站开始模拟车卡的时间
  1238. uint8_t reader_dir; // 分站方向,对于大小分站适用
  1239. uint8_t relay_counts; // 大小分站经过中继数
  1240. bool m_bNeedPowerAlarm; //是否需要分站电池供电告警功能
  1241. public:
  1242. string get_state_text(); // 获取状态信息
  1243. };
  1244. class StorePostion
  1245. {
  1246. public:
  1247. StorePostion(){
  1248. x = y = z = 0;
  1249. GetLocalTime(&save_time);
  1250. };
  1251. ~StorePostion();
  1252. double x, y, z;
  1253. SYSTEMTIME save_time;
  1254. };
  1255. // 卡
  1256. class Card : public NAMESPACE_POINT::card_interface
  1257. {
  1258. public:
  1259. //Card(void);
  1260. ~Card(void);
  1261. Card(string cardid, int cardtype,double z_offset);
  1262. public:
  1263. CRITICAL_SECTION m_csCard;
  1264. bool m_bigCarFlag;
  1265. double m_overSpeed;
  1266. double m_overAreaSpeed;
  1267. bool is_registered; // 是否注册,即是否录入数据库,没录入当误码判断,不处理
  1268. virtual int push_optimized_data(NAMESPACE_POINT::loc_point&lp);
  1269. virtual int getCardType();
  1270. virtual bool smoothFlag();
  1271. virtual bool getBigCarFlag();
  1272. virtual const std::string& cardId();
  1273. virtual const uint64_t CtTime();
  1274. virtual const int getX();
  1275. virtual const int getY();
  1276. virtual double getv();
  1277. virtual int getAreaId();
  1278. virtual int getAcc();
  1279. virtual void do_alarm(const std::size_t ow);
  1280. virtual void PrintString(const std::string &&str);
  1281. virtual const uint64_t get_last_recv_time();
  1282. public:
  1283. Fit fit_x; // 拟合的位置
  1284. Fit fit_y;
  1285. int card_type; // 卡类型 0x01人, 0x02车
  1286. string card_id;
  1287. int m_indexCardSpeed;//超速计数,超过一定次数报超速告警
  1288. int m_indexCardSpeed_normal;//速度正常计数,超过一定次数再取消超速告警
  1289. int m_indexMineOverSpeed;//超速计数,超过一定次数报超速告警
  1290. int m_indexMineOverSpeed_normal;//速度正常计数,超过一定次数再取消超速告警
  1291. // 人员
  1292. int level_id; // 级别
  1293. int worktype_id;// 工种lemon 2017/07/31 车辆为vehicle_type_id
  1294. int vehice_type_id; // 几级别类型
  1295. // 开机率相关
  1296. boost::circular_buffer<int> m_cb_state; // 存储硬件上传的开关机惯导标记
  1297. bool m_bOpen; // 采煤机/掘进机开机状态
  1298. time_t m_startup_time; // 采煤机/掘进机开机时间
  1299. int m_nCardId; // 卡号
  1300. time_t m_lastrecv_time; // 上次收到的时间
  1301. double m_fScheduleStartupTime; // 采煤机/掘进机计划开机时长
  1302. std::vector<CoalFaceStartPos> m_vecLoc; // 采煤机起刀位置历史轨迹
  1303. /*
  1304. *@brief
  1305. 一线工人或二线工人标识
  1306. #define CARD_FRONT_LINE_WORKERS 1 //一线工人
  1307. #define CARD_SECONT_LINE_WORKERS 2 //二线工人
  1308. */
  1309. BYTE m_staff_type;
  1310. // 人员、车辆
  1311. int id; // 编号,人员或车辆
  1312. int dept_id; // 部门
  1313. int occ_id; // 职务id
  1314. int group_id; // 班组
  1315. int need_display;// lemon 2071/08/01 是否在Web端显示
  1316. int power_alarm_display;//lemon 2018/01/15 低电量告警标识,1推送 0不推送
  1317. std::string vehicle_category_id;//lemon 2018/04/11 车辆的类型,人车料车特种车
  1318. bool power_change_flag;//
  1319. int shift_type_id; // 人员或者车辆执行的班次类型
  1320. std::string m_staffName;
  1321. std::string m_deptName;
  1322. time_t m_dbTimeInterval;
  1323. string driver_id; //如果是车辆,则有司机id
  1324. int light_id; // 闯红灯的灯编号
  1325. int shift_id; // 本次出勤所属班次
  1326. SYSTEMTIME deal_time; // 最后处理卡逻辑时间
  1327. SYSTEMTIME enter_area_time; // 进入区域时间
  1328. //
  1329. int m_indexForRcvOneReader;
  1330. //driving face write database time
  1331. ULONGLONG drive_face_location_write_time;
  1332. ULONGLONG drive_face_location_end_time;
  1333. //SYSTEMTIME down_time;
  1334. time_t rec_time; // 最后接收时间
  1335. time_t last_correct_position_info_time; // lyl temp add: 上一次解析位置信息成功的时间
  1336. int data_source_al_route13; // lyl temp: 路径13连续累计次数
  1337. time_t down_time; // 入井时间
  1338. time_t att_start_time_latest; // 最近一次从无信号转为有信号的时间,有可能在考勤区域,有可能在非考勤区域 lihongzhen 2017/8/17 17:20
  1339. time_t att_end_time_latest; // 最后一次从非考勤区域进入考勤区域的时间 lihongzhen 2017/8/17 17:23
  1340. time_t up_time; // 升井时间
  1341. time_t enter_reader_time; // 进入分站时间
  1342. time_t low_power_time; // 电量低开始时间
  1343. double x; // 定位坐标
  1344. double y;
  1345. double z;
  1346. //查看掘进机变量是否为初始化值,如果是不进行插入库操作
  1347. bool is_drivingface_Initialization;
  1348. // 只有掘进机上的卡有效
  1349. int driving_face_id; // 所属掘进面
  1350. double driving_face_cur_shift_start_x; //cur shift start position
  1351. double driving_face_cur_shift_start_y;
  1352. double driving_face_cur_shift_start_z;
  1353. double driving_face_cur_shift_x; //cur shift real point
  1354. double driving_face_cur_shift_y;
  1355. double driving_face_cur_shift_z;
  1356. double drving_face_cur_shift_max_speed;
  1357. double a; // 上次定位时的角度
  1358. int t; // 上次定位时的时间戳
  1359. double m_oldv;// lemon 2017/10/26
  1360. double v; //速度
  1361. double final_v; // 尽量做线程安全, 防止 v 中间计算值输出
  1362. double mileage; // 里程,距离上次保存数据时的距离
  1363. double z_offset; // 标识卡与分站天线的高度差
  1364. bool init_postion; // 是否初始化了位置信息,算法中用到
  1365. bool is_first_location; // 是否为第一次定位,算法中用到
  1366. int is_driving_face_start; // 作为掘进机时,判读是否已启动
  1367. double right_x,right_y,right_z; //分别指卡位置右边偏移的x,y,z坐标
  1368. double left_x,left_y,left_z; //分别指卡位置左边偏移的x,y,z坐标
  1369. double last_x; // 上次的定位位置
  1370. double last_y;
  1371. double last_z;
  1372. double stored_x; // 存储到数据库中的位置
  1373. double stored_y;
  1374. double stored_z;
  1375. double output_x; // 算法输出的位置
  1376. double output_y;
  1377. double last_vx; // 上次的速度
  1378. double last_vy;
  1379. int state; // 0 正常, 共32bit,每个bit代表一个状态,从右起:
  1380. // 第一位 0x01 井下超时, 第二位 0x02 区域超时, 第三位 0x04 超速, 第四位 0x08, 进入限制区域
  1381. // 状态,故障、电量低等
  1382. int state_moving; // 运动状态, 0 静止,1 运动, 2怠速
  1383. int state_meeting; // 会车状态,与movingstate合并来表示 3会车,4结束会车,5超车
  1384. // 电量低、 呼叫、呼救
  1385. int status_over_time; // 0 未超时,1 超时
  1386. int status_over_speed; // 0 未超速,1 超速
  1387. int status_area_over_time; // 0 未区域超时, 1 区域超时
  1388. int status_area_over_speed; // 0 未区域超速, 1 区域超速
  1389. int status_area_forbidden; // 0 未进入限制区域, 1 进入限制区域
  1390. int status_help; // 0 未呼救, 1 呼救, 2 已处理呼救
  1391. int status_help_cancel; //cancle help request
  1392. int status_call; // 0 未呼叫 1 呼叫
  1393. int status_power; // 0 电量正常,1 电量低
  1394. int status_lost; // 0 未进入盲区,1024 盲区状态
  1395. int map_id; // 当前地图
  1396. double map_scale; // 地图比例尺
  1397. int map_id_old; // 上次测距所在地图
  1398. int area_id; // 当前区域
  1399. int pre_area_id;
  1400. bool m_area_changed; // 区域切换
  1401. int landmark_id; // 地标信息
  1402. double landmark_dis; // 与地标的距离
  1403. int landmark_direction; // 所处地标的方向
  1404. int reader_id; // 当前分站
  1405. Reader* p_reader; // 最后一个接收本卡数据的分站,以程序处理的数据为准
  1406. std::shared_ptr<ReaderPathMap> pTofReaderPathMap; // tof分站地图集
  1407. std::shared_ptr<TDOAReaderPathMap> pTdoaReaderPathMap; // tdoa分站地图集
  1408. map<unsigned long long,std::shared_ptr<_coordinate>> mp_dists_locate; // 参与算法计算的dist记录(解析得到的数据)
  1409. _coordinate last_locate; // 上一次计算得到的位置
  1410. _coordinate origin_locate; // 根据原始数据求出的定位解
  1411. _coordinate error_locate; // 错误的定位解
  1412. QueStrorePos _storepostions; // 算法存储的定位解
  1413. DistQueMap _dists; // 算法所需的dist缓存队列
  1414. unsigned short time_stamp_max; // 最大时间戳,即需要计算定位的时间戳
  1415. unsigned short time_stamp_cal; // ct 值,计算位置坐标的ct值
  1416. unsigned short time_stamp_cal_last; // 算法定位时间戳
  1417. int m_nFilterType; // 滤波类型
  1418. int m_nLastLocateT; // 最后定位的时间同步序号
  1419. int m_nCalcSyncNum; //卡在算法中的同步号,此同步号和卡的实时同步号并不一定一致
  1420. int m_nSyncNumInList; //从队列中取出的大于5的同步号
  1421. int m_nStream; //上行、下行
  1422. int m_direction; //正向 负向
  1423. int m_nLightGroupId; // 灯组id
  1424. int m_nMoveDirection; //1为正向运动,-1为负向运动
  1425. int m_nIsRailroad; //是否为有轨车,0为无轨车,1为有轨车
  1426. int m_nOutputPosState; //0为正常输出中间坐标,1为输出靠左偏移坐标,2为输出靠右偏移坐标
  1427. bool bIsBack; // 是否为后退
  1428. bool bInSpecailArea; // 是否在特殊区域
  1429. bool issent; // true 已发送至客户端,false 新数据,需要发送至客户端
  1430. bool issaved; // true 已保存到数据库,false 生成新的考勤记录,需要保存到数据库
  1431. bool isdealed; // 已经处理
  1432. bool isreceive; // 接收到
  1433. bool is_deal_by_algo; //是否经过算法处理
  1434. bool is_hist; // 是否为从历史数据中加载的数据
  1435. bool m_bUseFilter; // 是否使用滤波
  1436. bool isoutput; //是否输出到json
  1437. bool is_red_light; // 是否闯红灯
  1438. bool is_mine_over_time; // 是否井下超时
  1439. bool is_mine_over_speed; // 是否井下超速
  1440. bool is_area_over_time; // 是否区域超时, 区域超时分车辆超时、人员超时
  1441. bool is_area_over_speed; // 是否区域超速
  1442. time_t time_area_over_time; // 区域超时开始时间
  1443. time_t time_over_time; // 井下超时开始时间
  1444. time_t time_area_forbidden; // 进入限制区域时间
  1445. time_t time_over_speed; // 超速开始时间
  1446. time_t time_area_over_speed; // 区域超速开始时间
  1447. time_t time_low_power; // 低电量开始时间
  1448. time_t time_red_light; //闯红灯时间
  1449. time_t last_locate_time; // 最后定位时间
  1450. void reset(); // 重置所有状态
  1451. void resetAllBaseInfo(); //重置基本信息
  1452. void set_reader(std::shared_ptr<Reader> preader);
  1453. void add_dist(std::shared_ptr<_coordinate> dist);
  1454. void cal_pos_by_cache(); // 利用缓存的数据计算位置
  1455. int dist_cache_size(); // 获取缓存数据个数
  1456. void remove_dist_head(); // 删除缓存队列中第一个元素
  1457. string concat(int reader_id, int ant_id); // 把分站号和天线号拼成唯一标识
  1458. time_t get_working_time(); // 获取工作时长
  1459. int get_state(); // 设置电量状态
  1460. int get_state_moving(); // 设置运动状态
  1461. double get_speed(); // 获取速度
  1462. void set_speed(double v); // 设置速度
  1463. int get_effictive_dist_count(int offset = 0); // 获取参与算法的dist个数
  1464. void set_reader_path(std::shared_ptr<ReaderPathMap> rpm, std::shared_ptr<TDOAReaderPathMap> trpm); // 设置地图集
  1465. //int get_direction(double x1,double y1,double x2,double y2);
  1466. void get_coordinate(); // 计算位置坐标,含算法
  1467. void get_coordinate(int cnt);
  1468. int const PosState(); // 井下井上状态
  1469. void PosState(int val); // 设置井下井上状态
  1470. void PosStateOld(int val); // 上一个井下井上状态,用来判断是否状态改变时比较
  1471. bool is_pos_state_changed(); // 入\升井状态变化
  1472. int const StateBiz(); // 设置业务状态
  1473. int new_algo_tof_1d(int cnt);
  1474. double CalculateX(int L1, int L2, int last_ct, int ct, double last_x, double dis1, double dis2, double last_dis1, double last_dis2, double next_dis1, double next_dis2);
  1475. double Card::CalculateX(double L1, double L2, int last_ct, int ct, double last_x0, double dis1, double dis2, double last_dis1, double last_dis2, double next_dis1, double next_dis2);
  1476. _point CalculateX(const AlgoParamData* pData,_coordinate& lc);
  1477. int Sign(double x);
  1478. DistQueMap::iterator get_iterator(DistQueMap::iterator it);
  1479. INT64 m_event_list[CARD_EVENT_COUNT]; // 保存事件Id
  1480. public://lemon
  1481. int m_warning_point_id; // 最近的危险点
  1482. bool m_isWarning; // 测距分站距离告警使用
  1483. double m_minDistanceToWarningpoint; // 距离最近危险点距离
  1484. double m_warning_threshold; //
  1485. bool m_CardHasBeenInDrivingfaceAlarm; // 是否已发出靠近危险点告警
  1486. int m_DrivingfaceAlarmFlag; // 非记录人员靠近掘进机告警
  1487. int m_drivingface_index; //与测距分站之间得距离统计参数
  1488. int m_drivingface_index_del;
  1489. //由于目前告警模块限制,所以需要使用下面参数
  1490. bool m_warning_point_alarm;
  1491. double m_disToWarningPoint;
  1492. int m_wp_id;
  1493. int m_workface_index; //与测距分站之间得距离统计参数
  1494. int m_workface_index_del;
  1495. public:
  1496. //add by zhuyf 2017/10/18
  1497. int recevie_by_moving_reader; // 针对人而言,统计被移动分站接收的次数
  1498. int person_on_card; // 人上车状态,0为下车,1为上车
  1499. int satisfy_on_vehicle_counts; // 人卡满足上车状态条件统计次数
  1500. int satisfy_off_vehicle_counts; // 人卡满足下车状态条件统计次数
  1501. double relative_speed; // 相对速度
  1502. double min_distance; // 最小距离,
  1503. std::string possible_vehicle_id; // 可能的车
  1504. std::string vehicle_id; // 针对人卡而言,目前人卡在哪辆车上
  1505. std::shared_ptr<CardMap> mp_person_in_vechicle_list; // 针对车而言,统计已上车的人员列表
  1506. bool package_is_over; //分站内此卡的数据包解析完,解析完即可调用算法进行计算
  1507. bool no_need_add_dist; //不需要加入到_dists队列中
  1508. double recv_signal_power; // 接收的信号强度
  1509. public:
  1510. //线性拟合使用
  1511. unsigned long long m_ct_time; // 接收时间,用来计算时间间隔,求速度
  1512. int m_positon;
  1513. ULONGLONG m_getOnTime;
  1514. public:
  1515. CardMap mp_list_over_count;
  1516. //lemon 2017/08/01
  1517. inline double getDrivingfaceCulValue(){return m_drivingface_distance_cul_values;}
  1518. inline double getDrivingfaceLimitValue(){return m_drivingface_distance_limit_values;}
  1519. inline void setDrivingfaceCulValue(double cvalue){m_drivingface_distance_cul_values = cvalue;}
  1520. inline void setDrivingfaceLimitValue(double lvalue){m_drivingface_distance_limit_values = lvalue;}
  1521. //lemon 2017/08/16
  1522. double m_drivingface_start_x;
  1523. double m_drivingface_start_y;
  1524. double m_drivingface_start_z;
  1525. std::string m_drivingface_start_time;
  1526. double m_curshift_finish_length;
  1527. double m_cur_total_finish_length;
  1528. //lemon 2017/09/22 出井补全区域信息
  1529. string store_data_card( int tag,double x =0,double y =0);
  1530. //zhuyf 2018/08/30
  1531. double m_max_distance; //与小分站或大分站的最远测距距离
  1532. op::point m_max_p; //最远距离的定位点坐标
  1533. time_t m_record_cycle_start_time; // 记录周期的开始时间
  1534. double m_record_avg_dist; //周期内距离信息的平均值
  1535. double m_record_min_dist; //周期内最小距离值
  1536. double m_record_max_dist; //周期内最大距离值
  1537. unsigned int m_record_totals; //总记录条数
  1538. bool m_b_first_record; //
  1539. std::string m_str_record; //
  1540. std::vector<TimePosition> m_cb_position; //存储一分钟内点的坐标;
  1541. op::point m_base_position;
  1542. bool m_b_first_calc;
  1543. private:
  1544. double m_drivingface_distance_cul_values;
  1545. double m_drivingface_distance_limit_values;
  1546. public:
  1547. //算法相关参数及函数
  1548. bool is_algo_first_location; //表示算法的第一次定位
  1549. bool is_idling; // 是否为怠速状态
  1550. bool is_del_data; //是否删除数据
  1551. int idle_count; // 连续判断为怠速状态的次数,超过次数阈值则将速度置为0
  1552. int ins_req_status_algo; //算法惯导状态
  1553. DistMap dist_1d; // 不同计算方式的缓存dist
  1554. DistMap dist_2d;
  1555. DistMap dist_3d;
  1556. DistMap distmap;
  1557. std::shared_ptr<nspLocate::LocateRecord> locate;
  1558. std::list<std::shared_ptr<POS>> idle_pos_list; // 怠速判断位置列表
  1559. //2017/11/28 add by zhuyf
  1560. std::shared_ptr<Tdoa::TaylorWls> pTaylorWls;
  1561. std::vector<std::shared_ptr<HostServer::Position>> avg_coordinate; // 在tdoa二维定位时:统计前5个点的坐标用于算平均坐标,当第六个点开始才使用加速度或速度过滤
  1562. bool is_use_acc_filter;
  1563. std::shared_ptr<algorithm::base::SensorManager> pSensorManager;
  1564. algorithm::base::Sensor<double>* pAcceSensor;
  1565. algorithm::base::Sensor<double>* pGyroscopeSensor;
  1566. void algo_tof(int cnt);
  1567. int algo_tof_1d(int cnt); // tof一维定位
  1568. int algo_tof_2d(int cnt); // tof二维定位
  1569. int algo_tof_3d(int cnt); // tof三维定位
  1570. //tdoa算法
  1571. void algo_tdoa(int cnt);
  1572. int algo_tdoa_1d(int cnt); // tdoa一维定位
  1573. int algo_tdoa_2d(int cnt); // tdoa二维定位
  1574. int algo_tdoa_3d(int cnt); // tdoa三维定位
  1575. int inspect_coordinate(int acce_state); // 拟合位置
  1576. int save_card_data(); // 为标识卡变量赋值
  1577. void algo_calc_offset(); //计算偏移坐标
  1578. double x_offset_after(); //返回偏移后的X坐标
  1579. double y_offset_after(); //返回偏移后的Y坐标
  1580. double z_offset_after(); //返回偏移后的Z坐标
  1581. bool algo_is_same_direction(double x,double y,double z); //检查此次方向
  1582. int CheckDistData(int cnt);
  1583. int AssembleDistData(std::shared_ptr<ReceiveDataMap> pRdm); //tdoa组装数据
  1584. int AssembleDistData(map<unsigned long long, std::shared_ptr<_coordinate>>& p_dist_locate); //tof组装数据
  1585. int GetDeltaT(map<unsigned long long,std::shared_ptr<_coordinate>> dl); // 获取两次定位之间的时间差
  1586. int SaveCardAlgoData(std::shared_ptr<POS>& pos); // 保存算法计算结果变量
  1587. int SaveTofData(const std::shared_ptr<POS> pos); // 保存tof算法计算结果变量
  1588. int SaveTdoaData(const std::shared_ptr<POS> pos); // 保存tdoa算法计算结果变量
  1589. int SaveOriginDataBeforeFilter(std::shared_ptr<POS> pos); // 保存算法滤波前的计算的结果变量
  1590. int ChooseOneSolution(std::shared_ptr<ReceiveDataMap> pRdm, std::vector<std::shared_ptr<POS>> udm_pos, std::shared_ptr<POS>& pos);// 输出唯一解
  1591. int calibration_pos_data(std::shared_ptr<POS> pos); //校验坐标数据,并将结果保存到pos中
  1592. int optimization_pos(std::shared_ptr<POS> pos); //优化定位坐标
  1593. int kalman_filter_process_tdoa(std::shared_ptr<POS> pos); // tdoa滤波
  1594. int kalman_filter_process_tof(std::shared_ptr<POS> pos); // tof滤波
  1595. int position_data_filter_by_direction(std::shared_ptr<POS> pos,map<unsigned long long, std::shared_ptr<_coordinate>>& p_dist_locate); //通过与同一分站两天线原测距方向进行比较判断结果是否符合预期
  1596. int CheckSolution(std::shared_ptr<POS>& p); // tdoa 一维定位使用:验证唯一解合法性,如速度、加速度
  1597. void saveToSyncNumDataList(int sync_num, double pixelX, double pixelY, double speedX, double speedY, bool updated); // 通过校验后的数据, 保存到 m_syncNumList 容器
  1598. int CheckSulutionByStream(std::shared_ptr<POS> p); // 参数使用非引用,即不可修改其值
  1599. int GetStream(double x1,double y1,double x2,double y2); // 获得上下行方向
  1600. int get_direction(double x1,double y1,double x2,double y2); //获得正向,方向
  1601. int CalcPositionBySpeed(std::shared_ptr<POS>& pos,double v); // 通过速度计算位置
  1602. bool CheckStreamUniformity(double x1,double y1,double x2,double y2,int nStream); // 检查当前定位坐标和nStream方向是否一致
  1603. bool IsExistPath(int left,int right); // 判断两个分站之间是否存在地图集,用于tdoa算法
  1604. int CopySolution(std::shared_ptr<POS> source,std::shared_ptr<POS>& dest); // 拷贝解
  1605. //std::shared_ptr<nspLocate::LocateRecord> locate;
  1606. bool IsIdleStatus(std::shared_ptr<POS> pos); // 判断是否为怠速状态
  1607. bool IsRebound(std::shared_ptr<POS> pos); //判断是否回退
  1608. virtual bool CheckPositionValid(const std::shared_ptr<POS> pos); //检查解的有效性
  1609. bool CheckPositionValid(const double& x,const double& y);
  1610. double GetDeltaT(); //获取时间差值
  1611. int get_dimension(); // 获取定位类型,是一维、二维、三维
  1612. int split_dist_data(); // 分割dist记录
  1613. int deal_position_boundary(_point& p); //处理二维边界处理问题
  1614. bool position_is_in_boundary(_point p); //检查点p是否在边界e
  1615. _point mapping_position_to_boundary(_point p); //映射此点到边界上的点
  1616. int check_solution_tdoa_2d(std::shared_ptr<POS>& p);
  1617. int save_tdoa_data_2d(std::shared_ptr<POS>& p); //tdoa二维定位保存数据
  1618. public:
  1619. //tof相关变量及函数
  1620. time_t time_cur_algo; // dist数据进缓存队列的时间
  1621. time_t time_last_tof; // 上次tof定位的时间
  1622. int reader_id_algo; // 算法计算时的分站号
  1623. bool is_send_ins_check;
  1624. int get_position_by_one_distance(std::shared_ptr<TOFReaderPathMap> trpm,std::shared_ptr<POS>& pos,const TOF_REFER_DATA refer_data);
  1625. bool CheckSolutionTof(std::shared_ptr<POS>& pos); //通过速度及加速度检查定位结果是否正确
  1626. int get_ref_data_from_dists(map<unsigned long long, std::shared_ptr<_coordinate>> tmp_dists_locate,const int& key,TOF_REFER_DATA& refer_data);
  1627. private:
  1628. void set_reader_path_tof(std::shared_ptr<ReaderPathMap> rpm); // 设置tof路径集
  1629. void set_reader_path_tdoa(std::shared_ptr<TDOAReaderPathMap> trpm); // 设置tdoa路径集
  1630. public:
  1631. list<sync_data> m_syncNumList;
  1632. std::list<std::shared_ptr<POS>> his_idle_pos;
  1633. bool b_long_interval; //上一次定位的间隔时间差大于10s
  1634. int diff_direction_counts; // 连续反向运行次数
  1635. int maxSyncTimes; // 分站时间同步最大时间戳
  1636. public:
  1637. // 滤波算法相关
  1638. std::unique_ptr<CKalmanFilter> m_pKalmanFilter;
  1639. int acce_cur_state; //在算法中保存当前加速度状态,保存这两个值的原因是在多线程情况下accelerate_state和accelerate_state_last状态可能变化
  1640. int acce_last_state; //在算法中保存上一次加速度状态
  1641. double ins_weight; //加速度计状态权重
  1642. double uwb_weight; //uwb状态权重
  1643. std::list<double> vt_his_speed;
  1644. int FindDistMap(int cardstamp); // 查看dist缓存中是否有此相同ct的数据
  1645. int KalmanFilterProcess(std::shared_ptr<POS>& pos); // 滤波过程
  1646. void EnableFilter(int nType); // 启动滤波
  1647. bool isRebound(std::shared_ptr<POS> pos); //判断是否回跳
  1648. public:
  1649. bool b_save_pos;
  1650. //在长时间无法定位的情况下使用拟合算法输出点
  1651. std::list<std::shared_ptr<POS>> his_pos; //保存之前5个点的信息
  1652. bool is_ref_pos; //判断是否作为参考点
  1653. bool is_fit_pos;
  1654. bool have_fit_pos;
  1655. bool have_long_fit_pos;
  1656. bool is_over_interval; //用于保存modify_card_speed中当前时间和卡的最后接收时间的是否超过指定时间的状态
  1657. int count_idle; //统计坐标连续有多少次没变化了,用于判断车辆是否怠速,统计5次
  1658. int cur_fit_nums; //当前拟合次数,当有新数据放入his_pos即重置它
  1659. int cur_ref_totals;
  1660. int count_change_direction; // 统计方向改变后的的连续定位次数,大于3次,改变行驶方向。
  1661. double fitting_v[REF_POSITION_NUM];
  1662. double fitting_ct[REF_POSITION_NUM];
  1663. double fitting_x[REF_POSITION_NUM];
  1664. double fitting_y[REF_POSITION_NUM];
  1665. double fit_new_x[FIT_POSITION_NUM];
  1666. double fit_new_y[FIT_POSITION_NUM];
  1667. //第二种拟合
  1668. std::list<std::shared_ptr<POS>> long_his_pos; //保存之前20个点的信息,此信息必须是UWB定位信息
  1669. double long_fitting_ct[REF_POSITION_NUM];
  1670. double long_fitting_x[REF_POSITION_NUM];
  1671. double long_fitting_y[REF_POSITION_NUM];
  1672. double long_fit_new_x[FIT_POSITION_NUM*4];
  1673. double long_fit_new_y[FIT_POSITION_NUM*4];
  1674. int UpdateFittingData(std::shared_ptr<POS> pos); //更新拟合基础数据
  1675. int CalcFittingData(list<std::shared_ptr<POS>> & list_pos); //计算拟合数据
  1676. //double CalcFittingData_ForMonkeyCar(list<std::shared_ptr<POS>> & list_pos);
  1677. //int GetStream_Monkeycar(double x1,double y1,double x2,double y2);
  1678. int CalcLongFittingData();
  1679. int CalcFittingData(int ret,std::shared_ptr<POS>& pos);
  1680. int CalcLongFittingData(int ret,std::shared_ptr<POS>& pos);
  1681. int GetPosFromFittingData(std::shared_ptr<POS>& pos);
  1682. std::shared_ptr<POS> GetPosFromFittingData(); //从拟合数据获取定位坐标
  1683. int CheckSolutionByFit(int ret,std::shared_ptr<POS>& pos); // 利用拟合数据验证解的合法性
  1684. int CheckSolutionBySpeed(std::shared_ptr<POS>& pos); // 利用速度验证解的合法性
  1685. bool need_reset;// temp add by lyl: 算法是否需要重置
  1686. int cell_station_error_num; // temp add by lyl: 跨基站处理异常
  1687. int speed_limit_after_reset; // temp add by lyl: 重置后, 对拟合算法计算出的速度值做管控
  1688. bool CheckCardCtValid(); //检查卡的ct有效性
  1689. public:
  1690. int state_biz; //业务状态,呼叫/超时/进入禁区等
  1691. int pos_state; // 位置状态,0初始化,1井下,2井上,3车场分站
  1692. int pos_state_old;
  1693. int pos_state_count; // 当前位置状态确认次数
  1694. int pos_state_confirm_times; // 井下、井上状态确认次数,默认为1
  1695. public:
  1696. // 采集到的底层数据
  1697. unsigned short time_stamp_last; // 定位时间戳
  1698. int accelerate_state_last; // 上一次加速度状态
  1699. int power_state_last; // 电量
  1700. int ins_direction; // 上一次的惯导合成方向
  1701. int reader_tickcount; // 分站发送数据的计数次数
  1702. unsigned short time_stamp; // 定位时间戳
  1703. unsigned short time_center_stamp; // 定位时间戳
  1704. int ranging_type; // 报文类型 tof,tdoa
  1705. int accelerate_state; // 加速度
  1706. int antenna_id; // 天线号
  1707. int power_state; // 电量
  1708. int sync_num; // 分站同步序号
  1709. int n_pos_no_change_times; // lihongzhen 2017/8/19 位置连续未变化次数
  1710. bool b_pos_change; // 位置发生了改变
  1711. bool b_enter_intersection; // 车辆是否进入过路口区域
  1712. int strength; // 信号强度
  1713. double antenna_angle; // 天线角度
  1714. double distance; // 距离
  1715. int64_t flying_time; // 飞行时间
  1716. string str_his_time; // 分站接收到卡时的时间
  1717. string str_rec_time; // 采集程序接收到数据的时间
  1718. public:
  1719. //呼叫信息
  1720. int call_type_id; // 呼叫类型,全员、定员
  1721. int call_type; // 呼叫级别 一般、紧急
  1722. std::vector<int> vt_deal_call_reader_id; // 呼叫到卡的分站列表
  1723. time_t recv_call_time; //卡接收到呼叫的时间戳
  1724. public:
  1725. //惯导数据
  1726. //tof中惯导数据
  1727. int ins_request_check; //uwb带惯导数据的协议中惯导请求校准状态值,0为正常,1为请求校准
  1728. int ins_cal_type; //下发校准类型:0下发校准角度和坐标,1下发校准坐标,2下发校准角度
  1729. bool is_check_ins; //是否已校准惯导数据
  1730. double ins_gyp_angle; //校准后的陀螺仪角度
  1731. std::shared_ptr<POS> cur_ins_pos; //惯导上传的坐标
  1732. std::shared_ptr<POS> ins_gyp_pos; //校准后的惯导初始坐标
  1733. std::list<std::shared_ptr<POS>> lt_uwb_pos; //存储校准两时刻的uwb定位数据
  1734. std::list<std::shared_ptr<POS>> lt_ins_pos; //存储校准两时刻的ins定位数据
  1735. int deal_ins_cal_data(); //处理惯导数据校准
  1736. int calc_slope(std::shared_ptr<POS> start,std::shared_ptr<POS> end,double & slope);
  1737. public:
  1738. //测试及统计功能
  1739. AlgoFailedMsg m_afmData;
  1740. //add by zhuyf 2018/06/28
  1741. //由于测试卡会发呼救,针对600以上卡不许其发送呼救
  1742. bool is_no_send_help;
  1743. public:
  1744. //测试参数及相关函数
  1745. int OutputCmdLog(int n);
  1746. double dTestDelatT; //测试时间差
  1747. double dTestDistance; //测试两次的定位的距离差
  1748. //position_optimizer
  1749. // virtual std::string get_id();
  1750. // virtual unsigned long long get_m_ct_time();
  1751. public:
  1752. // lihongzhen 2017/9/25 原滤波算法
  1753. CalLocation* cal_location; // 二维定位算法
  1754. Point2* p2_anchors; // 二维定位解
  1755. CalLocation3* cal_location3; // 三维定位算法
  1756. Point3* p3_anchors; // 三维定位解
  1757. std::shared_ptr<_coordinate>* p_dists;
  1758. std::shared_ptr<_coordinate>* p_dists_locate;
  1759. bool is_init_kalman; // 是否已初花滤波状态
  1760. void add_dist_ex(std::shared_ptr<_coordinate> dist);
  1761. void resetKalmanInfo(); // 重置旧版kalman滤波定位相关信息
  1762. bool is_anchor_changed; // 定位的分站有没有变化,如果变化了,需要重置状态矩阵
  1763. void get_coordinate_old(int cnt);
  1764. void get_coordinate_2d(int cnt); // 二维定位算法,带滤波
  1765. void get_coordinate_2d_nofilter(int cnt); // 二维定位投影算法求解
  1766. void get_coordinate_3d(int cnt); // 三维算法求解,带滤波
  1767. void set_anchors(int cnt); // 设置参与定位的分站位置
  1768. int get_effictive_dist_count_ex(); // 获取有效参与定位算法的dist记录数
  1769. virtual int algo_tof_raw_1d(const DistMap& dm);
  1770. virtual const std::vector<std::shared_ptr<_coordinate>> calc_locate_tof_raw_1d(map<unsigned long long, std::shared_ptr<_coordinate>> p_dists_locate) const;
  1771. virtual int get_antenna_xyz(int reader_id, int antenna_id,double& x,double& y, double& z);
  1772. virtual int get_key(double x, double y, double& key);
  1773. public:
  1774. std::weak_ptr<card> m_card_ptr;
  1775. inline void set_card_Ptr(std::shared_ptr<card> ptr)
  1776. {
  1777. m_card_ptr = ptr;
  1778. }
  1779. inline void resetPtr(){m_card_ptr.reset();}
  1780. //防追尾
  1781. double m_arg;//0x12345678
  1782. void make_arg();
  1783. uint64_t m_last_time;
  1784. NAMESPACE_POINT::line_v m_line;
  1785. public:
  1786. //三率开发
  1787. double m_schedule_work_time; //采煤机计划工作时长
  1788. double m_schedule_mine_times; //采煤机计划刀数
  1789. double m_work_face_width; //采煤机所在工作面的宽度
  1790. void calc_tunnel_boring_machine_pos(const op::point& p);
  1791. };
  1792. // 班次
  1793. class BanShift
  1794. {
  1795. public:
  1796. BanShift();
  1797. ~BanShift();
  1798. BanShift(int id, std::string s, std::string e, int tid);
  1799. int shift_id; // 班次编号
  1800. int shift_type_id; // 班制编号
  1801. std::string start_time; // 班次开始时间
  1802. std::string end_time; // 班次结束时间
  1803. };
  1804. // 领导带班
  1805. class LeaderArrange
  1806. {
  1807. public:
  1808. LeaderArrange( string cardid);
  1809. ~ LeaderArrange();
  1810. int staff_id; // 员工编号
  1811. string card_id; // 标识卡号
  1812. int shift_id; // 班次
  1813. int shift_type_id; // 班制
  1814. time_t starttime; // 班次开始时间
  1815. time_t endtime; // 班次结束时间
  1816. };
  1817. // 部门
  1818. class Dept
  1819. {
  1820. public:
  1821. Dept(){};
  1822. ~Dept(){};
  1823. Dept(int id, string name);
  1824. private:
  1825. public:
  1826. int dept_id;
  1827. string dept_name;
  1828. CardMap dept_card_list_person;
  1829. CardMap dept_card_list_vehicle;
  1830. };
  1831. // 职务级别
  1832. class OccLevel
  1833. {
  1834. public:
  1835. OccLevel(){};
  1836. ~OccLevel(){};
  1837. OccLevel(int id);
  1838. private:
  1839. public:
  1840. int occlevel_id;
  1841. CardMap level_card_list_person;
  1842. CardMap level_card_list_vehicle;
  1843. };
  1844. /*
  1845. * 地图集路径描述
  1846. */
  1847. class ReaderPath{
  1848. public:
  1849. ReaderPath(){
  1850. bIsInit = false;
  1851. nRealCalcPoints = 0;
  1852. x[0] = x[1] = y[0] = y[1] = 0;
  1853. for(int i = 0;i < MAX_CALC_POINTS;i++){
  1854. px[i] = py[i] = pz[i] = 0;
  1855. }
  1856. }
  1857. public:
  1858. //对于TOF而言,x,y表示1,2天线对应的坐标
  1859. //对于TDOA而言,x,y表示焦点F1,F2(等同于分站i,i+1)的坐标
  1860. int nRealCalcPoints;
  1861. double x[2];
  1862. double y[2];
  1863. double z[2];
  1864. double px[MAX_CALC_POINTS];
  1865. double py[MAX_CALC_POINTS];
  1866. double pz[MAX_CALC_POINTS];
  1867. bool bIsInit;
  1868. };
  1869. //红绿灯
  1870. class Light{
  1871. public:
  1872. int m_nID; //红绿灯id
  1873. int m_nMapID; //地图id
  1874. int m_nReaderID; //传输分站id
  1875. int m_nAreaID; //区域id
  1876. int m_nSectionID; //路段id
  1877. int m_nLightsGroupID; //红绿灯组id
  1878. int m_nPort; //与分站之间通信的路数
  1879. int m_nState; //红绿灯是否可用状态,0可用,1不可用
  1880. int m_nOldState;
  1881. int device_type_id; //设备类型
  1882. double x; //x坐标
  1883. double y; //y坐标
  1884. double z; //z坐标
  1885. std::string m_strIP; //红绿灯ip
  1886. std::string m_strName; //红绿灯名字
  1887. std::string m_strLabel;
  1888. time_t rec_time;
  1889. time_t last_send_time;
  1890. public:
  1891. Light();
  1892. ~Light(){}
  1893. public:
  1894. int get_light_state();
  1895. public:
  1896. int m_nStream; //0为上行,1为下行
  1897. int m_nColor; //0x01 红色, 0x02 绿色
  1898. int m_nShape; // 形状 0x01 实心圆形,0x02 空心圆形,0x03 叉形,0x04 - 0x07 上下左右箭头,0xFF 警告闪烁
  1899. int m_nStateBiz; //0为正常,1为网络故障,2为控制失败,3为灯故障
  1900. int m_nIsCtrl; // 设备控制状态 0x01 自动控制,0x02手动控制
  1901. time_t alarm_start_time;
  1902. };
  1903. //闯红灯参数
  1904. struct RunRedLight
  1905. {
  1906. //当前灯组亮绿灯的灯号,
  1907. int32_t m_group_id;
  1908. //当前灯组亮绿灯的灯号,
  1909. int m_light_id;
  1910. //车辆id,
  1911. int m_vehicle_id;
  1912. //区域id,
  1913. int32_t m_area_id;
  1914. //闯红灯时间
  1915. std::string m_time;
  1916. };
  1917. // 灯组
  1918. class LightsGroup{
  1919. public:
  1920. int m_nID;
  1921. int m_nState;
  1922. bool m_bIsUsed;
  1923. std::string m_strName;
  1924. std::string m_strLabel;
  1925. public:
  1926. int m_nSectionId; //灯组所在的路口区域
  1927. std::string m_strVechileId; //控制此灯组的车辆id
  1928. map<int,std::shared_ptr<Light>> mp_lights_list;
  1929. public:
  1930. LightsGroup();
  1931. ~LightsGroup(){};
  1932. public:
  1933. bool isExist(std::shared_ptr<Light> pLight);
  1934. bool isAllLightColor(int nColor);
  1935. };
  1936. //硐室
  1937. class Chamber:public BaseArea{
  1938. public:
  1939. int m_nID; //硐室编号
  1940. int m_nState; //使用状态,特指此硐室是否处于可用
  1941. int m_nIsUsed; //硐室内是否有车
  1942. int m_nSectionID; //硐室所属路段ID
  1943. int m_nMapID; //硐室所属地图ID
  1944. std::string m_strPath; //硐室区域
  1945. std::string m_strName; //硐室名称
  1946. std::string m_strLabel; //硐室描述
  1947. public:
  1948. Chamber();
  1949. ~Chamber();
  1950. };
  1951. //路段
  1952. class Section:public BaseArea{
  1953. public:
  1954. int m_nID;
  1955. int m_nMapId;
  1956. std::string m_strPath;
  1957. std::string m_strName;
  1958. std::string m_strLabel;
  1959. public:
  1960. int m_nState; //0---正常,1---繁忙,2---拥堵
  1961. time_t alarm_start_time;
  1962. ChamberMap mp_champer_list;
  1963. LightMap mp_light_list;
  1964. CardMap mp_vehicle_list;
  1965. CardMap mp_staffer_list;
  1966. INT64 m_event_list[SECTION_EVENT_COUNT];
  1967. public:
  1968. Section();
  1969. ~Section(){}
  1970. public:
  1971. bool is_has_chamber(); //是否有未使用的躲避硐室
  1972. int get_section_state(); //路段状态
  1973. int get_section_vehicle_counts(); //路段内车辆总数
  1974. int get_section_staffer_counts(); //路段内人员总数
  1975. };
  1976. // 巡检任务
  1977. class PatrolTask
  1978. {
  1979. public:
  1980. PatrolTask();
  1981. ~PatrolTask();
  1982. private:
  1983. public:
  1984. int patrol_task_id; // 巡检任务编号
  1985. int patrol_path_id; // 巡检路径编号
  1986. string card_id; // 卡号
  1987. string starffer_id; // 员工号
  1988. time_t start_time; // 开始时间
  1989. time_t end_time; // 结束时间
  1990. PatrolPointMap mpPoint; // 巡检点列表
  1991. bool is_in_cur_point; // 是否处在当前点位置
  1992. int cur_point_idx; // 当前巡检点索引
  1993. int state; // 巡检状态
  1994. int stay_state; // 停留时长状态
  1995. int duration_stay; //停留时长
  1996. time_t enter_time; // 进入该节点时间
  1997. time_t leave_time; // 离开当前节点时间
  1998. };
  1999. // 巡检点
  2000. class PatrolPoint
  2001. {
  2002. public:
  2003. PatrolPoint();
  2004. ~PatrolPoint();
  2005. private:
  2006. public:
  2007. int idx; // 在路径中的索引
  2008. int patrol_point_id;
  2009. int map_id;
  2010. double x; // 区域范围圆心
  2011. double y;
  2012. double z;
  2013. double ranging; // 距离范围
  2014. int duration_last; // 距离上个节点时长
  2015. int duration_stay_min; // 本节点最小时长
  2016. int duration_stay_max; // 本节点最大时长
  2017. int duration_ranging; // 距离上个节点时长最大偏差,含正负
  2018. };
  2019. enum EVENT_TYPE{ // 事件类型
  2020. ET_UNKNOWN = 0,
  2021. ET_OVER_COUNT_PERSON = 1, // 井下人员超员mp_card_list_over_count_person
  2022. ET_OVER_COUNT_VEHICLE = 2, // 井下车辆超员mp_card_list_over_count_person
  2023. ET_AREA_OVER_COUNT_PERSON = 3, // 区域人员超员
  2024. ET_AREA_OVER_COUNT_VEHICLE = 4, // 区域车辆超员
  2025. ET_SECTION_OVER_COUNT = 5, // 路段拥堵
  2026. ET_READER_ERROR = 6, // 分站通信异常
  2027. ET_CTRL_READER_ERROR = 7, // 控制分站异常
  2028. ET_LIGHT_ERROR = 8, // 交通灯异常
  2029. ET_READER_CALL = 9, // 分站呼叫标识卡
  2030. ET_READER_CALL_CANCEL = 10, // 取消呼叫分站
  2031. ET_CARD_LOW_POWER = 11, // 电量低
  2032. ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
  2033. ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时mp_card_list_over_time_person
  2034. ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时mp_card_list_over_time_vehicle
  2035. ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
  2036. ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
  2037. ET_CARD_AREA_LIMIT_PERSON = 17, // 人员进入限制区域
  2038. ET_CARD_AREA_LIMIT_VEHICLE = 18, // 车辆进入限制区域
  2039. ET_CARD_AREA_FORBIDDEN_PERSON = 19, // 人员进入禁止区域
  2040. ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
  2041. ET_CARD_OVER_SPEED = 21, // 车辆超速
  2042. ET_CARD_AREA_OVER_SPEED = 22, // 车辆区域超速
  2043. ET_CARD_RUN_THE_RED_LIGHT = 23, // 车辆闯红灯
  2044. ET_CARD_HELP = 24, // 人员呼救
  2045. ET_CARD_CALLED = 25, // 人员已被呼叫
  2046. ET_CARD_PATROL_ERROR = 26, // 人员巡检异常
  2047. ET_CARD_LOST = 27, // 标识卡信号丢失
  2048. ET_CARD_DRIVINGFACE_WARNING_AREA = 28, // 掘进面靠近预警区域告警
  2049. ET_CARD_NEAR_DRIVINGFACE_VEHICLE=29,// 人员靠近掘进机告警
  2050. ET_CARD_NEAR_DRIVINGFACE_OVERCOUNT=30,//掘进机附近人员超员
  2051. ET_UWB_MORE_CARD = 31,
  2052. ET_CARD_MOTIONLESS=32,
  2053. ET_READER_POWER_BY_BATTERY=33, //分站电池:1为电池供电,0为交流电供电,当电池供电需要告警
  2054. ET_VEHICLE_REAR_END=36, //车辆追尾告警
  2055. ET_COALING_DRIVING_DRIVER=37, //工作面(采煤面和掘进面)司机与车卡告警
  2056. ET_VEHICLE_NEAR_GEOFAULT=38, //靠近断层告警
  2057. ET_READER_LOCATION_REVERSAL=39, //天线定位反向告警
  2058. ET_RUN_RED_LIGHT=40, //天线定位反向告警
  2059. CARD_EVENT_COUNT_MAX,
  2060. };
  2061. enum OBJECT_TYPE // 对象类型
  2062. {
  2063. OT_MINE = 1, // 矿井
  2064. OT_AREA = 2, // 区域
  2065. OT_SECTION = 3, // 路段
  2066. OT_DEVICE_READER = 4, // 分站
  2067. OT_DEVICE_LIGHT = 5, // 交通灯
  2068. OT_DEVICE_ctrl_reader = 6, // 控制分站
  2069. OT_DEVICE_LED = 7, // led屏
  2070. OT_DEVICE_SPEAKER = 8, // 防爆音箱
  2071. OT_CARD = 9, // 标识卡,包括人员、车辆、自组网等
  2072. OT_DRIVINGFACE_AREA=10,
  2073. OT_UWB_MORE_CARD=11,
  2074. };
  2075. enum EVENT_STATUS{ // 事件状态
  2076. ES_START = 0, // 事件开始
  2077. ES_DEAL_HELP = 1, // lihongzhen 2017/8/19 呼救已处理状态
  2078. ES_END = 100 // 事件结束
  2079. };
  2080. enum REQUEST_COUNTS_TYPE{
  2081. REQUEST_ALL = 0,
  2082. REQUEST_ALL_OVER_TIME_PERSON,
  2083. REQUEST_AREA_OVER_TIME_PERSON,
  2084. REQUEST_SPECIAL_ERROR_PERSON,
  2085. REQUEST_ALL_OVER_TIME_VEHICLE,
  2086. REQUEST_AREA_OVER_TIME_VEHICLE,
  2087. REQUEST_ALL_OVER_PERSON,
  2088. REQUEST_AREA_OVER_PERSON,
  2089. REQUEST_ALL_OVER_VEHICLE,
  2090. REQUEST_AREA_OVER_VEHICLE
  2091. };
  2092. // 告警事件
  2093. class YaEvent
  2094. {
  2095. private:
  2096. INT64 ev_id;
  2097. public:
  2098. YaEvent(){};
  2099. YaEvent(INT64 e_id){
  2100. ev_id = e_id;
  2101. obj_id = "";
  2102. cur_time = time(NULL);
  2103. map_id = 0;
  2104. area_id = 0;
  2105. x = 0;
  2106. y = 0;
  2107. limit_value = 0;
  2108. cur_value = 0;
  2109. desc = "";
  2110. landmarkid = 0;
  2111. landmarkdirect = 0;
  2112. landmarkdist = 0;
  2113. };
  2114. ~YaEvent(){};
  2115. public:
  2116. EVENT_STATUS status; // 告警状态,开始、结束
  2117. EVENT_TYPE ev_type; // 告警类型
  2118. OBJECT_TYPE obj_type; // 告警对象类型
  2119. std::string obj_id; // 告警对象编号,与告警对象类型对应,如告警对象类型为分站,此字段为分站编号
  2120. time_t cur_time; // 当前时间,为告警事件的触发时间,如果状态为开始,则表示开始时间,否则为结束时间
  2121. int map_id; // 告警所在地图
  2122. int area_id; // 告警所在区域
  2123. double x; // 位置
  2124. double y;
  2125. double limit_value; // 告警阈值
  2126. double cur_value; // 当前值
  2127. std::string desc; // 描述
  2128. int landmarkid; // 告警地标位置描述
  2129. int landmarkdirect;
  2130. int landmarkdist;
  2131. bool is_sent; // 已发送
  2132. INT64 get_id(){return ev_id;};
  2133. };
  2134. // 控制灯信息
  2135. class LightCallInfo{
  2136. public:
  2137. LightCallInfo(){
  2138. light_id = 0;
  2139. ctrl_type = 0;
  2140. ctrl_color = 0;
  2141. light_state = 0;
  2142. task_id = "";
  2143. }
  2144. public:
  2145. int light_id; // 灯编号
  2146. int ctrl_type; // 控制类型,自动、手动
  2147. int ctrl_color; // 显示颜色
  2148. int light_state; // 灯状态
  2149. std::string task_id;
  2150. };
  2151. enum DIRECTION_TYPE{
  2152. NODIRECTORY = 0,
  2153. EAST = 1,
  2154. SOURTH = 2,
  2155. WEST = 3,
  2156. NORTH = 4
  2157. };
  2158. // 车辆考勤规则
  2159. class VehicleTypeAttRule
  2160. {
  2161. public:
  2162. VehicleTypeAttRule(int vtid, int pre, int back);
  2163. ~VehicleTypeAttRule();
  2164. int vehicle_type_id; // 车辆类型编号
  2165. int offset_pre; // 考勤向前偏移时间
  2166. int offset_back; // 考勤向后偏移时间
  2167. std::vector<int> vecArea; // 考勤区域
  2168. void Clear();
  2169. void AddArea(int area_id);
  2170. };
  2171. // 手动移动车辆图标
  2172. class HandUpVehicle
  2173. {
  2174. public:
  2175. std::string card_id;
  2176. double point_x;
  2177. double point_y;
  2178. int area_id;
  2179. };
  2180. //移动分站
  2181. class MovingReader{
  2182. public:
  2183. MovingReader(std::shared_ptr<Card> pCard,int reader_id){
  2184. this->pVehicleCard = pCard;
  2185. this->moving_reader_id = reader_id;
  2186. };
  2187. MovingReader(){
  2188. this->pVehicleCard = nullptr;
  2189. this->moving_reader_id = 0;
  2190. };
  2191. ~MovingReader(){};
  2192. public:
  2193. int moving_reader_id; // 移动分站id
  2194. std::shared_ptr<Card> pVehicleCard; // 关联车卡信息
  2195. CardMap mp_person_card; // 统计移动分站收到的人卡列表
  2196. public:
  2197. std::shared_ptr<Card> get_card(){return pVehicleCard;};
  2198. void set_card(std::shared_ptr<Card> pCard){this->pVehicleCard = pCard;};
  2199. };
  2200. enum HAND_UP_STATUS{ // 手动挪车状态
  2201. NOT_IN_HANDUP_LIST = 0, // 不在handup list中
  2202. IN_HANDUP_LIST_AREA_IN = 1, // 在handup list中,在半径距离内
  2203. IN_HANDUP_LIST_AREA_OUT = 2 // 在handup list中,在半径距离外
  2204. };
  2205. #ifdef DEBUG
  2206. #define TEST_FROM_FILE 1
  2207. #else
  2208. #endif // DEBUG
  2209. #endif //YASERVER_CLASSDEF_H_