Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- with HWIF, HWIF_Types, Ada.Calendar;
- use HWIF, HWIF_Types, Ada.Calendar;
- procedure Controller is
- Tl_Flag : Boolean := true; -- true := North/South; false := East/West
- Dir1, Dir2 : Direction;
- State : Integer := 4;
- HC_TL, HC_TL2, HC_PL, PL_Check : Time;
- TL_Check : Time := Clock + 1.0;
- inner_loop : Boolean := false;
- FRAME_LOOP : constant Duration := 2.0;
- task P_Wait;
- procedure TL_Switch(Flag : Boolean) is
- begin
- if (Flag) then
- Tl_Flag := false;
- Dir1 := East;
- Dir2 := West;
- else
- Tl_Flag := true;
- Dir1 := North;
- Dir2 := South;
- end if;
- end TL_Switch;
- procedure TL_State(Dir1 : Direction; Dir2 : Direction; State1 : Integer) is
- begin
- case (State1) is
- when 1 => -- amber-red
- Traffic_Light(Dir1) := 6;
- Traffic_Light(Dir2) := 6;
- State := 2;
- TL_Check := Clock + 0.5;
- when 2 => -- green
- Traffic_Light(Dir1) := 1;
- Traffic_Light(Dir2) := 1;
- State := 3;
- TL_Check := Clock + 5.1;
- when 3 => -- amber
- Traffic_Light(Dir1) := 2;
- Traffic_Light(Dir2) := 2;
- State := 4;
- TL_Check := Clock + 3.1;
- when 4 => -- red
- Traffic_Light(Dir1) := 4;
- Traffic_Light(Dir2) := 4;
- State := 1;
- TL_Check := Clock + 0.1;
- if (Tl_Flag) then
- HC_TL := Clock + 50.0;
- else
- HC_TL2 := Clock + 50.0;
- end if;
- TL_Switch(TL_Flag);
- when others =>
- null;
- end case;
- end TL_State;
- procedure Ped_Cross is
- begin
- if (Pedestrian_Wait(North) = 1 or Pedestrian_Wait(South) = 1) or
- (Pedestrian_Wait(East) = 1 or Pedestrian_Wait(West) = 1) then
- for O in Direction_Octet'Range loop
- Pedestrian_Wait(O) := 0;
- Pedestrian_Light(O) := 1;
- PL_Check := Clock + 6.1;
- end loop;
- while (Clock <= PL_Check) loop
- null; -- do nothing while the lights for pedestrians stay green
- end loop;
- for O in Direction_Octet'Range loop
- Pedestrian_Light(O) := 2;
- end loop;
- end if;
- end Ped_Cross;
- task body P_Wait is
- begin
- loop
- if (Pedestrian_Light(North) /= 1 and Pedestrian_Light(South) /= 1 and Pedestrian_Light(East) /= 1 and Pedestrian_Light(West) /= 1) then
- if (Pedestrian_Button(North) = 1 or Pedestrian_Button(South) = 1 or Pedestrian_Button(East) = 1 or Pedestrian_Button(West) = 1) then
- for O in Direction_Octet'Range loop
- Pedestrian_Wait(O) := 1;
- end loop;
- HC_PL := Clock + 50.0;
- end if;
- end if;
- delay 0.1;
- end loop;
- end P_Wait;
- procedure EV_Check is
- begin
- if (Emergency_Vehicle_Sensor(North) = 1 or Emergency_Vehicle_Sensor(South) = 1) then
- if (Traffic_Light(North) = 1 or Traffic_Light(South) = 1) then
- while (Emergency_Vehicle_Sensor(North) = 1 or Emergency_Vehicle_Sensor(South) = 1) loop
- null; -- do nothing while ev is on green
- end loop;
- TL_Check := Clock + 10.0;
- elsif (Traffic_Light(East) = 4 and TL_Flag = false) then
- TL_Switch(TL_Flag);
- end if;
- elsif (Emergency_Vehicle_Sensor(East) = 1 or Emergency_Vehicle_Sensor(West) = 1) then
- if (Traffic_Light(East) = 1 or Traffic_Light(West) = 1) then
- while (Emergency_Vehicle_Sensor(East) = 1 or Emergency_Vehicle_Sensor(West) = 1) loop
- null; -- do nothing while ev is on green
- end loop;
- TL_Check := Clock + 10.0;
- elsif (Traffic_Light(North) = 4 and TL_Flag) then
- TL_Switch(TL_Flag);
- end if;
- end if;
- end EV_Check;
- begin
- loop
- for O in Direction_Octet'Range loop
- Traffic_Light(O) := 4;
- Pedestrian_Light(O) := 2;
- end loop;
- inner_loop := true;
- while (inner_loop) loop
- begin
- if (Traffic_Light(North) = 4 and Traffic_Light(West) = 4) then
- if (Emergency_Vehicle_Sensor(North) = 1 or Emergency_Vehicle_Sensor(South) = 1 or
- Emergency_Vehicle_Sensor(East) = 1 or Emergency_Vehicle_Sensor(West) = 1) then -- prioritise ev if true.
- EV_Check;
- elsif (Clock > HC_PL) then -- prioritise ped crossing if true.
- Ped_Cross;
- elsif (Clock > HC_TL) then -- prioritise n/s lights if true.
- TL_Switch(false);
- elsif (Clock > HC_TL2) then -- prioritise e/w lights if true.
- TL_Switch(true);
- else
- Ped_Cross;
- end if;
- end if;
- EV_Check;
- if (Clock >= TL_Check and Pedestrian_Light(North) /= 1) then
- TL_State(Dir1, Dir2, State);
- end if;
- end;
- delay FRAME_LOOP;
- end loop;
- end loop;
- end Controller;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement