--[[**************Copyright(c)********************************
**                Guangzhou DACAIGAUNGDIAN Technology Co. Ltd
**
**                             http://www.gz-dc.com
**
**------File Info-----------------------------------------------------------
** File Name:               bspKey.lua
** Latest modified Date:    2024/08/21
** Latest Version:            
** Description:             屏幕IO用在外部按键检测驱动
**
**--------------------------------------------------------------------------]]--

-- 按键状态跟踪表（存储所有注册按键的信息）
local keys = {}

-- 注册按键监测（默认长按时间1秒）
function registerKey(pin, active, onSinglePress, onSingleRelease, onLongPress, onLongRelease, longPressTime)
    -- 初始化按键信息结构
    local key = {
        pin = pin,                            -- GPIO引脚编号
		active = active,					  -- 检测按下有效电平
        state = false,                        -- 当前物理状态（假设false=抬起）
        last_state = false,                   -- 上次检测的物理状态
        press_ts = 0,                         -- 按下时间戳
        long_triggered = false,               -- 长按事件触发标记
        long_duration = longPressTime or 100,   -- 长按判定时间（ms）
        callbacks = {
            single_press = onSinglePress,
            single_release = onSingleRelease,
            long_press = onLongPress,
            long_release = onLongRelease
        }
    }
	gpio_set_in(pin)
    table.insert(keys, key)
end

-- 更新所有按键状态（需要循环调用）
function updateKeys()
    local current_ts = get_tick_count()  -- 获取当前时间（单位：ms）
    
    for _, key in ipairs(keys) do
        -- 获取实际物理状态（需根据硬件实现修改读取方式）
        key.state = (gpio_get_value(key.pin) == key.active)  -- 检测到按下
        
        -- 状态发生变化时
        if key.state ~= key.last_state then
            -- 按下事件处理
            if key.state then
                key.press_ts = current_ts
                key.long_triggered = false
                -- 立即触发单按按下回调
                if key.callbacks.single_press then
                    key.callbacks.single_press()
                end
            -- 抬起事件处理
            else
                -- 根据是否触发过长按执行不同回调
                if key.long_triggered then
                    if key.callbacks.long_release then
                        key.callbacks.long_release()
                    end
                else
                    if key.callbacks.single_release then
                        key.callbacks.single_release()
                    end
                end
                -- 重置状态跟踪
                key.press_ts = 0
                key.long_triggered = false
            end
            key.last_state = key.state
        end
        
        -- 持续按下状态检测
        if key.state and not key.long_triggered then
            local duration = current_ts - key.press_ts
            if duration >= key.long_duration then
                key.long_triggered = true
                if key.callbacks.long_press then
                    key.callbacks.long_press()
                end
            end
        end
    end
end
