7526 Sample CFR
---------------
The CFRSMP26.C source file contains a sample Custom Function Routine (CFR) for
use with the 7526 Data Collection Terminal.  The program products Data
Collection Control/2 and Data Collection Connection are offered to facilitate
configuring and loading of the 7526 with the CFR, and then to control the data
collection terminals.

This CFR operates in mode 1 (as extensions to the 7526 transaction programming
command set), and contains several (largely unrelated) routines callable by the
7526 transaction program by specifying a sub-function name within the parameter
string.

o Set baud rate, parity, etc. for optional Serial 1 & 2 ports. See Initialize
  an RS-232 Port.

o Read from optional serial 1 & 2 ports.  See Read From an RS-232 Port.

o Send to optional serial 1 & 2 ports.  See Send to an RS-232 Port.

o Print on parallel printer with spooling and error recovery. See Print to the
  Parallel Printer Port.

o Logical string comparison for contents of 2 user variables. See String
  Compare.

o Logical integer comparison for contents of 2 user variables. See Integer
  Compare.

o Integer add/subtract/divide/multiply of 2 user variables. See Integer
  Arithmetic.

o Digital input point counter sampling and reseting, increment and decrement
  by one. See Digital Input Point Counters.

o Digital input point count rate measurement. See Digital Input Rate
  Measurement.

o Clear and restore a pop-up window. See Clear and Restore Pop-Up Window.

o Get the current time and date and return them in user variables. See Time
  and Date Stamp Retrieval.

o Handle both sensors ports independently as Time/Attendance clocks. See
  Dual Sensor Port Handle for 2 Controlled Doors/Gates.

o Allow variable delay time of 5 mS to 5 minutes, in 5 mS increments. See
  Variable Program Delay with Fine Granularity.

o Checking of data for uniqueness among a sliding list of the last X number of
  reads.  This is useful for counting scanned items when the operator may
  accidentally re-scan an item already done.  See Unique Data Checking -- A
  Rolling Exclusive Validation.

o Send a remote validation request to DCC/2 1.02 or later.  See Send Remote
  Validation Request to DCC.

o Wait for a specified duration for a user variable to be set by the host
  application.  See Wait for Host to Set a User Variable.

o General-purpose keypad and scanner input routine with input format rules and
  cursor control.  See Advanced Read Function.


CFR Usage
--------
Details of function and usage are described below, as are explanations of error
codes which the CFR may report back on the 7526's screen.

The CFR is called by placing a Call CFR command in the 7526 transaction
program.  Pop-up windows in DCC/2/DCConnect guide you through this procedure.

In the CCFR (Call CFR) pop-up window, always set the funtion number to '3', and
the parameter string exactly as shown in the description of the functions
below.


Compiling and Linking
---------------------
Several compiled versions of the sample CFR are included in this package.  You
can also use the compile/link information in the source file header to
customize it further.

The size and function of the executable can easily be manipulated by
commenting-out the associated "#define", which then is used by the "#if
defined" logic to skip that section during compiling.

The CFRUTL26.LIB and CFRUTL26.H files are required to build the sample CFR.
This sample library of functions (with source code) can be obtained from the
7526 web page:

  ftp://ftp.software.ibm.com/software/dcconnect/hardware/7526/7526stuf.htm

Of course you also need CFRAPI26.H and CFRAPI26.LIB - also available from this
web page.

Sample make files are provided for building with the IBM C/2 1.10 compiler
(IBM_SAMP.MAK) and with the Borland Turbo C++ 3.0 for DOS compiler
(BOR_SAMP.MAK).  Be sure to pick the proper version of CFRAPI26.LIB and
CFRUTL26.LIB based on the compiler being used.


Read From and RS-232 Port
-------------------------
Read characters which have been recieved or are in process of being received on
an optional RS-232 port and append them to a target terminal user variable.

Data will be read until any of the specified conditions becomes true:

o A timeout occurs while waiting for characters to arrive.  Each character
  which arrives resets the timer.  The default is 10 seconds.  Use 000 for no
  time limit.

o A stop character is reached.  Specify the decimal value of the ASCII
  character (i.e.  Carriage return is 013).  The default is a null-character
  (000).  The stop character is returned as the last character in the target
  user variable.

o A maximum length of data has been received.  The default is 100.

This function requires 7526 microcode 3.0 or later and an
Ethernet-Serial-Parallel or Serial-Parallel communications adapter.

