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

#ifndef __FuelCellIF_H
#define __FuelCellIF_H

#include "TaskInterface.h"

#include "InstrumentIF.h"

#define FuelCellIFServerName "FuelCellIFServer"

class FuelCellIF : public InstrumentIF {

  friend class FuelCellIF_SK;

  public:

  // Forward declarations of public structures
  struct FCC_status;
  struct FCC_data;
  
  ////////////////////////////////////////////////////////////
  // Events generated by FuelCell device driver
  // As specified on FCC Interface Document
  //  relevant FCC_STATUS Structure codes
  // These will be fleshed out later
  enum FCC_Cmd_Reply {
    FCC_ERR_OK = 1,
    FCC_ERR_INVALID_PARAM,
    FCC_ERR_NO_CLIENT,
    FCC_ERR_TOO_MANY_CLIENTS,
    FCC_ERR_COMM
  };

  enum Event {
    NewAlarm,
    ClearAlarm
  };

  enum FCC_Command {
    FCC_CMD_NONE = 0,
    FCC_CMD_START,
    FCC_CMD_STOP,
    FCC_CMD_OFFLINE,
    FCC_CMD_RESUME
  };

  enum FC_Control_State {
    FC_STATE_IDLE,
    FC_STATE_OFFLINE,
    FC_STATE_RAMPING,
    FC_STATE_ONLINE
  };

  
  
  struct FCC_status {
    FuelCellIF::FC_Control_State fc_control_state;
    long health;
    short FC_remaining_kwh;
    short RB_remaining_wh;
    char BIT_status;
    char BIT_result;
  };
  struct FCC_data {
    short elapsed_time;
    short anolyte_pump_a_current;
    short anolyte_pump_b_current;
    short catholyte_pump_current;
    short peroxide_pump_current;
    short anolyte_temp;
    short catholyte_temp;
    short fwd_peroxide_temp;
    short aft_peroxide_temp;
    short stack_voltage;
    short stack_current;
    short battery_voltage;
    short battery_current;
    short peroxide_used;
    short v_setpoint;
    short makeup_injection_count;
    short base_injection_duration;
  };
  FuelCellIF(const char *name, int timeout = 10);

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

  ~FuelCellIF();

  // Below are Commands that can be issued to the FCC in the form of a 
  // send_FCC_command function call;
  ///////////////////////////////////////////////////////////////////
  // Start generating power
  DeviceIF::Status start();

  ///////////////////////////////////////////////////////////////////
  // Stop generating power
  DeviceIF::Status stop();

  // Tkae FCC offline (?)
  DeviceIF::Status offline();

  ///////////////////////////////////////////////////////////////////
  // Resume FCC
  DeviceIF::Status resume();

  ///////////////////////////////////////////////////////////////////
  //Below are function calls to get data and status from the FCC
  DeviceIF::Status get_status(FuelCellIF::FCC_status *fcc_status);

  DeviceIF::Status get_data(FuelCellIF::FCC_data *fcc_data);

  
  protected:

  // Message codes for each method
  enum FuelCellIFMsgCode {
    StartMsgCode = 8,
    StopMsgCode,
    OfflineMsgCode,
    ResumeMsgCode,
    Get_statusMsgCode,
    Get_dataMsgCode
  };

  // Define message structure for each method
  struct StartMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _startMsg;

  struct StopMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _stopMsg;

  struct OfflineMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _offlineMsg;

  struct ResumeMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _resumeMsg;

  struct Get_statusMsg : Request, Reply {
    DeviceIF::Status returnVal;
    FuelCellIF::FCC_status fcc_status;
  
  } _get_statusMsg;

  struct Get_dataMsg : Request, Reply {
    DeviceIF::Status returnVal;
    FuelCellIF::FCC_data fcc_data;
  
  } _get_dataMsg;

};

#endif

