/************************************************************************/
/* Copyright 1993 MBARI							*/
/************************************************************************/
/* $Header: /usr/tiburon/unix/gui/proto/RCS/regencall.c,v 1.1 1998/01/28 16:17:12 oreilly Exp $		*/
/* Summary  : Callback Routines for Regen screen of ROV GUI		*/
/* Filename : regencall.c						*/
/* Author   : Bob Herlien (rah)						*/
/* Project  : New ROV							*/
/* $Revision: 1.1 $							*/
/* Created  : 06/28/93							*/
/************************************************************************/
/* Modification History:						*/
/* $Log: regencall.c,v $
 * Revision 1.1  1998/01/28 16:17:12  oreilly
 * Initial revision
 *
 * Revision 2.2  96/05/15  11:15:32  11:15:32  bobh (Bob Herlien)
 * Still supporting proto during final vehicle build
 * 
 * Revision 2.0  95/09/20  14:23:01  14:23:01  hebo (Bob Herlien)
 * Support for final vehicle integration.  AC, PDU micros.
 * 
 * Revision 1.8  94/08/19  17:20:20  17:20:20  hebo (Bob Herlien)
 * Interface to Unix version of Data Manager
 * 
 * Revision 1.6  93/12/17  15:04:52  15:04:52  hebo (Bob Herlien)
 * December Wet Test
 * 
 * Revision 1.5  93/07/08  18:10:53  18:10:53  hebo (Bob Herlien)
 * Prior to Prototype Phase I testing
 * 
*/
/************************************************************************/

#include <sys/types.h>
#include <mbari/types.h>
#include <mbari/const.h>
#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include <X11/Xc/Xc.h>
#include "rov.h"
#include "tiburon.h"
#include <regenDm.h>
#include <powerIbc.h>
#include <powerTypes.h>
#include <thrusterDM.h>
#include <microdef.h>
#include <ibc_card.h>
#include "power.h"
#include "alarm.h"
#include "ibc.h"


#define NREGENS			2
#define REGEN_WIDTH		355
#define REGEN_INFO_LEFT_POS	50
#define REGEN_INFO_RT_POS	72


/********************************/
/*	External Functions	*/
/********************************/

Extern Widget	rovError( Widget parent, char *msg );
Extern Void	createItems( rovItem **ipp, TimeoutStruct *tp );
Extern Void	startTimeout( TimeoutStruct *tp );
Extern Void	stopTimeout( TimeoutStruct *tp );
Extern Void	updateInt16BarGraph( rovItem *ip );
Extern Widget	createIbcGroup( Widget parent, ibcItemSet *isp,
			        Dimension width, Int32 lpos, Int32 rpos );
Extern Void	createIbcItems( Reg ibcItemDesc *idp, char *dmprefix );
Extern ibcItemDesc *copyIbcItemDesc( ibcItemDesc *idp );
Extern Void	ibcStartTimeout( ibcItemDesc *idp, char *dmprefix );
Extern Void	ibcStopTimeout( ibcItemDesc *idp );
Extern Void	labelCreate( Widget parent, ibcItem *itm,
			     Int32 lpos, Int32 rpos );
Extern Void	textFieldCreate( Widget parent, ibcItem *itm,
				 Int32 lpos, Int32 rpos );
Extern Void	updateIntLabel( ibcItem *itm );
Extern Void	updateEnumLabel( ibcItem *itm );
Extern Void	updateTypeLabel( ibcItem *itm );
Extern Void	updateNumTextField( ibcItem *itm );
Extern Void	modifyIntTextField( Widget w, ibcItem *itm, 
				    XmTextVerifyCallbackStruct *tvp );
Extern Void	acceptIntTextField( Widget w, ibcItem *itm, 
				    XmAnyCallbackStruct *cbp );


/********************************/
/*	External Data		*/
/********************************/

Extern XtAppContext	appcontext;	/* The application context	*/
Extern AppData		appdata;	/* Application-wide resources	*/
Extern char		*ibcAlarmStrings[];
Extern Widget		regenAItemScrolledWindow, regenBItemScrolledWindow;
Extern Widget		aVoltBarGraph, aHeatSinkTempBarGraph,
			aDutyCycle1BarGraph, aDutyCycle2BarGraph;
