OVERLAY PROCEDURE RAWDATA_INPUT; { Menu to get the beginning and ending columns for the tracking data. The first record of the output file will indicate that this is a structured data file. The output file will be used as input for all other programs on the main menu. } TYPE DATA_POINTER = ^DATA_RECORD; DATA_RECORD = RECORD X : REAL; Y : REAL; Z : REAL; DATEV : DATETYPE; TIMEV : DATETYPE; HOURV : INTEGER; LOCATION : INTEGER; ACTIVITY : INTEGER; SUBJECT_NO : INTEGER; RECORD_NO : INTEGER; SEX : CHAR; NEXT : DATA_POINTER; END; VAR FIRST_RECORD : DATA_POINTER; LAST_RECORD : DATA_POINTER; NEW_RECORD : DATA_POINTER; PROCEDURE INIT_DATA_POINTER; { PROCEDURE TO ZERO OUT THE VALUES IN THE DATA RECORD POINTER } BEGIN { INIT_DATA_POINTER PROCEDURE } WITH NEW_RECORD^ DO BEGIN X := 0.0; Y := 0.0; Z := 0.0; DATEV := ' '; TIMEV := ' '; HOURV := 0; LOCATION := 0; ACTIVITY := 0; SUBJECT_NO := 0; RECORD_NO := 0; SEX := ' '; NEXT := NIL; END; END; { INIT_DATA_POINTER PROCEDURE } PROCEDURE INIT_RADIOREC; { PROCEDURE TO ZERO OUT THE VALUES IN THE RADIOREC RECORD } BEGIN { INIT_RADIOREC PROCEDURE } WITH FILE2REC DO BEGIN X := 0.0; Y := 0.0; Z := 0.0; DATEV := ' '; TIMEV := ' '; HOURV := 0; LOCATION := 0; ACTIVITY := 0; SUBJECT_NO := 0; RECORD_NO := 0; SEX := ' '; END; END; { INIT_RADIOREC PROCEDURE } PROCEDURE FILE_CONVERT; { A sub-procedure to convert the raw data file into the structured data file. There is quite a bit of error checking in this portion. } VAR ACTLEN : INTEGER; { LENGTH OF THE ACTIVITY COLUMNS } DATELEN : INTEGER; { LENGTH OF THE DATE COLUMNS } ERRCODE : INTEGER; { ERROR CODE OF CONVERSION } GOODPT : INTEGER; { NUMBER OF UNREJECTED POINTS } HOURLEN : INTEGER; { LENGTH OF THE HOUR COLUMNS } LOCLEN : INTEGER; { LENGTH OF THE LOCATION COLUMNS } NPOINT : INTEGER; { NUMBER OF OBSERVATIONS IN THE FILE } RECLEN : INTEGER; { LENGTH OF THE RECORD NO. COLUMNS } SEXLEN : INTEGER; { LENGTH OF THE SEX COLUMNS } SUBLEN : INTEGER; { LENGTH OF THE SUBJECT NO. COLUMNS } TIMELEN : INTEGER; { LENGTH OF THE TIME COLUMNS } XLEN : INTEGER; { LENGTH OF THE X COLUMNS } YLEN : INTEGER; { LENGTH OF THE Y COLUMNS } ZLEN : INTEGER; { LENGTH OF THE Z COLUMNS } PROCEDURE DUMP_RADIO_RECORDS; { PROCEDURE TO DUMP THE HEAP RECORDS INTO THE FILEVAR2 FILE } BEGIN { DUMP_RADIO_RECORDS PROCEDURE } NEW_RECORD := FIRST_RECORD; WHILE NEW_RECORD <> NIL DO BEGIN FILE2REC.X := NEW_RECORD^.X; FILE2REC.Y := NEW_RECORD^.Y; FILE2REC.Z := NEW_RECORD^.Z; FILE2REC.DATEV := NEW_RECORD^.DATEV; FILE2REC.TIMEV := NEW_RECORD^.TIMEV; FILE2REC.HOURV := NEW_RECORD^.HOURV; FILE2REC.LOCATION := NEW_RECORD^.LOCATION; FILE2REC.ACTIVITY := NEW_RECORD^.ACTIVITY; FILE2REC.SUBJECT_NO := NEW_RECORD^.SUBJECT_NO; FILE2REC.RECORD_NO := NEW_RECORD^.RECORD_NO; FILE2REC.SEX := NEW_RECORD^.SEX; GOODPT := GOODPT + 1; WRITE (FILEVAR2,FILE2REC); NEW_RECORD := NEW_RECORD^.NEXT; END; { WHILE NEW RECORD <> NIL } RELEASE(HEAP_TOP); FIRST_RECORD := NIL; END; { DUMP_RADIO_RECORDS PROCEDURE } BEGIN { FILE_CONVERT PROCEDURE } { Open and set the files } ASSIGN (FILEVAR1,FILEIN); RESET (FILEVAR1); { POSITION POINTER TO BEGINNING OF FILE } ASSIGN (FILEVAR2,FILEOUT); REWRITE (FILEVAR2); { ERASE ANY PREVIOUS FILE } { CALCULATE THE LENGTHS OF THE VARIOUS VALUES } ACTLEN := ACTEND - ACTBEGIN + 1; DATELEN := DATEEND - DATEBEGIN + 1; HOURLEN := HOUREND - HOURBEGIN + 1; LOCLEN := LOCEND - LOCBEGIN + 1; RECLEN := RECEND - RECBEGIN + 1; SEXLEN := SEXEND - SEXBEGIN + 1; SUBLEN := SUBNOEND - SUBNOBEGIN + 1; TIMELEN := TIMEEND - TIMEBEGIN + 1; XLEN := XEND - XBEGIN + 1; YLEN := YEND - YBEGIN + 1; ZLEN := ZEND - ZBEGIN + 1; NPOINT := 0; GOODPT := 0; XHIGH := 0; XLOW := 0; YHIGH := 0; YLOW := 0; ZHIGH := 0; ZLOW := 0; { Place three blank records at the beginning of the output file. These records are used to identify the type of file and the max and min values of x, y, and z. } INIT_RADIOREC; WRITE (FILEVAR2,FILE2REC); { THE FIRST THREE RECORDS GIVE THE FILE TYPE } WRITE (FILEVAR2,FILE2REC); { AND THE SPECS ON X,Y,Z AND NUM POINTS } WRITE (FILEVAR2,FILE2REC); { CONVERT THE INPUT VALUES ANS WRITE THEM TO MEMORY } MARK(HEAP_TOP); FIRST_RECORD := NIL; GOODRECORD := TRUE; LINE_OUT(1,23,'Processing Number:'); LINE_OUT(37,19,'Memory left: paragraphs.'); WHILE (NOT EOF(FILEVAR1)) AND (KEEP_GOING) DO BEGIN IF GOODRECORD = TRUE THEN NEW(NEW_RECORD) ELSE GOODRECORD := TRUE; READLN (FILEVAR1,LINE1); NPOINT := NPOINT + 1; GOTOXY(20,23); WRITE (NPOINT:5); INIT_DATA_POINTER; WITH NEW_RECORD^ DO BEGIN { FIRST, SET ALL VALUES TO BLANK OR ZERO } IF XBEGIN > 0 THEN CON_VERT_R(XBEGIN,XLEN,NPOINT,X); IF (YBEGIN > 0) AND (GOODRECORD) THEN CON_VERT_R(YBEGIN,YLEN,NPOINT,Y); IF (ZBEGIN > 0) AND (GOODRECORD) THEN CON_VERT_R(ZBEGIN,ZLEN,NPOINT,Z); IF (HOURBEGIN > 0) AND (GOODRECORD) THEN CON_VERT_I(HOURBEGIN,HOURLEN,NPOINT,HOURV); IF (LOCBEGIN > 0) AND (GOODRECORD) THEN CON_VERT_I(LOCBEGIN,LOCLEN,NPOINT,LOCATION); IF (ACTBEGIN > 0) AND (GOODRECORD) THEN CON_VERT_I(ACTBEGIN,ACTLEN,NPOINT,ACTIVITY); IF (SUBNOBEGIN > 0) AND (GOODRECORD) THEN CON_VERT_I(SUBNOBEGIN,SUBLEN,NPOINT,SUBJECT_NO); IF (RECBEGIN > 0) AND (GOODRECORD) THEN CON_VERT_I(RECBEGIN,RECLEN,NPOINT,RECORD_NO); IF DATEBEGIN > 0 THEN DATEV := COPY(LINE1,DATEBEGIN,DATELEN); IF TIMEBEGIN > 0 THEN TIMEV := COPY(LINE1,TIMEBEGIN,TIMELEN); IF SEXBEGIN > 0 THEN SEX := COPY(LINE1,SEXBEGIN,SEXLEN); IF GOODRECORD THEN IF ( X > 0.0 ) AND ( X < 0.0001 ) THEN IF ( Y > 0.0 ) AND ( Y < 0.0001 ) THEN BEGIN GOTOXY(1,23); WRITE (SPACE30); GOTOXY(1,23); WRITELN ('Warning... X and Y values are too small use in further programs'); WRITE (' X AND Y ',X,' ',Y,' '); KEYBOARD_PAUSE; END; { GET MAX AND MIN VALUES } IF NOT GOODRECORD THEN LINE_OUT(1,23,'Processing Number:'); IF GOODRECORD THEN BEGIN IF (NPOINT = 1) OR (X < XLOW) THEN XLOW := X; IF (NPOINT = 1) OR (X > XHIGH) THEN XHIGH := X; IF (NPOINT = 1) OR (Y < YLOW) THEN YLOW := Y; IF (NPOINT = 1) OR (Y > YHIGH) THEN YHIGH := Y; IF (NPOINT = 1) OR (Z < ZLOW) THEN ZLOW := Z; IF (NPOINT = 1) OR (Z > ZHIGH) THEN ZHIGH := Z; END; { IF GOODRECORD } END; { WITH NEW_RECORD^ DO } { IF THE RECORD IS GOOD, ADD IT TO THE CHAIN } IF GOODRECORD THEN BEGIN IF FIRST_RECORD = NIL THEN FIRST_RECORD := NEW_RECORD ELSE LAST_RECORD^.NEXT := NEW_RECORD; LAST_RECORD := NEW_RECORD; LAST_RECORD^.NEXT := NIL; END; { SEE IF MEMORY IS RUNNING OUT } GOTOXY(50,19); WRITE (MEMORY_LEFT:8:2); IF MEMORY_LEFT < 300 THEN DUMP_RADIO_RECORDS; END; { WHILE NOT EOF(FILEVAR1) } { END OF INPUT FILE, NOW WRITE OUT ANY RECORDS LEFT IN MEMORY } IF KEEP_GOING THEN BEGIN IF FIRST_RECORD <> NIL THEN DUMP_RADIO_RECORDS; { WRITE OUT THE FILE ID AND THE EXTREME VALUES } SEEK(FILEVAR2,0); INIT_RADIOREC; WITH FILE2REC DO BEGIN X := -1; { Identify a formatted data file with } Y := -2; { -1, -2, -3. The sex = g is version 1.1 } Z := -3; SEX := 'G'; END; WRITE (FILEVAR2,FILE2REC); INIT_RADIOREC; WITH FILE2REC DO BEGIN X := XLOW; Y := YLOW; Z := ZLOW; RECORD_NO := GOODPT; END; WRITE (FILEVAR2,FILE2REC); INIT_RADIOREC; WITH FILE2REC DO BEGIN X := XHIGH; Y := YHIGH; Z := ZHIGH; END; WRITE (FILEVAR2,FILE2REC); GOTOXY(1,24); WRITE ('Formatting of the data file complete. There are ',GOODPT:5,' valid locations.'); END; { IF KEEP_GOING } { CLOSE ALL THE FILES } CLOSE (FILEVAR1); CLOSE (FILEVAR2); RELEASE(HEAP_TOP); END; { FILE_CONVERT PROCEDURE } BEGIN { RAWDATA_INPUT PROCEDURE } { First, draw out the labels. Then change color for the input. } CLRSCR; DISPLAY_COLOR(CYAN); LINE_OUT(18,2,'(2) Format ASCII File with Location Coordinates'); LINE_OUT(7,4,'1 Input File:'); LINE_OUT(38,4,'2 Output File:'); LINE_OUT(16,6,'First Column Last Column'); LINE_OUT(7,8,'3 X:'); LINE_OUT(7,10,'4 Y:'); DISPLAY_COLOR(RED); LINE_OUT(7,21,'P Process Data'); LINE_OUT(37,21,'E Exit to Main Menu'); TEXTCOLOR(YELLOW); LINE_OUT(22,4,FILEIN); LINE_OUT(54,4,FILEOUT); INT_OUT(17,8,XBEGIN,XEND); INT_OUT(17,10,YBEGIN,YEND); { INT_OUT(17,12,ZBEGIN,ZEND); } { INT_OUT(17,14,DATEBEGIN,DATEEND); } { INT_OUT(17,16,TIMEBEGIN,TIMEEND); } { INT_OUT(17,18,HOURBEGIN,HOUREND); } { INT_OUT(53,8,SUBNOBEGIN,SUBNOEND); } { INT_OUT(53,10,SEXBEGIN,SEXEND); } { INT_OUT(53,12,ACTBEGIN,ACTEND); } { INT_OUT(53,14,LOCBEGIN,LOCEND); } { INT_OUT(53,16,RECBEGIN,RECEND); } GOTOXY(1,24); KEYVALUE := ' '; WHILE UPCASE(KEYVALUE) <> 'E' DO BEGIN KEYVALUE := ' '; WHILE NOT (UPCASE(KEYVALUE) IN ['1'..'E','P']) DO READ (KBD,KEYVALUE); KEYVALUE := UPCASE(KEYVALUE); GOTOXY(1,23); DELLINE; DELLINE; CASE KEYVALUE OF '1': BEGIN LINE_OUT(1,23,'Enter the name of the ASCII data INPUT file '); READLN (INPUT,FILEIN); GOTOXY(1,23); DELLINE; CAPIT(FILEIN); LINE_OUT(22,4,SPACE12); LINE_OUT(22,4,FILEIN); END; '2': BEGIN LINE_OUT(1,23,'Enter the name of the structured OUTPUT data file '); READLN (INPUT,FILEOUT); GOTOXY(1,23); DELLINE; CAPIT(FILEOUT); LINE_OUT(54,4,SPACE12); LINE_OUT(54,4,FILEOUT); END; '3': QUESTION(17,8,'X',XBEGIN,XEND); '4': QUESTION(17,10,'Y',YBEGIN,YEND); '5': QUESTION(17,12,'Z',ZBEGIN,ZEND); '6': QUESTION(17,14,'DATE',DATEBEGIN,DATEEND); '7': QUESTION(17,16,'TIME',TIMEBEGIN,TIMEEND); '8': QUESTION(17,18,'HOUR',HOURBEGIN,HOUREND); '9': QUESTION(53,8,'SUBJECT NO.',SUBNOBEGIN,SUBNOEND); 'A': QUESTION(53,10,'SUBJECT SEX',SEXBEGIN,SEXEND); 'B': QUESTION(53,12,'ACTIVITY',ACTBEGIN,ACTEND); 'C': QUESTION(53,14,'LOCATION',LOCBEGIN,LOCEND); 'D': QUESTION(53,16,'RECORD NUMBER',RECBEGIN,RECEND); 'P': BEGIN KEEP_GOING := TRUE; IF (FILEIN = '') OR (FILEOUT = '' ) THEN BEGIN LINE_OUT(1,23,'Both files must be defined.'); KEEP_GOING := FALSE; END; IF (KEEP_GOING) AND (NOT EXIST(FILEIN)) THEN BEGIN LINE_OUT(1,23,'The input data file does not exist.'); KEEP_GOING := FALSE; END; IF KEEP_GOING THEN IF ( XBEGIN = 0 ) OR ( XEND = 0 ) THEN BEGIN LINE_OUT(1,23,'Both the X and Y fields must have non-zero values.'); LINE_OUT(1,24,'The X columns are invalid.'); KEEP_GOING := FALSE; END; IF KEEP_GOING THEN IF ( YBEGIN = 0 ) OR ( YEND = 0 ) THEN BEGIN LINE_OUT(1,23,'Both the X and Y fields must have non_zero values.'); LINE_OUT(1,24,'The Y columns are invalid.'); KEEP_GOING := FALSE; END; IF KEEP_GOING THEN FILE_CONVERT; END; { CASE 'P' } END; { CASE KEYVALUE } GOTOXY(1,25); END; { WHILE KEYVALUE <> 'E' } KEYVALUE := ' '; END; { RAWDATA_INPUT PROCEDURE }