/*-----------------------------------------------------------------------------
 *
 * xflight.c  Main Program for the Real Time Simulation Flight Parametr Control
 *
 * Kishan P. Thomas                15/09/1995               Visual Lab ADE DRDO
 *
 -----------------------------------------------------------------------------*/

#include 	<math.h>
#include 	<Xm/Xm.h>
#include 	<Xm/MainW.h>
#include 	<Xm/Label.h>
#include 	<Xm/BulletinB.h>
#include 	<Xm/RowColumn.h>
#include 	<Xm/Frame.h>
#include	<Xm/Form.h>
#include 	<Xm/PushB.h>
#include 	<Xm/Text.h>
#include 	<Xm/ToggleB.h>
#include 	<Xm/CascadeB.h>
#include 	<Xm/MessageB.h>
#include 	<Xm/Scale.h>
#include 	<Xm/PanedW.h>


#define 	FLOATSIZE 50
#define 	INTSIZE 20

	
extern int      a_min[40], 
		a_max[40], 
		b_min[10], 
		b_max[10];

extern char	*a_titles[40], 
		*b_titles[10], 
		*button_names[11][17];

float 		CGI[FLOATSIZE];

signed short    SCGI[INTSIZE];

int		slidervalue_g,
		flag[188],
		audio_flag_g = 0,  
		common_data_g[51], 
		bit_values_g[11][17],
		once=1,
		dynamic_flag=0,
		display_flag=0,
		scale_multiple;

Arg		args;

Widget		a_sliders[41],
		b_sliders[11],
		bit_buttons[188], 
		min_labels_g[51], 
		quit, 
		quitpix;

Display  	*display;

XmString 	text;

void 		Initialise(void);
void 		Displayloop(void);
		
extern void Buttonstatus(Widget w, XtPointer client_data, XtPointer call_data);
extern void Slidervalue(Widget w, XtPointer client_data, XtPointer call_data);
extern void Beepstatus(Widget w, XtPointer client_data, XtPointer call_data);
extern void Dynamicstatus(Widget w, XtPointer client_data, XtPointer call_data);
extern void Displaystatus(Widget w, XtPointer client_data, XtPointer call_data);
extern void Displayarmed(Widget w, XtPointer client_data, XtPointer call_data);
extern void Reset(Widget w, XtPointer client_data, XtPointer call_data);
extern void Update(Widget w, XtPointer client_data, XtPointer call_data);
extern void About(Widget w, XtPointer client_data, XtPointer call_data);
extern void Help(Widget w, XtPointer client_data, XtPointer call_data);
extern void Quit(Widget w, XtPointer client_data, XtPointer call_data);
extern void Printverify(Widget w, XtPointer client_data, XtPointer call_data);
extern void Print(Widget w, XtPointer client_data, XtPointer call_data);

/*-----------------------------------------------------------------------------
 * MAIN PROGRAM
/*----------------------------------------------------------------------------*/

main(int argc, char **argv)
{
    XtAppContext app_context;
    
    Widget 	topLevel,
		rowColumn, 
		frame_1[4], 
		frame_2, 
		a_frames[40], 
		b_frames[10], 
		rowColumn_1[4], 
		rowColumn_2, 
		frame_f2,  
		rowColumn_scales, 
		rowColumn_buttons, 
		frame_3[17], 
		temp, 
		thetitle, 
		rowColumn_3[17], 
		frame_f, 
		rowColumn_f,
		rowColumn_1f, 
		rowColumn_2f,  
		rowColumn_f2,
		frame_update, 
		rowColumn_update,
		frame_reset, 
		rowColumn_reset,
		frame_print, 
		rowColumn_print, 
		frame_about, 
		rowColumn_about,
		frame_help, 
		rowColumn_help, 
		frame_quit, 
		rowColumn_quit,    
		print,
		printpix,  
		reset,
		resetpix,  
	   	printDialog, 
		beepToggle, 
		about,
		aboutpix,  
		aboutDialog,
		help,
		helppix, 
		helpDialog, 
		dynamicToggle, 
		update,
		updatepix, 
		displayToggle, 
		thebitmap;
    
    char	name[10];
    
    Arg		arg[20];
    
    Cardinal	n;
    
    int		count, 
		j, 
		i, 
		divider;
    
   Initialise();
    
    topLevel = XtVaAppInitialize(&app_context, 
                                 "XFlight", 
                                 NULL, 0, 
                                 &argc, argv, 
                                 NULL, NULL);
    
    /* Creating the Geometry management widgets */
    
    rowColumn = XmCreateRowColumn(topLevel, 
				  "rowColumn", 
				  NULL,0);
    XtManageChild(rowColumn);
    
    rowColumn_scales = XmCreateRowColumn(rowColumn, 
					 "rowColumn_scales", 
					 NULL, 0);
    XtManageChild(rowColumn_scales);
    
    rowColumn_buttons = XmCreateRowColumn(rowColumn, 
					 "rowColumn_buttons", 
					 NULL, 0);
    XtManageChild(rowColumn_buttons);
    
    frame_f = XmCreateFrame(rowColumn_scales,
			    "frame_f", 
			    NULL, 0);
    XtManageChild(frame_f);
    rowColumn_f = XmCreateRowColumn(frame_f, 
				    "rowcolumn_f", 
				    NULL,0);
    XtManageChild(rowColumn_f);
    
    for( i = 1; i <= 4 ; i++)
    {
	sprintf(name, "frame1_%d", i);
	frame_1[i] = XmCreateFrame(rowColumn_scales,
			    name, 
			    NULL, 0);
	XtManageChild(frame_1[i]);
	sprintf(name, "rowcolumn1_%d", i);
        rowColumn_1[i] = XmCreateRowColumn(frame_1[i], 
				    name, 
				    NULL,0);
    
	XtManageChild(rowColumn_1[i]);
    }    
    
    for( i = 1 ; i <= 16 ; i++)
    {
	sprintf(name, "frame3_%d", i);
	frame_3[i] = XmCreateFrame(rowColumn_buttons, 
				   name, 
				   NULL, 0);
	XtManageChild(frame_3[i]);
	sprintf(name, "rowcolumn_3%d", i);
	rowColumn_3[i] = XmCreateRowColumn(frame_3[i], 
				           name, 
				           NULL, 0);
	XtManageChild(rowColumn_3[i]);
    }
    
    /* Create the 40 Scale widgets for the flight parameters */
    
    for(j=1; j<= 4; j++)
    {      
	for ( i = 1; i <= 10 ; i++)
	{
	    count = (j-1)*10 + i;
	    sprintf(name, "a_slider_%d", count);
	    text = XmStringCreateLtoR(a_titles[count-1], XmFONTLIST_DEFAULT_TAG);

	    /* Assign scale multiple depending on the scale range */
	    
	    if(a_max[count-1] > 1000) scale_multiple = 10;
	    else scale_multiple = 1;
	
	    n = 0;
	    XtSetArg(arg[n], XmNtitleString, text); n++;
	    
	    /* Check max-values and write as decimals for max-values < 5 */
	    
	    if(a_max[count-1] > 5)
	    {
		XtSetArg(arg[n], XmNminimum, a_min[count-1]); n++;
    		XtSetArg(arg[n], XmNmaximum, a_max[count-1]); n++;
		XtSetArg(arg[n], XmNscaleMultiple, scale_multiple); n++;
	    }
	    else
	    {
		XtSetArg(arg[n], XmNminimum, a_min[count-1]*100); n++;
    		XtSetArg(arg[n], XmNmaximum, a_max[count-1]*100); n++;
		XtSetArg(arg[n], XmNdecimalPoints, 2); n++;
	    }
        
	    a_frames[count] = XmCreateFrame(rowColumn_1[j], 
					    "a-frame", 
					    NULL, 0);
	
	    XtManageChild(a_frames[count]);
	    a_sliders[count] = XmCreateScale(a_frames[count], 
					    name,
					    arg, n);
	    XmStringFree(text);
	    XtManageChild(a_sliders[count]);
	
	    XtAddCallback(a_sliders[count], 
			  XmNvalueChangedCallback,
		          Slidervalue,(XtPointer)count);			          
	}
    
    }   
    
    /* Creating the Geometry management widgets */
    
    frame_2 = XmCreateFrame(rowColumn_scales,
			    "frame_2", 
			    NULL, 0);
    XtManageChild(frame_2);
    
    rowColumn_2 = XmCreateRowColumn(frame_2, 
				    "rowColumn_2", 
				    NULL,0);
    XtManageChild(rowColumn_2);
    
    /* Create the 10 Scale widgets for the target aircraft parameters */
    
    for ( i= 1, count = 41; i <= 10 ; count++, i++)
    {
	sprintf(name, "b_slider_%d", count);
	text = XmStringCreateLtoR(b_titles[i-1], XmFONTLIST_DEFAULT_TAG);
        
	
	    
	if(a_max[count-1] > 1000) scale_multiple = 10;
	else scale_multiple = 1;
	n = 0;
	XtSetArg(arg[n], XmNtitleString, text); n++;
	XtSetArg(arg[n], XmNminimum, b_min[i-1]); n++;
	XtSetArg(arg[n], XmNmaximum, b_max[i-1]); n++;
        XtSetArg(arg[n], XmNscaleMultiple, scale_multiple); n++;
	b_frames[i] = XmCreateFrame(rowColumn_2, 
	                            "b-frame", 
				    NULL, 0);                          
	XtManageChild(b_frames[i]);
	b_sliders[i] = XmCreateScale(b_frames[i], 
				     name,
				     arg, n);
	XmStringFree(text);
	XtManageChild(b_sliders[i]);
	
	XtAddCallback(b_sliders[i], 
                      XmNvalueChangedCallback,
		      Slidervalue,(XtPointer)count);			          
    }
    
    /* Creating the Push Button widgets */ 
     
    for( i = 1 ; i <= 16 ; i++ )
    {
	for( j = 0 ; j  <= 10 ; j++)
	{
	    count = (i * 11) + j; 
	    sprintf(name, "button_%d_%d", j, i);
	    text = XmStringCreateLtoR(button_names[j][i], 
				       XmFONTLIST_DEFAULT_TAG);
	    n = 0;
	    XtSetArg(arg[n], XmNlabelString, text); n++;
	    if ( (i==0) || (j==0) )
	    {
		
		bit_buttons[count] = XmCreateLabel(rowColumn_3[i], 
							name, 
							arg, n);
		XmStringFree(text);
		XtManageChild(bit_buttons[count]);
	    }
	    else
	    {
		bit_buttons[count] = XmCreatePushButton(rowColumn_3[i], 
							name, 
							arg, n);
		XmStringFree(text);
		XtManageChild(bit_buttons[count]);
		XtAddCallback(bit_buttons[count], 
			      XmNactivateCallback, 
			      Buttonstatus,(XtPointer) count);
	    }
	    
	    flag[count] = 0; 
	}
    }
    
    /* Creating the Geometry management widgets */
    
    rowColumn_1f = XmCreateRowColumn(rowColumn_f, 
				    "rowcolumn_f2", 
				    NULL,0);
    XtManageChild(rowColumn_1f);
    
    rowColumn_2f = XmCreateRowColumn(rowColumn_f, 
				    "rowcolumn_f2", 
				    NULL,0);
    XtManageChild(rowColumn_2f);
    
    /* Creating the Toggle Button widgets */
    
    dynamicToggle = XmCreateToggleButton(rowColumn_1f, 
				       "dynamicToggle", 
			               NULL, 0);
    XtManageChild(dynamicToggle);
    XtAddCallback(dynamicToggle,
		  XmNvalueChangedCallback, 
		  Dynamicstatus, 0);
    
    displayToggle = XmCreateToggleButton(rowColumn_1f, 
				       "Display", 
			               NULL, 0);
    XtManageChild(displayToggle);
    XtAddCallback(displayToggle,
		  XmNvalueChangedCallback, 
		  Displaystatus, 0);
    
    
    beepToggle = XmCreateToggleButton(rowColumn_1f, 
				       "beepToggle", 
			               NULL, 0);
    XtManageChild(beepToggle);
    XtAddCallback(beepToggle,
		  XmNvalueChangedCallback, 
		  Beepstatus, 0);
    
    /* Creating the DialogBox Widgets */
    
    printDialog = XmCreateQuestionDialog(rowColumn_scales, 
				       "printDialog", 
				       NULL, 0);
    temp = XmMessageBoxGetChild(printDialog,
                               XmDIALOG_HELP_BUTTON);
    XtUnmanageChild(temp);
    
    XtAddCallback(printDialog,
		  XmNokCallback, 
		  Print, 0);
		  
    helpDialog = XmCreateInformationDialog(rowColumn_scales, 
				       "helpDialog", 
				       NULL, 0);
    temp = XmMessageBoxGetChild(helpDialog,
                               XmDIALOG_HELP_BUTTON);
    XtUnmanageChild(temp);		       
    temp = XmMessageBoxGetChild(helpDialog,
                               XmDIALOG_CANCEL_BUTTON);
    XtUnmanageChild(temp);
    
    aboutDialog = XmCreateInformationDialog(rowColumn_scales, 
				       "aboutDialog", 
				       NULL, 0);
    temp = XmMessageBoxGetChild(aboutDialog,
                               XmDIALOG_HELP_BUTTON);
    XtUnmanageChild(temp);		       
    temp = XmMessageBoxGetChild(aboutDialog,
                               XmDIALOG_CANCEL_BUTTON);
    XtUnmanageChild(temp);
    
    /* Creating the Push Buttons for the menu options
     * using RowColumn, Frame Push Button and Label widgets */    
   
    frame_reset = XmCreateFrame(rowColumn_2f, 
				    "frame_reset", 
				    NULL,0);
    XtManageChild(frame_reset);
    
    
    rowColumn_reset = XmCreateRowColumn(frame_reset, 
				    "rowColumn_update", 
				    NULL,0);
    XtManageChild(rowColumn_reset);
    
    resetpix = XmCreatePushButton(rowColumn_reset, 
			      "resetpix", 
			      NULL, 0);
    XtManageChild(resetpix);
    XtAddCallback(resetpix,
		  XmNactivateCallback, 
		  Reset, 0);
    	  		  
    reset = XmCreateLabel(rowColumn_reset, 
			      "reset", 
			      NULL, 0);
    XtManageChild(reset);
   
    frame_update = XmCreateFrame(rowColumn_2f, 
				    "frame_update", 
				    NULL,0);
    XtManageChild(frame_update);
    
    rowColumn_update = XmCreateRowColumn(frame_update, 
				    "rowColumn_update", 
				    NULL,0);
    XtManageChild(rowColumn_update);
    
    updatepix = XmCreatePushButton(rowColumn_update, 
			      "updatepix", 
			      NULL, 0);
    XtManageChild(updatepix);
    XtAddCallback(updatepix,
		  XmNactivateCallback, 
		  Update, 0);
		  
    update = XmCreateLabel(rowColumn_update, 
			      "update", 
			      NULL, 0);
    XtManageChild(update);
 
    frame_print = XmCreateFrame(rowColumn_2f, 
				    "frame_print", 
				    NULL,0);
    XtManageChild(frame_print);
    
    rowColumn_print = XmCreateRowColumn(frame_print, 
				    "rowColumn_print", 
				    NULL,0);
    XtManageChild(rowColumn_print);
    
    printpix = XmCreatePushButton(rowColumn_print, 
			      "printpix", 
			      NULL, 0);
    XtManageChild(printpix);
    XtAddCallback(printpix,
		  XmNactivateCallback, 
		  Printverify, printDialog);
    
    print = XmCreateLabel(rowColumn_print, 
			      "print", 
			      NULL, 0);
    XtManageChild(print);
   
    frame_about = XmCreateFrame(rowColumn_2f, 
				    "frame_about", 
				    NULL,0);
    XtManageChild(frame_about);
    
    rowColumn_about = XmCreateRowColumn(frame_about, 
				    "rowColumn_about", 
				    NULL,0);
    XtManageChild(rowColumn_about);
    
    aboutpix = XmCreatePushButton(rowColumn_about, 
			      "aboutpix", 
			      NULL, 0);
    XtManageChild(aboutpix);
    XtAddCallback(aboutpix,
		  XmNactivateCallback, 
		  About, aboutDialog);
    
    about = XmCreateLabel(rowColumn_about, 
			      "about", 
			      NULL, 0);
    XtManageChild(about);
  
    frame_help = XmCreateFrame(rowColumn_2f, 
				    "frame_help", 
				    NULL,0);
    XtManageChild(frame_help);
    
    
    rowColumn_help = XmCreateRowColumn(frame_help, 
				    "rowColumn_help", 
				    NULL,0);
    XtManageChild(rowColumn_help);
    
    helppix = XmCreatePushButton(rowColumn_help, 
			      "helppix", 
			      NULL, 0);
    XtManageChild(helppix);
    XtAddCallback(helppix,
		  XmNactivateCallback, 
		  Help, helpDialog);
    help = XmCreateLabel(rowColumn_help, 
			      "help", 
			      NULL, 0);
    XtManageChild(help);
   
    frame_quit = XmCreateFrame(rowColumn_2f, 
				    "frame_quit", 
				    NULL,0);
    XtManageChild(frame_quit);
    
    
    rowColumn_quit = XmCreateRowColumn(frame_quit, 
				    "rowColumn_quit", 
				    NULL,0);
    XtManageChild(rowColumn_quit);
    
    quitpix = XmCreatePushButton(rowColumn_quit, 
			      "quitpix", 
			      NULL, 0);
    XtManageChild(quitpix);
    XtAddCallback(quitpix,
		  XmNactivateCallback, 
		  Quit, 0);
		  	  
    quit = XmCreateLabel(rowColumn_quit, 
			      "quit", 
			      NULL, 0);
    XtManageChild(quit);
   
    
       
    /* Creating the utility label&logo 
     * using Rowcolumn, Frame and Labels */   

    frame_f2 = XmCreateFrame(rowColumn_f,
			    "frame_f2", 
			    NULL, 0);
    XtManageChild(frame_f2);
    rowColumn_f2 = XmCreateRowColumn(frame_f2, 
				    "rowcolumn_f2", 
				    NULL,0);
    XtManageChild(rowColumn_f2);
    
    thetitle = XmCreateLabel(rowColumn_f2, 
			      "thetitle", 
			      NULL, 0);
    XtManageChild(thetitle);
    
    thebitmap = XmCreateLabel(rowColumn_f2, 
			      "thebitmap", 
			      NULL, 0);
    XtManageChild(thebitmap);
    
    /* Hotkey accelerators for Menu Options */
    
    XtInstallAccelerators(topLevel, reset);
    XtInstallAccelerators(topLevel, update);
    XtInstallAccelerators(topLevel, print);
    XtInstallAccelerators(topLevel, about);
    XtInstallAccelerators(topLevel, help);
    XtInstallAccelerators(topLevel, quit);
     
    /* Realising the created Widgets and 
     * entering the Application main loop */ 
      
    XtRealizeWidget(topLevel);
    XtAppMainLoop(app_context);
}

/*----------------------------------------------------------------------------
 * INITIALISES ALL THE ARRAYS TO '0'
 ----------------------------------------------------------------------------*/

void Initialise()
{
    int i, j;
    
    for( i = 1 ; i <= 50 ; i++ )
    {
	common_data_g[i] = 0;
	CGI[i-1] = 0.0;
    }
    for( i = 0 ; i <= 10 ; i++ )
    {
	if( i <= 9) SCGI[i] = 0;
	for( j = 0 ; j <= 16 ; j++ )
	{
	    bit_values_g[i][j] = 0;
	}
    }
   
}

/*----------------------------------------------------------------------------
 * DISPLAYS THE VALUES READ FROM REFLECIVE MEMORY IN REAL TIME
 ----------------------------------------------------------------------------*/
void Displayloop()
{
    int i, j;
    char *color_l1 = "green";
    char *color_l2 = "lightseagreen";
    
    rmrw();
    
    
    for( i = 1 ; i <= 40 ; i++ )
    {
	if(CGI[i-1] < a_min[i-1]) CGI[i-1] = a_min[i-1];
	else 
	if(CGI[i-1] > a_max[i-1]) CGI[i-1] = a_max[i-1];
	CGI[i-1] = CGI[i-1] * 100;
	XtVaSetValues(a_sliders[i],
		      XmNmaximum, a_max[i-1]*100, 
		      XmNminimum, a_min[i-1]*100, 
		      XmNdecimalPoints, 2,  
		      XmNvalue, (int)CGI[i-1], 
		      NULL); 
	common_data_g[i] = 0;	    
    }
    for( i = 1 ; i <= 10 ; i++ )
    {
	if(CGI[i+39] < b_min[i-1]) CGI[i+39] = b_min[i-1];
	else 
	if(CGI[i+39] > b_max[i-1]) CGI[i+39] = b_max[i-1];
	CGI[i+39] = CGI[i+39] * 100;
	XtVaSetValues(b_sliders[i],
		      XmNmaximum, b_max[i-1]*100, 
		      XmNminimum, b_min[i-1]*100,
		      XmNdecimalPoints, 2, 
		      XmNvalue,(int) CGI[i+39], 
		      NULL); 
	common_data_g[i + 40] = 0; 
    }
    
    
    XtAddCallback(quit,
		  XmNactivateCallback, 
		  Quit, 0);
    
    
    
    for( i = 0 ; i <= 9 ; i++ )
    {
	for( j = 16 ; j >= 1 ; j-- )
	{
	    bit_values_g[i+1][j] = SCGI[i]%2;
	    SCGI[i] = SCGI[i] / 2 ;
	}
    }
    
    for( i = 1 ; i <= 16 ; i++ )
    {
	for( j = 1 ; j <= 10 ; j++ )
	{
	    if(bit_values_g[i][j] == 1 )
	    {
		XtVaSetValues(bit_buttons[(i * 11) + j], 
			  XtVaTypedArg, 
			  XmNbackground, 
			  XmRString, 
			  color_l1, 
			  strlen(color_l1) + 1, 
			  NULL);
		flag[(i * 11) + j] = 1; 
	    }
	    else
	    {
		XtVaSetValues(bit_buttons[(i * 11) + j], 
			  XtVaTypedArg, 
			  XmNbackground, 
			  XmRString, 
			  color_l2, 
			  strlen(color_l2) + 1, 
			  NULL);
		flag[(i * 11) + j] = 0; 
	    }
	    
	}
    }
    
   
    if(display_flag) Displayloop();
}

/*----------------------------------------------------------------------------*/


syntax highlighted by Code2HTML, v. 0.9