# 导入必要库：网络、ESP-NOW通信、硬件控制及LCD驱动
import network
import espnow
import time
from time import sleep_ms
from machine import SPI, Pin
from driver import st7735_buf  # ST7735 LCD底层驱动
from lib.easydisplay import EasyDisplay  # 简化LCD显示操作
import ubinascii

# ----------------------------------
# 1. 定义“计算居中坐标”的函数
# ----------------------------------
def get_center_pos(text, font_width=8, font_height=8):
    """
    计算文字居中时的起始坐标 (x, y)
    text: 要显示的文字（如 "forward"）
    font_width: 字体宽度（默认 8 像素）
    font_height: 字体高度（默认 8 像素）
    """
    # 计算文字总宽度（字符数 × 字体宽度）
    text_total_width = len(text) * font_width
    # X 轴：屏幕水平中心 - 文字总宽度的一半
    x = (160 - text_total_width) // 2
    # Y 轴：屏幕垂直中心 - 字体高度的一半
    y = (128 - font_height) // 2 + 8
    return x, y

# 初始化
spi = SPI(2, baudrate=20000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23))
dp = st7735_buf.ST7735(width=160, height=128, spi=spi, cs=5, dc=4, res=19, rotate=1, bl=None,invert=False, rgb=True)
ed = EasyDisplay(display=dp, font="/font/text_lite_16px_2312.v3.bmf", show=True, color=0xFFFF, clear=True,color_type="RGB565")

# 初始化ESP-NOW通信
# 初始化sta
sta = network.WLAN(network.STA_IF)
sta.active(True)
# 获取MAC地址（以字节形式）
mac_bytes = sta.config('mac')

# 将字节转换为人类可读的十六进制字符串
mac_str = ubinascii.hexlify(mac_bytes, ':').decode()

print(f"MAC地址: {mac_str}")
sta.disconnect()

ed.text(mac_str, 10, 10)

e = espnow.ESPNow()
e.active(True)  # 启用ESP-NOW

def receive_messages():
    """接收ESP-NOW消息，处理后在LCD和串口显示"""
    while True:
        try:
            host, msg = e.recv(0)  # 非阻塞接收消息
            
            if msg:
                # 解码消息
                command = msg.decode('utf-8').strip() if isinstance(msg, bytes) else str(msg).strip()
                # 格式化发送端MAC
                sender_mac = ':'.join(['%02x' % b for b in host])
                print(f"来自 {sender_mac} 的指令: {command}")
                               
                # LCD显示指令
                # ed.fill(0x0000)  # 清屏（黑色）
                dir_x, dir_y = get_center_pos(command)
                ed.text(command, dir_x, dir_y)
            
            sleep_ms(10)
        except Exception as ex:
            print(f"接收错误: {ex}")
            sleep_ms(100)

def main():
    """主函数：初始化系统并启动消息接收"""
    try:
        # ed.fill(0x0000)
        receive_messages()  # 启动接收循环
    except KeyboardInterrupt:
        print("程序被中断")
    except Exception as ex:
        print(f"错误: {ex}")
    finally:
        # 清理资源
        e.active(False)
        sta.active(False)
        ed.fill(0x0000)
        ed.text("已停止", 50, 60)

if __name__ == "__main__":
    main()
