2019-03-01 11:26:43 +00:00
|
|
|
import serial
|
|
|
|
|
|
|
|
BROADCAST = 0xfe
|
|
|
|
|
|
|
|
|
|
|
|
class MDC(serial.Serial):
|
2019-03-01 11:29:45 +00:00
|
|
|
"""Samsung 400MX MDC remote control client
|
|
|
|
|
|
|
|
Docs: https://www.samsung.com/us/pdf/MDC_400DXn460DXn570DXn700DXn820DXn460TXn_v1.pdf
|
|
|
|
"""
|
2019-03-01 11:26:43 +00:00
|
|
|
def command(self, command, data=[], target_id=BROADCAST):
|
|
|
|
if target_id == 0:
|
|
|
|
target_id = 0xff
|
|
|
|
|
|
|
|
payload = bytearray([0xaa, command, target_id, len(data)] + data)
|
|
|
|
|
|
|
|
# Checksum
|
|
|
|
payload.append(sum(payload[1:]) & 0xff)
|
|
|
|
|
|
|
|
self.write(payload)
|
|
|
|
|
|
|
|
def read_frame(self):
|
|
|
|
payload = bytearray([])
|
|
|
|
|
|
|
|
payload.extend(self.read(4))
|
|
|
|
if payload[0] != 0xaa:
|
|
|
|
raise Exception('Invalid preamble %r' % payload[0])
|
|
|
|
|
|
|
|
if payload[1] != 0xff:
|
|
|
|
raise Exception('Unexpected command field? %r' % command)
|
|
|
|
|
|
|
|
payload.extend(self.read(payload[3]))
|
|
|
|
|
|
|
|
checksum = ord(self.read(1))
|
|
|
|
expected_checksum = sum(payload[1:]) & 0xff
|
|
|
|
|
|
|
|
if checksum != expected_checksum:
|
|
|
|
raise Exception('Invalid checksum %r != %r' % (checksum, expected_checksum))
|
|
|
|
|
|
|
|
return payload[2], payload[4:]
|
|
|
|
|
|
|
|
def request(self, *args, **kwargs):
|
|
|
|
self.command(*args, **kwargs)
|
|
|
|
return self.read_frame()
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
mdc = MDC('/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0', 9600)
|
|
|
|
mdc.command(0x10, [])
|
|
|
|
while True:
|
|
|
|
print(mdc.read_frame())
|