/*
 * @file hv_mw_OsdOperation.h
 * @brief Header file of osd MiddleWare operation.
 *
 * @verbatim
 * ==============================================================================
 *                        ##### How to use #####
 * ==============================================================================
 * (+) Use Hv_Mw_OsdOpsIsRedraw() to get current frame is need redraw
 * (+) Use Hv_Mw_OsdOpsClearRedrawFlag() to clear redraw flag
 * (+) Use Hv_Mw_OsdOpsForceRedraw() to set current frame be need redraw forcely
 * (+) Use Hv_Mw_OsdOpsInit() to init osd operations's data
 * (+) Use Hv_Mw_OsdComponentGetDynamicProp() to get a component's dynamic data
 * (+) Use Hv_Mw_OsdComponentUpdateByUserdata() to update&show a dynamic component by userdata
 * (+) Use Hv_Mw_OsdComponentShow() to show a component
 * (+) Use Hv_Mw_OsdComponentHide() to hide a component
 * (+) Use Hv_Mw_OsdItemShow() to show a item
 * (+) Use Hv_Mw_OsdItemHide() to hide a item
 * (+) Use Hv_Mw_OsdItemGetEnable() to get item's enable state
 * (+) Use Hv_Mw_OsdItemSetEnable() to set item's enable state
 * (+) Use Hv_Mw_OsdItemEnableList() to set item list's enable state
 * (+) Use Hv_Mw_OsdSetItemNumInPage() to set item's max num in page
 * (+) Use Hv_Mw_OsdGetItemNumInPage() to get item's max num in page
 * (+) Use Hv_Mw_OsdItemGetLevel() to get item's menu level
 * (+) Use Hv_Mw_OsdItemGetStartIdInPage() to get first item in item's list page
 * (+) Use Hv_Mw_OsdItemGetBias() to get a item's bias in its list
 * (+) Use Hv_Mw_OsdItemGetPage() to get a item's page info
 * (+) Use Hv_Mw_OsdItemShowList() to update&show a item list
 * (+) Use Hv_Mw_OsdItemShowListWithSingleChild() to update&show a item list with child
 * (+) Use Hv_Mw_OsdItemShowListWithSingleValue() to update&show a item list with value
 * (+) Use Hv_Mw_OsdItemShowValueList() to update&show a item's value list
 * (+) Use Hv_Mw_OsdItemRefreshList() to refresh a item list (already visable)
 * (+) Use Hv_Mw_OsdItemHideList() to hide a item list
 * (+) Use Hv_Mw_OsdItemHideListWithSingleChild() to hide a item list with child
 * (+) Use Hv_Mw_OsdItemHideListWithSingleValue() to hide a item list with value
 * (+) Use Hv_Mw_OsdItemHideValueList() to hide a item's value list
 * (+) Use Hv_Mw_OsdItemUnSelect() to unselect a item
 * (+) Use Hv_Mw_OsdItemSelect() to select a item
 * (+) Use Hv_Mw_OsdItemUpdateSelectList() to update a select list
 * (+) Use Hv_Mw_OsdItemGetFocusing() to get current focusing item
 * (+) Use Hv_Mw_OsdItemFocusClear() to clear currennt focusing item
 * (+) Use Hv_Mw_OsdItemFocus() to set focusing on a item
 * (+) Use Hv_Mw_OsdItemFocusChild() to move focusing to child item
 * (+) Use Hv_Mw_OsdItemFocusChildSelect() to move focusing to child item which is selected
 * (+) Use Hv_Mw_OsdItemFocusValue() to move focusing to value item
 * (+) Use Hv_Mw_OsdItemFocusParent() to move focusing to parent item
 * (+) Use Hv_Mw_OsdItemFocusNext() to move focusing to next item
 * (+) Use Hv_Mw_OsdItemFocusPrev() to move focusing to previous item
 * (+) Use Hv_Mw_OsdWindowClearShowList() to clear a window's ShowList
 * (+) Use Hv_Mw_OsdWindowClearDeleteList() to clear a window's DeleteList
 * (+) Use Hv_Mw_OsdWindowClearUpdateInfo() to clear a window's UpdateInfo
 * (+) Use Hv_Mw_OsdWindowCheckIsEmpty() to check a window is empty.
 * (+) Use Hv_Mw_OsdSceneInit() to init a scene before show
 * (+) Use Hv_Mw_OsdSceneShow() to show a scene.
 * (+) Use Hv_Mw_OsdSceneHide() to hide a scene.
 * (+) Use Hv_Mw_OsdSceneRefresh() to refresh a scene's data
 * (+) Use Hv_Mw_OsdSceneRefreshAll() to refresh all scenes's data
 * (+) Use Hv_Mw_OsdSceneClear() to clear a scene's data
 * (+) Use Hv_Mw_OsdSceneClearAll() to hide & clear all scenes's data
 * (+) Use Hv_Mw_OsdSceneIsShowing() to check a scene is showing
 *
 * @endverbatim
 * @author HiView SoC Software Team
 * @version 1.0.0
 * @date 2022-09-01
 */

