/**
* @file hv_mw_OsdUserdata.c
* @brief osd userdata c file.
* @details This file provides the following functions: \n
* (1) Osd userdata functions \n
*
* @author HiView SoC Software Team
* @version 1.0.0
* @date 2022-09-01
* @copyright Copyright(c),2022-8, Hiview Software. All rights reserved.
* @par History:
*
* Author | Date | Change Description
* |
---|
shanpeng | 2022-09-01 | create
* |
*/
#ifdef OSD_ITEM_BIND_USERDATA_BY_TOOL
#include "hv_mw_OsdLog.h"
#include "hv_mw_OsdUserdata.h"
#include "hv_app_Function.h"
#include "hv_drv_Gpio.h"
VOID Hv_Mw_SetFromOsdUserdata(UserdataId enUserdata)
{
HV_ASSERT_TRUE_VOID((E_USERDATA_NONE != enUserdata) && (enUserdata < E_USERDATA_MAX));
SHORT16 sValue = Hv_App_GetOsdDataValue(enUserdata);
Hv_Mw_OsdAdjustFunction(enUserdata, ACT_SET, sValue, SET_INTERFACE);
}
VOID Hv_Mw_OsdUserdataUpdate(UserdataId enWhichData)
{
UserdataProp stOsdDataProp = { 0 };
Hv_App_OsdGetUserdata(enWhichData, &stOsdDataProp);
SHORT16 sOsdValue = 0;
OSD_LOG_DEBUG("Update userdata: %s", Hv_App_GetUserdataName(enWhichData));
if (E_NO_MAP == stOsdDataProp.enMappingType)
{
sOsdValue = stOsdDataProp.sRealValue;
OSD_LOG_DEBUG("Get no mapped value = %d", sOsdValue);
}
else if (E_ENUM_MAP == stOsdDataProp.enMappingType)
{
UCHAR8 ucValueId = 0;
for (; ucValueId < stOsdDataProp.stEnumMap.usCount; ucValueId++)
{
if (stOsdDataProp.sRealValue == stOsdDataProp.stEnumMap.asRealValueMapTable[ucValueId])
{
break;
}
}
sOsdValue = ucValueId;
if (sOsdValue >= stOsdDataProp.stEnumMap.usCount)
{
OSD_LOG_ERROR("Userdata-%d, real value = %d not found!", enWhichData, stOsdDataProp.sRealValue);
sOsdValue = 0;
}
else
{
OSD_LOG_DEBUG("Get enum map value = %d (real value=%d)", sOsdValue, stOsdDataProp.sRealValue);
}
}
else if (E_LINEAR_MAP == stOsdDataProp.enMappingType)
{
sOsdValue = LINEAR_MAPPING_VALUE(stOsdDataProp.sRealValue, stOsdDataProp.stLinerMap.sRealMinValue, stOsdDataProp.stLinerMap.sRealMaxValue,
stOsdDataProp.sMinValue, stOsdDataProp.sMaxValue);
OSD_LOG_DEBUG("Get linear map value = %d (real value=%d)", sOsdValue, stOsdDataProp.sRealValue);
}
else if (E_LINEAR_REVERT_MAP == stOsdDataProp.enMappingType)
{
sOsdValue = LINEAR_REVERT_MAPPING_VALUE(stOsdDataProp.sRealValue, stOsdDataProp.stLinerMap.sRealMinValue, stOsdDataProp.stLinerMap.sRealMaxValue,
stOsdDataProp.sMinValue, stOsdDataProp.sMaxValue);
OSD_LOG_DEBUG("Get linear revert map value = %d (real value=%d)", sOsdValue, stOsdDataProp.sRealValue);
}
else
{
OSD_LOG_ERROR("Userdata-%d mapping type error!", enWhichData);
return;
}
if (sOsdValue != stOsdDataProp.sOsdValue)
{
OSD_LOG_DEBUG("Update OsdUserdata-%d value: %d to %d", enWhichData, stOsdDataProp.sOsdValue, sOsdValue);
Hv_App_OsdSetUserdata(enWhichData, sOsdValue);
}
}
VOID Hv_Mw_OsdUserdataUpdateAll(VOID)
{
OSD_LOG_DEBUG("Osd userdata sync, num = %d", E_USERDATA_MAX);
for (USHORT16 usId = 1; usId < E_USERDATA_MAX; usId++)
{
Hv_Mw_OsdUserdataUpdate(usId);
}
}
SHORT16 Hv_Mw_OsdGetMappedOsdValue(UserdataId enWhichData, SHORT16 sRealValue)
{
UserdataProp stOsdDataProp = { 0 };
Hv_App_OsdGetUserdata(enWhichData, &stOsdDataProp);
SHORT16 sOsdValue = 0;
OSD_LOG_DEBUG("Update userdata: %s", Hv_App_GetUserdataName(enWhichData));
if (E_NO_MAP == stOsdDataProp.enMappingType)
{
sOsdValue = sRealValue;
OSD_LOG_DEBUG("Get no mapped value = %d", sOsdValue);
}
else if (E_ENUM_MAP == stOsdDataProp.enMappingType)
{
UCHAR8 ucValueId = 0;
for (; ucValueId < stOsdDataProp.stEnumMap.usCount; ucValueId++)
{
if (sRealValue == stOsdDataProp.stEnumMap.asRealValueMapTable[ucValueId])
{
break;
}
}
sOsdValue = ucValueId;
if (sOsdValue >= stOsdDataProp.stEnumMap.usCount)
{
OSD_LOG_ERROR("Userdata-%d, real value = %d not found!", enWhichData, sRealValue);
sOsdValue = 0;
}
else
{
OSD_LOG_DEBUG("Get enum map value = %d (real value=%d)", sOsdValue, sRealValue);
}
}
else if (E_LINEAR_MAP == stOsdDataProp.enMappingType)
{
sOsdValue = LINEAR_MAPPING_VALUE(sRealValue, stOsdDataProp.stLinerMap.sRealMinValue, stOsdDataProp.stLinerMap.sRealMaxValue,
stOsdDataProp.sMinValue, stOsdDataProp.sMaxValue);
OSD_LOG_DEBUG("Get linear map value = %d (real value=%d)", sOsdValue, sRealValue);
}
else if (E_LINEAR_REVERT_MAP == stOsdDataProp.enMappingType)
{
sOsdValue = LINEAR_REVERT_MAPPING_VALUE(sRealValue, stOsdDataProp.stLinerMap.sRealMinValue, stOsdDataProp.stLinerMap.sRealMaxValue,
stOsdDataProp.sMinValue, stOsdDataProp.sMaxValue);
OSD_LOG_DEBUG("Get linear revert map value = %d (real value=%d)", sOsdValue, sRealValue);
}
else
{
HV_ASSERT_TRUE_RET(stOsdDataProp.enMappingType <= E_LINEAR_REVERT_MAP, 0);
}
return sOsdValue;
}
SHORT16 Hv_Mw_OsdGetMappedRealValue(UserdataId enWhichData, SHORT16 sOsdValue)
{
UserdataProp stOsdDataProp = { 0 };
Hv_App_OsdGetUserdata(enWhichData, &stOsdDataProp);
SHORT16 sCurRealValue = 0;
OSD_LOG_DEBUG("Get %s's real value:", Hv_App_GetUserdataName(enWhichData));
if (E_NO_MAP == stOsdDataProp.enMappingType)
{
sCurRealValue = sOsdValue;
OSD_LOG_DEBUG("OsdUserdata-%d OsdValue: %d no map to real = %d", enWhichData, sOsdValue, sCurRealValue);
}
else if (E_ENUM_MAP == stOsdDataProp.enMappingType)
{
HV_ASSERT_TRUE_RET(sOsdValue < stOsdDataProp.stEnumMap.usCount, 0);
sCurRealValue = stOsdDataProp.stEnumMap.asRealValueMapTable[sOsdValue];
OSD_LOG_DEBUG("OsdUserdata-%d OsdValue: %d enum map to real = %d", enWhichData, sOsdValue, sCurRealValue);
}
else if (E_LINEAR_MAP == stOsdDataProp.enMappingType)
{
sCurRealValue = LINEAR_MAPPING_VALUE(sOsdValue, stOsdDataProp.sMinValue, stOsdDataProp.sMaxValue,
stOsdDataProp.stLinerMap.sRealMinValue, stOsdDataProp.stLinerMap.sRealMaxValue);
OSD_LOG_DEBUG("OsdUserdata-%d OsdValue: %d linear map to real = %d", enWhichData, sOsdValue, sCurRealValue);
}
else if (E_LINEAR_REVERT_MAP == stOsdDataProp.enMappingType)
{
sCurRealValue = LINEAR_REVERT_MAPPING_VALUE(sOsdValue, stOsdDataProp.sMinValue, stOsdDataProp.sMaxValue,
stOsdDataProp.stLinerMap.sRealMinValue, stOsdDataProp.stLinerMap.sRealMaxValue);
OSD_LOG_DEBUG("OsdUserdata-%d OsdValue: %d linear revert map to real = %d", enWhichData, sOsdValue, sCurRealValue);
}
else
{
HV_ASSERT_TRUE_RET(stOsdDataProp.enMappingType <= E_LINEAR_REVERT_MAP, 0);
}
return sCurRealValue;
}
SHORT16 Hv_Mw_OsdAdjustFunction(UserdataId enWhichData, AdjustAct enAdjustAct, SHORT16 sAdjustValue, UCHAR8 ucFlag)
{
HV_ASSERT_TRUE_RET((E_USERDATA_NONE != enWhichData) && (enWhichData < E_USERDATA_MAX), 0);
UserdataProp stProp = { 0 };
SHORT16 sValue = 0;
Hv_App_GetOsdUserdataProp(enWhichData, &stProp);
switch (enAdjustAct)
{
case ACT_SET:
{
sValue = sAdjustValue;
if (sValue > stProp.sMaxValue)
{
OSD_LOG_WARN("Userdata-%d: set value = %d, limit to max = %d", enWhichData, sValue, stProp.sMaxValue);
sValue = stProp.sMaxValue;
}
else if (sValue < stProp.sMinValue)
{
OSD_LOG_WARN("Userdata-%d: set value = %d, limit to min = %d", enWhichData, sValue, stProp.sMinValue);
sValue = stProp.sMinValue;
}
if (enWhichData == E_USERDATA_VIDEOSOURCE)
{
switch (sAdjustValue)
{
case UD_VIDEOSOURCE_V_HDMI1:
{
Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_GPIO_CH444G_YA, GPIO_LEVEL_HIGH);
Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_GPIO_CH444G_YB, GPIO_LEVEL_LOW);
break;
}
case UD_VIDEOSOURCE_V_HDMI2:
{
Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_GPIO_CH444G_YA, GPIO_LEVEL_LOW);
Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_GPIO_CH444G_YB, GPIO_LEVEL_LOW);
break;
}
case UD_VIDEOSOURCE_V_USB_C:
{
break;
}
case UD_VIDEOSOURCE_V_DP:
{
break;
}
default:
{
Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_GPIO_CH444G_YA, GPIO_LEVEL_HIGH);
Hv_Drv_Gpio_SetPinLevel(HV_BOARD_CONFIG_GPIO_CH444G_YB, GPIO_LEVEL_LOW);
break;
}
}
}
break;
}
case ACT_SET_DEFAULT:
{
sValue = GET_OSD_MAP_VALUE(enWhichData, stProp.sRealDefaultValue);
break;
}
case ACT_INCREASE:
{
sValue = stProp.sOsdValue;
sValue += sAdjustValue;
if (sValue > stProp.sMaxValue)
{
if (stProp.bCircle)
{
sValue = stProp.sMinValue;
}
else
{
sValue = stProp.sMaxValue;
}
}
break;
}
case ACT_DECREASE:
{
sValue = stProp.sOsdValue;
sValue -= sAdjustValue;
if (sValue < stProp.sMinValue)
{
if (stProp.bCircle)
{
sValue = stProp.sMaxValue;
}
else
{
sValue = stProp.sMinValue;
}
}
break;
}
default:
{
return sValue;
}
}
/* If just set interface, do not check userdata if equal */
if ((0 == (ucFlag & SET_OSDDATA)) || (ucFlag & SET_FORCE))
{
OSD_LOG_DEBUG("Set %s = %d -> %d", Hv_App_GetUserdataName(enWhichData), stProp.sOsdValue, sValue);
Hv_App_SetFuncInterface(enWhichData, sValue, ucFlag);
}
else if (stProp.sOsdValue != sValue)
{
OSD_LOG_DEBUG("Update %s = %d -> %d", Hv_App_GetUserdataName(enWhichData), stProp.sOsdValue, sValue);
Hv_App_SetFuncInterface(enWhichData, sValue, ucFlag);
}
else
{
OSD_LOG_DEBUG("No need update %s = %d", Hv_App_GetUserdataName(enWhichData), stProp.sOsdValue);
}
return sValue;
}
#endif