1. -- 
  2. -- Uwe R. Zimmer, Australia, 2013 
  3. -- 
  4.  
  5. with Queues_Pack_Protected_Generic; 
  6. with Ada.Text_IO; use Ada.Text_IO; 
  7.  
  8. procedure Queues_Test_Protected_Generic is 
  9.  
  10.    type Sequence      is (Ready, Set, Go); 
  11.    type Flight_States is (Take_Off, Cruising, Landing); 
  12.  
  13.    package Avionics_Queue_Pack is 
  14.      new Queues_Pack_Protected_Generic 
  15.        (Element => Sequence, Queue_Enum => Flight_States, Queue_Size => 2); 
  16.    use Avionics_Queue_Pack; 
  17.  
  18.    Queue : Protected_Queue; 
  19.  
  20.    task type Avionics_Module is 
  21.       entry Provide_State (State : Flight_States); 
  22.    end Avionics_Module; 
  23.  
  24.    Avionics : array (Flight_States) of Avionics_Module; 
  25.  
  26.    task body Avionics_Module is 
  27.  
  28.       Local_State : Flight_States; 
  29.       Item        : Sequence; 
  30.  
  31.    begin 
  32.       accept Provide_State (State : Flight_States) do 
  33.          Local_State := State; 
  34.       end Provide_State; 
  35.       for Order in Sequence loop 
  36.          Queue.Dequeue (Local_State) (Item); 
  37.          Put_Line (Flight_States'Image (Local_State) & " says: " & Sequence'Image (Item)); 
  38.       end loop; 
  39.       Put_Line (Flight_States'Image (Local_State) & " queue is empty on exit: " & Boolean'Image (Queue.Is_Empty (Local_State))); 
  40.    end Avionics_Module; 
  41.  
  42. begin 
  43.    for State in Flight_States loop 
  44.       Avionics (State).Provide_State (State); 
  45.    end loop; 
  46.    for Order in Sequence loop 
  47.       Queue.Enqueue (Order); 
  48.       Put_Line ("Item added to queue: " & Sequence'Image (Order)); 
  49.    end loop; 
  50. end Queues_Test_Protected_Generic;