X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=sw%2Frescue%2Flab8e_goettingen%2Fdisk2_11%2Frkb%2Fparoff%2Fhaefir.ft;fp=sw%2Frescue%2Flab8e_goettingen%2Fdisk2_11%2Frkb%2Fparoff%2Fhaefir.ft;h=650a488624c74aa80fb8aaeb5bdf337b7d1979fd;hb=81e70d488b71bf995c459ca3a02c025993460ffa;hp=0000000000000000000000000000000000000000;hpb=07ec0278333ed187ac242dedcff13c56cf1b0b91;p=pdp8.git diff --git a/sw/rescue/lab8e_goettingen/disk2_11/rkb/paroff/haefir.ft b/sw/rescue/lab8e_goettingen/disk2_11/rkb/paroff/haefir.ft new file mode 100644 index 0000000..650a488 --- /dev/null +++ b/sw/rescue/lab8e_goettingen/disk2_11/rkb/paroff/haefir.ft @@ -0,0 +1,236 @@ +C -+-+-+-+-+  H A E F I R . F T  -+-+-+-+-+ +C +C PLOT THE DATA POINTS +C + SUBROUTINE FIRPLT + INCLUDE HAEPTI.FI + INCLUDE HAEBUF.FI + INCLUDE HAEGSA.FI + INCLUDE HAETTY.FI + INCLUDE HABRK.FI + INCLUDE HAECSZ.FI + INCLUDE HAPPEN.FI + REAL XYSAM,COND + INTEGER NCOND,TOASCI + EXTERNAL XYSAM,NCOND,COND,TOASCI +C + C + LOGICAL TIMABZ,TIMORD, @ ABZISSE / ORDINATE IS TIME SCALE + * ABISMI @ IF THE ABZISSA SCALE EXCEEDS 5 MINUTES THEN .TRUE. ELSE .FALSE. + INTEGER I,K,J,PENPOS, + * STEP, @ INCREMENT IN SAMBUF SCAN + * CA,CO, @ CHANNEL OF ABZISSE, ORDINATE + * PLBEG,PLEND, @ START/END OF TIME SCALE + * NUMCN, @ NUMBER OF CHANNELS TO SCAN (NO MEANING IF TIMABZ IS SET .FALSE.) + * EXPAND @ IF THE TIME SCALE .LE. 5 SECONDS THEN WE MARK EACH 1/10 SECOND ELSE EACH SECOND + REAL TEMSET, @ DIFFERENCE PLOTTER 0,0 AND PICTURE 0,0 (NO MEANING IF TIMABZ IS SET TO .FALSE.) + * LEFT,RIGHT,UP,DOWN, @ PLOT SCALES ABZISSE/ ORDINATE + * TE1,TE2,TE3 @ TEMPS + REAL OMAX,OMIN, @ MAXIMUM AND MINIMUM OF ORDINATE DATA + * THRU,THRL @ UPPER, LOWER THRESHOLD + INTEGER TEXT0(4) @ DIMENSION OF THE TIME AXIS (MIN OR SEC) + DATA CA,CO,NUMCN,STEP /0,8,2,3/, + * TEXT0 /'TIME [MIN] TIME [SEC]'/ +C +C STATEMENT FUNCTIONS ARE: +C + BETW(AP0,BP0,CP0)=AP0.LE.BP0.AND.BP0.LT.CP0 + LOGICAL BETW + FIR(IP0)=-XYSAM(IP0-4,0)-XYSAM(IP0-3,0)+ + * XYSAM(IP0-1,0)+2*XYSAM(IP0,0)+XYSAM(IP0+1,0)- + * XYSAM(IP0+3,0)-XYSAM(IP0+4,0) @ SAMCNT FINITE IMPULSE RESPONSE FILTER +C + XF(IP1)=XYSAM(IP1,CA)-LEFT @ RETURNS THE VALUE OF THE ABZISSA WITH CORRECT OFFSET + DFIR(IP2)=COND(BETW(THRL,FIR(IP2),THRU),0,120.) + YF(IP1)=COND(CO.EQ.0,FIR(IP1),DFIR(IP1)) +C + IF (SAMCNT.EQ.0) RETURN @ NO SAMPLE, NOTHING TO DO +C +C COMPUTE THE DEFAULT VALUES FOR THE PLOT +C + IF (OPTION.EQ.11) GOTO 15 @ SP- SKIPS QUESTIONS AND TAKES THE LAST VALUES USED + CO=0 @ THE ORDINATE IS CHANNEL 0 + CA=8 @ THE ABZISSA IS THE TIME SCALE + NUMCN=CHNLS-CO @ ALL CHANNELS TO PLOT + STEP=3 @ WE PLOT EACH THIRD POINT OF THE DATA + IF (OPTION.NE.12) CALL ASKHIM (2) @ SP* DOES NOT ASK SILLY QUESTIONS + WRITE (TTO,1) CA,CO,STEP @ READ CHANNEL ## + READ (TTI,2) I,J,K @ AND STEP INCREMENTS + IF BREAK(11) RETURN + CA=NCOND(I,I,CA) + CO=NCOND(J,J,CO) + STEP=NCOND(K,K,STEP) @ STEP DEFAULTS TO "STEP" + TIMABZ=CA.GT.7 @ ABZISSE IS THE TIME SCALE + TIMORD=CO.GT.7 @ ORDINATE IS THE TIME SCALE + IF (.NOT.TIMABZ) GOTO 15 @ ABZISSA IS NO TIME SCALE: ONLY TWO CHANNELS (CO,CO+1) TO PLOT + NUMCN=MIN0(NUMCN,CHNLS-CO) @ COMPUTE CORRECT NUMBER OF CHANNELS + WRITE (TTO,3) NUMCN @ READ THE NUMBER OF CHANNELS TO SCAN + READ (TTI,2) I + NUMCN=MIN0(CHNLS-CO,NCOND(I,I,NUMCN)) @ NO INPUT MEANS CHNLS-CO + WRITE (TTO,5) + READ (TTI,6) THRL,THRU +15 CONTINUE + C +C COMPUTE THE SCALING LIMITS +C + S0=BEGIN*SAMRAT @ HERE WE START THE OUTPUT PLOT + S1=ENDS*SAMRAT @ AND HERE WE END THE PLOT + PLBEG=BEGIN + PLEND=ENDS +C + IF (S1.LE.SAMCNT) GOTO 17 @ IF THE INTERVALL TO PLOT EXCEEDS THE + TE1=SAMCNT/SAMRAT @ DATA POINTS THEN + TE2=S1/SAMRAT + WRITE (TTO,4) TE1,TE2 @ WE PRINT THE OVERFLOW MSG AND + PLEND=TE1 @ COMPUTE A NEW PLEND VALUE + S1=PLEND*SAMRAT-1 @ TAKE CARE FOR TRUNCATION ERRORS +17 CONTINUE @ INTERVALL OK, COMPUTE UPPER AND LOWER MARGIN OF PLOT DATA + RIGHT=COND(TIMABZ,FLOAT(S1),512.) @ ABZISSE MARGIN EITHER TIME OR 10 BIT CONVERTER + LEFT =COND(TIMABZ,FLOAT(S0),-512.) + UP =COND(TIMORD,FLOAT(S1),512.) @ ORDINATE MARGIN + DOWN =COND(TIMORD,FLOAT(S0),-512.) + IF BREAK(11) RETURN @ USER GETS RID OF PRGRM + CALL STPLT @ START THE PLOTTER ( CALL PLOTS) + CALL XYPLOT (XOFSET,YOFSET,-PENUP) @ DRIVE PEN TO PICTURE ZERO +C +C LOOP TO PLOT EACH CHANNEL WITH CORRECT OFFSET, FACTOR AND SCALE +C TEMSET HOLDS THE ORIGIN FOR EACH CHANNEL +C TEMSET=0 PLOT ONE CHANNEL/TIME OR X/Y +C TEMSET=YLEN/NUMCN FOR MORE THAN ONE CHANNEL +C THE TEMSET ORIGIN OFFSET IS RESET AT THE END OF THE LOOP ( ST. 25) +C +C + TEMSET=0 + DO 20 K=1,NCOND(TIMABZ,NUMCN,1) @ SCAN NUMCN CHANNELS + IF (NUMCN.EQ.1 .OR. .NOT.TIMABZ) GOTO 51 + TEMSET=FLOAT(NUMCN-K)*YLEN/FLOAT(NUMCN)+(NUMCN-K)*.5 @ TEMPORARY Y OFFSET + CALL XYPLOT (0,TEMSET,-PENUP) @ SWITCH TO CORRECT PART OF PICTURE +C +C COMPUTE THE FACTOR TO GET A PRETTY PLOT +C + OMAX=-999. + OMIN=-OMAX + DO 50 J=S0,S1 @ FETCH MIN & MAX OF THE DATA + IF (BREAK(11)) GOTO 25 @ IF THE USER GETS RID OF PLOT THEN WE EXIT VIA 25 + TE1=YF(J) @ COMPUTE FILTER + OMAX=AMAX1(OMAX,TE1) @ MAXIMUM --> OMAX +50 OMIN=AMIN1(OMIN,TE1) @ MINIMUM --> OMIN + DOWN=COND(OMIN.LT.-255.,-512.,OMIN.LT.0,-255.,OMIN.LT.256.,0, + * 255.) @ MAKE 255 STEPS INCREMENT + UP=COND(OMAX.GT.255.,512.,OMAX.GT.0,255.,OMAX.GT.-255.,0, + * -255.) @ 255 STEPS INCREMENT +C +51 CONTINUE @ HERE WE COMPUTE THE FACTOR FOR ONE LINE + IF (TIMABZ) CALL FACTOR (XLEN/(RIGHT-LEFT), + * (YLEN-NUMCN*.5+.5)/FLOAT(NUMCN)/(UP-DOWN)) + IF (.NOT.TIMABZ) CALL FACTOR (AMIN1(XLEN,YLEN)/(RIGHT-LEFT), + * AMIN1(XLEN,YLEN)/(UP-DOWN)) + IF BREAK(11) GOTO 25 @ USER GETS RID OF PRGRM + PENPOS=PENUP + DO 10 I=S0,S1 @ HERE WE PLOT THE + CALL XYPLOT (XF(I),YF(I)-DOWN,PENPOS) @ DATA POINTS ONE BY ONE + PENPOS=PENDWN + IF BREAK(11) GOTO 25 @ USER GETS RID OF PROGRAM +10 CONTINUE + IF (.NOT. TIMABZ) GOTO 25 @ WORK DONE FOR X-Y GRAPHICS +C +C MAKE A SCALE FOR THE ORDINATE ( INPUT VOLTAGE ) +C + CALL WHERE (TE1,TE1,TE1,TE2) + CALL FACTOR (1.,TE2) + CALL XYPLOT (-.5,0,-PENUP) + PENPOS=PENUP + DO 55 I=0,10 + TE1=DOWN+I*(UP-DOWN)/10. + CALL XYPLOT (0,TE1-DOWN,PENPOS) + PENPOS=PENDWN + J=MOD(I,5) + TE3=COND(J.EQ.0,-.5,-.3) + CALL XYPLOT (TE3,TE1-DOWN,PENDWN) + CALL XYPLOT (0,TE1-DOWN,PENDWN) + IF (MOD(I,10).NE.0) GOTO 55 + CALL FACTOR (1.,1.) @ WRITE LOWER AND UPPER LIMIT ONTO THE + CALL NUMBER (-XOFSET+2.*YZ,(TE1-DOWN)*TE2-YN*.38,YN*.75,TE1,0, + * -1) @ AXIS + CALL FACTOR (1.,TE2) + CALL XYPLOT (0,TE1-DOWN,PENUP) +55 CONTINUE + CALL XYPLOT (.5,0,-PENUP) + CALL FACTOR (1.,1.) + CALL SYMBOL (-XOFSET+YZ,YLEN/NUMCN*.33,YZ,'CH ',90.,3) + CALL NUMBER (999.,999.,YZ,CO,90.,-1) +C +C + CO=CO+1 +25 CALL FACTOR (1.,1.) + CALL XYPLOT (0.,-TEMSET,-PENUP) @ RESET CORRECT ORIGIN OF DIAGRAM + IF BREAK(11) GOTO 40 +20 CONTINUE + C +C IF ABZISSA IS TIME SCALE THEN DRAW A TIME SCALE +C + IF (.NOT.TIMABZ) GOTO 40 + ABISMI=PLEND-PLBEG.GT.300 @ ABZISSE EXCEEDS 5 MINUTES SO WE DRAW A MINUTE SCALING + CALL FACTOR (XLEN/(PLEND-PLBEG),1.) + CALL XYPLOT (0.,-.5,-PENUP) +C HERE WE PLOT THE LITTLE BAR INDICATING A SECOND OR MINUTE + EXPAND=NCOND(PLEND-PLBEG.LE.5,10,1) @ IF THE TIME SCALE IS .LE. 5 SECONDS THEN WE MARK EACH 1/10 SEC + DO 30 I=PLBEG*EXPAND,PLEND*EXPAND @ 1 SEC INCREMENTS + TE1=I-PLBEG*EXPAND + CALL XYPLOT (TE1/EXPAND,0,PENDWN) + IF (.NOT.ABISMI) TE2=COND(MOD(I,10).EQ.0,-.7, MOD(I,5).EQ.0,-.5, + * -.3) + IF (ABISMI) TE2=COND(MOD(I,600).EQ.0,-.7, + * MOD(I,300).EQ.0,-.5, + * MOD(I/EXPAND,60).EQ.0,-.3) + CALL XYPLOT (TE1/EXPAND,TE2,PENDWN) +C HERE WE COMPUTE WHERE TO WRITE A NUMBER ONTO THE TIME AXIS + TE2=PLEND-PLBEG @ COMPUTE THE SIZE OF THE TIME AXIS + IF (.NOT.ABISMI) GOTO 31 @ IF WE PLOT A SECONDS AXIS THEN GOTO 31 + IF (MOD(I, + * NCOND(TE2.GT.5400,1800,TE2.GE.1800,600,TE2.GT.900,300, + * TE2.GT.300,120,60)).GT.0) GOTO 30 @ COMPUTE THE MINUTE WHERE TO PLOT THE NUMBER + GOTO 32 +31 IF (MOD(I,NCOND(TE2.GT.180,30,TE2.GT.60,20,TE2.GT.30,10, + * TE2.GT.10,5,TE2.GT.5,2,10)).GT.0) @ WE ASSUME: TE2.LE.5 THEN EXPAND:=10 ELSE EXPAND:=1 !!! + * GOTO 30 +C +C HERE WE PLOT THE NUMBER ONTO THE AXIS +C +32 CONTINUE + CALL WHERE (TE2,TE2,TE2,TE3) @ GET THE X FACTOR + CALL FACTOR (1.,1.) @ RESET TO THE NORMAL FACTOR FOR SYMBOL + CALL NUMBER (TE1/EXPAND*TE2-INT(ALOG10(AMAX0(I/EXPAND,1))+.01) + * *YN/2.-YN*.3, + * -1.3,YN,COND(ABISMI,I/60.,I/EXPAND),0,-1) + CALL FACTOR (TE2,TE3) + CALL XYPLOT (TE1/EXPAND,0,PENUP) +30 CALL XYPLOT (TE1/EXPAND,0,PENDWN) + CALL FACTOR (1.,1.) + CALL XYPLOT (0,.5,-PENUP) + CALL SYMBOL (XLEN/1.5,-YOFSET,YZ,TEXT0(NCOND(ABISMI,1,3)),0,10) +C +C +40 CALL FACTOR (1.,1.) + IF (BREAK(11)) GOTO 60 @ USER SWITCHED OFF THE PLOTTER + CALL LABPLT (0,-YOFSET,PLEND) + IF (BREAK(11)) GOTO 60 + CALL SYMBOL (YZ,YLEN+YZ,YZ,LABEL,0,MIN0(42,LABCNT*6)) @ PLOT 42 CHARACTERS INTO THE FIRST LINE OF LABEL + IF (LABCNT.GT.7) + * CALL SYMBOL (YZ,YLEN,YZ,LABEL(8),0,LABCNT*6-42) @ AND THE REMAINING INTO THE NEXT LINE +60 CONTINUE + CALL XYPLOT (38.,25.,PENUP) + CALL EXPLT + RETURN +1 FORMAT (' KANAL ABZISSE/ORDINATE (ZEITBASIS=8), SCHRITTWEITE', + * ' (2I1,I3) (', + * 2I1,I3,')? ',$) +2 FORMAT (2I1,I3) +3 FORMAT (' ANZAHL DER DARZUSTELLENDEN KANAELE (I1) (',I1, + * ') ? ',$) +4 FORMAT (' NUR FUER',F6.1,' SEK. MESSDATEN JEDOCH',F6.1, + * ' SEC. ANGEFORDERT. ') +5 FORMAT (' UNTERE, OBERE SCHWELLE? F5.0/F5.0: ') +6 FORMAT (F5.0/F5.0) + END + \ No newline at end of file