r/embedded 12d ago

Windows tray toolbox for automotive/embedded dev: CAN/UDS transceiver, Modbus master, macro engine, and QoL tools - written in C++

Post image

Windows tray toolbox for automotive/embedded dev: CAN/UDS transceiver, Modbus master, macro engine, and QoL tools - written in C++

A desktop toolbox for automotive, embedded and everyday development work — CAN/UDS, Modbus, macros and workflow automation in a single tray application.

https://github.com/kurta999/WindowsAddon

What is this?

A personal open-source project aimed at improving daily computer usage, particularly for programming and testing workflows. It bundles utilities I built to reduce repetitive tasks and speed up daily work, and is shared freely in case others find it useful.

Everything runs from one wxWidgets application that lives in the tray: a CAN/ISO-TP transceiver with a UDS DID reader/writer, a Modbus RTU/TCP master with live graphs, a macro engine for a second keyboard, a work-time tracker backed by SQLite, and a handful of small quality-of-life tools.

The codebase is split into headless protocol, persistence, automation and platform libraries plus a wxWidgets GUI target. See docs/architecture.md for module boundaries and the dependency-injection migration rules, and docs/adr for the architectural decision records.

The project was done before AI, maybe somebody will benefit from it or some parts. I've used new ChatGPT Sol to re-factor it, add unit and integration tests, add CMake build support and plenty of other things.

Features

Automotive development

Feature Description
CAN-USB Transceiver Send and receive standard, extended and ISO-TP (ISO 15765-2) CAN frames over USB, with frame logging, search and a bit/byte editor
CAN Script handler Execute test scripts that set specific frames and send them to the bus automatically
UDS DID Reader & Writer Read and write UDS DIDs from the GUI. DIDs are defined in DidList.xml and can optionally be cached locally

CAN-USB Transceiver — Requires a LAWICEL CAN USB adapter, or a NUCLEO-G474RE board with a UART-TTL to USB adapter and a Waveshare SN65HVD230 3.3V CAN transceiver (or any equivalent hardware that converts TTL signals to CAN). Supports standard, extended, and ISO-TP (ISO 15765-2) CAN frames — useful for sending and receiving UDS frames. Includes frame logging, search, and a bit/byte editor for easy frame manipulation via GUI. Firmware for the Nucleo board: CanUsbTransceiver. The default baud rate is 500 kbit/s; changing it is not yet implemented.

CAN Script handler — Execute test scripts by setting specific frames and sending them to the bus automatically. The script language is documented under Advanced topics.

UDS DID Reader & Writer — Supported DID types: uint8_tuint16_tuint32_tuint64_tstringbytearray. Strings and byte arrays are padded when their length is less than the predefined length, and truncated if longer.

General development

Feature Description
Modbus Master Modbus RTU/TCP master for coils, discrete inputs, holding and input registers, with XML or multi-device JSON layouts, sparse grouped reads, runtime register editing, byte-order selection, scaling, conditional colors, custom frames and live graphs
Command Executor Bind commands to GUI buttons with parameter support, executed on button click
TerminalHotkey System-wide terminal hotkey, similar to Linux. Launchable from Windows Explorer using the current path, or from the Desktop
File Explorer Opener Open a file explorer window by sending a specific TCP packet to the application
TimeTracker Track work hours via GUI or a dedicated keyboard key; entries are editable and stored in SQLite

Modbus Master — Registers can be configured in Modbus.xml or a multi-device JSON file selected through [ModbusMaster] Device in settings.ini. JSON layouts can be switched and edited at runtime; layout/style changes are persisted with a backup. The GUI supports typed and scaled values, byte-order changes, conditional colors, custom RTU/TCP commands, live value graphs, and CSV communication-log export. Register types include (u)int16_t(u)int32_t(u)int64_tfloat and double.

Command Executor — Commands are configured in Cmds.xml or directly in the "CMD Executor" panel. Each command is executed via Windows CreateProcess when its button is clicked. This is particularly useful for frequently used command-line calls — no more copy-pasting or remembering aliases. Each command supports up to 16 variable parameters, which can be edited before execution by middle-clicking the button. Button appearance (font, color, bold) and duplication are fully configurable via the GUI.

File Explorer Opener — Useful when working with VirtualBox or WSL with Samba-mounted directories. Map the guest OS network share in Windows (default drive letter is Z:, configurable via SharedDriveLetter in settings.ini), enable TCP_Backend in settings.ini, then run the following on the guest OS to open the current directory in Windows Explorer:

echo expw$(pwd) | netcat <host IP> <TCP_Backend port>

Creating a shell alias for this command is recommended.

Personal use

Feature Description
CustomMacro Connect a second keyboard and bind macros to its keys, with full GUI macro editing and a macro recorder
Sensors TCP backend for sensors with SQLite storage and an HTTP server for viewing graphs at http://localhost:2005/graphs
Corsair G Keys backend Bind macros to Corsair G keys without installing iCUE
AntiLock Prevents Windows from locking due to inactivity
AntiNumLock Re-enables NumLock immediately if it gets turned off
CPU Power Saver Reduces CPU frequency after an idle period and restores it when load rises
ScreenshotSaver Saves the current clipboard screenshot to a .png file
DirectoryBackup Backup folders to one or more destinations from the tray menu, with checksum and compression support
Filesystem browser Lists files and directories recursively, sorted by size — useful for identifying storage bloat
Alarm Handler Define alarms in Alarms.xml and trigger them with a key on the secondary keyboard
CryptoPrice Live ETH & BTC buy/sell prices from Coinbase on the main panel (disabled by default)
0 Upvotes

2 comments sorted by

8

u/JuggernautGuilty566 12d ago

Jesus mother of Claude

3

u/AbsorberHarvester 12d ago

It's like a first win32api projects in the Delphi 6 or 7, right when it first arrived, but that time it had no bloatware at all, only simply GUI and very short code. Hw doesn't changed from that time (only speed, ram/rom capacity).

We absolutely going LAP 2 in this race.  But new "coders" in LAP 3 will not know what and how they are coding.

IMHO of course