#ifndef _HV_MW_OSD_OPS_H
#define _HV_MW_OSD_OPS_H

#include "hv_mw_OsdComm.h"
#include "hv_app_Function.h"

typedef enum {
    FOCUSING_NEXT,
    FOCUSING_PREV,
    FOCUSING_CHILD,
    FOCUSING_CHILD_SELECT,
    FOCUSING_VALUE,
    FOCUSING_PARENT,
    FOCUSING_CHOSEN,
    FOCUSING_CLEAR,
} OsdMoveFocusingItem;

/**
 * @brief 判断当前帧是否需要重画
 * @return HV_TRUE-需要重画， HV_FALSE-不需要重画（更新）
 */
BOOL Hv_Mw_OsdOpsIsRedraw(VOID);

/**
 * @brief 清除重画flag
 */
VOID Hv_Mw_OsdOpsClearRedrawFlag(VOID);

/**
 * @brief 强制设置当前帧是否重画
 * @param[in] bRedraw HV_TRUE-重画， HV_FALSE-仅更新画
 */
VOID Hv_Mw_OsdOpsForceRedraw(BOOL bRedraw);

#if (HV_PROJECT_CONFIG_OSD_FORCE_REDRAW_ALL == HV_CONFIG_OFF)
/**
 * @brief 重置所有window的font记录信息
 */
VOID Hv_Mw_OsdResetFontResList(VOID);

#ifdef HV_SCALER_DEBUG_VERSION
/**
 * @brief FOR DEBUG，打印所有window的font记录信息
 */
VOID Hv_Mw_OsdPrintFontResList(VOID);
#endif
#endif

/**
 * @brief 判断当前界面是否需要多帧画
 * @return HV_TRUE-需要多帧画， HV_FALSE-不需要多帧画
 */
BOOL Hv_Mw_OsdOpsIsMultiFrameDraw(VOID);

/**
 * @brief 清除多帧画flag
 */
VOID Hv_Mw_OsdOpsClearMultiFrameDrawFlag(VOID);

/**
 * @brief Osd operations模块数据初始化
 */
VOID Hv_Mw_OsdOpsInit(VOID);

#ifdef HV_SCALER_DEBUG_VERSION
/**
 * @brief 输出OSD界面统计数据信息
 */
VOID Hv_Mw_OsdSceneDebugStat(VOID);
#endif

/**
 * @brief 获取组件所在window
 * @return OsdWindow window结构体指针
 */
OsdWindow *Hv_Mw_OsdComponentGetWindow(OsdComponent stCp);

/**
 * @brief 获取组件的绝对位置
 * @param[in] usItemId Item的Id，若组件属于scene需将usItemId设置为ITEM_NONE_ID
 * @param[in] stCp 组件类型及Id
 * @param[out] usX 获取的组件X位置
 * @param[out] usY 获取的组件Y位置
 */
VOID Hv_Mw_OsdComponentGetPosition(USHORT16 usItemId, OsdComponent stCp, USHORT16 usX, USHORT16 usY);

