IceCube display
LED display to show IceCube event data
Display metadata reports

Display metadata can be requested over USB as a type-length-value list by sending a DISPLAY_PROPERTIES request to the default control endpoint. This is an easily extensible interface that can provide additional information if future firmwares may require so. An application like Steamshovel can use these metadata reports to automatically configure which data to send to which display, using the correct buffer format. With these reports different displays types can be supported without having to hard-code the specific configuration of each existing device in the application.

Report examples

IceTop display

A typical IceTop display TLV list looks as follows:

This implies that LED display consist of APA102 LEDs, which means 4 bytes of information should be provided per LED. The information that is displayed corresponds to IceTop stations, so the pulses from DOMs 61-64 should be merged to determine the LED's color and brightness. The (inclusive) range of supported IceTop stations is 1-78, so a full display frame consists of \(4 \times 78=312\) bytes.

IceCube display

The \((2m)^3\) IceCube display consists of three modules. A report of the center module may look as follows:

This report describes the central part of the display/detector. A frame for this display contains \( 3 \times 60 \times (20+8)=5040 \) bytes. This is a lot more data than the IceTop display, but a 12Mbps USB port should stil be able to deliver 25FPS.

Communication example

The following example reads the display information from all connected devices using pyusb:

#!/usr/bin/python3
import usb.core
import usb.util
import struct
VENDOR_IN = usb.util.build_request_type(
usb.util.CTRL_IN
, usb.util.CTRL_TYPE_VENDOR
, usb.util.CTRL_RECIPIENT_DEVICE
)
for device in usb.core.find(idVendor=0x1CE3, find_all=True):
device.set_configuration()
print("Querying device: {}".format(device.serial_number))
try:
data = device.ctrl_transfer(
VENDOR_IN
, 2 # Vendor request DISPLAY_PROPERTIES
, 0
, 0
, 2 # Read only properties header: properties length
, 5000
)
size, = struct.unpack("<H", data)
data = device.ctrl_transfer(
VENDOR_IN
, 2 # Vendor request DISPLAY_PROPERTIES
, 0
, 0
, size
, 5000
)
tlv_fields = parseTlvData(data[2:])
[...]
except usb.core.USBError as e:
print("Error reading information: {}".format(e))