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

#ifndef __CARL_IF_H
#define __CARL_IF_H

#include "TaskInterface.h"

#include "DeviceIF.h"
#include "TimeIF.h"

#define CARL_IFServerName "CARL_IFServer"

class CARL_IF : public TaskInterface {

  friend class CARL_IF_SK;

  public:

  // Forward declarations of public structures
  struct Status;
  
  ////////////////////////////////////////////////////////////
  // Events generated by CARL
  enum Event {
    MessagesWaiting
  };

  enum Constants {
    SomeConstant = 1
  };

  // Target mean light level 
  enum IrisCmds {
    Home = 0,
    Halt,
    FStop,
    AutoFS
  };

  
  typedef char Clipname[120];
  
  struct Status {
    // AJA KiPro stuff
    short recorder_alive;
    short data_mode;
    short recording;
    short available_media;
    float timecode;
    // Modtronix stuff
    short camera_power;
    short recorder_power;
    short ctd_power;
    short lights_on;
    short temperature;
    short humidity;
    short fwd_water_alarm;
    short aft_water_alarm;
    float auto_iris_target;
  };
  CARL_IF(const char *name, int timeout = 10);

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

  ~CARL_IF();

  // Use light level of zero to turn auto-iris function off.
  //
  DeviceIF::Status auto_iris(float target_light_level);

  DeviceIF::Status iris_control(CARL_IF::IrisCmds cmd, short fstop);

  // Returns true if motor is moving
  //
  Boolean motor_action();

  // Returns true if the recorder is recording
  //
  Boolean is_recording();

  DeviceIF::Status get_env_data(float *temp, float *humidity, float *fwd_h2o, float *aft_h20, short *h2o_alarm);

  ///////////////////////////////////////////////////////////////////
  // Returns True if the device is online and initialized.
  //
  Boolean aja_ready();

  ///////////////////////////////////////////////////////////////////
  // Turn the camera bus power on
  //
  DeviceIF::Status camera_bus_on();

  ///////////////////////////////////////////////////////////////////
  // Turn the camera bus power off
  //
  DeviceIF::Status camera_bus_off();

  Boolean is_camera_on();

  ///////////////////////////////////////////////////////////////////
  // Turn the recorder on
  //
  DeviceIF::Status recorder_on();

  ///////////////////////////////////////////////////////////////////
  // Turn the recorder off
  //
  DeviceIF::Status recorder_off();

  ///////////////////////////////////////////////////////////////////
  // Turn the lights on
  //
  DeviceIF::Status camera_lights_on();

  ///////////////////////////////////////////////////////////////////
  // Turn the lights off
  //
  DeviceIF::Status camera_lights_off();

  short are_lights_on();

  ///////////////////////////////////////////////////////////////////
  // Set the light level (0 to 100)
  //
  DeviceIF::Status light_level(short level);

  ///////////////////////////////////////////////////////////////////
  // Turn the ctd on
  //
  DeviceIF::Status ctd_on();

  ///////////////////////////////////////////////////////////////////
  // Turn the ctd off
  //
  DeviceIF::Status ctd_off();

  Boolean is_ctd_on();

  ///////////////////////////////////////////////////////////////////
  // Get the CARL status
  //
  DeviceIF::Status get_status(CARL_IF::Status *status);

  ///////////////////////////////////////////////////////////////////
  // Start recording
  //
  DeviceIF::Status start_recording();

  ///////////////////////////////////////////////////////////////////
  // Stop recording on the Ki Pro
  //
  DeviceIF::Status stop_recording();

  ///////////////////////////////////////////////////////////////////
  // Get the Ki Pro time
  //
  DeviceIF::Status recorder_time(TimeIF::TimeSpec *recorder_time);

  ///////////////////////////////////////////////////////////////////
  // Get the Ki Pro timecode
  //
  DeviceIF::Status get_timecode(float *timecode);

  ///////////////////////////////////////////////////////////////////
  // Get the remaining media from the Ki Pro
  //
  DeviceIF::Status available_media(short *media);

  ///////////////////////////////////////////////////////////////////
  // Set the Ki Pro clip name
  //
  DeviceIF::Status set_clipname(CARL_IF::Clipname clipname);