/**
 * @brief 获取组件的动态数据指针
 * @param[in] stCp 组件类型及Id
 * @param[in] usX bIsOffset==true为组件X位置，bIsOffset==false为Item的X位置
 * @param[in] usY bIsOffset==true为组件Y位置，bIsOffset==false为Item的Y位置
 * @param[in] bIsOffset 区分直接设置组件位置和通过Item偏移设置组件位置
 */
VOID Hv_Mw_OsdComponentSetPosition(OsdComponent stCp, USHORT16 usX, USHORT16 usY, BOOL bIsOffset);

/**
 * @brief 获取组件的动态数据指针
 * @param[in] stCp 组件类型及Id
 * @return 对应的动态数据指针
 */
VOID *Hv_Mw_OsdComponentGetDynamicProp(OsdComponent stCp);

/**
 * @brief 获取组件Node
 * @param[in] stCp 组件类型及Id
 * @return OsdComponentNode 对应的Node指针
 */
OsdComponentNode *Hv_Mw_OsdComponentGetNode(OsdComponent stCp);

/**
 * @brief 更新AsciiString组件的字符串内容
 * @param[in] enIndex 组件Id
 * @param[in] pucString 字符串
 * @param[in] ucStringLength 字符串长度
 */
VOID Hv_Mw_OsdDynamicAsciiStringUpdate(OsdAsciiStringId enIndex, UCHAR8* pucString, UCHAR8 ucStringLength);

/**
 * @brief 更新显示AsciiString组件的字符串内容
 * @param[in] usId 组件Id
 * @param[in] fmt 格式化字符串
 */
VOID Hv_Mw_OsdAsciiStringComponentShow(USHORT16 usId, const CHAR8 *fmt, ...);

/**
 * @brief 根据指定userdata的值，更新并显示组件
 * @param[in] stCp 组件类型及Id
 * @param[in] enUserdata userdata枚举类型
 */
VOID Hv_Mw_OsdComponentUpdateByUserdata(OsdComponent stCp, UserdataId enUserdata);

/**
 * @brief 显示一个组件
 * @param[in] stCp 组件类型及Id
 */
VOID Hv_Mw_OsdComponentShow(OsdComponent stCp);

/**
 * @brief 隐藏一个组件
 * @param[in] stCp 组件类型及Id
 */
VOID Hv_Mw_OsdComponentHide(OsdComponent stCp);

/**
 * @brief 显示指定item的当前状态下的cursor
 * @param[in] usItemId 指定item的Id
 */
VOID Hv_Mw_OsdCursorShowByItem(USHORT16 usItemId);

/**
 * @brief 隐藏指定item的当前状态下的cursor
 * @param[in] usItemId 指定item的Id
 */
VOID Hv_Mw_OsdCursorHideByItem(USHORT16 usItemId);


/**
 * @brief 设置一个item的位置
 * @param[in] usItemId item的Id
 * @param[in] usX x坐标值
 * @param[in] usY y坐标值
 */
VOID Hv_Mw_OsdItemSetPosition(USHORT16 usItemId, USHORT16 usX, USHORT16 usY);

/**
 * @brief 设置一个item的位置
 * @param[in] ucCursorId cursor的Id
 * @param[in] usItemX x坐标值
 * @param[in] usItemY y坐标值
 * @param[in] ucItemState cursor 所在item的状态
 */
VOID Hv_Mw_OsdCursorSetPositon(UCHAR8 ucCursorId, USHORT16 usItemX, USHORT16 usItemY, UCHAR8 ucItemState);

/**
 * @brief 判断一个item是否正在显示
 * @param[in] usItemId item的Id
 */
BOOL Hv_Mw_OsdItemIsShowing(USHORT16 usItemId);

/**
 * @brief 显示一个item
 * @param[in] usItemId item的Id
 */
VOID Hv_Mw_OsdItemShow(USHORT16 usItemId);

/**
 * @brief 隐藏一个item
 * @param[in] usItemId item的Id
 */
VOID Hv_Mw_OsdItemHide(USHORT16 usItemId);

/**
 * @brief 刷新一个item
 * @param[in] usItemId item的Id
 */
VOID Hv_Mw_OsdItemRefresh(USHORT16 usItemId);

/**
 * @brief 更新一个item的状态并显示（强制更新状态，不会进行disable/disable hide检查）
 * @param[in] usItemId item的Id
 * @param[in] enState item的状态
 */
VOID Hv_Mw_OsdItemShowWithState(USHORT16 usItemId, OsdItemState enState);

/**
 * @brief 更新一个item的状态
 * @param[in] usItemId item的Id
 * @param[in] enState item的状态
 */
VOID Hv_Mw_OsdItemSetState(USHORT16 usItemId, OsdItemState enState);

/**
 * @brief 获取一个item的状态
 * @param[in] usItemId item的Id
 * @return OsdItemState item的状态
 */
OsdItemState Hv_Mw_OsdItemGetState(USHORT16 usItemId);

/**
 * @brief 获取一个item是否enable
 * @param[in] usItemId item的Id
 * @return BOOL 正常-HV_TRUE, 禁用-HV_FALSE
 */
BOOL Hv_Mw_OsdItemGetEnable(USHORT16 usItemId);

/**
 * @brief 寻找上一个未被禁用的item
 * @param[in] usItemId 当前item的Id
 * @return USHORT16 上一个未被禁用的item id
 */
USHORT16 Hv_Mw_OsdItemFindPrevEnable(USHORT16 usItemId);

/**
 * @brief 寻找下一个未被禁用的item
 * @param[in] usItemId 当前item的Id
 * @return USHORT16 下一个未被禁用的item id
 */
USHORT16 Hv_Mw_OsdItemFindNextEnable(USHORT16 usItemId);

/**
 * @brief 设置一个item是否enable
 * @param[in] usItemId item的Id
 * @param[in] bEnable 正常-HV_TRUE, 禁用-HV_FALSE
 */
VOID Hv_Mw_OsdItemSetEnable(USHORT16 usItemId, BOOL bEnable);

/**
 * @brief 更新item列表中的所有item的禁用状态
 * @param[in] usItem list中的ItemId
 * @param[in] bIncludeSelf 是否包含当前item
 * @param[in] bEnable 正常-HV_TRUE, 禁用-HV_FALSE
 */
VOID Hv_Mw_OsdItemEnableList(USHORT16 usItem, BOOL bIncludeSelf, BOOL bEnable);

/**
 * @brief 设置当前页的item最大显示个数
 * @param[in] usNum 最大显示个数
 */
VOID Hv_Mw_OsdSetItemNumInPage(USHORT16 usNum);

/**
 * @brief 获取当前页的item最大显示个数
 * @return USHORT16 最大显示个数
 */
USHORT16 Hv_Mw_OsdGetItemNumInPage(VOID);

/**
 * @brief 获取当前ItemList中正在显示的item个数
 * @param[in] usItemId itemList中任意item的Id
 * @return USHORT16 显示个数
 */
USHORT16 Hv_Mw_OsdItemGetShowingNum(USHORT16 usItemId);

/**
 * @brief 获取item所在的list的item总数
 * @return USHORT16 item数量
 */
USHORT16 Hv_Mw_OsdItemGetListNum(USHORT16 usItemId);

/**
 * @brief 获取item的child item总数
 * @return USHORT16 child item数量
 */
USHORT16 Hv_Mw_OsdItemGetChildNum(USHORT16 usItemId);

/**
 * @brief 获取item所在的菜单等级
 * @return USHORT16 菜单等级
 */
USHORT16 Hv_Mw_OsdItemGetLevel(USHORT16 usItem);

/**
 * @brief 获取一个item在显示页中的首个Item
 * @param[in] usItem item的Id
 * @return 首个Itemitem的Id
 */
USHORT16 Hv_Mw_OsdItemGetStartIdInPage(USHORT16 usItem);

/**
 * @brief 获取一个item在显示页中的最后一个Item
 * @param[in] usItem item的Id
 * @return 最后一个Itemitem的Id
 */
USHORT16 Hv_Mw_OsdItemGetEndIdInPage(USHORT16 usItem);

/**
 * @brief 获取一个item在显示列表中的偏移
 * @param[in] usItem item的Id
 * @return item的偏移
 */
USHORT16 Hv_Mw_OsdItemGetBias(USHORT16 usItem);

