# UARTScope Ein moderner UART-Monitor für Linux mit Qt6-Oberfläche. Gebaut als vollwertiger Ersatz für minicom – besonders nützlich bei der Entwicklung von Baremetal-Projekten wie [Chica](https://git.projekt-hirnfrei.de/diabolus/chica) (Amiga-Hardware-Nachbildung auf dem Raspberry Pi). --- ## Features | Feature | Beschreibung | |---|---| | **Unbegrenzter Verlauf** | Kein Zeilenlimit – keine Daten gehen verloren, egal wie viel der Pi sendet | | **Timestamps** | Jede Zeile im Raw-View bekommt automatisch einen `hh:mm:ss.zzz`-Timestamp | | **H + V Scrolling** | Kein Zeilenumbruch, voller horizontaler Scrollbalken | | **Live-Logging** | Alle empfangenen Zeilen werden mit Timestamp in eine Datei geschrieben | | **Tag-Monitor** | Zeilen mit `[TAG]` werden in eigenen Panels angezeigt und aktualisiert | | **Tag-Filter** | Tags können aus dem Raw-View ausgeblendet werden (nur im Tag-Monitor sichtbar) | | **Tabellenansicht** | CSV-formatierte UART-Zeilen werden in einer Tabelle dargestellt | | **Suche** | Inkrementelle Volltextsuche im Raw-View | | **Auto-Reconnect** | Bei Verbindungsabbruch wird automatisch neu verbunden (Intervall einstellbar) | | **ANSI Clear-Screen** | `\033[2J\033[H` aus der Firmware leert alle Views gleichzeitig | | **Copy-Buttons** | Raw-View und jedes Tag-Panel haben einen „📋 Copy"-Button | | **V4L2 Live Video** | HDMI-Grabber direkt eingebunden – Live-Vorschau unter dem Tag-Monitor | | **Screenshot** | Aktuellen Frame des HDMI-Grabbers als PNG/JPG speichern | | **Format-Referenz** | Eingebauter Guide (mit Kopieren-Button) für KI-kompatible UART-Formatierung | | **Fensterlayout** | Fenstergröße, Position und alle Splitter-Positionen werden beim Beenden gespeichert | --- ## Voraussetzungen ```bash # Arch (empfohlen) sudo pacman -S cmake qt6-base qt6-serialport # Ubuntu / Debian sudo apt install cmake qt6-base-dev qt6-serialport-dev libqt6serialport6-dev # Fedora sudo dnf install cmake qt6-qtbase-devel qt6-qtserialport-devel ``` V4L2 benötigt keine zusätzliche Library – `linux/videodev2.h` ist Teil der Standard-Kernel-Header. --- ## Build ```bash git clone https://git.projekt-hirnfrei.de/diabolus/uartscope.git cd uartscope cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc) # Ausführen ./build/uartscope # Systemweit installieren (optional) sudo cmake --install build ``` --- ## Berechtigungen ```bash # UART-Port sudo usermod -aG dialout $USER # HDMI-Grabber / V4L2 sudo usermod -aG video $USER # Einmal ausloggen / neu einloggen ``` Grabber testen: ```bash v4l2-ctl --list-devices # alle /dev/video* Geräte v4l2-ctl -d /dev/video0 --list-formats-ext # unterstützte Formate & Auflösungen ``` --- ## UART-Ausgabe formatieren ### Raw-View (immer aktiv) Jede UART-Zeile erscheint im Raw-View mit Timestamp. Keine besondere Formatierung nötig. **Screen leeren** – von der Firmware aus alle Views gleichzeitig leeren: ```c uart_printf("\033[2J\033[H"); ``` ### Tag-Monitor Zeilen mit `[TAGNAME]` werden im Tag-Monitor-Panel angezeigt **und** im Raw-View hervorgehoben (cyan). Über „Tag filter…" in der Toolbar können Tags vollständig aus dem Raw-View ausgeblendet werden, sodass sie nur noch im Tag-Monitor erscheinen. **Format:** `[TAGNAME] key1=value1 key2=value2 ...` - Tag-Name: Buchstaben, Ziffern, Underscore – z.B. `WDG`, `VIDEO`, `I2C_BUS` - Key=Value-Paare: Leerzeichen-getrennt, Werte ohne Leerzeichen - Ohne Key=Value-Paare wird der rohe String angezeigt **Beispiele:** ```c uart_printf("[WDG] uptime=%lu free_heap=%lu temp=%d\n", HAL_GetTick(), xPortGetFreeHeapSize(), core_temp); uart_printf("[VIDEO] line=%d hblank=%d vblank=%d copper=%d\n", scanline, hblank_ticks, vblank_ticks, copper_dma); uart_printf("[AUDIO] ch=%d buf=%d underruns=%lu\n", active_channels, buffer_fill, underruns); ``` Jeder einzigartige Tag bekommt automatisch ein eigenes Panel. Panels aktualisieren sich in-place – kein Scrollen nötig. ### Tabellenansicht Optionale Header-Zeile mit `#`, dann CSV-Datenzeilen: ``` #time_ms,temperature,voltage,current 1000,23.5,3.30,0.42 2000,23.7,3.31,0.41 ``` Delimiter per Dropdown umschaltbar: `,` `;` `\t` `|` `Space` --- ## Einstellungen Beim Beenden werden folgende Einstellungen automatisch gespeichert und beim nächsten Start wiederhergestellt: - Fenstergröße und -position - Splitter-Positionen (Haupt-Splitter und Tag/Video-Splitter) - Auto-Reconnect ein/aus und Intervall - Tag-Filter (ausgeblendete Tags) Gespeichert unter `~/.config/ChicaDev/UARTScope.conf` (via `QSettings`). --- ## Projektstruktur ``` uartscope/ ├── CMakeLists.txt ├── README.md ├── uartscope.desktop.in ├── include/ │ ├── mainwindow.h ← Hauptfenster, koordiniert alle Komponenten │ ├── serialworker.h ← UART-Empfang im eigenen QThread, Auto-Reconnect │ ├── rawview.h ← Unbegrenzter Log mit Timestamps, Suche, Copy │ ├── tableview.h ← CSV-Parser → QTableWidget │ ├── tagwidget.h ← Container für Tag-Panels │ ├── tagpanel.h ← Ein Panel pro [TAG], Key=Value-Tabelle, Copy │ ├── connectdialog.h ← Port-Konfiguration (Port, Baud, Log-Datei) │ ├── v4l2worker.h ← V4L2-Capture in std::thread, MJPEG/YUYV/NV12 │ └── videowidget.h ← Live-Vorschau, Freeze, Screenshot └── src/ ├── main.cpp ├── mainwindow.cpp ├── serialworker.cpp ├── rawview.cpp ├── tableview.cpp ├── tagwidget.cpp ├── tagpanel.cpp ├── connectdialog.cpp ├── v4l2worker.cpp └── videowidget.cpp ``` --- ## Erweiterungsideen - **Plot-Widget**: numerische Tag-Werte live als Graph darstellen (Qt Charts) - **UART senden**: TX-Eingabezeile für bidirektionale Kommunikation - **Hex-View**: rohe Bytes als Hex-Dump anzeigen - **Session-Replay**: gespeicherte Log-Dateien abspielen - **Regex-Filter**: Zeilen im Raw-View per regulärem Ausdruck ein-/ausblenden