This commit is contained in:
2026-02-27 17:07:07 +01:00
parent e848168840
commit dc3467ac0f
6 changed files with 206 additions and 56 deletions

View File

@@ -3,6 +3,26 @@ import serial
import time
import os
PROTOCOL_ERROR_MESSAGES = {
0x01: "Ungültiger Befehl.",
0x02: "Ungültige Parameter.",
0x03: "Befehl oder Parameter sind zu lang.",
0x10: "Datei oder Verzeichnis wurde nicht gefunden.",
0x11: "Ziel existiert bereits.",
0x12: "Pfad ist kein Verzeichnis.",
0x13: "Pfad ist ein Verzeichnis.",
0x14: "Zugriff verweigert.",
0x15: "Kein freier Speicher mehr vorhanden.",
0x16: "Datei ist zu groß.",
0x20: "Allgemeiner Ein-/Ausgabefehler auf dem Gerät.",
0x21: "Zeitüberschreitung auf dem Gerät.",
0x22: "CRC-Prüfung fehlgeschlagen (Daten beschädigt).",
0x23: "Übertragung wurde vom Gerät abgebrochen.",
0x30: "Befehl wird vom Gerät nicht unterstützt.",
0x31: "Gerät ist beschäftigt.",
0x32: "Interner Gerätefehler.",
}
class BuzzerError(Exception):
pass
@@ -31,6 +51,16 @@ class BuzzerConnection:
if self.serial and self.serial.is_open:
self.serial.close()
def _parse_controller_error(self, line: str) -> str:
code_str = line.split(" ", 1)[1].strip() if " " in line else ""
try:
code = int(code_str, 10)
except ValueError:
return f"Controller meldet einen unbekannten Fehler: '{line}'"
message = PROTOCOL_ERROR_MESSAGES.get(code, "Unbekannter Fehlercode vom Gerät.")
return f"Controller-Fehler {code} (0x{code:02X}): {message}"
def send_command(self, command: str, custom_timeout: float = None) -> list:
eff_timeout = custom_timeout if custom_timeout is not None else self.timeout
self.serial.reset_input_buffer()
@@ -53,10 +83,11 @@ class BuzzerConnection:
if line == "OK":
return lines
elif line.startswith("ERR"):
err_code = line.split(" ")[1] if " " in line else "UNKNOWN"
raise BuzzerError(f"Controller meldet Fehlercode: {err_code}")
raise BuzzerError(self._parse_controller_error(line))
else:
lines.append(line)
except BuzzerError:
raise
except Exception as e:
raise BuzzerError(f"Fehler beim Lesen der Antwort: {e}")
else:
@@ -78,7 +109,7 @@ class BuzzerConnection:
ready = True
break
elif line.startswith("ERR"):
raise BuzzerError(f"Fehler vor Binärtransfer: {line}")
raise BuzzerError(f"Fehler vor Binärtransfer: {self._parse_controller_error(line)}")
time.sleep(0.01)
if not ready:
@@ -94,7 +125,7 @@ class BuzzerConnection:
if self.serial.in_waiting > 0:
line = self.serial.readline().decode('utf-8', errors='ignore').strip()
if line.startswith("ERR"):
raise BuzzerError(f"Controller hat Transfer abgebrochen: {line}")
raise BuzzerError(f"Controller hat Transfer abgebrochen: {self._parse_controller_error(line)}")
# 2. Chunk lesen und schreiben
chunk = f.read(chunk_size)
@@ -119,7 +150,7 @@ class BuzzerConnection:
if line == "OK":
return True
elif line.startswith("ERR"):
raise BuzzerError(f"Fehler beim Speichern der Binärdatei: {line}")
raise BuzzerError(f"Fehler beim Speichern der Binärdatei: {self._parse_controller_error(line)}")
time.sleep(0.01)
raise TimeoutError("Zeitüberschreitung nach Binärtransfer (kein OK empfangen).")