'         | VLCT BOARD TEST PROGRAM  Auto Scope/Tag reader Version 3 |
'         | John Kennaugh 10.3.97                                    |
'         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Modified from Version 3 to Version 4 by PJF - 21.5.97

'oct 96 this is board test for VLCT
'to work as shell from other prog or stand alone.
'Mar 97 control of HP scope and tag read/write

DECLARE SUB TagReportToScreen (TagParam AS ANY, IDLong&, OKFlag%)
DECLARE SUB ReadTagVerify (TagParam AS ANY)
DECLARE SUB LockPage (TagParam AS ANY)
DECLARE SUB WriteToTagAndVerify (TagParam AS ANY)
DECLARE SUB DELAY (delayTime!)
DECLARE SUB ReadTagPage (TagParam AS ANY)
DECLARE SUB DecodeReadID (TagParam AS ANY)
DECLARE SUB DecodeReadType (TagParam AS ANY)
DECLARE FUNCTION HexStringToDecimal% (HexString$, HexToDecErrorFlag%)
DECLARE SUB Logo ()
DECLARE SUB TagMessage ()


TYPE TagParams
	TimeoutError AS INTEGER             'Timeout Flag (0 = no Timeout Errors)
	ErrorStatus AS INTEGER              'Determine error status (0 = no errors)
	PageNum AS INTEGER                  'Selected Page
	TypeFieldPageNum AS INTEGER         'Page Number as defined in Type Field
	TirisStructure AS STRING * 26       'Received Tiris (Tag) string
	TypeStatus AS STRING * 18           'R/W Status as defined in Type Field
	IDString AS STRING * 12             'Extracted ID String from TirisStructure
	IDDecimalLong AS LONG               'ID String in Long Integer format
	TagError AS INTEGER                 'Read Error Flag - 0 = no errors
	NumberToBeWritten AS LONG           'Number to be written to a page
	LockFlag AS INTEGER                 '0 if Page unlocked, 1 if locked
END TYPE

DIM ta$(5)
DIM HP$(50)
DIM mes#(100)
DIM TagParam AS TagParams

SerialNumPage% = 3
DatePage% = 4
fault$ = ""

CLS
GOSUB HPstrings
CALL Logo
GOSUB GetInitialParams
GOSUB StartANT

'*** Flush the Com Port Buffer
'DO UNTIL LOC(ANTComms%) = 0
'    Dumm$ = INPUT$(1, #ANTComms%)
'LOOP

'---------------------------------------------------------------------
pw$ = "60,09,9A,00,00,"         'TODL=70=01110000 b6=pulse b5=trig out
								'time = 0000099Ah/1229000 = 2ms
DEL! = .3: ATT$ = "12"

'====================- which program -=================================
3230
BoardTst:
StartTest:
   GOSUB MainMenu
	A$ = "1"
options:
	IF CHOICE% = 0 THEN GOTO nextprg
	IF A$ = "C" OR A$ = "c" THEN CHOICE% = 12: GOTO nextprg
	IF A$ = "a" OR A$ = "A" THEN CHOICE% = 10: GOTO nextprg
	IF A$ = "q" OR A$ = "Q" THEN GOTO endseq
	IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt: GOTO nextprg
	IF A$ = CHR$(13) THEN CHOICE% = CHOICE% + 1: GOTO nextprg
	CHOICE% = VAL(A$)
	ON CHOICE% GOTO Filter, f2cw, f2cw, f2PW, f2PW, f2PW, f11, f11, AutoPrg, testTA, test55, RESETC, StartTest
PRINT CHOICE%: INPUT qq$
	
nextprg:   'STEPS THROUGH AT <CR>
	IF CHOICE% > 12 THEN GOTO endseq
	IF CHOICE% = 0 THEN GOTO StartNB
	ON CHOICE% GOTO Filter, f2cw, f1cw, f2PW, F1pw, ATT, f11, f12, AutoPrg, testTA, test55, RESETC, StartTest
PRINT CHOICE%: INPUT qq$

'-------------------------- Start New Board ---------------------------
StartNB:
GOSUB MainMenu
CHOICE% = 1
IF NoLoggingFlag% = 1 THEN GOTO Filter

COLOR 15, 1
LOCATE 11, 11: PRINT "Enter Transponder W/O Number followed by Serial Number"
LOCATE 12, 11: PRINT "8 digits, no gaps (e.g. 38888001, not 38888-001 or 38888-1)"
LOCATE 13, 11: PRINT "  "
LOCATE 14, 11: PRINT "0 to Quit"
LOCATE 16, 11
INPUT "                      > ", SerialNumber&

IF SerialNumber& = 0 THEN GOTO endseq
ddate$ = MID$(DATE$, 4, 2) + "." + LEFT$(DATE$, 2) + "." + RIGHT$(DATE$, 2)

'------------------- TEST 1 Filter ---------------------------
Filter:
 GOSUB MainMenu
COLOR 15, 1
'------------------ TEST 1a  39kHz CW -----------------
cW39:
GOSUB HPinit

k = 16: GOSUB HP0
k = 24: GOSUB HP
k = 13: GOSUB HP
CLOSE #1
	
'atten at -23DA/³Lsb³-³-³-³-³msb³0³0³ x 1.5db 24h= 54db
OUT$ = "2400/2,14,0,B7,2E,00,12,70,FF,FF,FF,FF,2390/F,3C,0,0,23DA/F0,"  '08,"
GOSUB OUTANT        '  FRQ$ = "39000"
GOSUB cleardis
GOSUB one

LOCATE 10, 11: PRINT " FILTER SET UP   39kHz "
LOCATE 11, 11: PRINT " SWITCH to Position 1     Scope CH1 AC 200mV/div 50æs/div"
LOCATE 14, 11: PRINT " 1a          O/P (TP1) Greater than 4cm p-p (0.8Vp-p) "

DO
	A$ = INKEY$
LOOP UNTIL A$ <> ""            'loop til key press

IF A$ = "q" OR A$ = "Q" THEN GOTO endseq
IF LCASE$(A$) = "h" THEN GOSUB help
IF LCASE$(A$) = "a" THEN GOTO options
IF LCASE$(A$) = "c" THEN GOTO options
IF VAL(A$) > 0 THEN GOTO options
IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt1

'---------------------------TEST 1b- 32KHz --------------------------------
CW32:
OUT$ = "2390/C,A8,0,0,"  ' 32400 C,B2,0,0,"
GOSUB OUTANT   'FRQ$ = "32400"
GOSUB cleardis
GOSUB one
LOCATE 10, 11: PRINT "FILTER SET UP   32.4kHz "
LOCATE 11, 11: PRINT "SWITCH to Position 1      Scope CH1 AC 200mV/div 50æs/div "
LOCATE 14, 11: PRINT " 1b          O/P (TP1) more than 2cm p-p (0.4Vp-p)"

DO
	A$ = INKEY$
LOOP UNTIL A$ <> ""            'loop til key press

IF A$ = "q" OR A$ = "Q" THEN GOTO endseq
IF LCASE$(A$) = "h" THEN GOSUB help
IF LCASE$(A$) = "a" THEN GOTO options
IF LCASE$(A$) = "c" THEN GOTO options
IF VAL(A$) > 0 THEN GOTO options
IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt1

'--------------------- TEST 1c - 42.5kHz ------------------------------------
CW42:
	   OUT$ = "2390/10,9A,0,0,"
	   GOSUB OUTANT     'FRQ$ = "42500"
	   GOSUB cleardis: GOSUB one
 LOCATE 10, 11: PRINT " FILTER SET UP   42.5KHz "
 LOCATE 11, 11: PRINT " SWITCH to Position 1     Scope CH1 AC 200mV/div 50æs/div "
 LOCATE 14, 11: PRINT " 1c          O/P (TP1) more than 2cm p-p (0.4Vp-p)"
   DO: A$ = INKEY$
   LOOP UNTIL A$ <> ""            'loop til key press
	IF A$ = "q" OR A$ = "Q" THEN GOTO endseq
	IF LCASE$(A$) = "h" THEN GOSUB help
	IF LCASE$(A$) = "a" THEN GOTO options
	IF LCASE$(A$) = "c" THEN GOTO options
	IF VAL(A$) > 0 THEN GOTO options
	IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt1

'---------------------------TEST 1d 47kHz ----------------------------
CW46:  OUT$ = "2390/12,C0,00,"
	   GOSUB OUTANT     'FRQ$ = "48000"
	   GOSUB cleardis: GOSUB one
 LOCATE 10, 11: PRINT "FILTER SET UP   48kHz   "
 LOCATE 11, 11: PRINT "SWITCH to Position 1      Scope CH1 AC 200mV/div 50æs/div"
 LOCATE 14, 11: PRINT " 1d          O/P (TP1) less than 2cm p-p (0.4Vp-p)"
   DO: A$ = INKEY$
   LOOP UNTIL A$ <> ""            'loop til key press
	IF A$ = "q" OR A$ = "Q" THEN GOTO endseq
	IF LCASE$(A$) = "a" THEN GOTO options
	IF LCASE$(A$) = "c" THEN GOTO options
	IF VAL(A$) > 0 THEN GOTO options
	IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt1

'----------------------------TEST 1e 28kHz ------------------------------
CW30:  OUT$ = "2390/0A,F0,0,0,"
	   GOSUB OUTANT
	   GOSUB cleardis: GOSUB one
 LOCATE 10, 11: PRINT " FILTER SET UP   28kHz   "
 LOCATE 11, 11: PRINT " SWITCH to Position 1     Scope CH1 AC 200mV/div 50æs/div"
 LOCATE 14, 11: PRINT " 1e          O/P (TP1) less than 2cm p-p (0.4Vp-p)"
 GOTO getkey

