1
0

xrd protocol

This commit is contained in:
2026-02-20 17:47:38 +01:00
parent 8e11d6239d
commit 9576fbae3a
5 changed files with 222 additions and 38 deletions

69
tef.py
View File

@@ -110,17 +110,20 @@ class TEF6686(BaseTEF668X):
@_command_wrapper
def APPL_Set_OperationMode(self, mode: bool = True):
return b"\x40\x01\x01" + mode.to_bytes(2, "big"), None, None
@_command_wrapper
def FM_Set_Stereo_Min(self, mode: int = 0, limit: int = 400):
return b"\x20\x42\x01" + mode.to_bytes(2, "big") + limit.to_bytes(2, "big"), None, None
@staticmethod
def _get_quality_data(data) -> tuple[None, None, None, None, None, None, None] | tuple[int, int, int, int, int, int, int]:
if data[1] != 0: return None, None, None, None, None, None, None
status = (data[2] << 8) | data[3]
level = int.from_bytes(bytes([data[4], data[5]]), "big", signed=True)
usn = (data[6] << 8) | data[7] # "noise" on AM
wam = (data[8] << 8) | data[9] # "co-channel" on AM
offset = int.from_bytes(bytes([data[10], data[11]]), "big", signed=True)
bandwidth = (data[12] << 8) | data[13]
modulation = (data[14] << 8) | data[15]
if data[0] != 0: return None, None, None, None, None, None, None
status = (data[1] << 8) | data[2]
level = int.from_bytes(bytes([data[3], data[4]]), "big", signed=True)
usn = (data[5] << 8) | data[6] # "noise" on AM
wam = (data[7] << 8) | data[8] # "co-channel" on AM
offset = int.from_bytes(bytes([data[9], data[10]]), "big", signed=True)
bandwidth = (data[11] << 8) | data[12]
modulation = (data[13] << 8) | data[14]
return status, level, usn, wam, offset, bandwidth, modulation
@_command_wrapper
def FM_Get_Quality_Status(self):
@@ -136,21 +139,21 @@ class TEF6686(BaseTEF668X):
return b"\x21\x81\x01", 14, self._get_quality_data
@staticmethod
def _get_rds_data_proc_decoder(data):
if data[1] != 0: return None, None, None, None, None, None
status = (data[2] << 8) | data[3]
A_block = (data[4] << 8) | data[5]
B_block = (data[6] << 8) | data[7]
C_block = (data[8] << 8) | data[9]
D_block = (data[10] << 8) | data[11]
dec_error = (data[12] << 8) | data[13]
def _get_rds_data_proc_decoder(data) -> tuple[None, None, None, None, None, None] | tuple[int, int, int, int, int, int]:
if data[0] != 0: return None, None, None, None, None, None
status = (data[1] << 8) | data[2]
A_block = (data[3] << 8) | data[4]
B_block = (data[5] << 8) | data[6]
C_block = (data[7] << 8) | data[8]
D_block = (data[9] << 8) | data[10]
dec_error = (data[11] << 8) | data[12]
return status, A_block, B_block, C_block, D_block, dec_error
@staticmethod
def _get_rds_data_proc_demodulator(data):
if data[1] != 0: return None, None, None
status = (data[2] << 8) | data[3]
raw_data_high = (data[4] << 8) | data[5]
raw_data_low = (data[6] << 8) | data[7]
if data[0] != 0: return None, None, None
status = (data[1] << 8) | data[2]
raw_data_high = (data[3] << 8) | data[4]
raw_data_low = (data[5] << 8) | data[6]
return status, (raw_data_high << 16) | raw_data_low
@_command_wrapper
def FM_Get_RDS_Status__decoder(self):
@@ -171,9 +174,9 @@ class TEF6686(BaseTEF668X):
Returns None if there was a I2C error, or a tuple of booleans (FM Stereo/Mono and Analog/Digital radio [DR models])
"""
def proc(data):
if data[1] != 0: return None
input_att = (data[2] << 8) | data[3]
feedback_att = (data[4] << 8) | data[5]
if data[0] != 0: return None
input_att = (data[1] << 8) | data[2]
feedback_att = (data[3] << 8) | data[4]
return input_att, feedback_att
return b"\x20\x84\x01", 4, proc
@_command_wrapper
@@ -182,16 +185,26 @@ class TEF6686(BaseTEF668X):
Returns None if there was a I2C error, or a tuple of booleans (FM Stereo/Mono and Analog/Digital radio [DR models])
"""
def proc(data):
if data[1] != 0: return None
if data[0] != 0: return None
value = (data[-2] << 8) | data[-1]
return (value & (1 << 15)) != 0, (value & (1 << 14)) != 0
return b"\x20\x85\x01", 2, proc
@_command_wrapper
def FM_Get_Processing_Status(self):
def proc(data):
if data[0] != 0: return None, None, None, None
softmute = (data[1] << 8) | data[2]
highcut = (data[3] << 8) | data[4]
stereo = (data[5] << 8) | data[6]
sthiblend = (data[7] << 8) | data[8]
return softmute, highcut, stereo, sthiblend
return b"\x20\x86\x01", 2*4, proc
@_command_wrapper
def APPL_Get_Identification(self):
def proc(data):
if data[1] != 0: return None
device = (data[2] << 8) | data[3]
hw_version = (data[4] << 8) | data[5]
sw_version = (data[6] << 8) | data[7]
if data[0] != 0: return None
device = (data[1] << 8) | data[2]
hw_version = (data[3] << 8) | data[4]
sw_version = (data[5] << 8) | data[6]
return device, hw_version, sw_version
return b"\x40\x82\x01", 6, proc