Extern Widget		bVoltBarGraph, bHeatSinkTempBarGraph,
			bDutyCycle1BarGraph, bDutyCycle2BarGraph;
Extern char		buff[];		/* Misc buffer used application-wide*/


/********************************/
/*	Module Local Data	*/
/********************************/

MLocal rovItem		aVoltItem = 
{  TIBURON_DM_PREFIX "PWR_IBC_A.REGEN.BUS_VOLTAGE", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &aVoltBarGraph, updateInt16BarGraph, 0 };

MLocal rovItem		aHeatSinkItem = 
{  TIBURON_DM_PREFIX "PWR_IBC_A.REGEN.HEATSINK_TEMP", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &aHeatSinkTempBarGraph, updateInt16BarGraph, 0 };

MLocal rovItem		aDutyCycle1Item = 
{  TIBURON_DM_PREFIX "PWR_IBC_A.REGEN.DUTY_CYCLE1", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &aDutyCycle1BarGraph, updateInt16BarGraph, 0 };

MLocal rovItem		aDutyCycle2Item = 
{  TIBURON_DM_PREFIX "PWR_IBC_A.REGEN.DUTY_CYCLE2", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &aDutyCycle2BarGraph, updateInt16BarGraph, 0 };

Global rovItem		aMinMaxItem = 
{ TIBURON_DM_PREFIX "PWR_IBC_A.REGEN.RESET_MIN_MAX", DM_EMPTY, 1, FALSE, NO_ITEM, 0, 
  NULLWP, NULLF, 0 };

MLocal rovItem		bVoltItem = 
{ TIBURON_DM_PREFIX "PWR_IBC_B.REGEN.BUS_VOLTAGE", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &bVoltBarGraph, updateInt16BarGraph, 0 };

MLocal rovItem		bHeatSinkItem = 
{ TIBURON_DM_PREFIX "PWR_IBC_B.REGEN.HEATSINK_TEMP", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &bHeatSinkTempBarGraph, updateInt16BarGraph, 0 };

MLocal rovItem		bDutyCycle1Item = 
{ TIBURON_DM_PREFIX "PWR_IBC_B.REGEN.DUTY_CYCLE1", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &bDutyCycle1BarGraph, updateInt16BarGraph, 0 };

MLocal rovItem		bDutyCycle2Item = 
{ TIBURON_DM_PREFIX "PWR_IBC_B.REGEN.DUTY_CYCLE2", DM_INT16, 1, FALSE, NO_ITEM, 0, 
  &bDutyCycle2BarGraph, updateInt16BarGraph, 0 };

Global rovItem		bMinMaxItem = 
{ TIBURON_DM_PREFIX "PWR_IBC_B.REGEN.RESET_MIN_MAX", DM_EMPTY, 1, FALSE, NO_ITEM, 0, 
  NULLWP, NULLF, 0 };

MLocal rovItem		*regenRovItems[] =
{ &aVoltItem, &aHeatSinkItem, &aDutyCycle1Item, &aDutyCycle2Item, &aMinMaxItem,
  &bVoltItem, &bHeatSinkItem, &bDutyCycle1Item, &bDutyCycle2Item, &bMinMaxItem,
  NULLR };

MLocal TimeoutStruct	regenTimeoutStruct = 
{ &appdata.pwrsetup_update, 0, regenRovItems, 0, "Regen Screen", NULLF };

MLocal char		*onOff[] = { "Off", "On" };

