'         | VLCT BOARD TEST PROGRAM  Auto Scope/Tag reader Version 5 |
'         | John Kennaugh 10.3.97                                    |
'         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Modified from Version 5d to Version 5e by PJF - 21.5.99

'Note: This program (and all future Version 5x programs are used to test
'      pre H-Issue PCBs only.

'Version 5e changes:
'1. Store the Log file in the local directory
'2. Change the name of the Log file to TEST1-FG.LOG
'3. Introductory text changed to make the connection set-up clearer


DECLARE FUNCTION GetSerialNumber$ ()
DECLARE FUNCTION GetInitials$ ()
DECLARE FUNCTION GetFilename$ ()
DECLARE SUB FlushBuffer (CommsRef%, BufferLimit%)
DECLARE SUB ScopeTest1 (ScopeComms%)
DECLARE SUB ScopeTest23 (ScopeComms%, NewTest%)
DECLARE SUB ScopeTest457b8 (ScopeComms%, NewTest%)
DECLARE SUB ScopeTest6 (ScopeComms%, NewTest%)
DECLARE SUB ScopeTest7a (ScopeComms%, NewTest%)
DECLARE SUB ScopeTest10 (ScopeComms%, NewTest%)
DECLARE SUB WaitForScopeReply (ScopeComms%)
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 mes#(100)
DIM TagParam AS TagParams

SerialNumPage% = 3
DatePage% = 4
FaultReport$ = ""

CLS

'*** Open RS-232 path for scope
ScopeComms% = FREEFILE
OPEN "com1:9600,N,8,1,cs,ds" FOR RANDOM AS #ScopeComms%
CALL DELAY(.5)

'*** Open RS-232 path for ANT
ANTComms% = FREEFILE
OPEN "com2:9600,s,7,2,cs,ds,cd" FOR RANDOM AS #ANTComms%
PRINT #ANTComms%, CHR$(27);                 'reset ANT
CALL DELAY(1.5)

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

CALL Logo
GOSUB GetInitialParams

'---------------------------------------------------------------------
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 TestNumber% = 0 THEN GOTO nextprg
	IF A$ = "i" OR A$ = "I" THEN TestNumber% = 12: GOTO nextprg
	IF A$ = "t" OR A$ = "T" THEN TestNumber% = 10: GOTO nextprg
	IF A$ = "q" OR A$ = "Q" THEN GOTO endseq
	IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt: GOTO nextprg
	TestNumber% = VAL(A$)
	ON TestNumber% GOTO Filter, f2cw, f1cw, f2pw, f1pw, ATT, f11, f12, AutoPrg, testTA, test55, RESETC, StartTest

nextprg:   'STEPS THROUGH AT <CR>
	IF TestNumber% > 12 THEN GOTO endseq
	IF TestNumber% = 0 THEN GOTO StartNewBoard
	ON TestNumber% GOTO Filter, f2cw, f1cw, f2pw, f1pw, ATT, f11, f12, AutoPrg, testTA, test55, RESETC, StartTest


'-------------------------- Start New Board ---------------------------
StartNewBoard:
GOSUB MainMenu
TestNumber% = 1

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

'*** Get the Serial Number
SerialNumber$ = GetSerialNumber$

IF RTRIM$(SerialNumber$) = "0" THEN GOTO endseq

'------------------- TEST 1 Filter ---------------------------
Filter:
 GOSUB MainMenu
COLOR 15, 1
'------------------ TEST 1a  39kHz CW -----------------
cW39:
CALL ScopeTest1(ScopeComms%)

'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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

GOSUB ClearDisplay
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$) = "i" THEN GOTO options
IF LCASE$(A$) = "t" THEN GOTO options
IF VAL(A$) > 0 THEN NewTest% = 1: 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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

GOSUB ClearDisplay
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$) = "t" THEN GOTO options
IF LCASE$(A$) = "i" THEN GOTO options
IF VAL(A$) > 0 THEN NewTest% = 1: 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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay: 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$) = "i" THEN GOTO options
	IF LCASE$(A$) = "t" THEN GOTO options
	IF VAL(A$) > 0 THEN NewTest% = 1: GOTO options
	IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt1