'-----------------------------TEST 2 COIL L4 SETUP---------------------------------------------
f2cw:
	 CHOICE% = 2
	 k = 17: GOSUB HP0
	 k = 24: GOSUB HP: k = 22: GOSUB HP: CLOSE #1
	 OUT$ = "2400/2,14,0,B7,2E,0,12,70,FF,FF,FF,FF,2390/E,5D,0,0,23DA/48,"
	   GOSUB OUTANT      'FRQ$ = "36760"
	   GOSUB cleardis
	   GOSUB TWO
 LOCATE 10, 11: PRINT "SWITCH to Position 2      Scope CH1 DC 200mV/div 50æs/div"
 LOCATE 12, 11: PRINT "  Adjust L4 for maximum dc level (TP4)"
 LOCATE 13, 11: PRINT "  use meter for fine adjustment       "
   GOTO getkey

'------------------------------TEST 3 COIL L3 SETUP --------------------------------------------
f1cw:  'XTEST$ = " Switch 4  TEST 3  TP3 adj L3 for max  OUTPUT F1 CW "
	   OUT$ = "2400/2,14,0,B7,2E,0,12,70,FF,FF,FF,FF,2390/D,C1,0,0,23DA/48,"
	   GOSUB OUTANT      'FRQ$ = "35210"
	   GOSUB cleardis: GOSUB THREE
 LOCATE 10, 11: PRINT "SWITCH to Position 3      Scope CH1 DC 200mV/div 50æs/div"
 LOCATE 12, 11: PRINT "  Adjust RV2 fully Anti clockwise "
 LOCATE 13, 11: PRINT "  Adjust L3 for maximum dc level (TP3)"
 LOCATE 14, 11: PRINT "  use meter for fine adjustment       "
 GOTO getkey

'--------TEST4----------------F2 VERIFICATION PERIOD ---------------------------------------------
f2PW:
	 CHOICE% = 4
	 k = 26: GOSUB HP0: k = 13: GOSUB HP: k = 32: GOSUB HP
	 k = 17: GOSUB HP: k = 19: GOSUB HP: k = 27: GOSUB HP: k = 31: GOSUB HP: k = 33: GOSUB HP
	 k = 21: GOSUB HP: k = 34: GOSUB HP: CLOSE #1
	 OUT$ = "2400/4,14,0,C0,28,0,03,50,04,CD,0,0,70,01,EC,0,0,50,02,E1,0,0,2390/E,5D,E,5D,E,5D,0,0,23DA/0,0,0,0," 'C8,C8,C8,C8,"
	   GOSUB OUTANT      'FRQ$ = "36770"
	   GOSUB cleardis: GOSUB FOUR
 LOCATE 10, 11: PRINT "SWITCH to Position 4      Scope 2V/div 50æs/div "
 LOCATE 12, 11: PRINT "  Adjust RV4 to align pulse as shown           "
 LOCATE 14, 11: PRINT "                       ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Chan 2"
 LOCATE 15, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ                    ANT TRIG"
 LOCATE 16, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿                     Chan 1"
 LOCATE 17, 11: PRINT "                       ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  TP7"
 LOCATE 18, 11: PRINT "                             "
 LOCATE 19, 11: PRINT "                                                 "
  GOTO getkey

'-----------------------------TEST 5 - F1 VERIFICATION PERIOD---------------------------------------------
F1pw:  'XTEST$ = " Switch 6  TEST 5  TP5 adj RV2 for 1.4ms  OUTPUT F1 PULSE 2ms"
	   'out$ = "2400/4,14,0,C0,28,0,03,70,9,9A,0,0,2390/D,C1,0,0,23DA/C8,"
	   OUT$ = "2400/4,14,0,C0,28,0,03,50,04,CD,0,0,70,01,EC,0,0,50,02,E1,0,0,2390/D,C1,D,C1,D,C1,0,0,23DA/0,0,0,0," 'C8,C8,C8,C8,"
	   GOSUB OUTANT    ' FRQ$ = "35210"
	   GOSUB cleardis: GOSUB FIVE
 LOCATE 10, 11: PRINT "SWITCH to Position 5      Scope 2V/div  50æs/div "
 LOCATE 12, 11: PRINT "  Adjust RV2 to align pulse as shown           "
 LOCATE 14, 11: PRINT "                     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Chan 2"
 LOCATE 15, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ                    ANT TRIG"
 LOCATE 16, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿                     Chan 1"
 LOCATE 17, 11: PRINT "                     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  TP5"
 LOCATE 18, 11: PRINT "                         "
 LOCATE 19, 11: PRINT "                                            "
   GOTO getkey

'-------------------------- TEST 6 - GAIN CHECK ------------------------------------------------
ATT:     'atten at 23da/|lsb|-|-|-|-|msb|0|0| x 1.5db 24h= 54db
	k = 12: GOSUB HP0: CLOSE #1
	   OUT$ = "2400/4,14,0,C0,28,0,03,50,04,CD,0,0,70,01,EC,0,0,50,02,E1,0,0,2390/D,C1,D,C1,D,C1,0,0,23DA/24,24,24,24,"
	   GOSUB OUTANT    ' FRQ$ = "35210"
	   GOSUB cleardis: GOSUB SIX
 LOCATE 10, 11: PRINT "SWITCH to Position 6      Scope 2V/div 500æs/div "
 LOCATE 12, 11: PRINT "  Check that pulse on Chan1 is still present"
 LOCATE 14, 11: PRINT "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Chan 2"
 LOCATE 15, 11: PRINT "               ÀÄÄÄÄÙ                      ANT TRIG"
 LOCATE 16, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿          ÚÄÄÄ Chan 1"
 LOCATE 17, 11: PRINT "                           ÀÄÄÄÄÄÄÄÄÄÄÙ      TP3"
 LOCATE 18, 11: PRINT "              "
   GOTO getkey
'------------------------ TEST 7 - SET UP MONO  --------- -------
f11:
	k = 12: GOSUB HP0: k = 5: GOSUB HP: CLOSE #1 'K = 32: GOSUB HP

loopdelay$ = "00,7F,21,00,11,"    'delay = 00117F21h/1229000 =933ms
Pulse2Pulse$ = "00,2E,73,00,01,"  'delay = 00012E73H/1229000 = 63ms
OUT$ = "2400/04,14," + loopdelay$ + pw$ + Pulse2Pulse$ + pw$
OUT$ = OUT$ + "2390/0D,C1,0D,C1,00,00,23DA/0,0,"  'C8,C8,"
GOSUB OUTANT
 GOSUB cleardis: GOSUB SEVEN
 LOCATE 9, 11: PRINT "SWITCH to Position 7       Scope 2V/div  500æs/div  "
 LOCATE 11, 11: PRINT "  Adjust RV5 until start of Chan 2 pulse"
 LOCATE 12, 11: PRINT "  lines up with end of Chan 1 pulse"
 LOCATE 14, 11: PRINT " ÄÄÄÄÄ¿                              ÚÄÄÄÄÄÄ  Chan 2"
 LOCATE 15, 11: PRINT "      ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ         TP5"
 LOCATE 16, 11: PRINT " ¿    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  Chan 1"
 LOCATE 17, 11: PRINT " ÀÄÄÄÄÙ                                        TP10 "
 LOCATE 19, 11: PRINT "  Press a key to increase sensitivity      "
 LOCATE 20, 11: PRINT "                                   "
DO: A$ = INKEY$
   LOOP UNTIL A$ <> ""            'loop til key press
	k = 13: GOSUB HP0: k = 32: GOSUB HP: CLOSE #1 'K = 32: GOSUB HP
 GOSUB cleardis: GOSUB SEVEN
 LOCATE 9, 11: PRINT "SWITCH to Position 7       Scope 2V/div  50æs/div  "
 LOCATE 11, 11: PRINT "  Adjust RV5 until start of Chan 2 pulse"
 LOCATE 12, 11: PRINT "  lines up with end of Chan 1 pulse"
 LOCATE 14, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿                       Chan 2"
 LOCATE 15, 11: PRINT "                     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ   TP5"
 LOCATE 16, 11: PRINT "                     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  Chan 1"
 LOCATE 17, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ                        TP10 "
 LOCATE 19, 11: PRINT "  Adjust to line up as shown               "
 LOCATE 20, 11: PRINT "                                   "
GOTO getkey
'-----------------------TEST 8 - CHECK F1 F2 MATCHING  -------------
f12:
loopdelay$ = "00,7F,21,00,11,"    'delay = 00117F21h/1229000 =933ms
Pulse2Pulse$ = "00,2E,73,00,01,"  'delay = 00012E73H/1229000 = 63ms
OUT$ = "2400/04,14," + loopdelay$ + pw$ + Pulse2Pulse$ + pw$
OUT$ = OUT$ + "2390/0E,5D,0D,C1,00,00,23DA/0,0,"  'C8,C8,"
GOSUB OUTANT
 GOSUB cleardis: GOSUB EIGHT
 LOCATE 10, 11: PRINT "SWITCH to Position 8  "
 LOCATE 12, 11: PRINT "  Check that a Chan 1 (TP10) and 2 (TP7) still line up"
 LOCATE 13, 11: PRINT "                                    "
 LOCATE 14, 11: PRINT "                          "
GOTO getkey
'--------------------- TEST 9 - PROG EEPROM A5-5 ---------------------------------
AutoPrg:

rxfreq$ = "21,AD,": pwnt$ = "40,9,9A,0,0,"
loopdelay$ = "00,BF,19,00,10,": Pulse2Pulse$ = "00,EE,7B,00,01,"
	turnaround$ = "00,94,F3,00,03,"
RxeveNT$ = "24,02,66,0,0,54,09,9A,0,0,01,15,9A,0,0,00,A8,C7,0,12,"
OET$ = "2400/08,14," + pw$ + Pulse2Pulse$ + pwnt$ + turnaround$ + RxeveNT$
OUT$ = OET$ + "2390/D,C1,0E,5D," + rxfreq$ + "00,00,"   'freq table at 2390
OUT$ = OUT$ + "23DA/C8,C8,80,80," '00,00,80,80,"                       'atten table at 23DA
OUT$ = OUT$ + "2016/80,01,"                             'pulse disc

GOSUB OUTANT
GOSUB cleardis
GOSUB NINE
 LOCATE 10, 11: PRINT "SWITCH to Position 9"
 LOCATE 12, 11: PRINT "PROGRAMMING EEPROM"
 LOCATE 14, 11: PRINT " Check that Blocking Period LED flashes"
 LOCATE 15, 11: PRINT " Let it flash twice then go on to next test"
GOTO getkey

'------------------------ TEST 10 - TURN AROUND SET UP ---------------------
testTA:
 
  k = 25: GOSUB HP0: k = 13: GOSUB HP: k = 30: GOSUB HP: k = 34: GOSUB HP:
  k = 20: GOSUB HP: CLOSE #1 'K = 32: GOSUB HP

 GOSUB StartANT
 GOSUB OUTANT
 GOSUB cleardis: GOSUB TEN
 LOCATE 9, 11: PRINT " SWITCH to Position 10     Scope 1V/div  50æs/div"
 LOCATE 11, 11: PRINT "  Check Level of O/P burst > 5Vp-p     "
 LOCATE 12, 11: PRINT "  Press <X> for analogue set up    "; ""
 LOCATE 21, 11: PRINT "       PRESS <SPACE> To Complete this test"

test55:
'GOSUB StartANT
rxfreq$ = "21,AD,"
pwnt$ = "40,9,9A,0,0,"
loopdelay$ = "00,BF,19,00,10,": Pulse2Pulse$ = "00,EE,7B,00,01,"
turnaround$ = "00,94,F3,00,02,"
RxeveNT$ = "04,06,14,0,0," + "54,60,64,0,01," + "01,15,9A,0,0," + "00,09,9A,00,00,"
OET$ = "2400/08,04," + pw$ + Pulse2Pulse$ + pwnt$ + turnaround$ + RxeveNT$
OUT$ = OET$ + "2390/D,C1,0E,5D," + rxfreq$ + "00,00,"  'freq table at 2390
OUT$ = OUT$ + "23DA/C8,C8,80,80,"                      'atten table at 23DA
OUT$ = OUT$ + "2016/80,02,"                            'pulse disc
GOSUB OUTANT

T54:
ON COM(2) GOSUB 7650: COM(2) ON
CALL DELAY(.3)
mes$ = ""
PRINT #ANTComms%, "00C8/8.";
CALL DELAY(.1):
ta$ = "&H" + MID$(mes$, 5, 2) + MID$(mes$, 8, 2) + MID$(mes$, 11, 2)
mes$ = ""
PRINT #ANTComms%, "00A7/1.";
CALL DELAY(.1)
valid$ = "&H" + MID$(mes$, 2, 2)
valid = VAL(valid$) AND &H4
TAT = VAL(ta$) / 1229

COLOR 0, 2

LOCATE 13, 11
IF valid <> 0 THEN
		PRINT " Adj RV5 to 300.60ms >  Turn Around = ";
		PRINT USING "###.##"; TAT; : PRINT " ms  "
END IF

LOCATE 13, 11
IF valid = 0 OR TAT < 295 THEN
		COLOR 15, 4
		PRINT " No Valid Reply  ";
		COLOR 15, 1:
		PRINT "                        "
	ELSE
		GOTO t55
END IF

A$ = INKEY$
IF A$ = "" THEN GOTO testTA ELSE GOTO t56

'------------------ Acceptance test sequence -------------------
t55:
ok% = 0
A$ = INKEY$
IF A$ = "" THEN
		CALL DELAY(.4)
		PRINT #ANTComms%, "G";
		GOTO T54
END IF

t56:
 IF LCASE$(A$) = "x" THEN GOSUB testx ELSE GOTO t57

t56a:
A$ = INKEY$
IF A$ = "" THEN GOTO t56a ELSE GOTO testTA

t57:
ok% = 0
IF LCASE$(A$) = "h" THEN GOSUB help
IF LCASE$(A$) = "q" THEN GOTO endseq
IF LCASE$(A$) = "f" THEN GOSUB faultrpt
GOSUB cleardis: GOSUB TEN
LOCATE 9, 11: PRINT " SWITCH to Position 10  "
 LOCATE 11, 11: PRINT "  Acceptance Test Seq      "
IF TAT > 301 OR TAT < 299 THEN valid = 0
cn = 1: cn$ = " a.    Normal "
LOCATE 13
GOSUB RESULT

'----------------------------------- -0.95ms ---------------------------
Test55A:
Pulse2Pulse$ = "00,E9,EB,00,01,"    '-.95MS
OUT$ = "2407/" + Pulse2Pulse$
cn = 2: cn$ = " b. -0.95 ms  "
GOSUB RESULT

'----------------------------- +0.95ms ------------------------------
Test55B:
Pulse2Pulse$ = "00,F3,0A,00,01," '+.95ms
OUT$ = "2407/" + Pulse2Pulse$
cn = 3: cn$ = " c. +0.95 ms  ": GOSUB RESULT

'---------------------------- +250Hz --------------------------------------
Test55c:     '+250Hz f1 and f2
Pulse2Pulse$ = "00,EE,7B,00,01,"
OET$ = "2407/" + Pulse2Pulse$
OUT$ = OET$ + "2390/D,DA,0E,76," + rxfreq$ + rxfreq$ + "00,00,"  'freq table at 2390
cn = 4: cn$ = " d.   +250Hz  ": GOSUB RESULT
'----------------------------------- -250Hz ---------------------------
Test55d:      '-250HZ F1 F2
OUT$ = "2390/D,A8,0E,44," + rxfreq$ + rxfreq$ + "00,00,"  'freq table at 2390
cn = 5: cn$ = " e.   -250Hz  "
GOSUB RESULT

IF ok% <> 5 AND NoLoggingFlag% <> 1 THEN
		COLOR 15, 4
		LOCATE 18, 11
		PRINT " FAILED! Press <F> to log fault report...    "
		FaultFlag% = 1
END IF
CHOICE% = CHOICE% + 1           'CHOICE% = 11

LOCATE 20, 11
COLOR 15, 1
PRINT "<SPACE> to continue or select number to redo"; ""

T55X:
 A$ = INKEY$
 IF A$ = "" THEN GOTO T55X
 GOTO getkeyx
'------------------------ MEASURE CURRENT ------------------------
RESETC:
GOSUB StartANT
	
GOSUB cleardis: GOSUB Cee
LOCATE 9, 11: PRINT "SWITCH Position not important  "
LOCATE 11, 11: PRINT "  Current switch to MEASURE             "
LOCATE 13, 11: PRINT "  Wait for current to settle it should be less than 200æA"
COLOR 15, 4

IF NoLoggingFlag% <> 1 THEN
	LOCATE 15, 11
	INPUT " Enter Current in æA  ", CurrentDrawn!
END IF

curr$ = STR$(CurrentDrawn!)
IF CurrentDrawn! > 160 THEN
		FaultFlag% = 1
		LOCATE 17, 24: PRINT " FAILED! Current too high "
END IF

'*** Flush keyboard buffer
DO: LOOP UNTIL INKEY$ = ""

'**** Wait for any key press
COLOR 15, 1
LOCATE 19, 11: PRINT " Press any key for overall board status..."
DO: LOOP UNTIL INKEY$ <> ""

'*** Flush keyboard buffer
DO: LOOP UNTIL INKEY$ = ""


'------------------------ BOARD STATUS ------------------------
GOSUB cleardis
LOCATE 10, 25

'*** Check overall Board status
IF ok% = 5 AND FaultFlag% = 0 THEN
		PRINT "Status of Board S/N"; RTRIM$(STR$(SerialNumber&)); ":"
		COLOR 14, 1
		LOCATE (CSRLIN + 1), 37: PRINT " PASS"
	ELSE
		PRINT "Status of Board S/N"; RTRIM$(STR$(SerialNumber&)); ":"
		COLOR 30, 1
		LOCATE (CSRLIN + 1), 37: PRINT " FAIL"      'Flashing
END IF

COLOR 15, 1
LOCATE 15, 11
PRINT " Press R if you want to redo without logging results..."
LOCATE CSRLIN + 1, 11
PRINT " Any other key to log results..."
LOCATE CSRLIN + 1, 11
PRINT SPACE$(60)

DO
	A$ = INKEY$
LOOP UNTIL A$ <> ""            'loop til key press
IF UCASE$(A$) = "R" THEN GOTO redo

'------------------- log results ----------------------------------
IF ok% = 5 AND FaultFlag% = 0 THEN
		PorF$ = "PASS"
	ELSE
		PorF$ = "FAIL"
END IF

'*** Write results to file
LogFil$ = "C:\TESTS\VLCT\DATA\VL" + LTRIM$(RTRIM$(STR$(won))) + ".log"
DataFile% = FREEFILE
OPEN LogFil$ FOR APPEND AS #DataFile%
WRITE #DataFile%, SerialNumber&, NoPage1#, " ", " ", BoardTester$, ddate$, LEFT$(TIME$, 5), ta$(1), ta$(2), ta$(3), ta$(4), ta$(5), curr$, PorF$, fault$, "", "", 0, 0, 0, ""
CLOSE #DataFile%

FaultFlag% = 0
fault$ = ""


'*** PUT TAG PROCEDURE HERE - NOTE: THIS SHOULD HAVE ITS OWN PROCEDURE  - PJF


'*** For the time-being, crudely bypass the Tag procedure
GOTO SkipTagging


'*** Close all currently opened files and disable Com Port 2 Interrupt
CLOSE
COM(2) OFF

'*** Tell operator to prepare for Tagging
CALL TagMessage

'*** Format the date as a long integer number in the following format:
'*** Day (2 digits); Month (2 digits); Year (2 digits)
PCDate$ = DATE$
TagDateFormat$ = MID$(PCDate$, 4, 2) + LEFT$(PCDate$, 2) + RIGHT$(PCDate$, 2)
DateLong& = CLNG(VAL(TagDateFormat$))

