FreeCAD/DXF to .rd conversion, named upload to controller memory with idle check and read-back verification, read-only status/file listing, and a fake controller for dry runs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
37 lines
1.7 KiB
Python
Executable File
37 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""fake_ruida.py: a stand-in Ruida controller on 127.0.0.1:50200 for dry runs.
|
|
|
|
Logs every command it receives (unswizzled hex) to the .log file, ACKs, answers the status and
|
|
document-name reads the way the real controller does (no reply past the last file), and adds
|
|
uploaded file names to its list. Pass "busy" to report a running job so you can watch
|
|
rdupload.py refuse. Test here first; never point untested code at a real laser.
|
|
|
|
usage: fake_ruida.py [busy] fake.log
|
|
"""
|
|
import socket, sys
|
|
from meerk40t.ruida.rdjob import swizzles_lut, encode32, decodeu14
|
|
SW, UN = swizzles_lut(0x88)
|
|
BUSY = len(sys.argv) > 1 and sys.argv[1] == "busy"
|
|
files = ["PART01", "PART02"]
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.bind(("127.0.0.1", 50200))
|
|
log = open(sys.argv[-1] if sys.argv[-1].endswith(".log") else "fake.log", "a")
|
|
upload = bytearray()
|
|
def send(addr, raw): s.sendto(bytes(SW[b] for b in raw), addr)
|
|
while True:
|
|
pkt, addr = s.recvfrom(2048)
|
|
data = bytes(UN[b] for b in pkt[2:])
|
|
log.write("RX " + data.hex() + "\n"); log.flush()
|
|
if data[:2] != b"\xe8\x01" or decodeu14(data[2:4]) <= len(files): send(addr, b"\xcc")
|
|
if data[:2] == b"\xda\x00":
|
|
mem = data[2:4]
|
|
v = {b"\x04\x00": 1 if BUSY else 0, b"\x02\x00": 21 if BUSY else 22, b"\x02\x05": len(files)}.get(mem, 0)
|
|
send(addr, b"\xda\x01" + mem + encode32(v))
|
|
elif data[:2] == b"\xe8\x01":
|
|
n = decodeu14(data[2:4])
|
|
if n <= len(files): send(addr, data[:4] + files[n - 1].encode() + b"\x00")
|
|
else:
|
|
upload += data
|
|
if b"\xe7\x01" in upload and upload.endswith(b"\xd7"):
|
|
i = upload.index(b"\xe7\x01") + 2
|
|
files.append(upload[i:upload.index(b"\x00", i)].decode()); upload = bytearray()
|