๐ŸŽกOffseason Kiosk Programmer

In the event that you're hosting an offseason event, a Docker image containing the radio programming utility can be found below.

Releases

Release Notes

0.5

Added backward compatibility with VH-109 releases earlier than 1.2.0

0.4

Adds ability to pull WPA/SAE keys from FMS w/pin

Notice: Due to a schema change in frc-radio-api, 0.4 will not be compatible with VH-109_1.2.0 or later releases. The 0.5 version of the radio kiosk will be backward compatible on later releases of radio firmware.

0.3

Adds an admin page accessible by hovering over the "F" in "FRC" for 1 second before clicking.

The admin page links to the upload page, can program test teams, view what teams have programmed their radios, and enable the option to use provide teams 2.4GHz keys. All features are gated behind the admin password.

0.2.1

Bugfix: The data/firmware folder was getting overwritten by a mounted data folder. Changed to a symlink solution.

0.2.0

Added firmware update capability, prepackaged artifacts for VH-109 FW release 1.1.2

0.1.0

Initial release used at 2024 FIRST FRC Championship

Installation

The only requirements are that Docker is installed and a network interface (Ethernet adapter) is configured to 192.168.69.2/24

  1. Assign the IP address of 192.168.69.2 with a netmask of 255.255.255.0 and no default gateway to your ethernet adapter of choice

  2. From a terminal open to the folder containing vh109-kiosk-0_2_0.tar.gz, run docker image load --input vh109-kiosk-0_2_0.tar.gz. This loads the docker image from the archive.

  3. If you don't need to change the default password ("supercoolpassword"), skip to step 4. The password is set using a hash and salt. As a hacky solution, the salt and hash can be generated by running the following in node (or any online NodeJS compiler).

const crypto = require("crypto")
const pass = "<SET PASSWORD HERE>"
const salt = crypto.randomBytes(8).toString("base64")
const hash = crypto.createHash("sha256").update(pass + salt).digest("base64")
console.log(`salt: ${salt}\nhash: ${hash}`)
  1. To persist the team keys data, we need to mount a local folder to the docker container. Create a data folder in the desired location. It must be referenced by absolute path and have the desired security for the raw team keys csv data.

  2. Run the docker container with the following, replacing "/path/to/local/folder" with the path to the folder you just created.

docker run -d --name kiosk --restart always -p 80:80 --net=bridge -v "/path/to/local/folder:/app/data" vh109-kiosk

If you created a custom password, use this command and also replace <HASH> and <SALT> with what you generated.

docker run -d --name kiosk --restart always -p 80:80 --net=bridge -v "/path/to/local/folder:/app/data" -e OVERRIDE_KEY_UPLOAD_HASH="<HASH>" -e OVERRIDE_KEY_UPLOAD_SALT="<SAlT>" vh109-kiosk

If you get an error about a container with the name kiosk already being in use, run the following to remove it.

docker stop kiosk
docker rm kiosk
  1. At this point, the kiosk should be running at http://localhost and auto restart as long as docker auto restarts.

  2. Upload your key material in CSV format (team,key) at http://localhost/upload

  3. The kiosk is now ready for use!

Last updated