/***************************************************************************
 Copyright 1998 MBARI                                                    
****************************************************************************
Summary  : Integrated viewing routines                                  
Filename : ControlSource.h                                              
Author   : Michael B. Matthews                                          
Project  : Tiburon ROV                                                  
Version  : 3.8                                                          
Created  : 24.4.98                                                     
Modified :                                                          
Archived :                                                            
***************************************************************************/

#ifndef _CONTROL_SOURCE_H
#define _CONTROL_SOURCE_H

#include <mbariTypes.h>
#include "DmControlSource.h"
#include "ServerControlSource.h"
#include "String.h"

class SetPoint;
class Camera;
class ControlSourceInterface;
class ControlSource;
class PTControlSource;
class CameraControlSource;

typedef DmControlSource::Message IviewMessage;
typedef DmControlSource::PeriodicRequest PeriodicRequest;
typedef DmControlSource::AperiodicRequest AperiodicRequest;



/*****************************************************************************
Class   : C O N T R O L  S O U R C E  I N T E R F A C E                 
Purpose : Container class for ControlSource
Notes   : This class is derived from ServerControlSource which is derived from
        : DmControlSource. Its purpose is to provide a link between 
        : CamerasControlSource or PTControlSource and ServerControlSource.
******************************************************************************/

#define MAX_NUMBER_CONTROL_SOURCES 32
#define CONTROL_SOURCE_TIMEOUT 50	// times out after 2.5 seconds

class ControlSourceInterface : public ServerControlSource
{
public:
  String controlName;
  ControlSource* controlSource;

  ControlSourceInterface(Int i, SEM_ID wakeupSem);
  ~ControlSourceInterface() { Remove(); }

  Void activate(AperiodicRequest* request);
  Void deactivate();
  Void processAperiodicRequest(AperiodicRequest* request, RequestStatus* status);
  Void processPeriodicRequest(PeriodicRequest* request, RequestStatus* status);
  Void Remove();
};
 


/******************************************************************************
Class   : C O N T R O L  S O U R C E                                   
Purpose : Pure virtual base class for all control sources 
Notes   : Derived classes are PTControlSource and CameraControlSource
******************************************************************************/

class ControlSource
{
 public:
  Word mode;			
  Word deviceMap;	
  Word axisMap;
  IviewDevice refDevice;
  IviewMessage msg;
  ControlSourceInterface* controlSourceInterface;

  ControlSource(ControlSourceInterface* cs);
  virtual ~ControlSource() { }

  virtual Int deviceRequest(AperiodicRequest* request) = 0;
  virtual Void periodicUpdate(PeriodicRequest* request) = 0;
  virtual Void Update() = 0;
  virtual Void Remove() = 0;

  Void Reference(IviewDevice device) { refDevice = device; }
  IviewDevice Reference() { return refDevice; }
};



/******************************************************************************
Class   : P T  C O N T R O L  S O U R C E                                 
Purpose : Pan/tilt control source object class
Notes   : 
******************************************************************************/

#define DEFAULT_SENSITIVITY 0.75

class PTControlSource : public ControlSource
{
public:
  MBool panoramicMode;
  Flt32 uPan, uTilt;	
  IviewSensitivity sensitivity;

  SetPoint* setPoint;	

  PTControlSource(ControlSourceInterface* cs, AperiodicRequest* request);
  ~PTControlSource();

  Int deviceRequest(AperiodicRequest* request);
  Void periodicUpdate(PeriodicRequest* request);
  Void Update();
  Void Remove();
  Void setPanoramic(Word devices = 0);
  Void resetPanoramic(Word devices = 0);
  SetPoint* deviceSetPoint(IviewDevice device);
};



/******************************************************************************
Class   : C A M E R A  C O N T R O L  S O U R C E               
Purpose : Camera control source 
Notes   : 
******************************************************************************/

#define FOCUS_ENABLE_THRESHOLD 	0.1
#define FOCUS_ENABLE_HYSTERESIS	0.2

class CameraControlSource : public ControlSource
{
public:
  Flt32 uZoom, uIris, uFocus;	// control input
  MBool focusEnable;		// focus capture enabled
  
  Camera* camera;

  CameraControlSource(ControlSourceInterface* cs, AperiodicRequest* request);
  ~CameraControlSource() { Remove(); }

  Int deviceRequest(AperiodicRequest* request);
  Void periodicUpdate(PeriodicRequest* request);
  Void Update();
  Void Remove();
  MBool updateFocusEnable();
  Flt32 Focus() { return uFocus; }
};



#endif