'---------------------------TEST 1d 47kHz ----------------------------
CW46:  OUT$ = "2390/12,C0,00,"
	   GOSUB OUTANT     'FRQ$ = "48000"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay: 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$) = "t" THEN GOTO options
	IF LCASE$(A$) = "i" THEN GOTO options
	IF VAL(A$) > 0 THEN NewTest% = 1: GOTO options
	IF A$ = "f" OR A$ = "F" THEN GOSUB faultrpt1

'----------------------------TEST 1e 28kHz ------------------------------
CW30:  OUT$ = "2390/0A,F0,0,0,"
	   GOSUB OUTANT

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay: 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:

'*** Setup scope
CALL ScopeTest23(ScopeComms%, NewTest%)

	 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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay
	   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:

'*** Setup scope
IF NewTest% = 1 THEN CALL ScopeTest23(ScopeComms%, NewTest%)


		'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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay: 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:

'*** Setup scope
CALL ScopeTest457b8(ScopeComms%, NewTest%)

	 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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay: 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:

'*** Setup scope
IF NewTest% = 1 THEN CALL ScopeTest457b8(ScopeComms%, NewTest%)

		'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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay: 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

'*** Setup scope
CALL ScopeTest6(ScopeComms%, NewTest%)

	   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"

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

	   GOSUB ClearDisplay: 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:
   
'*** Setup scope
CALL ScopeTest7a(ScopeComms%, NewTest%)

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

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

 GOSUB ClearDisplay: 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


'*** Setup scope
CALL ScopeTest457b8(ScopeComms%, NewTest%)

 GOSUB ClearDisplay: 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:

'*** Setup scope
IF NewTest% = 1 THEN CALL ScopeTest457b8(ScopeComms%, NewTest%)

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

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

 GOSUB ClearDisplay: 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

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

GOSUB ClearDisplay
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:

CALL ScopeTest10(ScopeComms%, NewTest%)

PRINT #ANTComms%, CHR$(27);                 'reset ANT
CALL DELAY(1.5)

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)


 GOSUB OUTANT

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

 GOSUB ClearDisplay: 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 20, 11: PRINT "       Press <SPACE> To complete this test"

test55:
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

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)


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$ = ""

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

PRINT #ANTComms%, "00A7/1.";
CALL DELAY(.1)
valid$ = "&H" + MID$(mes$, 2, 2)
valid = VAL(valid$) AND &H4
TAT = VAL(ta$) / 1229

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)


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 t57

'------------------ Acceptance test sequence -------------------
t55:
ok% = 0
A$ = INKEY$
IF A$ = "" THEN
		CALL DELAY(.4)
		PRINT #ANTComms%, "G";
		GOTO T54
END IF

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 ClearDisplay: 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


TestNumber% = TestNumber% + 1       'TestNumber = 11

LOCATE 19, 11
COLOR 15, 1
PRINT "Press <SPACE> to continue, or";
LOCATE 20, 17
PRINT "Test Number/Character to repeat a test."

'*** Flush keyboard buffer
DO: LOOP UNTIL INKEY$ = ""

GOTO getkey

'------------------------ MEASURE CURRENT ------------------------
RESETC:
	
GOSUB ClearDisplay: GOSUB Cee
LOCATE 9, 11: PRINT "SWITCH Position not important  "
LOCATE 11, 11: PRINT "  Switch to MEASURE             "
LOCATE 13, 11: PRINT "  Current should be equal to or less than 250æA"
COLOR 15, 4

LOCATE 15, 11
INPUT " Enter Current in æA  ", CurrentDrawn!

curr$ = STR$(CurrentDrawn!)
IF CurrentDrawn! > 250 THEN
		CurrentFaultFlag% = 1
		LOCATE 17, 24
		PRINT " FAILED! Current too high "
	ELSE
		CurrentFaultFlag% = 0
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 ClearDisplay
LOCATE 10, 25

'*** Check overall Board status
IF FaultFlag% = 0 AND ok% = 5 AND CurrentFaultFlag% = 0 THEN
		PRINT "Status of Board S/N "; RTRIM$(SerialNumber$); ":"
		COLOR 14, 1
		LOCATE (CSRLIN + 1), 37: PRINT " PASS"
		BenchTestResult$ = "Pass"
	ELSE
		PRINT "Status of Board S/N "; RTRIM$(SerialNumber$); ":"
		COLOR 30, 1
		LOCATE (CSRLIN + 1), 37: PRINT " FAIL"      'Flashing
		BenchTestResult$ = "Fail"
END IF

COLOR 15, 1
LOCATE 15, 11
PRINT " Press Test Number/Character to repeat a test"
LOCATE CSRLIN + 1, 11
'PRINT " Press <SPACE> to save results to file, "; LTRIM$(RTRIM$(STR$(won))) + ".log"
PRINT " Press <SPACE> to save results to file, "; LogFile$
LOCATE CSRLIN + 1, 11
PRINT SPACE$(60)

'*** Flush the keyboard buffer
DO: LOOP UNTIL INKEY$ = ""

'*** Wait for keypress
DO
	A$ = INKEY$
LOOP UNTIL A$ <> ""            'loop til key press

IF A$ <> " " THEN GOTO getkeyx

'------------------- log results ----------------------------------
IF FaultFlag% = 0 AND ok% = 5 AND CurrentFaultFlag% = 0 THEN
		PorF$ = "PASS"
	ELSE
		PorF$ = "FAIL"
END IF

IF CurrentFaultFlag% = 1 THEN
	FaultReport$ = FaultReport$ + " - Current too high"
END IF

'*** Write results to file
'FullLogFile$ = "C:\TESTS\VLCT\" + LogFile$

FullLogFile$ = LogFile$     '*** New for Version 5E

DataFile% = FREEFILE
OPEN FullLogFile$ FOR APPEND AS #DataFile%
WRITE #DataFile%, SerialNumber$, DATE$, TIME$, ta$(1), ta$(2), ta$(3), ta$(4), ta$(5), CurrentDrawn!, BenchTestResult$, BoardTester$, FaultReport$
CLOSE #DataFile%

FaultFlag% = 0
FaultReport$ = ""


