📄 rtd2553v_osdfunc.c
字号:
//----------------------------------------------------------------------------------------------------
// ID Code : OsdFunc.c No.0000
// Update Note :
//
//----------------------------------------------------------------------------------------------------
#define __RTD2553V_OSDFX__
#include "Common\Header\Include.h"
#if((_SCALER_TYPE == _RTD2553V) || (_SCALER_TYPE == _RTD2546N) || (_SCALER_TYPE == _RTD2525L))
//----------------------------------------------------------------------------------------------------
// OSD Basic Functions
//----------------------------------------------------------------------------------------------------
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxApplyMapSetting(BYTE ucOsdmaptype)
{
switch(ucOsdmaptype)
{
case _OSD_MAP0:
COsdFxCodeWrite(tOSD_ROW_COMMAND0);
ucOsdMap = _OSD_MAP0;
break;
case _OSD_MAP1:
COsdFxCodeWrite(tOSD_ROW_COMMAND1);
ucOsdMap = _OSD_MAP1;
break;
case _OSD_MAP2:
COsdFxCodeWrite(tOSD_ROW_COMMAND2);
ucOsdMap = _OSD_MAP2;
break;
case _OSD_MAP3:
ucOsdMap = _OSD_MAP3;
break;
case _OSD_MAP4:
ucOsdMap = _OSD_MAP4;
break;
case _OSD_MAP5:
ucOsdMap = _OSD_MAP5;
break;
}
COsdFxSetFrameCtrlCommand();
COsdFxSetCharCommandMap();
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxSetFrameCtrlCommand(void)
{
pData[0] = 0xc0;
pData[1] = 0x04;
CScalerWrite(0x90, 2, pData, _AUTOINC);
pData[0] = ((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x00ff);
pData[1] = (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 4) | (_OSD_FONT_START_POSITION & 0x000f);
pData[2] = (_OSD_FONT_START_POSITION & 0x0ff0) >> 4;
CScalerWrite(0x92, 3, pData, _NON_AUTOINC);
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxSetCharCommandMap(void)
{
CScalerSetByte(_OSD_ADDR_MSB_90, 0x50 | (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 8));
CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)(tOSD_OSDMAP_INF[ucOsdMap][0] + 1));
CScalerWriteAmount(_OSD_DATA_PORT_92, tOSD_OSDMAP_INF[ucOsdMap][0] * tOSD_OSDMAP_INF[ucOsdMap][1], 0x00, _NON_AUTOINC);
CScalerSetByte(_OSD_ADDR_MSB_90, 0x90 | (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 8));
CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)(tOSD_OSDMAP_INF[ucOsdMap][0] + 1));
CScalerWriteAmount(_OSD_DATA_PORT_92, tOSD_OSDMAP_INF[ucOsdMap][0] * tOSD_OSDMAP_INF[ucOsdMap][1], 0x10, _NON_AUTOINC);
CScalerSetByte(_OSD_ADDR_MSB_90, 0x10 | (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 8));
CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)(tOSD_OSDMAP_INF[ucOsdMap][0] + 1));
CScalerWriteAmount(_OSD_DATA_PORT_92, tOSD_OSDMAP_INF[ucOsdMap][0] * tOSD_OSDMAP_INF[ucOsdMap][1], 0x8c, _NON_AUTOINC);
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxEnableOsd(void)
{
CTimerWaitForEvent(_EVENT_DEN_STOP);
CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, _BIT0);
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxDisableOsd(void)
{
CTimerWaitForEvent(_EVENT_DEN_STOP);
CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, 0x00);
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxChangeWindowColor(BYTE ucWindowColor, BYTE *pStyle)
{
pData[0] = 0x41;
pData[1] = ((*(pStyle)) * 4) + (3);
CScalerWrite(_OSD_ADDR_MSB_90, 2, pData, _AUTOINC);
pData[0] = ((*(pStyle + ((3) + 1) + 1)) & 0xf0) | (ucWindowColor & 0x0f);
CScalerWrite(_OSD_DATA_PORT_92, 1, pData, _NON_AUTOINC);
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxCloseWindow(BYTE ucWinNumber)
{
pData[0] = 0x81;
pData[1] = (BYTE)(ucWinNumber * 4+3);
pData[2] = 0x00;
CScalerWrite(_OSD_ADDR_MSB_90, 3, pData, _AUTOINC);
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxSlider(BYTE ucRow, BYTE ucCol, BYTE ucLength, WORD usValue, WORD usMax, WORD usMin)
{
BYTE cnt;
usValue = usValue - usMin;
pData[0] = _L_BAR;
for(cnt=1;cnt<(ucLength - 1);cnt++)
pData[cnt] = _0_BAR;
pData[ucLength - 1] = _R_BAR;
if(usMax > usMin)
{
cnt =((WORD)(usValue * (ucLength - 2))) / (usMax - usMin);
if(cnt < (ucLength - 2))
pData[cnt + 1] = (_0_BAR) + (((((WORD)(usValue * (ucLength - 2))) * _SLIDER_RESOLUTION) / (usMax - usMin)) % _SLIDER_RESOLUTION);
for(;cnt>0;cnt--)
pData[cnt] = _0_BAR + _SLIDER_RESOLUTION - 1;
}
COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE1);
CScalerWrite(_OSD_DATA_PORT_92, ucLength, pData, _NON_AUTOINC);
}
//--------------------------------------------------
// Description :
// Input Value :
// ucPar:
// bit 0 (Align left or right) [ 0: Align left 1: Align right ]
// bit 1 (Force to show number) [ 0: Disable 1: Enable ]
// bit 4 ~ 6 (Show numbers) [ 0 ~ 7: Show 1 ~ 8 numbers ]
// Output Value :
//--------------------------------------------------
void COsdFxShowNumber(BYTE ucRow, BYTE ucCol, WORD usValue, BYTE ucPar)
{
BYTE index, temp, i;
pData[4] = (_0_ + (usValue/10000));
pData[3] = (_0_ + (usValue%10000)/1000);
pData[2] = (_0_ + (usValue%1000)/100);
pData[1] = (_0_ + (usValue%100)/10);
pData[0] = (_0_ + (usValue%10));
for(index=0;index<5;index++)
{
if(pData[4 - index] != ((bit)(ucPar & _BIT1) ? 0x00 : _0_))
{
index = 4 - index;
break;
}
}
if(usValue == 0 && !((bit)(ucPar & 0x02)) )
index = 0;
if((bit)(ucPar & _BIT1))
{
temp = (ucPar & 0x70) >> 4;
index = (ucPar & 0x70) >> 4;
}
else
{
temp = (ucPar & 0x70) >> 4;
if(temp < index)
temp = index;
}
if((bit)(ucPar & 0x01)) // Align Right
COsdFxCalcStartAddress(ucRow, ucCol - temp, _WRITE_BYTE1);
else // Align Left
COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE1);
for(i=0;i<=temp;i++)
{
if(index >= temp)
{
pData[i + 8] = pData[index - i];
}
else
{
if(i < (temp - index))
pData[i + 8] = 0x00;
else
pData[i + 8] = pData[index - (i - (temp - index))];
}
}
CScalerWrite(_OSD_DATA_PORT_92, (temp + 1), &pData[8], _NON_AUTOINC);
//return temp + 1;
}
/*
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxShowNorm100Number(BYTE ucRow, BYTE ucCol, WORD usValue, WORD usMax, WORD usMin, BYTE ucPar)
{
usValue = ((DWORD)(usValue - usMin) * 100) / (usMax - usMin);
COsdFxShowNumber(ucRow, ucCol, usValue, ucPar);
}
*/
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxCodeWrite(BYTE code *pArray)
{
BYTE cnt, temp;
CScalerWrite(_OSD_ADDR_MSB_90, 2, pArray, _AUTOINC);
pArray += 2;
cnt = 0;
while(_TRUE)
{
if(*pArray == _EXT_)
{
CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
cnt = 0;
if(*(pArray + 1) > 3)
return;
temp = _EXT_ + *(pArray + 1);
if(*(pArray + 2) == _REPEAT_)
{
CScalerWriteAmount(_OSD_DATA_PORT_92, *(pArray + 3), temp, _NON_AUTOINC);
pArray += 4;
}
else
{
CScalerWrite(_OSD_DATA_PORT_92, 1, &temp, _NON_AUTOINC);
pArray += 2;
}
}
else if(*pArray == _REPEAT_)
{
CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
CScalerWriteAmount(_OSD_DATA_PORT_92, *(pArray + 1) - 1, *(pArray - 1), _NON_AUTOINC);
pArray += 2;
cnt = 0;
}
else if(*pArray == _NEXT_)
{
CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
pArray++;
cnt = 0;
if(*(pArray) != _END_)
{
CScalerWrite(_OSD_ADDR_MSB_90, 2, pArray, _AUTOINC);
pArray += 2;
}
else
{
break;
}
}
else if(*(pArray) == _END_)
{
CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
break;
}
else
{
pArray++;
cnt++;
}
}
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxCalcStartAddress(BYTE ucRow, BYTE ucCol, BYTE ucIndicate)
{
WORD startaddress;
BYTE temp;
startaddress = tOSD_OSDMAP_INF[ucOsdMap][0] + 1;
for(temp=0;temp<ucRow;temp++)
startaddress += tOSD_OSDMAP_INF[ucOsdMap][1];
CScalerSetByte(_OSD_ADDR_MSB_90, (BYTE)(((startaddress + ucCol) & 0x0fff) >> 8 ) | (((ucIndicate << 2) + 1) << 4));
CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)((startaddress + ucCol) & 0x00ff));
}
//--------------------------------------------------
// Description :
// Input Value :
// Output Value :
//--------------------------------------------------
void COsdFxLoadText(BYTE ucRow, BYTE ucCol, BYTE ucSelect, BYTE code *pArray)
{
BYTE cnt, cnt1, cnt2, ss, temp, temp1, temp2, temp3;
WORD length;
length = cnt = cnt1 = cnt2 = ss = temp = temp1 = 0;
while(_TRUE)
{
if(*(pArray + cnt) == _END_)
{
if(temp == ucSelect)
break;
else
{
pArray += (cnt + 1);
cnt = 0;
}
temp++;
}
cnt++;
}
cnt = cnt1 = cnt2 = temp1 = 0;
temp3 = ucRow;
COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE0);
while(*(pArray + cnt) != _END_)
{
switch(*(pArray + cnt))
{
case _EXT_:
if(*(pArray + cnt + 1) > 3)
return;
temp = _EXT_ + *(pArray + cnt + 1);
cnt += 2;
break;
case _REPEAT_:
if(temp1 < (*(pArray + cnt + 1) - 1))
temp1++;
else
{
cnt += 2;
temp1 = 0;
continue;
}
break;
case _NEXT_:
if(length%12)
{
COsdFxCalcStartAddress(ucRow, ucCol + cnt1, _WRITE_BYTEALL);
pData[0] = 0x00;
pData[1] = ((12 - length%12) < 4) ? (12 - length%12) + 12 : (12 - length%12);
pData[2] = 0x00;
CScalerWrite(_OSD_DATA_PORT_92, 3, pData, _NON_AUTOINC);
}
cnt++;
COsdFxCalcStartAddress(++ucRow, ucCol, _WRITE_BYTE0);
length = 0;
cnt1 = 0;
continue;
default:
temp = *(pArray + cnt);
cnt++;
break;
}
cnt1++;
ss = 0;
temp2 = 0;
while(_TRUE)
{
if((temp == (tOSD_CHARWIDTH_TABLE[0])[ss*2]) && ((tOSD_CHARWIDTH_TABLE[0])[ss*2+1] != _END_))
{
pData[0] = (tOSD_CHARWIDTH_TABLE[0])[ss*2+1];
length += ((tOSD_CHARWIDTH_TABLE[0])[ss*2+1] & 0x0f);
CScalerWrite(_OSD_DATA_PORT_92, 1, pData, _NON_AUTOINC);
break;
}
else
{
if(((tOSD_CHARWIDTH_TABLE[0])[ss*2] == _END_) && ((tOSD_CHARWIDTH_TABLE[0])[ss*2+1] == _END_))
{
temp2 = 1;
break;
}
}
ss++;
}
ss = 0;
while(temp2 == 1)
{
if((temp == (tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2]) && ((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1] != _END_))
{
pData[0] = (tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1];
length += ((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1] & 0x0f);
CScalerWrite(_OSD_DATA_PORT_92, 1, pData, _NON_AUTOINC);
break;
}
else
{
if(((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2] == _END_) && ((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1] == _END_))
{
COsdFxCalcStartAddress(ucRow, ucCol + cnt1, _WRITE_BYTE0);
length += 12;
break;
}
}
ss++;
}
}
if(length%12)
{
COsdFxCalcStartAddress(ucRow, ucCol + cnt1, _WRITE_BYTEALL);
pData[0] = 0x00;
pData[1] = ((12 - length%12) < 4) ? (12 - length%12) + 12 : (12 - length%12);
pData[2] = 0x00;
CScalerWrite(_OSD_DATA_PORT_92, 3, pData, _NON_AUTOINC);
}
ucRow = temp3;
cnt = 0;
temp1 = 0;
COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE1);
while(*(pArray + cnt) != _END_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -