dat@ORVILLE.NAS.NASA.GOV ("David A. Tristram") (08/19/88)
#!/bin/sh # this is part 6 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file strip.c continued # CurArch=6 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' >> strip.c X X color(pnl_outline_color); 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 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 rect(0.0, 0.0, a->w, a->h); X X popmatrix(); X if (a->label) drawlabel(a, p); X} X Xvoid X_drawstripchart(a,p) XActuator *a; XPanel *p; X{ X Coord x, y; X Actuator temp_act; X char temp_label[20]; X float xfactor, yfactor, yoffset, labelwidth; X Stripchart * dp = (Stripchart *)a->data; X int i; X long oldwidth = getlwidth(); X X X pushmatrix(); X labelwidth = strwidth(" ") * 8 / p->ppu; X translate(a->x,a->y,0.0); X X color(pnl_normal_color); X rectf(0.0, 0.0, a->w - labelwidth, a->h); X X color(pnl_outline_color); X X if (!dp->Bind_High || !dp->Bind_Low) X _setrange(a); X X if (dp->firstpt != dp->lastpt) { X xfactor = (a->w-labelwidth) / (PNL_STRIP_CHART_NPTS + 1); X yfactor = a->h / (a->maxval - a->minval); X yoffset = .03 * yfactor * ( a->maxval - a->minval); X yfactor = .94 * yfactor; X x = xfactor; X y = yoffset + X ((RANGE(dp->y[dp->firstpt],a->minval,a->maxval) - a->minval) * yfactor); X linewidth(PNL_STRIP_LINEWIDTH); X move2(x, y); X i = dp->firstpt + 1; X if (i >= PNL_STRIP_CHART_NPTS) i = 0; X while (i != dp->lastpt) { X x += xfactor; X y = yoffset X + ((RANGE(dp->y[i],a->minval,a->maxval) - a->minval) * yfactor); X draw2(x,y); X i++; X if (i >= PNL_STRIP_CHART_NPTS) i = 0; X } X linewidth(oldwidth); X } X X color(pnl_outline_color); X rect(0.0, 0.0, a->w-labelwidth, a->h); X X popmatrix(); X if (a->label) drawlabel(a, p); X X temp_act.labeltype = PNL_LABEL_RIGHT; X temp_act.label = temp_label; X X temp_act.x = a->x; X temp_act.y = a->y; X temp_act.lx = a->w -labelwidth + PNL_DIM_2; X temp_act.ly = 0.0; X sprintf(temp_label,"%.3g",a->minval); X temp_act.lw = labelwidth; X temp_act.lh = (float)getheight()/p->ppu; X temp_act.ld = (float)getdescender()/p->ppu; X drawlabel(&temp_act, p); X temp_act.ly = a->h - temp_act.lh; X sprintf(temp_label,"%.3g",a->maxval); X drawlabel(&temp_act, p); X} X Xvoid Xpnl_analog_meter(a) XActuator *a; X{ X a->type=PNL_ANALOG_METER; X X a->w=PNL_METER_WIDTH; X a->h=PNL_METER_HEIGHT; X a->labeltype=PNL_LABEL_BOTTOM; X a->selectable=FALSE; /* output actuator only */ X a->drawfunc=_drawanalogmeter; X} X Xvoid Xpnl_meter(a) XActuator *a; X{ X pnl_analog_meter(a); X a->type=PNL_METER; X} X Xvoid Xpnl_analog_bar(a) XActuator *a; X{ X pnl_analog_meter(a); X X a->type=PNL_ANALOG_BAR; X a->drawfunc=_drawanalogbar; X} X Xvoid Xpnl_strip_chart(a) XActuator *a; X{ X a->type=PNL_STRIP_CHART; X X a->w=PNL_STRIP_WIDTH; X a->h=PNL_STRIP_HEIGHT; X a->labeltype=PNL_LABEL_BOTTOM; X a->selectable=FALSE; /* output actuator only */ X a->data = alloc(sizeof(Stripchart)); X a->datasize=sizeof(Stripchart); X PNL_ACCESS(Stripchart, a, Bind_Low) = TRUE; X PNL_ACCESS(Stripchart, a, Bind_High) = TRUE; X a->addfunc=_addstripchart; X a->fixfunc=_fixstripchart; X a->newvalfunc=_newvalstripchart; X a->dumpfunc=_dumpstripchart; X a->drawfunc=_drawstripchart; X} X Xvoid Xpnl_scale_chart(a) XActuator *a; X{ X pnl_strip_chart(a); X X a->type=PNL_SCALE_CHART; X PNL_ACCESS(Stripchart, a, Bind_Low) = FALSE; X PNL_ACCESS(Stripchart, a, Bind_High) = FALSE; X} SHAR_EOF chmod 0644 strip.c || echo "restore of strip.c fails" sed 's/^X//' << 'SHAR_EOF' > typein.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 Xvoid _newvaltypein(a,p,sx,sy) XActuator *a; XPanel *p; XScreencoord sx,sy; X{ X if (!a->active) return; X X frontbuffer(TRUE); /* hack hack hack */ X (*a->drawfunc)(a,p); X frontbuffer(FALSE); X cmov2((Coord)(a->x+PNL_DIM_3), X (Coord)(a->y+PNL_DIM_3)+(Coord)getdescender()/p->ppu); X strcpy(PNL_ACCESS(Typein,a,str), X g_getstring(pnl_white_color, X pnl_highlight_color, X pnl_normal_color, X PNL_ACCESS(Typein,a,str), X PNL_ACCESS(Typein,a,len))); X#ifndef IRIS_4D X pnl_justup=TRUE; /* hack hack hack */ X setinactive(pnl_ca,pnl_cp); /* hackus maximus */ X X /* the 4d version of g_gets() seems to preserve mouse up events X better than the 3000 does */ X#endif IRIS_4D X} X Xvoid X_addtypein(a, p) XActuator *a; XPanel *p; X{ Xint len; Xchar *str = alloc(PNL_TYPEIN_MAX_STRING); X X if (PNL_ACCESS(Typein, a, str)) strcpy(str,PNL_ACCESS(Typein, a, str)); X PNL_ACCESS(Typein, a, str)=str; X X len = (PNL_ACCESS(Typein, a, len)? X PNL_ACCESS(Typein, a, len): X PNL_TYPEIN_LENGTH); X PNL_ACCESS(Typein, a, len)=len; X a->w=(float)len*(float)strwidth("a")/p->ppu+2.0*PNL_DIM_3; X a->h=2.0*PNL_DIM_3+(Coord)getheight()/p->ppu; X a->datasize=sizeof(Typein)+PNL_TYPEIN_MAX_STRING; X} X Xvoid _dumptypein(a, fd) XActuator *a; Xint fd; X{ XTypein *ad=(Typein *)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(Typein)); X write(fd, ad->str, PNL_TYPEIN_MAX_STRING); X} X Xvoid _loadtypein(a, fd) XActuator *a; Xint fd; X{ XTypein *ad=(Typein *)a->data; X X read(fd, a, sizeof(Actuator)); X read(fd, &a->datasize, sizeof(int)); X read(fd, a->data, sizeof(Typein)); X read(fd, ad->str, PNL_TYPEIN_MAX_STRING); X} X Xvoid X_drawtypein(a, p) XActuator *a; XPanel *p; X{ X if (a->active) color(pnl_highlight_color); X else color(pnl_normal_color); X rectf(a->x,a->y,a->x+a->w,a->y+a->h); X color(pnl_outline_color); X rect(a->x,a->y,a->x+a->w,a->y+a->h); X if (a->active) color(pnl_white_color); X else color(pnl_outline_color); X cmov2(a->x+PNL_DIM_3,a->y+PNL_DIM_3+(Coord)getdescender()/p->ppu); X charstr(PNL_ACCESS(Typein,a,str)); X if (a->label) drawlabel(a, p); X} X Xvoid Xpnl_typein(a) XActuator *a; X{ X a->type=PNL_TYPEIN; X X a->labeltype=PNL_LABEL_BOTTOM; X a->data = alloc(sizeof(Typein)); X a->datasize=sizeof(Typein); X PNL_ACCESS(Typein, a, len) = 0; X PNL_ACCESS(Typein, a, str) = ""; X a->addfunc=_addtypein; X a->newvalfunc=_newvaltypein; X a->dumpfunc=_dumptypein; X a->drawfunc=_drawtypein; X} X X/* X * this _drawlabel() draws the label actuator, not to be confused with X * drawlabel() that draws labels for every kind of actuator, (including, X * of course, label actuators). X * X */ X Xvoid X_drawlabel(a, p) XActuator *a; XPanel *p; X{ XScreencoord tx1,ty1,tx2,ty2; X X color(pnl_background_color); X rectf(a->x,a->y,a->x+a->w,a->y+a->h); X if (a->label) drawlabel(a, p); X} X Xvoid Xpnl_label(a) XActuator *a; X{ X a->type=PNL_LABEL; X X a->labeltype=PNL_LABEL_NORMAL; X a->drawfunc=_drawlabel; X} X SHAR_EOF chmod 0644 typein.c || echo "restore of typein.c fails" sed 's/^X//' << 'SHAR_EOF' > typeout.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 <math.h> X#include <gl.h> X#include "panel.h" X Xchar X*_forwardline(a,p) XActuator *a; Xchar *p; X{ XTypeout *ad=(Typeout *)a->data; Xchar *q=p; X X p+=strcspn(p,"\n"); X if (p-q>ad->col) { X p-=(p-q)%ad->col; X } X if (*p=='\n') p++; X return p; X} X Xchar X*_backline(a,p) XActuator *a; Xchar *p; X{ XTypeout *ad=(Typeout *)a->data; Xchar *q=p; Xchar *r; Xint c; X X if (p==ad->buf) return p; X X if (*(p-1)=='\n'&&p!=ad->buf+1) p-=2; X for (;;p--) { X if (p<=ad->buf) break; X if (*p=='\n') { X p++; X break; X } X if (q-p>ad->col) { /* wrapped line */ X/* X count chars to previous newline or bob, X take that count mod line length to find chars from left margin X back up that amount, unless its 0, otherwise back up line length. X*/ X for (r=p;r>ad->buf&&*r!='\n';r--); X c=(p-r)%ad->col; X if (c) p=q-c; X else p=q-ad->col; X break; X } X } X return p; X} X Xscrollup(a) XActuator *a; X{ XTypeout *ad=(Typeout *)a->data; Xchar *s=ad->buf+ad->start; Xint n; X X/* if (*(ad->buf+ad->start)>ad->len) return; */ X s=_forwardline(a, ad->buf+ad->start); X ad->start=s-ad->buf; X return; X} X Xscrolldown(a) XActuator *a; X{ Xint n; XTypeout *ad=(Typeout *)a->data; Xchar *s=ad->buf+ad->start; X X if (s-ad->buf<2) return; X n=2; X while (s-n>ad->buf&&*(s-n)!='\n') n++; X if (n==ad->start) n++; /* pointing to first char */ X if (n<ad->col+2) { /* regular line */ X ad->start-=n-1; X } else { /* wrapped line */ X ad->start-=n-ad->col-1; X } X} X Xint X_linelen(a,p) XActuator *a; Xchar *p; X{ XTypeout *ad=(Typeout *)a->data; Xint i; Xchar *q=p; X X while (p<ad->buf+ad->len&&*p!='\n') p++; X return p-q; X} X Xint X_postopnt(a,x,y) XActuator *a; Xint x,y; X{ XTypeout *ad=(Typeout *)a->data; Xint i; Xchar *p,*q; X X p=q=ad->buf+ad->start; X X for (i=0;i<y;i++) p=_forwardline(a,p); X p+=MIN(x,_linelen(a,p)); X return p-q; X} X Xvoid X_pnttopos(a,pnt,x,y) XActuator *a; Xint pnt; Xint *x,*y; X{ XTypeout *ad=(Typeout *)a->data; Xint i; Xchar *p,*q,*r; X X *x= *y=0; X p=q=r=ad->buf+ad->start; X X while (p-q<=pnt) { X if (r==(p=_forwardline(a,p))) break; X /* in case p doesn't move */ X (*y)++; X r=p; X } X p=_backline(a,p); X *y=MAX(0,*y-1); X *x=pnt-(p-q); X} X Xvoid Xtprint(a,s) XActuator *a; Xchar *s; X{ XTypeout *ad=(Typeout *)a->data; Xchar *p; Xint c=0; X X if (a->type!=PNL_TYPEOUT) { X fprintf(stderr, "tprint: actuator"); X if (a->label) fprintf(stderr, " %s", a->label); X fprintf(stderr," not a typeout\n"); X return; X } X X ad->dot=ad->len; X for (p=ad->buf+ad->dot;p>ad->buf&&c<ad->lin;p--) { X if (*p=='\n') c++; X } X ad->start=MAX(0,p-ad->buf); X if (ad->start!=0) ad->start+=2; X X if (strlen(s)+1>ad->size) { X tprint(a,"tprint: That message was too long!"); X return; X } X X if (ad->dot+strlen(s)+1>ad->size) { X ad->dot=0; X } X X sprintf(ad->buf+ad->dot,"%s\n",s); X ad->dot+=strlen(s)+1; X *(ad->buf+ad->dot)='\0'; X X fixact(a); X} X Xvoid _newvaltypeout(a,p,sx,sy) XActuator *a; XPanel *p; XScreencoord sx,sy; X{ Xint n; Xfloat f; XTypeout *ad=(Typeout *)a->data; XCoord xorg,yorg; /* origin of top left text position */ XCoord wx, wy; Xint tx, ty; /* text position, increasing downwards */ X X if (!a->active) return; X X xorg=a->x+PNL_DIM_3; X yorg=a->y+PNL_DIM_3+ad->cd X +(ad->lin-1)*ad->ch; X X mapw2(p->vobj,sx,sy,&wx,&wy); X X if (wx>a->x+a->w-PNL_SCROLL_WIDTH) { /* in scrollbar */ X if (wy<a->y+PNL_TYPEOUT_ARROW_HEIGHT) { /* lower arrow */ X/* if (!pnl_justdown) return; */ X scrollup(a); X } else if (wy>a->y+a->h-PNL_TYPEOUT_ARROW_HEIGHT) { /* upper arrow */ X/* if (!pnl_justdown) return; */ X scrolldown(a); X } else { /* elevator region */ X f=1.0-(wy-a->y-PNL_TYPEOUT_ARROW_HEIGHT) X /(a->h-2.0*PNL_TYPEOUT_ARROW_HEIGHT); X n=f*ad->len; X while (n>0&&*(ad->buf+n-1)!='\n') n--; X ad->start=n; X } X } else { /* in typeout region */ X tx=(wx-xorg)/ad->cw; X ty=(yorg-wy)/ad->ch+1.0; X tx=RANGE(tx,0,ad->col-1); X ty=RANGE(ty,0,ad->lin-1); X ad->dot=ad->start+_postopnt(a,tx,ty); X/* printf("tx=%d, ty=%d, dot=%d\n",tx,ty,ad->dot); */ X } X} X Xvoid X_fixtypeout(a) XActuator *a; X{ XTypeout *ad=(Typeout *)a->data; X X ad->len=strlen(ad->buf); X a->datasize=sizeof(Typeout)+ad->len; X a->dirtycnt=2; X} X Xvoid X_addtypeout(a, p) XActuator *a; XPanel *p; X{ XTypeout *ad=(Typeout *)a->data; Xint col,lin; X X ad->size = (ad->size?ad->size:PNL_TYPEOUT_BUFSIZ); X ad->buf=alloc(ad->size); X X col = (ad->col?ad->col:PNL_TYPEOUT_COLUMNS); X ad->col=col; X lin = (ad->lin?ad->lin:PNL_TYPEOUT_LINES); X ad->lin=lin; X X ad->cw=(Coord)strwidth("M")/p->ppu; X ad->ch=(Coord)getheight()/p->ppu; X ad->cd=(Coord)getdescender()/p->ppu; X a->w=(Coord)col*ad->cw+2.0*PNL_DIM_3+PNL_SCROLL_WIDTH; X a->h=(Coord)lin*ad->ch+2.0*PNL_DIM_3; X X _fixtypeout(a); X} X Xvoid _dumptypeout(a, fd) XActuator *a; Xint fd; X{ XTypeout *ad=(Typeout *)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(Typeout)); X write(fd, ad->buf, ad->len); X} X Xvoid _loadtypeout(a, fd) XActuator *a; Xint fd; X{ XTypeout *ad=(Typeout *)a->data; X X read(fd, a, sizeof(Actuator)); X read(fd, &a->datasize, sizeof(int)); X read(fd, a->data, sizeof(Typeout)); X read(fd, ad->buf, ad->len); X} X Xvoid X_drawscrollarrow() X{ X pmv2(PNL_TYPEOUT_ARROW_HEIGHT, PNL_DIM_3); X pdr2(PNL_DIM_3, PNL_TYPEOUT_ARROW_HEIGHT-PNL_DIM_3); X pdr2(PNL_SCROLL_WIDTH-PNL_DIM_3, PNL_TYPEOUT_ARROW_HEIGHT-PNL_DIM_3); X pclos(); X} X X_drawelevator(a, p, style) XActuator *a; XPanel *p; Xint style; X{ XTypeout *ad=(Typeout *)a->data; XCoord y; X X pushmatrix(); X translate(a->x+a->w-PNL_SCROLL_WIDTH, X a->y+PNL_TYPEOUT_ARROW_HEIGHT, X 0.0); X y=1.0-(float)ad->start/(float)ad->len; X y*=a->h-2.0*PNL_TYPEOUT_ARROW_HEIGHT-PNL_DIM_2; X if (style==PNL_FILLED) X rectf(0.0,y,PNL_SCROLL_WIDTH,y+PNL_DIM_2); X else X rect(0.0,y,PNL_SCROLL_WIDTH,y+PNL_DIM_2); X popmatrix(); X} X Xvoid X_drawcursor(a, tx, ty) XActuator *a; Xint tx, ty; X{ Xstatic char *s="M"; XTypeout *ad=(Typeout *)a->data; X X pushmatrix(); X translate(tx*ad->cw,-ty*ad->ch-ad->cd,0.0); X color(pnl_highlight_color); X rectf(0.0,0.0,ad->cw,ad->ch); X color(pnl_white_color); X cmov2(0.0,ad->cd); X sprintf(s, "%c", *(ad->buf+ad->dot)); X charstr(s); X popmatrix(); X} X Xvoid X_drawtypeout(a, p) XActuator *a; XPanel *p; X{ Xint n, l=0; /* upper left corner is col 0, lin 0. */ XCoord xorg, yorg; /* origin of first char position */ Xint tx,ty; Xchar *s, t[PNL_TYPEOUT_MAX_COLUMNS], *end; XTypeout *ad=(Typeout *)a->data; X X xorg=a->x+PNL_DIM_3; X yorg=a->y+PNL_DIM_3+ad->cd X +(ad->lin-1)*ad->ch; X X color(pnl_normal_color); X rectf(a->x,a->y,a->x+a->w,a->y+a->h); X color(pnl_outline_color); X rect(a->x,a->y,a->x+a->w,a->y+a->h); X rect(a->x+a->w-PNL_SCROLL_WIDTH, a->y, a->x+a->w, a->y+a->h); X rect(a->x+a->w-PNL_SCROLL_WIDTH, a->y+PNL_TYPEOUT_ARROW_HEIGHT, X a->x+a->w, a->y+a->h-PNL_TYPEOUT_ARROW_HEIGHT); X X color(pnl_highlight_color); X _drawelevator(a, p, PNL_FILLED); X color(pnl_outline_color); X _drawelevator(a, p, PNL_OPEN); X X color(pnl_outline_color); X pushmatrix(); X translate(a->x+a->w-PNL_SCROLL_WIDTH, a->y, 0.0); X _drawscrollarrow(); X translate(0.0, a->h, 0.0); X scale(1.0, -1.0, 1.0); X _drawscrollarrow(); X popmatrix(); X X s=ad->buf+ad->start; X/* end=s+strlen(s); /* waste of time? */ X end=ad->buf+ad->len; X X do { X if ((n=strcspn(s, "\n"))<ad->col) { X strncpy(t, s, n); X t[n]='\0'; X s+=strlen(t)+1; X } else { X strncpy(t, s, ad->col); X t[ad->col]='\0'; X s+=ad->col; X } X cmov2(xorg,yorg-(Coord)l*ad->ch); X charstr(t); X l++; X } while (s<end&&l<ad->lin); X X if (ad->dot>=ad->start) { X _pnttopos(a,ad->dot-ad->start,&tx,&ty); X if (ty<ad->lin) { X pushmatrix(); X translate(xorg,yorg,0.0); X _drawcursor(a,tx,ty); X popmatrix(); X } X } X/* printf("dot=%d, tx=%d, ty=%d\n",ad->dot,tx,ty); */ X X if (a->label) drawlabel(a, p); X} X Xvoid Xpnl_typeout(a) XActuator *a; X{ XTypeout *ad; X X a->type=PNL_TYPEOUT; X X a->labeltype=PNL_LABEL_BOTTOM; X a->data = alloc(sizeof(Typeout)); X a->datasize=sizeof(Typeout); X ad=(Typeout *)a->data; X ad->buf = NULL; X ad->lin = 0; X ad->col = 0; X ad->start = 0; X ad->dot = 0; X ad->len = 0; X a->addfunc=_addtypeout; X a->newvalfunc=_newvaltypeout; X a->fixfunc=_fixtypeout; X a->dumpfunc=_dumptypeout; X a->drawfunc=_drawtypeout; X} X SHAR_EOF chmod 0644 typeout.c || echo "restore of typeout.c fails" rm -f s2_seq_.tmp echo "You have unpacked the last part" exit 0