package body Swarm_Structures is
protected body Vehicle_Comms is
procedure Send (Message : Inter_Vehicle_Messages) is
begin
Put (Sent_Messages, Message);
end Send;
procedure Push_Message (Message : Inter_Vehicle_Messages) is
begin
Put (Received_Messages, Message);
end Push_Message;
procedure Fetch_Message (Message : out Inter_Vehicle_Messages) is
begin
Get (Sent_Messages, Message);
end Fetch_Message;
function Has_Incoming_Messages return Boolean is
begin
return Element_Available (Received_Messages);
end Has_Incoming_Messages;
function Has_Outgoing_Messages return Boolean is
begin
return Element_Available (Sent_Messages);
end Has_Outgoing_Messages;
entry Receive (Message : out Inter_Vehicle_Messages) when Element_Available (Received_Messages) is
begin
Get (Received_Messages, Message);
end Receive;
end Vehicle_Comms;
protected body Vehicle_Controls is
procedure Set_Steering (V : Vector_3D) is
begin
Steering_Direction := V;
end Set_Steering;
procedure Set_Throttle (T : Throttle_T) is
begin
Throttle := T;
end Set_Throttle;
function Read_Steering return Vector_3D is
begin
return Steering_Direction;
end Read_Steering;
function Read_Throttle return Throttle_T is
begin
return Throttle;
end Read_Throttle;
end Vehicle_Controls;
function "<" (L, R : Distance_Entries) return Boolean is
begin
return L.Distance < R.Distance;
end "<";
protected body Swarm_Lock is
entry Lock_Write when not Write_Lock and then Readers = 0 is
begin
Write_Lock := True;
end Lock_Write;
entry Unlock_Write when Write_Lock is
begin
Write_Lock := False;
end Unlock_Write;
entry Lock_Read when not Write_Lock and then Lock_Write'Count = 0 is
begin
Readers := Readers + 1;
end Lock_Read;
entry Unlock_Read when Readers > 0 is
begin
Readers := Readers - 1;
end Unlock_Read;
end Swarm_Lock;
protected body Simulator_Tick is
entry Wait_For_Next_Tick when Trigger is
begin
Trigger := Wait_For_Next_Tick'Count > 0;
end Wait_For_Next_Tick;
procedure Tick is
begin
Trigger := True;
end Tick;
end Simulator_Tick;
end Swarm_Structures;