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

📄 at_rps.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
字号:
#include <string.h>
#include <sys\lmalloc.h>
#include <sys\sysmsg.h>
#include <sys\at.h>

#include <service\psst\at_rps.h>

extern DWORD	onwerid;
extern DWORD	usol_onwerid[];

AT_RPS_INDEX	AtRpsTable[] =
{
	{"OK",2, AT_RPS_OK,							0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},
	{"CONNECT",7, AT_RPS_CONNECT,				0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},
	{"RING",4, AT_RPS_RING,						0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},
	{"BUSY",4, AT_RPS_BUSY,						0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},
	{"+CLIP:",6, AT_RPS_CLIP,					0x89,0x00,0x01,0xFF,0x00,0x00,0x00,0x00},
	{"+CMGR:",6, AT_RPS_CMGR,					0x00,0x00,0x07,0x04,0x01,0xFF,0x00,0x00},
	{"+CMGS:",6, AT_RPS_CMGS,					0x00,0x00,0x00,0x00,0x01,0xFF,0x00,0x00},
	{"+CMGF:",6, AT_RPS_CMGF,					0x00,0x00,0x00,0x00,0x01,0xFF,0x00,0x00},
	{"+CMGL:",6, AT_RPS_CMGL,					0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00},
	{"+CMTI:",6, AT_RPS_CMTI,					0x00,0x00,0x00,0x01,0xFF,0x00,0x00,0x00},
	{"+CME ERROR:",11, AT_RPS_CME,				0x00,0x00,0x00,0x01,0xFF,0x00,0x00,0x00},
	{"+CMS ERROR:",11, AT_RPS_CMS,				0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},
	{"+CNMI:",6, AT_RPS_CNMI,					0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},
	{"NO CARRIER",10, AT_RPS_NO_CARRIER,		0x02,0x00,0x01,0xFF,0x00,0x00,0x00,0x00},
	{"NO DIALTONE",11, AT_RPS_NO_DIALTONE,		0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},
	{"ERROR",5, AT_RPS_ERROR,					0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},
	{">",1, AT_RPS_READY,						0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},
	{NULL,0, AT_RPS_TEXT,						0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};

#ifdef _AT_RPS_INDEPENDENT_TEST
// only valid in the case of independent test
void main()
{
	long	i;
	char	buf[100];
	char	*s;
	AT_RPS_PAR *par;

	for(;;)
	{
		printf( "\nInput RPS:\n" );
		i = MatchATRPSType( buf );
		s = AtRpsTable[i].s;
		if( s == NULL )
			break;
		else
			printf( "%s\n", s );
		switch( AtRpsTable[i].type )
		{
			case AT_RPS_OK:
			case AT_RPS_CONNECT:
			case AT_RPS_RING:
			case AT_RPS_BUSY:
			case AT_RPS_ERROR:
			case AT_RPS_NO_CARRIER:
			case AT_RPS_NO_DIALTONE:
				par = GetParameter( buf, NULL, 0, NULL, 0 );
				DispParameter( par );
				FreeParameter( par );
				break;
			case AT_RPS_CMGR:
			case AT_RPS_CMGL:
			case AT_RPS_CMGS:
			case AT_RPS_CMGF:
			case AT_RPS_CNMI:			
				par = GetParameter( buf, "OK", 2, AtRpsTable[i].s, AtRpsTable[i].len );
				DispParameter( par );
				FreeParameter( par );
				break;
			case AT_RPS_CMS:
			case AT_RPS_CME:
				par = GetParameter( buf, NULL, 0, NULL, 0 );
				DispParameter( par );
				FreeParameter( par );
				break;
			default:
				break;
		}
	}
	return;
}
#endif

long MatchATRPSType( char *buf )
{
	char 	ch;
	int		i = 0, k = 0, n, count = 0;
	unsigned char	index;
	
	for(;;)
	{
		n = 1;
		index = AtRpsTable[i].index[k];
		if( index == 0xFF )		// 完全匹配
		{
			if( AtRpsTable[i].len != 0 )
				ReadResponse ( buf, AtRpsTable[i].len - count );		// 读取剩余的字符
			//return AtRpsTable[i].type;
			return i;
		}
		while( index == 0 )		// 第一个不为0的索引偏移值
		{
			k++;
			n++;
			index = AtRpsTable[i].index[k];
		}
		ReadResponse( buf, n );		// 读取n个字符
		count += n;
		ch = buf[n-1];
		for(;;)
		{
			index = AtRpsTable[i].index[k];
			if( index == 0xFF )		// 完全匹配
			{
				if( AtRpsTable[i].len != 0 )
					ReadResponse ( buf, AtRpsTable[i].len - count );		// 读取剩余的字符
				//return AtRpsTable[i].type;
				return i;
			}
			else
			{	
				if( index & 0x80 )		// 区分大小写
				{
					if( ch != AtRpsTable[i].s[k] )	// 字符不匹配
					{
						if( index == 0 )	// 部分匹配
							return -1;
						i += ( index & 0x7F );			// 跳转到下一项
					}
					else
					{
						k++;
						break;
					}
				}
				else					// 不区分大小写
				{
					// 字符不匹配
					if( ch != AtRpsTable[i].s[k] && ch != AtRpsTable[i].s[k] + 0x20 )
					{
						if( index == 0 )	// 部分匹配
							return -1;
						i += index;					// 跳转到下一项
					}
					else
					{
						k++;
						break;
					}
				}
			}
		}
	}
}

#ifdef _AT_RPS_INDEPENDENT_TEST
// only valid in the case of independent test
int ReadResponse( char *buf, int n )
{
	int i;
	for( i = 0; i < n; i++ )
		buf[i] = getchar();

	return TRUE;
}
#else
int ReadResponse( char *buf, int n )
{
	char	quit = 0;
	int		need = n;
	MSG		msg;
	static long	count = 0;
	
	while( !quit )
	{
		if( count == 0 )
		{
			SysRecvMessage( &msg, -1 );
			
//			if( msg.message == SM_AT )
//			{
//				onwerid = msg.lparam;
//				SysWriteDev( UART0_ID, msg.data, msg.wparam, -1 );
//				SysLfree( msg.data );
//				continue;
//			}
//			else if( msg.message != SM_DATA_RECEIVED || msg.lparam != UART0_ID )
//				continue;

			switch( msg.message )
			{
				case SM_DATA_RECEIVED:
					break;
				case SM_DATA_SEND:
					onwerid = msg.lparam;
					SysWriteDev( UART0_ID, msg.data, msg.wparam, -1 );
					SysLfree( msg.data );
					continue;
				case SM_OPEN:
					onwerid = msg.lparam;
					continue;
				case SM_CLOSE:
					onwerid = msg.lparam;
					continue;
				case SM_WAIT_USOL:
					usol_onwerid[msg.wparam] = msg.lparam;
					continue;
				default:
					continue;
			}

			count += msg.wparam;
			//dbgoutput( "received: %d bytes", msg.wparam );
		}
		
		if( count >= need )
		{
			SysReadDev( UART0_ID, buf, need, 0 );
			count -= need;
			//buf += need;
			//buf[0] = '\0';
			//dbgoutput( "receive '%s' ", buf );
			quit = 1;
		}
		else
		{
			SysReadDev( UART0_ID, buf, count, 0 );
			need -= count;
			buf += count;
			count = 0;
		}
		//dbgoutput( "receive '%s' ", buf );
	}

	return TRUE;
}
#endif

AT_RPS_PAR *GetParameter( char *buf, char *terminator, int termLen, char *symbol, int symLen )
{
	int		i = 0, j = 0, k = 0;
	int		enCheckTerminator = 0, isEmbeded = 0, inString = 0;
	AT_RPS_PAR	*par, *p, *head;
	SUBPAR	*subpar;
	
	par = (AT_RPS_PAR *)SysLmalloc( sizeof(AT_RPS_PAR) );
	if( par == NULL )
		return NULL;
	par->head = NULL;
	par->tail = NULL;
	par->num = 0;
	par->next = NULL;
	
	head = par;

	for(;;i++)
	{
		if( enCheckTerminator )
		{
			if( termLen == 0 )		// 以<CR><CL>结尾
			{
				//ReadResponse( &buf[i], 2 );
				break; 		// break loop
			}
			else
			{
				ReadResponse( &buf[i], 1 );
				if( buf[i] == terminator[0] )		// 以OK结尾
				{
					i++;
					ReadResponse( &buf[i], termLen +1 );
					break; 		// break loop
				}
				else
				{
					if( buf[i] == symbol[0] )		// multi response
					{
						i++;
						ReadResponse( &buf[i], symLen );	// skip response symbol
						i += ( symLen -1 );
						k = 0;
						p = (AT_RPS_PAR *)SysLmalloc( sizeof(AT_RPS_PAR) );
						if( p == NULL )
							goto ERROR_HANDLE;
						p->head = NULL;
						p->tail = NULL;
						p->num = 0;
						p->next = NULL;
						par->next = p;
						par = p;
					}
					enCheckTerminator = 0;
				}
			}
		}
		else
		{
			ReadResponse( &buf[i], 1 );
			enCheckTerminator = 0;
		}
		j++;
		switch( buf[i] )
		{
			case '(':
				isEmbeded++;		// 进嵌套
				break;
			case ')':
				isEmbeded--;		// 出嵌套
				break;
			case '\"':
				inString = !inString;
				break;
			default:
				if( isEmbeded == 0 && inString == 0 )	// 没有嵌套,也不在字符串内
				{
					switch( buf[i] )
					{
						case ',':	// 参数分隔符
							buf[i] = '\0';
							// 添加参数子项
							subpar = (SUBPAR *)SysLmalloc( sizeof(SUBPAR) );
							if( subpar == NULL )
								goto ERROR_HANDLE;
							subpar->len = j;
							subpar->data = &buf[ i+1-j ];
							subpar->next = NULL;
							subpar->line = k;
							par->num++;
							if( par->head == NULL )
							{
								par->head = subpar;
								par->tail = subpar;
							}
							else
							{
								par->tail->next = subpar;
								par->tail = subpar;
							}
							j = 0;
							break; 		// break inner switch
						case 0x0A:
						case 0x0D:
							buf[i] = '\0';
							subpar = (SUBPAR *)SysLmalloc( sizeof(SUBPAR) );
							if( subpar == NULL )
								goto ERROR_HANDLE;
							subpar->len = j;
							subpar->data = &buf[ i+1-j ];
							subpar->next = NULL;
							subpar->line = k;
							par->num++;
							if( par->head == NULL )
							{
								par->head = subpar;
								par->tail = subpar;
							}
							else
							{
								par->tail->next = subpar;
								par->tail = subpar;
							}
							j = 0;
							i++;
							k++;
							ReadResponse( &buf[i], 1 );
							//i++;
							enCheckTerminator = 1;
							break;		// break inner switch
					}
				}
				break;
		}
	}
	return head;

ERROR_HANDLE:
	FreeParameter( par );
	return NULL;
}

#ifdef _AT_RPS_INDEPENDENT_TEST
// only valid in the case of independent test
void DispParameter( AT_RPS_PAR *par )
{
	int		i, line;
	SUBPAR	*subpar;
	AT_RPS_PAR	*p = par;

	while( p != NULL )
	{		
		subpar = p->head;
		line = -1;
		for( i = 0; i< p->num; i++ )
		{
			if( line < subpar->line )
			{
				printf( "\n" );
				line = subpar->line;
			}
			else
			{
				printf( "," );
			}
			printf( "%s", subpar->data );
			subpar = subpar->next;
		}
		p = p->next;
		printf( "\n" );
	}
	return;
}
#endif

void FreeParameter( AT_RPS_PAR *par )
{
	SUBPAR	*temppar;
	AT_RPS_PAR *p = par, *temp;
	
//	if( par != NULL && par->head != NULL )
//		SysLfree( par->head->data );
//	else
//		return;

	while( p != NULL )
	{		
		while( p->head != p->tail )
		{
			temppar = p->head;
			p->head = p->head->next;
			SysLfree( temppar );
		}
		SysLfree( p->head );
		temp = p->next;
		SysLfree( p );
		p = temp;
	}

	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -