sync
This commit is contained in:
@@ -13,8 +13,8 @@ def execute(conn) -> dict:
|
||||
raise BuzzerError(f"Unerwartetes Info-Format: {lines[0]}")
|
||||
|
||||
protocol_version = int(parts[0])
|
||||
if protocol_version != 1:
|
||||
raise BuzzerError(f"Inkompatibles Protokoll: Gerät nutzt v{protocol_version}, Host erwartet v1.")
|
||||
if protocol_version != 2:
|
||||
raise BuzzerError(f"Inkompatibles Protokoll: Gerät nutzt v{protocol_version}, Host erwartet v2.")
|
||||
|
||||
app_version = parts[1]
|
||||
f_frsize = int(parts[2])
|
||||
|
||||
@@ -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).")
|
||||
Reference in New Issue
Block a user