carManager.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. #include "stdafx.h"
  2. #include "carManager.h"
  3. #include "ProcessRemodule.h"
  4. #include "INIFILE.h"
  5. #include "def.h"
  6. #include "YAServerDlg.h"
  7. NAMESPACE_POINT_BEGIN(NAMESPACE_POINT)
  8. //ConfStruct g_cs;
  9. CarManager::CarManager(CYAServerDlg* owner)
  10. :m_owner(owner)
  11. ,m_bExit(false)
  12. ,m_pThread(NULL)
  13. ,m_queue(256)
  14. ,m_ma(NULL)
  15. ,m_reddis(20)
  16. {
  17. read_config();
  18. m_sites.reset(new sit_list());
  19. m_cf[0] = std::make_shared<CloserCardFactory>();
  20. m_cf[1] = std::make_shared<RemoteCardFactory>();
  21. m_dr[0] = std::make_shared<DecoratorRuleCrossing>(this);
  22. m_dr[1] = std::make_shared<DecoratorRuleAvoidance>(this);
  23. for(const auto & p :m_dr)
  24. p->CreateRule();
  25. m_pThread = new std::thread(&CarManager::run,this);
  26. m_ma = new MotionlessAlarm(this);
  27. }
  28. CarManager::~CarManager()
  29. {
  30. m_bExit = true;
  31. if(m_pThread != NULL)
  32. {
  33. m_pThread->join();
  34. delete m_pThread;
  35. }
  36. if(m_ma != NULL)
  37. delete m_ma;
  38. }
  39. void CarManager::run()
  40. {
  41. while (!m_bExit)
  42. {
  43. std::shared_ptr<TrafficLightGroup> tmp = nullptr;
  44. if(m_queue.tryGet(tmp))
  45. {
  46. m_owner->get_json_all_traffic_lights(tmp);
  47. }
  48. //resetTrafficGroup();
  49. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  50. }
  51. }
  52. void CarManager::init_sit_list(int32_t readerid,int32_t antid, double ax, double ay,double scale)
  53. {
  54. m_sites->init_sit_list(readerid,antid,ax,ay,scale);
  55. }
  56. void CarManager::init_sit_list()
  57. {
  58. m_sites->init_sit_list();
  59. }
  60. void CarManager::init_ant_path(int32_t readerid,int32_t antid, double ax, double ay,std::vector<string>::iterator& b,std::vector<string>::iterator &e)
  61. {
  62. m_sites->init_ant_path(readerid,antid,ax,ay,b,e);
  63. }
  64. void CarManager::init_ant_path()
  65. {
  66. m_sites->init_ant_path();
  67. }
  68. void CarManager::init_cardpath()
  69. {
  70. card_path::init(*m_sites);
  71. }
  72. //-----------set point ---
  73. std::vector<his_location> CarManager::makeUpMorePoints(std::string & cardid,double x,double y, uint64_t ct,int32_t readerid)
  74. {
  75. std::shared_ptr<base_card> bc = nullptr;
  76. bc = m_cardList[cardid];
  77. std::vector<his_location> vt;
  78. if (bc)
  79. {
  80. vt = bc->make_up_more_points_for_history(point(x,y),ct,&(*m_sites)[readerid]);
  81. }
  82. return std::move(vt);
  83. }
  84. //----card----
  85. void CarManager::put(std::string &cardid,const loc_info&li,std::shared_ptr<card_interface> &c,int32_t readerid)
  86. {
  87. debug_print_syslog(0,"[lemon_smooth_on:%s]t=%lld,sit=%d,ant=%d,card=%d,ct=%d,tof=%d,rav=%d,acc=%d,rsp=%.1f,cardType:%d\n"
  88. ,cardid.c_str(),li.m_loc_time,readerid, li.m_ant_id, li.m_card_id ,li.m_card_ct,li.m_tof
  89. ,li.m_rav,li.m_acc,li.m_card_sp,li.m_card_type );
  90. std::shared_ptr<base_card> bc = nullptr;
  91. bc = m_cardList[cardid];
  92. if (!bc)
  93. {
  94. bc = std::make_shared<base_card>(c,li.m_card_id);
  95. m_cardList.insert(cardid,bc);
  96. }
  97. bc->on_tof_data(&(*m_sites)[readerid],li);
  98. }
  99. void CarManager::erase(std::string cardid)
  100. {
  101. std::stringstream ss;
  102. std::shared_ptr<base_card> bc = nullptr;
  103. bc = m_cardList[cardid];
  104. if (bc != nullptr)
  105. {
  106. ss<<"LemonHash Erase.."<<cardid;
  107. for(auto s:bc->m_card->m_v)
  108. {
  109. ss<<" "<<s;
  110. }
  111. debug_print_syslog(0,"%s",ss.str().c_str());
  112. std::vector<std::string> tmp(bc->m_card->m_v.begin(),bc->m_card->m_v.end());
  113. for(int i = m_cf.size()-1;i>=0;i--)
  114. {
  115. //升井的时候,对由于时长未到,而未进行以人多卡检测的数据进行最后的check。
  116. auto mp = m_cf[i]->erase(bc->m_card,m_cardList,tmp);
  117. if(i == 0 && !mp.empty())
  118. {
  119. m_owner->uwb_alarm(mp,i,bc->m_card);
  120. }
  121. }
  122. m_cardList.erase(cardid);
  123. bc->m_card->m_v.clear();
  124. bc->m_card->m_m.clear();
  125. }
  126. }
  127. loc_point CarManager::getpoint(std::string cardid)
  128. {
  129. std::shared_ptr<base_card> bc = nullptr;
  130. bc = m_cardList[cardid];
  131. if (bc)
  132. {
  133. return std::move(bc->grab_loc_point());
  134. }
  135. else
  136. {
  137. return std::move(loc_point());
  138. }
  139. }
  140. /*
  141. *
  142. *
  143. * 参数
  144. * c 卡对象
  145. *
  146. * 返回值
  147. * 无
  148. *
  149. */
  150. void CarManager::uwb_HandleMoreCard(std::shared_ptr<card_interface>& c)
  151. {
  152. //debug_print_syslog(0,"[ConfStruct:%s]",ConfStruct::getCs().to_str().c_str());
  153. //获得卡的坐标信息(x,y),卡号,卡的接收时间
  154. int x = c->getX();
  155. int y = c->getY();
  156. std::string cardid = c->cardId();
  157. uint64_t ctime = c->CtTime();
  158. std::stringstream ss;
  159. //查找距离此卡号为cardid附近MaxScope范围内的所有卡,将这些卡号保存到rc中
  160. std::vector<std::string> rc=m_g.find_near(cardid,ConfStruct::getCs().MaxScope);
  161. //删除rc内所有不是人卡的数据
  162. rc.erase(std::remove_if(rc.begin(),rc.end(),[](const std::string &name){
  163. if(0 == name.compare(0,3,"001"))
  164. return false;
  165. else
  166. return true;}),rc.end());
  167. //输出rc的大小,卡号,接收时间,卡的坐标(x,y)
  168. //ss<<"LemonHash["<<rc.size()<<"]"<<c->cardId()<<" "<<ctime<<" x:"<<x<<" y:"<<y;
  169. //debug_print_syslog(0,"%s",ss.str().c_str());
  170. //计算并输出卡号cardid附近的rc内所有卡距离此卡cardid的接收时间差,以及这些卡的
  171. //std::for_each(rc.begin(),rc.end(),[&](const std::string &s)
  172. // {
  173. // std::stringstream ss;
  174. // std::shared_ptr<base_card> bc = nullptr;
  175. // bc = m_cardList[s];
  176. // if (bc!=nullptr)
  177. // {
  178. // std::shared_ptr<card_interface>&xc = bc->m_card;
  179. // int ctd = xc->CtTime()>ctime ?(xc->CtTime()-ctime):(ctime-xc->CtTime());
  180. // ss<<"-----LemonHash----"<<s<<" ct:"<<xc->CtTime()<<" Vct:"<<ctd<<" x:"<<xc->getX()<<" y:"<<xc->getY()<<" dis:"<<(sqrt(pow(x-xc->getX(),2)+pow(y-xc->getY(),2)));
  181. // debug_print_syslog(0,"%s",ss.str().c_str());
  182. // }
  183. // }
  184. //);
  185. //
  186. std::map<uint64_t,std::string> map1;
  187. std::map<uint64_t,std::string> map2;
  188. for(int i = m_cf.size()-1;i>=0;i--)
  189. {
  190. map1.clear();
  191. map2.clear();
  192. map1=m_cf[i]->selectcard(rc.begin(),rc.end(),c,m_cardList);
  193. map2=m_cf[i]->setCT(c);
  194. std::copy(map1.begin(),map1.end(),std::inserter(map2,map2.end()));
  195. if (i == 1 && !map2.empty())
  196. {
  197. //for (auto it:map2)
  198. //{
  199. // debug_print_syslog(0,"---++LemonHash CatchOne Remote--%lld-%s",it.first,it.second.c_str());
  200. //}
  201. erase(map2);
  202. }
  203. if (!map2.empty())
  204. {
  205. //for (auto it:map2)
  206. //{
  207. // debug_print_syslog(0,"---++LemonHash CatchOne--%lld-%s",it.first,it.second.c_str());
  208. //}
  209. //
  210. m_owner->uwb_alarm(map2,i,c);
  211. }
  212. //if (!rc.empty())
  213. //{
  214. // std::string s ;
  215. // s = m_cf[i]->infomessage();
  216. // debug_print_syslog(0,"---lemonhash----[%s]%s",i?"remote":"closer",s.c_str());
  217. //}
  218. }
  219. }
  220. void CarManager::erase(std::map<uint64_t,std::string> &m)
  221. {
  222. for(const auto s:m)
  223. for(const auto x:m_cf)
  224. x->erase(s.first,m_cardList);
  225. }
  226. void CarManager::read_config()
  227. {
  228. IniFile ini;
  229. if(ini.open(FILEPATH_SERVER_CONFIG)){
  230. ConfStruct::getCs().TimeAlarm_Remote = atof(ini.read(CONF_SECT_SERVER_SETTING,"TimeAlarm_Remote").c_str());
  231. ConfStruct::getCs().TimeAlarm_Closer = atof(ini.read(CONF_SECT_SERVER_SETTING,"TimeAlarm_Closer").c_str());
  232. ConfStruct::getCs().TimeWin = atoi(ini.read(CONF_SECT_SERVER_SETTING,"TimeWin").c_str());
  233. ConfStruct::getCs().MaxScope = atoi(ini.read(CONF_SECT_SERVER_SETTING,"MaxScope").c_str());
  234. ConfStruct::getCs().limit_sec= atoi(ini.read(CONF_SECT_SERVER_SETTING,"LimitSec").c_str());
  235. ConfStruct::getCs().max_scope_bigCar = atof(ini.read(CONF_SECT_SERVER_SETTING,"MaxScopeBigCar").c_str());
  236. ConfStruct::getCs().mid_car_length_goroup= atof(ini.read(CONF_SECT_SERVER_SETTING,"midCarLengthGroup").c_str());
  237. ConfStruct::getCs().check_count = atoi(ini.read(CONF_SECT_SERVER_SETTING,"CheckCount").c_str());
  238. ConfStruct::getCs().response_alarm_time = atoi(ini.read(CONF_SECT_SERVER_SETTING,"ResponseAlarmTime").c_str());
  239. m_reddis = atof(ini.read(CONF_TRAFFIC_LIGHT,CONF_RED_DISTANCE).c_str());
  240. }
  241. ConfStruct::getCs().closer_slot = (int)(ConfStruct::getCs().TimeAlarm_Closer*60/ConfStruct::getCs().TimeWin + 1);
  242. ConfStruct::getCs().remote_slot = (int)(ConfStruct::getCs().TimeAlarm_Remote*60/ConfStruct::getCs().TimeWin + 1);
  243. ConfStruct::getCs().split_win_minsec = ConfStruct::getCs().TimeWin*60*1000;
  244. }
  245. void CarManager::initRule()
  246. {
  247. for(auto x:m_Map)
  248. for(auto &pT:m_dr)
  249. pT->put(x.second);
  250. for(auto & pT:m_dr)
  251. {
  252. pT->handleRule();
  253. //debug_print_syslog(0,"initRule:%s",pT->showInfo().c_str());
  254. }
  255. }
  256. void CarManager::showInfo()
  257. {
  258. for(const auto x : m_Map)
  259. debug_print_syslog(0,"TrafficGroup:%s",x.second->showinfo().c_str());
  260. }
  261. void CarManager::put(std::shared_ptr<TrafficLightGroup> t,int gid)
  262. {
  263. m_Map.insert(std::make_pair(gid,t));
  264. }
  265. void CarManager::handleRule(std::shared_ptr<card_interface> c)
  266. {
  267. m_dr[1]->handleRule(c);
  268. }
  269. bool CarManager::resetTrafficGroup()
  270. {
  271. for(auto it_group : m_Map){
  272. /*if(!it_group.second->get_status()){
  273. continue;
  274. }*/
  275. if(it_group.second->m_sCardId.empty())
  276. {
  277. continue;
  278. }
  279. std::string card_id = "";
  280. card_id = it_group.second->m_sCardId;
  281. auto card_ptr = m_dr[1]->getCard(card_id);
  282. if(!card_ptr){
  283. //debug_print_syslog(0,"lamp light : resetTrafficGroup card_id: %s, gid: %d",card_id.c_str(),it_group.second->m_gId);
  284. continue;
  285. }
  286. std::time_t t = time(NULL);
  287. //debug_print_syslog(0,"lamp light : status: %d ,now: %llu, last: %llu,",it_group.second->get_status(),t,card_ptr->get_last_recv_time());
  288. if(t-card_ptr->get_last_recv_time()>= 10)
  289. {
  290. debug_print_syslog(0,"lamp light : resetTrafficGroup card_id: %s,gid: %d status: %d ,now: %llu, last: %llu,",card_id.c_str(),it_group.second->m_gId,it_group.second->get_status(),t,card_ptr->get_last_recv_time());
  291. it_group.second->resetGroup();
  292. it_group.second->releaseTurn();
  293. std::vector<std::shared_ptr<TrafficLightGroup>> vt;
  294. vt.push_back(it_group.second);
  295. getSendLightInfo(std::move(vt));
  296. }
  297. }
  298. return true;
  299. }
  300. std::shared_ptr<RunRedLight> CarManager::check_run_red_light(std::shared_ptr<card_interface> c)
  301. {
  302. return m_dr[1]->check_run_red_light(c,m_reddis);
  303. }
  304. void CarManager::setManual(int gid,int lid,std::string name,int state)
  305. {
  306. std::vector<std::shared_ptr<TrafficLightGroup>> vt;
  307. if(auto p = m_Map[gid])
  308. {
  309. p->setManualControl(name,lid,(op::LIGHT_COLOUR)state);
  310. vt.push_back(p);
  311. getSendLightInfo(std::move(vt));
  312. }
  313. }
  314. void CarManager::cancelManual(int gid)
  315. {
  316. std::vector<std::shared_ptr<TrafficLightGroup>> vt;
  317. if(auto p = m_Map[gid])
  318. {
  319. p->getTurn();
  320. p->resetGroup();
  321. p->releaseTurn();
  322. vt.push_back(p);
  323. getSendLightInfo(std::move(vt));
  324. }
  325. }
  326. void CarManager::getSendLightInfo(std::vector<std::shared_ptr<TrafficLightGroup>> && p,std::string s)
  327. {
  328. for (const auto x : p)
  329. {
  330. debug_print_syslog(0,"[getSendLight]%s,%s",s.c_str(),x->showinfo().c_str());
  331. m_queue.tryPut(x);
  332. }
  333. }
  334. void CarManager::push_back(std::shared_ptr<card_interface> &ci)
  335. {
  336. m_ma->pushback(ci);
  337. }
  338. int NAMESPACE_POINT::CarManager::getTrafficGroupId(const uint32_t& light_id)
  339. {
  340. bool bFind = false;
  341. int group_id = -1;
  342. for (auto it_group : m_Map)
  343. {
  344. for (auto it_light : it_group.second->m_pTrafficLight)
  345. {
  346. if (it_light->m_physics_light_id == light_id)
  347. {
  348. bFind = true;
  349. break;
  350. }
  351. }
  352. if (bFind)
  353. {
  354. group_id = it_group.first;
  355. }
  356. }
  357. return group_id;
  358. }
  359. /*
  360. * 根据物理灯号获得所对应的所有红绿灯编号
  361. *
  362. * param
  363. * phy_light_id 物理灯号
  364. *
  365. * return
  366. * 指定物理灯号对应的所有红绿灯编号
  367. *
  368. */
  369. std::vector<uint32_t> NAMESPACE_POINT::CarManager::getPhysicsTrafficLightId(const uint32_t& phy_light_id)
  370. {
  371. std::vector<uint32_t> ret;
  372. ret.resize(0);
  373. for (auto it_group : m_Map)
  374. {
  375. for (auto it_light : it_group.second->m_pTrafficLight)
  376. {
  377. if (it_light->m_physics_light_id == phy_light_id)
  378. {
  379. ret.push_back(it_light->getid());
  380. }
  381. }
  382. }
  383. return std::move(ret);
  384. }
  385. /*
  386. * 获得红绿灯对象
  387. *
  388. * param
  389. * light_id 红绿灯id
  390. *
  391. * return
  392. * 红绿灯对象
  393. *
  394. */
  395. std::shared_ptr<NAMESPACE_POINT::TrafficLight> NAMESPACE_POINT::CarManager::getTrafficLight(const uint32_t& light_id)
  396. {
  397. std::shared_ptr<NAMESPACE_POINT::TrafficLight> pTrafficLight = nullptr;
  398. for (auto it : m_Map)
  399. {
  400. if(nullptr != it.second->get(light_id)){
  401. pTrafficLight = it.second->get(light_id);
  402. }
  403. }
  404. return pTrafficLight;
  405. }
  406. void CarManager::determineCard(std::shared_ptr<card_interface> & ci)
  407. {
  408. m_ma->determine(ci);
  409. }
  410. void CarManager::deal_alarm_card(std::shared_ptr<card_interface> & ci,bool flag)
  411. {
  412. m_owner->deal_alarm_card_motionless(ci,flag);
  413. }
  414. void CarManager::erase(std::shared_ptr<card_interface> &ci)
  415. {
  416. m_ma->erase(ci);
  417. }
  418. MotionlessAlarm::MotionlessAlarm(CarManager *cm)
  419. :m_owner(cm)
  420. ,m_bExit(false)
  421. ,m_pTh(NULL)
  422. {
  423. m_pTh = new std::thread(&MotionlessAlarm::run,this);
  424. }
  425. MotionlessAlarm::~MotionlessAlarm()
  426. {
  427. m_bExit = true;
  428. if (m_pTh != NULL)
  429. {
  430. m_pTh->join();
  431. delete m_pTh;
  432. }
  433. }
  434. void MotionlessAlarm::run()
  435. {
  436. while (!m_bExit)
  437. {
  438. std::this_thread::sleep_for(std::chrono::milliseconds(500));
  439. std::lock_guard<std::mutex> lck(m_mtx);
  440. for(auto &c :m_cardlist)
  441. {
  442. uint64_t t = time(NULL)*1000;
  443. uint64_t tt = c->CtTime();
  444. uint64_t ttt=t>tt?t-tt:tt-t;
  445. if (ttt > ConfStruct::getCs().response_alarm_time*1000 && isMotionless(c))
  446. {
  447. if (!c->_isMotionless)
  448. {
  449. debug_print_syslog(0,"[motionless]Alarm True:%s,%lld,%lld,%lld,%d,%s",c->cardId().c_str(),t,tt,ttt,c->getCount(),c->_isMotionless?"true":"false");
  450. //alarm
  451. m_owner->deal_alarm_card(c,true);
  452. }
  453. }
  454. else
  455. {
  456. if (c->_isMotionless)
  457. {
  458. debug_print_syslog(0,"[motionless]Alarm False:%s,%lld,%lld,%lld,%d,%s",c->cardId().c_str(),t,tt,ttt,c->getCount(),c->_isMotionless?"true":"false");
  459. //cancel alarm
  460. m_owner->deal_alarm_card(c,false);
  461. }
  462. }
  463. }
  464. }
  465. }
  466. bool MotionlessAlarm::find(std::shared_ptr<card_interface> &ci)
  467. {
  468. if(std::find(m_cardlist.begin(),m_cardlist.end(),ci) != std::end(m_cardlist))
  469. return true;
  470. else
  471. return false;
  472. }
  473. void MotionlessAlarm::determine(std::shared_ptr<card_interface> &ci)
  474. {
  475. //add index.
  476. ci->motionlessFlag();
  477. //
  478. if (isMotionless(ci))
  479. {
  480. if(!find(ci))
  481. {
  482. debug_print_syslog(0,"[motionless]cardId:%s,%d",ci->cardId().c_str(),ci->getCount());
  483. std::lock_guard<std::mutex> lck(m_mtx);
  484. m_cardlist.push_back(ci);
  485. }
  486. }
  487. }
  488. bool MotionlessAlarm::isMotionless(std::shared_ptr<card_interface> &ci)
  489. {
  490. if(ci->getCount() > ConfStruct::getCs().check_count)
  491. return true;
  492. else
  493. return false;
  494. }
  495. void MotionlessAlarm::erase(std::shared_ptr<card_interface> &ci)
  496. {
  497. if (find(ci))
  498. {
  499. debug_print_syslog(0,"[motionless]erase:%s",ci->cardId().c_str());
  500. std::lock_guard<std::mutex> lck(m_mtx);
  501. m_cardlist.remove(ci);
  502. }
  503. }
  504. void MotionlessAlarm::pushback(std::shared_ptr<card_interface> &ci)
  505. {
  506. m_cardlist.push_back(ci);
  507. }
  508. NAMESPACE_POINT_END(NAMESPACE_POINT)