/*******************************************************************************

$Id: fcc_api.h,v 1.1 2000/06/09 16:19:12 jrieffel Exp $

$Log: fcc_api.h,v $
Revision 1.1  2000/06/09 16:19:12  jrieffel
Fuel Cell Test programs

Revision 1.1  2000/05/05 20:03:45  root
Initial revision


*******************************************************************************/

#ifndef __FCC_API_H__
#define __FCC_API_H__
#ifdef __cplusplus
extern "C" {
#endif
/*
********************************************************************************
**		INCLUDE STATEMENTS	
********************************************************************************
*/

//	System defined header files
#include <sys/types.h>	// for pid_t

//	Project defined header files
//  #include <project.h>

/*
********************************************************************************
**		CONSTANT DEFINITIONS
********************************************************************************
*/

// FC_HEALTH defines			   
#define FCC_HEALTHY							0x00
#define FCC_ERR_FC_VOLTAGE_YELLOW			0x01
#define FCC_ERR_FC_VOLTAGE_RED				0x02
#define FCC_ERR_ANOLYTE_TEMP_YELLOW			0x04
#define FCC_ERR_ANOLYTE_TEMP_RED			0x08
#define FCC_ERR_CATHOLYTE_TEMP_YELLOW		0x10
#define FCC_ERR_CATHOLYTE_TEMP_RED			0x20
#define FCC_ERR_PEROXIDE_TEMP_YELLOW		0X40
#define FCC_ERR_PEROXIDE_TEMP_RED			0x80
#define FCC_ERR_ANOLYTE_A_CURRENT_YELLOW	0x0100
#define FCC_ERR_ANOLYTE_A_CURRENT_RED		0x0200		
#define FCC_ERR_ANOLYTE_B_CURRENT_YELLOW	0x0400
#define FCC_ERR_ANOLYTE_B_CURRENT_RED		0x0800		
#define FCC_ERR_CATHOLYTE_CURRENT_YELLOW	0x1000
#define FCC_ERR_CATHOLYTE_CURRENT_RED		0x2000		
#define FCC_ERR_PEROXIDE_CURRENT_YELLOW		0x4000
#define FCC_ERR_PEROXIDE_CURRENT_RED		0x8000		
#define FCC_ERR_RB_VOLTAGE_YELLOW			0x10000
#define FCC_ERR_RB_VOLTAGE_RED				0x20000
		
// Built-in self-test results and status defines
#define FCC_BIT_IN_PROGRESS				0x01
#define FCC_BIT_COMPLETE				0x02
#define FCC_BIT_OK						0x00


/*
********************************************************************************
**		FCC MANIFEST DEFINITIONS
********************************************************************************
*/

#define FCC_CENTRAL_COMMAND_VERSION_NUMBER	100
#define FCC_CENTRAL_COMMAND_VERSION_LETTER	'a'

#define FCC_MSG						0x1000
#define RESERVED					0	// RESERVED (_SYSMSG)
#define	FCC_MSG_SUBTYPE_COMMAND		10	
#define REGISTER_FCC_CLIENT			20
#define UNREGISTER_FCC_CLIENT		30

// FCC Commands
typedef enum
{ 
	FCC_CMD_NONE = 0,
	FCC_CMD_START,
	FCC_CMD_STOP,
	FCC_CMD_OFFLINE,
	FCC_CMD_RESUME
}FCC_COMMAND;

// Fuel Cell Controller fc_control states
typedef enum 
{	
	FCC_STATE_IDLE = 1,
	FCC_STATE_OFFLINE,
	FCC_STATE_RAMPING,
	FCC_STATE_ONLINE
}FCC_STATE;

typedef struct
{									// UNIT			DOMAIN			RESOLUTION (LSB)
	int	  elapsed_time;				// seconds		0-1000*60*3600	1
	short anolyte_pump_a_current;	// amps			0-500			0.01
	short anolyte_pump_b_current;	// amps			0-500			0.01
	short catholyte_pump_current;	// amps			0-500			0.01
	short peroxide_pump_current;	// amps			0-500			0.01
	short anolyte_temp;				// degrees C	-100 - +1000	0.1
	short catholyte_temp;			// degrees C	-100 - +1000	0.1
	short fwd_peroxide_temp;		// degrees C	-100 - +1000	0.1
	short aft_peroxide_temp;		// degrees C	-100 - +1000	0.1
	short stack_voltage;			// volts		0-4000			0.01
	short stack_current;			// amps			0-2000			0.01
	short battery_voltage;			// volts		0-4000			0.01
	short battery_current;			// amps			0-2000			0.01
	short peroxide_used;			// grams		0-10000			1
	short spare[4];					// future expansion
} FCC_DATA;

typedef struct
{									// DOMAIN	
	FCC_STATE fcc_state;			// see enum above 
	unsigned int  health;			// see #defines above 
	unsigned char FC_remaining_kwh;	// 0 - 100	Remaining Fuel Cell KWH		
	unsigned char RB_remaining_wh;	// 0 - 255  Remaining Recovery Battery watt hours 		
	unsigned char BIT_status;		// FCC_BIT_IN_PROGRESS, FCC_BIT_COMPLETE 
	unsigned char BIT_result;		// see #defines above 
	short spare[4];					// future expansion
} FCC_STATUS;
			   
/*
********************************************************************************
**		FCC SEND/RECEIVE STRUCTURES
********************************************************************************
*/

typedef struct								// FCC Command
{	
	struct _sysmsg_hdr		hdr;
	FCC_COMMAND			cmd;			// see enum above 
	char prog_name[PATH_MAX + NAME_MAX + 1];
	pid_t proxyID;
}	FCC_CENTRAL_COMMAND_S_COMMAND_STRUCT;

/*
********************************************************************************
**		FCC REPLY STRUCTURES
********************************************************************************
*/


/*
********************************************************************************
**		SEND/RECEIVE STRUCTURE
********************************************************************************
*/

typedef union
{	
	SRVMSG_S_STANDARD_STRUCT	standard;
	FCC_CENTRAL_COMMAND_S_COMMAND_STRUCT	command;
	SRVMSG_S_TERMINATE_STRUCT	terminate;
}	FCC_CENTRAL_CMD_S_MSG_STRUCT;


/*
********************************************************************************
**		REPLY STRUCTURE
********************************************************************************
*/

typedef union
{	
	SRVMSG_R_STANDARD_STRUCT	standard;
	SRVMSG_R_TERMINATE_STRUCT	terminate;
	SRVMSG_R_ERROR_STRUCT		error;
	SYSMSG_R_DEATH_STRUCT	death;
	SYSMSG_R_VERSION_STRUCT	version;
}	FCC_CENTRAL_CMD_R_MSG_STRUCT;

// Structures

struct CLIENT
	{
		pid_t proxyID;
		char prog_name[PATH_MAX + NAME_MAX +1];
	};

/*
************************************************************
**		FCC CENTRAL COMMAND SPECIAL REPLY CODES
************************************************************
*/

typedef enum
{	
	FCC_ERR_OK = 1,
	FCC_ERR_INVALID_PARAM,
	FCC_ERR_NO_CLIENT,
	FCC_ERR_TOO_MANY_CLIENTS,
	FCC_ERR_COMM,
}FCC_CMD_REPLY;

/*
********************************************************************************
**	FUNCTION PROTOTYPES	
********************************************************************************
*/

// public interface
int get_FCC_data( FCC_DATA *);
int get_FCC_status ( FCC_STATUS *);
int send_FCC_command ( FCC_COMMAND cmd);

// private interface
int RegisterFCCCentralCommandClient(pid_t proxyID);
int UnRegisterFCCCentralCommandClient();

#ifdef __cplusplus
};
#endif
#endif

// End of File */
