mirror of
https://github.com/furrtek/PrecIR.git
synced 2026-03-30 18:35:43 +00:00
Coin cell charge detection bugfix ESL Blaster FW version detection Updated flashtest.py to write nasty frames (DM show debug info permanently)
120 lines
3.2 KiB
Python
120 lines
3.2 KiB
Python
# Procedures related to the IR transmitters only
|
|
# 2019 furrtek - furrtek.org
|
|
# See LICENSE
|
|
|
|
import serial
|
|
|
|
def try_serialport(comport):
|
|
try:
|
|
ser = serial.Serial(comport, 57600, timeout = 1) # 1s timeout for read
|
|
ser.write("?".encode())
|
|
ser.flush()
|
|
test = ser.read_until("ESLBlaster")
|
|
ser.close()
|
|
if (len(test) >= 12):
|
|
hw_ver = chr(test[10])
|
|
fw_ver = int(chr(test[11]))
|
|
print("Found ESL Blaster (HW %s, FW V%d) on %s" % (hw_ver, fw_ver, comport))
|
|
return [True, hw_ver, fw_ver]
|
|
else:
|
|
print("Timeout on " + comport)
|
|
return [False, 0, 0]
|
|
except serial.SerialException:
|
|
#print("SerialException on " + comport) # Debug
|
|
return [False, 0, 0]
|
|
|
|
def search_esl_blaster():
|
|
found = False
|
|
|
|
# Windows
|
|
for n in range(1, 10):
|
|
comport = "COM" + str(n)
|
|
result = try_serialport(comport)
|
|
if result[0]:
|
|
found = True
|
|
break
|
|
|
|
# Linux
|
|
if found == False:
|
|
for n in range(1, 10):
|
|
comport = "/dev/ttyACM" + str(n)
|
|
result = try_serialport(comport)
|
|
if result[0]:
|
|
found = True
|
|
break
|
|
|
|
if found == False:
|
|
print("Could not find ESL Blaster.")
|
|
else:
|
|
result[0] = comport
|
|
|
|
return result
|
|
|
|
def transmit_serial(frames, port):
|
|
ser = serial.Serial(port, 57600, timeout = 10) # 10s timeout for read
|
|
ser.reset_input_buffer()
|
|
frame_count = len(frames)
|
|
i = 1
|
|
for fr in frames:
|
|
data_size = len(fr) - 2
|
|
repeats = fr[-2] + (fr[-1] * 256)
|
|
if repeats > 255: # Cap to one byte for the simple serial transmitter
|
|
repeats = 255
|
|
print("Transmitting frame %u/%u, length %u, repeated %u times." % (i, frame_count, data_size, repeats))
|
|
|
|
ba = bytearray()
|
|
ba.append(data_size)
|
|
ba.append(repeats)
|
|
for b in range(0, data_size):
|
|
ba.append(fr[b])
|
|
|
|
ser.write(ba)
|
|
ser.flush()
|
|
ser.read_until('A')
|
|
i += 1
|
|
|
|
ser.close()
|
|
|
|
def transmit_esl_blaster(frames, pp16, port):
|
|
ser = serial.Serial(port, 57600, timeout = 10) # 10s timeout for read
|
|
ser.reset_input_buffer()
|
|
frame_count = len(frames)
|
|
i = 1
|
|
|
|
# DEBUG
|
|
#f = open("out_bin.txt", "w")
|
|
|
|
for fr in frames:
|
|
data_size = len(fr) - 2
|
|
repeats = fr[-2] + (fr[-1] * 256)
|
|
|
|
if repeats > 32767: # Cap to 15 bits because FW V2 uses bit 16 to indicate PP16 protocol
|
|
repeats = 32767
|
|
|
|
print("Transmitting frame %u/%u using %s, length %u, repeated %u times." % (i, frame_count, "PP16" if pp16 else "PP4", data_size, repeats))
|
|
|
|
if pp16:
|
|
repeats |= 0x8000
|
|
|
|
ba = bytearray()
|
|
ba.append(76) # L:Load
|
|
ba.append(data_size)
|
|
ba.append(30) # 30*50 = 1500 timer ticks between repeats
|
|
ba.append(repeats & 255)
|
|
ba.append((repeats // 256) & 255)
|
|
for b in range(0, data_size):
|
|
ba.append(fr[b])
|
|
ba.append(84) # T:Transmit
|
|
|
|
# DEBUG
|
|
#for b in ba:
|
|
# f.write(format(b, '02X') + " ")
|
|
#f.write("\n")
|
|
|
|
ser.write(ba)
|
|
ser.flush()
|
|
ser.read_until(b'K') # Wait for transmit done
|
|
i += 1
|
|
|
|
ser.close()
|