/**
 * @brief 获取一个item所绑定的userdata id
 * @param[in] usItem item的Id
 * @return userdata id
 */
USHORT16 Hv_Mw_OsdItemGetUserdata(USHORT16 usItemId);
#define OSD_GET_USERDATA            Hv_Mw_OsdItemGetUserdata

/**
 * @brief 获取一个item所绑定的userdata id的值
 * @param[in] usItem item的Id
 * @return userdata的值
 */
USHORT16 Hv_Mw_OsdItemGetUserdataValue(USHORT16 usItemId);
#define OSD_GET_USERDATA_VALUE      Hv_Mw_OsdItemGetUserdataValue

/**
 * @brief 获取一个item在显示列表中的页信息
 * @param[in] usItem item的Id
 * @param[in] ucCurPage item所在的页数
 * @param[in] ucTotalPageNum item所在的列表的总页数
 */
VOID Hv_Mw_OsdItemGetPage(USHORT16 usItem, UCHAR8 *pucCurPage, UCHAR8 *pucTotalPageNum);

/**
 * @brief 获取一个item在显示列表中的页信息(若页面全部disable，则不计入该页)
 * @param[in] usItem item的Id
 * @param[in] ucCurPage item所在的页数
 * @param[in] ucTotalPageNum item所在的列表的总页数
 */
VOID Hv_Mw_OsdItemGetPageCheckEnable(USHORT16 usItem, UCHAR8 *pucCurPage, UCHAR8 *pucTotalPageNum);

/**
 * @brief 判断两个item是否在同一页
 * @param[in] usItem1 item1的Id
 * @param[in] usItem2 item2的Id
 * @return HV_TRUE-在同一页， HV_FALSE-不在同一页
 */
BOOL Hv_Mw_OsdItemIsAtSamePage(USHORT16 usItem1, USHORT16 usItem2);

/**
 * @brief 更新并显示一个item列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemShowList(USHORT16 usItem);

/**
 * @brief 更新并显示一个item列表(若当前页面全部disable，则显示下一页)
 * @param[in] usItem item列表中任意一个item的Id
 * @return USHORT16 首个未被禁用的item id
 */
USHORT16 Hv_Mw_OsdItemShowListCheckEnable(USHORT16 usItem);

/**
 * @brief 隐藏一个item列表(若当前页面全部disable，则隐藏下一页)
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemHideListCheckEnable(USHORT16 usItem);

/**
 * @brief 更新并显示一个item列表及每个item的child
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemShowListWithSingleChild(USHORT16 usItem);

/**
 * @brief 更新并显示一个item列表及每个item的value
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemShowListWithSingleValue(USHORT16 usItem);

/**
 * @brief 更新并显示一个item value的列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemShowValueList(USHORT16 usItem);

/**
 * @brief 刷新item所在的整个item列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemRefreshList(USHORT16 usItem);

/**
 * @brief 隐藏一个item列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemHideList(USHORT16 usItem);

/**
 * @brief 隐藏item所在的整个item列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemHideListAll(USHORT16 usItem);

/**
 * @brief 隐藏一个item列表及每个item的child
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemHideListWithSingleChild(USHORT16 usItem);

/**
 * @brief 隐藏一个item列表及每个item的value
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemHideListWithSingleValue(USHORT16 usItem);

/**
 * @brief 隐藏一个item value的列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemHideValueList(USHORT16 usItem);

/**
 * @brief 获取item的原始位置
 * @param[in] usItemId Item的Id
 * @param[out] pusX 获取的item X位置
 * @param[out] pusY 获取的item Y位置
 */
VOID Hv_Mw_OsdItemGetOriPosition(USHORT16 usItemId, USHORT16 *pusX, USHORT16 *pusY);

#ifdef OSD_CHECK_DISABLE_HIDE_AND_ITEMLIST_AUTO_ALIGN
/**
 * @brief 获取一个item自动对齐后在显示列表中的页信息
 * @param[in] usItem item的Id
 * @param[in] ucCurPage item所在的页数
 * @param[in] ucTotalPageNum item所在的列表的总页数
 */
VOID Hv_Mw_OsdItemGetPageAlign(USHORT16 usItemId, UCHAR8 *pucCurPage, UCHAR8 *pucTotalPageNum);

/**
 * @brief 自动对齐并显示一个item 列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemShowListAlign(USHORT16 usItemId);

/**
 * @brief 自动对齐并隐藏一个item 列表
 * @param[in] usItem item列表中任意一个item的Id
 */
VOID Hv_Mw_OsdItemHideListAlign(USHORT16 usItemId);
#endif

#ifndef OSD_CHECK_DISABLE_BY_EACH_ITEM
/**
 * @brief 根据条件禁用item列表
 * @param[in] bCondition 判断条件
 * @param[in] pusItemArray item列表
 * @param[in] usItemNum item数量
 */
VOID Hv_Mw_ItemDisableByCondition(BOOL bCondition, const USHORT16 *pusItemArray, USHORT16 usItemNum);

/**
 * @brief 恢复所有禁用Item的状态
 */
VOID Hv_Mw_ItemRecoverDisableArray(VOID);
#endif

/**
 * @brief 检查item是否被选中
 * @param[in] usItemId item list中的任意一个的item的Id
 * @param[in] bCheckState HV_TRUE-根据item当前状态寻找，HV_FALSE-根据当前对应userdata值寻找
 * @return item是否被选中
 */
BOOL Hv_Mw_OsdItemCheckSelect(USHORT16 usItemId, BOOL bCheckState);

/**
 * @brief 查找item list中被选中的item
 * @param[in] usItemId item list中的任意一个的item的Id
 * @param[in] bCheckState HV_TRUE-根据item当前状态寻找，HV_FALSE-根据当前对应userdata值寻找
 * @return 当前选择的item的Id
 */
USHORT16 Hv_Mw_OsdItemFindSelected(USHORT16 usItemId, BOOL bCheckState);

/**
 * @brief 取消选择一个item为当前设置项，将item状态更新为NORMAL/FOCUSING
 * @param[in] usItemId 要取消选择的item的Id
 */
VOID Hv_Mw_OsdItemUnSelect(USHORT16 usItemId);

/**
 * @brief 选择一个item为当前设置项，将item状态更新为SELECT/SELECT_FOCUS
 * @param[in] usItemId 要选择的item的Id
 * @return 对应的userdata值
 */
SHORT16 Hv_Mw_OsdItemSelect(USHORT16 usItemId);

/**
 * @brief 根据当前userdata值，更新select列表的选中状态
 * @param[in] usItemListStartId select列表的任意item的Id
 * @return select的itemid
 */
USHORT16 Hv_Mw_OsdItemUpdateSelectList(USHORT16 usItemId);

/**
 * @brief 根据当前userdata值，显示select item所在的页
 * @param[in] usItem select列表中的任意item的Id
 * @return select的itemid
 */
USHORT16 Hv_Mw_OsdItemShowSelectedList(USHORT16 usItem);

/**
 * @brief 隐藏select item所在的页
 * @param[in] usItem select列表中的任意item的Id
 */
VOID Hv_Mw_OsdItemHideSelectedList(USHORT16 usItem);

/**
 * @brief 获取当前正在聚焦的item的id
 * @return 正在聚焦的item的id
 */
USHORT16 Hv_Mw_OsdItemGetFocusing(VOID);
#define OSD_GET_FOCUSING    Hv_Mw_OsdItemGetFocusing

/**
 * @brief 清除当前正在聚焦的item
 */
VOID Hv_Mw_OsdItemFocusClear(VOID);

/**
 * @brief 根据当前item查找指定的item
 * @param[in] usCurItemId 当前item的id
 * @param[in] eWhichItem 查找item与当前item的关系
 * @return 查找到的item的数据结构
 */
OsdItem *Hv_Mw_OsdItemSearchMoveFocus(USHORT16 usCurItemId, OsdMoveFocusingItem eWhichItem);

