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

#ifndef __SimulatedFuelCellIF_H
#define __SimulatedFuelCellIF_H

#include "TaskInterface.h"

#include "InstrumentIF.h"

#define SimulatedFuelCellIFServerName "SimulatedFuelCellIFServer"

class SimulatedFuelCellIF : public InstrumentIF {

  friend class SimulatedFuelCellIF_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 {
    SimulatedFuelCellIF::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;
  };
  SimulatedFuelCellIF(const char *name, int timeout = 10);

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

  ~SimulatedFuelCellIF();

  //////////////////////////////////////////////////////////////////
  // recieve a command and send back an enumerated reply code
  SimulatedFuelCellIF::FCC_Cmd_Reply send_simFCC_command(SimulatedFuelCellIF::FCC_Command fcc_command);

  //////////////////////////////////////////////////////////////////
  // put status into status structure and return reply code
  SimulatedFuelCellIF::FCC_Cmd_Reply get_simFCC_status(SimulatedFuelCellIF::FCC_status *fcc_status);

  //////////////////////////////////////////////////////////////////
  // put status into status structure and return reply code
  SimulatedFuelCellIF::FCC_Cmd_Reply get_simFCC_data(SimulatedFuelCellIF::FCC_data *fcc_data);

  //////////////////////////////////////////////////////////////////
  // set the value of the data
  SimulatedFuelCellIF::FCC_Cmd_Reply set_simFCC_data(SimulatedFuelCellIF::FCC_data *fcc_data);

  //////////////////////////////////////////////////////////////////
  // set the value of the status
  SimulatedFuelCellIF::FCC_Cmd_Reply set_simFCC_status(SimulatedFuelCellIF::FCC_status *fcc_status);

  
  protected:

  // Message codes for each method
  enum SimulatedFuelCellIFMsgCode {
    Send_simFCC_commandMsgCode = 8,
    Get_simFCC_statusMsgCode,
    Get_simFCC_dataMsgCode,
    Set_simFCC_dataMsgCode,
    Set_simFCC_statusMsgCode
  };

  // Define message structure for each method
  struct Send_simFCC_commandMsg : Request, Reply {
    SimulatedFuelCellIF::FCC_Cmd_Reply returnVal;
    SimulatedFuelCellIF::FCC_Command fcc_command;
  
  } _send_simFCC_commandMsg;

  struct Get_simFCC_statusMsg : Request, Reply {
    SimulatedFuelCellIF::FCC_Cmd_Reply returnVal;
    SimulatedFuelCellIF::FCC_status fcc_status;
  
  } _get_simFCC_statusMsg;

  struct Get_simFCC_dataMsg : Request, Reply {
    SimulatedFuelCellIF::FCC_Cmd_Reply returnVal;
    SimulatedFuelCellIF::FCC_data fcc_data;
  
  } _get_simFCC_dataMsg;

  struct Set_simFCC_dataMsg : Request, Reply {
    SimulatedFuelCellIF::FCC_Cmd_Reply returnVal;
    SimulatedFuelCellIF::FCC_data fcc_data;
  
  } _set_simFCC_dataMsg;

  struct Set_simFCC_statusMsg : Request, Reply {
    SimulatedFuelCellIF::FCC_Cmd_Reply returnVal;
    SimulatedFuelCellIF::FCC_status fcc_status;
  
  } _set_simFCC_statusMsg;

};

#endif

