Advertisement
Guest User

Untitled

a guest
Apr 4th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 5.21 KB | None | 0 0
  1. with HWIF, HWIF_Types, Ada.Calendar;
  2. use HWIF, HWIF_Types, Ada.Calendar;
  3.  
  4. procedure Controller is
  5.  
  6.    Tl_Flag     : Boolean  := true; -- true := North/South; false := East/West
  7.    Dir1, Dir2  : Direction;
  8.    State       : Integer  := 4;
  9.  
  10.    HC_TL, HC_TL2, HC_PL, PL_Check : Time;
  11.    TL_Check    : Time := Clock + 1.0;
  12.  
  13.    inner_loop  : Boolean  := false;
  14.    FRAME_LOOP  : constant Duration := 2.0;
  15.    
  16.    task P_Wait;
  17.  
  18.    procedure TL_Switch(Flag : Boolean) is
  19.    begin
  20.       if (Flag) then
  21.          Tl_Flag := false;
  22.          Dir1    := East;
  23.          Dir2    := West;
  24.       else
  25.          Tl_Flag := true;
  26.          Dir1    := North;
  27.          Dir2    := South;
  28.       end if;
  29.    end TL_Switch;
  30.  
  31.    procedure TL_State(Dir1 : Direction; Dir2 : Direction; State1 : Integer) is  
  32.    begin
  33.       case (State1) is
  34.          when 1 => -- amber-red
  35.             Traffic_Light(Dir1) := 6;
  36.             Traffic_Light(Dir2) := 6;
  37.             State := 2;
  38.             TL_Check := Clock + 0.5;
  39.          when 2 => -- green
  40.             Traffic_Light(Dir1) := 1;
  41.             Traffic_Light(Dir2) := 1;
  42.             State := 3;
  43.             TL_Check := Clock + 5.1;
  44.          when 3 => -- amber
  45.             Traffic_Light(Dir1) := 2;
  46.             Traffic_Light(Dir2) := 2;
  47.             State := 4;
  48.             TL_Check := Clock + 3.1;
  49.          when 4 => -- red
  50.             Traffic_Light(Dir1) := 4;
  51.             Traffic_Light(Dir2) := 4;
  52.             State := 1;
  53.             TL_Check := Clock + 0.1;
  54.             if (Tl_Flag) then
  55.                HC_TL := Clock + 50.0;
  56.             else
  57.                HC_TL2 := Clock + 50.0;
  58.             end if;
  59.             TL_Switch(TL_Flag);
  60.          when others =>
  61.             null;
  62.       end case;
  63.    end TL_State;
  64.  
  65.    procedure Ped_Cross is
  66.    begin
  67.       if (Pedestrian_Wait(North) = 1 or Pedestrian_Wait(South) = 1) or
  68.         (Pedestrian_Wait(East) = 1 or Pedestrian_Wait(West) = 1) then
  69.          for O in Direction_Octet'Range loop
  70.             Pedestrian_Wait(O)  := 0;
  71.             Pedestrian_Light(O) := 1;
  72.             PL_Check := Clock + 6.1;
  73.          end loop;
  74.          while (Clock <= PL_Check) loop
  75.             null; -- do nothing while the lights for pedestrians stay green
  76.          end loop;
  77.          for O in Direction_Octet'Range loop
  78.             Pedestrian_Light(O) := 2;
  79.          end loop;
  80.       end if;
  81.    end Ped_Cross;
  82.  
  83.    task body P_Wait is
  84.    begin
  85.       loop
  86.          if (Pedestrian_Light(North) /= 1 and Pedestrian_Light(South) /= 1 and Pedestrian_Light(East) /= 1 and Pedestrian_Light(West) /= 1) then
  87.             if (Pedestrian_Button(North) = 1 or Pedestrian_Button(South) = 1 or Pedestrian_Button(East) = 1 or Pedestrian_Button(West) = 1) then
  88.                for O in Direction_Octet'Range loop
  89.                   Pedestrian_Wait(O)  := 1;
  90.                end loop;
  91.                HC_PL := Clock + 50.0;
  92.             end if;
  93.          end if;
  94.          delay 0.1;
  95.       end loop;
  96.    end P_Wait;
  97.  
  98.    procedure EV_Check is
  99.    begin
  100.       if (Emergency_Vehicle_Sensor(North) = 1 or Emergency_Vehicle_Sensor(South) = 1) then
  101.          if (Traffic_Light(North) = 1 or Traffic_Light(South) = 1) then
  102.             while (Emergency_Vehicle_Sensor(North) = 1 or Emergency_Vehicle_Sensor(South) = 1) loop
  103.                null; -- do nothing while ev is on green
  104.             end loop;
  105.             TL_Check := Clock + 10.0;
  106.          elsif (Traffic_Light(East) = 4 and TL_Flag = false) then
  107.             TL_Switch(TL_Flag);
  108.          end if;
  109.       elsif (Emergency_Vehicle_Sensor(East) = 1 or Emergency_Vehicle_Sensor(West) = 1) then
  110.          if (Traffic_Light(East) = 1 or Traffic_Light(West) = 1) then
  111.             while (Emergency_Vehicle_Sensor(East) = 1 or Emergency_Vehicle_Sensor(West) = 1) loop
  112.                null; -- do nothing while ev is on green
  113.             end loop;
  114.             TL_Check := Clock + 10.0;
  115.          elsif (Traffic_Light(North) = 4 and TL_Flag) then
  116.             TL_Switch(TL_Flag);
  117.          end if;
  118.       end if;
  119.    end EV_Check;
  120.  
  121. begin
  122.    loop
  123.       for O in Direction_Octet'Range loop
  124.          Traffic_Light(O)    := 4;
  125.          Pedestrian_Light(O) := 2;
  126.       end loop;
  127.       inner_loop := true;
  128.       while (inner_loop) loop
  129.          begin
  130.             if (Traffic_Light(North) = 4 and Traffic_Light(West) = 4) then
  131.                if (Emergency_Vehicle_Sensor(North) = 1 or Emergency_Vehicle_Sensor(South) = 1 or
  132.                      Emergency_Vehicle_Sensor(East) = 1 or Emergency_Vehicle_Sensor(West) = 1) then -- prioritise ev if true.
  133.                   EV_Check;
  134.                elsif (Clock > HC_PL) then -- prioritise ped crossing if true.
  135.                   Ped_Cross;
  136.                elsif (Clock > HC_TL) then -- prioritise n/s lights if true.
  137.                   TL_Switch(false);
  138.                elsif (Clock > HC_TL2) then -- prioritise e/w lights if true.
  139.                   TL_Switch(true);
  140.                else
  141.                   Ped_Cross;
  142.                end if;
  143.             end if;
  144.             EV_Check;
  145.             if (Clock >= TL_Check and Pedestrian_Light(North) /= 1) then
  146.                TL_State(Dir1, Dir2, State);
  147.             end if;
  148.          end;
  149.          delay FRAME_LOOP;
  150.       end loop;
  151.    end loop;
  152. end Controller;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement