/*
 * @file hv_mw_OsdEvent.h
 * @brief Header file of osd event.
 *
 * @verbatim
 * ==============================================================================
 *                        ##### How to use #####
 * ==============================================================================
 * (+) Use Hv_Mw_OsdSetKeyState() to set a key's state.
 * (+) Use Hv_Mw_OsdGetKeyValue() to get current key value.
 * (+) Use Hv_Mw_OsdGetHoldKey() to get holding key value.
 * (+) Use Hv_Mw_OsdGetKeyIsRepeating() to get a key is repeating.
 * (+) Use Hv_Mw_OsdSetKeyRepeatPeriod() to set key repeat period.
 * (+) Use Hv_Mw_OsdSetKeyHoldPeriod() to set key hold period.
 * (+) Use Hv_Mw_OsdEventProc() to process osd event.
 * (+) Use Hv_Mw_OsdEventGetCloseSceneId() to get osd auto close scene id.
 * (+) Use Hv_Mw_OsdStartAutoCloseTimer() to start auto close timer.
 * (+) Use Hv_Mw_OsdStopAutoCloseTimer() to start auto close timer.
 * (+) Use Hv_Mw_OsdEventGetRefreshSceneId() to get osd auto refresh scene id.
 * (+) Use Hv_Mw_OsdStartAutoRefreshTimer() to start auto refresh timer.
 * (+) Use Hv_Mw_OsdStopAutoRefreshTimer() to stop auto refresh timer.
 * (+) Use Hv_Mw_OsdEventInit() to init osd event.
 * (+) Use Hv_Mw_OsdEventDeinit() to de-init osd event.
 *
 * @endverbatim
 * @author HiView SoC Software Team
 * @version 1.0.0
 * @date 2022-09-01
 */

#ifndef _HV_MW_OSD_EVENT_H
#define _HV_MW_OSD_EVENT_H

#include "hv_comm_Event.h"
#include "hv_comm_Timer.h"
#include "KeyboardConfig.h"

typedef enum {
    KEY_STATE_HOLDABLE,
    KEY_STATE_REPEATABLE,
    KEY_STATE_DISABLE,
} OsdKeyState;

typedef enum
{
    OSDEVT_CACHABLE,
    OSDEVT_CACHABLE_ONCE,
    OSDEVT_FORCE_PROCESS,
    OSDEVT_LOGOING_PROCESS,
} OsdEventProp;

/**
 * @brief 设置消息属性
 * @param[in] usEventId 消息序号
 * @param[in] enProp 消息属性
 * @param[in] bIsSet 是set，否则为clear
 */
VOID Hv_Mw_OsdSetEventProp(USHORT16 usEventId, OsdEventProp enProp, BOOL bIsSet);

/**
 * @brief 获取消息属性
 * @param[in] usEventId 消息序号
 * @param[in] enProp 消息属性
 */
BOOL Hv_Mw_OsdGetEventProp(USHORT16 usEventId, OsdEventProp enProp);

/**
 * @brief 设置按键状态
 * @param[in] enId 消息序号
 * @param[in] CHAR8 * 名称字符串
 */
const CHAR8 *Hv_Mw_OsdGetEventName(OsdEventId enId);

/**
 * @brief 设置按键状态
 * @param[in] enId 按键键值
 * @param[in] CHAR8 * 名称字符串
 */
const CHAR8 *Hv_Mw_OsdGetKeyName(OsdEvtKeyValue enId);

/**
 * @brief 设置按键状态
 * @param[in] eKey 按键键值
 * @param[in] eState 按键状态：可重复、可长按、禁用
 * @param[in] bIsSet 是否是set，否则为clear
 */
VOID Hv_Mw_OsdSetKeyState(OsdEvtKeyValue eKey, OsdKeyState eState, BOOL bIsSet);

/**
 * @brief 启用/禁用所有按键
 * @param[in] bEnable 使能
 */
VOID Hv_Mw_OsdSetAllKeyEnable(BOOL bEnable);

/**
 * @brief 获取当前的键值
 * @return OSD内部事件类型
 */
OsdEvtKeyValue Hv_Mw_OsdGetKeyValue(VOID);

/**
 * @brief 获取长按键的键值
 * @return OSD内部事件类型
 */
OsdEvtKeyValue Hv_Mw_OsdGetHoldKey(VOID);

/**
 * @brief 判断按键当前是否正在repeating
 * @param[in] eKey 按键键值
 * @return 按键是否正在repeating
 */
BOOL Hv_Mw_OsdGetKeyIsRepeating(OsdEvtKeyValue enKey);

/**
 * @brief 设置重复按键timer的周期
 * @param[in] uiPeriodMS 重复按键timer的周期（ms）
 */
VOID Hv_Mw_OsdSetKeyRepeatPeriod(UINT32 uiPeriodMS);

/**
 * @brief 设置长按按键timer的时长
 * @param[in] uiHoldTimeMS 长按按键timer的时长（ms）
 */
VOID Hv_Mw_OsdSetKeyHoldPeriod(UINT32 uiHoldTimeMS);

/**
 * @brief 设置长按某个按键timer的时长
 * @param[in] eKey 按键键值
 * @param[in] uiHoldTimeMS 长按按键timer的时长（ms）
 */
VOID Hv_Mw_OsdSetOneKeyHoldPeriod(OsdEvtKeyValue enKey, UINT32 uiHoldTimeMS);

/**
 * @brief 将来自外部EventHub的OSD事件类型转为OSD内部事件类型
 * @param[in] stEventMsg 来自外部EventHub的OSD事件类型
 */
VOID Hv_Mw_OsdEventProc(OsdEvent *pstEventMsg);

/**
 * @brief 启动自动关闭指定scene的timer
 * @param[in] ucSceneId 自动关闭的scene id
 * @param[in] uiMs 超时时间，单位：毫秒
 */
VOID Hv_Mw_OsdStartAutoCloseTimerMs(UCHAR8 ucSceneId, UINT32 uiMs);

/**
 * @brief 启动自动关闭指定scene的timer
 * @param[in] ucSceneId 自动关闭的scene id
 * @param[in] usSecond 超时时间，单位：秒
 */
VOID Hv_Mw_OsdStartAutoCloseTimer(UCHAR8 ucSceneId, USHORT16 usSecond);

/**
 * @brief 停止自动关闭指定scene的timer
 * @param[in] ucSceneId 自动关闭的scene id
 */
VOID Hv_Mw_OsdStopAutoCloseTimer(UCHAR8 ucSceneId);

/**
 * @brief 启动自动刷新指定scene的timer
 * @param[in] ucSceneId 自动刷新的scene id
 * @param[in] uiTimeoutMs 超时时间，单位：毫秒
 */
VOID Hv_Mw_OsdStartAutoRefreshTimer(UCHAR8 ucSceneId, UINT32 uiTimeoutMs);

/**
 * @brief 停止自动刷新指定scene的timer
 * @param[in] ucSceneId 自动刷新的scene id
 */
VOID Hv_Mw_OsdStopAutoRefreshTimer(UCHAR8 ucSceneId);

/**
 * @brief 开始Logo显示的timer
 * @param[in] uiMs 时间：毫秒
 */
VOID Hv_Mw_OsdStartLogoTimerMs(UINT32 uiMs);

/**
 * @brief 开始Logo显示的timer
 * @param[in] ucSceneId 自动刷新的scene id
 */
VOID Hv_Mw_OsdStartLogoTimer(USHORT16 usSecond);

/**
 * @brief 停止自动刷新指定scene的timer
 */
VOID Hv_Mw_OsdStopLogoTimer(VOID);

/**
 * @brief 开始定时提醒的timer
 * @param[in] ucRemindId 定时提醒的id
 * @param[in] uiTimeoutMs 超时时间，单位：毫秒
 * @param[in] bRepeat 是否重复
 */
VOID Hv_Mw_OsdStartReminderTimer(UCHAR8 ucRemindId, UINT32 uiTimeoutMs, BOOL bRepeat);

/**
 * @brief 停止定时提醒的timer
 * @param[in] ucRemindId 定时提醒的id
 */
VOID Hv_Mw_OsdStopReminderTimer(UCHAR8 ucRemindId);

/**
 * @brief Osd Event相关数据初始化
 */
VOID Hv_Mw_OsdEventInit(VOID);

/**
 * @brief Event deinit
 */
VOID Hv_Mw_OsdEventDeinit(VOID);

#ifdef HV_SCALER_DEBUG_VERSION
VOID Hv_Mw_OsdSetAutoCloseTimerEnable(BOOL bEnable);
BOOL Hv_Mw_OsdIsMonkeyRunning(VOID);
VOID Hv_Mw_OsdMonkeyTest(BOOL bStart);

VOID Hv_Mw_OsdStartAutoTestTimer(UINT32 uiTimeoutMs);
VOID Hv_Mw_OsdStopAutoTestTimer(VOID);
#endif

#endif
