Преглед изворни кода

add:更新exlcd支持合宙量产功能板只需型号参数就能初始化,背光接口统一为bl, lcd_model 统一小写命名

江访 пре 2 месеци
родитељ
комит
0660c50569
1 измењених фајлова са 152 додато и 83 уклоњено
  1. 152 83
      script/libs/exlcd.lua

+ 152 - 83
script/libs/exlcd.lua

@@ -2,96 +2,199 @@
 --[[
 --[[
 @module  exlcd
 @module  exlcd
 @summary LCD显示拓展库
 @summary LCD显示拓展库
-@version 1.0
-@date    2025.09.17
+@version 1.0.4
+@date    2025.11.11
 @author  江访
 @author  江访
 @usage
 @usage
 核心业务逻辑为:
 核心业务逻辑为:
 1、初始化LCD显示屏,支持多种显示芯片
 1、初始化LCD显示屏,支持多种显示芯片
 2、管理屏幕背光亮度及开关状态
 2、管理屏幕背光亮度及开关状态
-3、管理屏幕休眠和唤醒状态
-4、提供屏幕状态管理功能
-
-本文件的对外接口有4个:
-1、exlcd.init(args)   -- LCD初始化函数
-2、exlcd.bkl(level)   -- 设置背光亮度接口,level 亮度级别(0-100)
-3、exlcd.sleep()      -- 屏幕休眠
-4、exlcd.wakeup()     -- 屏幕唤醒
+3、提供屏幕状态管理功能
+4、支持根据lcd_model自动配置参数
+
+本文件的对外接口有3个:
+1、exlcd.init(param)   -- LCD初始化函数
+2、exlcd.set_bl(level)   -- 设置背光亮度接口,level 亮度级别(0-100)
+3、exlcd.get_bl()  -- 当前设置背光亮度级别查询
+4、exlcd.sleep()      -- 屏幕休眠
+5、exlcd.wakeup()     -- 屏幕唤醒
+6、exlcd.get_sleep()  -- 休眠状态查询
 ]]
 ]]
 
 
 local exlcd = {}
 local exlcd = {}
 
 
 -- 屏幕状态管理表
 -- 屏幕状态管理表
 local screen_state = {
 local screen_state = {
-    is_sleeping = false,   -- 是否休眠中标识
-    last_brightness = 100,  -- 默认亮度100%
+    last_brightness = 100, -- 默认亮度100%
     backlight_on = true,   -- 背光默认开启
     backlight_on = true,   -- 背光默认开启
     lcd_config = nil       -- 存储LCD配置
     lcd_config = nil       -- 存储LCD配置
 }
 }
 
 
+-- 预定义屏幕配置表
+local predefined_configs = {
+    Air780EHM_LCD_4 = {
+        lcd_model = "Air780EHM_LCD_4",
+        pin_vcc = 24,
+        pin_rst = 36,
+        pin_pwr = 25,
+        pin_pwm = 2,
+        port = lcd.HWID_0,
+        direction = 3,
+        w = 480,
+        h = 320,
+        xoffset = 0,
+        yoffset = 0,
+        sleepcmd = 0X10,
+        wakecmd = 0X11,
+    },
+
+    AirLCD_1000 = {
+        lcd_model = "AirLCD_1000",
+        pin_vcc = 29,
+        pin_rst = 36,
+        pin_pwr = 30,
+        pin_pwm = 1,
+        port = lcd.HWID_0,
+        direction = 0,
+        w = 320,
+        h = 480,
+        xoffset = 0,
+        yoffset = 0,
+        sleepcmd = 0X10,
+        wakecmd = 0X11,
+    },
+
+    AirLCD_1010 = {
+        lcd_model = "AirLCD_1010",
+        pin_vcc = 141,
+        pin_rst = 36,
+        pin_pwr = 1,
+        pin_pwm = 0,
+        port = lcd.HWID_0,
+        direction = 0,
+        w = 320,
+        h = 480,
+        xoffset = 0,
+        yoffset = 0,
+        sleepcmd = 0X10,
+        wakecmd = 0X11,
+    },
+
+    AirLCD_1020 = {
+        lcd_model = "AirLCD_1020",
+        pin_pwr = 8,
+        pin_pwm = 0,
+        port = lcd.RGB,
+        direction = 0,
+        w = 800,
+        h = 480,
+        xoffset = 0,
+        yoffset = 0,
+        bus_speed = 30 * 1000 * 1000,
+        hbp = 8,
+        hspw = 4,
+        hfp = 8,
+        vbp = 16,
+        vspw = 4,
+        vfp = 16,
+    }
+}
+
 -- LCD初始化函数
 -- LCD初始化函数
