printer
All checks were successful
Deploy WebSocket Server / deploy (push) Successful in 3s

This commit is contained in:
jeremygan2021
2026-03-05 20:09:47 +08:00
parent 24e5b4d018
commit 3a23a1b47b
2 changed files with 61 additions and 10 deletions

54
main.py
View File

@@ -112,7 +112,7 @@ def connect_wifi(display=None, max_retries=5):
def process_message(msg, display, image_state, image_data_list): def process_message(msg, display, image_state, image_data_list, printer_uart=None):
"""处理WebSocket消息""" """处理WebSocket消息"""
# Handle binary image data # Handle binary image data
if isinstance(msg, (bytes, bytearray)): if isinstance(msg, (bytes, bytearray)):
@@ -138,6 +138,12 @@ def process_message(msg, display, image_state, image_data_list):
print(f"Stream image error: {e}") print(f"Stream image error: {e}")
return image_state, None return image_state, None
elif image_state == PRINTER_STATE_RECEIVING:
if printer_uart:
printer_uart.write(msg)
return image_state, None
return image_state, None return image_state, None
if not isinstance(msg, str): if not isinstance(msg, str):
@@ -153,6 +159,14 @@ def process_message(msg, display, image_state, image_data_list):
print_asr(msg[4:], display) print_asr(msg[4:], display)
return image_state, ("asr", msg[4:]) return image_state, ("asr", msg[4:])
elif msg.startswith("PRINTER_DATA_START:"):
print(f"Start receiving printer data...")
return PRINTER_STATE_RECEIVING, ("printer_start",)
elif msg == "PRINTER_DATA_END":
print("Printer data received completely")
return IMAGE_STATE_IDLE, ("printer_done",)
elif msg.startswith("STATUS:"): elif msg.startswith("STATUS:"):
parts = msg[7:].split(":", 1) parts = msg[7:].split(":", 1)
status_type = parts[0] status_type = parts[0]
@@ -284,6 +298,9 @@ def main():
mic = Microphone() mic = Microphone()
display = Display() display = Display()
# 初始化打印机 UART
printer_uart = machine.UART(1, baudrate=115200, tx=ttl_tx, rx=ttl_rx)
if display.tft: if display.tft:
display.init_ui() display.init_ui()
display.render_home_screen() display.render_home_screen()
@@ -446,9 +463,20 @@ def main():
if display.tft: if display.tft:
display.render_result_screen("OPTIMIZING", current_asr_text, False) display.render_result_screen("OPTIMIZING", current_asr_text, False)
time.sleep(0.5) time.sleep(0.5)
elif ui_screen == UI_SCREEN_RESULT:
# Re-record
print(">>> Re-record (Short Press)")
current_asr_text = ""
confirm_waiting = False
ui_screen = UI_SCREEN_RECORDING
is_recording = False
image_generation_done = False
if display.tft:
display.render_recording_screen("", 0, False)
time.sleep(0.5)
elif btn_action == 2: elif btn_action == 2:
if ui_screen == UI_SCREEN_CONFIRM or ui_screen == UI_SCREEN_RESULT: if ui_screen == UI_SCREEN_CONFIRM:
print(">>> Re-record") print(">>> Re-record")
current_asr_text = "" current_asr_text = ""
confirm_waiting = False confirm_waiting = False
@@ -458,6 +486,17 @@ def main():
if display.tft: if display.tft:
display.render_recording_screen("", 0, False) display.render_recording_screen("", 0, False)
time.sleep(0.5) time.sleep(0.5)
elif ui_screen == UI_SCREEN_RESULT:
# Print Image
print(">>> Print Image (Long Press)")
if ws and ws.is_connected():
try:
ws.send("PRINT_IMAGE")
if display.tft:
display.render_result_screen("PRINTING", "正在请求打印...", True)
except:
ws = None
time.sleep(0.5)
elif btn_action == 3: elif btn_action == 3:
print(">>> Config mode") print(">>> Config mode")
@@ -484,7 +523,7 @@ def main():
if events: if events:
msg = ws.recv() msg = ws.recv()
if msg: if msg:
image_state, event_data = process_message(msg, display, image_state, image_data_list) image_state, event_data = process_message(msg, display, image_state, image_data_list, printer_uart)
if event_data: if event_data:
if event_data[0] == "asr": if event_data[0] == "asr":
@@ -521,6 +560,15 @@ def main():
elif event_data[0] == "error": elif event_data[0] == "error":
if display.tft and ui_screen == UI_SCREEN_RESULT: if display.tft and ui_screen == UI_SCREEN_RESULT:
display.render_result_screen("ERROR", current_prompt, False) display.render_result_screen("ERROR", current_prompt, False)
elif event_data[0] == "printer_start":
if display.tft and ui_screen == UI_SCREEN_RESULT:
display.render_result_screen("PRINTING", "正在打印...", True)
elif event_data[0] == "printer_done":
if display.tft and ui_screen == UI_SCREEN_RESULT:
display.render_result_screen("COMPLETE", "打印完成", True)
time.sleep(1.0)
except Exception as e: except Exception as e:
print(f"WS Recv Error: {e}") print(f"WS Recv Error: {e}")

View File

@@ -530,17 +530,20 @@ def optimize_prompt(asr_text, progress_callback=None):
if progress_callback: if progress_callback:
progress_callback(0, "正在准备优化提示词...") progress_callback(0, "正在准备优化提示词...")
system_prompt = """你是一个AI图像提示词优化专家。将用户简短的语音识别结果转化为详细的、适合AI图像生成的中文提示词。 system_prompt = """你是一个AI图像提示词优化专家。你的任务是将用户的语音识别结果转化为适合生成"黑白线稿"提示词。
要求: 关键要求:
1. 用于热敏打印机的中文提示词图片 1. 风格必须是:简单的黑白线稿、简笔画、图标风格 (Line art, Sketch, Icon style)。
2. 添加适合AI绘画的描述词尺寸宽48mm, 高30mm 的线稿图片,线稿要存粗方便热敏打印 2. 画面必须清晰、线条粗壮,适合低分辨率热敏打印机打印。
3. 适合热敏打印机打印图片还可以是icon方便这个标签打印机打印效果 3. 绝对不要有复杂的阴影、渐变、彩色描述。
4. 简洁但描述详细 4. 背景必须是纯白 (White background)。
5. 不要添加多余解释,直接输出优化后的提示词""" 5. 提示词内容请使用英文描述,因为绘图模型对英文理解更好,但在描述中强调 "black and white line art", "simple lines", "vector style"
6. 尺寸比例遵循宽48mm:高30mm (约 1.6:1)。
7. 直接输出优化后的提示词,不要包含任何解释。"""
try: try:
if progress_callback: if progress_callback:
progress_callback(10, "正在调用AI优化提示词...") progress_callback(10, "正在调用AI优化提示词...")
print(f"Calling AI with prompt: {system_prompt}\n\n用户语音识别结果:{asr_text}\n\n优化后的提示词:")
response = Generation.call( response = Generation.call(
model='qwen-turbo', model='qwen-turbo',