  ///////////////////////////////////////////////////////////////////
  // Sync the Ki Pro time to the MVC time
  //
  DeviceIF::Status sync_time();

  ///////////////////////////////////////////////////////////////////
  // Put the Aja into record mode
  //
  DeviceIF::Status record_mode();

  ///////////////////////////////////////////////////////////////////
  // Put the Aja into data mode
  //
  DeviceIF::Status data_mode();

  
  protected:

  // Message codes for each method
  enum CARL_IFMsgCode {
    Auto_irisMsgCode,
    Iris_controlMsgCode,
    Motor_actionMsgCode,
    Is_recordingMsgCode,
    Get_env_dataMsgCode,
    Aja_readyMsgCode,
    Camera_bus_onMsgCode,
    Camera_bus_offMsgCode,
    Is_camera_onMsgCode,
    Recorder_onMsgCode,
    Recorder_offMsgCode,
    Camera_lights_onMsgCode,
    Camera_lights_offMsgCode,
    Are_lights_onMsgCode,
    Light_levelMsgCode,
    Ctd_onMsgCode,
    Ctd_offMsgCode,
    Is_ctd_onMsgCode,
    Get_statusMsgCode,
    Start_recordingMsgCode,
    Stop_recordingMsgCode,
    Recorder_timeMsgCode,
    Get_timecodeMsgCode,
    Available_mediaMsgCode,
    Set_clipnameMsgCode,
    Sync_timeMsgCode,
    Record_modeMsgCode,
    Data_modeMsgCode
  };

  // Define message structure for each method
  struct Auto_irisMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float target_light_level;
  
  } _auto_irisMsg;

  struct Iris_controlMsg : Request, Reply {
    DeviceIF::Status returnVal;
    CARL_IF::IrisCmds cmd;
    short fstop;
  
  } _iris_controlMsg;

  struct Motor_actionMsg : Request, Reply {
    Boolean returnVal;
  
  } _motor_actionMsg;

  struct Is_recordingMsg : Request, Reply {
    Boolean returnVal;
  
  } _is_recordingMsg;

  struct Get_env_dataMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float temp;
    float humidity;
    float fwd_h2o;
    float aft_h20;
    short h2o_alarm;
  
  } _get_env_dataMsg;

  struct Aja_readyMsg : Request, Reply {
    Boolean returnVal;
  
  } _aja_readyMsg;

  struct Camera_bus_onMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _camera_bus_onMsg;

  struct Camera_bus_offMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _camera_bus_offMsg;

  struct Is_camera_onMsg : Request, Reply {
    Boolean returnVal;
  
  } _is_camera_onMsg;

  struct Recorder_onMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _recorder_onMsg;

  struct Recorder_offMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _recorder_offMsg;

  struct Camera_lights_onMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _camera_lights_onMsg;

  struct Camera_lights_offMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _camera_lights_offMsg;

  struct Are_lights_onMsg : Request, Reply {
    short returnVal;
  
  } _are_lights_onMsg;

  struct Light_levelMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short level;
  
  } _light_levelMsg;

  struct Ctd_onMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _ctd_onMsg;

  struct Ctd_offMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _ctd_offMsg;

  struct Is_ctd_onMsg : Request, Reply {
    Boolean returnVal;
  
  } _is_ctd_onMsg;

  struct Get_statusMsg : Request, Reply {
    DeviceIF::Status returnVal;
    CARL_IF::Status status;
  
  } _get_statusMsg;

  struct Start_recordingMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _start_recordingMsg;

  struct Stop_recordingMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _stop_recordingMsg;

  struct Recorder_timeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    TimeIF::TimeSpec recorder_time;
  
  } _recorder_timeMsg;

  struct Get_timecodeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float timecode;
  
  } _get_timecodeMsg;

  struct Available_mediaMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short media;
  
  } _available_mediaMsg;

  struct Set_clipnameMsg : Request, Reply {
    DeviceIF::Status returnVal;
    CARL_IF::Clipname clipname;
  
  } _set_clipnameMsg;

  struct Sync_timeMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sync_timeMsg;

  struct Record_modeMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _record_modeMsg;

  struct Data_modeMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _data_modeMsg;

};

#endif

