trafficLight.cpp 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060
  1. #include "stdafx.h"
  2. #include "trafficLight.h"
  3. #include "carManager.h"
  4. #include "ProcessRemodule.h"
  5. // #include "INIFILE.h"
  6. // #include "def.h"
  7. //路口红绿灯
  8. //大巷红绿灯
  9. NAMESPACE_POINT_BEGIN(NAMESPACE_POINT)
  10. //路口规则
  11. //小车避让大车规则
  12. //代理模式
  13. //装饰器模式
  14. //抽象工厂模式
  15. //x->大 speed 正
  16. //x->恒
  17. // y->大 speed 正
  18. // y->小 speed 负
  19. //x->小 speed 负
  20. //这里的初始化红绿灯组vector初始化,因数据库配置和实际情况进行初始化,不能保证通用,需要在不同的情形下特殊处理
  21. //这里是根据区域划分红绿灯,然后根据红绿灯位置按照(上行或者下行)进行排序
  22. //这里初始化根据,每一条巷道为一组,遇到拐点,则是新的巷道。因为,拐点必有红绿灯。
  23. //需要考虑到T字口和十字口中有车辆过来,但非是指定区域即辅运大巷
  24. std::vector<std::string> Rule::find_near(int x,int y,int dist,const std::string & card_no)
  25. {
  26. std::vector<std::string> v;
  27. if(auto pt = m_owner.lock())
  28. v = pt->find_near(x,y,dist,card_no);
  29. return std::move(v);
  30. }
  31. std::shared_ptr<card_interface> Rule::getCard(const std::string &card_no)
  32. {
  33. //return m_[card_no];
  34. std::shared_ptr<card_interface> c = nullptr;
  35. if(auto pt = m_owner.lock())
  36. c = pt->getCard(card_no);
  37. return c;
  38. }
  39. //谁先到达路口红绿灯指定的距离,which side turn green.then else turn red..
  40. //
  41. bool CrossingRule::getBigCarFlag(const std::string &card_no)
  42. {
  43. bool flag=false;
  44. auto cardPtr = getCard(card_no);
  45. if(cardPtr!=nullptr)
  46. flag = cardPtr->getBigCarFlag();
  47. return flag?false:true;
  48. }
  49. //here should another thread to handle it .
  50. bool CrossingRule::handleManualControl(std::shared_ptr<TrafficLightGroup> pt)
  51. {
  52. if(pt->timeout())
  53. {
  54. pt->resetGroup();
  55. return true;
  56. }
  57. return false;
  58. }
  59. bool CrossingRule::findNearLight(const std::string & card_no,std::shared_ptr<TrafficLightGroup> tlg_ptr,bool a )
  60. {
  61. bool flag = false;
  62. auto cardPtr = getCard(card_no);
  63. double distance = 0.0;
  64. if(cardPtr!=nullptr)
  65. {
  66. bool special = false;
  67. line l;
  68. double distDirect = 0;
  69. double x=cardPtr->getX();
  70. double y=cardPtr->getY();
  71. double v=cardPtr->getv();
  72. auto lightinfo = findNearLightInfo(x,y,tlg_ptr);
  73. special = std::get<0>(lightinfo);
  74. l = std::get<1>(lightinfo);
  75. distDirect = std::get<2>(lightinfo);
  76. distance = l.dist(op::point(x,y));
  77. //debug_print_syslog(0,"findNearLight.x:%0.3f,y:%0.3f,v:%0.3f,dist:%0.3f,",x,y,v,distDirect);
  78. if (!a)
  79. {
  80. if(special)
  81. {
  82. //判断是否在线上
  83. if(l.contain(x,y,0.5))
  84. {
  85. //判断行车方向
  86. double c = v*distDirect;
  87. if(c<0)
  88. flag = true;
  89. }
  90. }
  91. }
  92. else
  93. {
  94. if((tlg_ptr->m_gId == 2 || tlg_ptr->m_gId == 4)||tlg_ptr->m_gId == 11)
  95. {
  96. flag = true;
  97. }else if(tlg_ptr->m_gId == 8 ||tlg_ptr->m_gId == 18||tlg_ptr->m_gId == 20)
  98. {
  99. flag = true;
  100. }
  101. else if(l.contain(x,y,1.0))
  102. {
  103. double c = v*distDirect;
  104. if(c<0)
  105. flag = true;
  106. }else{
  107. debug_print_syslog(0,"lamp light: findNearLight: gid: %d,card_id: %s, distance: %.3f",tlg_ptr->m_gId,card_no.c_str(),l.dist(op::point(x,y)));
  108. }
  109. //判断是否在线上
  110. //if(l.contain(x,y,1.0))
  111. //{
  112. // double c = v*distDirect;
  113. // //debug_print_syslog(0,"findNearLight:%0.3f,%s",c,c<0?"TRUE":"FALSE");
  114. // if(c<0)
  115. // flag = true;
  116. //}
  117. }
  118. debug_print_syslog(0,"lamp light :findNearLight flag: %s gid: %d,card_id: %s,distance: %.3f,a: %d, special: %d",flag?"TRUE":"FALSE",tlg_ptr->m_gId,card_no.c_str(),distance,a,special);
  119. }else{
  120. debug_print_syslog(0,"lamp light :findNearLight gid: %d,card_id: %s ",tlg_ptr->m_gId,card_no.c_str());
  121. }
  122. return flag?false:true;
  123. }
  124. bool CrossingRule::handleSpecialAvondance(std::shared_ptr<TrafficLightGroup> pt)
  125. {
  126. //查看是否是大车
  127. //true标识特殊红绿灯,需要检测大车避让规则
  128. bool flag = false;
  129. do{
  130. auto vt = find_near(static_cast<int>(pt->x),static_cast<int>(pt->y),(int)(ConfStruct::getCs().max_scope_bigCar),itostr(pt->m_gId));
  131. //筛选大车
  132. if(vt.empty()) {
  133. flag = true;break;
  134. }
  135. vt.erase(std::remove_if(vt.begin(),vt.end(),[&](const std::string &card_no){
  136. return getBigCarFlag(card_no);
  137. }),vt.end());
  138. if(vt.empty()) {
  139. flag = true;
  140. break;
  141. }
  142. vt.erase(std::remove_if(vt.begin(),vt.end(),[](const std::string &name){
  143. if(0 == name.compare(0,3,"002"))
  144. return false;
  145. else
  146. return true;}),vt.end());
  147. if(vt.empty()) {
  148. flag = true;
  149. break;
  150. }
  151. //查看离最近的点是否为特殊点,判断位置是否在直线上,判断方向
  152. vt.erase(std::remove_if(vt.begin(),vt.end(),[&](const std::string &card_no){
  153. return findNearLight(card_no,pt);
  154. }),vt.end());
  155. if(vt.empty()) {
  156. flag = true;
  157. break;
  158. }
  159. //特殊规则保留id且优先级2,避让规则置空id,优先级2
  160. if(pt->noCar())
  161. {
  162. if(pt->load()== PRI_AVOIDANCE)
  163. break;
  164. }
  165. else
  166. {
  167. if(pt->load()== PRI_AVOIDANCE)
  168. {
  169. auto it = std::find(vt.begin(),vt.end(),pt->getId());
  170. if(it != vt.end())
  171. break;
  172. }
  173. }
  174. //排序,找到离之最近的大车
  175. std::sort(vt.begin(),vt.end(),[&](const std::string &card_no,const std::string & card){return sortCar(card_no,card,pt);});
  176. changeCarState(vt[0],pt);
  177. pt->setCrossing(vt[0],PRI_AVOIDANCE);
  178. //here return directly
  179. return true;
  180. }while(false);
  181. if(flag)
  182. {
  183. //找不到之前的车辆。则初始化
  184. if(pt->load() == PRI_AVOIDANCE && !pt->noCar())
  185. pt->resetGroup();
  186. else
  187. flag = false;
  188. }
  189. return flag;
  190. }
  191. bool CrossingRule::handleCrossing(std::shared_ptr<TrafficLightGroup> pt)
  192. {
  193. bool flag = false;
  194. int exit_flag = -1;
  195. //查找一定范围的车辆
  196. do{
  197. auto vt = find_near(static_cast<int>(pt->x),static_cast<int>(pt->y),pt->scope(),itostr(pt->m_gId));
  198. if(!vt.empty())
  199. {
  200. //std::cout <<""<<std::endl;
  201. debug_print_syslog(0,"lamp light: CrossingRule::handleCrossing gid: %d,scope: %.3f",pt->m_gId,pt->m_scope);
  202. }
  203. vt.erase(std::remove_if(vt.begin(),vt.end(),[&](const std::string &name)->bool{
  204. bool a = false;
  205. debug_print_syslog(0,"lamp light: CrossingRule::handleCrossing card_id: %s, gid: %d,line: %d",name.c_str(),pt->m_gId,__LINE__);
  206. if(0 == name.compare(0,3,"002"))
  207. a = findNearLight(name,pt,true);
  208. else
  209. a = true;
  210. return a;
  211. }),vt.end());
  212. //如果为空表示没找到车
  213. if(vt.empty())
  214. {
  215. if(!pt->noCar()&& pt->load() == PRI_CROSSING)
  216. {
  217. //释放红绿灯组
  218. pt->resetGroup();
  219. flag = true;
  220. }
  221. exit_flag = 1;
  222. break;
  223. }
  224. //是否已经有车记录
  225. if(!pt->noCar())
  226. {
  227. auto it = std::find(vt.begin(),vt.end(),pt->getId());
  228. if(it!=vt.end()){
  229. exit_flag = 2;
  230. break;
  231. }
  232. }
  233. std::sort(vt.begin(),vt.end(),[&](const std::string &card_no,const std::string & card){
  234. return sortCar(card_no,card,pt);
  235. });
  236. //设置优先级以及卡id
  237. pt->setCrossing(vt[0],PRI_CROSSING);
  238. //修改红绿灯组状态
  239. changeCarState(vt[0],pt);
  240. flag = true;
  241. }while(false);
  242. if (exit_flag!=-1)
  243. {
  244. debug_print_syslog(0,"lamp light: gid: %d, exit_flag : %d",pt->m_gId,exit_flag);
  245. }
  246. return flag;
  247. }
  248. std::vector<std::shared_ptr<TrafficLightGroup>> CrossingRule::handleRule(std::shared_ptr<card_interface> c/*=nullptr*/)
  249. {
  250. debug_print_syslog(0,"lamp light:CrossingRule::handleRule size: %d, line: %d",m_CTrafficLightGroupMap.size(),__LINE__);
  251. std::vector<std::shared_ptr<TrafficLightGroup>> plist;
  252. for(auto &pt : m_CTrafficLightGroupMap)
  253. {
  254. pt->getTurn();//获取控制权
  255. int priority = pt->load();
  256. //debug_print_syslog(0,"lamp light: priority: %d",priority);
  257. bool flag = false;
  258. do{
  259. if(priority == PRI_MANUALCONTROL)
  260. {
  261. flag = handleManualControl(pt) ;
  262. if(flag)
  263. break;
  264. }
  265. if(pt->load() <= PRI_AVOIDANCE && pt->getflag())
  266. {
  267. flag = handleSpecialAvondance(pt);
  268. if(flag)
  269. break;
  270. }
  271. if(pt->load()<=PRI_CROSSING)
  272. {
  273. flag = handleCrossing(pt);
  274. if(flag)
  275. {
  276. break;
  277. }
  278. }
  279. }while(false);
  280. pt->releaseTurn();//释放控制权。
  281. if(flag)
  282. {
  283. plist.push_back(pt);
  284. }
  285. }
  286. //for(const auto & g : plist)
  287. // std::cout <<"CCCCCCCCCCCCCCCCCCCCCCCC"<< g->showinfo()<<std::endl;
  288. return std::move(plist);
  289. }
  290. void CrossingRule::changeCarState(std::string & card_no,std::shared_ptr<TrafficLightGroup> tlg_ptr)
  291. {
  292. int lightId = 0;
  293. auto cardPtr = getCard(card_no);
  294. if(cardPtr!=nullptr)
  295. {
  296. double x=cardPtr->getX();
  297. double y=cardPtr->getY();
  298. auto lightinfo = findNearLightInfo(x,y,tlg_ptr);
  299. std::time_t t = time(NULL);
  300. if(t-cardPtr->get_last_recv_time()>= 10)
  301. {
  302. return;
  303. }
  304. lightId = std::get<3>(lightinfo);
  305. if(tlg_ptr->m_sCardId.empty())
  306. {
  307. tlg_ptr->m_sCardId = card_no;
  308. }
  309. debug_print_syslog(0,"lamp light: changeCarState card: %s, light id: %d",card_no.c_str(),lightId);
  310. tlg_ptr->setLight(lightId,GREEN,RED);
  311. /*double x=cardPtr->getX();
  312. double y=cardPtr->getY();
  313. auto lightinfo = findNearLightInfo(x,y,tlg_ptr);
  314. lightId = std::get<3>(lightinfo);
  315. debug_print_syslog(0,"red green: changeCarState card: %s, light id: %d",card_no.c_str(),lightId);
  316. tlg_ptr->setLight(lightId,GREEN,RED);*/
  317. }
  318. }
  319. std::vector<std::shared_ptr<TrafficLightGroup>> AvoidanceRule::handleRule(std::shared_ptr<card_interface> c/*=nullptr*/)
  320. {
  321. debug_print_syslog(0,"lamp light: AvoidanceRule::handleRule size: %d, line: %d",m_CTrafficLightGroupMap.size(),__LINE__);
  322. int aid = c->getAreaId();
  323. double x = c->getX();
  324. double y = c->getY();
  325. double v = c->getv();
  326. auto it = m_CTrafficLightGroupMap.find(aid);
  327. std::vector<std::shared_ptr<TrafficLightGroup>> vt;
  328. if(it != m_CTrafficLightGroupMap.end())
  329. {
  330. //根据车卡的定位坐标以及定位区域信息获取红绿灯组
  331. auto a = findGroup(x,y,aid,v,c);
  332. debug_print_syslog(0, "lamp light: card: %s, x:%.4f, y:%.4f, led group size: %d, c size: %d",c->cardId().c_str(),x,y,a.size(),c->size());
  333. if(a.size()==0) // 所在区域没有可以控制的红绿灯组
  334. {
  335. if(c->size()==1) // 当前车辆控制的路口为1个,释放该路口控制
  336. {
  337. debug_print_syslog(0, "red green: a is 0, c is 1");
  338. eraseTrafficLightGroup(true,c,vt);
  339. }
  340. else if(c->size()==2) // 当前车辆控制的路口为两个,释放这两个路口的控制
  341. {
  342. debug_print_syslog(0, "red green: a is 0, c is 2");
  343. eraseTwoGroup(c,vt);
  344. }
  345. }
  346. else if(a.size()==1) // 所在区域存在一个红绿灯组
  347. {
  348. if(c->size()==0) // 当前卡没有绑定红绿灯组,绑定此灯组,并设置灯组颜色为绿色?
  349. {
  350. debug_print_syslog(0, "red green: a is 1, c is 0");
  351. add_one(a[0],c,vt,GREEN,RED);
  352. }
  353. else if(c->size()==1) // 当前卡绑定了一个红绿灯组
  354. {
  355. if(c->front() != a[0]) // 当前卡绑定的红绿灯组与a不是同一个,不是,释放之前的绑定,再绑定灯组a
  356. {
  357. debug_print_syslog(0, "red green: a is 1, c is 1 c != a");
  358. eraseTrafficLightGroup(true,c,vt);
  359. add_one(a[0],c,vt,GREEN,RED);
  360. }
  361. else // 当前卡绑定的红绿灯组与a是同一个
  362. {
  363. debug_print_syslog(0, "red green: a is 1, c is 1 c == a");
  364. auto i = findNearLightInfo(x,y,a[0]);
  365. int ld = std::get<3>(i);
  366. debug_print_syslog(0, "red green: a is 1, c is 1 c == a old id: %d, new id: %d",a[0]->m_nLightId, ld);
  367. if(ld != a[0]->m_nLightId) // 灯组中离车最近的灯ID已经不是原来绑定路口的灯ID了,说明正在经过路口,需释放控制
  368. {
  369. eraseTrafficLightGroup(true,c,vt);
  370. }
  371. //if (Diff(a[0],point(x,y),GREEN,RED))
  372. //vt.push_back(a[0]);
  373. //else // 车辆位置超过路口灯组位置,释放灯组
  374. //eraseTrafficLightGroup(true,c,vt);
  375. }
  376. }
  377. else if(c->size()==2) // 当前卡绑定了两个红绿灯组
  378. {
  379. auto pt = a[0];
  380. if(c->front() == pt)
  381. {
  382. eraseTrafficLightGroup(false,c,vt);
  383. if(pt->load()<=2)
  384. {
  385. changeGroup(pt,point(x,y),GREEN,RED);
  386. vt.push_back(pt);
  387. }
  388. }
  389. else if(c->back() == pt)
  390. {
  391. eraseTrafficLightGroup(true,c,vt);
  392. if(pt->load()<=2)
  393. {
  394. changeGroup(pt,point(x,y),GREEN,RED);
  395. vt.push_back(pt);
  396. }
  397. }
  398. else
  399. {
  400. eraseTwoGroup(c,vt);
  401. add_one(pt,c,vt,GREEN,RED);
  402. }
  403. }
  404. }
  405. else if(a.size()==2) // 所在区域存在两个红绿灯组,巷道相遇逻辑
  406. {
  407. bool b = getMidCar(c,a[0],a[1]); // 判断两个灯组中是否有车
  408. LIGHT_COLOUR la,lb;
  409. if(b)
  410. {
  411. la = RED;
  412. lb = SPARK;
  413. }
  414. else
  415. {
  416. la = GREEN;
  417. lb = RED;
  418. }
  419. if(c->size()==0)
  420. {
  421. add_one(a[0],c,vt,la,lb);
  422. add_one(a[1],c,vt,GREEN,SPARK);
  423. }
  424. else if(c->size()==1)
  425. {
  426. if(c->front() == a[0])
  427. {
  428. if(a[0]->load()<=2)
  429. {
  430. changeGroup(a[0],point(x,y),la,lb);
  431. vt.push_back(a[0]);
  432. }
  433. add_one(a[1],c,vt,GREEN,SPARK);
  434. }
  435. else if(c->front() == a[1])
  436. {
  437. if(a[1]->load()<=2)
  438. {
  439. changeGroup(a[1],point(x,y),GREEN,SPARK);
  440. vt.push_back(a[1]);
  441. }
  442. c->push_front(a[0]);
  443. if(a[0]->load()<2)
  444. {
  445. changeGroup(a[0],point(x,y),la,lb);
  446. vt.push_back(a[0]);
  447. }
  448. }
  449. else
  450. {
  451. eraseTrafficLightGroup(false,c,vt);
  452. add_one(a[0],c,vt,la,lb);
  453. add_one(a[1],c,vt,GREEN,SPARK);
  454. }
  455. }
  456. else if(c->size()==2)
  457. {
  458. bool b1 = c->find(a[0]);
  459. bool b2 = c->find(a[1]);
  460. if(b1)
  461. {
  462. if(b2)
  463. {
  464. if(c->front() == a[0])
  465. {
  466. if (Diff(a[0],point(x,y),la,lb))
  467. vt.push_back(a[0]);
  468. if (Diff(a[1],point(x,y),GREEN,SPARK))
  469. vt.push_back(a[1]);
  470. }
  471. else
  472. {
  473. c->clear();
  474. if(a[0]->load()<=2)
  475. {
  476. changeGroup(a[0],point(x,y),la,lb);
  477. vt.push_back(a[0]);
  478. }
  479. if(a[1]->load()<=2)
  480. {
  481. changeGroup(a[1],point(x,y),GREEN,SPARK);
  482. vt.push_back(a[1]);
  483. }
  484. c->push_back(a[0]);
  485. c->push_back(a[1]);
  486. }
  487. }
  488. else
  489. {
  490. if(c->front() == a[0])
  491. {
  492. eraseTrafficLightGroup(false,c,vt);
  493. add_one(a[1],c,vt,GREEN,SPARK);
  494. }
  495. else
  496. {
  497. eraseTrafficLightGroup(true,c,vt);
  498. if(a[0]->load()<=2)
  499. {
  500. changeGroup(a[0],point(x,y),la,lb);
  501. vt.push_back(a[0]);
  502. }
  503. add_one(a[1],c,vt,GREEN,SPARK);
  504. }
  505. }
  506. }
  507. else
  508. {
  509. if(b2)
  510. {
  511. if(c->front() == a[1])
  512. {
  513. eraseTrafficLightGroup(false,c,vt);
  514. }
  515. else
  516. {
  517. eraseTrafficLightGroup(true,c,vt);
  518. }
  519. if(a[1]->load()<=2)
  520. {
  521. changeGroup(a[1],point(x,y),GREEN,SPARK);
  522. vt.push_back(a[1]);
  523. }
  524. c->push_front(a[0]);
  525. if(a[0]->load()<2)
  526. {
  527. changeGroup(a[0],point(x,y),la,lb);
  528. vt.push_back(a[0]);
  529. }
  530. }
  531. else
  532. {
  533. eraseTwoGroup(c,vt);
  534. add_one(a[0],c,vt,la,lb);
  535. add_one(a[1],c,vt,GREEN,SPARK);
  536. }
  537. }
  538. }
  539. }
  540. }
  541. return std::move(vt);
  542. }
  543. std::shared_ptr<RunRedLight> AvoidanceRule::check_run_red_light(std::shared_ptr<card_interface> c,double reddis)
  544. {
  545. int aid = c->getAreaId();
  546. double x = c->getX();
  547. double y = c->getY();
  548. double vv = c->getv();
  549. bool bealarm = false;
  550. int LightId =0;
  551. int32_t groupid=0;
  552. auto it = m_CTrafficLightGroupMap.find(aid);
  553. if(it != m_CTrafficLightGroupMap.end())
  554. {
  555. double d= 0;
  556. double dis = 0;
  557. auto v = it->second;
  558. for(std::size_t i = 0;i<v.size();i++)
  559. {
  560. //如果此灯组被控制了,而且不是自己控制
  561. if ((v[i]->get_status()&&v[i]->m_sCardId != c->cardId())||(!v[i]->noCar()&&v[i]->getId() != c->cardId()))
  562. {
  563. LightId =-1;
  564. if (v[i]->get_status())
  565. {
  566. LightId = v[i]->m_nLightId;
  567. }
  568. else
  569. {
  570. for(auto & px :v[i]->m_pTrafficLight)
  571. {
  572. if (px->getState()==GREEN)
  573. {
  574. LightId = px->getid();
  575. }
  576. }
  577. }
  578. if (LightId ==-1)
  579. {
  580. continue;
  581. }
  582. d = v[i]->dist_direct(x,y); // 求灯组到车辆的距离(车辆在灯组的左下方,则距离值取反)
  583. std::shared_ptr<TrafficLight> & light = v[i]->get (LightId);
  584. if (light)
  585. {
  586. if(d<=0) // 车辆在灯组左边或下边
  587. {
  588. if(vv>0) // 速度方向与前进方向一致
  589. {
  590. double dis = light->dist(x,y);
  591. if (dis < reddis)
  592. {
  593. bealarm = true;
  594. groupid = v[i]->m_gId;
  595. break;
  596. }
  597. }
  598. }
  599. else
  600. {
  601. if(vv<0)
  602. {
  603. dis = light->dist(x,y);
  604. if (dis < reddis)
  605. {
  606. groupid = v[i]->m_gId;
  607. bealarm = true;
  608. break;
  609. }
  610. }
  611. }
  612. }
  613. }
  614. }
  615. if (bealarm)
  616. {
  617. //闯红灯
  618. std::shared_ptr<RunRedLight> redalarm = std::make_shared<RunRedLight>();
  619. redalarm->m_group_id = groupid;
  620. redalarm->m_light_id = LightId;
  621. //车辆id,
  622. redalarm->m_vehicle_id=0;
  623. //区域id,
  624. redalarm->m_area_id=aid;
  625. //闯红灯时间
  626. time_t tCurTime;
  627. tCurTime = time(NULL);
  628. redalarm->m_time=CFunctions::time_t2string(tCurTime);
  629. return redalarm;
  630. }
  631. }
  632. return nullptr;
  633. }
  634. // 给车卡c绑定路口灯组控制,并更改灯组中灯的颜色状态
  635. void AvoidanceRule::add_one(std::shared_ptr<TrafficLightGroup> & pt,std::shared_ptr<card_interface> &c,std::vector<std::shared_ptr<TrafficLightGroup>> &vt,LIGHT_COLOUR lc,LIGHT_COLOUR lc_)
  636. {
  637. double x = c->getX();
  638. double y = c->getY();
  639. c->push_back(pt);
  640. if(pt->load()<2) // 红绿灯组优先级取初始值0或路口控制1
  641. {
  642. changeGroup(pt,point(x,y),lc,lc_);
  643. vt.push_back(pt);
  644. }
  645. auto i = findNearLightInfo(x,y,pt);
  646. int ld = std::get<3>(i);
  647. pt->m_nLightId = ld;
  648. pt->m_sCardId = c->cardId(); // 绑定此灯组的卡号
  649. debug_print_syslog(0, "lamp light: add_one light group : %d, light id: %d card: %s", pt->m_gId, pt->m_nLightId, pt->m_sCardId.c_str());
  650. pt->set_status(true);
  651. }
  652. bool AvoidanceRule::Diff(std::shared_ptr<TrafficLightGroup> &p,point pt,LIGHT_COLOUR lc,LIGHT_COLOUR lc_)
  653. {
  654. bool b =false;
  655. auto i = findNearLightInfo(pt.x,pt.y,p);
  656. int ld = std::get<3>(i);
  657. //if(ld != p->m_nLightId) // 灯组中离车最近的灯ID已经不是原来绑定路口的灯ID了,说明正在经过路口,需释放控制
  658. //{
  659. //return false;
  660. //}
  661. if (p->Diff(ld,lc,lc_))
  662. b = true;
  663. return b;
  664. }
  665. // 改变点p定位附近灯组的状态,满足条件的灯状态改为lc,否在为lc_
  666. void AvoidanceRule::changeGroup(std::shared_ptr<TrafficLightGroup> &p,point pt,LIGHT_COLOUR lc,LIGHT_COLOUR lc_)
  667. {
  668. // 1. 在p中取离pt最近的灯组信息
  669. auto i = findNearLightInfo(pt.x,pt.y,p);
  670. // 2. 获取灯组中临近车辆的灯ID
  671. int ld = std::get<3>(i);
  672. p->m_nLightId = ld;
  673. p->getTurn();
  674. // 3. 设置灯组中ld号灯的颜色为lc,其他为lc_
  675. debug_print_syslog(0,"lamp light: changeGroup light id: %d, set lc: %d, lc_: %d",ld,lc, lc_);
  676. p->setAvoidance(ld,lc,lc_);
  677. p->releaseTurn();
  678. }
  679. void AvoidanceRule::eraseTwoGroup(std::shared_ptr<card_interface> &c,std::vector<std::shared_ptr<TrafficLightGroup>> &vt)
  680. {
  681. eraseTrafficLightGroup(true,c,vt);
  682. eraseTrafficLightGroup(false,c,vt);
  683. }
  684. void AvoidanceRule::eraseTrafficLightGroup(bool a,std::shared_ptr<card_interface> &c,std::vector<std::shared_ptr<TrafficLightGroup>> &vt)
  685. {
  686. std::shared_ptr<TrafficLightGroup> p = nullptr;
  687. bool flag = false;
  688. if(a)
  689. {
  690. p = c->front();
  691. c->pop_front();
  692. }
  693. else
  694. {
  695. p = c->back();
  696. c->pop_back();
  697. }
  698. p->getTurn();
  699. if(p->load()<=2)
  700. {
  701. debug_print_syslog(0, "lamp light: eraseTrafficLightGroup group id: %d, card: %s",p->m_gId, c->cardId().c_str());
  702. p->resetGroup();// 重置灯组
  703. flag = true;
  704. }
  705. p->releaseTurn();
  706. p->set_status(false);
  707. if(flag)
  708. vt.push_back(p);
  709. }
  710. // 根据车辆与灯组的位置关系,查找灯组
  711. std::vector<std::shared_ptr<TrafficLightGroup>> AvoidanceRule::findGroup(double x,double y,int areaid,double vv, std::shared_ptr<card_interface> c)
  712. {
  713. debug_print_syslog(0,"lamp light: AvoidanceRule::findGroup: x: %.3f,y: %.3f,areaid: %d,vv: %.3f,line: %d",x,y,areaid,vv,__LINE__);
  714. std::vector<std::shared_ptr<TrafficLightGroup>> arr;
  715. auto v = m_CTrafficLightGroupMap[areaid]; // 获取车辆所在地图区域内的所有红绿灯组
  716. double d= 0;
  717. for(std::size_t i = 0;i<v.size();i++)
  718. {
  719. //如果此灯组被控制了,则不允许使用
  720. if (v[i]->get_status()&&v[i]->m_sCardId != c->cardId())
  721. {
  722. debug_print_syslog(0, "red green: has control this light group");
  723. continue;
  724. }
  725. d = v[i]->dist_direct(x,y); // 求灯组到车辆的距离(车辆在灯组的左下方,则距离值取反)
  726. if(d<=0) // 车辆在灯组左边或下边
  727. {
  728. if(vv>0) // 速度方向与前进方向一致
  729. {
  730. if(v[i]->dist(x,y)<=ConfStruct::getCs().max_scope_bigCar ) // 车辆到灯组的距离小于100
  731. arr.push_back( v[i]);
  732. if(i+1<v.size()) //紧挨着的一个灯组到车辆距离小于100
  733. if(v[i+1]->dist(x,y)<=ConfStruct::getCs().max_scope_bigCar )
  734. arr.push_back(v[i+1]);
  735. }
  736. else if(vv<0) // 速度方向与前进方向不一致,判断运动方向的灯组是否在可控范围
  737. {
  738. if(i>=1 && v[i-1]->dist(x,y)<=ConfStruct::getCs().max_scope_bigCar)
  739. arr.push_back(v[i-1]);
  740. if(i>=2&& v[i-2]->dist(x,y)<=ConfStruct::getCs().max_scope_bigCar )
  741. arr.push_back(v[i-2]);
  742. }
  743. break;
  744. }
  745. }
  746. if(d>0) // 车辆在灯组右边或上边
  747. {
  748. if(vv<0)
  749. {
  750. std::size_t i = v.size();
  751. if(i>=1 && v[i-1]->dist(x,y)<=ConfStruct::getCs().max_scope_bigCar )
  752. arr.push_back(v[i-1]);
  753. if(i>=2&&v[i-2]->dist(x,y)<=ConfStruct::getCs().max_scope_bigCar )
  754. arr.push_back(v[i-2]);
  755. }
  756. }
  757. return std::move(arr);
  758. }
  759. bool AvoidanceRule::getMidCar(std::shared_ptr<card_interface> bigcar,std::shared_ptr<TrafficLightGroup> & one,std::shared_ptr<TrafficLightGroup> & two)
  760. {
  761. //get dist between tow groups
  762. double dist = one->dist(*two);
  763. //use geo_hash get intersection vector..
  764. auto vt_one = find_near(static_cast<int>(one->x),static_cast<int>(one->y),static_cast<int>(dist),itostr(one->m_gId));
  765. auto vt_two = find_near(static_cast<int>(two->x),static_cast<int>(two->y),static_cast<int>(dist),itostr(two->m_gId));
  766. vt_one.erase(std::remove_if(vt_one.begin(),vt_one.end(),[](const std::string &name){
  767. if(0 == name.compare(0,3,"002"))
  768. return false;
  769. else
  770. return true;}),vt_one.end());
  771. vt_two.erase(std::remove_if(vt_two.begin(),vt_two.end(),[](const std::string &name){
  772. if(0 == name.compare(0,3,"002"))
  773. return false;
  774. else
  775. return true;}),vt_two.end());
  776. std::sort(vt_one.begin(),vt_one.end());
  777. std::sort(vt_two.begin(),vt_two.end());
  778. std::vector<std::string> vt_intersection;
  779. do{
  780. std::set_intersection(vt_one.begin(),vt_one.end(),
  781. vt_two.begin(),vt_two.end(),std::back_inserter(vt_intersection));
  782. if(vt_intersection.empty()) break;
  783. //筛选出符合条件的车辆
  784. vt_intersection.erase(std::remove_if(vt_intersection.begin(),vt_intersection.end(),[&](const std::string &cardno)->bool{
  785. auto cardPtr = getCard(cardno);
  786. if(cardPtr == nullptr)
  787. return true;
  788. return findTwoLightGroupMidCar(one,two,bigcar,cardPtr);
  789. }),vt_intersection.end());
  790. //离第一个红绿灯距离进行排序
  791. }while(false);
  792. if(vt_intersection.empty())
  793. return false;
  794. else
  795. return true;
  796. }
  797. //后续小车避让大车规则,只需要找到前方的两个红绿灯,找到两个对比一下之前的记录,如果灯组改变了,则修改,如果没变,则判断是否有小车,进行改变
  798. //如果只找到一个红绿灯,查看是否含有记录,如果有,则不坐任何处理。
  799. bool AvoidanceRule::findTwoLightGroupMidCar(std::shared_ptr<TrafficLightGroup> one,std::shared_ptr<TrafficLightGroup>two,std::shared_ptr<card_interface> bigcar,std::shared_ptr<card_interface> car)
  800. {
  801. bool flag = true;
  802. double x = car->getX();
  803. double y = car->getY();
  804. double v = car->getv();
  805. double vv = bigcar->getv();
  806. double d = one->dist(x,y);
  807. line l(*one,*two);
  808. if(l.contain(x,y,1))
  809. {
  810. if(v*vv<0 && d > ConfStruct::getCs().mid_car_length_goroup)
  811. flag = false;
  812. }
  813. return flag;
  814. }
  815. std::vector<std::string> DecoratorRule::find_near(double x,double y,double dist,std::string cardid)
  816. {
  817. auto v = m_->find_near(x,y,dist,cardid);
  818. return std::move(v);
  819. }
  820. std::shared_ptr<card_interface> DecoratorRule::getCard(const std::string &card_no)
  821. {
  822. return m_->getCard(card_no);
  823. }
  824. void DecoratorRuleCrossing::run()
  825. {
  826. while(!b_exit)
  827. {
  828. //do handle crossingRule.
  829. auto vt = m_rule->handleRule();
  830. m_->getSendLightInfo(std::move(vt),"Crossing");
  831. std::this_thread::sleep_for(std::chrono::seconds(2));
  832. }
  833. }
  834. void DecoratorRuleAvoidance::handleRule(std::shared_ptr<card_interface> c)
  835. {
  836. static bool f = false;
  837. if(!f){std::dynamic_pointer_cast<AvoidanceRule>(m_rule)->sort();f=true;}
  838. if(c==nullptr)
  839. return ;
  840. if(!c->getBigCarFlag())
  841. return;
  842. auto vt = m_rule->handleRule(c);
  843. if(vt.size()>0){
  844. debug_print_syslog(0,"lamp light: gid: %d, size: %d",vt[0]->getId(),vt.size());
  845. }
  846. m_->getSendLightInfo(std::move(vt),"Avoidance");
  847. }
  848. std::shared_ptr<RunRedLight> DecoratorRuleAvoidance::check_run_red_light(std::shared_ptr<card_interface> c,double dis)
  849. {
  850. static bool f = false;
  851. if(!f){std::dynamic_pointer_cast<AvoidanceRule>(m_rule)->sort();f=true;}
  852. if(c==nullptr)
  853. return nullptr;
  854. return m_rule->check_run_red_light(c, dis);
  855. }
  856. NAMESPACE_POINT_END(NAMESPACE_POINT)
  857. #if 0
  858. //4,'name','label','state',4727, 275, 0, 10, 200, '2018-04-18 11:18:12',90
  859. void InitData::read_dat_group(const char * fname)
  860. {
  861. FILE *fp = fopen(fname,"r");
  862. char buf[512];
  863. int32_t t,id,areaid,mapid,ctime;
  864. double x,y,scope;
  865. char* s[20];
  866. while(fgets(buf,sizeof(buf),fp))
  867. {
  868. t=str_split(buf,&s[0]);
  869. if(t<8)
  870. continue;
  871. id = atoi(s[0]);
  872. x = atof(s[4]);
  873. y = -atof(s[5]);
  874. scope = atof(s[7]);
  875. mapid = atoi(s[10]);
  876. areaid = atoi(s[11]);
  877. ctime = atoi(s[12]);
  878. std::cout << s[0] <<' '<< s[4] <<' ' << s[5] <<' '<<s[7] <<std::endl;
  879. //crossing
  880. std::shared_ptr<TrafficLightGroup> tmp = nullptr;
  881. //if(scope != 0)
  882. //{
  883. tmp = std::make_shared<TrafficLightGroup>(x,y,0.0,id,mapid,areaid,scope,ctime);
  884. // m_CrossingMap.push_back(tmp);
  885. //}
  886. // else
  887. // tmp = std::make_shared<AvoidanceTrafficLightGroup>(x,y,0,id,mapid,areaid);
  888. m_Map.insert({id,tmp});
  889. }
  890. }
  891. //3, '192.168.1.101', 4727, 100,0,'name','label',100,'state',1,60,'2017/08/10 11:11:11',4,0
  892. void InitData::read_dat_light(const char * fname)
  893. {
  894. FILE *fp = fopen(fname,"r");
  895. char buf[512];
  896. int t,id,readerid,gid,specialFlag;
  897. double x,y;
  898. std::string ip;
  899. char* s[20];
  900. while(fgets(buf,sizeof(buf),fp))
  901. {
  902. t=str_split(buf,&s[0]);
  903. if(t<8)
  904. continue;
  905. id = atoi(s[0]);
  906. ip = s[1];
  907. x = atof(s[2]);
  908. y= -atof(s[3]);
  909. //mapid = atoi(s[7]);
  910. readerid = atoi(s[7]);
  911. //areaid = atoi(s[9]);
  912. //controltime = atoi(s[10]);
  913. gid = atoi(s[12]);
  914. specialFlag = atoi(s[13]);//0正常1表示特殊红绿灯
  915. std::cout << id <<' '<< ip <<' ' << x <<' '<< y <<' ' << readerid <<' ' <<gid <<std::endl;
  916. std::shared_ptr<TrafficLight> tmp = std::make_shared<TrafficLight>(id,x,y,0,readerid,ip,specialFlag);
  917. m_Map[gid]->put(tmp);
  918. }
  919. }
  920. int main()
  921. {
  922. std::shared_ptr<Manage> m = std::make_shared<Manage>();
  923. //test point func
  924. TrafficLightGroup *ctlg = new TrafficLightGroup(1,1,0,12,12.5,5,10,90) ;
  925. std::cout <<"direct:"<< ctlg->dist_direct(3,1)<<std::endl;;
  926. delete ctlg;
  927. //test self-thread.
  928. //std::shared_ptr<Rule> r =std::make_shared<CrossingRule> ();
  929. //DecoratorRule* drc = new DecoratorRuleCrossing(&m);
  930. //drc->CreateRule();
  931. //drc->handleRule();
  932. //delete drc;
  933. //test line
  934. line l(point(100,10),point(120,10));
  935. std::cout << l.dist(point(130,10))<<std::endl;
  936. line ll(point(4727,75),point(4727,88));
  937. std::cout << ll.a<<' '<<ll.b<<' '<<ll.c<<"=illlll"<<std::endl;
  938. auto abc = point(4727,75).get_abc(point(4727,88));
  939. std::cout << std::get<0>(abc)<<' '<<std::get<1>(abc)<<' '<<std::get<2>(abc)<<std::endl;
  940. line lll(point(4729,75),point(4729,88));
  941. std::cout << lll.a<<' '<<lll.b<<' '<<lll.c<<"=iixxlllll"<<std::endl;
  942. //read config
  943. InitData Id;
  944. Id.read_dat_group("dat_group.txt");
  945. Id.read_dat_light("dat_light.txt");
  946. Id.showInfo();
  947. //get map for trafficLightGroups includes TrafficLights
  948. //std::shared_ptr<Rule> CrossingR = std::make_shared<CrossingRule>(m);
  949. //CrossingR->put(std::move(Id.m_CrossingMap));
  950. //std::shared_ptr<Rule> AvoidanceR = std::make_shared<AvoidanceRule>(m);
  951. uint64_t tt = time(NULL)*1000;
  952. std::shared_ptr<card_interface> bc24 = std::make_shared<c>("2:4",tt,4470,10,true,-1.1,1);//cardid timet x y bigcar speed,areaid
  953. std::shared_ptr<card_interface> bc22 = std::make_shared<c>("2:2",tt,4650,75,false,1.1,2);//cardid timet x y bigcar speed.areaid
  954. m->m_map.insert({"2:4",bc24});
  955. m->m_map.insert({"2:2",bc22});
  956. // CrossingR->update(4470,-75,"2:4");
  957. // 这里需要把y转化成-
  958. m->m_g.update(4650,-75,"2:2");
  959. //auto av = AvoidanceR->find_near(4600,-75,100,"2:4");
  960. std::shared_ptr<DecoratorRule> DecCrossingRule = std::make_shared<DecoratorRuleCrossing>(m);
  961. std::shared_ptr<DecoratorRule> DecAvoidanceRule = std::make_shared<DecoratorRuleAvoidance>(m);
  962. DecCrossingRule->CreateRule();
  963. DecAvoidanceRule->CreateRule();
  964. for(const auto px : Id.m_Map)
  965. {
  966. if(px.second->m_gId == 1)
  967. {
  968. px.second->store(3);
  969. px.second->m_controlTime = time(NULL)+30;
  970. }
  971. if(px.second->m_gId == 1)
  972. bc24->push_back(px.second);
  973. if(px.second->m_gId == 2)
  974. {
  975. //px.second->store(2);
  976. bc24->push_back(px.second);
  977. }
  978. // if(px.second->m_gId == 6)
  979. // {
  980. // bc24->push_back(px.second);
  981. // px.second->store(3);
  982. // }
  983. DecAvoidanceRule->put(px.second);
  984. DecCrossingRule->put(px.second);
  985. }
  986. //DectoratorRule do next..
  987. // DecCrossingRule->handleRule();
  988. //DecAvoidanceRule->handleRule();
  989. #if 0
  990. //test the sort for TrafficLightGroup............
  991. std::shared_ptr<TrafficLightGroup> p = std::make_shared<CrossingTrafficLightGroup>(1,2,0,12,12.5,5,10);
  992. std::shared_ptr<TrafficLightGroup> p1 = std::make_shared<AvoidanceTrafficLightGroup>(2,2,0,12,5,10);
  993. std::shared_ptr<TrafficLightGroup> p2 = std::make_shared<CrossingTrafficLightGroup>(3,2,0,12,12.5,5,10);
  994. std::vector<std::shared_ptr<TrafficLightGroup>> vp;
  995. vp.push_back(p);
  996. vp.push_back(p2);
  997. vp.push_back(p1);
  998. for(auto px:vp)
  999. std::cout << px->x<<"beforefdfdfd" << px->y<<std::endl;
  1000. std::sort(vp.begin(),vp.end(),[](std::shared_ptr<TrafficLightGroup> one,std::shared_ptr<TrafficLightGroup> two)->bool{std::cout << two->x<<std::endl;return *one<*two;});
  1001. for(auto px:vp)
  1002. std::cout << px->x<<"fdfdfd" << px->y<<std::endl;
  1003. #endif
  1004. //DecAvoidanceRule->handleRule(bc24);
  1005. std::dynamic_pointer_cast<c>(bc24)->x_ = 4727;
  1006. m->m_g.update(4727,-10,"2:4");
  1007. //m->m_g.update(4604,-75,"2:4");
  1008. std::cout <<"------------------------------------"<<std::endl;
  1009. // DecAvoidanceRule->handleRule(bc24);
  1010. DecCrossingRule->handleRule();
  1011. std::cout<<"******************************************************************************888"<<std::endl;
  1012. std::cout << DecCrossingRule->showInfo()<<std::endl;;
  1013. std::cout<<"************************888"<<std::endl;
  1014. // std::cout << DecAvoidanceRule->showInfo()<<std::endl;;
  1015. std::cout<<"**********************************************888"<<std::endl;
  1016. std::this_thread::sleep_for(std::chrono::seconds(20));
  1017. m->m_g.update(4604,-75,"2:4");
  1018. while(1){std::this_thread::sleep_for(std::chrono::seconds(10));};
  1019. return 0;
  1020. }
  1021. #endif