/*
********************************************************
Copyright 2000 MBARI.
MBARI Proprietary Information. All rights reserved.
NOTE: This file is automatically generated.
DO NOT MODIFY.
********************************************************
*/

#ifndef __NikonIF_H
#define __NikonIF_H

#include "TaskInterface.h"

#include "InstrumentIF.h"

#define NikonIFServerName "NikonIFServer"

class NikonIF : public InstrumentIF {

  friend class NikonIF_SK;

  public:

  
  
  
  NikonIF(const char *name, int timeout = 10);

  NikonIF(const char *name, const char *serverName, int timeout = 10);

  ~NikonIF();

  // Start/stop image acquisition.
  DeviceIF::Status startCamera(Boolean bUpdate);

  DeviceIF::Status stopCamera(Boolean bUpdate);

  // turn laser power on/off
  DeviceIF::Status laserON(Boolean bUpdate);

  DeviceIF::Status laserOFF(Boolean bUpdate);

  // Simply test if the server has a connection to the camera via USB
  DeviceIF::Status testCameraConnection(Boolean *state);

  // set trigger period in milliseconds
  DeviceIF::Status setCameraInterval(long milliseconds);

  // synchronize time on the host machine. this time is used in the exif data.  
  DeviceIF::Status setTime(Boolean bUpdate);

  
  protected:

  // Message codes for each method
  enum NikonIFMsgCode {
    StartCameraMsgCode = 8,
    StopCameraMsgCode,
    LaserONMsgCode,
    LaserOFFMsgCode,
    TestCameraConnectionMsgCode,
    SetCameraIntervalMsgCode,
    SetTimeMsgCode
  };

  // Define message structure for each method
  struct StartCameraMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean bUpdate;
  
  } _startCameraMsg;

  struct StopCameraMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean bUpdate;
  
  } _stopCameraMsg;

  struct LaserONMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean bUpdate;
  
  } _laserONMsg;

  struct LaserOFFMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean bUpdate;
  
  } _laserOFFMsg;

  struct TestCameraConnectionMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean state;
  
  } _testCameraConnectionMsg;

  struct SetCameraIntervalMsg : Request, Reply {
    DeviceIF::Status returnVal;
    long milliseconds;
  
  } _setCameraIntervalMsg;

  struct SetTimeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean bUpdate;
  
  } _setTimeMsg;

};

#endif

