📄 second.c
字号:
//遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控遥控
///////////////////////////////////////////////////////////////////////////////////////
//强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制
////////////////////////////////////////////////////////////////////////////////////////
if(force_flag==1){ //强制阶段号发生变化
// if(force_number!=last_forcenumber){
if(act_force==1){ //进入强制控制的第一秒
act_force=0;
if(clear_force==0){//绿灯阶段
now_uncount =max_green_flash+max_red_clear+max_yellow+1;
}
}else{
if(re_keep_force==1){//原阶段绿闪,黄灯清空时间后第一秒
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
}else{
if(step_counter!=force_number-1){
now_uncount--; //新的强制输入后,原阶段剩余时间继续减少
}else{
if(force_exe_flag==1){
now_uncount =max_green_flash+max_red_clear+max_yellow+1;
force_exe_flag=0;
}
}
}
}
}else{ //无强制状态下
if(re_control!=1){
now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;
}
if((re_control!=1)&&(exit_remote==1)){
now_uncount=max_green_flash+max_red_clear+max_yellow+1-now_step_key;
}
//now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;
// if((re_control!=1)&&(last_force_flag==0))now_uncount=max_green_flash+max_red_clear+max_yellow+1;
if((force_flag==0)&&last_force_flag==1){//遥控状态返回自动
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
now_step_key=0;
}
}
// }
if((re_control!=1)&&(last_re_control==1)){
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
exit_remote=1;
}
last_force_flag=force_flag;
last_re_control=re_control;
//强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制
////////////////////////////////////////////////////////////////////////////////////////
if(sensor_step[step_counter]==0) //阶段为固定配时
{
for(i=0; i<16; i++) //此循环用于查找当前阶段用到的相位
{
toto = 0x0001;
toto = toto<<i;
now_phase_temp = toto&inuse_phase[step_counter];
if(re_control==1&&step_counter!=reph_number-1)//遥控响应尚未开始执行
now_phase_tempn = toto&inuse_phasen[reph_number-1];
else if(force_flag==1&&step_counter!=force_number-1)//遥控响应尚未开始执行
now_phase_tempn = toto&inuse_phasen[force_number-1];
else
now_phase_tempn = toto&inuse_phasen[step_counter];
if(now_phase_temp!=0)
{
now_lamp_temp = XBYTE[baseaddr_now_phasesch+18*i];
now_lamp_temp = now_lamp_temp<<8;
now_lamp = now_lamp_temp|XBYTE[baseaddr_now_phasesch+18*i+1];
if(now_uncount>red_yellow_green_clear[i]) //当前倒计时处于绿灯时间范围内
// step_uncount[4][16]:当前阶段的剩余时间累计,全红时间,黄灯时间,绿闪时间,绿灯时间
{
clear_flag=0; //不处于清空时间
clear_force=0;
now_phase_status = now_phase_status|now_phase_temp;
now_step_uncount = now_uncount-red_yellow_clear[i]; //非行人相位 不是行人相位
//当前绿灯的倒计时
for(j=0; j<16; j++) //此循环用于查找当前相位用到的灯组
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=1; /*当前阶段用的灯组置成绿色*/
}
}
}
else if(now_uncount>=red_yellow_clear[i]) /*当前阶段处于绿闪*/
{
clear_flag=1;
clear_force=1;
now_step_uncount = now_uncount-red_yellow_clear[i];
for(j=0; j<16; j++)
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=2; /*当前阶段用的灯组置成绿闪*/
if(now_phase_tempn!=0)
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
else if(now_uncount<red_yellow_clear[i]&&now_uncount>=red_clear[i])
{
clear_flag=1;
clear_force=1;
if(now_phase_tempn==0)
now_phase_status = now_phase_status&(~now_phase_temp);
now_step_uncount = now_uncount-red_clear[i];
//now_uncount:当前阶段的倒计时 now_step_uncount:当前绿灯的倒计时
for(j=0; j<16; j++)
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
// if(now_uncount>red_clear[i])
{
lamp_state[j]=3; /*当前阶段用的灯组置成黄色*/
if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)==0x04)
lamp_state[j]=4; /*灯组是行人灯组,在黄灯期间置红色*/
}
if(now_phase_tempn!=0)
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
else if(now_uncount<red_clear[i]) //当前倒计时处于全红时间范围内
{
clear_flag=1;
clear_force=1;
if(now_phase_tempn==0)
now_phase_status = now_phase_status&(~now_phase_temp);
now_step_uncount = now_uncount; //当前阶段的倒计时
for(j=0; j<16; j++)
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=4; /*当前阶段用的灯组置成绿闪*/
if(now_phase_tempn!=0)
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
//感应阶段,感应阶段 感应阶段,感应阶段感应阶段,感应阶段感应阶段,感应阶段感应阶段,感应阶段
/////////////////////////////////////////////////////////////////////////////////////////////
else if(sensor_step[step_counter]==1) //阶段为感应配时
{
if(sensor_virgin_flag)
{
sensor_virgin_flag = 0;
step_time = search_step_time(); //阶段时间在开始时只加载一次=最小绿灯+红灯+黄灯
}
for(i=0; i<16; i++) //此循环用于查找当前阶段用到的相位
{
toto = 0x0001;
toto = toto<<i;
now_phase_temp = toto&inuse_phase[step_counter]; //当前阶段是否包含该相位
now_phase_tempn = toto&inuse_phasen[step_counter];
if(now_phase_temp!=0) //
{
now_lamp_temp = XBYTE[baseaddr_now_phasesch+18*i];
now_lamp_temp = now_lamp_temp<<8;
now_lamp = now_lamp_temp|XBYTE[baseaddr_now_phasesch+18*i+1];
if(now_uncount>red_yellow_green_clear[i]) //当前倒计时处于绿灯时间范围内
{
clear_flag=0; //不处于清空时间
clear_force=0;
//绿灯倒计时=阶段倒计时-全红时间-黄灯时间
now_phase_status = now_phase_status|now_phase_temp;
//行人相位倒计时采用当前以红清空时间为基准
if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)!=0x04){
now_step_uncount = now_uncount-red_yellow_clear[i];
}
//当前阶段倒计时
if(now_step_key<(step_time-sensor_distance-max_red_clear-max_yellow))sensor_car_flag = 0;
//当前阶段倒计时处于绿时可延长范围
if(now_step_key<(step_time-max_green_flash-max_red_clear-max_yellow)&&now_step_key>=(step_time-max_green_flash-max_red_clear-max_yellow-sensor_distance))
{
sensor_car_flag=1;
//无遥控和强制状况下
if((carnumber!=lastcarnumber))//&&(re_control==0)&&(force_flag!=1))
{
lastcarnumber = 0;
carnumber=0;
add_greentime =now_step_key+sensor_distance;
if(add_greentime>=max_greentime)
{
ensensor_flag = 0;
sensor_car_flag = 0;
add_greentime = max_greentime;
}
step_time = add_greentime+XBYTE[baseaddr_now_phasesch+18*i+15]+XBYTE[baseaddr_now_phasesch+18*i+16]+XBYTE[baseaddr_now_phasesch+18*i+17];
sensor_counter = 1;
now_step_key=now_step_key-sensor_distance;
// lastcarnumber = 0;
// carnumber=0;
}
}
for(j=0; j<16; j++) //此循环用于查找当前相位用到的灯组
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=1; /*当前阶段用的灯组置成绿色*/
}
}
} //当前倒计时处于绿闪时间范围内
else if(now_uncount>=red_yellow_clear[i]&&now_uncount<=red_yellow_green_clear[i])
{ clear_flag=1;
clear_force=1;
now_step_uncount = now_uncount-red_yellow_clear[i]; //当前阶段的倒计时
for(j=0; j<16; j++) //此循环用于查找当前相位用到的灯组
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
if(now_phase_tempn==0)
{
ensensor_flag = 0;
sensor_car_flag = 0;
step_time = now_step_key+now_uncount;
lamp_state[j]=2; /*当前阶段用的灯组置成绿闪*/
}
else
{
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
}
// else if(now_uncount>=red_clear[i]) //当前倒计时处于黄灯时间范围内
else if(now_uncount<red_yellow_clear[i]&&now_uncount>=red_clear[i]) //当前倒计时处于黄灯时间范围内
{ clear_flag=1;
clear_force=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -