Files
uartscope/README.md

184 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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