/************************************************************************/
/* Copyright 1992 MBARI							*/
/************************************************************************/
/* $Header: /usr/tiburon/unix/gui/dmviewer/RCS/initRov.c,v 1.2 1998/02/02 16:28:50 oreilly Exp oreilly $		*/
/* Summary  : Main Routines for ROV User Interface			*/
/* Filename : rov.c							*/
/* Author   : Bob Herlien (rah)						*/
/* Project  : New ROV							*/
/* $Revision: 1.2 $							*/
/* Created  : 05/21/92							*/
/************************************************************************/
/* Modification History:						*/
/* $Log: initRov.c,v $
 * Revision 1.2  1998/02/02 16:28:50  oreilly
 * Removed obsolete malloc optimization stuff
 *
 * Revision 1.1  1997/04/09 16:20:55  oreilly
 * Initial revision
 *
 * Revision 2.2  96/05/15  11:14:49  11:14:49  bobh (Bob Herlien)
 * Still supporting proto during final vehicle build
 * 
 * Revision 2.0  95/09/20  14:22:46  14:22:46  hebo (Bob Herlien)
 * Support for final vehicle integration.  AC, PDU micros.
 * 
 * Revision 1.8  94/08/19  17:20:01  17:20:01  hebo (Bob Herlien)
 * Interface to Unix version of Data Manager
 * 
 * Revision 1.7  94/03/21  14:14:46  14:14:46  hebo (Bob Herlien)
 * Misc bug fixes and enhancements
 * 
 * Revision 1.6  93/12/17  15:04:21  15:04:21  hebo (Bob Herlien)
 * December Wet Tests
 * 
 * Revision 1.5  93/07/08  18:10:12  18:10:12  hebo (Bob Herlien)
 * Prior to Prototype Phase I testing
 * 
 * Revision 1.4  93/05/27  15:47:24  15:47:24  hebo (Bob Herlien)
 * Data Manager Interface
 * 
 * Revision 1.2  93/01/21  10:33:43  10:33:43  hebo (Bob Herlien)
 * Changes after Level 0
 * 
 * Revision 1.0  92/11/20  12:03:22  12:03:22  hebo (Bob Herlien)
 * Initial revision
 * 
 * Revision 1.0  92/11/20  11:59:01  11:59:01  hebo (Bob Herlien)
 * Initial revision
 * 
*/
/************************************************************************/

#include <mbari/types.h>
#include <mbari/const.h>
#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <Xm/Xm.h>
#include <Xm/Protocols.h>
#include "rov.h"
#include <dm_errno.h>
#include <signal.h>
#include <malloc.h>


/************************/
/* External Functions	*/
/************************/

Extern Widget	CreatetopForm(Widget);
Extern Widget	CreatevehicleForm(Widget);
Extern Widget	CreatepowerForm(Widget);
Extern Widget	CreategfForm(Widget);
Extern Widget	CreatecameraForm(Widget);
Extern Widget	CreatesetupForm(Widget);
Extern Widget	CreateinstrumentForm(Widget);
Extern Widget	CreateibcForm(Widget);
Extern Widget	CreatedmForm(Widget);
Extern Void	initialize(Void);
Extern Void	terminate(int);
Extern Void	terminateCallback(Widget w, XtPointer unused,
				  XmAnyCallbackStruct *cbs);


/************************/
/* Global Data		*/
/************************/

Global XtAppContext appcontext;		/* The application context	*/
Global Widget	toplevel;		/* The top level widget		*/
Global Widget	topFormW;		/* Top-level form, child of toplevel*/
Global AppData	appdata;		/* Application-wide resources	*/

			/* Application form widgets, children of topFormW */
Global Widget	appForm = NULLW;
Global Widget	vehicleFormW = NULLW;
Global Widget	powerFormW = NULLW;
Global Widget	gfFormW = NULLW;
Global Widget	cameraFormW = NULLW;
Global Widget	setupFormW = NULLW;
Global Widget	instFormW = NULLW;
Global Widget	dconFormW = NULLW;
Global Widget	dmFormW = NULLW;
Global char	buff[4096];		/* Misc buffer used application-wide*/


