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

#ifndef __WatchdogIF_H
#define __WatchdogIF_H

#include "TaskInterface.h"

#include "InstrumentIF.h"

#define WatchdogIFServerName "WatchdogIFServer"

class WatchdogIF : public InstrumentIF {

  friend class WatchdogIF_SK;

  public:

  // Forward declarations of public structures
  struct WD_Time_Struct;
  struct WD_Data;
  
  enum Event {
    Online,
    Offline,
    CommsFailure
  };

  ////////////////////////////////////////////////////////////
  // Defined Mission Statuses 
  enum MissionStatus {
    None,
    Mission_Running,
    Recover
  };

  enum WD_Status {
    Watchdog_Running,
    No_Mission,
    Waiting_for_Recovery
  };

  enum Antenna_Status {
    Up,
    Down,
    Rising,
    Lowering
  };

  enum ARB_MSG {
    No_ARB_Msg,
    Surface
  };

  
  
  struct WD_Time_Struct {
    short hh;
    short mm;
    short ss;
  };
  struct WD_Data {
    char wd_error_status;
    char wd_status;
    WatchdogIF::WD_Time_Struct keepalive_time;
    long sphere_temp;
    long sphere_pressure;
    char antenna_status;
    char arb_msg;
  };
  WatchdogIF(const char *name, int timeout = 10);

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

  ~WatchdogIF();

  ///////////////////////////////////////////////////////////
  // Watchdog KeepAlive Function
  // probably part of a periodic callback 
  // but keep the IF just in case
  // sends a command of the form: "$WD K hh.mm.ss
  // overload these functions so you can just give it minutes
  DeviceIF::Status keepAlive(WatchdogIF::WD_Time_Struct *time_struct);

  DeviceIF::Status keepAlive(short time_in_minutes);

  // overload these functions so you can just give it minutes
  DeviceIF::Status Deadman_On(WatchdogIF::WD_Time_Struct *time_struct);

  DeviceIF::Status Deadman_On(short time_in_minutes);

  DeviceIF::Status Deadman_On();

  DeviceIF::Status Deadman_Off();

  ///////////////////////////////////////////////////////////
  // Watchdog raiseAntenna Function
  DeviceIF::Status raiseAntenna();

  ///////////////////////////////////////////////////////////
  DeviceIF::Status lowerAntenna();

  DeviceIF::Status resetMVC();

  ///////////////////////////////////////////////////////////
  DeviceIF::Status rebootMVC();

  ///////////////////////////////////////////////////////////
  DeviceIF::Status sleepMVC();

  
  protected:

  // Message codes for each method
  enum WatchdogIFMsgCode {
    KeepAliveMsgCode = 8,
    KeepAlive01MsgCode,
    Deadman_OnMsgCode,
    Deadman_On01MsgCode,
    Deadman_On02MsgCode,
    Deadman_OffMsgCode,
    RaiseAntennaMsgCode,
    LowerAntennaMsgCode,
    ResetMVCMsgCode,
    RebootMVCMsgCode,
    SleepMVCMsgCode
  };

  // Define message structure for each method
  struct KeepAliveMsg : Request, Reply {
    DeviceIF::Status returnVal;
    WatchdogIF::WD_Time_Struct time_struct;
  
  } _keepAliveMsg;

  struct KeepAlive01Msg : Request, Reply {
    DeviceIF::Status returnVal;
    short time_in_minutes;
  
  } _keepAlive01Msg;

  struct Deadman_OnMsg : Request, Reply {
    DeviceIF::Status returnVal;
    WatchdogIF::WD_Time_Struct time_struct;
  
  } _Deadman_OnMsg;

  struct Deadman_On01Msg : Request, Reply {
    DeviceIF::Status returnVal;
    short time_in_minutes;
  
  } _Deadman_On01Msg;

  struct Deadman_On02Msg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _Deadman_On02Msg;

  struct Deadman_OffMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _Deadman_OffMsg;

  struct RaiseAntennaMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _raiseAntennaMsg;

  struct LowerAntennaMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _lowerAntennaMsg;

  struct ResetMVCMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _resetMVCMsg;

  struct RebootMVCMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _rebootMVCMsg;

  struct SleepMVCMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sleepMVCMsg;

};

#endif

