⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -