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


from dwin import DWIN
from config import Config
 

# 创建测试类
class DwinTest(DWIN):
    def __init__(self,eeprom:EEPROM,uart_id=1, tx_pin=10, rx_pin=9, baudrate=115200):
        # 初始化DWIN屏幕
        # 使用ESP32的UART1，默认引脚：TX=10, RX=9
        # 如果需要使用其他引脚，请根据你的接线修改 
        super().__init__(uart_id, tx_pin, rx_pin, baudrate) 
        # 初始化EEPROM
        self.eeprom  = eeprom
        #self.config  = Config(self.eeprom)
        # 初始化LED指示灯
        #self.led = Pin(2, Pin.OUT)  # ESP32板载LED
        
        # # 测试状态变量
        # 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屏幕...")
          # 跳转到主页面
        self.jump_page(0)
        self.write_const_string("Start initialize")
        self.write_const_string("Start initialize...",0x180)
        # 初始化LCD，传入EEPROM读取函数
        self.init_lcd(self.eeprom_reader) 

        # 设置一些初始值
        # self.write_var(0x1000, 0)  # 清零某个变量
        # self.write_var_32(0x2000, 0)  # 清零某个32位变量
        self.write_const_string("LCD INIT. Successfully")
        self.write_const_string("LCD INIT. Successfully",0x180)#开机界面状态提示
        #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.write_var_32(0x0020, 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.write_var_32(0x0020, seconds)
    #             print(f"测试运行中: {seconds}秒")
    
    def extend_dwin_handlers(self):
        """扩展DWIN处理函数"""
        # 覆盖DWIN类中的处理函数 
        #self.reg_callback("_handle_start_test", self.handle_start_test)
        #self.reg_callback("_handle_stop_test", self.handle_stop_test)
        self.reg_callback("_write_eeprom", self.write_eeprom)
        #self.reg_callback("_handle_capture_background",lambda: print("采集背景"))
        #self.reg_callback("_handle_capture_sample", lambda: print("采集样品"))
        print(self)

    def init(self):
        self.setup()
        self.extend_dwin_handlers()
        #led_time = 0
        print("DWin_LCD is Runing...")
         
        
    def run(self):
        """运行主循环""" 
        # print("开始运行...") 
        if True:
            # 处理DWIN屏幕数据
            self.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:
        eeprom  = EEPROM()
        test = DwinTest(eeprom)
        test.init()
        while True:
            test.run()
    except Exception as e:
        print(f"错误: {e}")
        import sys
        sys.print_exception(e)

if __name__ == "__main__":
    main()
    
    
       # End File