tpapi.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 635 行 · 第 1/2 页
C
635 行
/******************************************************************************
** *
** File Name: tpapi.c *
** Copyright: 2007-2008 Telepath Technologies Corp. All rights reserved.*
** Version: 1.1 *
** Description: Digital TV API. *
** *
*******************************************************************************
*******************************************************************************
** Edit History *
** ------------------------------------------------------------------------- *
** DATE NAME DESCRIPTION *
** 8/30/2007 pxd Create. *
*******************************************************************************/
/*----------------------------------------------------------------------------*
** Dependencies *
**----------------------------------------------------------------------------*/
#include "platform.h"
#include "tpapi.h"
#include "frameparser.h"
/*----------------------------------------------------------------------------*
** Debugging Flag *
**----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*
** Compiler Flag *
**----------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C"
{
#endif
/*----------------------------------------------------------------------------*
** Macro Define *
**----------------------------------------------------------------------------*/
typedef enum
{
TP_CTRL_CMD_TYPE_SYS_CTRL=1,
TP_CTRL_CMD_TYPE_GET_SYS_CONF=2,
TP_CTRL_CMD_TYPE_SERVICE_CTRL=3,
TP_CTRL_CMD_TYPE_SET_FREQ=5,
TP_CTRL_CMD_TYPE_GET_REG=6,
TP_CTRL_CMD_TYPE_SET_REG=7,
TP_CTRL_CMD_TYPE_SWITCH_MODE=8,
TP_CTRL_CMD_TYPE_GET_FIRMWARE_VERSION=9,
TP_CTRL_CMD_TYPE_UPDATE_FIRMWARE=10,
TP_CTRL_CMD_TYPE_GET_SIGNAL_POWER=11
}TP_CTRL_CMD_TYPE_E;
//sub type of system control
typedef enum
{
TP_SYS_CTRL_SYS_RESET=1,
TP_SYS_CTRL_DEMOD_SLEEP=2,
TP_SYS_CTRL_DEMOD_RESUME=3,
TP_SYS_CTRL_DEMOD_RESET=4,
TP_SYS_CTRL_DEMOD_IQ_POLARITY=5
}TP_SYS_CTRL_TYPE_E;
typedef enum
{
TP_SERVICE_CTRL_CMD_REMOVE=0,
TP_SERVICE_CTRL_CMD_ADD=1
}TP_SERVICE_CTRL_CMD_E;
#define TP_GET_SYS_CONF_TS0 0xff#define TP_CTRL_CMD_MAX_SIZE 16
/* wait time out function */
#define TP_WAITFOR(ucCondition, uTimeoutInMs, bOK) \
{ \
TP_UINT32 uTimeRemain = (uTimeoutInMs); \
while (uTimeRemain > 0) \
{ \
if (ucCondition) break; \
pf_msleep(10); \
uTimeRemain-=10; \
} \
if (uTimeRemain > 0) \
bOK = TRUE; \
else bOK = FALSE; \
}
#define TP_RESPONSE_TIMEOUT_MAX 1000
/*----------------------------------------------------------------------------*
** Data Structures *
**----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*
** Local Function Declare *
**----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*
** Local Variant Declare *
**----------------------------------------------------------------------------*/
static TP_ON_TV_PLAY tpOnTvPlay;
static TP_DTV_STREAM_T *tpstream;
/*----------------------------------------------------------------------------*
** Global Variant Declare *
**----------------------------------------------------------------------------*/
extern FRAME_PARSER_T FrameParser;
extern CONST TP_STATE_FUNC StateFunc[TP_FP_STATE_MAX];
/*----------------------------------------------------------------------------*
** Function Prototype *
**----------------------------------------------------------------------------*/
/******************************************************************************
* tpTvStart *
* Description: Initialize the IC and download firmware. *
* Input: *
* stream: Digital TV stream structure *
* onplay: callback function, call this to process the video/auido frame *
* and other data *
* Output: *
* None *
* Return: *
* 0: start Success. *
* other: start Fail. *
* Note: *
* None *
*******************************************************************************/
TP_INT32 tpTvStart(TP_DTV_STREAM_T *stream, TP_ON_TV_PLAY onplay)
{
TP_INT32 ret = TP_RET_SUC;
pf_reset();
//download firmware
//pf_datawrite(S301A_FIRMWARE_10);
tpstream = stream;
pf_memset(&FrameParser, 0, sizeof(FRAME_PARSER_T));
FrameParser.Language = DEFAULT_LANGUAGE;
tpOnTvPlay = onplay;
return ret;
}
/******************************************************************************
* tpTvProcess *
* Description: Process and parse the TV data. *
* Input: *
* None *
* Output: *
* None *
* Return: *
* None *
* Note: *
* None *
*******************************************************************************/
VOID tpTvProcess(VOID)
{
TP_INT32 len;
FreeSysConfDataMem(tpstream);
FreeEbDataMem(tpstream);
FreeVideoDataMem(tpstream, 0);
FreeAudioDataMem(tpstream, 0);
FreeOtherDataMem(tpstream, 0); TP_DEBUG_PRINT("tpDataProcess start!\n");
if ((FrameParser.FrameData != FrameParser.FrameBuf) && (FrameParser.FrameDataLen>0))
pf_memcpy(FrameParser.FrameBuf, FrameParser.FrameData, FrameParser.FrameDataLen);
len = pf_dataread(FrameParser.FrameBuf+FrameParser.FrameDataLen, MUXSUBFRAME_BUF_SIZE-FrameParser.FrameDataLen);
if (len < 0)
return;
FrameParser.FrameData = FrameParser.FrameBuf;
FrameParser.FrameDataLen += len;
if (FrameParser.FrameDataLen == 0)
return;
if (FrameParser.DisCardDatalen > 0)
{
if (FrameParser.DisCardDatalen >= FrameParser.FrameDataLen)
{
FrameParser.DisCardDatalen -= FrameParser.FrameDataLen;
return;
}
else
{
FrameParser.FrameDataLen -= FrameParser.DisCardDatalen;
FrameParser.FrameData += FrameParser.DisCardDatalen;
FrameParser.DisCardDatalen = 0;
}
}
FrameParser.Error = TP_RET_SUC;
do
{
if (FrameParser.ParserState == TP_FP_STATE_END)
{
(*(StateFunc[FrameParser.ParserState]))(&FrameParser, tpstream);
break;
}
else
(*(StateFunc[FrameParser.ParserState]))(&FrameParser, tpstream);
}while(FrameParser.Error == TP_RET_SUC);
if (FrameParser.Error < TP_RET_DATA_NONE_ERR)
{
FrameParserClean(&FrameParser);
FreeSysConfDataMem(tpstream);
FreeEbDataMem(tpstream);
FreeVideoDataMem(tpstream, 1);
FreeAudioDataMem(tpstream, 1);
FreeOtherDataMem(tpstream, 1);
pf_memset(tpstream, 0, sizeof(TP_DTV_STREAM_T));
}
else
(*tpOnTvPlay)(tpstream);
return;
}
/******************************************************************************
* tpTvStop *
* Description: Stop TV. *
* Input: *
* stream: Digital TV stream structure *
* Output: *
* None *
* Return: *
* 0: stop Success. *
* other: stop Fail. *
* Note: *
* None *
*******************************************************************************/
TP_INT32 tpTvStop(TP_DTV_STREAM_T *stream)
{ FreeSysConfDataMem(stream);
FreeEbDataMem(stream);
FreeVideoDataMem(stream, 1);
FreeAudioDataMem(stream, 1);
FreeOtherDataMem(stream, 1);
tpOnTvPlay = NULL;
return TP_RET_SUC;
}
/******************************************************************************
* tpTvGetServiceInfo *
* Description: Send read service information command. *
* Input: *
* None *
* Output: *
* None *
* Return: *
* 0: Success. *
* other: Fail. *
* Note: *
* None *
*******************************************************************************/
TP_INT32 tpTvGetServiceInfo(VOID)
{
TP_BOOL bOK;
TP_UINT32 response,result;
TP_UINT8 cmd[TP_CTRL_CMD_MAX_SIZE]={0};
cmd[0] = TP_CTRL_CMD_TYPE_GET_SYS_CONF; // byte 1 is command type
cmd[1] = TP_GET_SYS_CONF_TS0;
if (pf_datawrite(cmd, TP_CTRL_CMD_MAX_SIZE) != TP_CTRL_CMD_MAX_SIZE)
return TP_RET_SEND_DATA_FAIL;
printf("after write --- get serverinfo\n"); TP_WAITFOR(FrameParser.CmdResponse, TP_RESPONSE_TIMEOUT_MAX, bOK);printf("waitfor\n"); if (!bOK)
return TP_RET_WAIT_RESPONSE_TIMEOUT;
response = FrameParser.CmdResponse;
result = FrameParser.CmdResult;
FrameParser.CmdResponse = 0;
FrameParser.CmdResult = 0;
if (response == TP_CTRL_CMD_TYPE_GET_SYS_CONF)
{
if (result == TP_RET_SUC)
return TP_RET_SUC;
else if (result == 1)
return TP_RET_TS0_DATA_NONE;
else
return TP_RET_UNKNOW_ERR;
}
else
return TP_RET_RESPONSE_ERR;
}
/******************************************************************************
* tpTvSelectService *
* Description: Select a service for play. *
* Input: *
* serviceid: Service Id, get from CSCT/SSCT *
* Output: *
* None *
* Return: *
* 0: Success. *
* other: Fail. *
* Note: *
* None *
*******************************************************************************/
TP_INT32 tpTvSelectService(TP_UINT16 serviceid)
{
TP_UINT8 cmd[TP_CTRL_CMD_MAX_SIZE]={0};
TP_BOOL bOK;
TP_UINT32 response,result;
cmd[0] = TP_CTRL_CMD_TYPE_SERVICE_CTRL;
cmd[1] = serviceid >> 8;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?