import time
from machine import Pin, UART
from dwin import DWIN
from esp32 import NVS

'''
# 模拟EEPROM读取函数
class EEPROM:
    def __init__(self):
        self.data = {}
        # 初始化一些默认值
        for i in range(512):
            self.data[i] = 0 
        nvs = NVS('DWIN')
    
    def read_byte(self, addr):
        """读取一个字节"""
        data = self.data.get(addr, 0);
        print(f'read_byte  addr {addr}={data} \r\n')
        return data
    
    def write_byte(self, addr, value):
        """写入一个字节"""
        data = value & 0xFF
        self.data[addr] = data
        print(f'write_byte  addr {addr}={data} \r\n')
    
    def read_word(self, addr):
        """读取一个字（两个字节）"""
        high = self.read_byte(addr)
        low = self.read_byte(addr + 1)
        data = (high << 8) | low
        # print(f'read_word  addr {addr}={data} \r\n')
        return data
    
    def write_word(self, addr, value):
        """写入一个字（两个字节）"""
        high = (value >> 8) & 0xFF
        low = value & 0xFF
        self.write_byte(addr, high)
        self.write_byte(addr + 1, low)
        # print(f'write_word H{addr}={high}  L{addr+1}={low}  \r\n')
'''  

# 创建测试类
class DwinTest:
    def __init__(self):
        # 初始化EEPROM
        self.eeprom = EEPROM()
        
        # 初始化LED指示灯
        self.led = Pin(2, Pin.OUT)  # ESP32板载LED
        
        # 初始化DWIN屏幕
        # 使用ESP32的UART1，默认引脚：TX=10, RX=9
        # 如果需要使用其他引脚，请根据你的接线修改
        self.dwin = DWIN(uart_id=1, tx_pin=10, rx_pin=9, baudrate=115200)
        
        # 测试状态变量
        self.test_running = False
        self.test_time = 0
        self.last_time = 0
        print('DwinTest')
    
    '''
    def eeprom_reader(self, addr):
        """EEPROM读取函数，用于初始化LCD"""
        # print('eeprom_reader')
        return self.eeprom.read_byte(addr)
    
    def blink_led(self):
        """闪烁LED指示灯""" 
        # print('blink_led')
        self.led.value(not self.led.value())
    '''
    
    def setup(self):
        """初始化设置"""
        print("初始化DWIN屏幕...")
        
        # 初始化LCD，传入EEPROM读取函数
        self.dwin.init_lcd(self.eeprom_reader)
        
        # 跳转到主页面
        self.dwin.jump_page(0)
        
        # 设置一些初始值
        self.dwin.write_var(0x1000, 0)  # 清零某个变量
        self.dwin.write_var_32(0x2000, 0)  # 清零某个32位变量
        
        print("DWIN屏幕初始化完成")
    
    def handle_start_test(self):
        """开始测试处理"""
        if not self.test_running:
            self.test_running = True
            self.test_time = 0
            self.last_time = time.ticks_ms()
            print("测试开始")
            
            # 可以在这里添加其他测试开始逻辑
    
    def handle_stop_test(self):
        """停止测试处理"""
        if self.test_running:
            self.test_running = False
            print(f"测试停止，总时间: {self.test_time / 1000:.1f}秒")
            
            # 发送测试时间到屏幕
            self.dwin.write_var_32(0x2000, 0)
            
            # 可以在这里添加其他测试停止逻辑
    
    def update_test_time(self):
        """更新测试时间"""
        if self.test_running:
            current = time.ticks_ms()
            self.test_time += time.ticks_diff(current, self.last_time)
            self.last_time = current
            
            # 每秒更新一次显示
            if self.test_time % 1000 < 100:
                seconds = self.test_time // 1000
                self.dwin.write_var_32(0x2000, seconds)
                print(f"测试运行中: {seconds}秒")
    
    def extend_dwin_handlers(self):
        """扩展DWIN处理函数"""
        # 覆盖DWIN类中的处理函数
        self.dwin._handle_start_test = self.handle_start_test
        self.dwin._handle_stop_test = self.handle_stop_test
        self.dwin._handle_capture_background = lambda: print("采集背景")
        self.dwin._handle_capture_sample = lambda: print("采集样品")
    
    def run(self):
        """运行主循环"""
        self.setup()
        self.extend_dwin_handlers()
        
        print("开始运行...")
        led_time = 0
        
        while True:
            # 处理DWIN屏幕数据
            self.dwin.process_received_data()
            
            # 更新测试时间
            self.update_test_time()
            
            # 闪烁LED指示灯（每500ms）
            current = time.ticks_ms()
            if time.ticks_diff(current, led_time) > 500:
                self.blink_led()
                led_time = current
            
            # 适当延时
            time.sleep_ms(10)

# 主程序入口
def main():
    try:
        test = DwinTest()
        test.run()
    except Exception as e:
        print(f"错误: {e}")
        import sys
        sys.print_exception(e)

if __name__ == "__main__":
    main()