--- @param args LCD参数配置表
+-- @param param LCD参数配置表
 -- @return 初始化成功状态
 -- @return 初始化成功状态
-function exlcd.init(args)
-
-    if type(args) ~= "table" then
+function exlcd.init(param)
+    if type(param) ~= "table" then
         log.error("exlcd", "参数必须为表")
         log.error("exlcd", "参数必须为表")
         return false
         return false
     end
     end
 
 
     -- 检查必要参数
     -- 检查必要参数
-    if not args.LCD_MODEL then
-        log.error("exlcd", "缺少必要参数: LCD_MODEL")
+    if not param.lcd_model then
+        log.error("exlcd", "缺少必要参数: lcd_model")
         return false
         return false
     end
     end
 
 
+    local config = {}
+
+    -- 根据lcd_model选择配置策略
+    if param.lcd_model == "Air780EHM_LCD_4" then
+        -- Air780EHM_LCD_4: 只使用lcd_model,其他参数固定
+        config = predefined_configs.Air780EHM_LCD_4
+        log.info("exlcd", "使用Air780EHM_LCD_4固定配置")
+    elseif predefined_configs[param.lcd_model] then
+        -- 其他预定义型号: 使用预定义配置作为基础,传入参数覆盖预定义配置
+        config = {}
+
+        -- 复制预定义配置
+        for k, v in pairs(predefined_configs[param.lcd_model]) do
+            config[k] = v
+        end
+
+        -- 用传入参数覆盖预定义配置
+        for k, v in pairs(param) do
+            if k ~= "lcd_model" or v ~= param.lcd_model then -- 避免重复设置lcd_model
+                config[k] = v
+            end
+        end
+
+        log.info("exlcd", "使用" .. param.lcd_model .. "基础配置,传入参数已覆盖")
+    else
+        -- 未知型号: 直接使用传入参数
+        config = param
+        log.info("exlcd", "使用传入参数配置")
+    end
+
     -- LCD型号映射表
     -- LCD型号映射表
     local lcd_models = {
     local lcd_models = {
         AirLCD_1000 = "st7796",
         AirLCD_1000 = "st7796",
-        AirLCD_1001 = "st7796",
-        Air780EHM_LCD_1 = "st7796",
-        Air780EHM_LCD_2 = "st7796",
-        Air780EHM_LCD_3 = "st7796",
         Air780EHM_LCD_4 = "st7796",
         Air780EHM_LCD_4 = "st7796",
+        AirLCD_1010 = "st7796",
         AirLCD_1020 = "nv3052c"
         AirLCD_1020 = "nv3052c"
     }
     }
 
 
     -- 确定LCD型号
     -- 确定LCD型号
-    local lcd_model = lcd_models[args.LCD_MODEL] or args.LCD_MODEL
+    local lcd_model = lcd_models[config.lcd_model] or config.lcd_model
 
 
     -- 存储LCD配置供其他函数使用
     -- 存储LCD配置供其他函数使用
     screen_state.lcd_config = {
     screen_state.lcd_config = {
-        pin_pwr = args.pin_pwr,
-        pin_pwm = args.pin_pwm,
-        model = lcd_model
+        pin_pwr = config.pin_pwr,
+        pin_pwm = config.pin_pwm,
+        model = lcd_model,
+        lcd_model = config.lcd_model
     }
     }
 
 
     -- 设置电源引脚 (可选)
     -- 设置电源引脚 (可选)
-    if args.pin_vcc then
-        gpio.setup(args.pin_vcc, 1, gpio.PULLUP)
-        gpio.set(args.pin_vcc, 1)
+    if config.pin_vcc then
+        gpio.setup(config.pin_vcc, 1, gpio.PULLUP)
+        gpio.set(config.pin_vcc, 1)
     end
     end
 
 
     -- 设置背光电源引脚 (可选)
     -- 设置背光电源引脚 (可选)
-    if args.pin_pwr then
-        gpio.setup(args.pin_pwr, 1, gpio.PULLUP)
-        gpio.set(args.pin_pwr, 1)  -- 默认开启背光
+    if config.pin_pwr then
+        gpio.setup(config.pin_pwr, 1, gpio.PULLUP)
+        gpio.set(config.pin_pwr, 1) -- 默认开启背光
     end
     end
 
 
     -- 设置PWM背光引脚 (可选)
     -- 设置PWM背光引脚 (可选)
-    if args.pin_pwm then
-        pwm.setup(args.pin_pwm, 1000, screen_state.last_brightness)
-        pwm.open(args.pin_pwm, 1000, screen_state.last_brightness)
+    if config.pin_pwm then
+        pwm.setup(config.pin_pwm, 1000, screen_state.last_brightness)
+        pwm.open(config.pin_pwm, 1000, screen_state.last_brightness)
     end
     end
 
 
     -- 屏幕初始化 (spi_dev和init_in_service为可选参数)
     -- 屏幕初始化 (spi_dev和init_in_service为可选参数)
     local lcd_init = lcd.init(
     local lcd_init = lcd.init(
         lcd_model,
         lcd_model,
-        args,
-        args.spi_dev and args.spi_dev or nil,
-        args.init_in_service and args.init_in_service or nil
+        config,
+        config.spi_dev and config.spi_dev or nil,
+        config.init_in_service and config.init_in_service or nil
     )
     )
     log.info("exlcd", "LCD初始化", lcd_init)
     log.info("exlcd", "LCD初始化", lcd_init)
+
+    -- 自定义初始化完成确认
+    if lcd_model == "custom" then
+        lcd.user_done()
+    end
     return lcd_init
     return lcd_init
 end
 end
 
 
@@ -99,19 +202,17 @@ end
 -- 使用背光PWM模式控制亮度
 -- 使用背光PWM模式控制亮度
 -- @param level 亮度级别(0-100)
 -- @param level 亮度级别(0-100)
 
 
-function exlcd.bkl(level)
-    -- 检查屏幕状态和PWM配置
-    if screen_state.is_sleeping then
-        log.warn("exlcd", "屏幕处于休眠状态,无法调节背光")
-        return false
-    end
+function exlcd.set_bl(level)
+    -- 检查PWM配置
     if not screen_state.lcd_config.pin_pwm then
     if not screen_state.lcd_config.pin_pwm then
         log.error("exlcd", "PWM配置不存在,无法调节背光")
         log.error("exlcd", "PWM配置不存在,无法调节背光")
         return false
         return false
     end
     end
 
 
-    -- 确保GPIO已关闭 
-    gpio.close(screen_state.lcd_config.pin_pwr)
+    -- 确保GPIO已关闭
+    if screen_state.lcd_config.pin_pwr then
+        gpio.close(screen_state.lcd_config.pin_pwr)
+    end
 
 
     -- 设置并开启PWM
     -- 设置并开启PWM
     pwm.stop(screen_state.lcd_config.pin_pwm)
     pwm.stop(screen_state.lcd_config.pin_pwm)
@@ -124,36 +225,9 @@ function exlcd.bkl(level)
     return true
     return true
 end
 end
 
 
-
-
--- function exlcd.bkl(level)
---     -- 检查屏幕状态
---     if screen_state.is_sleeping then
---         log.warn("exlcd", "屏幕处于休眠状态,无法调节背光")
---         return
---     end
-
---     -- 确保亮度在有效范围内
---     -- level = level or screen_state.last_brightness
---     -- level = math.max(0, math.min(100, level or 0))
-
---     if screen_state.lcd_config.pin_pwr then
---          gpio.close(screen_state.lcd_config.pin_pwr)
---     end
-
---     -- 设置PWM背光 (如果配置了PWM引脚)
---     if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
---         --pwm.setup(screen_state.lcd_config.pin_pwm, 1000, level)
---         pwm.open(screen_state.lcd_config.pin_pwm, 1000, level)
---     -- 如果没有PWM但配置了电源引脚,则通过开关控制
---     elseif screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
---         gpio.set(screen_state.lcd_config.pin_pwr, level > 0 and 1 or 0)
---     end
-
---     screen_state.last_brightness = level
---     screen_state.backlight_on = (level > 0)
---     log.info("exlcd", "背光设置为", level, "%")
--- end
+function exlcd.get_bl()
+    return screen_state.last_brightness
+end
 
 
 -- 屏幕休眠
 -- 屏幕休眠
 function exlcd.sleep()
 function exlcd.sleep()
@@ -186,7 +260,7 @@ function exlcd.wakeup()
 
 
         -- 唤醒LCD
         -- 唤醒LCD
         lcd.wakeup()
         lcd.wakeup()
-        sys.wait(100)  -- 等待100ms稳定
+        sys.wait(100) -- 等待100ms稳定
 
 
         -- 恢复背光设置 (如果配置了PWM引脚)
         -- 恢复背光设置 (如果配置了PWM引脚)
         if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
         if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
@@ -199,13 +273,8 @@ function exlcd.wakeup()
     end
     end
 end
 end
 
 
-
-function exlcd.get_brightness()
-    return screen_state.last_brightness
-end
-
 -- 获取当前休眠状态
 -- 获取当前休眠状态
-function exlcd.is_sleeping()
+function exlcd.get_sleep()
     return screen_state.is_sleeping
     return screen_state.is_sleeping
 end
 end