📄 data.c
字号:
if(Len>FreeBufLen)
{
FIFO.Lock=0;
return -1;
}
/*----------------------------------------------------------*/
/* 剩下的空间够存放数据 */
/*----------------------------------------------------------*/
else
{
for(i=0;i<Len;i++)
{
FIFO.Buf[FIFO.pPut + i]=*(unsigned char *)(Data + i);
}
FIFO.pPut += Len;
FIFO.Length += Len;
FIFO.Lock=0;
return 0;
}
}
}
}
void TK_UserProc(void)
{
int i,j;
int delay;
unsigned char *Buf;
short Len;
unsigned long BaudList[10]={2400,4800,9600,19200,38400,57600,115200,230400,460800,921600};
TSPDAT_T TS_Data;
unsigned long TS_Count;
unsigned char RestLen;
unsigned char Continuity_Counter=0;
delay=100 / (BaudList[SystemData.UserChannel.BaudRate] / (181*8));
Buf=(unsigned char *)MemAlloc(RNG2ID,TN_USERPROC,188);
if(Buf!=NULL)
{
for(;;)
{
if(UserChannelAlarm)
{
my_Delay(100);/*by xu*/
SetUserTimerPeriod();
continue;
}
Len=FIFO_Get(Buf,181);
/*-------------------------------------------------*/
/* 没有数据 */
/*-------------------------------------------------*/
if(Len==-1)
{
UserDataLed(0);
my_Delay(100);/*by xu*/
continue;
}
/*-------------------------------------------------*/
/* 数据长度不够181字节,需要调整字段 */
/*-------------------------------------------------*/
if((Len>0)&&(Len<181))
{
RestLen=Len;
/*-------------------------------------------------------------*/
/* 填充TS流中的有关字段 */
/*-------------------------------------------------------------*/
TS_Data.Sync_byte=0x47;
TS_Data.Continuity_counter=Continuity_Counter;
TS_Data.Transport_priority=0;
TS_Data.Transport_err_indicator=0;
TS_Data.Adaption_field_control=0x03;
/* TS_Data.PID=SystemData.UserChannel.PID; */
TS_Data.PID=(0x01F0<<4) + 1;
TS_Data.Adaptation_field_legth = 183 - RestLen - 3;
/* TS_Data.Adaptation_field_legth = 184 - RestLen - 2; */
TS_Data.Adaptation_field_extension_flag=0;
TS_Data.Disontinuity_indicator=0;
TS_Data.Elementary_stream_priority_indicator=0;
TS_Data.OPCR_flag=0;
TS_Data.PCR_flag=0;
TS_Data.Random_access_indicator=0;
TS_Data.Splicing_point_flag=0;
TS_Data.Transport_private_data_flag=0;
for(j=0;j<180-RestLen;j++)
TS_Data.Data[j]=0xFF;
TS_Data.Data[182-RestLen-3]=0x40; /* table id */
TS_Data.Data[182-RestLen-2]=0x00; /* private section indicator */
TS_Data.Data[182-RestLen-1]=0x00; /* private section indicator */
for(j=0;j<RestLen;j++)
TS_Data.Data[182-RestLen + j]=*(unsigned char *)(Buf + j);
if(Continuity_Counter%2)
UserDataLed(1);
else
UserDataLed(0);
/*-------------------------------------------------------------*/
/* 发送最后一个TS包 */
/*-------------------------------------------------------------*/
TS_Send(TS_Data);
if(Continuity_Counter==15)
Continuity_Counter=0;
else
Continuity_Counter++;
my_Delay(delay);/*by xu*/
continue;
}
/*-------------------------------------------------*/
/* 数据长度够181字节,不需要调整字段 */
/*-------------------------------------------------*/
if(Len==181)
{
/*-------------------------------------------------------------*/
/* 填充TS流中的有关字段 */
/*-------------------------------------------------------------*/
TS_Data.Sync_byte=0x47;
TS_Data.Continuity_counter=Continuity_Counter;
TS_Data.Transport_priority=0;
TS_Data.Transport_err_indicator=0;
TS_Data.Transport_scambling_control=0;
TS_Data.Adaption_field_control=0x01;
/* TS_Data.PID=SystemData.UserChannel.PID; */
TS_Data.PID=(0x01F0<<4) + 1;
TS_Data.Adaptation_field_legth=0x00;
*((unsigned char *)&TS_Data + 4)=0x40; /* Table id */
*((unsigned short *)&TS_Data + 5)=0x00; /* set Private section indicator=0 */
MemCopy((unsigned char *)&TS_Data + 7,(unsigned char *)Buf,181);
/*-------------------------------------------------------------*/
/* 发送出去 */
/*-------------------------------------------------------------*/
if(Continuity_Counter%2)
UserDataLed(1);
else
UserDataLed(0);
TS_Send(TS_Data);
if(Continuity_Counter==15)
Continuity_Counter=0;
else
Continuity_Counter++;
my_Delay(delay);/*by xu*/
continue;
}
}
MemFree(Buf);
}
}
void TK_UserRecv(void)
{
UARTBLOCK Uart;
unsigned char ChannelType;
volatile unsigned long DevNo;
unsigned long rc;
unsigned long Len;
unsigned long ret;
int i,j;
TSPDAT_T TS_Data;
unsigned long TS_Count;
unsigned char RestLen;
unsigned char Continuity_Counter;
unsigned char RevBuf[0x420];
ChannelType=SystemData.UserChannel.Type;
if(ChannelType==USERCHANNELRS232)
{
Uart.port=PORTRS232;
DevNo=DEV_RS232;
}
else if(ChannelType==USERCHANNELRS422)
{
Uart.port=PORTRS422;
DevNo=DEV_RS422;
}
/* Uart.pData=(unsigned char *)MemAlloc(RNG1ID,TN_USERRECV,0x1000); */
Uart.pData=RevBuf;
if(Uart.pData!=NULL)
{
for(;;)
{
rc=de_read(DevNo,(void *)&Uart,&ret);
if(rc)
{
Display("TK_UserRecv de_read error, errno=0x%x \n",rc);
my_Delay(100);/*by xu*/
continue;
}
Len=Uart.length;
Display("User Channel data received, Len=%d \n",Len);
if((Len<=0)||(Len>0x400))
{
my_Delay(100);/*by xu*/
continue;
}
/*--------------------------------------------------------------------------*/
/*只到数据被送到FIFO中为止 */
/*--------------------------------------------------------------------------*/
while(FIFO_Put(Uart.pData,Uart.length))
my_Delay(100);/*by xu*/
my_Delay(100);/*by xu*/
}
/* MemFree(Uart.pData); */
}
else t_suspend(0L);
}
void TK_UserInit(void)
{
UARTBLOCK uart;
unsigned char ChannelType;
void *dummy;
unsigned long ret;
unsigned long DevNo;
unsigned long qid;
unsigned long rc;
unsigned long BaudList[10]={2400,4800,9600,19200,38400,57600,115200,230400,460800,921600};
UserChannelAlarm=0;
for(;;)
{
if(SystemState==SYSTEM_NOT_READY)
{
my_Delay(100);/*by xu*/
}
else
break;
}
/*------------------------------------------------------------------*/
/* 打开用户数据通道 */
/*------------------------------------------------------------------*/
OldUserChannelType=ChannelType=SystemData.UserChannel.Type;
if(ChannelType==USERCHANNELNOTUSE)
{
/*--------------------------------------------------------------*/
/* 没有用户数据通道使用,任务自杀 */
/*--------------------------------------------------------------*/
t_suspend(0L);
}
else
{
/*---------------------------------------------------------------*/
/* 将用户通道的PMT写入双口RAM */
/*---------------------------------------------------------------*/
if(ChannelType==USERCHANNELRS232)
{
uart.port=PORTRS232;
DevNo =DEV_RS232;
}
else
{
uart.port=PORTRS422;
DevNo =DEV_RS422;
}
uart.BaudRate=BaudList[SystemData.UserChannel.BaudRate];
uart.CharSize=SystemData.UserChannel.CharSize;
uart.StopBits=SystemData.UserChannel.StopBits;
uart.Verify =SystemData.UserChannel.Verify;
rc=de_init(DevNo,(void *)&uart,&ret,&dummy);
if(rc)
{
}
rc=de_open(DevNo,(void *)&uart,&ret);
if(rc)
{
Display("deopen error, errno=0x%x \n",rc);
}
else
{
/*----------------------------------------------------*/
/* 创建用户数据接收任务和用户数据处理任务 */
/*----------------------------------------------------*/
SetUserTimerPeriod();
CreateStartTask(TN_USERRECV,TASKPRIO1,SUPERSTACK,USERSTACK,0,TK_UserRecv,0);
}
t_suspend(0L);
}
}
unsigned long CRC_Verify(unsigned char *head,unsigned short len)
{
unsigned long XOR_REG=0;
unsigned long PN_REG=0xffffffff;
unsigned long temp;
unsigned char data,datatemp;
unsigned short i,j;
for(i=0;i<len;i++)
{
data = *head++;
datatemp = data;
for(j=0;j<8;j++)
{
temp= PN_REG;
datatemp = data;
datatemp=(datatemp>>7)+(unsigned char)(temp>>31);
if(datatemp&0x01 == 0x01)
{
XOR_REG = 0x2608edb;
}
else
{
XOR_REG = 0;
}
PN_REG = PN_REG^XOR_REG;
PN_REG=PN_REG<<1;
if(datatemp&0x01 == 0x01)
PN_REG|=0x01;
else
PN_REG&=0xfffffffe;
data = data <<1;
}
}
return (PN_REG);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -