SUBROUTINE TRGMON_DRIVER() C---------------------------------------------------------------------- C- C- Purpose and Methods : This selects which other portions of TRGMON get C- called and when. It is functionally a state machine. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- Created 9-NOV-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- Updated 30-APR-1992 Philippe Laurens, Steven Klocek C- Add new monitoring displays. C- Updated 2-JUL-1992 Philippe Laurens, Steven Klocek C- Inserted periodic log routines. C- Updated 3-SEP-1992 Philippe Laurens, Steven Klocek C- Added Excluded Towers display. C- Updated 11-FEB-1994 Philippe Laurens - MSU L1 Trigger C- remember screen background and restore into FILE_COPY C- Updated 23-AUG-1994 Freddie Landry C- Upgrade for integration time larger than the default 5s C- Change the order: paint background before calling GET_MONITLOCK C- (so that we can call the routine to initialize the ring buffer C- at the same time as we notice we need a new background) C- Add a call to a routine to "draw" the current integration time C- Replace call to GET_MONITBLOCK(COMMAND, SUBCOMMAND1, SUBCOMMAND2) C- with GET_MONIT_DATA (COMMAND). Notice no sub-command arguments. C- Remove some unused declarations and variables. C- Updated 19-OCT-1995 Philippe Laurens - MSU L1 Trigger C- Add 36x36 scalers, with longer integration time (25-OCT) C---------------------------------------------------------------------- IMPLICIT NONE INCLUDE '($SMGDEF)' INCLUDE 'LV1_MON_SCREEN.INC' INCLUDE 'LV1_MON_ALARMS.PARAMS' INCLUDE 'LV1_MON_ALARMS.INC' C INTEGER GET_MONIT_DATA EXTERNAL GET_MONIT_DATA INTEGER PFNUM EXTERNAL PFNUM C INTEGER IOSTAT INTEGER INPUT_CHAR INTEGER COMMAND LOGICAL PAINT_BACKGROUND LOGICAL GET_BLOCK LOGICAL NEED_COMMAND LOGICAL DRAW_FOREGROUND INTEGER FKEY INTEGER COUNT INTEGER SUBCOMMAND1, SUBCOMMAND2 INTEGER ERROR INTEGER COMPACK_ROWS, COMPACK_COLS LOGICAL FIRST_RUN DATA FIRST_RUN / .TRUE. / C D0OPEN Variables INTEGER LUN,L,IOPT,I INTEGER TEMP_FILE_LUN CHARACTER*(*) FILNAM,CHOPT CHARACTER*4 STATUS CHARACTER*12 FORM LOGICAL OK CHARACTER*100 SAVE_BACKGROUND(FILE_LINES) C EXTERNAL SCREEN_LOG_FINISH, SCREEN_LOG_WRITE, SCREEN_LOG_RECORD EXTERNAL RATES_LOG_FINISH, RATES_LOG_WRITE, RATES_LOG_RECORD C C---------------------------------------------------------------------- C IF (FIRST_RUN) THEN FIRST_RUN = .FALSE. CALL INZBRA() CALL MENSET('TRGMOND') CALL MENSET('TRGMONOP') CALL BROADC(.FALSE.) CALL SETUP_VKBD(IOSTAT) IF (.NOT. IOSTAT ) THEN CALL ABOMEN(IOSTAT, 'Could not set up virtual keyboard') GOTO 999 ENDIF CALL INIT_PUT_STRING() CALL INIT_GLOB_THRSH_AO() C C Set up sys$output so that carriage return is not automatic C ERROR = 0 C 16-APR-1991 skip call to compack C CALL GTUNIT(578, UNIT_NUM, ERROR) UNIT_NUM = 91 C IF (ERROR .NE. 0) THEN C CALL ABOMEN(0,'Error allocating unit number from GTUNIT') C GOTO 999 C ENDIF C OPEN(FILE='SYS$OUTPUT', UNIT=UNIT_NUM, ERR=200, & CARRIAGECONTROL='NONE', STATUS = 'UNKNOWN', RECL = & BUFFER_SIZE) C C Initialize HBOOK things C CALL INZBRA CALL INPAWC CALL INZSTP CALL HOUTPU(6) CALL HERMES(6) CALL READ_FOREIGN_SCALER_RCP C C Initialize data log variables C SCREEN_LOG_RECORDING = .FALSE. SCREEN_LOG_FNAME = 'TRGMON_SCREEN_LOG.TXT' SCREEN_LOG_LUN = 0 SCREEN_LOG_INTERVAL = 6 SCREEN_LOG_COUNTDOWN = 1 SCREEN_WRITE_INTERVAL = 60 SCREEN_WRITE_COUNTDOWN = 1 SCREEN_LOG_BUFFER_LINE = 0 C RATES_LOG_RECORDING = .FALSE. RATES_LOG_FNAME = 'TRGMON_RATES_LOG.HST4' RATES_LOG_LUN = 0 RATES_LOG_INTERVAL = 6 RATES_LOG_COUNTDOWN = 1 RATES_WRITE_INTERVAL = 60 RATES_WRITE_COUNTDOWN = 1 C ELSE C C The following group of lines should be commented out if a shareable C version of compack is used. C CALL RESTORE_VDISPLAY(IOSTAT) IF (.NOT.IOSTAT) THEN CALL ABOMEN(IOSTAT, 'Could not restore virtual display') GOTO 999 ENDIF C ENDIF C C C set TRGMON display size to terminal size CALL GETSCR(COMPACK_ROWS, COMPACK_COLS) LINES = COMPACK_ROWS C NEED_COMMAND = .TRUE. REFRESH_RATE = 5 NEW_INTEGRATE = .FALSE. C DO WHILE (.TRUE.) 50 CONTINUE IF (NEED_COMMAND .EQV. .TRUE.) THEN CALL CLOSE_MON_TEMP_FILE CALL SETSCROLL(1, LINES) CALL GETSCR(COMPACK_ROWS, COMPACK_COLS) CALL SETSCROLL(1, COMPACK_ROWS) CALL FLUSH_SCREEN() CALL TRGMON_MENU(COMMAND, SUBCOMMAND1, SUBCOMMAND2) PAINT_BACKGROUND = .TRUE. GET_BLOCK = .TRUE. DRAW_FOREGROUND = .TRUE. CALL MON_RESET_PAGE() C CALL DATA_LOG_RESET(SCREEN_LOG_RECORDING, & SCREEN_LOG_COUNTDOWN, & SCREEN_WRITE_COUNTDOWN) C CALL DATA_LOG_RESET(RATES_LOG_RECORDING, & RATES_LOG_COUNTDOWN, & RATES_WRITE_COUNTDOWN) C ENDIF C C Get new command, if not a display command C IF (COMMAND .EQ. COMMAND_OTHER) THEN NEED_COMMAND = .TRUE. GOTO 50 ENDIF C C Do not get info from the TCC if the request is for TRIG_FILT_RUN C IF (COMMAND .EQ. COMMAND_TRIG_FILT_RUN) THEN GET_BLOCK = .FALSE. ENDIF C C Quit if the command is given C IF (COMMAND .EQ. COMMAND_QUIT) GOTO 999 C C C Paint the Background if necessary C IF (PAINT_BACKGROUND .EQV. .TRUE.) THEN C CALL CLOSE_MON_TEMP_FILE C IF (NEW_INTEGRATE) CALL INITIALIZE_RING_BUFFER IF (COMMAND .EQ. COMMAND_GLOBAL_ALLOC) THEN CALL PAINT_GLOBAL_ALLOC() ELSEIF (COMMAND .EQ. COMMAND_SPECIFIC_TRIGGER) THEN CALL PAINT_SPEC_TRIG() ELSEIF (COMMAND .EQ. COMMAND_REF_SETS) THEN CALL CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_EXCLUDED_TOWERS) THEN CALl CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_GEO_SECT) THEN CALL PAINT_GEO_SECT() ELSEIF (COMMAND .EQ. COMMAND_GLOBAL_THRESH) THEN CALL PAINT_GLOBAL_THRESHOLDS() ELSEIF (COMMAND .EQ. COMMAND_PER_BUNCH) THEN CALL PAINT_PER_BUNCH() ELSEIF (COMMAND .EQ. COMMAND_LUMINOSITY) THEN CALL PAINT_LUMINOSITY() ELSEIF (COMMAND .EQ. COMMAND_DIAGNOST) THEN CALL CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_GLOBAL_MONIT) THEN CALL PAINT_CALTRIG() ELSEIF (COMMAND .EQ. COMMAND_JET_LIST) THEN CALL CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_TRIG_FILT_RUN) THEN CALL CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_ANDOR) THEN CALL CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_PRTRGR_DBLOCK) THEN CALL CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_ADC) THEN C Do nothing ELSEIF (COMMAND .EQ. COMMAND_SPY_DUMP) THEN C Do nothing ELSEIF (COMMAND .EQ. COMMAND_GLOBAL_L15) THEN CALL PAINT_GLOBAL_L15 ELSEIF (COMMAND .EQ. COMMAND_SPECTRIG_L15) THEN CALL PAINT_SPECTRIG_L15 ELSEIF (COMMAND .EQ. COMMAND_SPY_WINDOW) THEN CALL CLEAR_SCREEN ELSEIF (COMMAND .EQ. COMMAND_FOREIGN_SCALERS) THEN CALL PAINT_FOREIGN_SCALERS ELSEIF (COMMAND .EQ. COMMAND_36X36_SCALERS) THEN CALL PAINT_36X36_SCALERS ELSE CALL ABOMEN(0,'Undefined internal command number') GOTO 999 ENDIF C DO COUNT = 1, FILE_LINES ! all lines SAVE_BACKGROUND(COUNT) = ' ' ! clear memory of previous display END DO DO COUNT = 1, FILE_LINE ! only lines used SAVE_BACKGROUND(COUNT) = FILE_COPY(COUNT) ! save display backgroud END DO ELSE DO COUNT = 1, FILE_LINE ! only lines used FILE_COPY(COUNT) = SAVE_BACKGROUND(COUNT) ! restore background END DO ENDIF C C Get the Monitoring Block if necessary C IF (GET_BLOCK .EQV. .TRUE.) THEN IF ( GET_MONIT_DATA (COMMAND) .NE. 0) THEN CALL OUTMSG('1 ') CALL OUTMSG(' ') CALL OUTMSG(' ') CALL OUTMSG(' ') CALL OUTMSG( & ' Error: Cannot get data from control computer.') CALL PFWAIT() NEED_COMMAND = .TRUE. GOTO 50 ENDIF ENDIF C C Call the routine to display the curent integration time C IF ( (COMMAND .EQ. COMMAND_GLOBAL_ALLOC) & .OR. (COMMAND .EQ. COMMAND_SPECIFIC_TRIGGER) & .OR. (COMMAND .EQ. COMMAND_GEO_SECT) & .OR. (COMMAND .EQ. COMMAND_GLOBAL_MONIT) & .OR. (COMMAND .EQ. COMMAND_PER_BUNCH) & .OR. (COMMAND .EQ. COMMAND_LUMINOSITY) & .OR. (COMMAND .EQ. COMMAND_DIAGNOST) & .OR. (COMMAND .EQ. COMMAND_GLOBAL_L15) & .OR. (COMMAND .EQ. COMMAND_SPECTRIG_L15) & .OR. (COMMAND .EQ. COMMAND_36X36_SCALERS) & .OR. (COMMAND .EQ. COMMAND_FOREIGN_SCALERS) ) & CALL DRAW_INTEGRATE_TIME () C C Open the temporary file if necessary C IF ((COMMAND .EQ. COMMAND_JET_LIST) & .OR. (COMMAND .EQ. COMMAND_PRTRGR_DBLOCK) ) THEN CALL OPEN_MON_TEMP_FILE(TEMP_FILE_LUN) ENDIF C C Redraw the foreground C IF (DRAW_FOREGROUND .EQV. .TRUE.) THEN IF (COMMAND .EQ. COMMAND_GLOBAL_ALLOC) THEN CALL DRAW_GLOBAL_ALLOC() CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_SPECIFIC_TRIGGER) THEN CALL DRAW_SPEC_TRIG(SUBCOMMAND1) CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_REF_SETS) THEN CALL DRAW_REF_SET(SUBCOMMAND1, SUBCOMMAND2) ELSEIF (COMMAND .EQ. COMMAND_EXCLUDED_TOWERS) THEN CALL DRAW_EXCLUDED_TOWERS ELSEIF (COMMAND .EQ. COMMAND_GEO_SECT) THEN CALL DRAW_GEO_SECT() CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_GLOBAL_THRESH) THEN CALL DRAW_GLOBAL_THRESHOLDS() ELSEIF (COMMAND .EQ. COMMAND_DIAGNOST) THEN CALL DRAW_DIAGNOSTICS() CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_GLOBAL_MONIT) THEN CALL DRAW_CALTRIG() CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_JET_LIST) THEN CALL DRAW_JET_LIST(TEMP_FILE_LUN) ELSEIF (COMMAND .EQ. COMMAND_PER_BUNCH) THEN CALL DRAW_PER_BUNCH CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_LUMINOSITY) THEN CALL DRAW_LUMINOSITY CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_GLOBAL_L15) THEN CALL DRAW_GLOBAL_L15 CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_SPECTRIG_L15) THEN CALL DRAW_SPECTRIG_L15(SUBCOMMAND1) CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_TRIG_FILT_RUN) THEN CALL DRAW_TRIG_FILT_RUN ELSEIF (COMMAND .EQ. COMMAND_ANDOR) THEN CALL DRAW_ANDOR ELSEIF (COMMAND .EQ. COMMAND_PRTRGR_DBLOCK) THEN CALL DRAW_PRTRGR_DBLOCK(TEMP_FILE_LUN) C C Spy Dump display is different in that it is not a display which C gets refreshed. It calls EVE to display its information. C ELSEIF (COMMAND .EQ. COMMAND_SPY_DUMP) THEN CALL DRAW_SPY_DUMP ELSEIF (COMMAND .EQ. COMMAND_ADC) THEN CALL DRAW_ADC ELSEIF (COMMAND .EQ. COMMAND_SPY_WINDOW) THEN CALL DRAW_SPY_WINDOW(SUBCOMMAND1, SUBCOMMAND2) CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_FOREIGN_SCALERS) THEN CALL DRAW_FOREIGN_SCALERS CALL CHECK_TWB_BEEP(COMMAND) ELSEIF (COMMAND .EQ. COMMAND_36X36_SCALERS) THEN CALL DRAW_36X36_SCALERS CALL CHECK_TWB_BEEP(COMMAND) ELSE CALL ABOMEN(0,'Undefined internal command number') GOTO 999 ENDIF ENDIF C C Check to see if the log file must be updated for those displays which C automatically refresh. C IF ( (COMMAND .EQ. COMMAND_GLOBAL_ALLOC) & .OR. (COMMAND .EQ. COMMAND_GLOBAL_L15) & .OR. (COMMAND .EQ. COMMAND_SPECIFIC_TRIGGER) & .OR. (COMMAND .EQ. COMMAND_SPECTRIG_L15) & .OR. (COMMAND .EQ. COMMAND_GEO_SECT) & .OR. (COMMAND .EQ. COMMAND_GLOBAL_MONIT) & .OR. (COMMAND .EQ. COMMAND_JET_LIST) & .OR. (COMMAND .EQ. COMMAND_PER_BUNCH) & .OR. (COMMAND .EQ. COMMAND_LUMINOSITY) & .OR. (COMMAND .EQ. COMMAND_FOREIGN_SCALERS) & .OR. (COMMAND .EQ. COMMAND_36X36_SCALERS) & .OR. (COMMAND .EQ. COMMAND_SPY_WINDOW) & .OR. (COMMAND .EQ. COMMAND_DIAGNOST) ) THEN C CALL DATA_LOG_CHECK(SCREEN_LOG_RECORDING, SCREEN_LOG_INTERVAL, & SCREEN_WRITE_INTERVAL, SCREEN_LOG_RECORD, & SCREEN_LOG_WRITE, SCREEN_LOG_LUN, SCREEN_LOG_COUNTDOWN, & SCREEN_WRITE_COUNTDOWN ) C CALL DATA_LOG_CHECK(RATES_LOG_RECORDING, RATES_LOG_INTERVAL, & RATES_WRITE_INTERVAL, RATES_LOG_RECORD, & RATES_LOG_WRITE, RATES_LOG_LUN, RATES_LOG_COUNTDOWN, & RATES_WRITE_COUNTDOWN) C ENDIF C C Pause here. Wait until either the specified time interval has passed, C or a character is recieved on input. C C For Spy Dump, use normal COMPACK PF key input, then translate into the C type of info returned by SMG routines. C IF ( (COMMAND .EQ. COMMAND_SPY_DUMP) & .OR. (COMMAND .EQ. COMMAND_ADC) ) THEN CALL OUTMSG('1 ') CALL PFWAIT FKEY = PFNUM() IF (FKEY .EQ. 1) THEN INPUT_CHAR = SMG$K_TRM_PF1 ELSE INPUT_CHAR = SMG$K_TRM_PF4 ENDIF ELSE CALL TIME_LIMIT_INPUT(INPUT_CHAR, REFRESH_RATE) ENDIF C C If a character has been input, do the appropriate processing. C C In certain displays, Carriage-Return toggles between displays C IF (INPUT_CHAR .EQ. SMG$K_TRM_CTRLM) THEN NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .TRUE. GET_BLOCK = .TRUE. DRAW_FOREGROUND = .TRUE. IF (COMMAND .EQ. COMMAND_GLOBAL_ALLOC) THEN COMMAND = COMMAND_GLOBAL_L15 ELSEIF (COMMAND .EQ. COMMAND_GLOBAL_L15) THEN COMMAND = COMMAND_GLOBAL_ALLOC ELSEIF (COMMAND .EQ. COMMAND_SPECIFIC_TRIGGER) THEN COMMAND = COMMAND_SPECTRIG_L15 ELSEIF (COMMAND .EQ. COMMAND_SPECTRIG_L15) THEN COMMAND = COMMAND_SPECIFIC_TRIGGER ELSE C C Return to the select display menu otherwise C NEED_COMMAND = .TRUE. PAINT_BACKGROUND = .TRUE. GET_BLOCK = .FALSE. DRAW_FOREGROUND = .FALSE. ENDIF C C Space or PF4 will activate the select display prompt C ELSE IF ((INPUT_CHAR .EQ. SMG$K_TRM_SPACE) .OR. & (INPUT_CHAR .EQ. SMG$K_TRM_PF4)) THEN NEED_COMMAND = .TRUE. PAINT_BACKGROUND = .TRUE. GET_BLOCK = .FALSE. DRAW_FOREGROUND = .FALSE. C C ^W Redraw screen C ELSE IF (INPUT_CHAR .EQ. SMG$K_TRM_CTRLW) THEN NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .TRUE. GET_BLOCK = .FALSE. DRAW_FOREGROUND = .TRUE. C C Q quits the program C ELSEIF ((INPUT_CHAR .EQ. SMG$K_TRM_UPPERCASE_Q) .OR. & (INPUT_CHAR .EQ. SMG$K_TRM_LOWERCASE_Q)) THEN CALL SETSCROLL(1, LINES) CALL FLUSH_SCREEN() GOTO 999 C C PF1 gets a new monitoring block. This is used to abort a long wait C time. C ELSEIF (INPUT_CHAR .EQ. SMG$K_TRM_PF1) THEN NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .FALSE. GET_BLOCK = .TRUE. DRAW_FOREGROUND = .TRUE. C C PF2 switches to the Special Diagnostics display, if the alarm flag is C set. C ELSEIF ((INPUT_CHAR .EQ. SMG$K_TRM_PF2) .AND. & (TWB_ALARM_BEEP_FLAG .EQV. .TRUE.)) THEN NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .TRUE. GET_BLOCK = .TRUE. DRAW_FOREGROUND = .TRUE. COMMAND = COMMAND_DIAGNOST C C PF3 dumps a copy of the screen to a file C ELSEIF (INPUT_CHAR .EQ. SMG$K_TRM_PF3) THEN CALL MON_DISPLAY_TO_FILE() NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .TRUE. GET_BLOCK = .FALSE. DRAW_FOREGROUND = .TRUE. C C PREV scrolls up C ELSEIF ((INPUT_CHAR .EQ. SMG$K_TRM_E5) & .OR. (INPUT_CHAR .EQ. SMG$K_TRM_CTRLP) & .OR. (INPUT_CHAR .EQ. SMG$K_TRM_UP)) THEN NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .FALSE. DRAW_FOREGROUND = .TRUE. GET_BLOCK = .FALSE. CALL MON_PAGE_UP() C C NEXT scrolls down C ELSEIF ((INPUT_CHAR .EQ. SMG$K_TRM_E6) & .OR. (INPUT_CHAR .EQ. SMG$K_TRM_CTRLN) & .OR. (INPUT_CHAR .EQ. SMG$K_TRM_DOWN))THEN NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .FALSE. DRAW_FOREGROUND = .TRUE. GET_BLOCK = .FALSE. CALL MON_PAGE_DOWN() C C Redraw foreground on other characters C ELSEIF (INPUT_CHAR .NE. SMG$K_TRM_TIMEOUT) THEN NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .FALSE. GET_BLOCK = .FALSE. DRAW_FOREGROUND = .TRUE. C C If no character input, get next monitoring block C ELSE NEED_COMMAND = .FALSE. PAINT_BACKGROUND = .FALSE. IF ((COMMAND .EQ. COMMAND_REF_SETS) & .OR. (COMMAND .EQ. COMMAND_GLOBAL_THRESH) & .OR. (COMMAND .EQ. COMMAND_JET_LIST) & .OR. (COMMAND .EQ. COMMAND_ANDOR) & .OR. (COMMAND .EQ. COMMAND_PRTRGR_DBLOCK) & .OR. (COMMAND .EQ. COMMAND_TRIG_FILT_RUN) & .OR. (COMMAND .EQ. COMMAND_EXCLUDED_TOWERS) ) THEN GET_BLOCK = .FALSE. DRAW_FOREGROUND = .FALSE. ELSE GET_BLOCK = .TRUE. DRAW_FOREGROUND = .TRUE. ENDIF C ENDIF C END DO C C---------------------------------------------------------------------- C 200 CONTINUE WRITE(6, *) 'Error opening SYS$OUTPUT. IOSTAT = ', IOSTAT 999 CONTINUE IF (DUMP_FILE_OPENED .EQV. .TRUE.) THEN CLOSE(DUMP_FILE_UNIT_NUM) DUMP_FILE_OPENED = .FALSE. ENDIF C C Make sure the log files are closed C CALL DATA_LOG_END(SCREEN_LOG_RECORDING, SCREEN_LOG_FINISH, & SCREEN_LOG_LUN, SCREEN_LOG_COUNTDOWN, SCREEN_WRITE_COUNTDOWN) C CALL DATA_LOG_END(RATES_LOG_RECORDING, RATES_LOG_FINISH, & RATES_LOG_LUN, RATES_LOG_COUNTDOWN, RATES_WRITE_COUNTDOWN) C C The following line should be commented out if a sharable version of C COMPACK is used. C CALL CLEANUP_VDISPLAY() RETURN C C C **** FAKE D0OPEN **** ENTRY D0OPEN(LUN, FILNAM, CHOPT, OK) C---------------------------------------------------------------------- C- C- Purpose and Methods : Replacement for the standard D0OPEN which provides C- minimal functionality. This is provided because the standard D0OPEN C- causes a large number of unnecessary routines to be included. C- Using this fake routine reduces executable size by at least 1200 C- blocks. C- C- Inputs : C- LUN = unit number C---------------------------------------------------------------------- C---------------------------------------------------------------------- C- FILNAM= file name C- CHOPT = character option C- 'I' input (VAX status OLD, READONLY) C- 'O' output (VAX status NEW) C- 'A' append (this option may not be available on all machines) C- 'F' formatted C- 'U' unformatted C- 'D' delete after close (only allowed combined with O, C- i.e. 'OD' or 'DO') C- combinations allowed but some are illegal (i.e. 'UF') C- defaults 'I' and 'F' (i.e. ' ' equivalent to 'IF' or 'FI') C- Outputs : C- OK = set to false if there is a problem opening file C- true otherwise C- C- Created 3-APR-1992 Philippe Laurens, Steven Klocek C- Taken largely from the standard D0OPEN, version 9-DEC-1991 C- C---------------------------------------------------------------------- C L=LEN(CHOPT) OK=.TRUE. STATUS='OLD' FORM='FORMATTED' C IF(L.EQ.0.OR.CHOPT.EQ.' ') THEN IOPT=1 ELSE IOPT=0 C DO 1 I=1,L IF(CHOPT(I:I).EQ.'U') FORM='UNFORMATTED' 1 CONTINUE C DO 2 I =1,L IF(CHOPT(I:I).EQ.'F') THEN IF(FORM.EQ.'UNFORMATTED') GOTO 201 ENDIF 2 CONTINUE C DO 3 I =1,L IF(CHOPT(I:I).EQ.'I') IOPT=1 3 CONTINUE C DO 4 I=1,L IF(CHOPT(I:I).EQ.'O') THEN IF(IOPT.EQ.0) STATUS='NEW' IOPT=2 ENDIF 4 CONTINUE C DO 5 I=1,L IF(CHOPT(I:I).EQ.'A') THEN IOPT=3 ENDIF 5 CONTINUE C DO 6 I=1,L IF(CHOPT(I:I).EQ.'D') THEN IOPT=4 ENDIF 6 CONTINUE C ENDIF C C now open file (this section is machine dependent) C IF(IOPT.LT.2) THEN C&IF VAXVMS,SIUNIX OPEN(UNIT=LUN,FORM=FORM,STATUS=STATUS,READONLY, & FILE=FILNAM,ERR=100) C&ENDIF ELSEIF(IOPT.EQ.2) THEN C&IF VAXVMS,SIUNIX OPEN(UNIT=LUN,FORM=FORM,STATUS=STATUS, & FILE=FILNAM,ERR=100) C&ENDIF ELSEIF(IOPT.EQ.3) THEN C&IF VAXVMS,SIUNIX OPEN(UNIT=LUN,FORM=FORM,STATUS=STATUS,ACCESS='APPEND', & FILE=FILNAM,ERR=100) C&ENDIF ELSEIF(IOPT.EQ.4) THEN C&IF VAXVMS,SIUNIX OPEN(UNIT=LUN,FORM=FORM,STATUS=STATUS,DISPOSE='DELETE', & FILE=FILNAM,ERR=100) C&ENDIF ENDIF C 998 RETURN C C handle errors C 100 OK=.FALSE. RETURN 201 CONTINUE CALL ERRMSG('D0OPEN','D0OPEN', & 'D0OPEN called with illegal value for CHOPT' ,'F') C RETURN C C END C C C SUBROUTINE TIME_LIMIT_INPUT(INPUT_CHAR, WAIT_TIME) C---------------------------------------------------------------------- C- C- Purpose and Methods : Place a queue I/O request to place the next input C- character in the variable INP_CHR. If no character has been input, C- return after WAIT_TIME seconds without changing the contents of C- INPUT_CHAR. C- C- Inputs : file SYS$INPUT C- Outputs : INPUT_CHAR The character read C- WAIT_TIME The number of seconds to wait until returning C- Controls: none C- C- NOTE: The code below does NOT check for invalid arguments. C- C- Created 10-OCT-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE INCLUDE 'LV1_MON_SCREEN.INC' INCLUDE 'LV1_MPOOL.PARAMS' INCLUDE 'TRGMON_RBUF.INC' INCLUDE '($SMGDEF)' INTEGER SMG$READ_KEYSTROKE EXTERNAL SMG$READ_KEYSTROKE C INTEGER INPUT_CHAR INTEGER WAIT_TIME INTEGER ISTAT C LOGICAL FIRST SAVE FIRST DATA FIRST /.TRUE./ C INPUT_CHAR = 0 C C The special case identified below allows proper operation of the TRGMON C process that refreshes the WWW entry and paints the hallway display at MSU. C This process uses an INP input command file, which doesn't allow chosing a C the number of refreshes before exiting (only choices are 1 or infinite). C To get a 1 mn integration time, the refresh rate is also picked at 1 mn; C thus we need 2 refreshes (RING_SIZE=2) to get the correct data. This special C case skips checking for input after the first refresh; just do the wait. C (The other half of this kludgy feature is in DATA_LOG_CHECK) C IF ( FIRST .EQV. .TRUE. ) THEN FIRST = .FALSE. IF ( RING_SIZE .EQ. 2 ) THEN INPUT_CHAR = SMG$K_TRM_TIMEOUT CALL WAITIT ( FLOAT(WAIT_TIME) ) GOTO 999 ENDIF ENDIF C ISTAT = SMG$READ_KEYSTROKE( VKEYBD_ID, INPUT_CHAR, , & WAIT_TIME, , , ) IF ((.NOT.ISTAT) .AND. (INPUT_CHAR .NE. SMG$K_TRM_TIMEOUT)) THEN CALL ABOMEN(ISTAT, 'Error reading keystroke') ENDIF C---------------------------------------------------------------------- 999 RETURN END C C C SUBROUTINE SETUP_VKBD(IOSTAT) C---------------------------------------------------------------------- C- C- Purpose and Methods : Setup the a virtual keyboard. This routine should C- only be called once, before TIME_LIMIT_INPUT is called. C- C- Inputs : none C- Outputs : IOSTAT The status returned by the system routine. 1 means OK. C- common block variable VKEYBD_ID C- Controls: none C- C- Created 10-OCT-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE INCLUDE 'LV1_MON_SCREEN.INC' C INTEGER IOSTAT INTEGER SMG$CREATE_VIRTUAL_KEYBOARD EXTERNAL SMG$CREATE_VIRTUAL_KEYBOARD C IOSTAT = SMG$CREATE_VIRTUAL_KEYBOARD(VKEYBD_ID) C---------------------------------------------------------------------- 999 RETURN END C C C SUBROUTINE CLEANUP_VDISPLAY() C---------------------------------------------------------------------- C- C- Purpose and Methods : Clean up virtual displays when exiting TRGMON. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- NOTE: This routine should be commented out if a sharable version of C- COMPACK is used. C- C- Created 26-MAR-1991 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE INCLUDE 'D0$PARAMS:MAXLEV.DEF' INCLUDE 'D0$INC:COMNUM.INC' INCLUDE 'D0$INC:COMCHR.INC' INCLUDE 'D0$INC:SMGCOM.INC' C CALL SMG$UNPASTE_VIRTUAL_DISPLAY(MAINID, PASTID) C---------------------------------------------------------------------- 999 RETURN END C C C SUBROUTINE RESTORE_VDISPLAY(ISTAT) C---------------------------------------------------------------------- C- C- Purpose and Methods : Restore the virtual display when TRGMON is returned C- to. C- C- Inputs : none C- Outputs : none C- Controls: none C- C- NOTE: This routine should be commented out if a shareable version of C- COMPACK is used. C- C- Created 26-MAR-1991 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE INCLUDE 'D0$PARAMS:MAXLEV.DEF' INCLUDE 'D0$INC:COMNUM.INC' INCLUDE 'D0$INC:COMCHR.INC' INCLUDE 'D0$INC:SMGCOM.INC' INTEGER SMG$PASTE_VIRTUAL_DISPLAY EXTERNAL SMG$PASTE_VIRTUAL_DISPLAY C INTEGER ISTAT C ISTAT = SMG$PASTE_VIRTUAL_DISPLAY(MAINID, PASTID, 1, 1,) C---------------------------------------------------------------------- 999 RETURN END