MMDVMHost-Private/Nextion/nextion.py
2016-04-07 08:05:30 +01:00

121 lines
2.8 KiB
Python

#!/usr/bin/python
# coding=utf-8
import threading
import time
import os
import sys
import serial
PORT = '/dev/ttyAMA0'
BAUDCOMM = 9600
BAUDUPLOAD = 115200
CHECK_MODEL = 'NX3224T024'
if len(sys.argv) != 2:
print 'usage: python %s file_to_upload.tft' % sys.argv[0]
exit(-2)
file_path = sys.argv[1]
if os.path.isfile(file_path):
print 'uploading %s (%i bytes)...' % (file_path, os.path.getsize(file_path))
else:
print 'file not found'
exit(-1)
fsize = os.path.getsize(file_path)
print('Filesize: ' + str(fsize))
ser = serial.Serial(PORT, BAUDCOMM, timeout=.1, )
acked = threading.Event()
stop_thread = threading.Event()
def reader():
global acked
global ser
while stop_thread.is_set() == False:
r = ser.read(1)
if r == '':
continue
elif '\x05' in r:
acked.set()
continue
else:
print '<%r>' % r
continue
def upload():
global acked
global ser
global stop_thread
ser.write('tjchmi-wri %i,%i,0' % (fsize, BAUDUPLOAD))
ser.write("\xff\xff\xff")
ser.flush()
acked.clear()
ser.baudrate = BAUDUPLOAD
ser.timeout = 0.1
threader.start()
print 'Waiting for ACK...'
acked.wait()
print 'Uploading...'
with open(file_path, 'rb') as hmif:
dcount = 0
while True:
#time.sleep(.1)
data = hmif.read(4096)
if len(data) == 0: break
dcount += len(data)
#print 'writing %i...' % len(data)
ser.write(data)
acked.clear()
sys.stdout.write('\rDownloading, %3.1f%%...' % (dcount/ float(fsize)*100.0))
sys.stdout.flush()
#print 'waiting for hmi...'
acked.wait()
print('')
stop_thread.set()
threader.join(1)
threader = threading.Thread(target = reader)
threader.daemon = True
no_connect = True
for baudrate in (2400, 4800, 9600, 19200, 38400, 57600, 115200):
ser.baudrate = baudrate
ser.timeout = 3000/baudrate + 0.2
print('Trying with ' + str(baudrate) + '...')
ser.write("\xff\xff\xff")
ser.write('connect')
ser.write("\xff\xff\xff")
r = ser.read(128)
if 'comok' in r:
print('Connected with ' + str(baudrate) + '!')
no_connect = False
status, unknown1, model, unknown2, version, serial, flash_size = r.strip("\xff\x00").split(',')
print('Status: ' + status)
print('Model: ' + model)
print('Version: ' + version)
print('Serial: ' + serial)
print('Flash size: ' + flash_size)
if fsize > flash_size:
print('File too big!')
break
if not CHECK_MODEL in model:
print('Wrong Display!')
break
upload()
break
if no_connect:
print('No connection!')
else:
print('File written to Display!')
ser.close()