'*** Loop round until Tag correctly programmed or operator requests an abort
DO

	'*** Write the Serial Number to "SerialNumPage%" and verify
	TagParam.NumberToBeWritten = SerialNumber&
	TagParam.PageNum = SerialNumPage%
	DO
		CALL WriteToTagAndVerify(TagParam)
		IF TagParam.TagError = 1 THEN
				PRINT
				PRINT "Press Q to quit tagging.";
				PRINT " Any other to continue..."

				'*** Flush keyboard buffer
				DO: LOOP UNTIL INKEY$ = ""
		   
				'*** Wait for keypress
				DO
					KeyPress$ = INKEY$
				LOOP UNTIL KeyPress$ <> ""
		END IF

	LOOP UNTIL (TagParam.TagError = 0) OR (UCASE$(KeyPress$) = "Q")


	'*** Lock the Serial Number Page, if previous Write was successful
	IF UCASE$(KeyPress$) <> "Q" THEN
			DO
				CALL LockPage(TagParam)

				IF TagParam.TagError = 1 THEN
						PRINT
						PRINT "Press Q to quit trying to LOCK.";
						PRINT " Any other to continue..."

						'*** Flush keyboard buffer
						DO: LOOP UNTIL INKEY$ = ""
		  
						'*** Wait for keypress
						DO
							KeyPress$ = INKEY$
						LOOP UNTIL KeyPress$ <> ""
				END IF

			LOOP UNTIL (TagParam.TagError = 0) OR (UCASE$(KeyPress$) = "Q")
	
	END IF


	'*** Write the Date to "DatePage%" and verify
	'*** if previous Write/Lock was successful
	IF UCASE$(KeyPress$) <> "Q" THEN

			'*** Write the Date to "DatePage%" and verify
			TagParam.NumberToBeWritten = DateLong&
			TagParam.PageNum = DatePage%
			DO
				CALL WriteToTagAndVerify(TagParam)
				IF TagParam.TagError = 1 THEN
						PRINT
						PRINT "Press Q to quit tagging.";
						PRINT " Any other to continue..."

						'*** Flush keyboard buffer
						DO: LOOP UNTIL INKEY$ = ""
		  
						'*** Wait for keypress
						DO
							KeyPress$ = INKEY$
						LOOP UNTIL KeyPress$ <> ""
				END IF

			LOOP UNTIL (TagParam.TagError = 0) OR (UCASE$(KeyPress$) = "Q")
	END IF

	'*** Lock the Date Page, if previous Writes/Lock were successful
	IF UCASE$(KeyPress$) <> "Q" THEN
			DO
				CALL LockPage(TagParam)

				IF TagParam.TagError = 1 THEN
						PRINT
						PRINT "Press Q to quit trying to LOCK.";
						PRINT " Any other to continue..."

						'*** Flush keyboard buffer
						DO: LOOP UNTIL INKEY$ = ""
		 
						'*** Wait for keypress
						DO
							KeyPress$ = INKEY$
						LOOP UNTIL KeyPress$ <> ""
				END IF

			LOOP UNTIL (TagParam.TagError = 0) OR (UCASE$(KeyPress$) = "Q")
	END IF


	DO
		'*** Check that both Pages contain correct data and are locked

		'*** Prepare for Tag Status Reports on screen
		CLS
		LOCATE 2, 28
		PRINT "TAG STATUS REPORT"
		LOCATE CSRLIN + 1

		'*** Checking Serial Number Page
		TagParam.PageNum = SerialNumPage%
		CALL ReadTagVerify(TagParam)
		IF (TagParam.IDDecimalLong = SerialNumber&) AND (TagParam.LockFlag = 1) THEN
				TagSerNumOkFlag% = 1
			ELSE
				TagSerNumOkFlag% = 0
		END IF

		'*** Status Report of Serial Number Page
		CALL TagReportToScreen(TagParam, SerialNumber&, TagSerNumOkFlag%)

		'*** Make sure that no Comms errors have occured before proceeding
		IF TagParam.TagError = 0 THEN

				'*** Checking Date Page
				TagParam.PageNum = DatePage%
				CALL ReadTagVerify(TagParam)
				IF (TagParam.IDDecimalLong = DateLong&) AND (TagParam.LockFlag = 1) THEN
						TagDateOkFlag% = 1
					ELSE
						TagDateOkFlag% = 0
				END IF

				'*** Status Report of Date Page
				LOCATE CSRLIN + 1
				CALL TagReportToScreen(TagParam, DateLong&, TagDateOkFlag%)

				'*** Flush the keyboard buffer
				DO: LOOP UNTIL INKEY$ = ""

				'*** Inform operator of good or bad Tag
				IF (TagSerNumOkFlag% = 1) AND (TagDateOkFlag% = 1) THEN
						LOCATE (CSRLIN + 2), 23
						PRINT "TAG PROGRAMMED SUCCESSFULLY"
						LOCATE CSRLIN + 4
						PRINT "Press any key to continue..."
						DO: LOOP UNTIL INKEY$ <> ""
					ELSE
						LOCATE (CSRLIN + 2), 22
						PRINT "TAG NOT PROGRAMMED PROPERLY!!!"
						LOCATE CSRLIN + 4
						PRINT "Press Q to abort Tag Programming"
						LOCATE CSRLIN + 1
						PRINT "Any other to retry..."
						DO
							QuitKeyPress$ = INKEY$
						LOOP UNTIL QuitKeyPress$ <> ""
				END IF
			ELSE
				PRINT "Press any key to continue..."
				PRINT "TagParam.TagError ="; TagParam.TagError
				DO: LOOP UNTIL INKEY$ <> ""
		END IF

	LOOP UNTIL TagParam.TagError = 0

LOOP UNTIL ((TagSerNumOkFlag% = 1) AND (TagDateOkFlag% = 1)) OR (UCASE$(QuitKeyPress$) = "Q")



SkipTagging:



LOCATE 15, 11
PRINT "  Return switch to Run, Switch OFF before removing board "
CHOICE% = 0
GOTO nextprg

redo:
LOCATE 17, 11: PRINT " Select test No or <SPACE> to start new board"

'------------------------KEY PRESS GET AND ANALYSE --------------------------------------------
getkey:
DO: A$ = INKEY$
   LOOP UNTIL A$ <> ""            'loop til key press
getkeyx:
	IF A$ = "c" OR A$ = "C" THEN GOTO options
	IF A$ = "a" OR A$ = "A" THEN GOTO options
	IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt: GOTO getkey
	IF A$ = "q" OR A$ = "Q" THEN GOTO endseq
	IF LCASE$(A$) = "h" THEN GOSUB help
	IF VAL(A$) > 0 THEN GOTO options
	CHOICE% = CHOICE% + 1
	IF CHOICE% > 12 THEN CHOICE% = 1
	GOTO nextprg

'------------------------ FAULT REPORT SUB --------------
faultrpt:
IF NoLoggingFlag% = 1 THEN
		PRINT "LOGGING FUNCTION NOT ENABLED"
		RETURN
END IF

LOCATE 21, 11: PRINT "                                                     "
LOCATE 21, 11: INPUT "Type Fault report - ", FaultNote$
CHOICE$ = STR$(CHOICE%)
fault$ = fault$ + CHOICE$ + "/" + FaultNote$ + "  "
LOCATE 21, 6
PRINT " º  Select test No or <SPACE> for next Test                   "
FaultFlag% = 1
RETURN
'-------------------------------------------------------
faultrpt1:
IF NoLoggingFlag% = 1 THEN
		PRINT "LOGGING FUNCTION NOT ENABLED"
		RETURN
END IF

LOCATE 20, 11: INPUT "Type Fault report - ", FaultNote$
CHOICE$ = STR$(CHOICE%)
fault$ = fault$ + CHOICE$ + "/" + FaultNote$ + "  "
FaultFlag% = 1
RETURN

'------------------------ WRITE OUT$ TO ANT SUB ------------------
OUTANT:
OutAnt1:

PRINT #ANTComms%, "5"; : CALL DELAY(DEL!)  'select COMP
PRINT #ANTComms%, "D"; : CALL DELAY(DEL!) 'direct entry mode
PRINT #ANTComms%, OUT$; : CALL DELAY(DEL!)
PRINT #ANTComms%, "G";                 'GO
RETURN
'-------------------------- RESET ANT/OPEN COMMS --------
StartANT:
CLOSE #ANTComms%
ANTComms% = 2
OPEN "com2:9600,s,7,2,cs,ds,cd" FOR RANDOM AS #ANTComms%
PRINT #ANTComms%, CHR$(27);                 'reset ANT
CALL DELAY(1.5)
RETURN

'---------------- LOG ON SEQUENCE SUB ---------------------------------
GetInitialParams:
COLOR 15, 1
LOCATE , 6: PRINT " ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» "
GOSUB mm1
LOCATE 11, 9
COLOR 15, 1

Row% = 12: Col% = 9
LOCATE Row%, Col%: PRINT "  Put a floppy disk in A:\ to log results     "
PRINT
LOCATE CSRLIN, Col%: PRINT "  Connections:"
LOCATE CSRLIN, Col%: PRINT "  RS-232 SWITCH BOX - PC COM 2          to   PC Com Port 2"
LOCATE CSRLIN, Col%: PRINT "  RS-232 SWITCH BOX - RFID TAG READER   to   Tag Reader"
LOCATE CSRLIN, Col%: PRINT "  RS-232 SWITCH BOX - ANT               to   ANT"
LOCATE CSRLIN, Col%: PRINT "  HP Scope                              to   PC Com Port 1"
PRINT
LOCATE CSRLIN, Col%: PRINT "  ENTER TESTER'S INITIALS....   ";
BoardTester$ = ""

lll:
DO
	A$ = INKEY$
LOOP UNTIL A$ <> ""            'loop til key press

IF A$ <> CHR$(13) THEN
		A$ = UCASE$(A$)
		PRINT A$;
		BoardTester$ = BoardTester$ + A$
		GOTO lll
END IF

IF BoardTester$ = "" THEN
		NoLoggingFlag% = 1
		PRINT " WARNING!! logging function disabled  "
		RETURN
	ELSE
		NoLoggingFlag% = 0
END IF

LOCATE , 9
INPUT "  ENTER 1st 5 digits of serial No / W.O.N.... ", won
IF LEN(STR$(won)) <> 5 THEN CALL Logo

fault$ = ""
CHOICE% = 0
RETURN

