--------------------------------------------------------------------------- -- -- Filename: -- -- controllers.adb -- -- Description: -- -- XGC Ada demo -- -- Credits: -- -- Copyright (C) 1997, ESTEC - ESA -- Copyright (c) 1999, Chris Nettleton Software -- -- License: -- -- Permission to use copy, modify, and distribute this software for any -- purpose without fee is hereby granted. This software is provided -- "as is", without any express or implied warranty. -- -- Revision: -- -- $Id: $ -- --------------------------------------------------------------------------- with Ada.Real_Time; package body Controllers is use Ada.Real_Time; T0 : Time := Clock; -- Time origin ------------------------ -- Temperature_Sensor -- ------------------------ protected body Temperature_Sensor is procedure Change (T : in Temperature) is begin Temp := Temp + T; end Change; procedure Get (T : out Temperature) is begin T := Temp; end Get; procedure Sink (P : Duration) is begin Temp := Temp + Cooling_Rate * (Ambient_Temp - Temp) * Temperature (P); end Sink; end Temperature_Sensor; ------------ -- Heater -- ------------ protected body Heater is procedure Switch_On is begin State := On; end Switch_On; procedure Switch_Off is begin State := Off; end Switch_Off; function Get_State return Heater_State is begin return State; end Get_State; end Heater; ---------------------------- -- Temperature_Controller -- ---------------------------- task body Temperature_Controller is Period : constant Time_Span := To_Time_Span (0.1); Next_Time : Time := T0; Temp : Temperature; begin loop Next_Time := Next_Time + Period; delay until Next_Time; Sensors (n).Get (Temp); if Modes (n) = On then Heaters (n).Switch_On; elsif Modes (n) = Off then Heaters (n).Switch_Off; elsif Temp > Range_Database (n).Max then Heaters (n).Switch_Off; elsif Temp < Range_Database (n).Min then Heaters (n).Switch_On; end if; end loop; end Temperature_Controller; ---------------------- -- Heater_Simulator -- ---------------------- task body Heater_Simulator is Period_Value : constant := 0.05; Period : constant Time_Span := To_Time_Span (Period_Value); Next_Time : Time := T0; begin loop Next_Time := Next_Time + Period; delay until Next_Time; if Heaters (n).Get_State = On then declare Delta_Temperature : Temperature := Heating_Rate * Period_Value; begin Sensors (n).Change (Delta_Temperature); end; end if; end loop; end Heater_Simulator; --------------- -- Heat_Sink -- --------------- -- Removes heat at a rate that depends on temperature difference task body Heat_Sink is Period : constant Time_Span := To_Time_Span (0.09); Next_Time : Time := T0; begin loop Next_Time := Next_Time + Period; delay until Next_Time; Sensors (n).Sink (0.09); end loop; end Heat_Sink; end Controllers;