#ifndef _CAMERADMIF_H
#define _CAMERADMIF_H

#include "mbari/types.h"
#include "DataManager.h"
#include "DmGroup.h"
#include "ErrorHandler.h"
#include "CameraDmObjects.h"
#include "CameraIF.h"

/*
CLASS 
CameraServerDmIF

DESCRIPTION
Interface to Data Manager for Camera server. Retrieves client-requested
values from Data Manager. Writes current camera values to Data Manager.

AUTHOR
Tom O'Reilly
*/
class CameraServerDmIF : public ErrorHandler
{
  public:

  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] wakeupSem:  Wakeup semaphore for aperiodic items
  CameraServerDmIF(SEM_ID wakeupSem);

  ~CameraServerDmIF();



  ///////////////////////////////////////////////////////////////////
  // Read client-requested gain value. Returns 0 on success, -1 on error.
  // Error message is accessed with ErrorHandler::errorMsg() method.
  // [output] value: Client-Requested value
  // [output] t: Time of request
  int readGainRequest(CameraGain *value, DM_Time *t);


  ///////////////////////////////////////////////////////////////////
  // Read colorbars request. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int readColorBarsRequest(MBool *value, DM_Time *t);

  ///////////////////////////////////////////////////////////////////
  // Read client-requested zoom value. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int readZoomRequest(Int16 *value, DM_Time *t);

  ///////////////////////////////////////////////////////////////////
  // Read client-requested focus value. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int readFocusRequest(Int16 *value, DM_Time *t);

  ///////////////////////////////////////////////////////////////////
  // Read client-requested iris value. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int readIrisRequest(Int16 *value, DM_Time *t);

  ///////////////////////////////////////////////////////////////////
  // Write current gain value. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int writeGainStatus(CameraGain value);

  ///////////////////////////////////////////////////////////////////
  // Write current colorbars status. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int writeColorBarsStatus(MBool value);

  ///////////////////////////////////////////////////////////////////
  // Write current zoom value. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int writeZoomStatus(Int16 value);

  ///////////////////////////////////////////////////////////////////
  // Write current focus value. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int writeFocusStatus(Int16 value);

  ///////////////////////////////////////////////////////////////////
  // Write current iris value. Returns 0 on success, -1 on error.
  // Error message is accessed with errorMsg() method.
  int writeIrisStatus(Int16 value);


  ///////////////////////////////////////////////////////////////////
  // Following semTake(), returns TRUE if new gain request has been 
  // made, else returns FALSE.
  MBool newGainRequest();

  ///////////////////////////////////////////////////////////////////
  // Following semTake(), returns TRUE if new colorbars request has been 
  // made, else returns FALSE.
  MBool newColorBarsRequest();

  protected:

  ///////////////////////////////////////////////////////////////////
  // Start providers and consumers. Returns 0 on success, -1 on error.
  int start();
  
  CameraDmObjects *_dmObjects;
  
  static struct timezone _timezone;
  static DM_Time _t;

  static Errno _errno;
  static char _errorBuf[errorMsgSize];

  SEM_ID _wakeupSem;
  MBool _localDmObjects;
  DmGroup *_dmGroup;
};


#endif







