'VWT97V01.BAS VWDK TERMINAL PROGRAM, Copyright RF Monolithics, Inc., 1996, 1997 'REV 04-15-97 ADDED MULTIPLE BAUD RATE SUPPORT 'REV 04-25-97 MISC SCREEN CLEAN UPS 'REV 05-06-97 ADDED "TO ADDRESS" ALERT MESSAGE 'REV 05-10-97 GENERAL CLEAN UPS 'REV 05-15-97 FIRST RELEASE 'Check www.rfm.com for the latest VWDK SW updates DEFINT A-Z: OPTION BASE 1 DIM MINI.MSG$(100) 'THE SPECIAL MESSAGE FORMAT IS THE SAME TO AND FROM THE VIRTUAL WIRE UNIT. 'SPECIAL MESSAGE FORMAT = | ADDRESS | PACKET# | #BYTES |SPECIAL MSG. | ' " " " = | F/F | 0 | 1 |SPECIAL MSG. | 'NOTE T/F = F/F SINCE MESSAGE IS NOT FOR ANY OTHER UNITS. '-------------- SPECIAL MESSAGES FROM VIRTUAL WIRE UNIT TO PC ------------- MSG.FROM.VW$ = CHR$(&H0) 'NULL = UNKNOWN MESSAGE WAS RECEIVED MSG0.FROM.VW$ = "0" '(&H30) MESSAGE PACKET i.e. NUMBER BYTES TOO LONG MSG1.FROM.VW$ = "1" '(&H31) LOW BATTERY MSG2.FROM.VW$ = "2" 'BATTERY VOLTAGE OK MSG3.FROM.VW$ = "3" 'FAILED SELF TEST MSG4.FROM.VW$ = "4" 'PASSED SELF TEST MSG5.FROM.VW$ = "5" 'TO/FROM (T/F) = F/F = VIRTUAL WIRE UNIT ADDRESS '--------------- SPECIAL MESSAGES TO VW UNIT FROM PC ---------------------- MSG0.TO.VW$ = "0" 'RESET VW UNIT MSG1.TO.VW$ = "1" 'SEND ADDRESS MSG2.TO.VW$ = "2" 'TEST BATTERY AND RETURN RESULTS MSG3.TO.VW$ = "3" 'RUN SELF TEST MSG4.TO.VW$ = "4" 'CHANGE NODE ADDR. VW.ACK$ = CHR$(&HEE) 'VIRTUAL WIRE "ACK" VW.NAK$ = CHR$(&HDD) 'VIRTUAL WIRE "NAK" FULL.MSG$ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCD " '**************************************************************************** F1$ = CHR$(0) + CHR$(59) 'FUNCTION KEY F1 F2$ = CHR$(0) + CHR$(60) F3$ = CHR$(0) + CHR$(61) F4$ = CHR$(0) + CHR$(62) F5$ = CHR$(0) + CHR$(63) F6$ = CHR$(0) + CHR$(64) F7$ = CHR$(0) + CHR$(65) F8$ = CHR$(0) + CHR$(66) F9$ = CHR$(0) + CHR$(67) F10$ = CHR$(0) + CHR$(68) UP$ = CHR$(0) + CHR$(72) '^ DWN$ = CHR$(0) + CHR$(80) 'v LFT$ = CHR$(0) + CHR$(75) '< RT$ = CHR$(0) + CHR$(77) '> DEL$ = CHR$(0) + CHR$(83) 'DELETE KEY BACK$ = CHR$(8) 'BACK SPACE ESC$ = CHR$(27) 'ESCAPE CR$ = CHR$(13) 'RETURN /ENTER KEY CODE BLANK$ = CHR$(&H20) 'SPACE CHARACTER PGUP$ = CHR$(0) + CHR$(&H49) 'PAGE UP PGDN$ = CHR$(0) + CHR$(&H51) 'PAGE DOWN TAB$ = CHR$(9) SHIFT.TAB$ = CHR$(0) + CHR$(&HF) ALT.C$ = CHR$(0) + CHR$(46) ALT.S$ = CHR$(0) + CHR$(31) ALT.X$ = CHR$(0) + CHR$(45) ALT.A$ = CHR$(0) + CHR$(30) ALT.H$ = CHR$(0) + CHR$(35) ALT.I$ = CHR$(0) + CHR$(23) ALT.V$ = CHR$(0) + CHR$(47) ALT.T$ = CHR$(0) + CHR$(20) ALT.D$ = CHR$(0) + CHR$(32) ALT.B$ = CHR$(0) + CHR$(48) ALT.R$ = CHR$(0) + CHR$(19) CTRL.T$ = CHR$(20) CTRL.N$ = CHR$(14) 'COMM. CONTROL CHARACTERS SOH$ = CHR$(1) 'START OF HEADER STX$ = CHR$(2) 'START OF TEXT - START OF XMISSION ETX$ = CHR$(3) 'END OF TEXT - END OF XMISSION EOT$ = CHR$(4) 'END OF TRANSMISSION ETB$ = CHR$(&H17) 'END OF BLOCK - LAST DATA BYTE 0 - 16 NAK$ = CHR$(&H15) 'NEGATIVE ACKNOWLEDGE - CHECK SUM NO COMPUTE ACK$ = CHR$(6) 'ACKNOWLEDGE - CHECK SUM OK RCV.PTRX = 1 'POINTER FOR RECEIVE WINDOW RCV.PTRY = 5 LAST.MSG$ = "**Virtual Wire RF Link Test**" 'tweaked 97.05.10 Packet = 1 TO.ADDR = 2 'DEFAULT TO.ADDR$ = "2" 'DEFAULT added 97.05.10 COM.PORT$ = "COM2:" 'DEFAULT BAUD.RATE$ = "4800" 'DEFAULT ON ERROR GOTO PRTERRO 'set up error handler (files, com port, etc.) GOSUB SETUP.DSK 'read/build/save configuration files to disk 97.05.10 OPEN COM.PORT$ + BAUD.RATE$ + ",N,8,1,RS,CD0,DS0,CS0" FOR RANDOM AS #1 LEN = 2048 CLS GOSUB GET.ADDRESS GOSUB TOADDR.MSG 'added 97.05.10 MAIN: COLOR 7, 0 'Ensure screen state 97.05.10 RCV.PTRX = 1 'POINTER FOR RECEIVE WINDOW RCV.PTRY = 5 GOSUB SCREEN1 IF LOC(1) > 0 THEN DATAB$ = INPUT$(LOC(1), #1) 'CLEAR COMM. BUFFER ELSE END IF DATAB$ = "" '*************************** EDIT MESSAGE ****************************** MINI.WORD: ERASE MINI.MSG$ 'MESSAGE FOR SENDING TO VW UNIT LOCATE 23, 1, 1, 5, 7 MINI: IF BUSY = 0 AND NUMBER.TO.SEND > 0 THEN GOSUB SEND.PACKET ELSE END IF '--------------------CHECK COMM. BUFFER ---------------------------------- IF LOC(1) > 0 THEN 'KEEP LOOKING FOR COMMUNICATIONS GOSUB READ.BUFFER IF BUSY > 0 THEN 'SEE IF IT IS RESPONSE TO LAST PACKET IF LEN(DATAB$) = 3 THEN 'LENGTH CORRECT FOR VW.ACK OR VW.NAK IF ASC(MID$(DATAB$, 2, 1)) = Packet THEN 'CORRECT RESPONSE Packet = Packet + 1 IF Packet = 8 THEN Packet = 1 ELSE END IF '----- VW.ACK$ &HEn n = 1 to 9 IF RIGHT$(DATAB$, 1) >= CHR$(&HE1) AND RIGHT$(DATAB$, 1) <= CHR$(&HE9) THEN RMSG$ = "RX OK ON " + CHR$((ASC(RIGHT$(DATAB$, 1)) - &HE0) OR &H30) ELSEIF RIGHT$(DATAB$, 1) = CHR$(&HEE) THEN 'For compatibility with VWT.BAS (4-25-97) RMSG$ = "RX OK" ELSEIF RIGHT$(DATAB$, 1) = VW.NAK$ THEN IF BROADCAST = 1 THEN RMSG$ = "BROADCAST FINISHED" ELSE IF (ASC(LEFT$(DATAB$, 1)) AND &HF) = TO.ADDR THEN '-ATMEL DOES NOT SEND "NAK" BUT COULD IN FUTURE RMSG$ = "RF LINK FAULT (REMOTE)" 'tweaked 97.05.10 ELSEIF (ASC(LEFT$(DATAB$, 1)) AND &HF0) / 16 = TO.ADDR THEN RMSG$ = "RF LINK FAULT" 'NO RESPONSE TIME OUT - tweaked 97.05.10 ELSE END IF END IF BEEP BUSY = 0 'IF LINK FAULT THEN STOP SENDING NUMBER.TO.SEND = 0 ELSE RMSG$ = "" END IF DATAB$ = "" '--- PUT MESSAGE ON DISPLAY IF RMSG$ <> "" THEN SELECT CASE PACKET.PTR CASE 1 LOCATE 16, 62, 0 PRINT RMSG$; CASE 2 LOCATE 17, 62, 0 PRINT RMSG$; CASE 3 LOCATE 18, 62, 0 PRINT RMSG$; CASE ELSE END SELECT BUSY = 0 PACKET.PTR = PACKET.PTR + 1 IF PACKET.PTR > NUMBER.TO.SEND THEN 'LAST PACKET SENT PACKET.PTR = 1 NUMBER.TO.SEND = 0 GOSUB CLEAR.W3 COLOR 0, 7 LOCATE 23, 1, 1, 5, 7 ELSE END IF ELSE END IF ELSE 'WRONG PACKET# ERROR END IF ELSE GOSUB RECEIVE.DATA 'LONGER THEN THREE BYTES IS INCOMING PACKET. END IF ELSE GOSUB RECEIVE.DATA END IF ELSE 'Nothing in buffer END IF '--------------------- END OF CHECK COMM. BUFFER ------------------------ IF TELEMETRY = 1 AND RETURN.FROM.SEND = 1 THEN RETURN.FROM.SEND = 0 BUSY = 0 NUMBER.TO.SEND = 0 COLOR 7, 0 GOSUB CLEAR.W2 GOSUB CLEAR.W3 COLOR 0, 7 START.OF.PACKET = 0 PACKET.PTR = 1 GOTO MINI.WORD ELSE END IF KY$ = INKEY$ IF KY$ = "" THEN GOTO MINI END IF IF KY$ = ESC$ THEN BUSY = 0 NUMBER.TO.SEND = 0 COLOR 7, 0 GOSUB CLEAR.W2 GOSUB CLEAR.W3 COLOR 0, 7 START.OF.PACKET = 0 PACKET.PTR = 1 GOTO MINI.WORD ELSE END IF '---------------------- CHANGE UNIT ADDRESS ---------------------------- IF KY$ = CTRL.N$ THEN GOSUB CLEAR.W3 LOCATE 23, 1, 1, 5, 7 COLOR 0, 7 INPUT ; "ENTER NEW ADDRESS 1 - 15: ", NODE$ COLOR 7, 0 NODE = VAL(NODE$) AND &HF Packet$ = CHR$(0) 'PACKET 0 N.BYTES$ = CHR$(2) '2 BYTE MESSAGE MSG$ = MSG4.TO.VW$ 'SPECIAL MESSAGE FOR VW UNIT - CHANGE NODE ADDR. TAD$ = CHR$(0) MSG.FORMAT$ = TAD$ + Packet$ + N.BYTES$ + MSG$ + CHR$(NODE) PRINT #1, MSG.FORMAT$; DELAY.TIME! = TIMER DO WHILE ABS(TIMER - DELAY.TIME!) < 1! 'DELAY FOR BATTERY TEST LOOP IF LOC(1) > 0 THEN 'LOOK FOR RESPONSE GOSUB READ.BUFFER ELSE END IF DATAB$ = "" KY$ = ALT.A$ 'SET UP NEXT CODE TO READ NEW ADDRESS ELSE END IF '----------------------- GO READ VW ADDRESS ----------------------------- IF KY$ = ALT.A$ THEN GOSUB CLEAR.W1 COLOR 0, 7 GOSUB GET.ADDRESS LOCATE 1, 29 PRINT " "; FROM; " "; KY$ = "" GOSUB CLEAR.W1 GOSUB CLEAR.W2 GOSUB CLEAR.W3 COLOR 0, 7 LOCATE 23, 1, 1, 5, 7 GOTO MAIN: ELSE END IF '----------------------- TOGGLE BROADCAST FLAG -------------------------- 'BROADCAST SENDS MESSAGE TO ALL VW UNITS. IF KY$ = ALT.B$ THEN SAVE.X = POS(0) SAVE.Y = CSRLIN IF BROADCAST = 1 THEN BROADCAST = 0 COLOR 7, 0 LOCATE 3, 30, 0 PRINT " "; COLOR 0, 7 ELSE BROADCAST = 1 LOCATE 3, 30, 0 PRINT " BROADCAST MODE ENABLED "; END IF LOCATE SAVE.Y, SAVE.X, 1, 5, 7 KY$ = "" ELSE END IF '----------------------- TOGGLE TELEMETRY FLAG -------------------------- 'TELEMETRY DOES NOT RECEIVE AN "ACK" IF KY$ = CTRL.T$ THEN SAVE.X = POS(0) SAVE.Y = CSRLIN IF TELEMETRY = 1 THEN TELEMETRY = 0 Packet = 1 COLOR 7, 0 LOCATE 3, 30, 0 PRINT " "; COLOR 0, 7 ELSE TELEMETRY = 1 LOCATE 3, 30, 0 PRINT " TELEMETRY ENABLED "; END IF LOCATE SAVE.Y, SAVE.X, 1, 5, 7 KY$ = "" ELSE END IF '------------------------- VW BATTERY TEST COMMAND ------------------ IF KY$ = ALT.V$ THEN 'BATTERY TEST Packet$ = CHR$(0) 'PACKET 0 N.BYTES$ = CHR$(1) '1 BYTE MESSAGE MSG$ = MSG2.TO.VW$ 'SPECIAL MESSAGE FOR VW UNIT - BATTERY TEST TAD$ = CHR$((FROM * 16 + FROM) AND &HFF) MSG.FORMAT$ = TAD$ + Packet$ + N.BYTES$ + MSG$ PRINT #1, MSG.FORMAT$; DELAY.TIME! = TIMER SAVE.X = POS(0) SAVE.Y = CSRLIN GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30, 0 PRINT " TESTING BATTERY "; COLOR 0, 7 DO WHILE ABS(TIMER - DELAY.TIME!) < 1! 'DELAY FOR BATTERY TEST LOOP IF LOC(1) > 0 THEN 'LOOK FOR RESPONSE GOSUB READ.BUFFER IF LEN(DATAB$) = 5 THEN 'ECHO + RETURNED STRING IF LEFT$(DATAB$, 1) = TAD$ AND MID$(DATAB$, 2, 1) = TAD$ THEN IF RIGHT$(DATAB$, 1) = MSG2.FROM.VW$ THEN 'BATTERY VOLTAGE OK GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30 PRINT " BATTERY OK "; COLOR 0, 7 GOSUB ShowIt 'added 97.05.10 GOSUB CLEAR.W2 'added 97.05.10 ELSEIF RIGHT$(DATAB$, 1) = MSG1.FROM.VW$ THEN GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30 PRINT " LOW BATTERY "; COLOR 0, 7 BEEP GOSUB ShowIt 'added 97.05.10 GOSUB CLEAR.W2 'added 97.05.10 ELSE COLOR 7, 0 'added 97.05.10 LOCATE 17, 30 PRINT " INVALID TEST - RETRY ALT-V " COLOR 0, 7 BEEP GOSUB ShowIt GOSUB CLEAR.W2 END IF ELSE COLOR 7, 0 'added 97.05.10 LOCATE 17, 30 PRINT " INVALID TEST - RETRY ALT-V " COLOR 0, 7 BEEP GOSUB ShowIt GOSUB CLEAR.W2 END IF ELSE COLOR 7, 0 'added 97.05.10 LOCATE 17, 30 PRINT " INVALID TEST - RETRY ALT-V " COLOR 0, 7 BEEP GOSUB ShowIt GOSUB CLEAR.W2 END IF ELSE GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30 PRINT " VW UNIT NOT RESPONDING "; 'tweaked 97.05.10 COLOR 0, 7 BEEP GOSUB ShowIt 'added 97.05.10 GOSUB CLEAR.W2 'added 97.05.10 END IF LOCATE SAVE.Y, SAVE.X, 1, 5, 7 COLOR 0, 7 'added 97.05.10 KY$ = "" DATAB$ = "" ELSE 'not ALT-V END IF '------------------------- VW SELF TEST COMMAND ------------------ IF KY$ = ALT.T$ THEN 'SELF TEST Packet$ = CHR$(0) 'PACKET 0 N.BYTES$ = CHR$(1) '1 BYTE MESSAGE MSG$ = MSG3.TO.VW$ 'SPECIAL MESSAGE FOR VW UNIT - SELF TEST TAD$ = CHR$((FROM * 16 + FROM) AND &HFF) MSG.FORMAT$ = TAD$ + Packet$ + N.BYTES$ + MSG$ PRINT #1, MSG.FORMAT$; DELAY.TIME! = TIMER SAVE.X = POS(0) SAVE.Y = CSRLIN GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30, 0 PRINT " TESTING VW UNIT "; LOCATE 18, 30 PRINT " RESET VW AFTER SELF TEST "; 'tweaked 97.05.10 COLOR 0, 7 DO WHILE ABS(TIMER - DELAY.TIME!) < 2! 'DELAY FOR TEST LOOP IF LOC(1) > 0 THEN 'LOOK FOR RESPONSE GOSUB READ.BUFFER IF LEN(DATAB$) = 5 THEN 'ECHO + RETURNED STRING IF LEFT$(DATAB$, 1) = TAD$ AND MID$(DATAB$, 2, 1) = CHR$(0) THEN IF RIGHT$(DATAB$, 1) = MSG4.FROM.VW$ THEN 'TEST GOOD GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30 PRINT " VW UNIT TEST OK "; 'tweaked 97.05.10 COLOR 0, 7 GOSUB ShowIt 'added 97.05.10 GOSUB CLEAR.W2 'added 97.05.10 ELSEIF RIGHT$(DATAB$, 1) = MSG3.FROM.VW$ THEN GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30 PRINT " VW FAILED SELF TEST "; 'tweaked 97.05.10 COLOR 0, 7 BEEP GOSUB ShowIt 'added 97.05.10 GOSUB CLEAR.W2 'added 97.05.10 ELSE GOSUB CLEAR.W2 'added 97.05.10 COLOR 7, 0 LOCATE 18, 30 PRINT " INVALID TEST - RETRY ALT-T " COLOR 0, 7 BEEP GOSUB ShowIt GOSUB CLEAR.W2 END IF ELSE GOSUB CLEAR.W2 'added 97.05.10 COLOR 7, 0 LOCATE 18, 30 PRINT " INVALID TEST - RETRY ALT-T " COLOR 0, 7 BEEP GOSUB ShowIt GOSUB CLEAR.W2 END IF ELSE GOSUB CLEAR.W2 COLOR 7, 0 'added 97.05.10 LOCATE 18, 30 PRINT " INVALID TEST - RETRY ALT-T " COLOR 0, 7 BEEP GOSUB ShowIt GOSUB CLEAR.W2 END IF ELSE GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30 PRINT " VW UNIT NOT RESPONDING "; 'tweaked 97.05.10 COLOR 0, 7 BEEP GOSUB ShowIt 'added 97.05.10 GOSUB CLEAR.W2 'added 97.05.10 END IF LOCATE SAVE.Y, SAVE.X, 1, 5, 7 COLOR 0, 7 'added 97.05.10 KY$ = "" DATAB$ = "" MSG$ = MSG0.TO.VW$ 'SPECIAL MESSAGE FOR VW UNIT - RESET MSG.FORMAT$ = TAD$ + Packet$ + N.BYTES$ + MSG$ ELSE 'Not self test END IF '-------------------- RESET UNIT --------------------------------- IF KY$ = ALT.R$ THEN 'SELF TEST Packet$ = CHR$(0) 'PACKET 0 N.BYTES$ = CHR$(1) '1 BYTE MESSAGE MSG$ = MSG0.TO.VW$ 'SPECIAL MESSAGE FOR VW UNIT - RESET TAD$ = CHR$((FROM * 16 + FROM) AND &HFF) MSG.FORMAT$ = TAD$ + Packet$ + N.BYTES$ + MSG$ PRINT #1, MSG.FORMAT$; SAVE.X = POS(0) SAVE.Y = CSRLIN GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30, 0 PRINT " VW RESET COMMAND "; GOSUB ShowIt 'added 97.05.10 GOSUB CLEAR.W2 'added 97.05.10 LOCATE SAVE.Y, SAVE.X, 1, 5, 7 COLOR 0, 7 'added 97.05.10 KY$ = "" DATAB$ = "" ELSE END IF IF KY$ = ALT.X$ THEN SAVE.X = POS(0) SAVE.Y = CSRLIN GOSUB CLEAR.W2 COLOR 7, 0 LOCATE 17, 30, 0 BEEP PRINT " EXIT PROGRAM Yes/No "; COLOR 0, 7 KY$ = "" DO WHILE KY$ = "" KY$ = INKEY$ LOOP IF KY$ = "Y" OR KY$ = "y" THEN COLOR 7, 0 CLS END 'end program ELSE GOSUB CLEAR.W2 'added 97.05.10 END IF LOCATE SAVE.Y, SAVE.X, 1, 5, 7 COLOR 0, 7 'added 97.05.10 KY$ = "" ELSE END IF IF KY$ = ALT.C$ THEN START.OF.PACKET = 0 PACKET.PTR = 1 BUSY = 0 COLOR 7, 0 CLS GOTO MAIN ELSE END IF IF KY$ = ALT.H$ THEN COLOR 7, 0 CLS LOCATE 1, 1, 0 PRINT " " PRINT PRINT " Deletes line." PRINT " Deletes character to left." PRINT " At start of line sends last message." PRINT "+ Clears screen." PRINT " Resets "; CHR$(&H22); "SEND PACKET"; CHR$(&H22); " Mode." PRINT PRINT "+ Invokes set up program." PRINT "+ Returns to system." PRINT "+ Increments "; CHR$(&H22); "TO"; CHR$(&H22); " address." PRINT "+ Decrements "; CHR$(&H22); "TO"; CHR$(&H22); " address." PRINT PRINT "+ Broadcast i.e. send message to all VW units." PRINT "+ Test - VW unit to perform selftest - cycle power after test." PRINT "+ Reset - VW unit to start over (warm boot)." PRINT "+ VW unit battery voltage test." PRINT PRINT "+ Read VW address." PRINT " To send a full buffer." PRINT "+ For Telemetry." PRINT "+ To change Node address." LOCATE 23, 30 PRINT " to continue ..." KY$ = "" DO WHILE KY$ = "" KY$ = INKEY$ LOOP CLS GOTO MAIN ELSE 'Not ALT-H END IF IF KY$ = ALT.I$ OR KY$ = ALT.D$ THEN IF KY$ = ALT.I$ THEN TO.ADDR = TO.ADDR + 1 IF TO.ADDR > 15 THEN TO.ADDR = 1 ELSE END IF ELSE TO.ADDR = TO.ADDR - 1 IF TO.ADDR = 0 THEN TO.ADDR = 15 ELSE END IF END IF TO.ADDR$ = CHR$(TO.ADDR + 48) 'tweaked 97.05.10 SAVE.X = POS(0) SAVE.Y = CSRLIN LOCATE 1, 4 COLOR 0, 7 PRINT " "; PRINT TO.ADDR; PRINT " "; LOCATE SAVE.Y, SAVE.X KY$ = "" ELSE END IF IF KY$ = ALT.S$ THEN GOSUB SET.CONFIG GOTO MAIN ELSE END IF IF BUSY > 0 THEN GOTO MINI 'WAIT FOR COMMUNICATIONS TO COMPLETE ELSE END IF IF KY$ = DEL$ THEN KY$ = "" LOCATE 23, 1, 1, 5, 7 PRINT STRING$(80, " ") LOCATE 23, 1, 1, 5, 7 MESSAGE$ = "" ELSE END IF IF KY$ = BACK$ THEN 'DELETE LAST CHARACTER KY$ = "" LT = LEN(MESSAGE$) IF LT > 0 THEN MESSAGE$ = LEFT$(MESSAGE$, LT - 1) PS = POS(0) IF PS > 1 THEN PS = PS - 1 LOCATE CSRLIN, PS: PRINT " "; LOCATE CSRLIN, PS ELSE IF CSRLIN > 20 THEN LN1 = CSRLIN - 1 LOCATE LN1, 80 PRINT " "; LOCATE LN1, 80 ELSE END IF END IF ELSE END IF ELSE END IF IF KY$ = CR$ THEN IF MESSAGE$ = "" THEN MESSAGE$ = LAST.MSG$ ELSE END IF IF TELEMETRY = 1 THEN IF LEN(MESSAGE$) > 30 THEN MESSAGE$ = LEFT$(MESSAGE$, 30) ELSE END IF END IF GOSUB BUILD.MSG PACKET.PTR = 1 'POINTS TO ARRAY TO SEND GOSUB SEND.PACKET KY$ = "" ELSE END IF IF KY$ = F1$ THEN MESSAGE$ = FULL.MSG$ LRDM$ = LEFT$(FULL.MSG$, 1) FULL.MSG$ = RIGHT$(FULL.MSG$, LEN(FULL.MSG$) - 1) + LRDM$ IF TELEMETRY = 1 THEN MESSAGE$ = LEFT$(FULL.MSG$, 30) END IF GOSUB BUILD.MSG PACKET.PTR = 1 'POINTS TO ARRAY TO SEND GOSUB SEND.PACKET KY$ = "" ELSE END IF IF KY$ >= BLANK$ THEN MESSAGE$ = MESSAGE$ + KY$ 'ADD CHARACTER TO MESSAGE PRINT KY$; 'PUT IT ON THE SCREEN IF LEN(MESSAGE$) = 79 OR ((BROADCAST = 1 OR TELEMETRY = 1) AND LEN(MESSAGE$) = 30) THEN BEEP GOSUB BUILD.MSG PACKET.PTR = 1 'POINTS TO ARRAY TO SEND GOSUB SEND.PACKET DO UNTIL KY$ = "" KY$ = INKEY$ 'EMPTY BUFFER LOOP ELSE END IF KY$ = "" ELSE END IF GOTO MINI '************* SET UP DISK DRIVE FOR SAVING DATA FILES ******************* SETUP.DSK: 'READ SETUP FILE FROM DISK (edited 97.05.10) FAULT = 0 'LOOK FOR ERROR CODE OPEN "VWT97.CFG" FOR INPUT AS #2 IF FAULT = 0 THEN 'FILE IS OPEN INPUT #2, COM.PORT$, BAUD.RATE$, TO.ADDR$ 'READ CONFIG. VALUES TO.ADDR = ASC(TO.ADDR$) - 48 CLOSE #2 ELSE CLOSE #2 GOSUB SET.CONFIG END IF RETURN '------------------- SET CONFIGURATION --------------------------------- SET.CONFIG: COLOR 7, 0 CLS LOCATE 10, 1 PRINT "ADDRESS OF VW UNIT YOU WANT TO TALK TO: "; TO.ADDR$; 'tweaked 97.05.10 LOCATE CSRLIN, 50 PRINT "<1> TO CHANGE." PRINT PRINT "YOUR CURRENT COM PORT - "; COM.PORT$; 'tweaked 97.05.10 LOCATE CSRLIN, 50 PRINT "<2> TO CHANGE." PRINT PRINT "YOUR CURRENT BAUD RATE IS (MATCH TO VW): "; BAUD.RATE$; LOCATE CSRLIN, 50 PRINT "<3> TO CHANGE." PRINT PRINT "TO EXIT"; LOCATE CSRLIN, 50 PRINT "" LOCATE 20, 1 SETLP0: KY$ = "" DO WHILE KY$ = "" KY$ = INKEY$ LOOP IF KY$ = "1" THEN INPUT "ENTER ADDRESS YOU WANT TO TALK TO (1 - 15): ", TO.ADDR$ 'tweaked 97.05.10 TO.ADDR = VAL(TO.ADDR$) AND &HF GOTO SET.CONFIG ELSE END IF IF KY$ = "2" THEN IF COM.PORT$ = "COM1:" THEN COM.PORT$ = "COM2:" ELSE COM.PORT$ = "COM1:" END IF GOTO SET.CONFIG ELSE END IF IF KY$ = "3" THEN IF BAUD.RATE$ = "4800" THEN BAUD.RATE$ = "9600" ELSEIF BAUD.RATE$ = "9600" THEN BAUD.RATE$ = "19200" ELSEIF BAUD.RATE$ = "19200" THEN BAUD.RATE$ = "4800" END IF GOTO SET.CONFIG ELSE END IF IF KY$ = ESC$ THEN CLOSE #1 OPEN COM.PORT$ + BAUD.RATE$ + ",N,8,1,RS,CD0,DS0,CS0" FOR RANDOM AS #1 CLS LOCATE 10, 10 PRINT "SAVE CONFIGURATION VALUES TO DISK Y/N "; LP01: KY$ = "" DO WHILE KY$ = "" KY$ = INKEY$ LOOP IF KY$ = "Y" OR KY$ = "y" THEN GOSUB SAVE.CONFIG RETURN ELSE END IF IF KY$ = "N" OR KY$ = "n" THEN RETURN ELSE END IF ELSE END IF GOTO SETLP0 '-------------------SAVE CONFIGURATION FILE -------------------------- SAVE.CONFIG: FAULT = 0 OPEN "VWT97.CFG" FOR OUTPUT AS #2 IF FAULT = 0 THEN 'FILE IS OPEN PRINT #2, CHR$(34); COM.PORT$; CHR$(34); CHR$(34); BAUD.RATE$; CHR$(34); CHR$(34); TO.ADDR$; CHR$(34) ELSE END IF CLOSE #2 RETURN '------------- READ COMMUNICATIONS BUFFER HERE AND BUILD STRING ----------- 'NOTE: A STRING BUILT AS FOLLOWS - IF THE FIRST CHARACTER IS A NULL 'WILL BE DISPLAYED AS ALL NULLS BY THE QB4.5 DEBUGGER. THE LENGTH IS 'CORRECT AND IS THE ONLY CLUE THAT THE DATA IS REALLY IN THE STRING. 'A LESSEN FROM THE SCHOOL OF HARD KNOCKS. READ.BUFFER: '---- CHANGE TO HANDLE NULL CHARACTER DO WHILE LOC(1) > 0 R.DATAB$ = R.DATAB$ + INPUT$(LOC(1), #1) COM.TIME! = TIMER DO LOOP UNTIL ABS(TIMER - COM.TIME!) > .09 'MAKE SURE ALL RECEIVED LOOP IF LEN(R.DATAB$) > 35 THEN DATAB$ = LEFT$(R.DATAB$, 35) R.DATAB$ = RIGHT$(R.DATAB$, LEN(R.DATAB$) - 35) ELSE DATAB$ = R.DATAB$ R.DATAB$ = "" END IF RETURN '---------------------- LINE EDITOR SCREEN ------------------------------ SCREEN1: CLS PRINT "TO: FROM (My address):"; COLOR 0, 7 PRINT " "; PRINT FROM; PRINT " "; LOCATE 1, 4 PRINT " "; PRINT TO.ADDR; PRINT " "; COLOR 7, 0 LOCATE 4, 1 PRINT "MESSAGES RECEIVED"; GOSUB CLEAR.W1 LOCATE 15, 1 PRINT "MESSAGES SENT PACKET# STATUS"; GOSUB CLEAR.W2 LOCATE 21, 1 PRINT "ENTER MESSAGE TO SEND"; GOSUB CLEAR.W3 COLOR 0, 7 LOCATE 25, 1 PRINT " ALT+H FOR HELP "; LOCATE 25, 18 PRINT " ALT+I or +D "; CHR$(&H22); "TO"; CHR$(&H22); " addr. "; LOCATE 25, 44 PRINT " ALT+X EXIT PGM. "; LOCATE 25, 62 PRINT " ALT+B - BROADCAST "; IF BROADCAST = 0 THEN COLOR 7, 0 LOCATE 3, 30 PRINT " "; COLOR 0, 7 ELSE LOCATE 3, 30 PRINT " BROADCAST MODE ENABLED "; END IF IF TELEMETRY = 0 THEN COLOR 7, 0 LOCATE 3, 30, 0 PRINT " "; COLOR 0, 7 ELSE LOCATE 3, 30, 0 PRINT " TELEMETRY ENABLED "; END IF LOCATE 23, 1, 1, 5, 7 RETURN '------------------------ CLEAR RECEIVE WINDOW ------------------------- CLEAR.W1: COLOR 0, 7 LOCATE 5, 1 FOR A = 1 TO 10 PRINT STRING$(80, " ") NEXT A COLOR 7, 0 RETURN '------------------------ CLEAR SEND WINDOW ------------------------- CLEAR.W2: COLOR 0, 7 LOCATE 16, 1 FOR A = 1 TO 4 PRINT STRING$(80, " ") NEXT A COLOR 7, 0 RETURN '------------------------ CLEAR EDIT WINDOW ------------------------- CLEAR.W3: COLOR 0, 7 LOCATE 22, 1 FOR A = 1 TO 2 PRINT STRING$(80, " ") NEXT A COLOR 7, 0 RETURN '------------------ BUILD MESSAGE ARRAY TO SEND TO VW UNIT ---------------- 'EACH ARRAY ELEMENT WILL BE <= TO 32 CHARACTERS. THIS IS THE LENGTH OF 'THE MESSAGE BUFFER IN THE VW UNIT. 'THE TOTAL MESSAGE TO BE SENT IS BUFFERED BY ASCII CONTROL CHARACTERS "STX" 'AND "ETX". 'EXAMPLE: A 64 BYTE MESSAGE IS TO BE FORMATED. IT WILL BE DIVIDED INTO 3 'STRINGS AS FOLLOWS: '1. STX + FIRST 31 CHARACTERS. '2. NEXT 32 CHARACTERS. '3. LAST CHARACTER + ETX. BUILD.MSG: NUMBER.TO.SEND = 1 'NUMBER OF PACKETS IF LEN(MESSAGE$) > 30 THEN 'LONGER THEN 1 PACKET MINI.MSG$(1) = STX$ + LEFT$(MESSAGE$, 31) MESSAGE$ = RIGHT$(MESSAGE$, (LEN(MESSAGE$) - 31)) L = LEN(MESSAGE$) \ 32 B = (LEN(MESSAGE$) MOD 32) IF L = 0 THEN NUMBER.TO.SEND = 2 ELSE NUMBER.TO.SEND = L + 2 END IF IF L > 0 THEN FOR A = 1 TO L MINI.MSG$(A + 1) = LEFT$(MESSAGE$, 32) MESSAGE$ = RIGHT$(MESSAGE$, (LEN(MESSAGE$) - 32)) NEXT A ELSE END IF IF B > 0 THEN MINI.MSG$(L + 2) = RIGHT$(MESSAGE$, B) + ETX$ ELSE MINI.MSG$(L + 2) = ETX$ END IF ELSE MINI.MSG$(1) = STX$ + MESSAGE$ + ETX$ END IF GOSUB CLEAR.W2 LOCATE 16, 1 COLOR 0, 7 FOR A = 1 TO NUMBER.TO.SEND PRINT MINI.MSG$(A); LOCATE CSRLIN, 42 PRT = Packet + A - 1 IF TELEMETRY = 1 THEN PRINT 8 ELSE IF PRT < 8 THEN PRINT PRT ELSE PRINT PRT - 7 END IF END IF NEXT A GOSUB CLEAR.W3 COLOR 0, 7 LOCATE 23, 1, 1, 5, 7 IF TELEMETRY = 0 THEN PRINT "BUSY SENDING DATA"; ELSE END IF LAST.MSG$ = "" FOR A = 1 TO NUMBER.TO.SEND LAST.MSG$ = LAST.MSG$ + MINI.MSG$(A) 'SAVE FOR RETRANSMIT NEXT A IF RIGHT$(LAST.MSG$, 1) = ETX$ THEN LAST.MSG$ = LEFT$(LAST.MSG$, LEN(LAST.MSG$) - 1) 'REMOVE ETX ELSE END IF IF LEFT$(LAST.MSG$, 1) = STX$ THEN LAST.MSG$ = RIGHT$(LAST.MSG$, LEN(LAST.MSG$) - 1) 'REMOVE STX ELSE END IF MESSAGE$ = "" RETURN '----------------------- TRANSMIT PACKET ---------------------------- SEND.PACKET: IF PACKET.PTR <= NUMBER.TO.SEND THEN IF TELEMETRY = 1 THEN RETURN.FROM.SEND = 1 ELSE RETURN.FROM.SEND = 0 END IF TO.FROM$ = CHR$((TO.ADDR * 16 + FROM) AND &HFF) IF BROADCAST = 1 THEN 'SEND TO ALL VW UNITS. TO.NAME$ = CHR$(0) 'T/F = 00 ELSE TO.NAME$ = TO.FROM$ 'SEND TO ADDRESSED UNIT END IF IF TELEMETRY = 1 THEN Packet = 8 ELSE END IF MSG.FORMAT$ = TO.NAME$ + CHR$(Packet AND &HF) 'ADD PACKET# MSG.FORMAT$ = MSG.FORMAT$ + CHR$(LEN(MINI.MSG$(PACKET.PTR)) AND &HFF)'#BYTES MSG.FORMAT$ = MSG.FORMAT$ + MINI.MSG$(PACKET.PTR) 'ADD MESSAGE TRYS = 0 SEND.AGAIN: TRYS = TRYS + 1 PRINT #1, LEFT$(MSG.FORMAT$, 1); 'SEND T/F TO GET ATTENTION OF VW UNIT OK = 2 DELAY.TIME! = TIMER DO WHILE ABS(TIMER - DELAY.TIME!) < .5 'DELAY FOR RESPONSE IF LOC(1) > 0 THEN GOSUB READ.BUFFER '-- A VW UNIT ALWAYS ECHOS FIRST CHARACTER IF NOT BUSY L = LEN(DATAB$) IF LEN(DATAB$) = 1 AND DATAB$ = TO.NAME$ THEN 'GOT VW'S ATTENTION DATAB$ = "" '--- SEND REMAINDER OF PACKET PRINT #1, RIGHT$(MSG.FORMAT$, LEN(MSG.FORMAT$) - 1); 'SEND IT BUSY = 1 OK = 0 EXIT DO ELSE OK = 1 END IF ELSE END IF LOOP IF OK = 1 THEN 'T/F DIDN'T GET THROUGH IF LEN(DATAB$) = 1 THEN 'VW WAS BUSY AT TIME AND PICKED UP DATAB$ = "" DELAY.TIME! = TIMER '--- DELAY WHILE VW UNIT RECOVERS DO WHILE ABS(TIMER - DELAY.TIME!) < .5 'DELAY FOR RESPONSE LOOP GOTO SEND.AGAIN 'PARTIAL DATA. ELSE GOSUB RECEIVE.DATA 'LONGER THEN ONE BYTE IS INCOMING PACKET. END IF ELSE END IF IF OK = 2 THEN 'NO RESPONSE TIME OUT - TRY AGAIN IF TRYS < 10 THEN DELAY.TIME! = TIMER '--- DELAY WHILE VW UNIT RECOVERS DO WHILE ABS(TIMER - DELAY.TIME!) < .5 'DELAY FOR RESPONSE LOOP GOTO SEND.AGAIN ELSE BUSY = 0 NUMBER.TO.SEND = 0 COLOR 7, 1 GOSUB CLEAR.W2 BEEP LOCATE 17, 5 COLOR 0, 7 PRINT "TIME OUT - VW UNIT NOT RESPONDING." GOSUB CLEAR.W3 COLOR 0, 7 LOCATE 23, 1, 1, 5, 7 END IF ELSE END IF ELSE BUSY = 0 END IF RETURN '---------------------- RECEIVE PACKETS AND DISPLAY ---------------------- RECEIVE.DATA: IF LEN(DATAB$) >= 4 THEN 'LENGTH CORRECT FOR RECEIVED PACKET TT = ((ASC(LEFT$(DATAB$, 1)) AND &HF0) / 16) '---THIS GETS AROUND NULL CHAR. PROBLEM WITH DEBUGGER IF TT = FROM OR LEFT$(DATAB$, 1) = CHR$(0) THEN 'MY ADDR. '--- SEE IF MESSAGE LENGTH = NUMBER OF BYTES IF ASC(MID$(DATAB$, 3, 1)) = LEN(RIGHT$(DATAB$, LEN(DATAB$) - 3)) THEN SAVE.Y = CSRLIN SAVE.X = POS(0) '---SCROLL RECEIVE WINDOW IF NEEDED GOSUB SCROLL.WINDOW1 LOCATE RCV.PTRY, RCV.PTRX, 0 ' PRINT DATAB$ IF MID$(DATAB$, 4, 1) = STX$ THEN IF START.OF.PACKET = 1 OR LEN(PRTMSG$) > 0 THEN 'A PACKET WAS LOST COLOR 7, 0 PRINT " PACKET LOST @ 1 " COLOR 0, 7 BEEP START.OF.PACKET = 0 'link overload com reboot 97.05.15 PRTMSG$ = "" GOSUB BootCom GOTO MAIN RCV.PTRY = CSRLIN 'UPDATE RECEIVE WINDOW POINTERS RCV.PTRX = POS(0) GOSUB SCROLL.WINDOW1 ELSE END IF START.OF.PACKET = 1 'USE TO DETECT LOST PACKET PRTMSG$ = RIGHT$(DATAB$, LEN(DATAB$) - 4) 'REMOVE STX IF RCV.PTRX > 1 THEN 'PRTMSG$ = CR$ + PRTMSG$ 'STX IN MIDDLE OF LINE IS A NEW START PRINT CR$; RCV.PTRY = CSRLIN 'UPDATE RECEIVE WINDOW POINTERS RCV.PTRX = POS(0) GOSUB SCROLL.WINDOW1 ELSE END IF ELSEIF START.OF.PACKET = 1 THEN PRTMSG$ = PRTMSG$ + RIGHT$(DATAB$, LEN(DATAB$) - 3) 'USE AS IS ELSE COLOR 7, 0 PRINT " PACKET LOST @ 2 " COLOR 0, 7 BEEP START.OF.PACKET = 0 'link overload com reboot 97.05.15 PRTMSG$ = "" GOSUB BootCom GOTO MAIN RCV.PTRY = CSRLIN 'UPDATE RECEIVE WINDOW POINTERS RCV.PTRX = POS(0) GOSUB SCROLL.WINDOW1 START.OF.PACKET = 0 PRTMSG$ = "" END IF IF RIGHT$(PRTMSG$, 1) = ETX$ THEN 'REMOVE IT AND ADD RETURN. PRTMSG$ = LEFT$(PRTMSG$, LEN(PRTMSG$) - 1) 'REMOVE ETX IF LEN(PRTMSG$) > 79 THEN COLOR 7, 0 PRINT " PACKET LOST @ 3 " COLOR 0, 7 BEEP RCV.PTRY = CSRLIN 'UPDATE RECEIVE WINDOW POINTERS RCV.PTRX = POS(0) GOSUB SCROLL.WINDOW1 START.OF.PACKET = 0 PRINT RIGHT$(PRTMSG$, 79) RCV.PTRY = CSRLIN 'UPDATE RECEIVE WINDOW POINTERS RCV.PTRX = POS(0) PRTMSG$ = "" ELSE PRINT PRTMSG$ 'PUT MESSAGE ON SCREEN RCV.PTRY = CSRLIN 'UPDATE RECEIVE WINDOW POINTERS RCV.PTRX = POS(0) START.OF.PACKET = 0 PRTMSG$ = "" END IF ELSE END IF RCV.PTRY = CSRLIN 'UPDATE RECEIVE WINDOW POINTERS RCV.PTRX = POS(0) LOCATE SAVE.Y, SAVE.X, 1, 5, 7 'RESTORE SCREEN LOCATION ELSE END IF ELSE END IF ELSE END IF DATAB$ = "" RETURN '----------------------- SCROLL RECEIVE WINDOW ---------------------------- SCROLL.WINDOW1: IF RCV.PTRY >= 15 THEN RCV.PTRY = 14 'LIMIT TO LAST LINE RCV.PTRX = 1 FOR A = 5 TO 14 LOCATE A, 1, 0 PRINT STRING$(80, " "); LOCATE A, 1 FOR B = 1 TO 80 PRINT CHR$(SCREEN(A + 1, B)); NEXT B NEXT A LOCATE 14, 1 PRINT STRING$(80, " "); LOCATE RCV.PTRY, RCV.PTRX ELSE END IF RETURN '------------------ GET ADDRESS OF VIRTUAL WIRE UNIT ---------- GET.ADDRESS: Try: TryIt = 0 Retry: TryIt = TryIt + 1 LOCATE 10, 20, 0 PRINT "POLLING FOR VIRTUAL WIRE ADDRESS, TRY #"; TryIt; IF LOC(1) > 0 THEN DATAB$ = INPUT$(LOC(1), #1) 'CLEAR COMM. BUFFER ELSE END IF DATAB$ = "" Packet$ = CHR$(0) 'PACKET 0 N.BYTES$ = CHR$(1) '1 BYTE MESSAGE MSG$ = MSG1.TO.VW$ 'SPECIAL MESSAGE FOR VW UNIT - SEND ADDR. FROM = 0 TO.FROM$ = CHR$(0) 'GET ADDR. USES T/F =0 AND PACKET = 0 MSG.FORMAT$ = TO.FROM$ + Packet$ + N.BYTES$ + MSG$ PRINT #1, MSG.FORMAT$; DELAY.TIME! = TIMER DO WHILE ABS(TIMER - DELAY.TIME!) < .5 'DELAY FOR RESPONSE LOOP IF LOC(1) > 0 THEN GOSUB READ.BUFFER '-- VW UNIT ALWAYS ECHOS FIRST CHARACTER IF NOT BUSY P = INSTR(1, DATAB$, MSG5.FROM.VW$) IF P >= 5 THEN ' VW address message came back FROM$ = MID$(DATAB$, P - 3, 1)'BACK UP TO T/F FROM = ASC(FROM$) AND &HF 'got the FROM address from the VW unit ELSE 'did not get address END IF ELSE 'nothing in input buffer END IF DATAB$ = "" IF FROM = 0 THEN 'did not get FROM address, so IF TryIt < 8 THEN GOTO Retry 'retry several times automatically END IF CLS 'auto retry did not help, let user know LOCATE 10, 5 PRINT " VW unit not responding - check power, cables, com port, heavy RF noise" LOCATE 11, 5 PRINT " for retry, to main program (then for configuration set up)" KY$ = "" DO WHILE KY$ = "" KY$ = INKEY$ LOOP IF KY$ = "r" OR KY$ = "R" THEN CLS 'added 97.05.10 GOTO Try 'manual retry ELSE 'drop out to main program for configuration set up END IF END IF RETURN TOADDR.MSG: 'added 97.05.10 COLOR 15, 1 CLS LOCATE 10, 20, 0 PRINT "Who do you want to talk to today??" LOCATE 12, 20, 0 PRINT " Double check your TO Address!!" BEEP DELAY.TIME! = TIMER DO WHILE ABS(TIMER - DELAY.TIME!) < 2 'DELAY FOR RESPONSE LOOP COLOR 7, 0 CLS RETURN ShowIt: 'added 97.05.10 DELAY.TIME! = TIMER DO WHILE ABS(TIMER - DELAY.TIME!) < 1 'DELAY FOR RESPONSE LOOP RETURN BootCom: OPEN COM.PORT$ + BAUD.RATE$ + ",N,8,1,RS,CD0,DS0,CS0" FOR RANDOM AS #1 LEN = 2048 RETURN '******************** ERROR RECOVERY ************************************* PRTERRO: FAULT = ERR RESUME NEXT END