7650 '------------------ print i/p from com ---------------
all = LOC(ANTComms%)
IF all < 1 THEN RETURN
IF all > 31 THEN b$ = INPUT$(30, #ANTComms%): GOTO 7650
b$ = INPUT$(all, #ANTComms%)
mes$ = mes$ + b$
FLAGCOM = FLAGCOM - 1
RETURN
'-----------------------------------------------------------
endseq:
 IF NoLoggingFlag% <> 1 THEN CLOSE #5
COLOR 7, 0: CLS : END
'---------------------------------------------------------------
ReadANT:
ON COM(2) GOSUB 7650: COM(2) ON
CALL DELAY(.3)
mes$ = "": PRINT #ANTComms%, "00C8/8.";          'GO
CALL DELAY(.1):
ta$ = "&H" + MID$(mes$, 5, 2) + MID$(mes$, 8, 2) + MID$(mes$, 11, 2)
mes$ = "": PRINT #ANTComms%, "00A7/1.";         'GO
CALL DELAY(.1)
valid$ = "&H" + MID$(mes$, 2, 2)
valid = VAL(valid$) AND &H4
TAT = VAL(ta$) / 1229
IF TAT > 301 OR TAT < 299 THEN valid = 0
RETURN
'------------------------------------------------------------------
RESULT:
GOSUB OUTANT
GOSUB ReadANT
IF valid <> 0 THEN GOTO ResultValid

IF ta$ = "&HLET NL" THEN
	COLOR 15, 4
	LOCATE , 11
	PRINT " ANT ERROR  REDO "
	RETURN
END IF

COLOR 15, 4
LOCATE , 11
PRINT cn$; " /  FAIL               "; ta$
IF NoLoggingFlag% <> 1 THEN
	ta$(cn) = " Fail "
	FaultFlag% = 1
END IF

COLOR 15, 1
RETURN

ResultValid:
ok% = ok% + 1
COLOR 0, 2
LOCATE , 11
PRINT cn$; "/ PASS   Turn Around = ";
PRINT USING "###.##"; TAT; : PRINT " ms   "

IF NoLoggingFlag% <> 1 THEN
	ta$(cn) = STR$(INT(VAL(ta$) / 1229 * 100) / 100)
END IF

RETURN

'------------------------ TURN AROUND SET UP ---------------------
testx:
	 k = 26: GOSUB HP0: k = 13: GOSUB HP: k = 32: GOSUB HP
	 k = 17: GOSUB HP: k = 19: GOSUB HP: k = 27: GOSUB HP: k = 31: GOSUB HP: k = 33: GOSUB HP
	 k = 21: GOSUB HP: k = 11: GOSUB HP: k = 34: GOSUB HP: CLOSE #1
'GOSUB StartANT
rxfreq$ = "21,AD,": pwnt$ = "40,9,9A,0,0,": DEL1$ = "00,9,9A,0,0,"
loopdelay$ = "00,BF,19,00,10,": Pulse2Pulse$ = "00,EE,7B,00,01,"
	turnaround$ = "00,9D,8D,00,03,": MARKER$ = "20,1,00,0,0,": LOOPTIME$ = "00,20,8C,00,0D,"
OET$ = "2400/06,14," + pwnt$ + Pulse2Pulse$ + pwnt$ + turnaround$ + MARKER$ + LOOPTIME$
OUT$ = OET$ + "2390/D,C1,0E,5D,00,00,"   'freq table at 2390
OUT$ = OUT$ + "23DA/0,0,80,80,"  'C8,C8,80,80,"   'atten table at 23DA
OUT$ = OUT$ + "2016/80,02,"                             'pulse disc

GOSUB OUTANT
 GOSUB cleardis: GOSUB bee
 LOCATE 9, 11: PRINT " SWITCH to Position 11  "
 LOCATE 12, 11: PRINT "  Expand timebase to 50æs/cm and ALIGN using RV5    "

 LOCATE 14, 11: PRINT "Ä¿                   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Chan 2"
 LOCATE 15, 11: PRINT " ³                   ³                    ANT TRIG"
 LOCATE 16, 11: PRINT " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ           "
 LOCATE 17, 11: PRINT "                                           Chan 1"
 LOCATE 18, 11: PRINT " ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿                     TP10 "
 LOCATE 19, 11: PRINT "                     ³    "
 LOCATE 20, 11: PRINT "                     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  "
 LOCATE 21, 11: PRINT "                                                     "
 RETURN

'------------------------- HP Scope initialise ----------------------
HPinit:
HPD = .3
CLOSE #1
'OPEN "com1:9600,N,8,1" FOR RANDOM AS #1
OPEN "com1:9600,N,8,1,cs,ds" FOR RANDOM AS #1
CALL DELAY(.5)
A$ = "*RST" + CHR$(10) + CHR$(13)
PRINT #1, A$
CALL DELAY(.3)
FOR k = 1 TO 11
A$ = HP$(k) + CHR$(10) + CHR$(13): PRINT #1, A$
'PRINT K; : INPUT qq$
CALL DELAY(HPD)
NEXT k
CLOSE #1
RETURN
'----------------- HPSCOPE data transfer --------------------
HP0:
OPEN "com1:9600,N,8,1,cs,ds" FOR RANDOM AS #1
CALL DELAY(.3)
HP:
A$ = HP$(k) + CHR$(10) + CHR$(13): PRINT #1, A$
DELAY (HPD)
RETURN


clearbuf: 'not used
all = LOC(4): IF all < 1 THEN RETURN
IF all > 31 THEN b$ = INPUT$(30, #4): PRINT b$: GOTO clearbuf
x$ = INPUT$(all, #4): PRINT x$: GOTO clearbuf

HPstrings:
										   ' 1 2 4 6 7 7 10
HP$(1) = "CHAN1:probe x10"                 '³x³ ³ ³ ³   ³ ³
HP$(2) = "CHAN2:probe x10"                 '³x³ ³ ³ ³   ³ ³"
HP$(3) = "CHAN3:rang low"                  '³x³ ³ ³ ³   ³ ³
HP$(4) = "CHAN3:OFFS .4"                   '³x³ ³ ³ ³   ³ ³
HP$(5) = "TIM:REF left"'                   '³x³ ³ ³ ³x  ³ ³
HP$(6) = "VIEW CHAN1"                      '³x³ ³ ³ ³   ³ ³
HP$(7) = "VIEW CHAN2"                      '³x³ ³ ³ ³   ³ ³
HP$(8) = "VIEW CHAN3"                      '³x³ ³ ³ ³   ³ ³
HP$(9) = "CHAN3:COUP GND"                  '³x³ ³ ³ ³   ³ ³
HP$(10) = "TRIG:MODE NORM"' normal mode    '³x³ ³ ³ ³   ³ ³
HP$(11) = "TRIG:SOUR CHAN3"                '³x³ ³ ³ ³   ³ ³x
HP$(12) = "TIM:RANG 5e-3" '500us/DIV       '³x³ ³x³ ³  x³x³
HP$(13) = "TIM:RANG .5e-3" '50us/DIV       '³x³ ³x³ ³  x³x³x
HP$(14) = "TIM:RANG 1e-3" '100us/DIV       '³ ³ ³ ³ ³   ³ ³
HP$(15) = "TIM:RANG 2e-3" '200us/DIV       '³ ³ ³ ³ ³   ³ ³
HP$(16) = "CHAN1:COUP AC"                  '³x³ ³ ³ ³   ³ ³
HP$(17) = "CHAN1:COUP DC"                  '³ ³x³x³ ³   ³ ³x
HP$(18) = "CHAN2:COUP AC"                  '³ ³ ³ ³ ³   ³ ³
HP$(19) = "CHAN2:COUP DC"                  '³ ³ ³x³ ³   ³ ³x
										   '³ ³ ³ ³ ³   ³ ³
HP$(20) = "CHAN1:OFFS .5"                  '³ ³ ³ ³ ³   ³x³
HP$(21) = "CHAN1:OFFS 5.5"                 '³ ³ ³x³ ³   ³ ³x
HP$(22) = "CHAN1:OFFS 1"                   '³ ³x³ ³ ³   ³ ³
HP$(23) = "CHAN1:RANG 0.8"  '100mV/div     '³ ³ ³ ³ ³   ³ ³
HP$(24) = "CHAN1:RANG 1.6"  '200mV/div     '³x³x³ ³ ³   ³ ³
HP$(25) = "CHAN1:RANG 8"    '1V/div        '³ ³ ³ ³ ³   ³x³
HP$(26) = "CHAN1:RANG 16"   '2V/div        '³ ³ ³x³ ³   ³ ³x
HP$(27) = "CHAN2:RANG 16"   '2V/div        '³ ³ ³x³ ³   ³ ³x
										   '³ ³ ³ ³ ³   ³ ³
HP$(30) = "TRIG:SOUR CHAN1"                '³ ³ ³ ³ ³   ³x³
HP$(31) = "CHAN3:RANG HIGH"                '³ ³ ³x³ ³   ³ ³x
HP$(32) = "TIM:REF CENT"                   '³ ³ ³x³ ³  x³ ³x
HP$(33) = "TRIG:pol POS"                   '³ ³ ³x³ ³   ³ ³x
HP$(34) = "TRIG:LEV 2"                     '³ ³ ³x³ ³   ³x³x
RETURN
'---------------------------- Main Menu Sub ---------------------------------
MainMenu:
COLOR 1, 0: CLS : COLOR 15, 1
	LOCATE , 6: PRINT " ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» "
	LOCATE , 6: PRINT " º   1. Filter            2. L4 adjust          3. L3 adjust       º "
	LOCATE , 6: PRINT " º   4. RV4 (f2 verify)   5. RV2 (f1 verify)    6. Sensitivity     º "
	LOCATE , 6: PRINT " º   7. RV5 (timing)      8. F1/f2 match        9. Block Period    º "
	LOCATE , 6: PRINT " º   A. TurnAround        C. Current            H. Help            º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º  Select or <Space> to step   F = log fault report  Q = Quit     º "
	LOCATE , 6: PRINT " ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¶ "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
mm1:
	LOCATE , 6: PRINT " º                     WAIT - SETTING UP SCOPE                     º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º                                                                 º "
	LOCATE , 6: PRINT " º    ³                        +                        ³          º "
	LOCATE , 6: PRINT " ÈÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍ¼ "
	COLOR 7, 0
	RETURN
'---------------------- CLEAR WORKING PART OF DISPLAY SUB ---------------
cleardis:
	COLOR 15, 1
	FOR n = 9 TO 21
	LOCATE n, 6: PRINT " º                                                                 º "
	NEXT n
	LOCATE 19, 6: PRINT " º                                                         SWITCH  º "
	RETURN
'------------------------ LARGE TEST NUMBERS
one:
LOCATE 20, 66: PRINT "   » " '¹ ºÉ  ¼ È É Ê Ë Ì Í Î
LOCATE 21, 66: PRINT "   º "
LOCATE 22, 66: PRINT "   Ê "
RETURN
						   
TWO:
LOCATE 20, 66: PRINT "  ÍÍ»"
LOCATE 21, 66: PRINT "  ÉÍ¼"
LOCATE 22, 66: PRINT "  ÈÍÍ"
RETURN

THREE:
LOCATE 20, 66: PRINT "  ÍÍ»"
LOCATE 21, 66: PRINT "   Í¹"
LOCATE 22, 66: PRINT "  ÍÍ¼"
RETURN

FOUR:
LOCATE 20, 66: PRINT "  º ·"
LOCATE 21, 66: PRINT "  ÈÍÎ"
LOCATE 22, 66: PRINT "    ½"
RETURN

FIVE:
LOCATE 20, 66: PRINT "  ÉÍÍ"
LOCATE 21, 66: PRINT "  ÈÍ»"
LOCATE 22, 66: PRINT "  ÍÍ¼"
RETURN

SIX:
LOCATE 20, 66: PRINT "  ÉÍ "
LOCATE 21, 66: PRINT "  ÌÍ»"
LOCATE 22, 66: PRINT "  ÈÍ¼"
RETURN

SEVEN:
LOCATE 20, 66: PRINT "  ÍÍ»"
LOCATE 21, 66: PRINT "    º"
LOCATE 22, 66: PRINT "    ½"
RETURN

EIGHT:
LOCATE 20, 66: PRINT "  ÉÍ»"
LOCATE 21, 66: PRINT "  ÌÍ¹"
LOCATE 22, 66: PRINT "  ÈÍ¼"
RETURN

NINE:
LOCATE 20, 66: PRINT "  ÉÍ»"
LOCATE 21, 66: PRINT "  ÈÍ¹"
LOCATE 22, 66: PRINT "    ½"
RETURN

TEN:
'LOCATE 20, 66: PRINT "  ÉÍ»"
'LOCATE 21, 66: PRINT "  ÌÍ¹"
'LOCATE 22, 66: PRINT "  ½ Ó"
'RETURN


LOCATE 20, 66: PRINT "» ÉÍ»"
LOCATE 21, 66: PRINT "º º º"
LOCATE 22, 66: PRINT "Ê ÈÍ¼"
RETURN

eleven:
'LOCATE 20, 66: PRINT " ÍËÍ"
'LOCATE 21, 66: PRINT "  º "
'LOCATE 22, 66: PRINT "  Ê "
bee:
LOCATE 20, 66: PRINT "  » »"
LOCATE 21, 66: PRINT "  º º"
LOCATE 22, 66: PRINT "  Ê Ê"
RETURN

Cee:
LOCATE 20, 66: PRINT "  ÉÍ¸"
LOCATE 21, 66: PRINT "  º  "
LOCATE 22, 66: PRINT "  ÈÍ¾"
RETURN

'bee:
LOCATE 20, 66: PRINT "Ë  " '¹ ºÉ  ¼ È É Ê Ë Ì Í Î
LOCATE 21, 66: PRINT "ÌÍ»"
LOCATE 22, 66: PRINT "ÊÍ¼"
RETURN

'------------------------- HELP SUB ------------------------------
help:
	ON CHOICE% GOTO Help1, Help2, Help3, Help4, Help5, Help6, Help7, Help8, Help9, help10, help10, help12
Help1: CLS : SHELL "Type Vhelp1.hlp": GOTO Helpend
Help2: CLS : SHELL "Type Vhelp2.hlp": GOTO Helpend
Help3: CLS : SHELL "Type Vhelp3.hlp": GOTO Helpend
Help4: CLS : SHELL "Type Vhelp4.hlp": GOTO Helpend
Help5: CLS : SHELL "Type Vhelp5.hlp": GOTO Helpend
Help6: CLS : SHELL "Type Vhelp6.hlp": GOTO Helpend
Help7: CLS : SHELL "Type Vhelp7.hlp": GOTO Helpend
Help8: CLS : SHELL "Type Vhelp8.hlp": GOTO Helpend
Help9: CLS : SHELL "Type Vhelp9.hlp": GOTO Helpend
help10: CLS : SHELL "Type Vhelp10.hlp|more": GOTO Helpend
help11: CLS : SHELL "Type Vhelpt.hlp": GOTO Helpend
help12: CLS : SHELL "Type Vhelpc.hlp": GOTO Helpend
Helpend:  COLOR 14, 1
CHOICE% = CHOICE% - 1
INPUT "Press <CR> to continue", qq$: CLS : GOSUB MainMenu: RETURN

'------------------------
SUB antinit
ANTComms% = 2
OPEN "com2:9600,s,7,2,cs,ds,cd" FOR RANDOM AS #ANTComms%
PRINT #ANTComms%, CHR$(27);                 'reset ANT
PRINT "reset"
CALL DELAY(2)
END SUB

'******** SUBPROGRAM TO EXTRACT THE ID NUMBER FROM TIRIS STRUCTURE ********
'
SUB DecodeReadID (TagParam AS TagParams)

'The ID Field of the Tiris structure occupy the first 8 bytes - MSB first
'(Characters 1 to 16 of TagParam.TirisStructure)

DIM IDByte&(15)

TagParam.IDDecimalLong = 0

'*** Get characters 1 to 6 (Bytes 1 to 3) and convert to decimal.
'*** Note that I only look for IDs with values up to 7FFFFFFFh.
'*** I do this because long integer, TagParam.IDDecimalLong is only 8 bytes
'*** long, and although it can handle FFFFFFFFh, QuickBASIC would represent
'*** this as a negative number since the MS bit is set.
FOR CharNum% = 1 TO 7 STEP 2
  
	'*** Get byte from TagParam.TirisStructure - LSB first
	CharString$ = MID$(TagParam.TirisStructure, CharNum%, 1)
	HighNibble% = 16 * HexStringToDecimal%(CharString$, HexToDecErrorFlag%)
	CharString$ = MID$(TagParam.TirisStructure, (CharNum% + 1), 1)
	LowNibble% = HexStringToDecimal%(CharString$, HexToDecErrorFlag%)
	IDByte&(CharNum%) = HighNibble% + LowNibble%
	'PRINT "IDByte&(CharNum%) ="; IDByte&(CharNum%)
NEXT CharNum%

'*** Weight Bytes 2 & 3
IDByte&(3) = IDByte&(3) * 2 ^ 8
IDByte&(5) = IDByte&(5) * 2 ^ 16

'*** Check MS bit of Byte 4.
'*** If set, assume invalid data. Otherwise weight as above
IF IDByte&(7) > &H7F THEN
		OverFlowFlag% = 1
	ELSE
		OverFlowFlag% = 0
		IDByte&(7) = IDByte&(7) * 2 ^ 24
END IF

'*** Concatonate to TagParam.IDDecimalLong if data valid
IF OverFlowFlag% = 0 THEN
	TagParam.IDDecimalLong = IDByte&(1) + IDByte&(3) + IDByte&(5) + IDByte&(7)
	'PRINT "TagParam.IDDecimalLong ="; TagParam.IDDecimalLong
END IF

'*** Look at bytes 5 to 8 and examine their contents. If any bytes are
'*** non-zero, then treat that page as having invalid data.
'*** This assumes that Bytes 1 to 4 are valid
IF OverFlowFlag% = 0 THEN
  
	FOR CharNum% = 9 TO 15 STEP 2
 
		'*** Get byte from TagParam.TirisStructure - LSB first
		CharString$ = MID$(TagParam.TirisStructure, CharNum%, 1)
		HighNibble% = 16 * HexStringToDecimal%(CharString$, HexToDecErrorFlag%)
		CharString$ = MID$(TagParam.TirisStructure, (CharNum% + 1), 1)
		LowNibble% = HexStringToDecimal%(CharString$, HexToDecErrorFlag%)
		IDByte&(CharNum%) = HighNibble% + LowNibble%
		'PRINT "IDByte&(CharNum%) ="; IDByte&(CharNum%)
		IF IDByte&(CharNum%) <> 0 THEN OverFlowFlag% = 1
	NEXT CharNum%
END IF

'*** Condition to accept data
IF OverFlowFlag% = 1 THEN
		TagParam.IDString = "DATA INVALID"
	ELSE
		TagParam.IDString = STR$(TagParam.IDDecimalLong)
END IF

'*** TESTING
'PRINT "In DecodeReadID(): TagParam.IDDecimalLong ="; TagParam.IDDecimalLong
'PRINT "In DecodeReadID(): TagParam.IDString ="; TagParam.IDString

END SUB

'*** SUBPROGRAM TO EXTRACT TAG TYPE and PAGE NUMBER FROM TIRIS STRUCTURE ***
'
SUB DecodeReadType (TagParam AS TagParams)

'The Type Field of the Tiris structure is the 11th byte of 13
'(Characters 21 & 22 of TagParam.TirisStructure)

'*** Get characters 21 & 22
Char21$ = MID$(TagParam.TirisStructure, 21, 1)
Char22$ = MID$(TagParam.TirisStructure, 22, 1)

'*** Convert to decimal and store as integer, TypeByte%
HighNibble% = 16 * HexStringToDecimal%(Char21$, HexToDecErrorFlag%)
LowNibble% = HexStringToDecimal%(Char22$, HexToDecErrorFlag%)
TypeByte% = HighNibble% + LowNibble%

'*** The first page of a Multi-Page transponder will either show up as
'*** READ-ONLY (7E) or READ-WRITE (FE)
IF TagParam.PageNum = 1 THEN
		TagParam.TypeFieldPageNum = 1
		SELECT CASE (Char21$ + Char22$)
			CASE "7E"
				TagParam.TypeStatus = "Read-Only"
			CASE "FE"
				TagParam.TypeStatus = "Read-Write"
			CASE ELSE
				ErrorFlag% = 1
		END SELECT
	ELSE
	  
		'*** All other pages will relate the following information:
		'*** Status information in 2 LS bits
		'*** Page Number in 6 MS bits

		'*** Determine Status
		SELECT CASE (TypeByte% AND &H3)
			CASE 0
				TagParam.TypeStatus = "Read UNLOCKED PAGE"
			CASE 1
				TagParam.TypeStatus = "N/A"
			CASE 2
				TagParam.TypeStatus = "Read LOCKED PAGE"
			CASE 3
				TagParam.TypeStatus = "reserved"
			CASE ELSE
				ErrorFlag% = 1
				TagParam.TypeStatus = "Not Recognised"
		END SELECT

		'*** Determine Page Number if no errors detected so far
		IF ErrorFlag% = 0 THEN
			SELECT CASE (TypeByte% / 4) AND &H3F
				CASE 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
					TagParam.TypeFieldPageNum = (TypeByte% \ 4) AND &H3F
				CASE ELSE
					ErrorFlag% = 1
			END SELECT
		END IF
END IF

'*** TESTING
'PRINT "ErrorFlag% in SUB DecodeReadType() ="; ErrorFlag%

END SUB

SUB DELAY (delayTime!)
StartTime! = TIMER
DO

LOOP UNTIL TIMER > (StartTime! + delayTime!)
END SUB

'*** FUNCTION TO CONVERT A SINGLE HEX STRING NUMBER (0 to F) TO DECIMAL ***
'
FUNCTION HexStringToDecimal% (HexString$, HexToDecErrorFlag%)

HexToDecErrorFlag% = 0

SELECT CASE HexString$
	CASE "0"
		HexStringToDecimal% = 0
	CASE "1"
		HexStringToDecimal% = 1
	CASE "2"
		HexStringToDecimal% = 2
	CASE "3"
		HexStringToDecimal% = 3
	CASE "4"
		HexStringToDecimal% = 4
	CASE "5"
		HexStringToDecimal% = 5
	CASE "6"
		HexStringToDecimal% = 6
	CASE "7"
		HexStringToDecimal% = 7
	CASE "8"
		HexStringToDecimal% = 8
	CASE "9"
		HexStringToDecimal% = 9
	CASE "A", "a"
		HexStringToDecimal% = 10
	CASE "B", "b"
		HexStringToDecimal% = 11
	CASE "C", "c"
		HexStringToDecimal% = 12
	CASE "D", "d"
		HexStringToDecimal% = 13
	CASE "E", "e"
		HexStringToDecimal% = 14
	CASE "F", "f"
		HexStringToDecimal% = 15
	CASE ELSE
		HexToDecErrorFlag% = 1
END SELECT

END FUNCTION

'************ SUBPROGRAM TO GUIDE THE OPERATOR TO LOCK A PAGE *************
'
SUB LockPage (TagParam AS TagParams)

CLS

'*** Instruct operator to LOCK to appropriate page
LOCATE CSRLIN, 32
PRINT "LOCK PAGE"; TagParam.PageNum

'*** Shell to Tag Reader software
SHELL "easy com2"

'*** Check that the Page is locked
CALL ReadTagPage(TagParam)
CALL DecodeReadType(TagParam)

IF TagParam.TimeoutError = 0 AND TagParam.ErrorStatus = 0 THEN
		ErrorFlag% = 0
	ELSE
		ErrorFlag% = 1
END IF

IF ErrorFlag% = 0 THEN
		IF TagParam.TypeStatus = "Read UNLOCKED PAGE" OR TagParam.TypeStatus = "Read-Write" THEN
				PRINT "Page"; TagParam.PageNum; "is NOT LOCKED!"
				LockFlag% = 0
				ErrorFlag% = 1
			ELSE
				PRINT "Page"; TagParam.PageNum; "is LOCKED"
				LockFlag% = 1
		END IF
END IF

'*** Crude error report
CLS
IF ErrorFlag% = 0 THEN
		TagParam.TagError = 0
		PRINT "LockFlag% ="; LockFlag%
		PRINT "No Errors detected"
	ELSE
		TagParam.TagError = 1
		PRINT "Error(s) detected"
		PRINT "TagParam.TimeoutError ="; TagParam.TimeoutError
		PRINT "TagParam.ErrorStatus ="; TagParam.ErrorStatus
		PRINT "LockFlag% ="; LockFlag%
END IF

PRINT "TagParam.TAGError ="; TagParam.TagError

END SUB

SUB Logo

COLOR 1, 0: CLS : COLOR 14, 6
LOCATE , 6: PRINT "                                                                      "
LOCATE , 6: PRINT "         -***          VLCT BOARD TEST PROGRAM          ***-          "
LOCATE , 6: PRINT "              Sonardyne International Ltd  (c) Mar 1997               "
LOCATE , 6: PRINT "                                                                      "
LOCATE , 6: PRINT "              Uses - PCB Test Jig Type 7009-412A                      "
LOCATE , 6: PRINT "                     HP Scope 54602B and PEP tag reader               "
COLOR 0
LOCATE , 6: PRINT "              Author John Kennaugh    Tel 01579-382583                "
COLOR 7, 0: PRINT
PRINT : COLOR 14, 1

END SUB

'***************** SUBPROGRAM TO READ A PAGE OF OF A TAG *****************
'
SUB ReadTagPage (TagParam AS TagParams)

'*** TagParam.TimeoutError = 0 if Comms link successful
'*** TagParam.TimeoutError = 1 if Comms link unsuccessful
'*** TagParam.ErrorStatus = 0 if response from Tag Reader was error-free
'*** TagParam.ErrorStatus = non-zero if not error-free as shown below:
'
'TagParam.ErrorStatus = 1:  Ack response to "ReadTiris" not correct
'TagParam.ErrorStatus = 2:  83h response not correct (Internal Com failure)
'TagParam.ErrorStatus = 3:  83h response not correct (Read failed)
'TagParam.ErrorStatus = 4:  83h response not correct (Read Timeout
'TagParam.ErrorStatus = 5:  83h response not correct (Unknown error)

'*** Open Com Port 2
TagComms% = FREEFILE
OPEN "com2:9600,n,8,1,cs,ds,cd" FOR RANDOM AS #TagComms%

'*** Flush the Com Port Buffer
DO UNTIL LOC(TagComms%) = 0
	GET #TagComms%, 1, InByte%
LOOP

'*** Send "Open Tiris" command - Note that no response is returned
'*** Also note that this command MUST be sent
OutByte% = &H81
PUT #TagComms%, 1, OutByte%
'PRINT "Just sent &H81 (Open Tiris)"
SLEEP (1)                           '*** NOTE: Must have a delay here

'*** Send "Read Tiris" command
OutByte% = &H83
PUT #TagComms%, 1, OutByte%
'PRINT "Just sent &H83 (Read Tiris)"

'*** Set Timer to check for timeout error
StartTime! = TIMER

'*** Wait for "Read Tiris" response (Ack command - A0h)
'*** If response not returned in 5 seconds, then abort Read sequence
DO: LOOP UNTIL (LOC(TagComms%) <> 0) OR (TIMER - StartTime! > 5)
IF (TIMER - StartTime! > 5) THEN
		TagParam.TimeoutError = 1
		PRINT "Read Tiris response (Ack command - A0h) not returned in time"
	ELSE
		TagParam.TimeoutError = 0
		GET #TagComms%, 1, InByte%
		'PRINT RIGHT$(HEX$(InByte%), 2)
END IF

'*** Check that A0h has been returned
IF RIGHT$(HEX$(InByte%), 2) = "A0" THEN
		TagParam.ErrorStatus = 0
	ELSE
		TagParam.ErrorStatus = 1
END IF

'*** Send Page Number command if no errors so far.
IF TagParam.TimeoutError = 0 AND TagParam.ErrorStatus = 0 THEN
	OutByte% = TagParam.PageNum
	PUT #TagComms%, 1, OutByte%
	'PRINT "Just sent &H01 (Page Number 1)"
END IF

'*** Wait for "Page Number" response (83h) if no errors so far.
'*** If response not returned in 5 seconds, then abort Read sequence
IF TagParam.TimeoutError = 0 AND TagParam.ErrorStatus = 0 THEN
	DO: LOOP UNTIL (LOC(TagComms%) <> 0) OR (TIMER - StartTime! > 5)
	IF (TIMER - StartTime! > 5) THEN
			TagParam.TimeoutError = 1
			'PRINT "Page Number response (83h) not returned in time"
		ELSE
			TagParam.TimeoutError = 0
			GET #TagComms%, 1, InByte%
			'PRINT RIGHT$(HEX$(InByte%), 2)
	END IF

	'*** Check that 83h has been returned, or assign TagParam.ErrorStatus accordingly
	SELECT CASE RIGHT$(HEX$(InByte%), 2)
		CASE "83"
			TagParam.ErrorStatus = 0
		CASE "C6"               'Internal Com failure
			TagParam.ErrorStatus = 2
		CASE "C7"               'Read failed (BCC)
			TagParam.ErrorStatus = 3
		CASE "C8"               'Read Timeout
			TagParam.ErrorStatus = 4
		CASE "C9"               'Internal Com failure
			TagParam.ErrorStatus = 2
		CASE ELSE               'Unknown error
			TagParam.ErrorStatus = 5
	END SELECT
END IF

'*** Wait for "Tiris Structure" (13 bytes) if no errors so far.
'*** If response not returned in 5 seconds, then abort Read sequence
IF TagParam.TimeoutError = 0 AND TagParam.ErrorStatus = 0 THEN
	TagParam.TirisStructure = ""            'Initialise string to store Tag data
	StartTime! = TIMER
	DO: LOOP UNTIL (LOC(TagComms%) <> 0) OR (TIMER - StartTime! > 5)
	IF (TIMER - StartTime! > 5) THEN
			TagParam.TimeoutError = 1
		ELSE
			TagParam.TimeoutError = 0
			DO
				GET #TagComms%, 1, InByte%
				TagParam.TirisStructure = RTRIM$(TagParam.TirisStructure) + RIGHT$(HEX$(InByte%), 2)
				'PRINT RIGHT$(HEX$(InByte%), 2); : PRINT " ";
			LOOP UNTIL LOC(TagComms%) = 0
			PRINT
	END IF
	'PRINT : PRINT "TagParam.TirisStructure ="; TagParam.TirisStructure;
END IF

CLOSE #TagComms%
'PRINT "Closed #TagComms%"

IF (TagParam.TimeoutError = 0) AND (TagParam.ErrorStatus = 0) THEN
		TagParam.TagError = 0
	ELSE
		TagParam.TagError = 1
END IF

END SUB

'***** SUBPROGRAM TO READ A PAGE AND CHECK THAT THE CONTENT IS CORRECT *****
'
SUB ReadTagVerify (TagParam AS TagParams)

'*** Check that the Page intended to be read to is valid and no errors returned
CALL ReadTagPage(TagParam)

IF TagParam.TagError = 0 THEN
		CALL DecodeReadType(TagParam)
		CALL DecodeReadID(TagParam)
		IF TagParam.TypeStatus = "Read UNLOCKED PAGE" OR TagParam.TypeStatus = "Read-Write" THEN
				TagParam.LockFlag = 0
			ELSE
				TagParam.LockFlag = 1
		END IF
END IF

END SUB

SUB TagMessage

CLS

Row% = 4: Col% = 7
COLOR 15, 1

'*** Flush the keyboard buffer
DO: LOOP UNTIL INKEY$ = ""

LOCATE Row%, Col%: PRINT " ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» "
LOCATE CSRLIN, Col%: PRINT " º                                                                 º "
LOCATE CSRLIN, Col%: PRINT " º                  ABOUT TO ACCESS THE TAG READER                 º "
LOCATE CSRLIN, Col%: PRINT " º                                                                 º "
LOCATE CSRLIN, Col%: PRINT " º                                                                 º "
LOCATE CSRLIN, Col%: PRINT " º        Switch the RS-232 Switching Box to RFID TAG READER       º "
LOCATE CSRLIN, Col%: PRINT " º                                                                 º "
LOCATE CSRLIN, Col%: PRINT " º                                                                 º "
LOCATE CSRLIN, Col%: PRINT " º                   Press any key to continue...                  º "
LOCATE CSRLIN, Col%: PRINT " º                                                                 º "
LOCATE CSRLIN, Col%: PRINT " º                                                                 º "
LOCATE CSRLIN, Col%: PRINT " º    ³                        +                        ³          º "
LOCATE CSRLIN, Col%: PRINT " ÈÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍ¼ "
'COLOR 7, 0

DO: LOOP UNTIL INKEY$ <> ""

END SUB

'***** SUBPROGRAM TO PRINT TO SCREEN THE STATUS OF THE PAGE JUST READ *****
'
SUB TagReportToScreen (TagParam AS TagParams, IDLong&, OKFlag%)

'*** OKFlag% = 1 if ID contents are correct and Page Lock is ON
'*** OKFlag% = 0 if one of the above conditions are false

ColLong% = 30
ColOK% = 53

'*** If a Comms Error had occured previously, the Status Report will
'*** be invalid. Therefore check for this
IF TagParam.TagError = 1 THEN
		PRINT "A Communications Error occured whilst trying to read Page";
		PRINT TagParam.PageNum
	ELSE
	   
		'*** Contents confirm
		PRINT "Page"; TagParam.PageNum; "should contain";
		LOCATE CSRLIN, ColLong%
		PRINT IDLong&
		PRINT "Page"; TagParam.PageNum; "actually contains";
		LOCATE CSRLIN, ColLong%
		PRINT TagParam.IDDecimalLong;

		'*** Correct data?
		LOCATE CSRLIN, ColOK%
		IF IDLong& = TagParam.IDDecimalLong THEN
				PRINT "OK"
				ELSE
				PRINT "WRONG!!!"
		END IF

		'*** LOCK ON?
		LOCATE CSRLIN, 1
		IF TagParam.LockFlag = 1 THEN
				PRINT "Page"; TagParam.PageNum; "is Locked";
				LOCATE CSRLIN, ColOK%
				PRINT "OK"
			ELSE
				PRINT "Page"; TagParam.PageNum; "is NOT LOCKED";
				LOCATE CSRLIN, ColOK%
				PRINT "WRONG!!!"
		END IF
END IF

END SUB

'********** SUBPROGRAM TO APPEND TEST RESULT DATA TO DISC FILE ***********
'
SUB WriteToDataFile (TagParam AS TagParams, DataFile%)


'*** I'll come back to this later if time


'*** Using small variables to avoid a huge WRITE# or INPUT# line
'a$ = RTRIM$(VLCTBenchParam.SerialNum)
'b$ = RTRIM$(VLCTBenchParam.TagNum)
'c$ = RTRIM$(VLCTBenchParam.TxdNum)
'd$ = RTRIM$(VLCTBenchParam.BatteryNum)
'e$ = RTRIM$(VLCTBenchParam.OpInitials)
'f$ = RTRIM$(VLCTBenchParam.DateOfTest)
'g! = VLCTBenchParam.RangeA
'h! = VLCTBenchParam.RangeB
'i! = VLCTBenchParam.RangeC
'j! = VLCTBenchParam.RangeD
'k! = VLCTBenchParam.RangeE
'l$ = RTRIM$(VLCTBenchParam.PassBoard)

'm$ = RTRIM$(VLCTParam.OpInitials)
'n$ = RTRIM$(VLCTParam.DateOfTest)
'o! = VLCTParam.SourceLevel
'p! = VLCTParam.RxThreshold
'q! = VLCTParam.TAT
'r$ = RTRIM$(VLCTParam.PassUnit)

WRITE #DataFile%, A$, b$, c$, d$, e$, f$, g!, h!, i!, j!, k!, l$, m$, n$, o!, p!, q!, r$

'*** JEK's Variables
'IF ok% = 5 THEN PorF$ = "PASS" ELSE PorF$ = "FAIL"
'PRINT #5, SerialNumber&; ",";
'PRINT #5, NoPage1#; ",,,";
'PRINT #5, CHR$(34); BoardTester$; CHR$(34); ",";
'PRINT #5, CHR$(34); ddate$; CHR$(34); ",";
'PRINT #5, CHR$(34); LEFT$(TIME$, 5); CHR$(34); ",";
'PRINT #5, CHR$(34); ta$(1); CHR$(34); ",";
'PRINT #5, CHR$(34); ta$(2); CHR$(34); ",";
'PRINT #5, CHR$(34); ta$(3); CHR$(34); ",";
'PRINT #5, CHR$(34); ta$(4); CHR$(34); ",";
'PRINT #5, CHR$(34); ta$(5); CHR$(34); ",";
'PRINT #5, CHR$(34); curr$; CHR$(34); ",";
'PRINT #5, CHR$(34); PorF$; CHR$(34); ",";
'PRINT #5, CHR$(34); Fault$; CHR$(34); ","
'WRITE #5, SerialNumber&, NoPage1#, " ", " ", BoardTester$, ddate$, LEFT$(TIME$, 5), ta$(1), ta$(2), ta$(3), ta$(4), ta$(5), curr$, PorF$, fault$

END SUB

'************ SUBPROGRAM TO WRITE A LONG INTEGER TO A TAG PAGE *************
'************************ FOLLOWED BY A READ CHECK *************************
'
SUB WriteToTagAndVerify (TagParam AS TagParams)

CLS

'*** TESTING
'TagParam.NumberToBeWritten = 12345678
'TagParam.PageNum = 6

'*** Check that the Page intended to be read to is valid and no errors returned
CALL ReadTagPage(TagParam)
CALL DecodeReadType(TagParam)

IF TagParam.TimeoutError = 0 AND TagParam.ErrorStatus = 0 THEN
		ErrorFlag% = 0
	ELSE
		ErrorFlag% = 1
END IF

IF ErrorFlag% = 0 THEN
		IF TagParam.TypeStatus = "Read UNLOCKED PAGE" OR TagParam.TypeStatus = "Read-Write" THEN
				PRINT "Page"; TagParam.PageNum; "is UNLOCKED"
				LockFlag% = 0
			ELSE
				PRINT "Page"; TagParam.PageNum; "is LOCKED!"
				LockFlag% = 1
				ErrorFlag% = 1
		END IF
END IF

'CLS

'*** Instruct operator to enter data to appropriate page
IF ErrorFlag% = 0 THEN
	PRINT "Enter the following number to PAGE"; TagParam.PageNum;
	PRINT "exactly as stated here:"
	LOCATE (CSRLIN + 1), 25
	PRINT TagParam.NumberToBeWritten
END IF

'*** Shell to Tag Reader software
IF ErrorFlag% = 0 THEN SHELL "easy com2"

'*** Check that the correct number was entered to the correct page
IF ErrorFlag% = 0 THEN
	CLS
	CALL ReadTagPage(TagParam)
	CALL DecodeReadID(TagParam)
	IF TagParam.IDDecimalLong = TagParam.NumberToBeWritten THEN
			PRINT "SUCCESSFUL WRITE"
			PRINT
			PRINT "Should have entered"; TagParam.NumberToBeWritten
			PRINT "Actually entered   "; TagParam.IDDecimalLong
		ELSE
			PRINT "UNSUCCESSFUL WRITE"
			PRINT
			PRINT "Should have entered"; TagParam.NumberToBeWritten
			PRINT "Actually entered   "; TagParam.IDDecimalLong
			ErrorFlag% = 1
	END IF
END IF

'*** Crude error report
IF ErrorFlag% = 0 THEN
		TagParam.TagError = 0
		PRINT "No Errors detected"
	ELSE
		TagParam.TagError = 1
		PRINT "Error(s) detected"
		PRINT "TagParam.TimeoutError ="; TagParam.TimeoutError
		PRINT "TagParam.ErrorStatus ="; TagParam.ErrorStatus
		PRINT "LockFlag% ="; LockFlag%
END IF

PRINT "TagParam.TAGError ="; TagParam.TagError

END SUB