MLocal ibcItem regenItems[] = 
{ { "Minimum Bus Voltage", REGEN_MIN_BUS_VOLTAGE_DM, DM_INT16, 1, labelCreate, 
    updateIntLabel, NULLF, NULLF, UP_CONSUME, 0, 0, NULL, 0, NULLW, 
    NULLW, NULLW, 0, -1},
  { "Maximum Bus Voltage", REGEN_MAX_BUS_VOLTAGE_DM, DM_INT16, 1, labelCreate, 
    updateIntLabel, NULLF, NULLF, UP_CONSUME, 0, 0, NULL, 0, NULLW, 
    NULLW, NULLW, 0, -1},
  { "Heater 1 Temperature", REGEN_HEATER1_TEMP_DM, DM_INT16, 1, labelCreate, 
    updateIntLabel, NULLF, NULLF, UP_CONSUME, 0, 0, NULL, 0, NULLW, 
    NULLW, NULLW, 0, -1},
  { "Heater 2 Temperature", REGEN_HEATER2_TEMP_DM, DM_INT16, 1, labelCreate, 
    updateIntLabel, NULLF, NULLF, UP_CONSUME, 0, 0, NULL, 0, NULLW, 
    NULLW, NULLW, 0, -1},

  {"Open Heater Alarm", REGEN_OPEN_HEATER_ALARM_DM, DM_MBOOL, 1, labelCreate, 
    updateEnumLabel, NULLF, NULLF, UP_ALREADY_CONSUME, 2, 0,
    onOff, 0, NULLW, NULLW, NULLW, 0, -1},
  {"Duty Cycle Alarm", REGEN_DUTY_CYCLE_ALARM_DM, DM_MBOOL, 1, labelCreate, 
    updateEnumLabel, NULLF, NULLF, UP_ALREADY_CONSUME, 2, 0,
    onOff, 0, NULLW, NULLW, NULLW, 0, -1},

  { "Heatsink Temp Alarm", REGEN_HEATSINK_TEMP_ALARM_DM, DM_ENUM, 1, 
    labelCreate, updateEnumLabel, NULLF, NULLF, UP_ALREADY_CONSUME,
    NUM_IBC_ALARMS, 0, ibcAlarmStrings, 0, NULLW, NULLW, NULLW, 0, -1},
  { "Htsink Temp Warn Thresh", REGEN_TEMP_WARN_THRESH_DM, 
    DM_INT16, 1, textFieldCreate, updateNumTextField, acceptIntTextField, 
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW,
    NULLW, 0, -1},
  { "Htsink Temp Alarm Thresh", REGEN_TEMP_ALARM_THRESH_DM, DM_INT16, 1,
    textFieldCreate, updateNumTextField, acceptIntTextField,
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW,
    NULLW, 0, -1},

  { "Heater 1 Temp Alarm", REGEN_HEATER1_TEMP_ALARM_DM, DM_ENUM, 1, 
    labelCreate, updateEnumLabel, NULLF, NULLF, UP_ALREADY_CONSUME,
    NUM_IBC_ALARMS, 0, ibcAlarmStrings, 0, NULLW, NULLW, NULLW, 0, -1},
  { "Htr 1 Temp Warn Thresh", REGEN_HEATER1_TEMP_WARN_THRESH_DM, 
    DM_INT16, 1, textFieldCreate, updateNumTextField, acceptIntTextField, 
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW,
    NULLW, 0, -1},
  { "Htr 1 Temp Alarm Thresh", REGEN_HEATER1_TEMP_ALARM_THRESH_DM,
    DM_INT16, 1, textFieldCreate, updateNumTextField, acceptIntTextField,
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW,
    NULLW, 0, -1},

  { "Heater 2 Temp Alarm", REGEN_HEATER2_TEMP_ALARM_DM, DM_ENUM, 1, 
    labelCreate, updateEnumLabel, NULLF, NULLF, UP_ALREADY_CONSUME,
    NUM_IBC_ALARMS, 0, ibcAlarmStrings, 0, NULLW, NULLW, NULLW, 0, -1},
  { "Htr 2 Temp Warn Thresh", REGEN_HEATER2_TEMP_WARN_THRESH_DM, 
    DM_INT16, 1, textFieldCreate, updateNumTextField, acceptIntTextField, 
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW,
    NULLW, 0, -1},
  { "Htr 2 Temp Alarm Thresh", REGEN_HEATER2_TEMP_ALARM_THRESH_DM,
    DM_INT16, 1, textFieldCreate, updateNumTextField, acceptIntTextField,
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW,
    NULLW, 0, -1},

  { "Min Voltage Alarm", REGEN_MIN_VOLTAGE_ALARM_DM, DM_ENUM, 1, 
    labelCreate, updateEnumLabel, NULLF, NULLF, UP_ALREADY_CONSUME,
    NUM_IBC_ALARMS, 0, ibcAlarmStrings, 0, NULLW, NULLW, NULLW, 0, -1},
  { "Min Volt Warn Thresh", REGEN_MIN_VOLT_WARN_THRESH_DM, DM_INT16, 1,
    textFieldCreate, updateNumTextField, acceptIntTextField, 
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW, NULLW, 0, -1},
  { "Min Volt Alarm Thresh", REGEN_MIN_VOLT_ALARM_THRESH_DM, DM_INT16, 1,
    textFieldCreate, updateNumTextField, acceptIntTextField,
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW, NULLW, 0, -1},

  { "Max Voltage Alarm", REGEN_MAX_VOLT_ALARM_DM, DM_ENUM, 1, 
    labelCreate, updateEnumLabel, NULLF, NULLF, UP_ALREADY_CONSUME,
    NUM_IBC_ALARMS, 0, ibcAlarmStrings, 0, NULLW, NULLW, NULLW, 0, -1},
  { "Max Volt Warn Thresh", REGEN_MAX_VOLT_WARN_THRESH_DM, DM_INT16, 1,
    textFieldCreate, updateNumTextField, acceptIntTextField, 
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW, NULLW, 0, -1},
  { "Max Volt Alarm Thresh", REGEN_MAX_VOLT_ALARM_THRESH_DM, DM_INT16, 1,
    textFieldCreate, updateNumTextField, acceptIntTextField,
    modifyIntTextField, UP_CONSUME, 6, 0, NULL, 0, NULLW, NULLW, NULLW, 0, -1}
};

MLocal ibcItemSet  regenItemSet = 
{ regenItems, XtNumber(regenItems), NULLW };

MLocal ibcItemDesc	regenAItemDesc =
{ {&regenItemSet, NULLIS, NULLIS, NULLIS},
  &appdata.pwrsetup_update, 0, 0, 0 };

MLocal ibcItemDesc	*regenBItemDescPtr = NULLID;


/************************************************************************/
/* Function    : rovWriteEvent						*/
/* Purpose     : Callback to write an event				*/
/* Inputs      : Widget, client_data, call_data				*/
/* Outputs     : None							*/
/************************************************************************/
	Void
rovWriteEvent( Widget w, rovItem *rp, XmAnyCallbackStruct *cbp )
{
    if ( rp->dmitem != NO_ITEM )
	rdm_write_once( rp->dmitem, buff, 0 );

} /* rovWriteEvent() */


/************************************************************************/
/* Function    : regenSelect						*/
/* Purpose     : Callback function to select the regen screen		*/
/* Inputs      : Select Struct Ptr					*/
/* Outputs     : None							*/
/************************************************************************/
    Void
regenSelect( Select *sp )
{
    startTimeout( &regenTimeoutStruct );
    
    ibcStartTimeout( &regenAItemDesc, PWR_IBC_A_DM_PREFIX );
    ibcStartTimeout( regenBItemDescPtr, PWR_IBC_B_DM_PREFIX );

} /* regenSelect() */


/************************************************************************/
/* Function    : regenUnselect						*/
/* Purpose     : Callback function to unselect the regen screen		*/
/* Inputs      : Select Struct Ptr					*/
/* Outputs     : None							*/
/************************************************************************/
    Void
regenUnselect( Select *sp )
{
    Reg Nat32		i;

    stopTimeout( &regenTimeoutStruct );

    ibcStopTimeout( &regenAItemDesc );
    ibcStopTimeout( regenBItemDescPtr );

} /* regenUnselect() */


/************************************************************************/
/* Function    : initRegen						*/
/* Purpose     : Initialize Regen screen				*/
/* Inputs      : None							*/
/* Outputs     : None							*/
/************************************************************************/
    Void
initRegen( Void )
{
    createItems( regenRovItems, &regenTimeoutStruct );

    regenBItemDescPtr = copyIbcItemDesc( &regenAItemDesc );
    createIbcItems( &regenAItemDesc, PWR_IBC_A_DM_PREFIX );
    createIbcItems( regenBItemDescPtr, PWR_IBC_B_DM_PREFIX );

    createIbcGroup( regenAItemScrolledWindow, regenAItemDesc.ibcSets[0],
		    REGEN_WIDTH, REGEN_INFO_LEFT_POS, REGEN_INFO_RT_POS );
    createIbcGroup( regenBItemScrolledWindow, regenBItemDescPtr->ibcSets[0],
		    REGEN_WIDTH, REGEN_INFO_LEFT_POS, REGEN_INFO_RT_POS );

    XtManageChild( regenAItemDesc.ibcSets[0]->widget );
    XtManageChild( regenBItemDescPtr->ibcSets[0]->widget );

} /* initRegen() */
