PROGRAM REMIND,1.0(100)
!
! =============================
! // OPERATOR REMINDER UTILITY \\
! //=============================\\
! << BY THE GREAT & MIGHTY OZ >>
! //==============\\============================//================\\
! || * * * * * E D I T H I S T O R Y * * * * * ||
! || ||
! || 8/27/85 program created. /dmm ||
! || Sends a reminder message to be display (on bottom ||
! || status line) at a certain time on a users terminal ||
! || and then can optionally beep every miniute for 30 ||
! || minutes to remind them of the message. ||
! || Has a companion program call WATCHR.RUN which must ||
! || be running in another job to monitor and display ||
! || messages. SYSMEM.SBR must be loaded into system ||
! || memory (if you don't have SYSMEM.SBR you may copy ||
! || COMMON.SBR to SYSMEM.SBR). /dmm ||
! || The following is needed to use this system. ||
! || 1. UTLMNU.RUN (MENU) ||
! || 2. USERS.RUN (DEFINES SYSTEM USERS) ||
! || 3. SNDMSG.RUN (OPTIONAL) ||
! || 4. WATCHR.RUN (TO BE RUN IN A BACKGROUND JOB) ||
! || 5. REMIND.RUN (ENTER AND SEND MESSAGES) ||
! || 6. CLRMSG.RUN (PURGES OUT OLD MESSAGES) ||
! || 7. SYSMEM.SBR (COMMON.SBR) ||
! || 8. INFLD.SBR (YOU MAY USE INPUT.SBR WITH MINOR ||
! || CHANGES) ||
! || 9. ANYCN.SBR ||
! || 10. MESAG.SBR ||
! || 11. NOECHO.SBR ||
! || 12. JOBGET.SBR (OPTIONAL) ||
! || 13. TSTKEY.SBR (OPTIONAL) ||
! || 14. FLOCK.SBR (OPTIONAL) ||
! || 15. RDATE.SBR (OPTIONAL) ||
! || ||
! || **** IMPORTANT **** ||
! || THESE PROGRAMS ARE SET UP TO WORK ON A TVI925 & ||
! || MAY REQUIRE SOME CHANGES TO WORK ON OTHERS. ||
! || ||
! \\==============<<============================>>================//
! \\==========================//
!
MAP1 PRGTITLE,S,60,"REMIND.BAS BY DENNIS MCCABE ON 27AUG85 AT WILLITTS DESIGNS "
! //=============================\\
! || REMINDER FILE RECORD LAYOUT ||
! \\=============================//
!
MAP1 REMIND
MAP2 RDATE,S,6
MAP2 RSEND
MAP3 RTIME
MAP4 RHOUR,S,2
MAP4 RMIN,S,2
MAP3 RNAME,S,6
MAP3 RMESAG,S,70
MAP3 RBEEPS,B,1
MAP1 RRECSIZE,F,,102
MAP1 DUMREM
MAP2 JUNK,S,2
MAP2 ORGREM,F
MAP2 RECREM,F
MAP2 MAXREM,F
MAP2 DELREM,F
MAP1 JOBTBL
MAP2 JOBNO,B,1
MAP2 JOBNAM,S,6
MAP2 JOBTRM,S,6
MAP2 JOBPRG,S,6
MAP2 JOBDEV,S,3
MAP2 JOBDVR,B,2
MAP2 JOBPPN
MAP3 JOB'PROG,B,1
MAP3 JOB'PROJ,B,1
MAP3 JOBUSR,B,2,@JOBPPN
MAP2 JOBCPU,B,4
MAP2 JOBDSR,B,4
MAP2 JOBDSW,B,4
MAP2 JOBCON,S,10
XCALL JOBGET,JOBTBL !<---<<< ****(OPTIONAL)****
!
! //===========================\\
! || COMMON TRANSFER WORK AREA ||
! \\===========================//
!
!
MAP1 SEND,B,1,0
MAP1 MSGTXT
MAP2 JTIME
MAP3 JHOUR,S,2
MAP3 JMIN,S,2
MAP2 JNAME,S,6
MAP2 JMESAG,S,70
MAP2 JBEEPS,B,1
MAP1 MSGNAM,S,6,"TICKLE"
MAP1 RECV
MAP2 F'RCV,B,1,1
MAP2 RCVFLG,B,1,0
MAP1 RCVTXT,S,1
MAP1 RCVNAM,S,6,"GOTCHA"
MAP1 USERS
MAP2 JOBNAMS(30),S,6
MAP2 TRMDEFS(30),S,6
MAP1 FILENAME,S,10,"USERS.DAT"
MAP1 RECSIZ99,F,6,LEN(USERS)
MAP1 NUMFIL,F,6,30
MAP1 FILNAM,S,20
MAP1 CTLX
MAP2 ROW,S,2
MAP2 FILL'1,S,1
MAP2 COL,S,2
MAP2 FILL'2,S,1
MAP2 XMAX,S,2
MAP2 FILL'3,S,1
MAP2 XMIN,S,2
MAP2 FILL'4,S,1
MAP2 TYPE,S,24
MAP1 CTL,S,36,@CTLX
MAP1 ENTRY,S,70
MAP1 MAXREC,F,,3000
MAP1 DOW,S,9
MAP1 MONTH,F
MAP1 DAY,F
MAP1 YEAR,F
MAP1 ANSWER,F
MAP1 BRACKS,S,102,"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]"
MAP1 TODAY,S,6
MAP1 AMPM,S,2
XCALL NOECHO
FILEBASE 1
OPEN #99, FILENAME, RANDOM, RECSIZ99, FILE99
FILE99 = 1
READ #99, USERS
CLOSE #99
? TAB(-1,0);
? TAB(-1,11);"//============================================================================\\"
? TAB(2,1); "|| O P E R A T O R D A I L Y R E M I N D E R U T I L I T Y ||"
? TAB(3,1); "\\============================================================================//"
FILNAM="REMIND.DAT"
LOOKUP FILNAM,FOUND
IF FOUND=0 CALL INITALIZE ELSE CALL OPEN
ON ERROR GOTO ERR'TRAP
FILID=9
CALL CHK'OPEN
? TAB(5,1);TAB(-1,10);TAB(-1,11);
? TAB(5,1); " 1. DATE"
? TAB(6,1); " 2. TIME "
? TAB(7,1); " 3. JOB"
? TAB(8,1); " 4. MESSAGE"
? TAB(10,1);" 5. OPTIONAL BEEPS"
? TAB(-1,12);
GDATE:
? TAB(-1,13);
? TAB(5,20);TAB(-1,10);
CDATE:
CTL="05,20,06,00,dE"
CALL INPUT
IF INXCTL GOTO DONE
RDATE=ENTRY USING "#ZZZZZ"
MONTH=RDATE[1,2] : DAY=RDATE[3,4] : YEAR=RDATE[5,6]
CALL GET'DOW
? TAB(5,30);TAB(-1,9);DOW
ON CNGCTL GOTO ANYCNG
HOUR:
CALL GET'TIME
DEFLT=1
ENTRY=HOURS USING "#Z"
CTL="06,20,02,02,#F"
CALL INPUT
JHOUR=ENTRY
IF VAL(JHOUR) < 1 OR VAL(JHOUR) > 12 XCALL MESAG,"",3 : GOTO HOUR
MIN:
? TAB(6,22);":";
CTL="06,23,02,02,#FW"
ENTRY=MINS USING "#Z"
CALL INPUT
JMIN=ENTRY
IF VAL(JMIN) < 0 OR VAL(JMIN) > 59 XCALL MESAG,"",3 : GOTO MIN
AMPM:
ENTRY=AMPM
CTL="06,26,02,02,A"
CALL INPUT
DEFLT=0
IF ENTRY # "AM" AND ENTRY # "PM" XCALL MESAG,"",3 : GOTO AMPM
IF ENTRY="PM" AND VAL(JHOUR) # 12 JHOUR=STR(VAL(JHOUR)+12) USING "#Z"
ON CNGCTL GOTO ANYCNG
JOB:
DEFLT=1
FOR I = 1 TO 30
IF JOBNAMS(I)=JOBNAM GOTO NXTJOB
NEXT I
NXTJOB:
IF I > NUMFIL I=1
IF JOBNAMS(I)=SPACE(6) AND I # 1 I=I+1 : GOTO NXTJOB
ENTRY=JOBNAMS(I)
CTL="07,20,06,01,AT"
CALL INPUT
IF INXCTL=3 I=I+1 : GOTO NXTJOB
JNAME=ENTRY
DEFLT=0
ON CNGCTL GOTO ANYCNG
MESSAGE:
ENTRY=JMESAG
CTL="09,02,70,00,A"
CALL INPUT
JMESAG=ENTRY
ON CNGCTL GOTO ANYCNG
BEEPS:
CTL="10,20,01,00,YN"
CALL INPUT
IF INXCTL=1 JBEEPS=30 ELSE JBEEPS=0
GOTO ANYCNG
SEND:
DEFLT=0
IF JNAME="ALL" GOTO SEND'ALL
CALL SENDIT
GOTO GDATE
SEND'ALL:
FOR I = 1 TO NUMFIL
JNAME=JOBNAMS(I)
IF JNAME="" GOTO NEXT'I
? TAB(24,1);TAB(-1,9);"SENDING TO ";JNAME;
CALL SENDIT
NEXT'I:
NEXT I
? TAB(24,1);TAB(-1,9);
GOTO GDATE
SENDIT:
XCALL FLOCK,3,2,RTNCDE,FILID,1
XCALL RDATE,FLTDAY : TODAY=FLTDAY USING "#ZZZZZ"
IF RDATE # TODAY GOTO JST'WRITE
XCALL SYSMEM,SEND,MSGNAM,MSGTXT
OK:
XCALL SYSMEM,RECV,RCVNAM,RCVTXT
IF RCVFLG=0 GOTO OK
JST'WRITE:
CALL WRITE'RECORD
XCALL FLOCK,5,0,RTNCDE,FILID,1
RETURN
DONE:
XCALL FLOCK,2,0,RTNCDE,FILID,0
CHAIN "UTLMNU"
ANYCNG:
XCALL ANYCN,CNGCTL,WHATNO
ON CNGCTL+1 GOTO SEND,CNGBR,HOUR
GOTO SEND
CNGBR:
DEFLT=1
ON WHATNO GOTO CDATE,HOUR,JOB,MESSAGE,BEEPS
BADCNG:
CNGCTL = 3
GOTO ANYCNG
WRITE'RECORD:
FILID=9999
RECNUM=1
XCALL FLOCK,3,2,RTNCDE,FILID,1
READ #FILID,DUMREM
RECREM=RECREM+1
IF RECREM = MAXREM XCALL MESAG,"file is now full, no more recrods may be added",2 : GOTO WRT'RTN
IF RECREM > MAXREM-10 XCALL MESAG,"file is almost full & should be cleared of old records",2
WRITE #FILID,DUMREM
RECNUM=RECREM
RSEND=MSGTXT
WRITE #FILID,REMIND
WRT'RTN:
XCALL FLOCK,5,0,RTNCDE,FILID,1
RETURN
INPUT:
XCALL INPUT,ROW,COL,XMAX,XMIN,TYPE,ENTRY,INXCTL,1,DEFLT,EXTCODE,TIMER
RETURN
GET'TIME:
T=TIME
CLOCK=60
HOURS=INT(T/(CLOCK^2))
MINS=INT(T/CLOCK)-(HOURS*60)
H'MOD:
AMPM="AM"
IF HOURS > 23 HOURS=HOURS-24 : GOTO H'MOD
IF HOURS > 12 HOURS=HOURS-12 : AMPM="PM"
? TAB(6,20);HOURS USING "#Z";":";MINS USING "#Z";" ";AMPM
RETURN
GET'DOW:
if (MONTH > 2) then goto CALC
MONTH = (MONTH + 12)
YEAR = (YEAR - 1)
CALC:
ANSWER = (((((((DAY + (2 * MONTH)) + int((0.6 * (MONTH + 1)))) + YEAR) + int((YEAR &
/ 4))) - int((YEAR / 100))) + int((YEAR / 400))) + 2)
ANSWER = int(((((ANSWER / 7) - int((ANSWER / 7))) * 7) + 0.5))
if (ANSWER > 0) then goto MONDAY
DOW= "SUNDAY"
RETURN
MONDAY:
if (ANSWER > 1) then goto TUESDAY
DOW="MONDAY"
RETURN
TUESDAY:
if (ANSWER > 2) then goto WEDNESDAY
DOW="TUESDAY"
RETURN
WEDNESDAY:
if (ANSWER > 3) then goto THURSDAY
DOW="WEDNESDAY"
RETURN
THURSDAY:
if (ANSWER > 4) then goto FRIDAY
DOW="THURSDAY"
RETURN
FRIDAY:
if (ANSWER > 5) then goto SATURDAY
DOW="FRIDAY"
RETURN
SATURDAY:
DOW="SATURDAY"
RETURN
INITALIZE:
? TAB(10,1);TAB(-1,10)"REMINDER MESSAGE FILE NOT FOUND, DO YOU WISH TO CREATE ";
CTL="10,60,01,00,YN"
CALL INPUT
IF INXCTL=2 GOTO DONE
? TAB(24,1);"Creating file, please wait...";
SIZE = INT((MAXREC)/INT(512/RRECSIZE)) + 1
ALLOCATE FILNAM,SIZE
FILID=9999
CALL CHK'OPEN
OPEN #FILID,FILNAM,RANDOM'FORCED,RRECSIZE,RECNUM
FOR RECNUM = 2 TO MAXREC
WRITE #FILID,BRACKS[1;RRECSIZE]
NEXT RECNUM
RECNUM=1
ORGREM=1 :RECREM=1 : MAXREM=MAXREC
DELREM=0
WRITE #FILID,DUMREM
XCALL MESAG,"FILE CREATED",2
RETURN
OPEN:
FILID=9999
CALL CHK'OPEN
OPEN #FILID,FILNAM,RANDOM'FORCED,RRECSIZE,RECNUM
RECNUM=1
READ #FILID,DUMREM
RETURN
CHK'OPEN:
INXCTL=0
XCALL FLOCK,0,4,RTNCDE,FILID,0
IF RTNCDE CALL SHAL'WE'WAIT
IF INXCTL=2 GOTO FLOCK'ABORT
RETURN
SHAL'WE'WAIT:
IF RTNCDE=0 GOTO FLOCK'ERR
? TAB(23,1);TAB(-1,10);"FILE#";FILID;FILNAM;" IS UNAVAILABLE ";
? TAB(24,1);"DO YOU WISH TO WAIT (Y/N)";
XCALL INPUT,24,30,01,01,"YN",ENTRY,INXCTL,1
? TAB(23,1);TAB(-1,10);
IF INXCTL=2 RETURN
TRY'OPEN:
XCALL FLOCK,0,4,RTNCDE,FILID,0
IF RTNCDE=0 RETURN
IF RTNCDE>1 GOTO FLOCK'ERR
XCALL TSTKEY,CHAR
IF CHAR=27 GOTO SHAL'WE'WAIT
? TAB(24,1);TAB(-1,9);" WAITING....";
GOTO TRY'OPEN
ERR'TRAP:
? TAB(20,1);TAB(-1,14);TAB(-1,10);"********************************************************************************"
? TAB(21,1);"ERROR CODE ";ERR(0);"IN LINE #";ERR(1);"OF ";JOBPRG;".RUN"
? TAB(22,1);"********************************************************************************"
XCALL FLOCK,2,0,RTNCDE,FILID,0
END
FLOCK'ABORT:
XCALL FLOCK,2,0,RTNCDE,FILID,0
XCALL MESAG,"JOB ABORTED BY OPERATOR",2
CHAIN "MASMEN"
RECORD'LOCKED:
IF RTNCDE > 1 GOTO FLOCK'ERR
? TAB(23,1);TAB(-1,10);"RECORD IS UNAVALIABLE"
? TAB(24,1);"DO YOU WISH TO WAIT (Y/N)";
XCALL INPUT,24,30,01,00,"YN",ENTRY,INXCTL,1
? TAB(23,1);TAB(-1,10);
IF INXCTL=2 RETURN
TRY'REC:
XCALL FLOCK,3,6,RTNCDE,FILID,FILE1
IF RTNCDE=0 RETURN
XCALL TSTKEY,CHAR
IF CHAR=27 GOTO RECORD'LOCKED
? TAB(24,1);TAB(-1,9);" WAITING....";
GOTO TRY'REC
FLOCK'ERR:
? TAB(23,1);"*** FLOCK ERROR ****";RTNCDE;TAB(-1,10);
XCALL MESAG,"JOB ABORTED",2
XCALL FLOCK,2,0,RTNCDE,FILID,0
END