📄 at_rps.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 + -