### X-keys 128 Key Keyboard Data Report | Main Page

General Information

VID | 05f3h
PID (w Magnetic Strip Reader ) | 305h or 773
PID (w/o Reader ) | 306h or 774
PID (w Bar Code Reader ) | 307h or 775
Consumer Usage Page | 1
Usage Page | 000Ch or 12

X-keys 128 Key Keyboard Input Report

Figure 1: X-keys 128 Key Keyboard key reference.

Endpoint: 1, consumer usage page

Report Length: 32 bytes.

1. General Incoming Data.
This is received when keys are pressed, position of the 8 Position Locking Switch changes, Unit ID or input on the Footpedal (RJ11) port is detected.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Bytes 5-20 | Bytes 21-31 | Byte 32
Constant | Foot pedal (RJ11) Port | 8 Position Locking Switch | Data Type Designation | Columns A to P | Reserved | Unit ID (0-255)
0 | Digital1 | Digital2 | Value | Digital3 | 0 | <data>

Digital1: For all bits 0 if pedal is up, 1 if pedal is down. Bit 1=Left pedal, Bit 2=Middle peddle, Bit 3= Right pedal.
Digital2: Bit 1=Position 0, Bit 2=Position 2, Bit 3=Position 3, Bit 4=Position 4, Bit 5=Position 5, Bit 6=Position 6, Bit 7=Position 7, Bit 8=Position 1
Value: 122 (7Ah) for general incoming data, 121 (79h) for check dongle,
Digital3: For all bits 0 if key is up, 1 if key is down. Bits 1 to 8 correspond to rows 1-8 respectively of the given column. For example Byte 5 gives the state of A1, A2, A3, A4, A5, A6, A7 and A8. A value of 67 in this byte would indicate that A1, A2 and A7 are pressed.

2. Barcode or Magnetic Strip Data.

This data is received when a valid card is swiped through the barcode or magnetic strip reader.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Bytes 5-31 | Byte 32
Constant | Always 0 | Always 0 | Message Length | Message Data | Unit ID (0-255)
0 | 0 | 0 | MsgLen | MsgData | <data>

MsgLen: The number of bytes of the following message. The maximum value is 27. If this number is not 122 (7Ah) then barcode/magnetic strip data is being received. MsgData: Incoming message data from the barcode reader or magnetic strip reader. Depending on the length of the total message it may take several ReadData() calls or callback notifications to collect it all. After all barcode/magnetic strip data has been read a 122 (7Ah) will appear in Byte 4.

3. Descriptor

The descriptor contains information about the device. The descriptor is received after a Request for Descriptor output report is sent, see Output Reports below.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Byte 11 | Bytes 12-32
Constant | Vendor ID high | Vendor ID low | PID high | PID low | Rev high | Rev low | Unit ID | Read Report Length | Write Report Length | Report Rate | Reserved
0 | 5 | 243 (F3h) | 3 | PIDlow | RevH | RevL | <data> | 32 | 9 | RR | 0 or value

PIDlow: The low byte of the PID (Product ID) which for the X-keys 128 with barcode reader is 7. To calculate PID=PID high*256+PIDlow =3*256+7=775 or 307h.
REVH: Bit 8=1 always. Bits 1 to 7 are the high byte of the chip firmware revision.
REVL: The low byte of the chip firmware revision.
RR: The report rate is how often data is spontaneously refreshed if nothing is “forcing” a refresh such as pressing keys or sliding cards. The X-keys 128 and 84 devices have a report rate of 32 which equates to approximately 500ms.

X-keys 128 Key Keyboard Output Report

The following types of output reports are shown in the summary below.

Report Length: 9 bytes.

Report | Format | Description
--- | --- | ---
1 | 0*, 150, LEDS, 0, 0, 0, 0, 0, 0 | Set LEDs
2 | 0*, 137, 137, 0, 0, 0, 0, UnitID, 16 | Set Unit ID
3 | 0*, 137, 137, 0, 0, 0, 0, 0, 132 | Request Descriptor
4 | 0*, 137, 137, 0, 0, 0, 0, BeepCtrl, 18 | Beep on keypress
5 | 0*, 151, PR2, DR2, 0, 0, 0, 0, 0 | Beep device at specified period and duration
6 | 0*, 205, 0, 0, K1, K2, K3, K4, 220 | Set key for dongle implementation
7 | 0*, 137, 137, 0, A1, A2, A3, A4, 121 | Check key for dongle implementation

*In most cases this number is 0. This number is read from the input report.

1. Set LED State

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | LED Command | LED state | Constant | Constant | Constant | Constant | Constant | Constant
0 | 150 | LEDs | 0 | 0 | 0 | 0 | 0 | 0

LEDs: Bit 1=LED for Function 1, bit 2=LED for Function 2, bit 3=LED for Function 3, bit 4=LED for Function 4, bit 5=0, bit 6=0, bit 7= 0, bit 8=0.
Example: A value of 7=1+2+4 would turn on the Function 1, 2 and 3 LEDs.

2. Set Unit ID
The Unit ID is a value between 0 and 255 which can be set and read. This number stays permanently in the device independent of computer. It is useful if more than one device of the same PID will be connected to the same computer in order to distinguish the devices uniquely.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | General Command | General Command | Constant | Constant | Constant | Constant | Unit ID (0-255) | Unit ID Command
0 | 137 | 137 | 0 | 0 | 0 | 0 | value | 16

3. Request Descriptor

After sending this command the next ReadData or callback notification will be the descriptor data as described in Input Report 3., see above.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | General Command | General Command | Constant | Constant | Constant | Constant | Constant | Request Descriptor
0 | 137 | 137 | 0 | 0 | 0 | 0 | 0 | 134

4. Beep on keypress

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | General Command | General Command | Constant | Constant | Constant | Constant | Beep Control | Constant
0 | 137 | 137 | 0 | 0 | 0 | 0 | BeepCtrl | 18

BeepCtrl: 0=no beep, 1=beep. Bit 3= auto beep if key is pressed.

5. Beep at specified period and duration

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | Beep Command | Period of beep | Duration of beep | Constant | Constant | Constant | Constant | Constant
0 | 151 | PR2 | DR2 | 0 | 0 | 0 | 0 | 0

PR2: PR2=period/0.000016-1, the lower the value of PR2 the higher frequency will be the beep.
DR2: Duration=DR2*0.016 in seconds.

6. Set Key for Dongle Implementation
Use this command to write a key to the firmware of the unit for use as dongle protection.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | Set Key Command | Constant | Constant | Key Value 1 | Key Value 2 | Key Value 3 | Key Value 4 | Set Key command
0 | 205 | 0 | 0 | K1 | K2 | K3 | K4 | 220

K1: User chooses any number between 1 and 254, 0 and 255 not allowed.
K2: User chooses any number between 1 and 254, 0 and 255 not allowed.
K3: User chooses any number between 1 and 254, 0 and 255 not allowed.
K4: User chooses any number between 1 and 254, 0 and 255 not allowed.
The values for K1, K2, K3 and K4 must be recorded and saved for later in order to check the key. Non PC users of this feature please contact P. I. Engineering for further details.

7. Check Key for Dongle Implementation

This is half of the check key sequence needed to detect if a given unit is the proper dongle.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | General Command | General Command | Constant | Key Value 1 | Key Value 2 | Key Value 3 | Key Value 4 | Set Key command
0 | 137 | 0 | 0 | A1 | A2 | A3 | A4 | 121

A1: User chooses any number between 1 and 254, 0 and 255 not allowed.
A2: User chooses any number between 1 and 254, 0 and 255 not allowed.
A3: User chooses any number between 1 and 254, 0 and 255 not allowed.
A4: User chooses any number between 1 and 254, 0 and 255 not allowed.
After sending this command the next ReadData returns four values in byte position 5, 6, 7, and 8 (see X-keys 128 Input Reports number 4) that will be needed to continue with the hardware check of the key. Non PC users please contact P. I. Engineering for further details.

### X-keys 84 Key Keyboard Data Report

General Information

VID | 05f3h
PID (w Magnetic Strip Reader ) | 0308h or 776
PID (w/o Reader ) | 0309h or 777
PID (w Bar Code Reader ) | 030Ah or 778
Consumer Usage Page | 1
Usage Page | 000Ch or 12

X-keys 84 Key Keyboard Input Report

The following types of input reports are available; General Incoming Data, Bar Code or Magnetic Strip Data, Descriptor and Check Key.

Figure 2: X-keys 84 Key Keyboard key reference.

Endpoint: 1, consumer usage page

Report Length: 32 bytes.

1. General Incoming Data

This is received when keys are pressed, position of the 8 Position Locking Switch changes, Unit ID or input on the Footpedal (RJ11) port is detected.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Bytes 5-20 | Bytes 21-31 | Byte 32
Constant | Foot pedal (RJ11) Port | 8 Position Locking Switch | Data Type Designation | Columns A to L | Reserved | Unit ID (0-255)
0 | Digital1 | Digital2 | Value | Digital3 | 0 | <data>

Digital1: For all bits 0 if pedal is up, 1 if pedal is down. Bit 1=Left pedal, Bit 2=Middle peddle, Bit 3= Right pedal.
Digital2: Bit 1=Position 0, Bit 2=Position 2, Bit 3=Position 3, Bit 4=Position 4, Bit 5=Position 5, Bit 6=Position 6, Bit 7=Position 7, Bit 8=Position 1
Value: 122 (7Ah) for general incoming data, 121 (79h) for check dongle,
Digital3: For all bits 0 if key is up, 1 if key is down. Bits 1 to 7 correspond to rows 1-7 respectively of the given column. For example Byte 5 gives the state of A1, A2, A3, A4, A5, A6 and A7. A value of 67 in this byte would indicate that A1, A2 and A7 are pressed.

2. Barcode or Magnetic Strip Data

This data is received when a valid card is swiped through the barcode or magnetic strip reader.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Bytes 5-31 | Byte 32
Constant | Always 0 | Always 0 | Message Length | Message Data | Unit ID (0-255)
0 | 0 | 0 | MsgLen | MsgData | <data>

3. Descriptor

The descriptor contains information about the device. The descriptor is received after a Request for Descriptor output report is sent, see Output Reports below.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Byte 11 | Bytes 12-32
Constant | Vendor ID high | Vendor ID low | PID high | PID low | Rev high | Rev low | Unit ID | Read Report Length | Write Report Length | Report Rate | Reserved
0 | 5 | 243 (F3h) | 3 | PIDlow | RevH | RevL | <data> | 32 | 9 | RR | 0 or value

PIDlow: The low byte of the PID (Product ID) which for the X-keys 128 with barcode reader is 7. To calculate PID=PID high*256+PIDlow =3*256+7=775 or 307h.
REVH: Bit 8=1 always. Bits 1 to 7 are the high byte of the chip firmware revision.
REVL: The low byte of the chip firmware revision.
RR: The report rate is how often data is spontaneously refreshed if nothing is “forcing” a refresh such as pressing keys or sliding cards. The X-keys 128 and 84 devices have a report rate of 32 which equates to approximately 500ms.

4. Check Key

This message is received after the output report number 7 (see X-keys 84 Output Report number 7) is sent. The four values in bytes 4, 5, 6 and 7 are required to continue the check. Non PC users please contact P. I. Engineering for further details.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Bytes 9-32
Constant | Reserved | Reserved | Check Key | B1 value | B2 value | B3 value | B4 value | Reserved
0 | 0 | 0 | 121 (79h) | B1 | B2 | B3 | B4 | 0 or value

B1: Value need for comparison to check for correct dongle key.
B2: Value need for comparison to check for correct dongle key.
B3: Value need for comparison to check for correct dongle key.
B4: Value need for comparison to check for correct dongle key.

X-keys 84 Key Keyboard Output Report

The following types of output reports are shown in the summary below.

Report Length: 9 bytes.

Report | Format | Description
--- | --- | ---
1 | 0*, 150, LEDS, 0, 0, 0, 0, 0, 0 | Set LEDs
2 | 0*, 137, 137, 0, 0, 0, 0, UnitID, 16 | Set Unit ID
3 | 0*, 137, 137, 0, 0, 0, 0, 0, 132 | Request Descriptor
4 | 0*, 137, 137, 0, 0, 0, 0, BeepCtrl, 18 | Beep on keypress
5 | 0*, 151, PR2, DR2, 0, 0, 0, 0, 0 | Beep device at specified period and duration

*In most cases this number is 0. This number is read from the input report.

1. Set LED State

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | LED Command | LED state | Constant | Constant | Constant | Constant | Constant | Constant
0 | 150 | LEDs | 0 | 0 | 0 | 0 | 0 | 0

LEDs: Bit 1=LED for Function 1, bit 2=LED for Function 2, bit 3=LED for Function 3, bit 4=LED for Function 4, bit 5=0, bit 6=0, bit 7= 0, bit 8=0.
Example: A value of 7=1+2+4 would turn on the Function 1, 2 and 3 LEDs.

2. Set Unit ID
The Unit ID is a value between 0 and 255 which can be set and read. This number stays permanently in the device independent of computer. It is useful if more than one device of the same PID will be connected to the same computer in order to distinguish the devices uniquely.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | General Command | General Command | Constant | Constant | Constant | Constant | Unit ID (0-255) | Unit ID Command
0 | 137 | 137 | 0 | 0 | 0 | 0 | value | 16

3. Request Descriptor

After sending this command the next ReadData or callback notification will be the descriptor data as described in Input Report 3., see above.

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | General Command | General Command | Constant | Constant | Constant | Constant | Constant | Request Descriptor
0 | 137 | 137 | 0 | 0 | 0 | 0 | 0 | 134

4. Beep on keypress

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | General Command | General Command | Constant | Constant | Constant | Constant | Beep Control | Constant
0 | 137 | 137 | 0 | 0 | 0 | 0 | BeepCtrl | 18

BeepCtrl: 0=no beep, 1=beep. Bit 3= auto beep if key is pressed.

5. Beep at specified period and duration

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9
Constant | Beep Command | Period of beep | Duration of beep | Constant | Constant | Constant | Constant | Constant
0 | 151 | PR2 | DR2 | 0 | 0 | 0 | 0 | 0

PR2: PR2=period/0.000016-1, the lower the value of PR2 the higher frequency will be the beep.
DR2: Duration=DR2*0.016 in seconds.