from machine import SPI, Pin,I2C,Timer,freq,RTC,WDT,UART
import st7789_spi
from easydisplay import EasyDisplay
import ntptime
import network,time,requests,json
import ubinascii
# ==================== 配置区 ====================
UART_ID = 1
BAUDRATE = 115200
TX_PIN = 5
RX_PIN = 4
RAW_REPL_TIMEOUT_MS = 3000 # Raw REPL 握手与执行超时(ms)
# ================================================
uart = UART(UART_ID, baudrate=BAUDRATE, tx=TX_PIN, rx=RX_PIN ,rxbuf=16384,txbuf=16384 )
spi = SPI(1, baudrate=40000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3))
dp = st7789_spi.ST7789(width=320, height=240, spi=spi, cs=7, dc=6, res=10, rotate=2, bl=11,invert=False, rgb=False)
sm= EasyDisplay(display=dp, font="/text_full_16px_2312.v3.bmf", show=True, color=0xFFFF, auto_wrap=True, clear=True,color_type="RGB565")
sm.clear()
class lcdrepl():
def __init__(self,lcd,uart):
self.lcd=lcd
self.uart=uart
self.line=0
self.swap=''
self.swap_list=[]
#用于文件修改
def ssplit(self):
self.swap_list=self.swap.split('\n')
def clear(self):
self.line=0
self.lcd.clear()
def show_line(self,strx,cmd=False,line_blank=True):
clear_str=" "
self.swap=strx
self.ssplit()
if cmd:
strx="> "+strx
if self.line>14:
self.lcd.clear()
self.line=0
if line_blank:
self.lcd.text(clear_str*20, 0, 16*self.line ,clear=False,color=0xFFF)
self.lcd.text(strx, 0, 16*self.line ,clear=False,color=0xFFF)
tn=strx.count("\n")
t=1
if tn>0:
t=tn+1
self.line=self.line+t
def lcd_cmd(self,inx):
self.show_line(inx,True)
self.raw_command(inx)
def base64_encode(self,data):
return ubinascii.b2a_base64(data).strip()
def base64_decode(self,data):
return ubinascii.a2b_base64(data)
#打印显示文件 return 回传数据 print模拟显示
#打印
#打印
def show_info(self,data):
if data:
print(data)
self.show_line(data)
return data
return False
def show_text(self,data):
if data:
print(data)
self.show_line(data)
return data
return False
#打印显示文件
#打印
#打印00000000000000000
def raw_read(self,wt=100):
time.sleep_ms(wt)
bs=self.uart.read()
# print(bs)
if bs is not None:
if bs.endswith(b'\x04\x04>'):
#直接舍弃4KB以上的大文件
bsd=bs.decode()
if bsd[2:-3]:
return bsd[2:-3]
return False
def raw_start(self):
self.uart.write(b'\x03')
time.sleep_ms(100)
self.uart.write(b'\x01')
time.sleep_ms(100)
cnu=self.uart.read()
if cnu is not None:
pass
def raw_command(self,data,show_type=True,wt=100):
self.uart.write(data)
self.uart.write(b'\x04')
if show_type:
return self.show_info(self.raw_read(wt))
return self.raw_read(wt)
def show_dir(self,dirs):
self.raw_command(f"dir_data=json.dumps(os.listdir({repr(dirs)}))",False)
sw=self.raw_command("print(base64_encode(dir_data).decode().strip())",False)
swd=json.loads(self.base64_decode(sw))
return swd
#wt 为1000 可以最大8KB大文件
def read_file(self,fn):
mb=self.raw_command(f"print(read_file({repr(fn)}))",False,500)
file_info=self.base64_decode(mb[:-2]).decode()
return self.show_text(file_info)
def write_file(self,fn,data):
bd=self.base64_encode(data).decode()
self.raw_command(f"write_file({repr(fn)},{repr(bd)})",False,500)
v=lcdrepl(sm,uart)
v.raw_command("import os,json,ubinascii,time",False)
v.raw_command("def base64_encode(data):\n return ubinascii.b2a_base64(data).strip()",False)
v.raw_command("def base64_decode(data):\n return ubinascii.a2b_base64(data)",False)
v.raw_command("def read_file(file_name):\n f=open(file_name,'rb')\n e=f.read()\n f.close()\n return base64_encode(e).decode()",False)
v.raw_command("def write_file(file_name,data):\n f=open(file_name,'wb')\n dd=base64_decode(data).decode()\n f.write(dd)\n f.close()",False)
v.raw_start()
v.lcd_cmd("112")
v.lcd_cmd("for i in range(5):\n print(i)")
v.clear()
v.read_file("boot.py")