/************************************************************************/
/* Copyright 1992 - 1997 MBARI						*/
/************************************************************************/
/* $Header: peerview.c,v 2.2 96/05/15 11:14:49 bobh Exp $		*/
/* Summary  : Main Routines for DM Peer Viewer				*/
/* Filename : peerview.c						*/
/* Author   : Bob Herlien (rah)						*/
/* Project  : Tiburon							*/
/* $Revision: 2.2 $							*/
/* Created  : 05/27/97 from rov.c					*/
/************************************************************************/
/* Modification History:						*/
/* $Log:	peerview.c,v $
   27may97, rah, created from rov.c
*/
/************************************************************************/

#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 <Xm/ScrolledW.h>
#include <Xm/Label.h>
#include "peerview.h"
#include <dm_errno.h>
#include <signal.h>
#include <malloc.h>
#include <time.h>
typedef Void 	*SEM_ID;		/* So we don't have to include	*/
					/*  all the VxWorks garbage	*/
#include <datamgr.h>


/************************/
/* External Functions	*/
/************************/

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	peerWindow, peerList;	/* Peer scrolled window	& label	*/
Global AppData	appdata;		/* Application-wide resources	*/
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" },
  { "update", "Rate", XtRInt, sizeof(int), 
    XtOffset(AppDataPtr, dm_update), XtRImmediate, (caddr_t)1000 },
  { "connect_fg", XtCForeground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, connect_fg), XtRString, "White" },
  { "connect_bg", XtCBackground, XtRPixel, sizeof(Pixel),
    XtOffset(AppDataPtr, connect_bg), XtRString, "Red" }
};

MLocal String fallback_resources[] =
{
    "*geometry:			=300x200", 
    "Peerview*background:	SlateBlue",
    "Peerview*foreground:	White",
    "Peerview*labelColor:	White",
    NULL
};


/************************************************************************/
/* Function    : main							*/
/* Purpose     : Main Routine for ROV User Interface			*/
/* Inputs      : argc, argv						*/
/* Outputs     : None							*/
/************************************************************************/
    void
main(int argc, char ** argv)
{
    Reg Errno	rtn;
    Atom	wmDeleteAtom;
    XmString	labelString;

/* Set signal handlers if user trys to quit				*/
    signal( SIGINT, terminate );
    signal( SIGQUIT, terminate );
    signal( SIGTERM, terminate );

    toplevel = XtAppInitialize( &appcontext, "Peerview",
			        (XrmOptionDescList)NULL, 0,
			        &argc, argv, fallback_resources,
			        (ArgList)NULL, 0 );
    XmRegisterConverters();

    XtGetApplicationResources( toplevel, &appdata, resources, 
			       XtNumber(resources), (ArgList)NULL, 0 );

    if ( (rtn = dm_init((DM_Define *)NULL)) != 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);
    }

    peerWindow = XtVaCreateManagedWidget(
			"peerWindow", xmScrolledWindowWidgetClass, toplevel,
			XmNscrollingPolicy, XmAUTOMATIC, NULL);

    labelString = XmStringCreateLtoR( "None", XmSTRING_DEFAULT_CHARSET );
    peerList = XtVaCreateManagedWidget(
			"peerList", xmLabelWidgetClass, peerWindow,
			XmNalignment, XmALIGNMENT_BEGINNING,
			XmNlabelString, labelString,
			XmNrecomputeSize, True, NULL );

    XmStringFree( labelString );
    XtRealizeWidget( toplevel );
    initialize();

    wmDeleteAtom = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False);
    XmAddWMProtocolCallback( toplevel, wmDeleteAtom, 
			    (XtCallbackProc)terminateCallback, NULL );

    XtAppMainLoop( appcontext );

} /* main() */
