[comp.sys.sgi] panel05/06

dat@ORVILLE.NAS.NASA.GOV ("David A. Tristram") (08/19/88)

#!/bin/sh
# this is part 5 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file panel.c continued
#
CurArch=5
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> panel.c
X      FP(DF, " /* a->p=0x%x; */\n", a->p);
X      FP(DF, "    addact(a, p);\n");
X      FP(DF, "\n");
X      if (!ingroup&&a->group) ingroup=TRUE;
X      if (!a->group&&ingroup) {
X	FP(DF, "    endgroup();\n");
X	ingroup=FALSE;
X      }
X      FP(DF, "\n");
X    }
X  }
X  fclose(dumpfile);
X  return TRUE;
X}
X
Xchar 
X*alloc(size)
Xint size;
X{
Xchar *p;
X
X    if (p=(char *)calloc(1,size)) return p;
X    else {
X	perror("calloc");
X	exit(1);
X    }
X}
X
XBoolean
Xscreenpnt(wx, wy, wz, sx, sy)	/* returns false if pnt is clipped */
XCoord wx, wy, wz;
XScreencoord *sx, *sy;
X{
Xshort buf[3];
X
X    feedback(buf, 3);
X    pnt(wx, wy, wz);
X    passthrough(0x99);
X    endfeedback(buf);
X    if (buf[0]==0x8) { /* passthrough command */
X	*sx= *sy=0;
X	return FALSE;
X    } else {
X        *sx=buf[1];
X	*sy=buf[2];
X	return TRUE;
X    }
X}
X
SHAR_EOF
chmod 0644 panel.c || echo "restore of panel.c fails"
sed 's/^X//' << 'SHAR_EOF' > panel.h &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#ifndef PNL_EDITOR_PARSING
X#ifndef PNL_EXTERN
X#define PNL_EXTERN  extern
X#endif
X#ifndef PNL_INIT
X#define PNL_INIT(x) /* nothing */
X#endif
X#ifndef FILE
X#include <stdio.h>
X#endif
X#ifndef NULL
X#define NULL	0
X#endif
X#ifndef PI
X#define PI	3.14159265358979323846	    /* from math.h */
X#endif
X#define	PNL_RAD_TO_DEG	(0.31830988618379067154*180.0)
X#define PNL_TABLE_SIZE	4096		/* max number of panels + actuators */
X
X#ifndef MAXSGIDEVICE
X#define MAXSGIDEVICE	20000
X#endif  MAXSGIDEVICE
X#define PNL_DEVICE_OFFSET   (MAXSGIDEVICE+1)
X#define PNL_TOKEN	    (PNL_DEVICE_OFFSET+0)
X
X#define PNL_PIXELS_PER_UNIT	50.0 /* used to size the panel */
X#define PNL_CHAR_THRESHOLD	35.0 /* ppu below this, draw chars as rects */
X
X#define PNL_CHAR_PIXEL_HEIGHT	10
X#define PNL_CHAR_PIXEL_WIDTH	10
X
X#ifdef IRIS_NEWS
X#  define PNL_SCREEN_BORDER	12
X#  define PNL_TITLE_BAR_HEIGHT	19
X#else
X#  define PNL_SCREEN_BORDER	6
X#  define PNL_TITLE_BAR_HEIGHT	18
X#endif
X
X/* dimensions */
X#define PNL_MARGIN		0.2	/* absolute edge of panel left blank */
X#define PNL_DIM_1		0.2	/* absolute dist tween actuators */
X#define PNL_DIM_2		0.1	/* absolute dist to a label */
X#define PNL_DIM_3		0.05	/* a tiny little distance */
X#define PNL_DIM_4		0.025	/* half of THAT! */
X#define PNL_SLIDER_HEIGHT	(6.0-PNL_DIM_1)	/* w/o label */
X#define PNL_SLIDER_WIDTH	(1.0-PNL_DIM_1)
X#define PNL_SLIDER_BAR_HEIGHT	(0.05*PNL_SLIDER_HEIGHT)
X#define PNL_BUTTON_EDGE		(0.5-0.5*PNL_DIM_1)
X#define PNL_WIDE_BUTTON_WIDTH   (2.0-PNL_DIM_1)
X#define PNL_WIDE_BUTTON_HEIGHT  PNL_BUTTON_EDGE
X#define PNL_TYPEIN_LENGTH	40  /* default length in characters */
X#define PNL_TYPEIN_MAX_STRING	256
X#define PNL_TYPEOUT_BUFSIZ	4096
X#define PNL_TYPEOUT_COLUMNS	PNL_TYPEIN_LENGTH
X#define PNL_TYPEOUT_LINES	4
X#define PNL_TYPEOUT_MAX_COLUMNS 256
X#define PNL_SCROLL_WIDTH	(2.0*PNL_DIM_1)
X#define PNL_TYPEOUT_ARROW_HEIGHT    (PNL_SCROLL_WIDTH/2.0)
X#define PNL_PUCK_EDGE		(4.0-PNL_DIM_1)
X#define PNL_PUCK_SIZE		(1.0-PNL_DIM_1)
X#define PNL_FLOATING_PUCK_EDGE	(1.0-PNL_DIM_1)
X#define PNL_FLOATING_PUCK_SENS	10.0	/* units per full range output */
X#define PNL_METER_HEIGHT        (1.8-PNL_DIM_1)
X#define PNL_METER_WIDTH         (3.0-PNL_DIM_1)
X#define PNL_METER_LINEWIDTH     4 /* Pixels for meter pointer and bar line */
X#define PNL_STRIP_HEIGHT        (1.8-PNL_DIM_1)
X#define PNL_STRIP_WIDTH         (6.0-PNL_DIM_1)
X#define PNL_STRIP_LINEWIDTH	2
X#define PNL_STRIP_CHART_NPTS            200
X#define PNL_SLIDEROID_HEIGHT	(1.5-PNL_DIM_1)
X#define PNL_SLIDEROID_WIDTH	(2.0-PNL_DIM_1)
X#define PNL_DIAL_EDGE		(1.0-PNL_DIM_1)
X#define PNL_DIAL_WINDS		0.88	/* revs per full range output */
X
X/* Actuator types */
X#define PNL_MAXACT		0x7ffff	    /* user types start here+1 */
X#define PNL_SLIDER		0
X#define PNL_VSLIDER		PNL_SLIDER
X#define PNL_HSLIDER		1
X#define PNL_FILLED_SLIDER	2
X#define PNL_FILLED_VSLIDER	PNL_FILLED_SLIDER
X#define PNL_FILLED_HSLIDER 	3
X#define PNL_DVSLIDER		4
X#define PNL_DHSLIDER 		5
X#define PNL_BUTTON 		10
X#define PNL_TOGGLE_BUTTON 	11
X#define PNL_RADIO_BUTTON 	12
X#define PNL_WIDE_BUTTON 	13
X#define PNL_TYPEIN 		20
X#define PNL_LABEL 		21
X#define PNL_TYPEOUT 		30
X#define PNL_METER 		40
X#define PNL_ANALOG_METER 	PNL_METER
X#define PNL_ANALOG_BAR 		41
X#define PNL_STRIP_CHART 	42
X#define PNL_SCALE_CHART 	43
X#define PNL_PUCK 		50
X#define PNL_FLOATING_PUCK 	51
X#define PNL_RUBBER_PUCK 	52
X#define PNL_SLIDEROID		60
X#define PNL_PALETTE		70
X#define PNL_DIAL		80
X#define PNL_MOUSE		1000
X
X/* drawing styles */
X#define PNL_OPEN		0
X#define PNL_FILLED		1
X
X/* label styles */
X#define PNL_LABEL_LEFT		0
X#define PNL_LABEL_RIGHT		1
X#define PNL_LABEL_BOTTOM	2
X#define PNL_LABEL_TOP		3
X#define	PNL_LABEL_NORMAL	4
X#define PNL_LABEL_CENTER	5
X
X/* colors */
X#ifdef IRIS_4D
X#define PNL_WHITE_COLOR		WHITE
X#define PNL_NORMAL_COLOR	490
X#define PNL_OTHER_COLOR		474	/* light enough? */
X#define PNL_BACKGROUND_COLOR	27
X#define PNL_HIGHLIGHT_COLOR	457
X#define PNL_OUTLINE_COLOR	321
X#else  IRIS_4D
X#define PNL_WHITE_COLOR		WHITE
X#define PNL_NORMAL_COLOR	30
X#define PNL_OTHER_COLOR		27
X#define PNL_BACKGROUND_COLOR	25
X#define PNL_HIGHLIGHT_COLOR	21
X#define PNL_OUTLINE_COLOR	BLACK
X#endif IRIS_4D
X
XPNL_EXTERN Colorindex pnl_background_color  PNL_INIT(PNL_BACKGROUND_COLOR);
XPNL_EXTERN Colorindex pnl_white_color	    PNL_INIT(PNL_WHITE_COLOR);
XPNL_EXTERN Colorindex pnl_normal_color	    PNL_INIT(PNL_NORMAL_COLOR);
XPNL_EXTERN Colorindex pnl_other_color	    PNL_INIT(PNL_OTHER_COLOR);
XPNL_EXTERN Colorindex pnl_highlight_color   PNL_INIT(PNL_HIGHLIGHT_COLOR);
XPNL_EXTERN Colorindex pnl_outline_color	    PNL_INIT(PNL_OUTLINE_COLOR);
X
X/* mouse action sources */
X
X#define PNL_SRC_QUEUE	0
X#define PNL_SRC_SCRIPT	1
X
X/* script message types */
X
X#define PNL_MT_STATE	0
X#define PNL_MT_MOUSE	1
X#define PNL_MT_DELAY	2
X#define PNL_MT_ENDBLOCK	3
X
X#define PNL_HITACT(a,wx,wy)    \
X    ((wx)>(a)->x && (wx)<(a)->x+(a)->w && (wy)>(a)->y && (wy)<(a)->y+(a)->h)
X#define	PNL_ACCESS(type, ptr, member)    (((type *)(ptr->data))->member)
X#define PNL_MKUSERACT(struct_type, type)			\
X    ((struct struct_type *)				\
X    _mkuseract (sizeof (struct struct_type), type))
X
X#define ABS(a)		((a)>0.0?(a):-(a))
X#define	MIN(a, b)	((a)<(b)?(a):(b))
X#define	MAX(a, b)	((a)>(b)?(a):(b))
X#define	RANGE(a, b1, b2)			\
X						\
X        ((b1)<(b2)?				\
X	     ((a)<(b1)?				\
X		  (b1):				\
X		  ((a)>(b2)?			\
X		       (b2):(a))):		\
X	     ((a)<(b2)?				\
X		  (b2):				\
X		  ((a)>(b1)?			\
X		       (b1):(a))))
X
X#define PNL_VAL_TO_WORLD(val, min, max, dist)     \
X  (((val)-(min))/((max)-(min))*(dist))
X
X#define PNL_WORLD_TO_VAL(x, min, max, dist)       \
X  ((x)/(dist)*((max)-(min))+(min))  
X
X#endif PNL_EDITOR_PARSING
X
Xtypedef struct panel {
X    short id;			/* unique id  */
X    struct actuator *a;		/* current actuator */
X    struct actuator *al;		/* actuator list */
X    struct alist *autolist;		/* list of auto actuators */
X    struct actuator *lastgroup;		/* last actuator added to a group */
X    Boolean active, enabled;
X    long x, y, w, h;
X    Coord minx;
X    Coord maxx;
X    Coord miny;
X    Coord maxy;
X    Coord cw,ch;   /* char width and height */
X    short gid;	   /* mex window number of this panels window */
X    short usergid; /* mex window number of one of the user's windows */
X    Object vobj;   /* viewing transformations */
X    float ppu;	   /* pixels per unit */
X    char *label;
X#ifdef IRIS_4D
X    void (*fixfunc)(struct actuator *);
X#else  IRIS_4D
X    void (*fixfunc)();
X#endif IRIS_4D
X    void (*drawfunc)();
X    void (*downfunc)();
X    void (*activefunc)();
X    void (*upfunc)();
X    int dirtycnt;
X    struct panel *next;
X} Panel;
X
Xtypedef struct actuator {
X    short id;			/* unique id */
X    struct panel *p;		/* pointer to enclosing panel */
X    int type;			/* type id, init func should set this */
X    Boolean active;
X    Coord x, y, w, h;
X    Coord lx, ly, lw, lh;	/* offset and size of label */
X    Coord ld;			/* descender size */
X    float val, initval, maxval, minval;
X    char *label;
X    Device key;			/* keyboard equivalent */
X    int labeltype;  /* location of the label relative to the actuator */
X    void (*addfunc)();
X#ifdef IRIS_4D
X    void (*fixfunc)(struct actuator *);
X    Boolean (*pickfunc)(/*struct actuator *,struct panel *,float,float*/);
X    void (*newvalfunc)(struct actuator *,struct panel *,short,short);
X    void (*dumpfunc)(struct actuator *, int);
X    void (*loadfunc)(struct actuator *, int);
X#else  IRIS_4D
X    void (*fixfunc)();
X    Boolean (*pickfunc)();
X    void (*newvalfunc)();
X    void (*dumpfunc)();
X    void (*loadfunc)();
X#endif IRIS_4D
X    void (*drawfunc)();
X    void (*downfunc)();
X    void (*activefunc)();
X    void (*upfunc)();
X    int dirtycnt;
X    char *u;	    /* pointer to arbitrary user data */
X    char *data;	    /* pointer to data peculiar to a particular actuator */
X    int datasize;   /* size of data struct plus everyting it points to */
X    Boolean automatic;   /* true ==> newvalfunc called every dopanel */
X    Boolean selectable;	/* false ==> unpickable, newvalfunc never called */
X    Boolean visible; /* does this actuator have a visible manifestation? */
X    struct actuator *group;
X    struct actuator *next;
X} Actuator;
X
X#ifndef PNL_EDITOR_PARSING
X
Xtypedef struct alist {
X    Actuator *a;
X    struct alist *next;
X} Alist;
X
X/* actuator specific data */
X
Xtypedef struct {
X    float x, y;
X} Point;
X
Xtypedef struct {
X  int firstpt, lastpt;
X  Boolean Bind_Low, Bind_High;
X  float *y;
X} Stripchart;
X
Xtypedef struct {
X  int mode;
X  float finefactor;
X  float valsave;
X  Coord wsave;
X} Slider;
X
Xtypedef struct {
X  char * str;
X  int len;
X} Typein;
X
Xtypedef struct {
X  char *buf;
X  int start;		/* first char to display (appears in upper-left) */
X  int dot;		/* insertion point */
X  int col,lin;		/* width and height in character positions */
X  int len;		/* number of chars in buffer */
X  int size;		/* buffer size */
X  Coord ch, cw, cd;     /* character dimensions */
X} Typeout;
X
Xtypedef Point Puck;
X
Xtypedef struct {
X  Screencoord x;
X  Screencoord y;
X} Mouse;
X
Xtypedef struct {
X  int mode;
X  Boolean finemode, resetmode;
X  float *resettarget, resetval;
X  float valsave;
X  Coord wsave;
X} Slideroid;
X
Xtypedef Slider Palette;
Xtypedef struct {
X  int mode;
X  float finefactor;
X  float valsave;
X  Coord wsave;
X  float winds;
X} Dial;
X
X/* globals */
X
XPNL_EXTERN int pnl_id		PNL_INIT(0);
X			/* an incrementing index into the table */
X
XPNL_EXTERN char *pnl_table[PNL_TABLE_SIZE];
X			/* table of pointers to all panels and actuators */
X
XPNL_EXTERN Panel *pnl_pl 	PNL_INIT(NULL);
X			/* list of all control panels */
X
XPNL_EXTERN Alist *pnl_kl	PNL_INIT(NULL);
X			/* a list of actuators with key equivalents */
X
XPNL_EXTERN Panel *pnl_cp	PNL_INIT(NULL);
X			/* panel being moused (current panel) */
X
XPNL_EXTERN Actuator *pnl_ca	PNL_INIT(NULL);
X			/* actuator being moused (current actuator) */
X
XPNL_EXTERN Panel *pnl_cp_save	PNL_INIT(NULL);
X			/* last cp from queue */
X
XPNL_EXTERN Actuator *pnl_ca_save	PNL_INIT(NULL);
X			/* last ca from queue */
X
XPNL_EXTERN Boolean pnl_ca_active_save	PNL_INIT(FALSE);
X			/* state of active field in pnl_ca_save */
X
XPNL_EXTERN Boolean pnl_cp_active_save	PNL_INIT(FALSE);
X			/* state of active field in pnl_cp_save */
X
XPNL_EXTERN Actuator *pnl_mouse_act	PNL_INIT(NULL);
X			/* the mouse actuator, if any */
X
XPNL_EXTERN Screencoord pnl_mx, pnl_my;
X			/* where the mouse is */
X
XPNL_EXTERN long int pnl_frame	PNL_INIT(0);
X			/* frames since last delay message */
X
XPNL_EXTERN int pnl_delay	PNL_INIT(0);
X			/* frames 'til next message allowed from the queue */
X
XPNL_EXTERN Boolean pnl_delayvirgin	PNL_INIT(TRUE);
X			/* flag prevents writing initial delay token */
X
XPNL_EXTERN Boolean pnl_readscript	PNL_INIT(FALSE);
X
XPNL_EXTERN Boolean pnl_writescript	PNL_INIT(FALSE);
X
XPNL_EXTERN int pnl_scriptinfd		PNL_INIT(0);
X
XPNL_EXTERN int pnl_scriptoutfd		PNL_INIT(0);
X
XPNL_EXTERN char *pnl_scriptinfile	PNL_INIT("panel.script");
X
XPNL_EXTERN char *pnl_scriptoutfile	PNL_INIT("panel.script");
X
XPNL_EXTERN Boolean pnl_virgin		PNL_INIT(TRUE);	
X			/* haven't done a dopanel yet */
X
XPNL_EXTERN Boolean pnl_saveuserredraw	PNL_INIT(FALSE);	
X			/* if the user is using them, requeue them */
X
XPNL_EXTERN Boolean pnl_scripting	PNL_INIT(FALSE);
X			/* writing a script file */
X
XPNL_EXTERN Screencoord pnl_ox, pnl_oy;
X			/* last window origin */
X
XPNL_EXTERN Boolean pnl_justdown;
X			/* true when button first goes down */
X
XPNL_EXTERN Boolean pnl_justup;	
X			/* true when button first goes up */
X
XPNL_EXTERN Boolean pnl_mousedown;
X			/* true when button is (was) down */
X			/* (according to the queue) */
X
XPNL_EXTERN Boolean pnl_shiftkey		PNL_INIT(FALSE);
X			/* true when the shift key is down */
X
XPNL_EXTERN Boolean pnl_controlkey	PNL_INIT(FALSE);
X			/* true when the control key is down */
X
XPNL_EXTERN int pnl_winsave;	
X			/* gid of (user's) window when dopanel() is called */
X
XPNL_EXTERN int pnl_action_source	PNL_INIT(PNL_SRC_QUEUE);
X			/* where last mouse action came from */
X
XPNL_EXTERN float pnl_char_threshold	PNL_INIT(PNL_CHAR_THRESHOLD);
X			/* see PNL_CHAR_THRESHOLD above */
X
X/* panel library utilities */
X
X#ifdef IRIS_4D
Xchar *alloc(int);
X#else  IRIS_4D
Xchar *alloc();
X#endif IRIS_4D
X
X/* user functions */
X
XPNL_EXTERN Panel    *mkpanel();
XPNL_EXTERN Actuator *dopanel();
XPNL_EXTERN void	    dumpstate();
XPNL_EXTERN void	    drawpanel();
XPNL_EXTERN short    userredraw();
XPNL_EXTERN void	    needredraw();
XPNL_EXTERN Boolean  dumppanel();
X
X#ifdef IRIS_4D
X
XPNL_EXTERN Actuator *mkact(/*void (*)()*/); /* parameter decl doesn't seem to work */
XPNL_EXTERN Actuator *_mkuseract(/*int, void (*)()*/); /* parameter decl doesn't seem to work */
XPNL_EXTERN void	addact(Actuator *,Panel *);
XPNL_EXTERN void	endgroup(Panel *);
XPNL_EXTERN char	*g_gets(Colorindex,Colorindex,Colorindex);
XPNL_EXTERN char	*g_getstring(Colorindex,Colorindex,Colorindex,char *,int);
XPNL_EXTERN Boolean pnl_beginreadscript(char *);
XPNL_EXTERN Boolean pnl_beginwritescript(char *);
XPNL_EXTERN void pnl_endreadscript();
XPNL_EXTERN void pnl_endwritescript();
X
X#else  IRIS_4D
X
XPNL_EXTERN Actuator *mkact();
XPNL_EXTERN Actuator *_mkuseract();
XPNL_EXTERN void	addact();
XPNL_EXTERN void	endgroup();
XPNL_EXTERN char	*g_gets();
XPNL_EXTERN char	*g_getstring();
XPNL_EXTERN Boolean pnl_beginreadscript();
XPNL_EXTERN Boolean pnl_beginwritescript();
XPNL_EXTERN void pnl_endreadscript();
XPNL_EXTERN void pnl_endwritescript();
X
X#endif IRIS_4D
X
X#ifdef IRIS_4D
Xextern void pnl_slider(Actuator *);
Xextern void pnl_vslider(Actuator *);
Xextern void pnl_hslider(Actuator *);
Xextern void pnl_dvslider(Actuator *);
Xextern void pnl_dhslider(Actuator *);
Xextern void pnl_filled_slider(Actuator *);
Xextern void pnl_filled_vslider(Actuator *);
Xextern void pnl_filled_hslider(Actuator *);
Xextern void pnl_button(Actuator *);
Xextern void pnl_wide_button(Actuator *);
Xextern void pnl_toggle_button(Actuator *);
Xextern void pnl_radio_button(Actuator *);
Xextern void pnl_meter(Actuator *);
Xextern void pnl_analog_meter(Actuator *);
Xextern void pnl_analog_bar(Actuator *);
Xextern void pnl_strip_chart(Actuator *);
Xextern void pnl_scale_chart(Actuator *);
Xextern void pnl_puck(Actuator *);
Xextern void pnl_floating_puck(Actuator *);
Xextern void pnl_rubber_puck(Actuator *);
Xextern void pnl_typein(Actuator *);
Xextern void pnl_typeout(Actuator *);
Xextern void pnl_label(Actuator *);
Xextern void pnl_mouse(Actuator *);
Xextern void pnl_slideroid(Actuator *);
Xextern void pnl_palette(Actuator *);
Xextern void pnl_dial(Actuator *);
X#else  IRIS_4D
Xextern void pnl_slider();
Xextern void pnl_vslider();
Xextern void pnl_hslider();
Xextern void pnl_dvslider();
Xextern void pnl_dhslider();
Xextern void pnl_filled_slider();
Xextern void pnl_filled_vslider();
Xextern void pnl_filled_hslider();
Xextern void pnl_button();
Xextern void pnl_wide_button();
Xextern void pnl_toggle_button();
Xextern void pnl_radio_button();
Xextern void pnl_meter();
Xextern void pnl_analog_meter();
Xextern void pnl_analog_bar();
Xextern void pnl_strip_chart();
Xextern void pnl_scale_chart();
Xextern void pnl_puck();
Xextern void pnl_floating_puck();
Xextern void pnl_rubber_puck();
Xextern void pnl_typein();
Xextern void pnl_typeout();
Xextern void pnl_label();
Xextern void pnl_mouse();
Xextern void pnl_slideroid();
Xextern void pnl_palette();
Xextern void pnl_dial();
X#endif IRIS_4D
X
X#endif PNL_EDITOR_PARSING
SHAR_EOF
chmod 0644 panel.h || echo "restore of panel.h fails"
sed 's/^X//' << 'SHAR_EOF' > puck.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <math.h>
X#include <gl.h>
X#include "panel.h"
X
Xvoid _newvalpuck(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
XCoord wx,wy;
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X    if (!a->active) return;
X
X    mapw2(p->vobj,sx,sy,&wx,&wy);
X    wx=RANGE(wx-a->x, d, a->w-d);
X    wy=RANGE(wy-a->y, d, a->h-d);
X    PNL_ACCESS(Puck, a, x)=(wx-d)/(a->w-2.0*d)*(a->maxval-a->minval)+a->minval;
X    PNL_ACCESS(Puck, a, y)=(wy-d)/(a->h-2.0*d)*(a->maxval-a->minval)+a->minval;
X}
X
Xvoid
X_drawpuckshape(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X  if (style==PNL_FILLED) {
X    pmv2(-d,0.0);
X    pdr2(-PNL_DIM_2,-PNL_DIM_2);
X    pdr2(PNL_DIM_2,-PNL_DIM_2);
X    pdr2(d,0.0);
X    pdr2(PNL_DIM_2,PNL_DIM_2);
X    pdr2(-PNL_DIM_2,PNL_DIM_2);
X    pclos();
X    pmv2(0.0,-d);
X    pdr2(PNL_DIM_2,-PNL_DIM_2);
X    pdr2(PNL_DIM_2,PNL_DIM_2);
X    pdr2(0.0,d);
X    pdr2(-PNL_DIM_2,PNL_DIM_2);
X    pdr2(-PNL_DIM_2,-PNL_DIM_2);
X    pclos();
X  } else {
X    move2(-d,0.0);
X    draw2(-PNL_DIM_2, -PNL_DIM_2);
X    draw2(0.0,-d);
X    draw2(PNL_DIM_2,-PNL_DIM_2);
X    draw2(d,0.0);
X    draw2(PNL_DIM_2,PNL_DIM_2);
X    draw2(0.0,d);
X    draw2(-PNL_DIM_2,PNL_DIM_2);
X    draw2(-d,0.0);
X  }
X}
X
Xvoid
X_drawpuck(a, p)
XActuator *a;
XPanel *p;
X{
XCoord x,y;
Xstatic Coord d = PNL_PUCK_SIZE/2.0;
X
X    color(PNL_NORMAL_COLOR);
X    rectf(a->x,a->y,a->x+a->w,a->y+a->h);
X
X    pushmatrix();
X    x=a->w*(PNL_ACCESS(Puck, a, x)-a->minval)/(a->maxval-a->minval);
X    y=a->h*(PNL_ACCESS(Puck, a, y)-a->minval)/(a->maxval-a->minval);
X
X    translate(a->x+d, a->y+d, 0.0);
X    translate(x*(a->w-PNL_PUCK_SIZE)/a->w,y*(a->h-PNL_PUCK_SIZE)/a->h,0.0);
X
X    color(PNL_HIGHLIGHT_COLOR);
X    _drawpuckshape(a,p,PNL_FILLED);
X    color(PNL_OUTLINE_COLOR);
X    _drawpuckshape(a,p,PNL_OPEN);
X    popmatrix();
X
X    color(PNL_OUTLINE_COLOR);
X    rect(a->x,a->y,a->x+a->w,a->y+a->h);
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_newvalfloatingpuck(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
XCoord wx,wy;
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X    if (!a->active) return;
X
X    mapw2(p->vobj,sx,sy,&wx,&wy);
X    PNL_ACCESS(Puck, a, x)=(wx-a->x-d)/PNL_FLOATING_PUCK_SENS
X			    *(a->maxval-a->minval);
X    PNL_ACCESS(Puck, a, y)=(wy-a->y-d)/PNL_FLOATING_PUCK_SENS
X			    *(a->maxval-a->minval);
X}
X
X#define PUCK_ERASE  0
X#define PUCK_DRAW   1
X
X/*
X *  drawpup	erase and draw in pup planes
X *
X *	caveats:
X *
X *	    for erasing to work correctly, subsequent calls
X *	    must be made with the same drawfunc.
X *
X *	    on the 3030, the cursor should be turned off.
X *
X */
X
X_drawpup(a,p,x,y,mode,drawfunc)
XActuator *a;  /*p*/
XPanel *p;
XCoord x,y;
Xint mode;
Xvoid (* drawfunc)();
X{
Xlong savemode;
Xstatic Boolean drawn=FALSE;
Xstatic Coord ox=0.0,oy=0.0,ox2=0.0,oy2=0.0;
X
X	if (mode==PUCK_DRAW
X	    && ox==x
X	    && oy==y
X	    && drawn) return;
X#ifdef IRIS_4D
X	savemode=getdrawmode();
X	drawmode(PUPDRAW);
X#else  IRIS_4D
X	pupmode();
X#endif IRIS_4D
X
X	pushmatrix();
X	pushviewport();
X	fullscrn();
X	ortho2(p->minx-(p->x/p->ppu),
X	       p->minx+((XMAXSCREEN-p->x)/p->ppu),
X	       p->miny-(p->y/p->ppu),
X	       p->miny+((YMAXSCREEN-p->y)/p->ppu));
X
X
X#ifdef IRIS_4D
X	color(0);
X#else  IRIS_4D
X	pupcolor(PUP_CLEAR);
X#endif IRIS_4D
X/*	pushmatrix();
X	translate(ox2,oy2,0.0);
X	(* drawfunc)(a,p,PNL_FILLED);
X	popmatrix(); */
X
X	pushmatrix();
X	translate(ox,oy,0.0);
X	(* drawfunc)(a,p,ox,oy,PNL_FILLED);
X	popmatrix();
X	drawn=FALSE;
X
X	if (mode==PUCK_DRAW) {
X#ifdef IRIS_4D
X	    color(1);
X#else  IRIS_4D
X	    pupcolor(PUP_CURSOR);
X#endif IRIS_4D
X	    pushmatrix();
X	    translate(x,y,0.0);
X	    (*drawfunc)(a,p, x, y, PNL_FILLED);
X	    popmatrix();
X	    ox2=ox;oy2=oy;
X	    ox=x;oy=y;
X	    drawn=TRUE;
X	}
X
X#ifdef IRIS_4D
X	drawmode((Boolean)savemode);
X#else  IRIS_4D
X	endpupmode();
X#endif IRIS_4D
X
X	endfullscrn();
X	popviewport();
X	popmatrix();
X}
X
Xvoid
X_drawfloatingpuck(a,p)
XActuator *a;
XPanel *p;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
XCoord x=0.0, y=0.0;
X
X    pushmatrix();
X    if (!a->active) {
X	_drawpup(a,p,x,y,PUCK_ERASE,_drawpuckshape);
X
X	translate(a->x,a->y,0.0);
X	color(PNL_NORMAL_COLOR);
X        rectf(0.0,0.0,a->w,a->h);
X	color(PNL_OUTLINE_COLOR);
X        rect(0.0,0.0,a->w,a->h);
X	color(PNL_HIGHLIGHT_COLOR);
X	translate(a->w/2.0,a->h/2.0,0.0);
X	_drawpuckshape(a,p,x,y,PNL_FILLED);
X	color(PNL_OUTLINE_COLOR);
X	_drawpuckshape(a,p,x,y,PNL_OPEN);
X	curson();
X    } else {
X	cursoff();
X	x=PNL_FLOATING_PUCK_SENS
X	    *PNL_ACCESS(Puck, a, x)/(a->maxval-a->minval)
X	    +a->x+a->w/2.0;
X	y=PNL_FLOATING_PUCK_SENS
X	    *PNL_ACCESS(Puck, a, y)/(a->maxval-a->minval)
X	    +a->y+a->h/2.0;
X
X	_drawpup(a,p,x,y,PUCK_DRAW,_drawpuckshape);
X
X	translate(a->x,a->y,0.0);
X	color(PNL_HIGHLIGHT_COLOR);
X        rectf(0.0,0.0,a->w,a->h);
X	color(PNL_OUTLINE_COLOR);
X        rect(0.0,0.0,a->w,a->h);
X
X	color(PNL_NORMAL_COLOR);
X	translate(a->w/2.0,a->h/2.0,0.0);
X	_drawpuckshape(a,p,x,y,PNL_FILLED);
X	color(PNL_OUTLINE_COLOR);
X	_drawpuckshape(a,p,x,y,PNL_OPEN);
X    }
X    popmatrix();
X
X    color(PNL_OUTLINE_COLOR);
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawrubberband(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
Xfloat r, alpha;
XCoord dx, dy;
X
X    dx=a->x+a->w/2.0-x;
X    dy=a->y+a->h/2.0-y;
X
X    rectf(dx-PNL_DIM_3, 
X	  dy-PNL_DIM_3, 
X	  dx+PNL_DIM_3, 
X	  dy+PNL_DIM_3);
X
X    pushmatrix();
X    r=hypot((long float)dx,(long float)dy);
X    if (dx==0.0&&dy==0.0) alpha=0.0;
X    else		  alpha=atan2(dy,dx);
X    alpha=fmod(alpha, 360.0);
X    rot(alpha*PNL_RAD_TO_DEG,'z');
X    rectf(0.0,-PNL_DIM_3/2.0,r,PNL_DIM_3/2.0);
X    popmatrix();
X}
X
Xvoid
X_drawrubberpuckshape(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
X
X  if (style==PNL_FILLED) {
X    rectf(-d,-PNL_DIM_3,d,PNL_DIM_3);
X    rectf(-PNL_DIM_3,-d,PNL_DIM_3,d);
X    rectf(-PNL_DIM_2,-PNL_DIM_2,PNL_DIM_2,PNL_DIM_2);
X  } else {
X    move2(-PNL_DIM_3,-d);
X    draw2(PNL_DIM_3,-d);
X    draw2(PNL_DIM_3,-PNL_DIM_2);
X    draw2(PNL_DIM_2,-PNL_DIM_2);
X    draw2(PNL_DIM_2,-PNL_DIM_3);
X    draw2(d,-PNL_DIM_3);
X    draw2(d,PNL_DIM_3);
X    draw2(PNL_DIM_2,PNL_DIM_3);
X    draw2(PNL_DIM_2,PNL_DIM_2);
X    draw2(PNL_DIM_3,PNL_DIM_2);
X    draw2(PNL_DIM_3,d);
X    draw2(-PNL_DIM_3,d);
X    draw2(-PNL_DIM_3,PNL_DIM_2);
X    draw2(-PNL_DIM_2,PNL_DIM_2);
X    draw2(-PNL_DIM_2,PNL_DIM_3);
X    draw2(-d,PNL_DIM_3);
X    draw2(-d,-PNL_DIM_3);
X    draw2(-PNL_DIM_2,-PNL_DIM_3);
X    draw2(-PNL_DIM_2,-PNL_DIM_2);
X    draw2(-PNL_DIM_3,-PNL_DIM_2);
X    draw2(-PNL_DIM_3,-d);
X  }
X}
X
Xvoid
X_drawrubberpuckshapeandband(a, p, x, y, style)
XActuator *a;
XPanel *p;
XCoord x, y;
Xint style;
X{
X    _drawrubberpuckshape(a, p, x, y, style);
X    _drawrubberband(a, p, x, y, style);
X}
X
Xvoid
X_drawrubberpuck(a,p)
XActuator *a;
XPanel *p;
X{
Xstatic Coord d=PNL_PUCK_SIZE/2.0;
Xstatic Coord x, y;
X
X    pushmatrix();
X    if (!a->active) {
X	_drawpup(a,p,x,y,PUCK_ERASE,_drawrubberpuckshapeandband);
X	translate(a->x,a->y,0.0);
X	color(PNL_NORMAL_COLOR);
X        rectf(0.0,0.0,a->w,a->h);
X	color(PNL_OUTLINE_COLOR);
X        rect(0.0,0.0,a->w,a->h);
X	color(PNL_HIGHLIGHT_COLOR);
X	translate(a->w/2.0,a->h/2.0,0.0);
X	_drawrubberpuckshape(a,p,x,y,PNL_FILLED);
X	color(PNL_OUTLINE_COLOR);
X	_drawrubberpuckshape(a,p,x,y,PNL_OPEN);
X	curson();
X    } else {
X	cursoff();
X	x=PNL_FLOATING_PUCK_SENS
X	    *PNL_ACCESS(Puck, a, x)/(a->maxval-a->minval)
X	    +a->x+a->w/2.0;
X	y=PNL_FLOATING_PUCK_SENS
X	    *PNL_ACCESS(Puck, a, y)/(a->maxval-a->minval)
X	    +a->y+a->h/2.0;
X
X	_drawpup(a,p,x,y,PUCK_DRAW,_drawrubberpuckshapeandband);
X
X	translate(a->x,a->y,0.0);
X	color(PNL_HIGHLIGHT_COLOR);
X        rectf(0.0,0.0,a->w,a->h);
X	color(PNL_OUTLINE_COLOR);
X        rect(0.0,0.0,a->w,a->h);
X
X	color(PNL_NORMAL_COLOR);
X	translate(a->w/2.0,a->h/2.0,0.0);
X	_drawrubberpuckshape(a,p,x,y,PNL_FILLED);
X	color(PNL_OUTLINE_COLOR);
X	_drawrubberpuckshape(a,p,x,y,PNL_OPEN);
X    }
X    popmatrix();
X    if (pnl_justup) curson();
X
X    color(PNL_OUTLINE_COLOR);
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
Xpnl_puck(a)
XActuator *a;
X{
X    a->type=PNL_PUCK;
X
X    a->w=a->h=PNL_PUCK_EDGE;
X    a->data=(char *)alloc(sizeof(Puck)); /* this goes in an addfunc */
X    a->datasize=sizeof(Puck);
X    PNL_ACCESS(Puck, a, x)=0.0;
X    PNL_ACCESS(Puck, a, y)=0.0;
X    a->labeltype=PNL_LABEL_BOTTOM;
X    a->newvalfunc=_newvalpuck;
X    a->drawfunc=_drawpuck;
X}
X
Xvoid
Xpnl_floating_puck(a)
XActuator *a;
X{
X    a->type=PNL_FLOATING_PUCK;
X
X    a->w=PNL_FLOATING_PUCK_EDGE;
X    a->h=PNL_FLOATING_PUCK_EDGE;
X    a->data=(char *)alloc(sizeof(Puck));
X    a->datasize=sizeof(Puck);
X    PNL_ACCESS(Puck, a, x)=0.0;
X    PNL_ACCESS(Puck, a, y)=0.0;
X    a->newvalfunc=_newvalfloatingpuck;
X    a->drawfunc=_drawfloatingpuck;
X}
X
Xvoid
Xpnl_rubber_puck(a)
XActuator *a;
X{
X    pnl_floating_puck(a);
X
X    a->type=PNL_RUBBER_PUCK;
X    a->drawfunc=_drawrubberpuck;
X}
X
SHAR_EOF
chmod 0644 puck.c || echo "restore of puck.c fails"
sed 's/^X//' << 'SHAR_EOF' > script.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <gl.h>
X#include <device.h>
X#include <panel.h>
X
Xvoid
Xbeginscript()
X{
X  pnl_beginwritescript("panel.script");
X}
X
Xvoid
Xappendscript()
X{
X  pnl_beginappendscript("panel.script");
X}
X
Xvoid
Xendscript()
X{
X  pnl_endwritescript();
X}
X
Xvoid
Xreadscript()
X{
X  pnl_beginreadscript("panel.script");
X}
X
Xvoid
Xstopscript()
X{
X  pnl_endreadscript();
X}
X
Xinitscriptpanel()
X{
XActuator *a;
XPanel *p;
X
X    p=mkpanel();
X    p->label="scripting";
X
X    a=mkact(pnl_button);
X    a->label="dump state";
X    a->x=1.0;
X    a->y=4.5;
X    a->downfunc=dumpstate;
X    addact(a, p);
X
X    a=mkact(pnl_button);
X    a->label="begin script";
X    a->x=1.0;
X    a->y=4.0;
X    a->downfunc=beginscript;
X    addact(a, p);
X
X    a=mkact(pnl_button);
X    a->label="end script";
X    a->x=1.0;
X    a->y=3.5;
X    a->downfunc=endscript;
X    addact(a, p);
X
X    a=mkact(pnl_button);
X    a->label="append to script";
X    a->x=1.0;
X    a->y=3.0;
X    a->downfunc=appendscript;
X    addact(a, p);
X
X    a=mkact(pnl_button);
X    a->label="read script";
X    a->x=1.0;
X    a->y=2.5;
X    a->downfunc=readscript;
X    addact(a, p);
X
X    a=mkact(pnl_button);
X    a->label="stop reading script";
X    a->x=1.0;
X    a->y=2.0;
X    a->downfunc=stopscript;
X    addact(a, p);
X}
SHAR_EOF
chmod 0644 script.c || echo "restore of script.c fails"
sed 's/^X//' << 'SHAR_EOF' > slider.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <gl.h>
X#include "panel.h"
X
X#define NORMAL_MODE		0
X#define DIFFERENTIAL_MODE	1
X#define FINE_CONTROL_MODE	2
X
X#define DIFFERENTIAL_FACTOR	0.1
X#define FINE_CONTROL_FACTOR	0.05
X
Xvoid setsliderval(a, x, dist)
X     Actuator *a;
X     Coord x;
X     float dist;
X{
X  Slider *ad=(Slider *)a->data;
X  float tmp;
X
X  tmp=PNL_VAL_TO_WORLD(a->val, a->minval, a->maxval, dist);
X  if (pnl_justdown) {
X    if (!pnl_controlkey)
X      a->val=PNL_WORLD_TO_VAL(x, a->minval, a->maxval, dist);
X    ad->wsave=x;
X  }
X  
X  a->val+=
X    (pnl_controlkey?ad->finefactor
X      *(x-ad->wsave)/dist*(a->maxval-a->minval)
X      :(x-ad->wsave)/dist*(a->maxval-a->minval));
X  a->val=RANGE(a->val, a->maxval, a->minval);
X
X  ad->wsave=x;
X  ad->valsave=a->val;
X}
X
Xvoid _newvalvslider(a,p,sx,sy)
X     Actuator *a;
X     Panel *p;
X     Screencoord sx,sy;
X{    
X  Slider *ad=(Slider *)a->data;
X  Coord wx, wy;
X  float tmp;
X  
X  if (!a->active) return;
X  
X  mapw2(p->vobj,sx,sy,&wx,&wy);
X  
X  setsliderval(a, wy-a->y, a->h);
X}
X
Xvoid _newvalhslider(a,p,sx,sy)
X     Actuator *a;
X     Panel *p;
X     Screencoord sx,sy;
X{    
X  Slider *ad=(Slider *)a->data;
X  Coord wx, wy;
X  
X  if (!a->active) return;
X  
X  mapw2(p->vobj,sx,sy,&wx,&wy);
X  
X  setsliderval(a, wx-a->x, a->w);
X}
X
Xvoid _newvaldvslider(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{    
X  Slider *ad=(Slider *)a->data;
X  Coord wx, wy;
X
X  mapw2(p->vobj,sx,sy,&wx,&wy);
X
X  if (pnl_justdown) {
X    if (wy-a->y<a->h-PNL_BUTTON_EDGE) ad->mode = NORMAL_MODE;
X    else {
X      ad->wsave=wy;
X      ad->valsave=a->val;
X      if (wx-a->x<PNL_BUTTON_EDGE) ad->mode = DIFFERENTIAL_MODE;
X      else 			   ad->mode = FINE_CONTROL_MODE;
X    }
X  }
X  if (pnl_justup) ad->mode=NORMAL_MODE;
X  if (!a->active) return;
X
X  switch (ad->mode) {
X  case NORMAL_MODE:
X/*    a->val=(wy-a->y)/(a->h-PNL_BUTTON_EDGE)
X      *(a->maxval-a->minval)+a->minval; */
X    setsliderval(a, wy-a->y, a->h-PNL_BUTTON_EDGE);
X    break;
X  case DIFFERENTIAL_MODE:
X    a->val+=DIFFERENTIAL_FACTOR*(wy-ad->wsave)/a->h*(a->maxval-a->minval);
X    break;
X  case FINE_CONTROL_MODE:
X    a->val=ad->valsave
X      +FINE_CONTROL_FACTOR*(wy-ad->wsave)/a->h*(a->maxval-a->minval);
X  default:
X    break;
X  }
X
X  a->val=RANGE(a->val, a->maxval, a->minval);
X}
X
Xvoid
X_drawvslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord y;
X
X    pushmatrix();
X
X    translate(a->x,a->y,0.0);
X
X    color(pnl_normal_color);
X    rectf(0.0,0.0,a->w,a->h);
X    color(pnl_outline_color);
X    rect(0.0,0.0,a->w,a->h);
X
X    y=(a->val-a->minval)/(a->maxval-a->minval)*a->h;
X
X    color(pnl_highlight_color);
X    rectf(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X	  a->w,MIN(a->h,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X    color(pnl_outline_color);
X    rect(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X	 a->w,MIN(a->h,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X
X    popmatrix();
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawhslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord x;
X
X    pushmatrix();
X
X    translate(a->x,a->y,0.0);
X
X    color(pnl_normal_color);
X    rectf(0.0,0.0,a->w,a->h);
X    color(pnl_outline_color);
X    rect(0.0,0.0,a->w,a->h);
X
X    x=(a->val-a->minval)/(a->maxval-a->minval)*a->w;
X
X    color(pnl_highlight_color);
X    rectf(MAX(0.0,x-PNL_SLIDER_BAR_HEIGHT/2.0),0.0,
X	  MIN(a->w,x+PNL_SLIDER_BAR_HEIGHT/2.0),a->h);
X    color(pnl_outline_color);
X    rect(MAX(0.0,x-PNL_SLIDER_BAR_HEIGHT/2.0),0.0,
X	 MIN(a->w,x+PNL_SLIDER_BAR_HEIGHT/2.0),a->h);
X
X    popmatrix();
X    if (a->label) drawlabel(a, p);
X}
X
XCoord diamond[][2] = {
X   { 0.0, -1.0 },
X   { 1.0,  0.0 },
X   { 0.0,  1.0 },
X   {-1.0,  0.0 }
X };
X
X_drawfineicon(selected)
XBoolean selected;
X{
X  pushmatrix();
X  if (selected) {
X    color(pnl_highlight_color);
X    rectf(-PNL_BUTTON_EDGE/2.0,-PNL_BUTTON_EDGE/2.0,
X	   PNL_BUTTON_EDGE/2.0, PNL_BUTTON_EDGE/2.0);
X    color(pnl_normal_color);
X    scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X    polf2(4, diamond);
X    color(pnl_outline_color);
X    poly2(4, diamond);
X  } else {
X    scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X    color(pnl_other_color);
X    polf2(4, diamond);
X    color(pnl_outline_color);
X    poly2(4, diamond);
X  }
X  popmatrix();
X}
X
X_drawdifficon(selected)
XBoolean selected;
X{
X  pushmatrix();
X  if (selected) {
X    color(pnl_highlight_color);
X    rectf(-PNL_BUTTON_EDGE/2.0,-PNL_BUTTON_EDGE/2.0,
X	   PNL_BUTTON_EDGE/2.0, PNL_BUTTON_EDGE/2.0);
X    color(pnl_normal_color);
X    scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X    poly2(4, diamond);
X  } else {
X    color(pnl_outline_color);
X    scale(PNL_BUTTON_EDGE/2.0-PNL_DIM_3, PNL_BUTTON_EDGE/2.0-PNL_DIM_3, 0.0);
X    poly2(4, diamond);
X  }
X  popmatrix();
X}
X
Xvoid
X_drawdvslider(a, p)
XActuator *a;
XPanel *p;
X{
X  Slider *ad=(Slider *)a->data;
X  Coord y;
X
X  pushmatrix();
X  
X  translate(a->x,a->y,0.0);
X  
X  color(pnl_normal_color);
X  rectf(0.0,0.0,a->w,a->h);
X  
X  pushmatrix();
X  translate(PNL_BUTTON_EDGE/2.0,a->h-PNL_BUTTON_EDGE/2.0,0.0);
X  switch (ad->mode) {
X  case NORMAL_MODE:
X    _drawdifficon(FALSE);
X    translate(PNL_BUTTON_EDGE, 0.0, 0.0);
X    _drawfineicon(FALSE);
X    break;
X  case FINE_CONTROL_MODE:
X    _drawdifficon(FALSE);
X    translate(PNL_BUTTON_EDGE, 0.0, 0.0);
X    _drawfineicon(TRUE);
X    break;
X  case DIFFERENTIAL_MODE:
X    _drawdifficon(TRUE);
X    translate(PNL_BUTTON_EDGE, 0.0, 0.0);
X    _drawfineicon(FALSE);
X    break;
X  }
X  popmatrix();
X
X  color(pnl_outline_color);
X  rect(0.0,0.0,a->w,a->h);
X  move2(0.0,a->h-PNL_BUTTON_EDGE);
X  rdr2(PNL_SLIDER_WIDTH,0.0);
X  move2(PNL_BUTTON_EDGE,a->h-PNL_BUTTON_EDGE);
X  rdr2(0.0,PNL_BUTTON_EDGE);
X  
X  y=(a->val-a->minval)/(a->maxval-a->minval)
X    *(a->h-PNL_BUTTON_EDGE);
X
X  color(pnl_highlight_color);
X  rectf(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X	a->w,MIN(a->h-PNL_BUTTON_EDGE,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X  color(pnl_outline_color);
X  rect(0.0,MAX(0.0,y-PNL_SLIDER_BAR_HEIGHT/2.0),
X       a->w,MIN(a->h-PNL_BUTTON_EDGE,y+PNL_SLIDER_BAR_HEIGHT/2.0));
X  
X  popmatrix();
X  if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawfilledhslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord x;
X
X    pushmatrix();
X
X    translate(a->x,a->y,0.0);
X
X    color(pnl_normal_color);
X    rectf(0.0,0.0,a->w,a->h);
X    color(pnl_outline_color);
X    rect(0.0,0.0,a->w,a->h);
X
X    x=(a->val-a->minval)/(a->maxval-a->minval)*a->w;
X
X    color(pnl_highlight_color);
X    rectf(0.0,0.0,x,a->h);
X    color(pnl_outline_color);
X    rect(0.0,0.0,x,a->h);
X
X    popmatrix();
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawfilledvslider(a, p)
XActuator *a;
XPanel *p;
X{
XCoord y;
X
X    pushmatrix();
X
X    translate(a->x,a->y,0.0);
X
X    color(pnl_normal_color);
X    rectf(0.0,0.0,a->w,a->h);
X    color(pnl_outline_color);
X    rect(0.0,0.0,a->w,a->h);
X
X    y=(a->val-a->minval)/(a->maxval-a->minval)*a->h;
X
X    color(pnl_highlight_color);
X    rectf(0.0,0.0,a->w,y);
X    color(pnl_outline_color);
X    rect(0.0,0.0,a->w,y);
X
X    popmatrix();
X    if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_addslider(a)
X     Actuator *a;
X{
X  Slider *ad=(Slider *)a->data;
X  if (ad->finefactor==0.0) ad->finefactor=FINE_CONTROL_FACTOR;
X}
X
Xvoid
Xpnl_slider(a)
XActuator *a;
X{
X  Slider *ad;
X
X  a->type=PNL_SLIDER;
X
X  a->data = alloc(sizeof(Slider));
X  a->datasize = sizeof(Slider);
X  ad=(Slider *)a->data;
X  ad->wsave=0.0;
X  ad->mode=NORMAL_MODE;
X
X  a->labeltype=PNL_LABEL_BOTTOM;
X  a->addfunc=_addslider;
X
X  a->w=PNL_SLIDER_WIDTH;
X  a->h=PNL_SLIDER_HEIGHT;
X  a->newvalfunc=_newvalvslider;
X  a->drawfunc=_drawvslider;
X}
X
Xvoid
Xpnl_vslider(a)
XActuator *a;
X{
X  pnl_slider(a);
X  a->type=PNL_VSLIDER;
X
X  a->w=PNL_SLIDER_WIDTH;
X  a->h=PNL_SLIDER_HEIGHT;
X  a->newvalfunc=_newvalvslider;
X  a->drawfunc=_drawvslider;
X}
X
Xvoid
Xpnl_hslider(a)
XActuator *a;
X{
X  pnl_slider(a);
X  a->type=PNL_HSLIDER;
X
X  a->w=PNL_SLIDER_HEIGHT;
X  a->h=PNL_SLIDER_WIDTH;
X  a->newvalfunc=_newvalhslider;
X  a->drawfunc=_drawhslider;
X}
X
Xvoid
Xpnl_dvslider(a)
XActuator *a;
X{
X  pnl_slider(a);
X  a->type=PNL_DVSLIDER;
X  
X  a->w=PNL_SLIDER_WIDTH;
X  a->h=PNL_SLIDER_HEIGHT;
X  a->newvalfunc=_newvaldvslider;
X  a->drawfunc=_drawdvslider;
X}
X
Xvoid
Xpnl_filled_vslider(a)
XActuator *a;
X{
X  pnl_slider(a);
X  a->type=PNL_FILLED_VSLIDER;
X  
X  a->w=PNL_SLIDER_WIDTH;
X  a->h=PNL_SLIDER_HEIGHT;
X  a->newvalfunc=_newvalvslider;
X  a->drawfunc=_drawfilledvslider;
X}
X
Xvoid
Xpnl_filled_slider(a)
XActuator *a;
X{
X  pnl_filled_vslider(a);
X  a->type=PNL_FILLED_SLIDER;
X}
X
Xvoid
Xpnl_filled_hslider(a)
XActuator *a;
X{
X  pnl_slider(a);
X  a->type=PNL_FILLED_HSLIDER;
X
X  a->w=PNL_SLIDER_HEIGHT;
X  a->h=PNL_SLIDER_WIDTH;
X  a->newvalfunc=_newvalhslider;
X  a->drawfunc=_drawfilledhslider;
X}
SHAR_EOF
chmod 0644 slider.c || echo "restore of slider.c fails"
sed 's/^X//' << 'SHAR_EOF' > slideroid.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <gl.h>
X#include "panel.h"
X
X#define NORMAL_MODE		0
X#define DIFFERENTIAL_MODE	1
X#define ABSOLUTE_MODE		2
X
X#define DIFFERENTIAL_FACTOR	0.01
X#define ABSOLUTE_FACTOR		0.05
X#define FINE_FACTOR		0.05
X
Xvoid _newvalslideroid(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{    
X  Slideroid *ad=(Slideroid *)a->data;
X  Coord wx, wy;
X
X  mapw2(p->vobj,sx,sy,&wx,&wy);
X
X  if (pnl_justdown) {
X    if (   wy-a->y>2.0*a->h/3.0
X	&& wx-a->x<a->w/6.0) ad->finemode= ~ad->finemode;
X    else if (   wy-a->y>2.0*a->h/3.0
X	     && wx-a->x>5.0*a->w/6.0) {
X      ad->resetmode=TRUE;
X      if (a->val==a->initval
X	  && ad->resettarget) *ad->resettarget=ad->resetval;
X      else a->val=a->initval;
X    }
X    else if (wy-a->y<a->h/3.0) {
X      ad->wsave=wy;
X      ad->valsave=a->val;
X      if (wx-a->x<a->w/2.0) ad->mode = DIFFERENTIAL_MODE;
X      else 		    ad->mode = ABSOLUTE_MODE;
X    } else  ad->mode = NORMAL_MODE;
X  }
X  if (pnl_justup) {
X    ad->mode=NORMAL_MODE;
X    ad->resetmode=FALSE;
X  }
X  if (!a->active) return;
X
X  switch (ad->mode) {
X  case NORMAL_MODE:
X    break;
X  case DIFFERENTIAL_MODE:
X    a->val+=DIFFERENTIAL_FACTOR
X      *(ad->finemode?FINE_FACTOR:1.0)
X	*(wy-ad->wsave)
X	  /a->h
X	    *(a->maxval-a->minval);
X    break;
X  case ABSOLUTE_MODE:
X    a->val=ad->valsave
X      +ABSOLUTE_FACTOR
X	*(ad->finemode?FINE_FACTOR:1.0)
X	  *(wy-ad->wsave)/a->h
X	    *(a->maxval-a->minval);
X  default:
X    break;
X  }
X
X  a->val=RANGE(a->val, a->maxval, a->minval);
X}
X
Xstatic Coord diamond[][2] = {
X   { 0.0, -1.0 },
X   { 1.0,  0.0 },
X   { 0.0,  1.0 },
X   {-1.0,  0.0 }
X };
X
Xstatic _drawabsicon(a, selected)
XActuator *a;
XBoolean selected;
X{
X  pushmatrix();
X  if (selected) {
X    color(pnl_highlight_color);
X    rectf(-a->w/4.0,-a->h/6.0,
X	   a->w/4.0, a->h/6.0);
X    color(pnl_normal_color);
X    scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X    polf2(4, diamond);
X    color(pnl_outline_color);
X    poly2(4, diamond);
X  } else {
X    scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X    color(pnl_other_color);
X    polf2(4, diamond);
X    color(pnl_outline_color);
X    poly2(4, diamond);
X  }
X  popmatrix();
X}
X
Xstatic _drawdifficon(a, selected)
XActuator *a;
XBoolean selected;
X{
X  pushmatrix();
X  if (selected) {
X    color(pnl_highlight_color);
X    rectf(-a->w/4.0,-a->h/6.0,
X	   a->w/4.0, a->h/6.0);
X    color(pnl_normal_color);
X    scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X    poly2(4, diamond);
X  } else {
X    color(pnl_outline_color);
X    scale(a->w/4.0-PNL_DIM_3, a->h/6.0-PNL_DIM_3, 0.0);
X    poly2(4, diamond);
X  }
X  popmatrix();
X}
X
Xvoid
X_drawslideroid(a, p)
XActuator *a;
XPanel *p;
X{
X  Slideroid *ad=(Slideroid *)a->data;
X  Coord cx, cy;
X  char s[7], stmp[16];
X
X  pushmatrix();
X  
X  translate(a->x,a->y,0.0);
X  
X  color(pnl_normal_color);
X  rectf(0.0,0.0,a->w,a->h);
X  color(pnl_outline_color);
X  rect(0.0,0.0,a->w,a->h);
X  
X  move2(0.0,a->h/3.0);
X  rdr2(a->w,0.0);
X  move2(0.0,2.0*a->h/3.0);
X  rdr2(a->w,0.0);
X  move2(a->w/2.0,0.0);
X  rdr2(0.0,a->h/3.0);
X  move2(a->w/6.0,2.0*a->h/3.0);
X  rdr2(0.0,a->h/3.0);
X  move2(5.0*a->w/6.0,2.0*a->h/3.0);
X  rdr2(0.0,a->h/3.0);
X
X  cx= -(float)strwidth("F")/p->ppu/2.0;
X  cy= -(float)(getheight("E")-getdescender())/p->ppu/2.0;
X  if (ad->finemode) {
X    color(pnl_highlight_color);
X    rectf(0.0,2.0*a->h/3.0,a->w/6.0,a->h);
X    color(pnl_white_color);
X    cmov2(a->w/12.0+cx, 5.0*a->h/6.0+cy);
X    charstr("F");
X    color(pnl_outline_color);
X  } else {
X    cmov2(a->w/12.0+cx, 5.0*a->h/6.0+cy);
X    charstr("F");
X  }
X
X  if (ad->resetmode) {
X    color(pnl_highlight_color);
X    rectf(5.0*a->w/6.0,2.0*a->h/3.0,a->w,a->h);
X    color(pnl_white_color);
X    cmov2(11.0*a->w/12.0+cx, 5.0*a->h/6.0+cy);
X    charstr("R");
X    color(pnl_outline_color);
X  } else {
X    cmov2(11.0*a->w/12.0+cx, 5.0*a->h/6.0+cy);
X    charstr("R");
X  }
X
X  sprintf(stmp, "%-+#10.3E", a->val);
X  strncpy(s, stmp, 6);
X  s[6]='\0';
X
X  cx= -(float)strwidth(s)/p->ppu/2.0;
X  cmov2(a->w/2.0+cx, 3.0*a->h/6.0+cy);
X  charstr(s);
X
X  strncpy(s, stmp+6, 4);
X  s[4]='\0';
X
X  cx= -(float)strwidth(s)/p->ppu/2.0;
X  cmov2(a->w/2.0+cx, 5.0*a->h/6.0+cy);
X  charstr(s);
X
X  pushmatrix();
X  translate(a->w/4.0,a->h/6.0,0.0);
X  switch (ad->mode) {
X  case NORMAL_MODE:
X    _drawdifficon(a, FALSE);
X    translate(a->w/2.0, 0.0, 0.0);
X    _drawabsicon(a, FALSE);
X    break;
X  case ABSOLUTE_MODE:
X    _drawdifficon(a, FALSE);
X    translate(a->w/2.0, 0.0, 0.0);
X    _drawabsicon(a, TRUE);
X    break;
X  case DIFFERENTIAL_MODE:
X    _drawdifficon(a, TRUE);
X    translate(a->w/2.0, 0.0, 0.0);
X    _drawabsicon(a, FALSE);
X    break;
X  }
X  popmatrix();
X  popmatrix();
X
X  if (a->label) drawlabel(a, p);
X}
X
Xvoid
Xpnl_slideroid(a)
XActuator *a;
X{
X  Slideroid *ad;
X
X  a->type=PNL_SLIDEROID;
X
X  a->data = alloc(sizeof(Slideroid));
X  a->datasize = sizeof(Slideroid);
X  ad=(Slideroid *)a->data;
X  ad->wsave=0.0;
X  ad->mode=NORMAL_MODE;
X
X  a->w=PNL_SLIDEROID_WIDTH;
X
X  a->h=PNL_SLIDEROID_HEIGHT;
X  a->labeltype=PNL_LABEL_BOTTOM;
X  a->newvalfunc=_newvalslideroid;
X  a->drawfunc=_drawslideroid;
X}
X
SHAR_EOF
chmod 0644 slideroid.c || echo "restore of slideroid.c fails"
sed 's/^X//' << 'SHAR_EOF' > stoa.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <stdio.h>
X#include <gl.h>
X#include "panel.h"
X
XBoolean
Xtread(fd, buf, len)
Xint fd;
Xchar *buf;
Xint len;
X{
X  int c;
X
X  if ((c=read(0,buf,len))!=len) {
X    printf("<end of input>\n");
X    return FALSE;
X  }
X  return TRUE;
X}   
X
Xmain() 
X{
X  int c;
X  Actuator a;
X  short actid;
X  int msgtype, datasize, delay;
X  int buf[9];
X  char data[16386];
X
X  for (;;) {
X    if (!tread(0,&msgtype,sizeof(msgtype))) exit(1);
X    
X    switch (msgtype) {
X    case PNL_MT_MOUSE:
X      if (!tread(0,buf,sizeof(buf))) exit(1);
X      
X      pnl_cp=(Panel *)buf[0];
X      pnl_ca=(Actuator *)buf[1];
X      pnl_mx=(Screencoord)buf[2];
X      pnl_my=(Screencoord)buf[3];
X      pnl_justup=(Boolean)buf[4];
X      pnl_justdown=(Boolean)buf[5];
X      pnl_mousedown=(Boolean)buf[6];
X      pnl_shiftkey=(Boolean)buf[7];
X      pnl_controlkey=(Boolean)buf[8];
X      
X      printf("MOUSE: %d %d %d %d %d %d %d\n", 
X	     pnl_cp,
X	     pnl_ca,
X	     pnl_mx,
X	     pnl_my,
X	     pnl_justup,
X	     pnl_justdown,
X	     pnl_mousedown,
X	     pnl_shiftkey,
X	     pnl_controlkey);
X      break;
X    case PNL_MT_STATE:
X      tread(0,&actid,sizeof(short));
X      tread(0,&a,sizeof(a));
X      tread(0,&datasize,sizeof(int));
X      tread(0,data,datasize);
X
X      printf("STATE: %d %d %f\n", actid, a.type, a.val);
X      break;
X    case PNL_MT_DELAY:
X      tread(0,&delay,sizeof(delay));
X
X      printf("DELAY: %d\n", delay);
X      break;
X    default:
X      printf("unrecognized message type\n");
X      exit(1);
X    }
X  }
X}
X
X
SHAR_EOF
chmod 0644 stoa.c || echo "restore of stoa.c fails"
sed 's/^X//' << 'SHAR_EOF' > strip.c &&
X/*
X *	this software is in the public domain, it may not be resold
X *	or relicensed.  Do not remove this notice.  Send modifications
X *	and requests for most recent version to:
X *
X *	Author:  David A. Tristram
X *		 NASA  Ames Research Center
X *		 MS 258-5
X *		 Moffett Field, CA  94035
X *		 415-694-4404
X *		 dat@orville.nas.nasa.gov
X */
X#include <math.h>
X#include <gl.h>
X#include "panel.h"
X
Xvoid NewY(a,x)
XActuator *a;
Xfloat x;
X{
X  int i;
X  Stripchart * dp = (Stripchart *)a->data;
X
X  dp->y[dp->lastpt++] = x;
X  if (dp->lastpt >= PNL_STRIP_CHART_NPTS) dp->lastpt = 0;
X  if (dp->firstpt == dp->lastpt) {
X    dp->firstpt++;
X    if (dp->firstpt == PNL_STRIP_CHART_NPTS) dp->firstpt = 0;
X  }
X}
X
Xvoid _setrange(a)
XActuator *a;
X{
X  int i;
X  float mymin, mymax;
X  Stripchart * dp = (Stripchart *)a->data;
X
X  i = dp->firstpt;
X  mymax = dp->y[i];
X  mymin = mymax;
X
X  while (i != dp->lastpt) {
X    if (dp->y[i] < mymin) mymin = dp->y[i];
X    if (dp->y[i] > mymax) mymax = dp->y[i];
X    i++;
X    if (i >= PNL_STRIP_CHART_NPTS) i = 0;
X  }
X
X  if (mymin == mymax) {	/* Center the only value, if all are same */
X    mymin -= 0.1;
X    mymax += 0.1;
X  }
X  if (!dp->Bind_Low)
X    a->minval = mymin;
X  if (!dp->Bind_High)
X    a->maxval = mymax;
X}
X
Xvoid
X_addstripchart(a, p)
XActuator *a;
XPanel *p;
X{
Xint i;
X
X    PNL_ACCESS(Stripchart, a, firstpt) = 0;
X    PNL_ACCESS(Stripchart, a, lastpt) = 0;
X    PNL_ACCESS(Stripchart, a, y) = 
X	(float *)alloc(PNL_STRIP_CHART_NPTS*sizeof(float));
X    a->datasize=sizeof(Stripchart)+PNL_STRIP_CHART_NPTS*sizeof(float);
X    for (i = 0; i < PNL_STRIP_CHART_NPTS; i++)
X	PNL_ACCESS(Stripchart, a, y[i]) = 0.0;
X}
X
Xvoid
X_fixstripchart(a)
XActuator *a;
X{
X    NewY(a, a->val);
X}
X
Xvoid _newvalstripchart(a,p,sx,sy)
XActuator *a;
XPanel *p;
XScreencoord sx,sy;
X{
X    NewY(a,a->val);
X}
X
Xvoid _dumpstripchart(a, fd)
XActuator *a;
Xint fd;
X{
XStripchart *ad=(Stripchart *)a->data;
Xstatic int msgtype=PNL_MT_STATE;
X
X  write(fd, &msgtype, sizeof(msgtype));
X  write(fd, &a->id, sizeof(a->id));
X  write(fd, a, sizeof(Actuator));
X  write(fd, &a->datasize, sizeof(int));
X  write(fd, a->data, sizeof(Stripchart));
X  write(fd, ad->y, PNL_STRIP_CHART_NPTS*sizeof(float));
X}
X
Xvoid _loadstripchart(a, fd)
XActuator *a;
Xint fd;
X{
XStripchart *ad=(Stripchart *)a->data;
X
X  read(fd, a, sizeof(Actuator));
X  read(fd, &a->datasize, sizeof(int));
X  read(fd, a->data, sizeof(Stripchart));
X  read(fd, ad->y, PNL_STRIP_CHART_NPTS*sizeof(float));
X}
X
X
Xvoid
X_drawanalogmeter(a,p)
XActuator *a;
XPanel *p;
X{
X  float theta;
X  Coord x, y;
X  Coord radius = (a->w / 2.0) - (2.0*PNL_DIM_2);
X  Coord xorg = a->w / 2.0;
X  Coord yorg = PNL_DIM_2;
X  long oldwidth = getlwidth();
X
X  pushmatrix();
X  translate(a->x,a->y,0.0);
X
X  color(pnl_other_color);
X  rectf(0.0, 0.0, a->w, a->h);
X
X  color(pnl_normal_color);
X  arcf(xorg, yorg, radius, 0, 1800);
X
X  color(pnl_outline_color);
X  arc(xorg, yorg, radius, 0, 1800);
X  move2(xorg,yorg);
X  rmv2(-radius,0.0);
X  rdr2(2.0*radius,0.0);
X
X  color(pnl_outline_color);
X  theta = M_PI * (float) (a->val - a->minval)
X    / (float) (a->maxval - a->minval);
X  theta = M_PI - theta;
X  x = xorg + radius * cos(theta);
X  y = yorg + radius * sin(theta);
X  linewidth(PNL_METER_LINEWIDTH);
X  move2(xorg,yorg);
X  draw2(x,y);
X  linewidth(oldwidth);
X
X  color(pnl_outline_color);
X  rect(0.0, 0.0, a->w, a->h);
X
X  popmatrix();
X  if (a->label) drawlabel(a, p);
X}
X
Xvoid
X_drawanalogbar(a,p)
XActuator *a;
XPanel *p;
X{
X  float theta;
X  int dtheta;	/* in tenths of degrees */
X  Coord x, y;
X  Coord radius = (a->w / 2.0) - (2.0*PNL_DIM_2);
X  Coord xorg = a->w / 2.0;
X  Coord yorg = PNL_DIM_2;
X  long oldwidth = getlwidth();
X
X  pushmatrix();
X  translate(a->x,a->y,0.0);
X
X  color(pnl_other_color);
X  rectf(0.0, 0.0, a->w, a->h);
X
X  color(pnl_normal_color);
X  arcf(xorg, yorg, radius, 0, 1800);
X
X  color(pnl_highlight_color);
X  theta = M_PI * (float) (a->val - a->minval)
X    / (float) (a->maxval - a->minval);
X  theta = M_PI - theta;
X  dtheta = (int) (theta/M_PI*1800);
X
X  arcf(xorg, yorg, radius, dtheta, 1800);
SHAR_EOF
echo "End of part 5, continue with part 6"
echo "6" > s2_seq_.tmp
exit 0