Example #1
0
void DevLineTask(void  *pdata)
{
	int i,n;
	uint8 chk,cmd,t,test;
	uint16 nDataSize;
	uint8 err,state;
	uint8 mBuf[8];
	PNODEMSG msg;	
	PTHEADER header;	
	pdata = pdata;

	msg = (PNODEMSG)mBuf;
	header = (PTHEADER)uart0_buf;
	state = CMD_READY;
	
//	TargetInit();
	while(1)
	{
//			1	
		/*
			等待总线空闲		
		*/
		
//		UART0RXLineClear();
//2		
StartWhile:	
		/*
			开始接受接受数据,协议分析
		*/
		t = UART0Getch();
		if( t != PLT_VERSION )
		{
			if( t == 0xdb)
				t = UART0Getch();
			continue;
		}
		chk = 0;
		i = 0;
		do{	
			t = UART0Getch();
			if( t == 0xdb )
			{
				t = UART0Getch();
			}else if( t == PLT_VERSION )
			{
				continue;
			}
			chk ^= t;
			uart0_buf[i] = t;
			i++;
		}
		while( i < 4 );
		if( chk )
			continue;						//校验错误

		/*
			为命令包,为本机地址,有数据包继续接受
						不是,又有数据包跳空接受
			为应答包,跳空接受
		*/
		
//		6
		if( header->bits.addr != MACHINE_NO )
		{
			t = header->bits.size;
			OSTimeDly( (t + 2) / 5 ); 	//为9600 一个字节为1ms
		}
		nDataSize = header->bits.size + 1;
		
		switch( header->bits.token )
		{


			case TOKEN_REQUESTSIZE:
				if( nDataSize < MAX_UART_BUFFER )
				{
					header->bits.token = TOKEN_ALLOWSIZE;
				}else
					header->bits.token = TOKEN_ERRSIZE;
				header->bits.token |= 0x08;	
				chk = 0;
				for( i = 0; i < 3; i++ )
				{
					chk^= uart0_buf[i];
				}
				header->bits.check = chk;
				UART0Putch(PLT_VERSION);
				
				UART0WriteTab(uart0_buf, 4);
				continue;
				break;
			case TOKEN_DATAPACK:
				if( nDataSize > MAX_UART_BUFFER )
				{
					header->bits.token = TOKEN_ERRSIZE;;
				}else		
				if( state == CMD_BUSY )
					header->bits.token = TOKEN_BUSY;
				else 
					break;			
				i = 0;
				do
				{
					t = UART0Getch();
					if( t == PLT_TAB )
					{
						t = UART0Getch();
					}else if( t == PLT_VERSION )
					{
						continue;
					}
					i++;					
				}while( i < nDataSize );
				header->bits.token |= 0x08;
				chk = 0;
				for( i = 0; i < 3; i++ )
				{
					chk^= uart0_buf[i];
				}
				header->bits.check = chk;				
				UART0Putch(PLT_VERSION);				
				UART0WriteTab(uart0_buf, 4);			
				break;
			case TOKEN_PING:
			{
				uint32 nSize;
				nSize = 0;
				if( state == CMD_BUSY )
				{
					nSize = (uint32)OSMboxAccept(DevLineMsg);
					
				}
				if( nSize == 0 )
				{
					header->bits.token = 0x08 | TOKEN_PING;
					header->bits.size = 0;
				}
				else
				{
					header->bits.token = TOKEN_DATAPACK | 0x8;
					header->bits.size = nSize;
					chk = 0;
					for( i = 0; i < nSize; i++)
						chk ^= uart0_buf[i+4];
						uart0_buf[i+4] = chk;
					state = CMD_READY;					
				}
				chk = 0;
				for( i = 0; i < 3; i++ )
				{
					chk^= uart0_buf[i];
				}
				header->bits.check = chk;
				nSize += 4;
				UART0Putch(PLT_VERSION);				
				UART0WriteTab(uart0_buf, nSize);
				continue;
				break;
			}
		}
	   if( nDataSize - 1 )
	   {
// 			8
			
			chk = 0;
			i = 4;
			do{	
				t = UART0Getch();
				if( t == PLT_TAB )
				{
					t = UART0Getch();
				}else if( t == PLT_VERSION )
				{
					continue;
				}
				chk ^= t;
				uart0_buf[i] = t;
				i++;
			}
			while( i < nDataSize );
	   		if( chk )
	   			continue;	   		
	   }
		/*
			处理协议		
		*/
			   		
/*解析命令*/
/*
	Flash:
	CMD + ADDRESS + SIZE + Data
	CMD	+ ADDRESS + BIT + Data
	CMD + ADDRESS
*/
		cmd = uart0_buf[4];
		switch(cmd)
		{
			case SETLONGDATA:
			case GETLONGDATA:
			case SETBITDATA:
				msg->bits.msg = cmd & 0xf;
				msg->bits.size = 8;
				msg->bits.data[0] = (uint32)(uart0_buf + 1 + 4);
				msg->bits.task = 2;
				msg->bits.node = FLASH_NODE;
				if( NMsgQWrite(msg) == QUEUE_OK )
				{
					OSSemPost(QNoEmptySem);
					state = CMD_BUSY;
				}				
				break;
		}
/*
		switch( cmd )
		{
		case ADDUSER:
			{
				uint16 empty_p,exist_p;
				nDataSize = uart_buf[CMD_P1];
				addr.value[0] = *(uart_buf + DATA_PACK_DATA);
				addr.value[1] = *(uart_buf + DATA_PACK_DATA + 1);
				addr.value[2] = *(uart_buf + DATA_PACK_DATA + 2);
				addr.value[3] = *(uart_buf + DATA_PACK_DATA + 3);
						
				if( addr.addr != 0 && nDataSize == 13 )
				{
					at45db_Comp_uint32( USER_ID_PAGE, 0, addr.addr , (USER_ID_NUMBER), &empty_p, &exist_p );
					if( exist_p == (USER_ID_NUMBER) )
					{						
						exist_p = empty_p;
					}
					addr.addr = 0;
					empty_p =  exist_p / 132;
					addr.bits.pa = empty_p;
					addr.bits.ba = exist_p % 132;
					at45db_PagetoBuffer( 1, addr.bits.pa + USER_ID_PAGE);
					at45db_Buffer_Write( 1, addr.bits.ba, uart_buf + DATA_PACK_DATA , 4);
					at45db_BuffertoPage( 1, addr.bits.pa + USER_ID_PAGE );
					
					addr.bits.pa *= 2;
					addr.bits.ba *= 2;
					at45db_PagetoBuffer( 1, empty_p + USER_GROUP_PAGE );	
					at45db_Buffer_Write( 1, addr.bits.ba, uart_buf + DATA_PACK_DATA + 4, 8);	
					at45db_BuffertoPage( 1, empty_p + USER_GROUP_PAGE );				


					addr.bits.pa >>= 2;
					addr.bits.ba >>= 2;
					at45db_PagetoBuffer( 1, addr.bits.pa + USER_INFO_PAGE );	
					at45db_Buffer_Write( 1, addr.bits.ba, uart_buf + DATA_PACK_DATA + 12, 2);	
					at45db_BuffertoPage( 1, addr.bits.pa + USER_INFO_PAGE );
					
						
					uart_buf[CMD_P4] = 0;
					nDataSize = 0;
				}else
				{
					uart_buf[CMD_P4] = ERR_CMDPARAM;
					nDataSize = 0;
				}
			}
			break;
		case DELUSER:
			{
				uint32 id;
				uint16 empty_p,exist_p;
				nDataSize = uart_buf[CMD_P1];
				addr.value[0] = uart_buf[CMD_P1];
				addr.value[1] = uart_buf[CMD_P2];
				addr.value[2] = uart_buf[CMD_P3];
				addr.value[3] = uart_buf[CMD_P4];
						
				if( addr.addr != 0 )
				{
					at45db_Comp_uint32( USER_ID_PAGE, 0, addr.addr , (USER_ID_NUMBER), &empty_p, &exist_p );
					if( exist_p == (USER_ID_NUMBER) )
					{
						uart_buf[CMD_P4] = ERR_USERNOEXIST;
						nDataSize = 0;
						break;					
					}
					addr.addr = 0;
					empty_p =  exist_p / 528;
					addr.bits.pa = empty_p + USER_ID_PAGE;
					addr.bits.ba = exist_p % 528;
					id = 0;
					at45db_PagetoBuffer( 1, addr.bits.pa );
					at45db_Buffer_Write( 1, addr.bits.ba, (uint8*)&id, 4);
					at45db_BuffertoPageNoErase( 1, addr.bits.pa );			

					uart_buf[CMD_P4] = 0;
					nDataSize = 0;
				}else
				{
					uart_buf[CMD_P4] = ERR_CMDPARAM;
					nDataSize = 0;
				}
			
			}
			break;

		case SETSTATUE:
			switch( uart_buf[CMD_P1] )
			{
				case TEST_NODE:
					test =  uart_buf[CMD_P2];					
					uart_buf[CMD_P4] = 0;
					nDataSize = 0;
					break;
				default:
					uart_buf[CMD_P4] = ERR_NODENOEXIST;
					nDataSize = 0;
					break;					
			}
			break;
		case GETSTATUS:
			switch( uart_buf[CMD_P1] )
			{
				case TEST_NODE:
					uart_buf[CMD_P1] = test;
					uart_buf[CMD_P4] = 0;
					nDataSize = 0;					
					break;
				default:
					uart_buf[CMD_P4] = ERR_NODENOEXIST;
					nDataSize = 0;
					break;				
			}
			break;
		case DOWNLOADLOG:
			{
				uint32 id;
				uint16 ba,pa;
				addr.value[3] = uart_buf[CMD_P1];
				addr.value[2] = uart_buf[CMD_P2];
				addr.value[1] = uart_buf[CMD_P3];
				addr.value[0] = uart_buf[CMD_P4];
				id = addr.addr;
				if( log_id - id > MAX_SAVELOGS )
				{
					id = log_id - MAX_SAVELOGS;
				}
				ba = (id % 33) << 4;
				pa = id / 33;
				pa %= (MAX_PAGE_COUNT - LOG_PAGE);
				pa += LOG_PAGE;
				
				//read log
				nDataSize = (log_id - id) * 16;
				if( nDataSize > 256 )
				{
					nDataSize = 256;
				}
				if( pa == 4095 && 
					ba + nDataSize > 528 )
				{
					nDataSize = 528 - ba;
				}
				at45db_Page_Read( pa, ba, uart_buf + DATA_PACK_DATA, nDataSize);
				uart_buf[CMD_P4] = 0;
				nDataSize--;
				break;
			}
		case SETPOINTLOG:
			break;
		default:
			uart_buf[CMD_P4] = ERR_CMD;
			nDataSize = 0;
			break;		
		}
		
		
		cmd |= 0x80;
		cmd &= 0xBF;
		uart_buf[CMD_CMD] = cmd;
		uart_buf[0] = PLT_VERSION;
		uart_buf[CMD_ADDR] = MACHINE_NO;		
		chk = 0;
		for( i = 1; i < 7; i++)
		{
		
			chk ^= uart_buf[i];
		}
		
		uart_buf[i] = chk;
		i++;
		if( nDataSize )
		{
			uart_buf[CMD_CMD] |= 0x40;
			uart_buf[CMD_XOR] ^= 0x40;
			uart_buf[i] = PLT_VERSION;
			i++;
			nDataSize += i;
			chk = 0;
			for( ; i < nDataSize; i++ )
			{
				chk ^= uart_buf[i];
			}
		   	uart_buf[i] = chk;
		   	i++;
	   	}
	   	UART0Write(uart_buf, i);
*/	   	
	}
	
}
Example #2
0
char skyeye_getc(void)
{
	char ret;
    ret = UART0Getch();
	return ret;
}