// Thermaltake Tower 200 · USB LCD driver · Linux · C++20
all_temps widget)font_file: "embedded")jpeg_dpi)264a:233d (Thermaltake Tower 200)sudo apt install libusb-1.0-0 libstdc++6 libfreetype6 fontconfig libharfbuzz0b \
libjpeg62-turbo libpng16-16 zlib1g \
libopencv-core410 libopencv-imgproc410 libopencv-imgcodecs410 libopencv-contrib410
On Ubuntu 22.04/24.04 use the 4.5d or 406 OpenCV package suffixes instead of 410.
sudo apt install build-essential g++ make pkg-config python3 \
libusb-1.0-0-dev libopencv-dev libopencv-contrib-dev libfreetype6-dev \
libfontconfig-dev libharfbuzz-dev libjpeg-dev libpng-dev zlib1g-dev
make ttlcd # build binary (auto-bumps patch version)
./ttlcd config.json # run (udev rule recommended; see Troubleshooting)
The makefile auto-generates Version.hpp, CMakeLists.txt, all packaging files, and the GitHub Actions workflow on every build.
make clean # remove build artifacts
make clean-packaging # remove generated packaging files
make clean-all # both
wget https://github.com/AaronC-585/ttlcd-cpp/releases/download/v1.0.18/ttlcd-v1.0.18-amd64.deb
sudo dpkg -i ttlcd-v1.0.18-amd64.deb
sudo rpm -i ttlcd-1.0.18-1.x86_64.rpm
# Download PKGBUILD.tar.gz from Releases, then:
tar xzf ttlcd-v1.0.18-PKGBUILD.tar.gz
makepkg -si
Push a version tag to trigger the GitHub Actions workflow — it builds and publishes .deb, .rpm, and PKGBUILD automatically as release assets.
git tag v1.0.18
git push origin v1.0.18
All layout and widget settings are controlled via config.json passed at runtime.
{
"jpeg_quality": 85,
"jpeg_dpi": 150,
"use": "NODE",
"orientation": "TOP",
"background": "./backgrounds/blk.jpg",
"font_file": "embedded",
"font_size": 20,
"font_color": [0, 255, 255],
"temp_unit": "F",
"ping_interval_sec": 8,
"enable_dashboard": true,
"dashboard_interval_sec": 10,
"update_interval_sec": 10,
"enable_ping": true,
"widgets": [
{ "type": "text", "x": 6, "y": 82, "text": "min | max" },
{ "type": "all_temps", "x": 4, "y": 54, "font_size": 20 }
]
}
| Key | Type | Description |
|---|---|---|
| idVendor / idProduct | int | USB IDs — defaults to 264a:233d (Tower 200) if omitted |
| jpeg_dpi | int | Render DPI for dynamic JPEG (default 150; design coords at 300 DPI) |
| temp_unit | string | "F" or "C" — override with env TTLCD_TEMP_UNIT |
| ping_interval_sec | int | USB keep-alive interval (default 8s) |
| enable_dashboard | bool | Enable periodic dashboard JPEG uploads (default true) |
| dashboard_interval_sec | int | Dashboard JPEG refresh interval in seconds |
| update_interval_sec | int | Legacy alias for dashboard_interval_sec |
| orientation | string | TOP, BOTTOM, LEFT, or RIGHT |
| background | string | Path to background image (jpg/png) |
| font_file | string | TTF path, or "embedded" for built-in Comic font |
| font_color | [B,G,R] | Default text color — OpenCV uses BGR order |
| widgets | array | Widget list — text, all_temps, cpu_bar, line, etc. |
| x / y | int | Widget position in design pixels (300 DPI space) |
Place .ttf files in a fonts/ directory next to the binary.
| Font | Style | Source |
|---|---|---|
| Digital-7 | 7-segment | dafont.com |
| DS-Digital | Digital | dafont.com |
| Orbitron | Futuristic | Google Fonts |
Installed by the .deb package to /usr/lib/systemd/system/ttlcd.service:
[Unit]
Description=Thermaltake Tower 200 USB LCD dashboard
After=local-fs.target network-online.target systemd-udev-settle.service
ConditionPathExists=/etc/ttlcd/config.json
[Service]
Type=simple
User=ttlcd
Group=ttlcd
ExecStart=/usr/bin/ttlcd /etc/ttlcd/config.json
WorkingDirectory=/etc/ttlcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now ttlcd.service
SUBSYSTEM=="usb", ATTR{idVendor}=="264a", ATTR{idProduct}=="233d", MODE="0666"
[B, G, R] not RGB
Originally inspired by the Python driver by bekindpleaserewind. Ported and enhanced in C++ for better performance and native Linux integration.
Released under the MIT License — free to use, modify, and redistribute.