Note:  While the parameter string for this function may have a variable number
       of elements and does not require precise character column alignments, it
       does require exact spelling for the setting items.  Any mis-spelled
       items will be ignored.


CCFR Format:

  Function 3
  Parameters:
    READ SERIAL_n TARGET VAR(nnn) [TO CHAR(XXX)] [TIMEOUT(ttt)]
                              [TO LENGTH(lll)]

  where n is 1 or 2 for SERIAL 1 port or SERIAL 2 port,
  nnn is the target user variable number for the incoming data.
  XXX is the decimal value of an optional end-of-data character
  lll is the optional maximum length to read
  ttt is the optional timeout for incoming characters (seconds).
      Use 000 for no time limit.

Returns:    NO_SKIP when data received without timeout
            SKIP when a timeout occurs or when the operator
                 presses the shift-Clear key sequence during the
                 receiving process.

Errors:     S1  Invalid SERIAL_n specified
            S2  Invalid user variable specified
            S3  No user variable source or target specified
            S4  No serial-parallel comm adapter found, or not 3.0
                microcode on 7526 machine.
            S5: Target user variable filled with incoming data


Send to an RS-232 Port
----------------------
Send the contents of a terminal user variable to an attached device via one of
the 2 optional RS-232 serial ports.  The function returns when all data has
been moved to the serial port transmit buffer.

This function requires 7526 microcode 3.0 or later and an
Ethernet-Serial-Parallel or Serial-Parallel communications adapter.

Note:  While the parameter string for this function may have a variable number
       of elements and does not require precise character column alignments, it
       does require exact spelling for the setting items.  Any mis-spelled
       items will be ignored.

CCFR Format:

  Function 3
  Parameters:
    SEND SERIAL_n SOURCE VAR(nnn)

   where n is 1 or 2 for SERIAL 1 port or SERIAL 2 port, and
   nnn is the user variable number containing the data to be sent.

   Special characters may be encoded in the user variable data as
   strings of "/xnn" where 'nn' is the hexidecimal value of the
   desired character (for example, "/x00" would send a NULL to the
   serial port; "/x0D" would send a linefeed character).

 Returns:    NO_SKIP always

 Errors:     S1  Invalid SERIAL_n specified
             S2  Invalid user variable specified
             S3  No user variable source or target specified
             S4  No serial-parallel comm adapter found, or not 3.0
                 microcode on 7526 machine.


Initialize an RS-232 Port
-------------------------
Set the asynchronous communications parameters for an optional RS-232 serial
port.  If any parameters are being changed from the current port setting, this
will result in automatic purging of any non-read characters in the receive
buffer and of any non-sent characters in the transmit buffer.  If no parameters
are different from the current port settings, then this function will return
without doing any work (thus preserving the data in the buffers).  You can also
request that the data be purged regardless of the port settings (this is useful
for getting rid of any old incoming data which you don't want any more).

This function requires 7526 microcode 3.0 or later and an
Ethernet-Serial-Parallel or Serial-Parallel communications adapter.

Note:  While the parameter string for this function may have a variable number
       of elements and does not require precise character column alignments, it
       does require exact spelling for the setting items.  Any mis-spelled
       items will be ignored.

CCFR Format:

 Function 3
 Parameters:
   1) To set and always clear (purge) the buffers:
       Parameters =
   SET PURGE SERIAL_n BAUD_nnnn PARITY_nnnn STOP_BITS_n DATA_BITS_n

   2) To set only if SERIAL_n parameters are being changed from their
      current vlaue (this method avoids purging the RX/TX buffers
      so it may be called whenever in doubt about the port settings):
       Parameters =
   SET SERIAL_n BAUD_nnnn PARITY_nnnn STOP_BITS_n DATA_BITS_n

 SERIAL_n may be either SERIAL_1 or SERIAL_2, as marked on the card ports.
 Choices for nnnn in BAUD_nnnn include 110, 150, 300, 1200, 2400, 4800
 9600 and 19200;  Parity choices include PARITY_NONE, PARITY_ODD, and
 PARITY_EVEN;  Stop bit choices include STOP_BITS_1 and STOP_BITS_2;
 Data bits choices include DATA_BITS_6, DATA_BITS_7, and DATA_BITS_8.

 You need not set all values during a SET SERIAL_n call.
 Values which have not explicitly set since start-up of the 7526
 will default to 9600 baud, No parity, 1 stop bit, and 8 data bits,
 respectively.

 Returns:    NO_SKIP always

 Errors:     S1  Invalid SERIAL_n specified
             S4  No serial-parallel comm adapter found, or not 3.0
                 microcode on 7526 machine.

Print to the Parallel Printer Port
----------------------------------
Send the contents of a terminal user variable to an attached parallel printer
via the parallel port.  If no Ethernet-Serial-Parallel or Serial-Parallel card
is installed the standard processor board port is used, otherwise the port on
the optional card is always used.  The function returns when all data has been
moved to the parallel port transmit buffer.

This CFR-based function will be prefered by some users as it will spool the
print data to the printer over time as the printer accepts the data, and it
exercises more error recovery than the basic transaction program SEND TO
PRINTER function.

This function requires 7526 microcode 2.0 or later and a printer-capable
processor card(**).  An Ethernet-Serial-Parallel or Serial-Parallel
communications adapter is optional.

This function will wait up to 15 seconds for the printer to accept additional
characters to its input buffer.  It will detect various printer error
conditions, and display an error message on the 7526 if you have set it in
COMPLAIN mode.


CCFR Format:

  Function 3
  Parameters:

   PRINT FROM VAR(nnn) [COMPLAIN]

   where nnn is the user variable number
   COMPLAIN is an optional flag which say you want printer errors to be
   shown on a pop-up screen.

 Returns:    NO_SKIP is always returned

 Errors:     P1  No source user variable (FROM VAR) specified
             P2  Invalid user variable specified


Send Remote Validation Request to DCC
-------------------------------------
This function requires 7526 microcode 2.0 or later PLUS DCC/2 version 1.02 or
later.

Because DCC/2 1.02 does not allow you to specify that a validation file is NOT
to be downloaded to the terminal after it is referenced in a transaction
program, you cannot get remote validation from a 7526 to work WHEN YOU WANT
DCC/2 TO DO THE FILE SEARCH.  (If you have a program-based validation which
does DccReadValidation..  calls, then you can specify the validation in the
.PGM file instead of using this function).

This CFR function is used in place of a VRFY transaction program call.

CCFR Format:

  Function 3

  Parameters =

    VERIFY- VAR(XXX) IN FILE name.ext

     where  XXX is the user variable number in which to find the
            data to be checked.  Pad on the left with 0's.(e.g. 003)
     where  name.ext is the file name which you want DCC/2 to
            search and respond to.




Advanced Read Function
----------------------
This function tailors a keypad and / or sensor port read to your exact
requirements .

CCFR Format :

  Function 3

  Parameters =

   READ CHAR LEN=LL FROM KS AT RR, CC TIME=TTT VAR=YYY
        INTE             KY
        REAL             NK
        EURO             SR
        AMER             NS
        TIME

 Returns:    ABORT  if timed out waiting for input
             NO_SKIP if data input OK
             ABORT if user pressed CLEAR or terminal received
                   off-line command.

 where CHAR is character data
       INTE is integer data
       REAL is real number data (decimal point)
       EURO is a European-format date: DD-MM-YY
       AMER is a North American-formated date: DD-MM-YY
       TIME is a standard time format of HH:SS
       LL is the data length (1-39)
       KS allows keypad or sensor port input
       KY allows keypad only
       NK allows numeric keypad only
       SR allows sensor only
       NS allows numeric keypad or sensor
       RR is the input field row
       CC is the input field starting column
       TTT is the input time limit (seconds, specify 000 for no limit
       YYY is the user variable to return data in.
           Any data in the variable when the function is called is used
           as pre-fill data for the field


Unique Data Checking - A Rolling Exlusive Validation
----------------------------------------------------
This function checks that the data in a user variable is not identical to one
of the last X inputs checked.  X is set to 10, but may be easily changed in the
defines section of the code.  Data checked may be up to 25 characters long.

There are 2 lists kept (again, this may be easily changed to more/less in the
#defines section).  The list tracks the last X unique reads -- reading the same
item X times will NOT result in the list being full of the same data.  A call
can be used to reset the list to empty.

CCFR Format:

  Function 3

  Parameters = CHKUNIQ-VAR XX IN LIST Y
               CHKUNIQ-REFRESH LIST Y

         where
                     XX is the user variable whose contents will be
                        checked

                     Y  is the list to use (1, 2, etc)


If the data is unique, returns SKIP, else returns NO_SKIP


Time and Data Stamp Retrieval
-----------------------------
Obtain the current time and date in the user variables of your choice.

CCFR Format:

  Function 3

  Parameters =

   TM_DATE-yy HR V(ttt) zzzz DATE V(ddd)
             24           EURO
             12           AMER

     where   yy is set to "12" or "24", indicated the time format
            ttt is the UV desired for the time string output
                (001 to 998)
           zzzz is the date format; EURO==DD-MM-YY, AMER==MM/DD/YY
            ddd is the UV desired for the date string output
                (001 to 998)
            ttt and ddd may be the same variable number.  In that
                case, the time comes first, followed by a space and
                then the date.


Digital Input Point Counters
----------------------------
Sample or reset one of the 32 long-integer(**) counters and return (appended to
a user variable) a character representation of its value.

The counters all operate in the background, even when the terminal is offline.
They are non-volatile, so values are not lost during a power off/on cycle.
Reloading the CFR will wipe them out.

The counters require a minimum pulse width of 25 mS for program-debounced
counters in order to detect a change of state.  This means the maximum count
rate is 20 cycles per second (25 mS high, 25 mS low equals 50mS cycle time).

The 7526 also does high-speed counting of changes in input state, with the
assumption that an electronic input is being used which does not exhibit signal
bouncing characteristics.  These counters may run at up to 1000 cycles per
second when only a single point is active.

CCFR Format:

 Function 3

 1) To sample a counter and append to a user variable:

     Parameters =   DICOUNT-SAMPL CTR(ccc) TO VAR(vvv)

 2) To reset a counter to 0:

     Parameters =   DICOUNT-.RESET CTR(ccc)

 3) To increment a counter by 1:

     Parameters =   DICOUNT-INCRT CTR(ccc)

 4) To decrement a counter by 1:

     Parameters =   DICOUNT-DECRT CTR(ccc)


   where

                 ccc is the counter to work with:
                       000-007 for code-debounced, low speed counters
                       100-107 for high speed, externally-debounced
                               counters.
                      for DI points 0 through 7, respectively.
                      Both high speed and low speed counters are always
                      maitained for all DI points.  The change of state
                      (e.g. high to low, or low to high) which causes the
                      count to increment is set in the terminal
                      configuration parameters for the parallel port.

                 vvv is the user variable to return the number in as
                       as a string (01-19) and is not required if a
                       Reset call is being made

        Returns: NO_SKIP


Digital Input Rate Measurement
------------------------------
Sample the incoming pulse rate on a DI point, or put a value in the sampling
time base for the next and subsequent samples to use.  The time base determines
how long the sample will take, and is specified in units of 5 mS.  Thus, the
default value of 200 will cause a 1 second program delay as the counter is
allowed to accumulate for 1 second (200 * .005 = 1 second).

CCFR Format:

  Function 3

  1) To sample the rate of counter inputs to a user variable:

     Parameters = DI_RATE-SAMP CTR(ccc) TO VAR(vvv)

  2) To put the sample time base equal to the numeric value
     now contained in a user variable string:

    Parameters = DI_RATE-PUT TIME BASE TO VAR(vvv)


  where
                 ccc is the counter to work with (000 - 007 ,
                     100 - 107, as described in Digital Input Point Counters).

                 vvv is the user variable to return the number in as
                      as a string (001-998) and is not required if a
                      Reset call is being made

       Returns:  CONTINUE


Clear and Restore Pop-up Window
-------------------------------
This function is useful for providing error or information messages to the
terminal operator.

On the first call to this function, it copies all characters from the current
display into a storage area and then clears the display to create a pop-up
window.  Your transaction program can then present a message or prompt for some
time or until the operator takes an action.  On the second call to this
function, the screen is re-cleared and the original text is re-displayed.

The window encompasses the full display size of the 7526.

Upon return from a 'Clear' call, the transaction program may fill in the
desired text inside the window, starting at line 1, column 1.

When called to 'Restore' a window, the original text is restored.

Calls to Refresh if no Clear has been called are rejected.

CCFR Format:

  Function 3

  1) To clear a pop-up panel:

       Parameters = POPUPWN-CLEAR

  2) To restore the original text and attributes:

       Parameters = POPUPWN-RESTORE


String Compare
--------------
Compare the strings in 2 user variables.  Returns SKIP or NO_SKIP as desired
for a true condition.  Test can be:

  yyy exactly equals (EQ) zzz
  yyy not equal (NE) zz
  yyy greater than (GT) zzz
  yyy less than (LT) zzz
  yyy greater than or equal to (GE) zzz
  yyy less than or equal to (LE) zzz


CCFR Format:

  Function 3

  Parameters =   COMPARE-V(yyy) cc V(zzz) TRUE RC=rc
                                EQ                NO_SKIP
                                NE                SKIP
                                GT
                                LT
                                GE
                                LE

  where

                 yyy is the first user variable number holding
                     a string.

                  cc is the two-letter condition test code

                 zzz is the second user variable holding a string

                  rc is the return code desired if the condition is
                     true.

  Returns: NO_SKIP or SKIP based on rc setting


Integer Compare
---------------
Compare the integers in 2 user variables.  Returns SKIP or NO_SKIP as desired
for a true condition.  Test can be:

  yyy exactly equals (EQ) zzz
  yyy not equal (NE) zz
  yyy greater than (GT) zzz
  yyy less than (LT) zzz
  yyy greater than or equal to (GE) zzz
  yyy less than or equal to (LE) zzz

CCFR Format:

  Function 3

  Parameters =   CMP_INT-V(yyy) cc V(zzz) TRUE RC=rc
                                EQ                NO_SKIP
                                NE                SKIP
                                GT
                                LT
                                GE
                                LE

  where

                 yyy is the first user variable number holding
                     a string.

                  cc is the two-letter condition test code

                 zzz is the second user variable holding a string

                  rc is the return code desired if the condition is
                     true.

  Returns: NO_SKIP or SKIP based on rc setting


Integer Arithmetic
------------------
Perform simple math on 2 user variables.  Result is string appended to user
variable 1.


CCFR Format:

  Function 3

  Parameters = INTMATH-V(yyy) o V(zzz)
                              +
                              -
                              *
                              /


  where
                 yyy is the first user variable number holding
                     a string.

                  o  is the operation letter (+, -, *, / )

                 zzz is the second user variable holding a string

  This function always returns NO_SKIP


Wait for Host to Set a User Variable
------------------------------------
This function allows better control when using user variables as data transfer
or flag areas between the host application and the terminal.  The usual
transaction program construct of TEST and GOTO will keep trying forever or
until the operator presses CANCEL.  This CFR function allows you to set a time
limit on how long the terminal will wait for the host, and gives return codes
indicating whether the host data was received, the time out was reached, or the
operator pressed Cancel.

CCFR Format:

  Function 3

  Parameters:

         WAIT_UV-VAR XXX FOR YYY SECONDS

         where XXX   is the terminal user variable to check/wait on

               YYY   is the number of seconds to wait for host data

  Returns:    NO_SKIP If timed out waiting for host
              SKIP if host data received OK
              ABORT if user pressed CANCEL or terminal received
                    off-line command.

Example:


  Wait for user variable 10 for 15 seconds

    Function:    3

    Parameters:  WAIT_UV-VAR 003 FOR 015 SECONDS




Variable Program Delay with Fine Granularity
--------------------------------------------
This function allows programmable delay periods in a transaction program with
delays as short as 5 milliseconds, or as long as 5.46 minutes, with granularity
of 5 milliseconds.

The delay time is specified as a quantity of 5 millisecond delays, from 1 to
65,535 units.  Examples are:

  1/10 second:  V_DELAY 20       ( 0.1/.005 = 20  )
  1/2  second:  V_DELAY 100
  3/4  second:  V_DELAY 150

CCFR Format:

  Function 3

  Parameters:

    V_DELAY xxxxx

  where

    xxxxx        is the variable-length quantity of
                 5 mS intervals to be delayed.  This number
                 may be from 1 to 5 digits in length.


Dual Sensor Port Handle for 2 Controlled Doors/Gates
----------------------------------------------------
This function handles Handles 2 independent bar code readers, allowing separate
validation files and digital output control points.  For optimum performance,
install the HIGH PERFORMANCE BAR CODE READING COPROCESSOR to provide 2
independent bar code decoding systems.  This will give simultaneous decoding on
both ports, coupled with pseudo-simultaneous processing of the decoded data.

The CFR controls 6 of the digital output points on the terminal:

  Door strike ('Go') for port A (Validation passed):  DO 0
  'Go' light for port A         (Validation passed):  DO 1
  'Stop' light for port A       (Validation failed):  DO 2

  Door strike ('Go') for port B (Validation passed):  DO 3
  'Go' light for port B         (Validation passed):  DO 4
  'Stop' light for port B       (Validation failed):  DO 5

Depending on how the program was compiled, the CFR will either use the default
Validation API (resulting usually in a sequential search), or it will use the
binary validation method found in the CFRUTL26 sample library.  See the BINARY
#define for setting the compile option.

The CFR function expects to find the first bar code input in user variable 0.
This may be set up either by establishing a badge-initiated transaction which
calls the CFR as its only required instruction step, or using another
transactions program which performs an input step to get the badge data.

Format:

  Function 3

  Parameters:

    2_DOORS "filept_A.ext" "filept_B.ext"

  where
             filept_A.ext is the verification file to be used for
                          the reads from port A.  Enclose in " marks.
                          Valid names are "2" through "7" or any
                          regular DOS filename.extension-type name.
                          If no validation is required, then use
                          a filename of "0".

             filept_B.ext is like above, but for port B.  May repeat
                          using the same file name as for port A.

To change the default door strike activation duration from 1 second to some
other value, call the function using the parameters below.  For simplicity, use
this function before all calls which do a badge validation.

  2_DOORS DURATION=X

where X is the number of seconds (1-9) for the duration.v


Error Codes
-----------
If the simple parser for the command parameter strings does not find exactly
what it expects in certain character positions, or finds parameters out of
range, it will show a "Bad CFR xx:..." error message on the first line of the
7526's display.  The "xx" is filled with an error code, and then the first few
character of the actual parameter string used in the CCFR call are shown.

To avoid getting parsing errors, you must strictly observe the spelling spaces,
and padding of user variable or counter numbers to 3 digits (e.g.  type "001",
not "1").

Error codes are:

  COMPARE / CMP_INT / INTMATH
  ---------------------------
  C1: Too few characters in parameter string for COMPARE call
  C2: Invalid user variable number in "yy" text
  C3: Invalid user variable number in "zz" text
  C4: Invalid True return code type specified
  C5: Invalid logical compare operator or arithmetic operator

  DICOUNTER / DI RATE COUNTER
  ---------------------------
  D1: Too few characters in parameter string of a DI counter call
  D2: Invalid counter number, must be 00 to 07
  D3: Too few characters in parameter string of a DI counter SAMPLE
      call.
  D4: Invalid user variable in DI counter sample call
  D5: Invalid usage of DI counter function: Not SAMPLE or RESET
  DA: Too few characters in parameter string of a DI counter rate call
  DB: Invalid counter number, must be 00 to 07 OR 100 to 107
  DC: Bad user variable number in Sample rate counter call
  DD: Bad user variable number in Put rate time base call
  DE: Not a recognized call of Sample or Put

  TIME/DATE STAMP
  ---------------
  E1: Too few chars in parm string of time/date stamp call
  E2: Invalid UV for time stamp output
  E3: Invalid UV for date stamp output
  E4: Invalid time format -- must be 12 or 24
  E5: Invalid date format -- must be "AMER" or "EURO"

  GENERAL
  -------
  M1: CFR identifying name in parameter string was not recognized
  M2: CFR call could not fit desired output into specified user var

  PRINTER PORT
  ------------
  P1: No source user variable (FROM VAR) specified
  P2: Invalid user variable specified

  POP-UP WINDOW
  -------------
  P3: Too few characters in parameter string of a pop-up window clear
      call

  REMOTE VALIDATION / READ
  ------------------------
  R1: Too few characters in the calling parameter string.
  R2: Invalid user variable used in calling string.


  SERIAL PORT FUNCTIONS
  ---------------------
  S1: No valid serial port name used (e.g. SERIAL_1, SERIAL_2)
  S2: Invalid user variable specified
  S3: No user variable source or target specified
  S4: No serial-parallel comm adapter found, or not 3.0
      microcode on 7526 machine.
  S5: Target user variable filled with incoming data

  UNIQUE DATA CHECKING
  --------------------
  U2: Not enough characters in call to check uniqueness
  U3: Invalid user variable
  U4: Invalid list number
  U5: Not enough characters in call to refresh

  VARIABLE DELAY
  --------------
  V1: Too many characters in delay quantity, or delay quantity
      text starts too far after the V_DELAY identifier.

  WAIT FOR USER VARIABLE TO BE SET
  --------------------------------
  W2: Not enough characters in call to check uniqueness
  W3: Invalid user variable

  TWO BADGE READER HANDLER
  ------------------------
  21: No validation file names found
  22: Second validation file name not found
  23: Too many characters in parameter string
  25: Validation file name invalid, or validation data too long
  26: Not enough room on tranaction record to append data