File : laser.adb


----------------------------------------------------------------------------
--
--                              -*- Mode: Ada -*-
--
-- Filename        : Laser.adb
-- Description     : All you need to read the laser range finder on the B14
-- Author          : Uwe R. Zimmer
-- Created On      : Wed Oct 15 16:04:34 1997
-- Last Modified By:
-- Last Modified On:
-- Update Count    :
-- Status          :
--
----------------------------------------------------------------------------

----------------------------------------------------------------------------
--
-- Imports
--
----------------------------------------------------------------------------

with Ada.Real_Time; use Ada.Real_Time;
with Interfaces.C;  use Interfaces.C;
with Laser_driver;  use Laser_driver;

----------------------------------------------------------------------------
--
-- Package Laser
--
----------------------------------------------------------------------------

package body Laser is

   ----------------------------------------------------------------------------
   --
   -- Variables global for package Laser
   --
   ----------------------------------------------------------------------------

   LaserInitialized : Boolean := False;

   NoOfClients  : Natural := 0;
   NoOfSuspends : Natural := 0;

   ----------------------------------------------------------------------------
   --
   -- Protected Monitor LaserInterface;
   --
   ----------------------------------------------------------------------------

   protected body LaserInterface is

      procedure InitLaser is

         LaserIndex : Positive range FirstLaserReading .. LastLaserReading :=
           FirstLaserReading;

      begin
         if not LaserInitialized then

            for LaserIndex in LaserReadingRange loop
               ActualLaserAngles (LaserIndex) :=
                 Degrees (Float (FirstLaserAngle) +
                          Float (LaserIndex - LaserReadingRange'First) *
                          (Float (LastLaserAngle - FirstLaserAngle) /
                           Float (LaserReadingRange'Last -
                                  LaserReadingRange'First)));
            end loop;

            LaserDriverInterface.InitLaserDriver;
            LaserMonitor.BlockTask;
            LaserInitialized := True;
         end if;
         NoOfClients := NoOfClients + 1;
      end InitLaser;

      entry ShutdownLaser when LaserInitialized is
      begin
         NoOfClients := NoOfClients - 1;
         if NoOfClients = 0 then
            LaserDriverInterface.ShutdownLaserDriver;
            LaserInitialized := False;
         end if;
      end ShutdownLaser;

      entry SuspendSensing when LaserInitialized is
      begin
         NoOfSuspends := NoOfSuspends + 1;
         if NoOfSuspends >= NoOfClients then
            LaserDriverInterface.SuspendLaserDriver;
         end if;
      end SuspendSensing;

      entry ResumeSensing when LaserInitialized is
      begin
         NoOfSuspends := NoOfSuspends - 1;
         if NoOfSuspends < NoOfClients then
            LaserDriverInterface.ResumeLaserDriver;
         end if;
      end ResumeSensing;

      entry GetCurrentLaserStatus (Readings : out LaserStatus) when
           LaserInitialized is
      begin
         LaserDriverInterface.GetMostRecentLaserScan (Readings);
      end GetCurrentLaserStatus;

      entry GetCurrentLaserTimeStamp (TimeStamp : out Time) when
           LaserInitialized is
      begin
         LaserDriverInterface.GetMostRecentLaserTimeStamp (TimeStamp);
      end GetCurrentLaserTimeStamp;

      entry WaitforNewLaserData when LaserInitialized is
      begin
         requeue LaserMonitor.BlockTask;
      end WaitforNewLaserData;

   end LaserInterface;

end Laser;