/********************************/
/* Application-wide Resources	*/
/********************************/

MLocal XtResource resources[] =		
{
  { "datamgr", XtCString, XtRString, sizeof(String), 
    XtOffset(AppDataPtr, datamgr), XtRString,
    "/usr/vw/mbari/dm/unix/datamgrd" },
  { "vehicle_update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, vehicle_update), XtRImmediate, (caddr_t)500 },
  { "alarm_update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, alarm_update), XtRImmediate, (caddr_t)500 },
  { "power_update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, power_update), XtRImmediate, (caddr_t)250 },
  { "power_setup_update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, pwrsetup_update), XtRImmediate, (caddr_t)1000 },
  { "ibc_update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, ibc_update), XtRImmediate, (caddr_t)500 },
  { "graph_update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, graph_update), XtRImmediate, (caddr_t)500 },
  { "misc_update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, misc_update), XtRImmediate, (caddr_t)500 },
  { "dm_logdir", XtCString, XtRString, sizeof(String), 
    XtOffset(AppDataPtr, dm_logdir), XtRString, "/usr/vw/mbari/logs" },
  { "alarm_xpos", XtCPosition, XtRPosition, sizeof(Position),
    XtOffset(AppDataPtr, alarm_xpos), XtRImmediate, (caddr_t)0 },
  { "alarm_ypos", XtCPosition, XtRPosition, sizeof(Position),
    XtOffset(AppDataPtr, alarm_ypos), XtRImmediate, (caddr_t)400 },
  { "alarm_xinc", XtCPosition, XtRPosition, sizeof(Position),
    XtOffset(AppDataPtr, alarm_xinc), XtRImmediate, (caddr_t)0 },
  { "alarm_yinc", XtCPosition, XtRPosition, sizeof(Position),
    XtOffset(AppDataPtr, alarm_yinc), XtRImmediate, (caddr_t)0 },
  { "select_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, select_fg), XtRString, "White" },
  { "select_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, select_bg), XtRString, "SlateBlue1" },
  { "alarm_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, alarmon_fg), XtRString, "White" },
  { "alarm_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, alarmon_bg), XtRString, "Red" },
  { "connect_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, connect_fg), XtRString, "White" },
  { "connect_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, connect_bg), XtRString, "Red" },
  { "pwron_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, pwron_fg), XtRString, "Black" },
  { "pwron_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, pwron_bg), XtRString, "Green" },
  { "pwroff_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, pwroff_fg), XtRString, "White" },
  { "pwroff_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, pwroff_bg), XtRString, "SteelBlue" },
  { "nopwr_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, nopwr_fg), XtRString, "White" },
  { "nopwr_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, nopwr_bg), XtRString, "Black" },
  { "pwrerr_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, pwrerr_fg), XtRString, "White" },
  { "pwrerr_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, pwrerr_bg), XtRString, "Red" },
  { "joystick_warning", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, joystick_warning), XtRString, "red" },
  { "gf_current", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, gf_current_bg), XtRString, "SlateBlue3" },
  { "debug", "BitField", XtRInt, sizeof(DWord),
    XtOffset(AppDataPtr, debug), XtRImmediate, (caddr_t)0 },
  { "bell", XtCBoolean, XtRBoolean, sizeof(Boolean),
    XtOffset(AppDataPtr, ring_bell), XtRImmediate, (caddr_t)True },
  { "alarm_file", XtCString, XtRString, sizeof(String), 
    XtOffset(AppDataPtr, alarm_file), XtRString,
    "/usr/vw/mbari/logs/alarm.log" },
  { "log_alarms", XtCBoolean, XtRBoolean, sizeof(Boolean),
    XtOffset(AppDataPtr, log_alarms), XtRImmediate, (caddr_t)True },
  { "stateOK", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, stateOK), XtRString, "Green3" },
  { "stateBad", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, stateBad), XtRString, "Red" },
  { "inWater", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, inWater), XtRString, "Blue" },
  { "outOfWater", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, outOfWater), XtRString, "Brown" },
  { "releaseArmColor", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, releaseArmColor), XtRString, "Red" },
  { "powerLimitColor", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, pwrLimitColor), XtRString, "Red" }
};

MLocal String fallback_resources[] =
{
    "*geometry:		=1024x768", 
    "Rov*background:	SlateBlue",
    "Rov*foreground:	White",
    "Rov*labelColor:	White",
    "Rov*fontList:	variable",
    "Rov*rubberPositioning: True",
    "*quitButton.accelerator: Ctrl<Key>C",
    NULL
};


#ifdef COMPILE_MAIN

/************************************************************************/
/* Function    : main							*/
/* Purpose     : Main Routine for ROV User Interface			*/
/* Inputs      : argc, argv						*/
/* Outputs     : None							*/
/* Comments    : Created by Builder Xcessory, modified by Bob Herlien	*/
/************************************************************************/
    void
main(int argc, char ** argv)
{
    Reg Errno	rtn;
    Atom	wmDeleteAtom;

/* Stuff to try to optimize HP's *^)&^(&^%(&%^ malloc() routines	*/
/* *********
    sbrk( 4 * 1024 * 1024 );
    mallopt( M_MXFAST, 32 );
    mallopt( M_NLBLKS, 100 );
    mallopt( M_GRAIN, 32 );
********** */ 
/* Set signal handlers if user trys to quit				*/
    signal( SIGINT, terminate );
    signal( SIGQUIT, terminate );
    signal( SIGTERM, terminate );

    toplevel = XtAppInitialize( &appcontext, "Rov", (XrmOptionDescList)NULL,
			        0, &argc, argv, fallback_resources,
			        (ArgList)NULL, 0 );

    XmRegisterConverters();

    XtGetApplicationResources( toplevel, &appdata, resources, 
			       XtNumber(resources), (ArgList)NULL, 0 );

    if ( (rtn = rdm_init()) != OK )		/* Initialize Data manager */
    {
	if ( rtn == EDM_NO_DAEMON )
	{
	    fprintf(stderr, "Data Manager isn't running\n");
	    fprintf(stderr, "Execute %s and try again\n", appdata.datamgr);
	}
	else
	    fprintf(stderr, "Data Manager initialization error %#x\n", rtn);
	exit(1);
    }

    topFormW = CreatetopForm( toplevel );	/* Creates & stores appForm*/
    XtManageChild( topFormW );

    vehicleFormW = CreatevehicleForm( appForm );
    XtManageChild( vehicleFormW );

    powerFormW = CreatepowerForm( appForm );
    cameraFormW = CreatecameraForm( appForm );
    dconFormW = CreateibcForm( appForm );
    setupFormW = CreatesetupForm( appForm );
    instFormW = CreateinstrumentForm( appForm );
    gfFormW = CreategfForm( appForm );
    dmFormW = CreatedmForm( appForm );

    XtRealizeWidget( toplevel );
    initialize();

    wmDeleteAtom = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False);
    XmAddWMProtocolCallback( toplevel, wmDeleteAtom, 
			    (XtCallbackProc)terminateCallback, NULL );

    XtAppMainLoop( appcontext );

} /* main() */

#endif /* COMPILE_MAIN */


int initRov()
{
    Reg Errno	rtn;
    Atom	wmDeleteAtom;

/* Stuff to try to optimize HP's *^)&^(&^%(&%^ malloc() routines	*/
/* ***
    sbrk( 4 * 1024 * 1024 );
    mallopt( M_MXFAST, 32 );
    mallopt( M_NLBLKS, 100 );
    mallopt( M_GRAIN, 32 );
*** */
/* Set signal handlers if user trys to quit				*/
    signal( SIGINT, terminate );
    signal( SIGQUIT, terminate );
    signal( SIGTERM, terminate );

    XtGetApplicationResources( toplevel, &appdata, resources, 
			       XtNumber(resources), (ArgList)NULL, 0 );

    XmRegisterConverters();

    wmDeleteAtom = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", 
				False);

    XmAddWMProtocolCallback( toplevel, wmDeleteAtom, 
			    (XtCallbackProc)terminateCallback, NULL );

} 








