diff --git a/xrd.py b/xrd.py index ae123df..c09f7f0 100644 --- a/xrd.py +++ b/xrd.py @@ -47,33 +47,40 @@ def authenticate(conn): if data.strip() == expected_hash.strip(): return True def process_command(tef: TEF6686, data: bytes, state): - if data.startswith(b"T"): - freq = int(data.decode().removeprefix("T").strip()) // 10 - state['last_tune'] = freq - tef.FM_Tune_To(1, freq) - return f"T{freq*10}\n".encode() - elif data.startswith(b"G"): - eqims = int(data.decode().removeprefix("G").strip(), 2) - state['last_eqims'] = eqims - tef.FM_Set_ChannelEqualizer((eqims & 1) == 1) - tef.FM_Set_MphSuppression((eqims & 2) == 2) - return f"G{bin(eqims).removeprefix('0b').zfill(2)}\n".encode() - elif data.startswith(b"B"): - mono = bool(int(data.decode().removeprefix("B").strip(), 2)) - state['forced_mono'] = mono - tef.FM_Set_Stereo_Min(2 if mono else 0) - return f"B{int(mono)}\n".encode() - elif data.startswith(b"D"): - deemp = int(data.decode().removeprefix("D").strip()) - time = 500 if deemp == 0 else (750 if deemp == 1 else 0) - state['deemp'] = deemp - tef.FM_Set_Deemphasis(time) - return f"D{deemp}\n".encode() - - if data.startswith(b"x"): - return b"OK" + out = b"" + for cmd in data.splitlines(): + if cmd.startswith(b"T"): + freq = int(cmd.decode().removeprefix("T").strip()) // 10 + state['last_tune'] = freq + tef.FM_Tune_To(1, freq) + out += f"T{freq*10}\n".encode() + elif cmd.startswith(b"G"): + eqims = int(cmd.decode().removeprefix("G").strip(), 2) + state['last_eqims'] = eqims + tef.FM_Set_ChannelEqualizer((eqims & 1) == 1) + tef.FM_Set_MphSuppression((eqims & 2) == 2) + out += f"G{bin(eqims).removeprefix('0b').zfill(2)}\n".encode() + elif cmd.startswith(b"B"): + mono = bool(int(cmd.decode().removeprefix("B").strip(), 2)) + state['forced_mono'] = mono + tef.FM_Set_Stereo_Min(2 if mono else 0) + out += f"B{int(mono)}\n".encode() + elif cmd.startswith(b"D"): + deemp = int(cmd.decode().removeprefix("D").strip()) + time = 500 if deemp == 0 else (750 if deemp == 1 else 0) + state['deemp'] = deemp + tef.FM_Set_Deemphasis(time) + out += f"D{deemp}\n".encode() + elif cmd.startswith(b"x"): + out += b"OK\n" + elif cmd.startswith(b"W"): + bw = int(cmd.decode().removeprefix("W").strip()) + auto = (bw == 0) + tef.FM_Set_Bandwidth(auto, 2360 if auto else (bw // 100)) + state['bw'] = bw + out += f"W{bw}\n".encode() - return None + return out def send_signal_status(tef: TEF6686, conn, state): _, _, stereo, _ = tef.FM_Get_Processing_Status() @@ -124,7 +131,8 @@ def run_server(): 'last_tune': 9500, 'last_eqims': 0b11, 'forced_mono': False, - 'deemp': 0 + 'deemp': 0, + 'bw': 0 } try: @@ -146,6 +154,7 @@ def run_server(): conn.sendall(f"G{bin(state['last_eqims']).removeprefix('0b').zfill(2)}\n".encode()) conn.sendall(f"B{int(state['forced_mono'])}\n".encode()) conn.sendall(f"D{state['deemp']}\n".encode()) + conn.sendall(f"W{state['bw']}\n".encode()) conn.setblocking(False) ss_timer = libtimer.Timer() @@ -155,6 +164,7 @@ def run_server(): try: data = conn.recv(1024) if not data: break + print(data) resp = process_command(tef, data, state) if resp: conn.sendall(resp) except ConnectionResetError: break