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