📄 radio.c
字号:
InfoRect.rect.wTop = RADIO_INFO_START_V-2;
InfoRect.rect.wRight = InfoRect.rect.wLeft+RADIO_INFO_WIDTH-1;
InfoRect.rect.wBottom = InfoRect.rect.wTop+RADIO_INFO_HEIGHT+3;
// Clear info region.
GDI_FillRect(0, &InfoRect);
*/
DrawBitmap.bBitmapID = 3;
DrawBitmap.wDestX = RADIO_INFO_START_H;
DrawBitmap.wDestY = RADIO_INFO_START_V;
DrawBitmap.bDestRegion = 0;
// Clear info region.
GDI_DrawZipBitmap(&DrawBitmap, _aRADIOArray, (PBYTE)RADIO_UNZIP_ADDR, RADIO_UNZIP_WINDOW_ADDR);
}
switch (_bRADIOMode)
{
#ifdef SUPPORT_RADIO_RDS
case RADIO_MODE_NORMAL:
case RADIO_MODE_FAVORITE:
_RADIO_UpdateRDSInfo(bDrawBG);
break;
#endif
case RADIO_MODE_RECORD:
_RADIO_UpdateRecordInfo(bDrawBG, bListBGType, RADIO_COLOR_HIGHLIGHT);
break;
case RADIO_MODE_SCAN:
_RADIO_UpdateScanInfo(bDrawBG);
break;
case RADIO_MODE_SELECTION:
#ifdef SUPPORT_RADIO_RDS
if ((_bRADIOBackupMode == RADIO_MODE_NORMAL) || (_bRADIOBackupMode == RADIO_MODE_FAVORITE))
{
_RADIO_UpdateRDSInfo(bDrawBG);
}
else
#endif
if (_bRADIOBackupMode == RADIO_MODE_RECORD)
{
_RADIO_UpdateRecordInfo(bDrawBG, RADIO_COLOR_NORMAL, RADIO_COLOR_HIGHLIGHT);
}
break;
default:
break;
}
}
//*********************************************************************************************************
// Function : _RADIO_UpdateRDSInfo
// Abstract : Call this function to update and display RDS info.
// Arguments : bDrawBG: 1: draw background 0: not draw background
// Return :
// Side Effect : none.
// Notes :
//*********************************************************************************************************
#ifdef SUPPORT_RADIO_RDS
void _RADIO_UpdateRDSInfo(BYTE bDrawBG)
{
PARM_RECT RDSRect;
PARM_DRAW_STRING RDSStrAttr;
BYTE bTemp1, bTemp2;
WORD wNum;
WORD RDSDataLength;
BYTE bIndex;
BYTE bCharWidth;
PARM_BITMAP_COPY RDSBitmapCopy;
if (bDrawBG)
{
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG;
RDSRect.rect.wLeft = RADIO_RDS_START_H;
RDSRect.rect.wTop = RADIO_RDS_START_V;
RDSRect.rect.wRight = RDSRect.rect.wLeft+RADIO_RDS_WIDTH-1;
RDSRect.rect.wBottom = RDSRect.rect.wTop+RADIO_RDS_HEIGHT-1;
// Fill RDS frame.
GDI_FillRoundRect(0, RADIO_BAND_FRAME_ARC_VALUE, &RDSRect);
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG_OUTLINE;
RDSRect.rect.wLeft = RDSRect.rect.wLeft-RADIO_ARC_PIXEL;
RDSRect.rect.wTop = RDSRect.rect.wTop-RADIO_ARC_PIXEL;
RDSRect.rect.wRight = RDSRect.rect.wRight+RADIO_ARC_PIXEL;
RDSRect.rect.wBottom = RDSRect.rect.wBottom+RADIO_ARC_PIXEL;
// Draw RDS frame ourter line.
GDI_DrawRoundRect(0, RADIO_BAND_FRAME_OUTER_ARC_VALUE, RADIO_BAND_FRAME_ARC_VALUE, &RDSRect);
}
// Update each RDS info.
for (bTemp1 = 0; bTemp1 < SUPPORT_RDS_TYPE_NUMBER; bTemp1++)
{
if ((bTemp1 == _bCurRDSType) && (_bRDSDataRemainNum != 0)) // Current displaying RDS info. can't update.
continue;
if (RADIODRV_RDSTYPE(SupportRDSType[bTemp1])) // If support this type?
{
if (RADIODRV_UpdateRDS(SupportRDSType[bTemp1], aGetRDSData)) // RDS data ready?
{
if (SupportRDSType[bTemp1] == RDS_CT) // Data need change to ASCII
{
OSDUTL_PrepareOutputString();
wNum = ((WORD)aGetRDSData[1]) << 8;
wNum |= (WORD)aGetRDSData[2];
OSDUTL_OutputNumFromIndex(wNum); // Year
OSDUTL_CopyStringFromIndex(aRADIOSolidus); // "/"
OSDUTL_OutputNumFromIndex(aGetRDSData[3]); // Month
OSDUTL_CopyStringFromIndex(aRADIOSolidus); // "/"
OSDUTL_OutputNumFromIndex(aGetRDSData[4]); // Date
OSDUTL_CopyStringFromIndex(aRADIOSpace); // " "
OSDUTL_CopyStringFromIndex(aWeekDay[aGetRDSData[5]-1]);
OSDUTL_CopyStringFromIndex(aRADIOSpace); // " "
OSDUTL_OutputNumFromIndex(aGetRDSData[6]); // Hour
OSDUTL_CopyStringFromIndex(aRADIOColon); // " "
OSDUTL_OutputNumFromIndex(aGetRDSData[7]); // Minute
aConvRDSData[bTemp1][0] = __wOSDUTLStringBuf[0];
for (bTemp2 = 1; bTemp2 <= aConvRDSData[bTemp1][0]; bTemp2++)
{
aConvRDSData[bTemp1][bTemp2] = __wOSDUTLStringBuf[bTemp2];
}
}
else // ASCII
{
aConvRDSData[bTemp1][0] = aGetRDSData[0];
for (bTemp2 = 1; bTemp2 <= aConvRDSData[bTemp1][0]; bTemp2++)
{
aConvRDSData[bTemp1][bTemp2] = CONVCHAR_ASCII_To_CTK(aGetRDSData[bTemp2]);
}
}
RDSUpdateStatus[bTemp1] = 1;
}
}
}
if (_bRDSDataRemainNum == 0) // Prepare RDS info. display.
{
if ((OS_GetSysTimer()-_dwRDSWaitTime) < RADIO_RDS_WAIT_TIME) // Wait for RDS data ready.
return;
if (_bCurRDSType >= SUPPORT_RDS_TYPE_NUMBER)
{
_bCurRDSType = 0;
}
if (RDSUpdateStatus[_bCurRDSType] == 0) // Non updated.
{
_bCurRDSType++;
return;
}
RDSUpdateStatus[_bCurRDSType] = 0; // Clear the update status. the RDS info. will be showed.
_bRDSDataRemainNum = aConvRDSData[_bCurRDSType][0];
_wRDSDataPos = RADIO_RDS_INFO_START_H;
}
else // RDS info. display.
{
if ((_wRDSDataPos-RADIO_RDS_MOVE_STEP) < RADIO_RDS_INFO_BOUNDARY_LEFT) // The first character have reached the left boundry.
{
_bRDSDataRemainNum--;
if (_bRDSDataRemainNum == 0) // Finish current RDS string display.
{
_dwRDSWaitTime = OS_GetSysTimer();
_bCurRDSType++;
/*
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG;
RDSRect.rect.wLeft = RADIO_RDS_START_H;
RDSRect.rect.wTop = RADIO_RDS_START_V;
RDSRect.rect.wRight = RDSRect.rect.wLeft+RADIO_RDS_WIDTH-1;
RDSRect.rect.wBottom = RDSRect.rect.wTop+RADIO_RDS_HEIGHT-1;
// Clear RDS frame.
GDI_FillRoundRect(0, RADIO_BAND_FRAME_ARC_VALUE, &RDSRect);
*/
return;
}
_wRDSDataPos = _wRDSDataPos + GDI_GetCharWidth(aShowRDSData[1]) - RADIO_RDS_MOVE_STEP;
bTemp1 = 1;
// Check if the following characters also reached left boundy.
while (_wRDSDataPos < RADIO_RDS_INFO_BOUNDARY_LEFT)
{
_bRDSDataRemainNum--;
if (_bRDSDataRemainNum == 0) // Finish current RDS string display.
{
_dwRDSWaitTime = OS_GetSysTimer();
_bCurRDSType++;
/*
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG;
RDSRect.rect.wLeft = RADIO_RDS_START_H;
RDSRect.rect.wTop = RADIO_RDS_START_V;
RDSRect.rect.wRight = RDSRect.rect.wLeft+RADIO_RDS_WIDTH-1;
RDSRect.rect.wBottom = RDSRect.rect.wTop+RADIO_RDS_HEIGHT-1;
// Clear RDS frame.
GDI_FillRoundRect(0, RADIO_BAND_FRAME_ARC_VALUE, &RDSRect);
*/
return;
}
bTemp1++;
_wRDSDataPos = _wRDSDataPos + GDI_GetCharWidth(aShowRDSData[bTemp1]);
}
}
else
{
_wRDSDataPos = _wRDSDataPos - RADIO_RDS_MOVE_STEP;
}
RDSDataLength = RADIO_RDS_INFO_BOUNDARY_RIGHT - _wRDSDataPos;
bIndex = 0;
// Grab characters for display.
for (bTemp2 = 1; bTemp2 <= _bRDSDataRemainNum; bTemp2++)
{
bCharWidth = GDI_GetCharWidth(aConvRDSData[_bCurRDSType][aConvRDSData[_bCurRDSType][0]-_bRDSDataRemainNum+bTemp2]);
if (bCharWidth <= RDSDataLength)
{
RDSDataLength -= bCharWidth;
bIndex++;
aShowRDSData[bIndex] = aConvRDSData[_bCurRDSType][aConvRDSData[_bCurRDSType][0]-_bRDSDataRemainNum+bTemp2];
}
else
break;
}
aShowRDSData[0] = bIndex;
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG;
RDSRect.rect.wLeft = RADIO_RDS_INFO_DISPLAY_LEFT;
RDSRect.rect.wTop = RADIO_RDS_INFO_DISPLAY_TOP;
RDSRect.rect.wRight = RADIO_RDS_INFO_DISPLAY_RIGHT;
RDSRect.rect.wBottom = RADIO_RDS_INFO_DISPLAY_BOTTOM;
// Clear RDS frame.
GDI_FillRect(4, &RDSRect);
RDSStrAttr.bTextColor = RADIO_PALETTE_ENTRY_TEXT_BLACK;
RDSStrAttr.bBackground = RDSRect.bColor;
RDSStrAttr.bColorKey = 0;
RDSStrAttr.bShadow1 = PAL_ENTRY_COLOR_TRANSPARENT;
RDSStrAttr.bShadow2 = PAL_ENTRY_COLOR_TRANSPARENT;
RDSStrAttr.wX = _wRDSDataPos;
RDSStrAttr.wY = RADIO_RDS_INFO_DISPLAY_TOP+((RADIO_RDS_HEIGHT-GDI_GetStringHeight(aShowRDSData))>>1);
// Show RDS info.
GDI_DrawString_909(4, &RDSStrAttr, aShowRDSData);
RDSBitmapCopy.bSrcRegion = 4;
RDSBitmapCopy.bDestRegion = 0;
RDSBitmapCopy.SrcRect.wLeft = RADIO_RDS_INFO_DISPLAY_LEFT;
RDSBitmapCopy.SrcRect.wTop = RADIO_RDS_INFO_DISPLAY_TOP;
RDSBitmapCopy.SrcRect.wRight = RADIO_RDS_INFO_DISPLAY_RIGHT;
RDSBitmapCopy.SrcRect.wBottom = RADIO_RDS_INFO_DISPLAY_BOTTOM;
RDSBitmapCopy.wDestX = RADIO_RDS_START_H+15;
RDSBitmapCopy.wDestY = RADIO_RDS_START_V;
// Show RDS info.
GDI_BitmapCopy(&RDSBitmapCopy);
/*
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG;
RDSRect.rect.wLeft = RADIO_RDS_START_H;
RDSRect.rect.wTop = RADIO_RDS_START_V;
RDSRect.rect.wRight = RDSRect.rect.wLeft+RADIO_RDS_WIDTH-1;
RDSRect.rect.wBottom = RDSRect.rect.wTop+RADIO_RDS_HEIGHT-1;
// Clear RDS frame.
GDI_FillRoundRect(0, RADIO_BAND_FRAME_ARC_VALUE, &RDSRect);
RDSStrAttr.bTextColor = RADIO_PALETTE_ENTRY_TEXT_BLACK;
RDSStrAttr.bBackground = RDSRect.bColor;
RDSStrAttr.bColorKey = 0;
RDSStrAttr.bShadow1 = PAL_ENTRY_COLOR_TRANSPARENT;
RDSStrAttr.bShadow2 = PAL_ENTRY_COLOR_TRANSPARENT;
RDSStrAttr.wX = _wRDSDataPos;
RDSStrAttr.wY = RADIO_RDS_START_V+((RADIO_RDS_HEIGHT-GDI_GetStringHeight(aShowRDSData))>>1);
// Show RDS info.
GDI_DrawString_909(0, &RDSStrAttr, aShowRDSData);
RDSRect.rect.wLeft = RADIO_RDS_INFO_BOUNDARY_LEFT;
RDSRect.rect.wTop = RDSStrAttr.wY;
RDSRect.rect.wRight = RDSRect.rect.wLeft+20-1;
RDSRect.rect.wBottom = RDSRect.rect.wTop+GDI_GetStringHeight(aShowRDSData)-1;
// Clear left part of the string that exceed display region.
GDI_FillRect(0, &RDSRect);
RDSRect.rect.wLeft = RADIO_RDS_INFO_START_H;
RDSRect.rect.wRight = RDSRect.rect.wLeft+20-1;
// Clear right part of the string that exceed display region.
GDI_FillRect(0, &RDSRect);
*/
/*
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG_OUTLINE;
RDSRect.rect.wLeft = RADIO_RDS_START_H-RADIO_ARC_PIXEL;
RDSRect.rect.wTop = RADIO_RDS_START_V-RADIO_ARC_PIXEL;
RDSRect.rect.wRight = RADIO_RDS_START_H+RADIO_RDS_WIDTH-1+RADIO_ARC_PIXEL;
RDSRect.rect.wBottom = RADIO_RDS_START_V+RADIO_RDS_HEIGHT-1+RADIO_ARC_PIXEL;
// Draw RDS frame ourter line.
GDI_DrawRoundRect(0, RADIO_BAND_FRAME_OUTER_ARC_VALUE, RADIO_BAND_FRAME_ARC_VALUE, &RDSRect);
*/
}
_dwRDSFlashTime = OS_GetSysTimer();
}
//*********************************************************************************************************
// Function : _RADIO_ResetRDS
// Abstract : Call this function to reset RDS status
// Arguments : bClear: 1: Clear the displaying RDS scrolling text 0: not Clear
// Return :
// Side Effect : none.
// Notes :
//*********************************************************************************************************
void _RADIO_ResetRDS(BYTE bClear)
{
PARM_RECT RDSRect;
BYTE bTemp;
_bRDSDataRemainNum = 0;
_bCurRDSType = 0;
for (bTemp = 0; bTemp < RDS_TYPE_NUMBER; bTemp++)
{
RDSUpdateStatus[bTemp] = 0; //Initial the RDS update status.
}
if (bClear)
{
RDSRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG;
RDSRect.rect.wLeft = RADIO_RDS_START_H;
RDSRect.rect.wTop = RADIO_RDS_START_V;
RDSRect.rect.wRight = RDSRect.rect.wLeft+RADIO_RDS_WIDTH-1;
RDSRect.rect.wBottom = RDSRect.rect.wTop+RADIO_RDS_HEIGHT-1;
// Clear RDS frame.
GDI_FillRoundRect(0, RADIO_BAND_FRAME_ARC_VALUE, &RDSRect);
}
//_dwRDSFlashTime = OS_GetSysTimer();
}
#endif
void _RADIO_UpdateRecordInfo(BYTE bDrawBG, BYTE bListBGType, BYTE bTextType)
{
PARM_RECT RecordRect;
PARM_DRAW_STRING RecordStrAttr;
if (bDrawBG)
{
RecordRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG;
RecordRect.rect.wLeft = RADIO_RECORD_START_H;
RecordRect.rect.wTop = RADIO_RECORD_START_V;
RecordRect.rect.wRight = RecordRect.rect.wLeft+RADIO_RECORD_WIDTH-1;
RecordRect.rect.wBottom = RecordRect.rect.wTop+RADIO_RECORD_HEIGHT-1;
// Fill record frame.
GDI_FillRoundRect(0, RADIO_BAND_FRAME_ARC_VALUE, &RecordRect);
RecordRect.bColor = RADIO_PALETTE_ENTRY_FREQ_FRAME_BG_OUTLINE;
RecordRect.rect.wLeft = RecordRect.rect.wLeft-RADIO_ARC_PIXEL;
RecordRect.rect.wTop = RecordRect.rect.wTop-RADIO_ARC_PIXEL;
RecordRect.rect.wRight = RecordRect.rect.wRight+RADIO_ARC_PIXEL;
RecordRect.rect.wBottom = RecordRect.rect.wBottom+RADIO_ARC_PIXEL;
// Draw record frame ourter line.
GDI_DrawRoundRect(0, RADIO_BAND_FRAME_OUTER_ARC_VALUE, RADIO_BAND_FRAME_ARC_VALUE, &RecordRect);
RecordRect.rect.wLeft = RADI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -