import time
from eeprom  import EEPROM
from machine import Pin, UART
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2024 xukaiming
# All rights reserved

from dwin import DWIN
from config import Config
 

# 创建测试类
class DwinTest:
    def __init__(self):
        # 初始化EEPROM
        self.eeprom = EEPROM()
        self.config  = Config(self.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):        
        print("handle_start_test_demo")
        """开始测试处理"""
        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):
        print("handle_stop_test")
        """停止测试处理"""
        if self.test_running:
            self.test_running = False
            print(f"测试停止，总时间: {self.test_time / 1000:.1f}秒")
            
            # 发送测试时间到屏幕
            self.dwin.write_var_32(0x2000, 0)
            
            # 可以在这里添加其他测试停止逻辑
    def write_eeprom(self,var_width,addr,var_Value):
        #print('write_eeprom addr {:04X}={:04X}'.format(addr,var_Value) )
        print(self)
        operator = {  
            0x02: self.eeprom.write_word,		#  2byte        
            #0x04: self.eeprom.write_2word,	#  4byte         
            } 
        if var_width in operator: 
            operator[var_width](addr,var_Value)
            self.eeprom.write_to_NVS()
            print('write_eeprom addr {:04X}={:04X}'.format(addr,var_Value) )
            
    
    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. = 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("采集样品")

        self.dwin.reg_callback("_handle_start_test", self.handle_start_test)
        self.dwin.reg_callback("_handle_stop_test", self.handle_stop_test)
        self.dwin.reg_callback("_write_eeprom", self.write_eeprom)
        self.dwin.reg_callback("_handle_capture_background",lambda: print("采集背景"))
        self.dwin.reg_callback("_handle_capture_sample", lambda: print("采集样品"))
        print(self)

            
    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()