ui: Oberfläche¶
obd_diag.ui.app¶
.. py:module:: obd_diag.ui.app
Einstiegspunkt der Desktop-Oberfläche: obd-diag-gui.
obd_diag.desktop¶
.. py:module:: obd_diag.desktop
Startmenü-Eintrag für Installationen ohne Paketverwaltung (pipx, pip).
AUR- und Flatpak-Paket legen Desktop-Datei und Symbol selbst ab; wer mit pipx installiert,
holt das mit obd-diag-gui --install-desktop nach. Die Dateien liegen im Paket unter
obd_diag/share und sind dieselben, die die Pakete installieren.
.. py:function:: share_file(name) :module: obd_diag.desktop
Inhalt einer Datei aus obd_diag/share.
.. py:function:: entry_paths(base=None) :module: obd_diag.desktop
Ziel von Desktop-Datei und Symbol unter base (Standard: $XDG_DATA_HOME).
.. py:function:: quote_exec(path) :module: obd_diag.desktop
Programmpfad für die Exec-Zeile (Desktop Entry Specification, „The Exec key“).
Mit Leer- oder Sonderzeichen in Anführungszeichen, darin ", `````, $ und \
mit Backslash; % ist ein Feldcode und wird verdoppelt. Für die Desktop-Datei als
String kommt noch einmal jeder Backslash doppelt dazu.
.. py:function:: install_desktop_entry(command, base=None) :module: obd_diag.desktop
Legt Desktop-Datei und Symbol an; Exec zeigt auf command (absolut).
Vorhandene Einträge werden ersetzt (etwa nach einem Umzug der Installation).
.. py:function:: remove_desktop_entry(base=None) :module: obd_diag.desktop
Entfernt, was :func:install_desktop_entry angelegt hat; gibt die gelöschten Pfade.
obd_diag.ui.window¶
.. py:module:: obd_diag.ui.window
QML-Engine mit dem Hauptfenster aufbauen.
.. py:function:: set_style() :module: obd_diag.ui.window
Vor dem Laden der ersten QML-Datei aufrufen; später wirkt es nicht mehr.
.. py:class:: CatalogTranslator :module: obd_diag.ui.window
Bases: :py:class:~PySide6.QtCore.QTranslator
Übersetzt die qsTr-Texte der QML-Dateien aus demselben Katalog wie den
Python-Code (obd_diag.i18n, locale/en.po); Deutsch bleibt unverändert.
.. py:function:: install_translations(app, language=None) :module: obd_diag.ui.window
Stellt die Sprache ein (obd_diag.i18n) und lädt Qts eigene Texte
(Dateidialog: „Speichern“, „Abbrechen“ …) in derselben Sprache.
Ohne language die eingestellte Sprache. Liefert die installierten Übersetzer
für Qts Texte; die Übersetzer gehören der Anwendung und leben so lange wie sie.
.. py:class:: Retranslatable(*args, **kwargs) :module: obd_diag.ui.window
Bases: :py:class:~typing.Protocol
.. py:class:: LanguageController(settings, parent=None) :module: obd_diag.ui.window
Bases: :py:class:~PySide6.QtCore.QObject
Sprache der Oberfläche (Optionen → Sprache), gespeichert in QSettings.
Ohne gespeicherte Wahl gilt die Systemsprache: Deutsch, wenn das System deutsch
ist, sonst Englisch (i18n.system_language). Ein Wechsel gilt sofort: Qt-Texte,
qsTr in QML (QQmlEngine.retranslate) und alle Texte der View-Models;
Fehlercode-Texte aus dem Katalog erst ab dem nächsten Scan.
.. py:method:: LanguageController.attach(engine, *listeners) :module: obd_diag.ui.window
Engine und View-Models, die bei einem Wechsel neu übersetzen
(``retranslate``).
.. py:class:: DialogHelper :module: obd_diag.ui.window
Bases: :py:class:~PySide6.QtCore.QObject
Ergänzt den Qt-eigenen Dateidialog, wenn kein Dialog des Systems verfügbar ist.
Ohne Desktop-Portal oder GTK nimmt Qt Quick einen eigenen Dateidialog, und der
übernimmt den vorgeschlagenen Dateinamen (selectedFile) nur, wenn die Datei
schon existiert. Dann wird das Namensfeld hier direkt gefüllt. Systemdialoge haben
kein solches Feld; dort bleibt alles beim Alten.
.. py:function:: create_design(parent=None) :module: obd_diag.ui.window
Design nach der gespeicherten Wahl (Optionen → Design), Standard: wie das System.
.. py:function:: create_language(parent=None) :module: obd_diag.ui.window
Sprache nach der gespeicherten Wahl (Optionen → Sprache), sonst die Systemsprache.
obd_diag.ui.backend¶
.. py:module:: obd_diag.ui.backend
Anbindung der Oberfläche an Transport und Services.
Ein Job öffnet den seriellen Port, erledigt seine Arbeit und schließt den Port wieder; zwischen Diagnose und Löschen bleibt nichts offen. So kann das Kabel zwischen zwei Aktionen abgezogen werden, ohne dass die Oberfläche einen toten Port hält, und jeder Job beginnt mit einem frisch initialisierten Adapter.
Auch der Fehlercode-Katalog wird je Job geöffnet: SQLite-Verbindungen gehören dem Thread, der sie angelegt hat, und Jobs laufen nicht im GUI-Thread.
.. py:class:: LiveResult(samples, recording) :module: obd_diag.ui.backend
Bases: :py:class:object
Ergebnis einer beendeten Live-Abfrage.
.. py:class:: LiveFunction(*args, **kwargs) :module: obd_diag.ui.backend
Bases: :py:class:~typing.Protocol
Live-Daten lesen, bis should_stop True liefert; läuft im Worker-Thread.
Die Rückrufe kommen aus dem Worker-Thread: on_setup nach der Initialisierung
(unterstützte Werte), on_start mit den tatsächlich abgefragten Werten und dem
Pfad der Aufzeichnung, on_sample nach jeder Runde. skip_unsupported wie
bei select_pids.
.. py:class:: BatteryFunction(*args, **kwargs) :module: obd_diag.ui.backend
Bases: :py:class:~typing.Protocol
Batterie- und Anlasstest; läuft im Worker-Thread, on_progress kommt von dort.
.. py:class:: Backend(diagnose, clear, list_ports, catalog_available, save_session=
Bases: :py:class:object
Die Aktionen, die das View-Model braucht; Tests setzen eigene Funktionen ein.
diagnose (Port, Baudrate, FIN bzw. Fehlercodes online nachschlagen) und
clear blockieren und laufen im Worker-Thread, ebenso export_pdf/export_csv
(ReportLab braucht etwas). list_ports, catalog_available, save_session und
load_session sind schnell und laufen im GUI-Thread.
.. py:method:: Backend.load_session() :module: obd_diag.ui.backend
Liest eine mit ``save_session`` gespeicherte Sitzung.
``ValueError`` (Meldung in der eingestellten Sprache), wenn die Datei kein gültiges
JSON oder keine obd-diag-Sitzung ist; ``OSError``, wenn sie sich nicht lesen lässt.
.. py:method:: Backend.export_pdf(path) :module: obd_diag.ui.backend
Bericht: Fahrzeug, Adapter/Protokoll/Spannung, Fehlercodes mit Erklärung,
Freeze Frame, Readiness, Gebrauchtwagen-Check. In der eingestellten Sprache, DIN A4.
Reihenfolge: Kopf, Fahrzeug und Verbindung, Kurzübersicht, Readiness,
Gebrauchtwagen-Check, Fehlercodes nach Art, Freeze Frame, Steuergeräte (Mode 09),
Testergebnisse (Mode 06). Fehlende Angaben stehen als „nicht verfügbar“.
.. py:method:: Backend.export_csv(path) :module: obd_diag.ui.backend
Eine Zeile pro Fehlercode (Code, Art, Titel, ...), UTF-8 mit BOM für Excel.
Trennzeichen ``;`` (Deutsch) bzw. ``,`` (Englisch), Zeilenende CRLF. Mehrere
Ursachen/Symptome stehen durch `` | `` getrennt in einer Zelle, die
Wahrscheinlichkeit in Klammern. „Datum“ und „FIN“ wiederholen sich in jeder Zeile,
damit sich CSVs mehrerer Sitzungen aneinanderhängen lassen. Ohne Fehlercodes
enthält die Datei nur die Kopfzeile. „Dringlichkeit“ (``services.urgency``) steht
zuletzt, damit ältere Auswertungen ihre Spalten behalten.
.. py:function:: diagnose_port(port, baud, online_vin_lookup=False, online_dtc_lookup=False, lang=None, trace=False) :module: obd_diag.ui.backend
Scan, Readiness, Freeze Frame und FIN; nur lesend. lang ohne Angabe: die
eingestellte Sprache.
.. py:function:: adapter_port(port, baud, trace=False) :module: obd_diag.ui.backend
Adapter-Check: nur Adapter-Befehle, das Fahrzeug wird nicht angesprochen.
.. py:function:: battery_port(port, baud, *, on_progress, should_stop, trace=False) :module: obd_diag.ui.backend
Batterie- und Anlasstest (services.battery); nur lesend. Das Demo-Fahrzeug
steht dafür zuerst und springt von selbst an.
.. py:function:: readiness_port(port, baud, trace=False) :module: obd_diag.ui.backend
Readiness seit dem Löschen und in dieser Fahrt (PID 01 und 41); nur lesend.
.. py:function:: live_port(port, baud, keys, interval, record, *, on_setup, on_start, on_sample, should_stop, skip_unsupported=False, thresholds=None, trace=False) :module: obd_diag.ui.backend
Live-Werte (Mode 01) lesen, bis should_stop True liefert; nur lesend.
keys und skip_unsupported wie bei select_pids (None: die üblichen
Werte, soweit unterstützt; keiner davon: SelectionError). Mit record wird
jede Runde sofort in eine neue CSV-Datei geschrieben. Wird schon während der
Initialisierung gestoppt, endet der Job ohne Abfrage und ohne Aufzeichnung.
thresholds: Warnschwellen wie bei run_live.
.. py:function:: ports_with_demo() :module: obd_diag.ui.backend
Gefundene Adapter, dahinter immer das Demo-Fahrzeug (transport/demo.py).
obd_diag.ui.jobs¶
.. py:module:: obd_diag.ui.jobs
Blockierende Arbeit (serielle Ein-/Ausgabe) abseits des GUI-Threads ausführen.
Ein Job ist eine Funktion ohne Argumente, die in einem Thread des QThreadPool
läuft. Ergebnis oder Ausnahme kommen über Signale eines _Relay-Objekts zurück,
das im GUI-Thread lebt; Qt stellt sie deshalb dort zu (queued connection). Die
Rückruf-Funktionen laufen also immer im GUI-Thread und dürfen Modelle ändern.
.. py:class:: JobRunner(*args, **kwargs) :module: obd_diag.ui.jobs
Bases: :py:class:~typing.Protocol
Was das View-Model zum Ausführen von Jobs braucht; in Tests austauschbar.
.. py:class:: ThreadPoolRunner() :module: obd_diag.ui.jobs
Bases: :py:class:object
Führt Jobs im QThreadPool aus, höchstens einen gleichzeitig.
Am Adapter darf immer nur ein Job hängen; ein Thread genügt also und verhindert, dass sich zwei Jobs denselben Port teilen.
.. py:method:: ThreadPoolRunner.wait(msecs=-1) :module: obd_diag.ui.jobs
Wartet, bis alle Jobs fertig sind (beim Beenden und in Tests).
obd_diag.ui.theme¶
.. py:module:: obd_diag.ui.theme
Helles und dunkles Design: folgt dem System oder der Wahl unter Optionen → Design.
DesignController entscheidet, ob dunkel gezeichnet wird, und reicht dark an
Theme.qml weiter. Dort stehen beide Farbsätze: die eigenen Farben (Hinweise,
Etiketten) und die Palette des Fusion-Stils, die Main.qml dem Fenster setzt. Qt
Quick übernimmt eine Palette aus QGuiApplication.setPalette nicht, und ohne
Unterstützung der Plattform (z. B. offscreen, viele X11-Sitzungen) bleibt Fusion
sonst hell. Die Wahl wird in den QSettings gespeichert.
.. py:class:: DesignController(settings, parent=None) :module: obd_diag.ui.theme
Bases: :py:class:~PySide6.QtCore.QObject
mode: system, light oder dark; dark: tatsächlich dunkel.
obd_diag.ui.viewmodels.diagnosis¶
.. py:module:: obd_diag.ui.viewmodels.diagnosis
View-Model der Hauptansicht: Diagnose, Löschen, Sitzung speichern, öffnen, exportieren.
.. py:function:: user_message(error) :module: obd_diag.ui.viewmodels.diagnosis
Eine Ausnahme aus einem Job als Meldung für die Oberfläche.
.. py:function:: local_path(target) :module: obd_diag.ui.viewmodels.diagnosis
Pfad aus dem Dateidialog (file:///…) oder aus einer Eingabe.
.. py:class:: DiagnosisViewModel(backend, runner, parent=None) :module: obd_diag.ui.viewmodels.diagnosis
Bases: :py:class:~PySide6.QtCore.QObject
Zustand und Aktionen der Hauptansicht.
Serielle Arbeit und Export laufen über runner abseits des GUI-Threads; solange
ein Job läuft, ist busy gesetzt und weitere Aktionen werden ignoriert.
Eine aus einer Datei geöffnete Sitzung ist nur zum Ansehen (viewOnly): Löschen
braucht ein verbundenes Fahrzeug.
Solange die Live-Daten laufen, ist blocked gesetzt (LiveViewModel): Scan,
Löschen und Export brauchen den einzigen Worker-Thread bzw. den Adapter und
werden dann ignoriert.
.. py:method:: DiagnosisViewModel.set_blocked(blocked) :module: obd_diag.ui.viewmodels.diagnosis
Von den Live-Daten: Adapter und Worker-Thread sind belegt.
.. py:attribute:: DiagnosisViewModel.defaultPort :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:method:: DiagnosisViewModel.prefer_demo() :module: obd_diag.ui.viewmodels.diagnosis
Mit dem Demo-Fahrzeug starten (``obd-diag-gui --demo``).
.. py:attribute:: DiagnosisViewModel.blocked :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.clearDisabledReason :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.uniqueCodes :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.permanentCount :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.selected :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.ecus :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.testResults :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.vehicleText :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.readinessAssist :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.canCheckReadiness :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:method:: DiagnosisViewModel.checkReadiness() :module: obd_diag.ui.viewmodels.diagnosis
Readiness-Assistent: PID 01 und 41 am zuletzt gescannten Port neu lesen.
.. py:attribute:: DiagnosisViewModel.createdText :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.sessionPath :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.reportBaseName :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.reportFolder :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.sessionFolder :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:attribute:: DiagnosisViewModel.adapterCheck :module: obd_diag.ui.viewmodels.diagnosis :value: <PySide6.QtCore.Property object>
.. py:method:: DiagnosisViewModel.checkAdapter(port, baud) :module: obd_diag.ui.viewmodels.diagnosis
Adapter-Check: Version, Spannung und Befehlssatz, ohne das Fahrzeug.
.. py:method:: DiagnosisViewModel.connectAndScan(port, baud) :module: obd_diag.ui.viewmodels.diagnosis
Vollständige Diagnose: Fehlercodes, Readiness, Freeze Frame, FIN.
.. py:method:: DiagnosisViewModel.clearCodes() :module: obd_diag.ui.viewmodels.diagnosis
Löscht die Codes am zuletzt gescannten Port; die Bestätigung holt die QML-Seite ein.
Danach wird die Diagnose neu gelesen: Mode 04 setzt auch Readiness und Freeze
Frame zurück, die alten Angaben wären also überholt.
.. py:method:: DiagnosisViewModel.saveSession() :module: obd_diag.ui.viewmodels.diagnosis
Speichert die aktuelle Diagnose als JSON unter ~/.local/share/obd-diag/sessions.
.. py:method:: DiagnosisViewModel.openSession(target) :module: obd_diag.ui.viewmodels.diagnosis
Öffnet eine gespeicherte Sitzung zum Ansehen (ohne Fahrzeug).
.. py:method:: DiagnosisViewModel.retranslate() :module: obd_diag.ui.viewmodels.diagnosis
Nach einem Sprachwechsel: Listen und abgeleitete Texte neu ausgeben.
Meldungen, die schon stehen, und Katalogtexte des letzten Scans bleiben in der
alten Sprache; der nächste Scan liest sie in der neuen.
obd_diag.ui.viewmodels.live¶
.. py:module:: obd_diag.ui.viewmodels.live
View-Model des Reiters „Live-Daten“: Werte fortlaufend lesen, anzeigen, aufzeichnen.
Die Abfrage läuft als ein langer Job über denselben JobRunner wie die Diagnose
(ein Thread, also nie zwei Jobs am Adapter). Zwischenwerte kommen aus dem
Worker-Thread über Signale eines _LiveRelay, das im GUI-Thread lebt; Qt stellt sie
dort zu (queued). Gestoppt wird über ein threading.Event, das should_stop liest.
Jede Abfrage bekommt eine laufende Nummer; Rückmeldungen einer älteren Abfrage, die erst nach dem Start einer neuen ankommen, werden verworfen.
.. py:function:: number_text(value) :module: obd_diag.ui.viewmodels.live
Zahl mit dem Dezimalzeichen der Sprache; Nachkommastellen nach Größe, ganze Zahlen ohne.
.. py:function:: elapsed_text(seconds) :module: obd_diag.ui.viewmodels.live
Laufzeit als m:ss bzw. h:mm:ss.
.. py:function:: limit_text(value) :module: obd_diag.ui.viewmodels.live
Schwelle für das Eingabefeld: leer ohne Grenze, sonst wie number_text.
.. py:function:: alarm_side_text(alarm, unit) :module: obd_diag.ui.viewmodels.live
Kurzform für die Kachel, z. B. „über 115 °C“; leer ohne Warnung.
.. py:class:: LiveValueModel(parent=None) :module: obd_diag.ui.viewmodels.live
Bases: :py:class:~PySide6.QtCore.QAbstractListModel
Die abgefragten Werte als Kacheln; jede Runde ändert nur die Daten, nicht die Zeilen.
.. py:method:: LiveValueModel.retranslate() :module: obd_diag.ui.viewmodels.live
Namen und Zahlen nach einem Sprachwechsel neu aufbauen (Werte bleiben).
.. py:method:: LiveValueModel.entry(key) :module: obd_diag.ui.viewmodels.live
Angaben zu ``key`` (für Tests und Python-Code), ``None``, wenn nicht abgefragt.
.. py:class:: LiveViewModel(backend, runner, diagnosis, parent=None) :module: obd_diag.ui.viewmodels.live
Bases: :py:class:~PySide6.QtCore.QObject
Zustand und Aktionen des Reiters „Live-Daten“.
Startet nur, wenn die Diagnose nicht beschäftigt ist; solange Live-Daten laufen,
ist die Diagnose gesperrt (DiagnosisViewModel.blocked).
.. py:attribute:: LiveViewModel.stopping :module: obd_diag.ui.viewmodels.live :value: <PySide6.QtCore.Property object>
.. py:property:: LiveViewModel.value_model :module: obd_diag.ui.viewmodels.live :type: ~obd_diag.ui.viewmodels.live.LiveValueModel
Wie ``values``, aber für Python typisiert.
.. py:attribute:: LiveViewModel.supportedKnown :module: obd_diag.ui.viewmodels.live :value: <PySide6.QtCore.Property object>
.. py:attribute:: LiveViewModel.connectionText :module: obd_diag.ui.viewmodels.live :value: <PySide6.QtCore.Property object>
.. py:attribute:: LiveViewModel.voltageAlarm :module: obd_diag.ui.viewmodels.live :value: <PySide6.QtCore.Property object>
.. py:attribute:: LiveViewModel.alarmTexts :module: obd_diag.ui.viewmodels.live :value: <PySide6.QtCore.Property object>
.. py:attribute:: LiveViewModel.thresholdRows :module: obd_diag.ui.viewmodels.live :value: <PySide6.QtCore.Property object>
.. py:attribute:: LiveViewModel.historyLength :module: obd_diag.ui.viewmodels.live :value: <PySide6.QtCore.Property object>
.. py:method:: LiveViewModel.setThreshold(key, low_text, high_text) :module: obd_diag.ui.viewmodels.live
Warnschwelle eines Werts setzen (leere Felder: keine Grenze) und speichern.
Liefert eine Fehlermeldung oder leer; bei einem Fehler bleibt die alte Schwelle.
Während der Abfrage nicht änderbar (sie gilt ab dem nächsten Start). Meldet
``thresholdsChanged`` bewusst nicht: die Zeilen des Dialogs würden sonst neu
aufgebaut, und das Feld, in das der Nutzer gerade wechselt, verlöre den Fokus.
.. py:method:: LiveViewModel.reloadThresholds() :module: obd_diag.ui.viewmodels.live
Dialog neu füllen (beim Öffnen; verwirft ungültige Eingaben von vorher).
.. py:method:: LiveViewModel.resetThresholds() :module: obd_diag.ui.viewmodels.live
Zurück zu den vorgegebenen Warnschwellen.
.. py:method:: LiveViewModel.setSelected(key, selected) :module: obd_diag.ui.viewmodels.live
Wert für die nächste Abfrage an- oder abwählen (nicht während der Abfrage).
.. py:method:: LiveViewModel.resetSelection() :module: obd_diag.ui.viewmodels.live
Zurück zu den üblichen Werten.
.. py:method:: LiveViewModel.start(port, baud) :module: obd_diag.ui.viewmodels.live
Live-Daten am Port lesen, bis ``stop`` aufgerufen wird.
.. py:method:: LiveViewModel.stop() :module: obd_diag.ui.viewmodels.live
Abfrage beenden; der Job hört nach der laufenden Runde auf.
.. py:method:: LiveViewModel.retranslate() :module: obd_diag.ui.viewmodels.live
Nach einem Sprachwechsel: Namen der Werte und Zahlen neu ausgeben.
obd_diag.ui.viewmodels.compare¶
.. py:module:: obd_diag.ui.viewmodels.compare
View-Model des Sitzungsvergleichs (Datei → Mit Sitzung vergleichen …).
Vergleicht die angezeigte Sitzung (frisch gelesen oder geöffnet) mit einer gespeicherten Datei. Das Laden ist schnell und läuft im GUI-Thread, wie „Sitzung öffnen“; der Adapter wird nicht gebraucht, daher geht es auch, während Live-Daten laufen.
.. py:class:: CompareViewModel(diagnosis, parent=None) :module: obd_diag.ui.viewmodels.compare
Bases: :py:class:~PySide6.QtCore.QObject
.. py:attribute:: CompareViewModel.comparison :module: obd_diag.ui.viewmodels.compare :value: <PySide6.QtCore.Property object>
.. py:method:: CompareViewModel.compareWith(target) :module: obd_diag.ui.viewmodels.compare
Vergleicht die angezeigte Sitzung mit der Datei ``target``.
.. py:method:: CompareViewModel.retranslate() :module: obd_diag.ui.viewmodels.compare
Texte entstehen beim Vergleich; nach einem Sprachwechsel neu vergleichen.
obd_diag.ui.viewmodels.codes¶
.. py:module:: obd_diag.ui.viewmodels.codes
Listenmodell der Fehlercodes für die QML-Liste und die Detailansicht.
.. py:function:: code_entry(c, manufacturer=None, rating=None) :module: obd_diag.ui.viewmodels.codes
Alle Angaben zu einem Code als einfache Werte, wie QML sie lesen kann.
manufacturer (aus der FIN) fließt nur in den Link für die Websuche ein;
rating ist die Dringlichkeit (ohne Angabe: nur aus diesem einen Eintrag bewertet).
.. py:class:: CodeListModel(parent=None) :module: obd_diag.ui.viewmodels.codes
Bases: :py:class:~PySide6.QtCore.QAbstractListModel
Die Codes des letzten Scans, in der Reihenfolge gespeichert, ausstehend, permanent.
.. py:method:: CodeListModel.set_codes(codes, manufacturer=None, mil_on=None) :module: obd_diag.ui.viewmodels.codes
``mil_on``: Kontrollleuchte laut Readiness (für die Dringlichkeit).
.. py:method:: CodeListModel.retranslate() :module: obd_diag.ui.viewmodels.codes
Bezeichnungen nach einem Sprachwechsel neu aufbauen (Katalogtexte bleiben).
obd_diag.ui.viewmodels.session_parts¶
.. py:module:: obd_diag.ui.viewmodels.session_parts
Readiness, Freeze Frame, Fahrzeug und Gebrauchtwagen-Check einer Sitzung als einfache Werte für QML.
.. py:function:: number_text(value, decimals=0) :module: obd_diag.ui.viewmodels.session_parts
Deutsch mit Tausenderpunkt und Dezimalkomma, Englisch mit Komma und Punkt.
.. py:class:: MonitorListModel(parent=None) :module: obd_diag.ui.viewmodels.session_parts
Bases: :py:class:~PySide6.QtCore.QAbstractListModel
Die Readiness-Monitore in der Reihenfolge, die das Steuergerät meldet.
.. py:method:: MonitorListModel.retranslate() :module: obd_diag.ui.viewmodels.session_parts
Bezeichnungen nach einem Sprachwechsel neu aufbauen.
.. py:function:: readiness_entry(status) :module: obd_diag.ui.viewmodels.session_parts
Kopfangaben der Readiness; {"available": False} ohne Antwort.
.. py:function:: readiness_assist_entry(status, check) :module: obd_diag.ui.viewmodels.session_parts
Readiness-Assistent: offene Tests mit Fahrhinweis.
Ohne check aus der Sitzung (nur PID 01), sonst aus dem letzten Lesen von PID 01
und 41 (checked); {"available": False} ohne Readiness.
.. py:function:: freeze_frame_entry(frame, codes=None) :module: obd_diag.ui.viewmodels.session_parts
Auslösender Code und Messwerte als Zeilen (Bezeichnung, Wert, Einheit).
available ist falsch, wenn das Steuergerät nicht geantwortet hat; empty,
wenn es zwar antwortet, aber keinen Freeze Frame gespeichert hat.
.. py:function:: vehicle_entry(vin) :module: obd_diag.ui.viewmodels.session_parts
FIN und was sich daraus ablesen lässt; {"available": False} ohne FIN.
.. py:function:: used_car_entry(session) :module: obd_diag.ui.viewmodels.session_parts
Urteil, Zähler und Befunde; {"available": False} ohne Sitzung.
countersRead ist falsch bei Sitzungen älterer Versionen (Zähler nicht gelesen);
permanente Codes und Warnleuchte werden dann trotzdem bewertet.