'*** 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 = CLNG(VAL(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 = CLNG(VAL(SerialNumber$))) AND (TagParam.LockFlag = 1) THEN
				TagSerNumOkFlag% = 1
			ELSE
				TagSerNumOkFlag% = 0
		END IF

		'*** Status Report of Serial Number Page
		CALL TagReportToScreen(TagParam, CLNG(VAL(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 "
TestNumber% = 0
GOTO nextprg

'------------------------KEY PRESS GET AND ANALYSE --------------------------------------------
getkey:
DO
	A$ = INKEY$
LOOP UNTIL A$ <> ""            'loop til key press

getkeyx:
	IF A$ = "i" OR A$ = "I" THEN GOTO options
	IF A$ = "t" OR A$ = "T" 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 NewTest% = 1: GOTO options
	TestNumber% = TestNumber% + 1
	NewTest% = 0
	IF TestNumber% > 12 THEN TestNumber% = 1
	GOTO nextprg

'------------------------ FAULT REPORT SUB --------------
faultrpt:

LOCATE 21, 11: PRINT "                                                     "
LOCATE 21, 11: INPUT "Type Fault report - ", FaultNote$
CHOICE$ = STR$(TestNumber%)
FaultReport$ = FaultReport$ + CHOICE$ + "/" + FaultNote$ + "  "
LOCATE 21, 6
PRINT " º  Select test No or <SPACE> for next Test                   "
FaultFlag% = 1
RETURN
'-------------------------------------------------------
faultrpt1:

LOCATE 20, 11: INPUT "Type Fault report - ", FaultNote$
CHOICE$ = STR$(TestNumber%)
FaultReport$ = FaultReport$ + 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


'---------------- LOG ON SEQUENCE SUB ---------------------------------
GetInitialParams:
COLOR 15, 1
LOCATE , 6: PRINT " ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» "
GOSUB mm1
LOCATE 11, 9
COLOR 15, 1

'*** Modified for Version 5E ************************************************************
Row% = 12: Col% = 9
LOCATE Row%, Col%: PRINT "  Log file stored in the working directory under TEST1-FG.LOG"
'****************************************************************************************

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

'*** New for Version 5E ***********************************************
LOCATE CSRLIN, Col%: PRINT "  Connections:"
LOCATE CSRLIN, Col%: PRINT "              HP Scope  to      Com Port 1"
LOCATE CSRLIN, Col%: PRINT "              ANT       to      Com Port 2"
PRINT
'**********************************************************************

'*** Flush the keyboard buffer
DO: LOOP UNTIL INKEY$ = ""

'*** Enter initials
BoardTester$ = GetInitials$

'*** Flush the keyboard buffer
DO: LOOP UNTIL INKEY$ = ""

'*** Enter the Data File name
'LogFile$ = GetFilename$

'*** Assign TEST1-FG.LOG as the data filename
LogFile$ = "TEST1-FG.LOG"

'*** Flush the keyboard buffer
DO: LOOP UNTIL INKEY$ = ""

FaultReport$ = ""
TestNumber% = 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:
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.3 OR TAT < 299 THEN valid = 0
RETURN
'------------------------------------------------------------------
RESULT:
GOSUB OUTANT
GOSUB ReadANT

'*** Flush the ANT Com Port Buffer
CALL FlushBuffer(ANTComms%, 0)

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$
ta$(cn) = " Fail "
COLOR 15, 1
RETURN

ResultValid:
ok% = ok% + 1
COLOR 0, 2
LOCATE , 11
PRINT cn$; "/ PASS   Turn Around = ";
PRINT USING "###.##"; TAT; : PRINT " ms   "

ta$(cn) = STR$(INT(VAL(ta$) / 1229 * 100) / 100)

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 " º   T. TurnAround        I. 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 ---------------
ClearDisplay:
	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 TestNumber% 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
TestNumber% = TestNumber% - 1
INPUT "Press <CR> to continue", qq$: CLS : GOSUB MainMenu: RETURN

'******** 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

'**** SUBPROGRAM TO FLUSH THE COM PORT BUFFER IF ABOVE A SPECIFIED SIZE ****
'
SUB FlushBuffer (CommsRef%, BufferLimit%)

IF LOC(CommsRef%) >= BufferLimit% THEN
		DO UNTIL LOC(CommsRef%) = 0
			Dummy$ = INPUT$(1, #CommsRef%)
		LOOP
END IF

END SUB

'******* FUNCTION TO RETURN THE FILENAME CHOSEN BY THE OPERATOR ***********
'
FUNCTION GetFilename$

Row% = 19
Col% = 11

'*** Loop until filename is valid
DO
	'*** Flush the keyboard buffer
	DO: LOOP UNTIL INKEY$ = ""

	'*** Enter no more than 8 characters
	DO
		LOCATE Row%, Col%
		PRINT SPACE$(63)
		LOCATE Row%, Col%
		LINE INPUT "Enter the name of the data file.... ", FilenameString$
	LOOP UNTIL (LEN(FilenameString$) >= 1) AND (LEN(FilenameString$) <= 8)

	'*** check that each character is valid
	x% = 0
	DO
		x% = x% + 1
		ASCIIChar% = ASC(MID$(FilenameString$, x%, 1))

		SELECT CASE ASCIIChar%
			CASE 48 TO 57               'Numbers
				ValidFlag% = 1
			CASE 65 TO 90               'Upper case letters
				ValidFlag% = 1
			CASE 97 TO 122              'Lower case letters
				ValidFlag% = 1
			CASE 33, 35 TO 41, 45, 64, 94 TO 96, 123, 125, 126
				ValidFlag% = 1
			CASE ELSE
				ValidFlag% = 0
				InvalidChar% = ASCIIChar%
		END SELECT
	LOOP UNTIL (x% = LEN(FilenameString$)) OR (ValidFlag% = 0)

	IF ValidFlag% = 0 THEN
			LOCATE Row%, Col%
			PRINT SPACE$(63)
			LOCATE Row%, Col%
			PRINT "Invalid character (ASCII"; InvalidChar%; ")"
	END IF

LOOP UNTIL ValidFlag% = 1

'*** Add Extension
FilenameString$ = FilenameString$ + ".LOG"

'*** Confirm filename
LOCATE Row%, Col%
PRINT SPACE$(63)
LOCATE Row%, Col%
PRINT "Data will be stored in file, "; FilenameString$

LOCATE (Row% + 2), (Col% + 16)
PRINT "Press any key to continue..."
DO: LOOP UNTIL INKEY$ <> ""

GetFilename$ = FilenameString$

END FUNCTION

'********** FUNCTION TO RETURN THE INITIALS OF THE OPERATOR ***************
'
FUNCTION GetInitials$

Row% = 19
Col% = 11

DO
	InitialsFaultFlag% = 0

	DO
		LOCATE Row%, Col%
		PRINT SPACE$(60)        '*** Version 5E reduces chars from 63 to 60
		LOCATE Row%, Col%
		LINE INPUT "Enter initials (max. 4 characters).... ", Initials$
	LOOP UNTIL LEN(Initials$) <= 4

	'*** Check that all characters are numbers
	FOR x% = 1 TO LEN(Initials$)
		CharStr$ = MID$(Initials$, x%, 1)
		IF (ASC(CharStr$) < 65) OR ((ASC(CharStr$) > 90) AND (ASC(CharStr$) < 97)) OR (ASC(CharStr$) > 122) THEN
			InitialsFaultFlag% = 1
		END IF
	NEXT x%

LOOP UNTIL InitialsFaultFlag% = 0

'*** Ensure the initials are in upper case
InitialsUpper$ = ""
FOR x% = 1 TO LEN(Initials$)
	InitialsUpper$ = InitialsUpper$ + UCASE$(MID$(Initials$, x%, 1))
NEXT x%

GetInitials$ = InitialsUpper$

END FUNCTION

'**************** FUNCTION TO RETURN THE PCB SERIAL NUMBER *****************
'
FUNCTION GetSerialNumber$

Row% = 16
Col% = 11

'*** Enter Serial Number and check for 8 numbers or zero
DO
	SerNumFaultFlag% = 0
	LOCATE Row%, Col%
	DO
		PRINT SPACE$(37)
		LOCATE Row%, Col%
		LINE INPUT "                > "; SerialNumberString$
		LOCATE Row%, Col%
	LOOP UNTIL (LEN(SerialNumberString$) = 8) OR (SerialNumberString$ = "0")

	'*** Check that all characters are numbers
	FOR x% = 1 TO LEN(SerialNumberString$)
		CharStr$ = MID$(SerialNumberString$, x%, 1)
		IF (ASC(CharStr$) < 48) OR (ASC(CharStr$) > 57) THEN
			SerNumFaultFlag% = 1
		END IF
	NEXT x%

	'*** A Serial Number cannot start with zero
	IF (LEFT$(SerialNumberString$, 1) = "0" AND LEN(SerialNumberString$) > 1) OR (SerNumFaultFlag% = 1) THEN
			SerNumFaultFlag% = 1
		ELSE
			SerNumFaultFlag% = 0
	END IF

LOOP UNTIL SerNumFaultFlag% = 0

GetSerialNumber$ = SerialNumberString$

END FUNCTION

'*** 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 Ver.5e      ***-          "
LOCATE , 6: PRINT "              Sonardyne International Ltd  (c) May 1999               "
LOCATE , 6: PRINT "                                                                      "
LOCATE , 6: PRINT "              Uses - PCB Test Jig Type 7009-412A                      "
LOCATE , 6: PRINT "                     HP Scope                                         "
LOCATE , 6: PRINT "                     54602BPEP Tag Reader (optional)                  "
LOCATE , 6: PRINT "                                                                      "
COLOR 0
LOCATE , 6: PRINT "         Author: John Kennaugh     Refer to PJF for queries           "
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

'***************** SUBPROGRAM TO SET THE SCOPE FOR TEST 1 *****************
'
SUB ScopeTest1 (ScopeComms%)

'*** Start timer
'StartTime! = TIMER

'*** Flush the Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) = 0

ScopeCommand$ = "*RST;*OPC?" + CHR$(10) + CHR$(13)
PRINT #ScopeComms%, ScopeCommand$;
CALL WaitForScopeReply(ScopeComms%)

ScopeCommand$ = ":VIEW CHAN1;:VIEW CHAN2;*OPC?" + CHR$(10) + CHR$(13)
PRINT #ScopeComms%, ScopeCommand$;
CALL WaitForScopeReply(ScopeComms%)

ScopeCommand$ = ":VIEW CHAN3;*OPC?" + CHR$(10) + CHR$(13)
PRINT #ScopeComms%, ScopeCommand$;
CALL WaitForScopeReply(ScopeComms%)

ScopeCommand$ = ":CHAN1:PROB X10;COUP AC;RANG 1.6;*OPC?" + CHR$(10) + CHR$(13)
PRINT #ScopeComms%, ScopeCommand$;
CALL WaitForScopeReply(ScopeComms%)

ScopeCommand$ = ":CHAN2:PROB X10;*OPC?" + CHR$(10) + CHR$(13)
PRINT #ScopeComms%, ScopeCommand$;
CALL WaitForScopeReply(ScopeComms%)

ScopeCommand$ = ":CHAN3:RANG LOW;OFFS .4;COUP GND;*OPC?" + CHR$(10) + CHR$(13)
PRINT #ScopeComms%, ScopeCommand$;
CALL WaitForScopeReply(ScopeComms%)

'ScopeCommand$ = ":TRIG:MODE NORM;SOUR CHAN3;*OPC?" + CHR$(10) + CHR$(13)
'PRINT #ScopeComms%, ScopeCommand$;
'CALL WaitForScopeReply(ScopeComms%)

ScopeCommand$ = ":TIM:REF LEFT;RANG .5E-3;*OPC?" + CHR$(10) + CHR$(13)
PRINT #ScopeComms%, ScopeCommand$;
CALL WaitForScopeReply(ScopeComms%)

'StopTime! = TIMER - StartTime!
'PRINT
'PRINT "Time to setup scope for Test 1 ="; StopTime!

END SUB

'**************** SUBPROGRAM TO SET THE SCOPE FOR TEST 10 *****************
'
SUB ScopeTest10 (ScopeComms%, NewTest%)

'NewTest% = 1: Reset the scope & send the full set of commands
'NewTest% = 0: Alter the scope setup slightly from the previous test setting

'*** Start timer
'StartTime! = TIMER

'*** Flush the Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) = 0

IF NewTest% = 1 THEN

		ScopeCommand$ = "*RST;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN1;:VIEW CHAN2;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN1:PROB X10;COUP AC;RANG 8;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN2:PROB X10;RANG 16;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN3:RANG HIGH;OFFS 2;COUP GND;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TRIG:MODE NORM;SOUR CHAN1;LEV 1.5;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TIM:REF LEFT;RANG .5E-3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

	ELSE

		ScopeCommand$ = ":CHAN1:COUP AC;RANG 8;OFFS 0;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TRIG:SOUR CHAN1;LEV 1.5;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TIM:REF LEFT;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

END IF

'StopTime! = TIMER - StartTime!
'PRINT
'PRINT "Time to setup scope for Test 4, 5 & 8 ="; StopTime!; "seconds"

END SUB

'*************** SUBPROGRAM TO SET THE SCOPE FOR TESTS 2 & 3 ****************
'
SUB ScopeTest23 (ScopeComms%, NewTest%)

'NewTest% = 1: Reset the scope & send the full set of commands
'NewTest% = 0: Alter the scope setup slightly from the previous test setting

'*** Start timer
'StartTime! = TIMER

'*** Flush the Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) = 0

IF NewTest% = 1 THEN

		ScopeCommand$ = "*RST;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN1;:VIEW CHAN2;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN1:PROB X10;RANG 1.6;OFFS 1;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN2:PROB X10;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN3:RANG LOW;OFFS .4;COUP GND;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		'ScopeCommand$ = ":TRIG:MODE NORM;SOUR CHAN3;*OPC?" + CHR$(10) + CHR$(13)
		'PRINT #ScopeComms%, ScopeCommand$;
		'CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TIM:REF LEFT;RANG .5E-3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

	ELSE

		ScopeCommand$ = ":CHAN1:COUP DC;OFFS 1;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)
END IF

'StopTime! = TIMER - StartTime!
'PRINT
'PRINT "Time to setup scope for Test 2 & 3 ="; StopTime!; "seconds"

END SUB

'************ SUBPROGRAM TO SET THE SCOPE FOR TESTS 4, 5, 7b & 8 ************
'
SUB ScopeTest457b8 (ScopeComms%, NewTest%)

'NewTest% = 1: Reset the scope & send the full set of commands
'NewTest% = 0: Alter the scope setup slightly from the previous test setting

'*** Start timer
'StartTime! = TIMER

'*** Flush the Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) = 0

IF NewTest% = 1 THEN

		ScopeCommand$ = "*RST;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN1;:VIEW CHAN2;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN1:PROB X10;RANG 16;OFFS 5.5;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN2:PROB X10;RANG 16;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN3:RANG HIGH;OFFS 2;COUP GND;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TRIG:MODE NORM;SOUR CHAN3;LEV 2.3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TIM:RANG .5E-3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

	ELSE

		ScopeCommand$ = ":CHAN1:RANG 16;OFFS 5.5;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN2:RANG 16;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)
	 
		ScopeCommand$ = ":CHAN3:RANG HIGH;OFFS 2;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TRIG:MODE NORM;SOUR CHAN3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TRIG:POL POS;LEV 2.3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TIM:REF CENT;RANG .5E-3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

END IF

'StopTime! = TIMER - StartTime!
'PRINT
'PRINT "Time to setup scope for Test 4, 5 & 8 ="; StopTime!; "seconds"

END SUB

'**************** SUBPROGRAM TO SET THE SCOPE FOR TEST 6 ******************
'
SUB ScopeTest6 (ScopeComms%, NewTest%)

'NewTest% = 1: Reset the scope & send the full set of commands
'NewTest% = 0: Alter the scope setup slightly from the previous test setting

'*** Start timer
'StartTime! = TIMER

'*** Flush the Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) = 0

IF NewTest% = 1 THEN

		ScopeCommand$ = "*RST;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN1;:VIEW CHAN2;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN1:PROB X10;RANG 16;OFFS 5.5;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN2:PROB X10;RANG 16;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN3:RANG HIGH;OFFS 2;COUP GND;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TRIG:MODE NORM;SOUR CHAN3;LEV 2.3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TIM:RANG 5E-3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

	ELSE

		ScopeCommand$ = ":TIM:RANG 5E-3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

END IF

'StopTime! = TIMER - StartTime!
'PRINT
'PRINT "Time to setup scope for Test 6 & 7a ="; StopTime!; "seconds"

END SUB

'*************** SUBPROGRAM TO SET THE SCOPE FOR TEST 7a *******************
'
SUB ScopeTest7a (ScopeComms%, NewTest%)

'NewTest% = 1: Reset the scope & send the full set of commands
'NewTest% = 0: Alter the scope setup slightly from the previous test setting

'*** Start timer
'StartTime! = TIMER

'*** Flush the Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) = 0

IF NewTest% = 1 THEN

		ScopeCommand$ = "*RST;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN1;:VIEW CHAN2;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":VIEW CHAN3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN1:PROB X10;RANG 16;OFFS 5.5;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN2:PROB X10;RANG 16;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":CHAN3:RANG HIGH;OFFS 2;COUP GND;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TRIG:MODE NORM;SOUR CHAN3;LEV 2.3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

		ScopeCommand$ = ":TIM:REF LEFT;RANG 5E-3;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

	ELSE

		ScopeCommand$ = ":TIM:REF LEFT;*OPC?" + CHR$(10) + CHR$(13)
		PRINT #ScopeComms%, ScopeCommand$;
		CALL WaitForScopeReply(ScopeComms%)

END IF

'StopTime! = TIMER - StartTime!
'PRINT
'PRINT "Time to setup scope for Test 6 & 7a ="; StopTime!; "seconds"

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 WAIT FOR THE SCOPE'S OPC BIT TO BE SET *********
'
SUB WaitForScopeReply (ScopeComms%)

'This routine cheats a little, in that it does not check for a 1 returned
'by the preceding *OPC? queery, but simply waits for the <LF> character
'to be returned, and assumes the OPC bit (Operation Complete) is set.

'*** Wait for character in Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) > 0

'*** Read everything until & including <LF> character
x% = 0
DO
	ScopeChar$ = INPUT$(1, #ScopeComms%)
	'x% = x% + 1
	'PRINT x%;
	'PRINT ScopeChar$;
	'PRINT ASC(ScopeChar$)
LOOP UNTIL ASC(ScopeChar$) = 10

'*** Flush the Scope Port Buffer
DO: LOOP UNTIL LOC(ScopeComms%) = 0

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

