|
@@ -37,7 +37,7 @@ traffic_light_ptr rule::find_nearby_light(const point& p, traffic_light_group_pt
|
|
|
for(auto it = g->m_vt_lights.begin(); it != g->m_vt_lights.end(); ++it)
|
|
|
{
|
|
|
traffic_light_ptr tmp = traffic_light_manager::instance()->find_light((*it)->m_light_id);
|
|
|
- double dt = tmp->dist(p.x, p.y);
|
|
|
+ double dt = tmp->dist(p.x, p.y) * traffic_light_manager::instance()->get_scale();
|
|
|
if(dt < max){
|
|
|
max = dt;
|
|
|
pl = tmp;
|
|
@@ -56,7 +56,7 @@ void crossing_rule::change_state(const uint64_t vid, traffic_light_group_ptr g)
|
|
|
traffic_light_ptr pl = find_nearby_light(point(cp->x, cp->y), g);
|
|
|
// 设置来车方向为绿灯,其他方向为红灯
|
|
|
if(nullptr != pl){
|
|
|
- log_info("[traffic_light] card_id=%lld, light_id=%d", vid, pl->m_light_id);
|
|
|
+ log_info("[traffic_light] card_id=%lld, light_id=%d, light_shape=%d", vid, pl->m_light_id, light_shape::green_all_on);
|
|
|
g->set_light(pl->m_light_id, light_shape::green_all_on, light_shape::red_all_on);
|
|
|
}
|
|
|
}else{
|
|
@@ -91,7 +91,7 @@ bool crossing_rule::find_light(const uint64_t& vid, traffic_light_group_ptr g, b
|
|
|
if(!a){
|
|
|
if(1 == pl->m_special){
|
|
|
// 判断是否在线上
|
|
|
- if(pl->m_line_group.contain(cp->x, cp->y, 0.5)){
|
|
|
+ if(pl->m_line_group.contain(cp->x, cp->y, 5)){
|
|
|
// 判断行车方向
|
|
|
double d = cp->m_speed * pl->m_direct_distance;
|
|
|
if(d < 0){
|
|
@@ -101,7 +101,7 @@ bool crossing_rule::find_light(const uint64_t& vid, traffic_light_group_ptr g, b
|
|
|
}
|
|
|
}else{
|
|
|
// 判断是否在线上
|
|
|
- if(pl->m_line_group.contain(cp->x, cp->y, 1.0)){
|
|
|
+ if(pl->m_line_group.contain(cp->x, cp->y, 5.0)){
|
|
|
double d = cp->m_speed * pl->m_direct_distance;
|
|
|
if(d < 0){
|
|
|
return true;
|
|
@@ -132,7 +132,7 @@ bool crossing_rule::handle_crossing(traffic_light_group_ptr group)
|
|
|
|
|
|
// 查找一定范围的车辆
|
|
|
std::vector<uint64_t> vtl = traffic_light_manager::instance()->find_nearby_vehicle(point(static_cast<int>(group->x), static_cast<int>(group->y)), group->m_scope, group->m_group_id);
|
|
|
- log_info("[traffic_light] handle crossing rule.gid=%d, group_scope=%.2f, vehicle's num=%d", group->m_group_id, group->m_scope, vtl.size());
|
|
|
+ //log_info("[traffic_light] handle crossing rule.gid=%d, group_scope=%.2f, vehicle's num=%d", group->m_group_id, group->m_scope, vtl.size());
|
|
|
if(vtl.empty()){
|
|
|
if(group->m_card_id > 0 && group->m_priority == priority_crossing)
|
|
|
{
|
|
@@ -232,11 +232,11 @@ bool crossing_rule::avoidance_by_level(traffic_light_group_ptr& group)
|
|
|
}
|
|
|
|
|
|
if(vt.size() == 1 && vt[0] == group->m_card_id){
|
|
|
- log_info("[traffic_light] group is controlled, gid=%d, cid=%d", group->m_group_id, group->m_card_id);
|
|
|
+ log_info("[traffic_light] crossing_rule::avoidance_by_level, group is controlled, gid=%d, cid=%d", group->m_group_id, group->m_card_id);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- log_info("[traffic_light] handle avoidance_by_level, gid=%d, x=%.2f, y=%.2f, scope=%.2f, ctrl_cid=%d, ivehicle's size=%d", group->m_group_id, group->x, group->y, group->m_scope, group->m_card_id, vt.size());
|
|
|
+ log_info("[traffic_light] crossing_rule::avoidance_by_level, gid=%d, x=%.2f, y=%.2f, scope=%.2f, ctrl_cid=%d, ivehicle's size=%d", group->m_group_id, group->x, group->y, group->m_scope, group->m_card_id, vt.size());
|
|
|
|
|
|
if(group->m_card_id > 0 && get_vehicle_state(group->m_card_id)){
|
|
|
//检查是否释放控制权
|
|
@@ -361,6 +361,8 @@ bool crossing_rule::avoidance_by_updown(traffic_light_group_ptr& group)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ log_info("[traffic_light] handle avoidance_by_updown, gid=%d, control_card_id=%d, exist_up_stream_vehicle=%s", group->m_group_id, group->m_card_id, (exist_up_stream?"true":"false"));
|
|
|
|
|
|
if(exist_up_stream || group->m_card_id > 0){
|
|
|
// erase vehicles that's state of down_stream
|
|
@@ -370,9 +372,10 @@ bool crossing_rule::avoidance_by_updown(traffic_light_group_ptr& group)
|
|
|
}else{
|
|
|
return false;
|
|
|
}
|
|
|
- }));
|
|
|
+ }), vt.end());
|
|
|
|
|
|
if(vt.empty()){
|
|
|
+ //log_info("[traffic_light] handle avoidance_by_updown")
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -429,6 +432,11 @@ bool crossing_rule::avoidance_by_updown(traffic_light_group_ptr& group)
|
|
|
void crossing_rule::handle_rule(pos_data& p)
|
|
|
{
|
|
|
//log_info("[traffic_light] crossing_rule::handle_rule, group's size=%d", m_vt_group.size());
|
|
|
+ if(m_pos.size()<2){
|
|
|
+ log_warn("[traffic_light] pos_data's size = %d", m_pos.size());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
for(auto& it : m_vt_group){
|
|
|
// 获取控制权
|
|
|
it->get_turn();
|
|
@@ -438,7 +446,7 @@ void crossing_rule::handle_rule(pos_data& p)
|
|
|
while(true){
|
|
|
if(priority_manual_ctrl == priority){
|
|
|
flag = handle_manual_ctrl(it);
|
|
|
- log_info("[traffic_light] crossing_rule::handle_rule, after call handle_manual_ctrl, flag=%d", flag);
|
|
|
+ //log_info("[traffic_light] crossing_rule::handle_rule, after call handle_manual_ctrl, flag=%d", flag);
|
|
|
if(flag){
|
|
|
break;
|
|
|
}
|
|
@@ -446,7 +454,7 @@ void crossing_rule::handle_rule(pos_data& p)
|
|
|
|
|
|
if(priority <= priority_avoidance){
|
|
|
flag = handle_avoidance(it);
|
|
|
- log_info("[traffic_light] crossing_rule::handle_rule, after call handle_avoidance, flag=%d", flag);
|
|
|
+ //log_info("[traffic_light] crossing_rule::handle_rule, after call handle_avoidance, flag=%d", flag);
|
|
|
if(flag){
|
|
|
break;
|
|
|
}
|
|
@@ -454,7 +462,7 @@ void crossing_rule::handle_rule(pos_data& p)
|
|
|
|
|
|
if(priority <= priority_crossing){
|
|
|
flag = handle_crossing(it);
|
|
|
- log_info("[traffic_light] crossing_rule::handle_rule, after call handle_crossing, flag=%d", flag);
|
|
|
+ //log_info("[traffic_light] crossing_rule::handle_rule, after call handle_crossing, flag=%d", flag);
|
|
|
if(flag){
|
|
|
break;
|
|
|
}
|
|
@@ -478,7 +486,7 @@ vt_traffic_group avoidance_rule::find_group(const pos_data& p)
|
|
|
return find_group(point(p.x, p.y), p.m_area_id, p.m_speed, p);
|
|
|
}
|
|
|
|
|
|
-vt_traffic_group avoidance_rule::find_group(const point& po , int area_id, double speed, const pos_data& pd)
|
|
|
+vt_traffic_group avoidance_rule::find_group(const point& po , int area_id, double speed, const pos_data& pd)
|
|
|
{
|
|
|
vt_traffic_group llist;
|
|
|
|
|
@@ -490,6 +498,10 @@ vt_traffic_group avoidance_rule::find_group(const point& po , int area_id, doubl
|
|
|
vt_traffic_group vg = m_map_area_group[area_id];
|
|
|
|
|
|
double dist = 0.0;
|
|
|
+ double scale = traffic_light_manager::instance()->get_scale();
|
|
|
+
|
|
|
+ double alpha = 0.0;
|
|
|
+ int gid = 0;
|
|
|
for(std::size_t i = 0; i < vg.size(); ++i){
|
|
|
traffic_light_group_ptr pg = vg[i];
|
|
|
if(nullptr == pg){
|
|
@@ -501,53 +513,50 @@ vt_traffic_group avoidance_rule::find_group(const point& po , int area_id, doubl
|
|
|
log_info("[traffic_light] card_id=%lld was control light group, gid=%d", pd.m_card_id, vg[i]->m_group_id);
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
// 求灯组到车辆的距离(车辆在灯组的左下方,则距离值取反)
|
|
|
- dist = vg[i]->dist_direct(po.x, po.y);
|
|
|
- // 车辆在灯组左边或下边
|
|
|
- log_info("[traffic_light] avoidance_rule::find_group, area_id=%d, area_group=%d, dist=%.2f", area_id, vg.size(), dist);
|
|
|
- if(dist <= 0){
|
|
|
- // 速度方向与前进方向一致
|
|
|
- if(speed > 0){
|
|
|
- // 车辆到灯组的距离小于指定距离
|
|
|
- if(vg[i]->dist(po.x, po.y) <= g_max_scope){
|
|
|
- llist.push_back(vg[i]);
|
|
|
- }
|
|
|
-
|
|
|
- // 紧挨着的一个灯组到车距离小于指定阈值
|
|
|
- if(i + 1 < vg.size()){
|
|
|
- if(vg[i+1]->dist(po.x, po.y) <= g_max_scope){
|
|
|
- llist.push_back(vg[i+1]);
|
|
|
- }
|
|
|
- }
|
|
|
- }else if(speed < 0){
|
|
|
- // 速度方向与前进方向不一致,判断运动方向的灯组是否在可控范围
|
|
|
- if(i >= 1 && vg[i - 1]->dist(po.x, po.y) <= g_max_scope){
|
|
|
- llist.push_back(vg[i-1]);
|
|
|
- }
|
|
|
- if(i >= 2 && vg[i-2]->dist(po.x, po.y) <= g_max_scope){
|
|
|
- llist.push_back(vg[i-2]);
|
|
|
- }
|
|
|
+ dist = m_pos[1].dist_direct(vg[i]->x, vg[i]->y) * scale;
|
|
|
+ point vp1(vg[i]->x - m_pos[0].x, vg[i]->y - m_pos[0].y), vp2(m_pos[1].x - m_pos[0].x, m_pos[1].y - m_pos[0].y);
|
|
|
+ int f1 = (vg[i]->x > m_pos[0].x ? 1 : -1);
|
|
|
+ int f2 = (m_pos[1].x > m_pos[0].x ? 1: -1);
|
|
|
+ if(f1*f2 > 0 && fabs(dist) < vg[i]->m_scope)
|
|
|
+ {
|
|
|
+ double tmp = (vp1.x*vp2.x + vp1.y*vp2.y)/(sqrt(vp1.x*vp1.x + vp1.y+vp1.y) * sqrt(vp2.x*vp2.x + vp2.y*vp2.y));
|
|
|
+ tmp = (tmp>0?(tmp>1?fabs(tmp-1):tmp):(tmp>-1?fabs(tmp):fabs(tmp+1)));
|
|
|
+ if(tmp < alpha){
|
|
|
+ alpha = tmp;
|
|
|
+ gid = vg[i]->m_group_id;
|
|
|
}
|
|
|
-
|
|
|
- break;
|
|
|
+ llist.push_back(vg[i]);
|
|
|
+ log_info("[traffic_light] avoidance_rule::find_group, possiable light_group_id=%d, alpha=%.2f, area_id=%d, area_light_group_size=%d, scope=%.2f, dist=%.2f, min_alpha=%.2f, speed=%.2f, direction=%d", vg[i]->m_group_id, tmp, area_id, vg.size(), vg[i]->m_scope, dist, alpha, speed, f1*f2);
|
|
|
}
|
|
|
-
|
|
|
- log_info("[traffic_light] the vehicle is in light group's left or down side.");
|
|
|
}
|
|
|
|
|
|
- // 车辆在灯组右边或上边
|
|
|
- if(dist > 0 && speed < 0){
|
|
|
- std::size_t i = vg.size();
|
|
|
- if(i >= 1 && vg[i-1]->dist(po.x, po.y) <= g_max_scope){
|
|
|
- llist.push_back(vg[i-1]);
|
|
|
- }
|
|
|
- if(i >= 2 && vg[i-2]->dist(po.x, po.y) <= g_max_scope){
|
|
|
- llist.push_back(vg[i-2]);
|
|
|
- }
|
|
|
- log_info("[traffic_light] the vehicle is in light group's right or up side");
|
|
|
+ if(gid > 0){
|
|
|
+ llist.erase(std::remove_if(llist.begin(), llist.end(), [&](const traffic_light_group_ptr& g){
|
|
|
+ if(g->m_group_id != gid){
|
|
|
+ return true;
|
|
|
+ }else{
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }), llist.end());
|
|
|
}
|
|
|
|
|
|
+ //检查接收基站所在路径有没有此灯组,没有则删除
|
|
|
+ std::vector<pos_data> vtp;
|
|
|
+ vtp.insert(vtp.begin(), m_pos.begin(), m_pos.end());
|
|
|
+
|
|
|
+ llist.erase(std::remove_if(llist.begin(), llist.end(), [&](const traffic_light_group_ptr& g){
|
|
|
+ if(!traffic_light_manager::instance()->on_path(vtp, point(g->x, g->y))){
|
|
|
+ log_info("[traffic_light] the %d light group is not on %d site path.", g->m_group_id, vtp[0].m_site_id);
|
|
|
+ return true;
|
|
|
+ }else{
|
|
|
+ log_info("[traffic_light] the %d light group is on %d site path.", g->m_group_id, vtp[0].m_site_id);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ llist.end()
|
|
|
+ );
|
|
|
+
|
|
|
return std::move(llist);
|
|
|
}
|
|
|
|
|
@@ -585,10 +594,6 @@ bool avoidance_rule::get_vehicle(const pos_data& p, vt_traffic_group& vg)
|
|
|
|
|
|
std::set_intersection(vt1.begin(), vt1.end(), vt2.begin(), vt2.end(), std::back_inserter(vti));
|
|
|
|
|
|
- if(vti.empty()){
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
// 筛选出符合条件的车辆,离第一个红绿灯距离进行排序
|
|
|
vti.erase(std::remove_if(vti.begin(), vti.end(), [&](const uint64_t& vid) -> bool {
|
|
|
pos_data* tp = traffic_light_manager::instance()->get_position(vid);
|
|
@@ -664,7 +669,7 @@ void avoidance_rule::change_group(const traffic_light_group_ptr& g, const point&
|
|
|
if(nullptr == pl){
|
|
|
return;
|
|
|
}
|
|
|
- log_info("[traffic_light] change light's status in %d group", g->m_group_id);
|
|
|
+ log_info("[traffic_light] change light's status in the %d's light group", g->m_group_id);
|
|
|
// 2.获取灯组中临近车辆的灯id
|
|
|
g->m_green_light_id = pl->m_light_id;
|
|
|
g->get_turn();
|
|
@@ -674,6 +679,19 @@ void avoidance_rule::change_group(const traffic_light_group_ptr& g, const point&
|
|
|
g->release_turn();
|
|
|
}
|
|
|
|
|
|
+void avoidance_rule::change_group(const traffic_light_group_ptr& g, const move_stream& s, const int& lc, const int& lcr)
|
|
|
+{
|
|
|
+ g->get_turn();
|
|
|
+ for_each(g->m_vt_lights.begin(), g->m_vt_lights.end(), [&](traffic_light_ptr& l){
|
|
|
+ if(l->m_stream == s){
|
|
|
+ g->m_green_light_id = l->m_light_id;
|
|
|
+ g->set_light(l->m_light_id, lc, lcr);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ g->release_turn();
|
|
|
+}
|
|
|
+
|
|
|
bool avoidance_rule::is_different(traffic_light_group_ptr g, const point& p, const int& lc, const int& lcr)
|
|
|
{
|
|
|
bool b = false;
|
|
@@ -688,24 +706,29 @@ bool avoidance_rule::is_different(traffic_light_group_ptr g, const point& p, con
|
|
|
|
|
|
void avoidance_rule::handle_rule(pos_data& p)
|
|
|
{
|
|
|
+ if(m_pos.size() < 2){
|
|
|
+ log_warn("[traffic_light] pos_data's size = %d", m_pos.size());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
vt_traffic_group llist;
|
|
|
|
|
|
if(p.m_card_id == 0|| p.m_type == 0){
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- log_info("[traffic_light] avoidance_rule::handle_rule, group's size=%d, area_id=%d", m_map_area_group.size(), p.m_area_id);
|
|
|
+ log_info("[traffic_light] avoidance_rule::handle_rule, group's size=%d, area_id=%d his_pos's size=%d, pos0.x=%.2f, pos0.y=%.2f, pos1.x=%.2f, pos2.y=%.2f", m_map_area_group.size(), p.m_area_id, m_pos.size(), m_pos[0].x, m_pos[0].y, m_pos[1].x, m_pos[1].y);
|
|
|
auto it = m_map_area_group.find(p.m_area_id);
|
|
|
if(it != m_map_area_group.end()){
|
|
|
// 根据车卡的定位坐标以及定位区域信息获取红绿灯组
|
|
|
vt_traffic_group vtg = find_group(point(p.x, p.y), p.m_area_id, p.m_speed, p);
|
|
|
- log_info("[traffic_light] handle avoidance rule, area has light, area_id=%d, card_id=%d, light_group's size=%d", p.m_area_id, p.m_card_id, vtg.size());
|
|
|
+ //log_info("[traffic_light] handle avoidance rule, area has light, area_id=%d, card_id=%d, light_group's size=%d", p.m_area_id, p.m_card_id, vtg.size());
|
|
|
if(vtg.size() == 0){
|
|
|
// 所在区域没有可以控制的红绿灯组
|
|
|
switch(p.m_light_group.size())
|
|
|
{
|
|
|
case 1:
|
|
|
- // 当前车辆控制的路口为1个,释放该炉口控制
|
|
|
+ // 当前车辆控制的路口为1个,释放该路口控制
|
|
|
erase(true, p, llist);
|
|
|
break;
|
|
|
case 2:
|
|
@@ -720,7 +743,7 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
{
|
|
|
case 0:
|
|
|
// 当前卡没有绑定红绿灯组,绑定此灯组,并设置灯组颜色为绿色
|
|
|
- insert(vtg[0], p, llist, green, red);
|
|
|
+ insert(vtg[0], p, llist, light_shape::green_all_on, light_shape::red_all_on);
|
|
|
break;
|
|
|
case 1:
|
|
|
//当前卡绑定了1个红绿灯组
|
|
@@ -728,7 +751,7 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
// 检查当前卡绑定的红绿灯组与区域找到的是不是同一个
|
|
|
// 不是,释放之前的绑定,再绑定新灯组
|
|
|
erase(true, p, llist);
|
|
|
- insert(vtg[0], p, llist, green, red);
|
|
|
+ insert(vtg[0], p, llist, light_shape::green_all_on, light_shape::red_all_on);
|
|
|
}else{
|
|
|
// 当前卡绑定的红绿灯组与区域找到的是同一个
|
|
|
traffic_light_ptr pl = find_nearby_light(point(p.x, p.y), vtg[0]);
|
|
@@ -745,40 +768,40 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
// 第一个绑定的红绿灯组与区域找到的是同一个,删除第二个
|
|
|
erase(false, p, llist);
|
|
|
if(g->get_priority() <= priority_avoidance){
|
|
|
- change_group(g, point(p.x, p.y), green, red);
|
|
|
+ change_group(g, point(p.x, p.y), light_shape::green_all_on, light_shape::red_all_on);
|
|
|
llist.push_back(g);
|
|
|
}
|
|
|
}else if(p.m_light_group.back() == g->m_group_id){
|
|
|
// 第二个绑定的红绿灯组与区域找到的是同一个,删除第一个
|
|
|
erase(true, p, llist);
|
|
|
if(g->get_priority() <= priority_avoidance){
|
|
|
- change_group(g, point(p.x, p.y), green, red);
|
|
|
+ change_group(g, point(p.x, p.y), light_shape::green_all_on, light_shape::red_all_on);
|
|
|
llist.push_back(g);
|
|
|
}
|
|
|
}else{
|
|
|
// 两个都不是,全部删除
|
|
|
erase(true, p, llist);
|
|
|
erase(false, p, llist);
|
|
|
- insert(g, p, llist, green, red);
|
|
|
+ insert(g, p, llist, light_shape::green_all_on, light_shape::red_all_on);
|
|
|
}
|
|
|
}else if(2 == vtg.size()){
|
|
|
// 所在区域存在两个红绿灯组,巷道相遇逻辑
|
|
|
// 判断两个灯组中是否有车
|
|
|
bool b = get_vehicle(p, vtg);
|
|
|
- light_color la, lb;
|
|
|
+ int la, lb;
|
|
|
if(b){
|
|
|
- la = red;
|
|
|
- lb = spark;
|
|
|
+ la = light_shape::red_all_on;
|
|
|
+ lb = light_shape::red_spark;
|
|
|
}else{
|
|
|
- la = green;
|
|
|
- lb = red;
|
|
|
+ la = light_shape::green_all_on;
|
|
|
+ lb = light_shape::red_all_on;
|
|
|
}
|
|
|
|
|
|
switch(p.m_light_group.size()){
|
|
|
case 0:
|
|
|
// 当前卡没有绑定红绿灯组,绑定2个灯组
|
|
|
insert(vtg[0], p, llist, la, lb);
|
|
|
- insert(vtg[1], p, llist, green, spark);
|
|
|
+ insert(vtg[1], p, llist, light_shape::green_all_on, light_shape::green_spark);
|
|
|
break;
|
|
|
case 1:
|
|
|
// 当前卡有绑定1个红绿灯组,更新
|
|
@@ -787,11 +810,11 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
change_group(vtg[0], point(p.x, p.y), la, lb);
|
|
|
llist.push_back(vtg[0]);
|
|
|
}
|
|
|
- insert(vtg[1], p, llist, green, spark);
|
|
|
+ insert(vtg[1], p, llist, light_shape::green_all_on, light_shape::green_spark);
|
|
|
}else if(p.m_light_group.front() == vtg[1]->m_group_id){
|
|
|
if(vtg[1]->get_priority() <= priority_avoidance)
|
|
|
{
|
|
|
- change_group(vtg[1], point(p.x, p.y), green, spark);
|
|
|
+ change_group(vtg[1], point(p.x, p.y), light_shape::green_all_on, light_shape::green_spark);
|
|
|
llist.push_back(vtg[1]);
|
|
|
}
|
|
|
p.m_light_group.push_front(vtg[0]->m_group_id);
|
|
@@ -804,7 +827,7 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
// 两个都不相等
|
|
|
erase(false, p, llist);
|
|
|
insert(vtg[0], p, llist, la, lb);
|
|
|
- insert(vtg[1], p, llist, green, spark);
|
|
|
+ insert(vtg[1], p, llist, light_shape::green_all_on, light_shape::green_spark);
|
|
|
}
|
|
|
break;
|
|
|
case 2:
|
|
@@ -821,7 +844,7 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
if(is_different(vtg[0], point(p.x, p.y), la, lb)){
|
|
|
llist.push_back(vtg[0]);
|
|
|
}
|
|
|
- if(is_different(vtg[1], point(p.x, p.y), green, spark)){
|
|
|
+ if(is_different(vtg[1], point(p.x, p.y), light_shape::green_all_on, light_shape::red_all_on)){
|
|
|
llist.push_back(vtg[1]);
|
|
|
}
|
|
|
}else{
|
|
@@ -831,7 +854,7 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
llist.push_back(vtg[0]);
|
|
|
}
|
|
|
if(vtg[1]->get_priority() <= priority_avoidance){
|
|
|
- change_group(vtg[1], point(p.x, p.y), green, spark);
|
|
|
+ change_group(vtg[1], point(p.x, p.y), light_shape::green_all_on, light_shape::green_spark);
|
|
|
llist.push_back(vtg[1]);
|
|
|
}
|
|
|
p.m_light_group.push_back(vtg[0]->m_group_id);
|
|
@@ -841,25 +864,32 @@ void avoidance_rule::handle_rule(pos_data& p)
|
|
|
change_group(vtg[0], point(p.x, p.y), la, lb);
|
|
|
llist.push_back(vtg[0]);
|
|
|
}
|
|
|
- insert(vtg[1], p, llist, green, spark);
|
|
|
+ insert(vtg[1], p, llist, light_shape::green_all_on, light_shape::green_spark);
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(itt != p.m_light_group.end()){
|
|
|
- if(p.m_light_group.front() == vtg[1]->m_group_id){
|
|
|
- erase(false, p, llist);
|
|
|
- }else{
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(itt != p.m_light_group.end()){
|
|
|
+ if(p.m_light_group.front() == vtg[1]->m_group_id){
|
|
|
+ erase(false, p, llist);
|
|
|
+ }else{
|
|
|
+ erase(true, p, llist);
|
|
|
+ }
|
|
|
erase(true, p, llist);
|
|
|
+ erase(true, p, llist);
|
|
|
+ insert(vtg[0], p, llist, la, lb);
|
|
|
+ insert(vtg[1], p, llist, light_shape::green_all_on, light_shape::green_spark);
|
|
|
}
|
|
|
- erase(true, p, llist);
|
|
|
- erase(true, p, llist);
|
|
|
- insert(vtg[0], p, llist, la, lb);
|
|
|
- insert(vtg[1], p, llist, green, spark);
|
|
|
}
|
|
|
}
|
|
|
+ break;
|
|
|
}
|
|
|
- break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(vtg.size() > 2){
|
|
|
+ log_info("[traffic_light] control light group's size = %d", vtg.size());
|
|
|
+ for(auto it : vtg){
|
|
|
+ move_stream s = it->get_stream(p.m_card_id);
|
|
|
+ change_group(it, s, light_shape::green_all_on, light_shape::green_spark);
|
|
|
}
|
|
|
}
|
|
|
}else{
|