/*-----------------------------------------------------------------------------
*
* 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