/**
 * @brief 聚焦到指定的item
 * @param[in] usItemId 指定聚焦的item的id
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocus(USHORT16 usItemId);

/**
 * @brief 移动聚焦到子item
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusChild(VOID);

/**
 * @brief 移动聚焦到被选中的子item，没有被选中的则聚焦到首个
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusChildSelect(VOID);

/**
 * @brief 移动聚焦到被选中的value item
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusValue(VOID);

/**
 * @brief 移动聚焦到父item
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusParent(VOID);

/**
 * @brief 移动聚焦到下一个item
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusNext(VOID);

/**
 * @brief 移动聚焦到上一个item
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusPrev(VOID);

/**
 * @brief 移动聚焦到下一个item，并且自动翻页
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusNextAutoFlip(VOID);

/**
 * @brief 移动聚焦到上一个item，并且自动翻页
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusPrevAutoFlip(VOID);

/**
 * @brief 移动聚焦到下一个item，并且自动翻页（包括child item list）
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusNextAutoFlipWithSingleChild(VOID);

/**
 * @brief 移动聚焦到上一个item，并且自动翻页（包括child item list）
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusPrevAutoFlipWithSingleChild(VOID);

/**
 * @brief 移动聚焦到下一个item，并且自动翻页（包括value item list）
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusNextAutoFlipWithSingleValue(VOID);

/**
 * @brief 移动聚焦到上一个item，并且自动翻页（包括value item list）
 * @return 当前聚焦的item id
 */
USHORT16 Hv_Mw_OsdItemFocusPrevAutoFlipWithSingleValue(VOID);

/**
 * @brief 清除当前window的显示绘制链表
 * @param[in] pstWindow window结构体指针
 */
VOID Hv_Mw_OsdWindowClearShowList(OsdWindow* pstWindow);

/**
 * @brief 清除当前window的删除绘制链表
 * @param[in] pstWindow window结构体指针
 */
VOID Hv_Mw_OsdWindowClearDeleteList(OsdWindow* pstWindow);

/**
 * @brief 清除当前window的update绘制信息
 * @param[in] pstWindow window结构体指针
 */
VOID Hv_Mw_OsdWindowClearUpdateInfo(OsdWindow* pstWindow);

/**
 * @brief 判断Window是否为空
 * @return HV_TRUE-为空， HV_FALSE-非空
 */
BOOL Hv_Mw_OsdWindowCheckIsEmpty(UCHAR8 ucWindowId);

/**
 * @brief 初始化一个scene，绘制之前调用
 * @param[in] ucSceneId scene的id
 */
VOID Hv_Mw_OsdSceneInit(UCHAR8 ucSceneId);

/**
 * @brief 显示一个scene，绘制完成最后调用
 * @param[in] ucSceneId scene的id
 */
VOID Hv_Mw_OsdSceneShow(UCHAR8 ucSceneId);

/**
 * @brief 隐藏一个scene
 * @param[in] ucSceneId scene的id
 */
VOID Hv_Mw_OsdSceneHide(UCHAR8 ucSceneId);

/**
 * @brief 刷新一个scene
 * @param[in] ucSceneId scene的id
 */
VOID Hv_Mw_OsdSceneRefresh(UCHAR8 ucSceneId);

/**
 * @brief 刷新所有显示的scene
 */
VOID Hv_Mw_OsdRefreshAll(VOID);

/**
 * @brief 清除一个scene的信息及数据
 * @param[in] ucSceneId scene的id
 */
VOID Hv_Mw_OsdSceneClear(UCHAR8 ucSceneId);

/**
 * @brief 隐藏清除所有scene的信息及数据
 */
VOID Hv_Mw_OsdSceneClearAll(VOID);

/**
 * @brief 获取Scene是否正在显示
 * @param[in] ucSceneId scene的id
 * @return HV_TRUE-显示中， HV_FALSE-未显示
 */
BOOL Hv_Mw_OsdSceneIsShowing(UCHAR8 ucSceneId);

/**
 * @brief 获取正在显示的scene id
 * @param[in] ucSceneIdStart 起始检查的Scene id
 * @return UCHAR8 正在显示的首个scene id
 */
UCHAR8 Hv_Mw_OsdSceneGetShowing(UCHAR8 ucSceneIdStart);

/**
 * @brief 获取是否有OSD正在显示
 * @return HV_TRUE-显示中， HV_FALSE-未显示
 */
BOOL Hv_Mw_OsdIsShowing(VOID);

#endif
