📄 gprs080228.c
字号:
returnId = 0;
//如果此时正在发送数据该怎么处理?//cj add at 2008 2 20
if (gprsInfo.state == STATE_WAIT_PROMPT)
{
gprsInfo.state = STATE_SEND_UDP_PACKET;
}
else if (gprsInfo.state == STATE_WAIT_UDP_OK)
{
gprsInfo.state = STATE_IDLE;
}
break;
}
else if (returnId == AT_RET_RING)//( (returnId == AT_RET_RING) && (gprsInfo.state>=STATE_IDLE) )//
{
gprsInfo.indication = 1;
strcpy(gprsInfo.inCallNumber, "000");
gprsInfo.state = STATE_VOICE_RING;
set_ringtimeout();
}
//cj add,主要是为了获取SIM卡号
if (returnId == AT_RET_CCID)
{
setSimCard(ptrChar, SIM_CARD_LEN);
}
//end of add
*ptrChar = 0;
switch( gprsInfo.state )
{
/**cj add for setting volume***/
case STATE_RECIEVE_SET_VOLUME:
gprsInfo.state = STATE_SEND_CCID;
break;
/****end of add******/
case STATE_RECEIVE_PREINIT:
if( (returnId==AT_RET_OK) || (returnId==AT_RET_AT) )
gprsInfo.state = STATE_SEND_INIT;
break;
case STATE_RECEIVE_INIT:
if( returnId == AT_RET_OK )
gprsInfo.state = STATE_SEND_SET_VOLUME;//cj mod for setting volume:STATE_SEND_CCID;
else
gprsInfo.state = STATE_SEND_INIT;
break;
case STATE_RECEIVE_CCID:
if( returnId == AT_RET_CCID )
gprsInfo.state = STATE_SEND_APN;
else
gprsInfo.state = STATE_SEND_CCID;
break;
case STATE_RECEIVE_APN:
if( returnId == AT_RET_OK )
gprsInfo.state = STATE_SEND_ACTIVE;
break;
case STATE_RECEIVE_ACTIVE:
if( returnId == AT_RET_OK )
gprsInfo.state = STATE_SEND_GET_IP;
break;
case STATE_RECEIVE_PACKET_INIT:
if( (returnId==AT_RET_OK) || (returnId==AT_RET_AT) )//cj mod at 2008 2 21 old if( returnId == AT_RET_OK )
gprsInfo.state = STATE_SEND_POWER;
break;
case STATE_RECEIVE_POWER:
if(( returnId == AT_RET_CSQ ) || (returnId == AT_RET_ATCSQ))
{
unsigned char csqCount;
char *csqPtr;
gprsInfo.state = STATE_SEND_UDP_LENGTH;
csqCount = 0;
if (returnId == AT_RET_CSQ)
csqPtr = ptrChar;
else
csqPtr = ptrChar+10;
while(*csqPtr!=0x0D)
{
csqCount++;
csqPtr++;
}
csqCount -= 5;
csqCount &= 0xF;
csqPtr = ptrChar + 5;
memcpy(gprsInfo.power, csqPtr, csqCount);
*(csqPtr+csqCount) = 0;
}
break;
case STATE_RECEIVE_CONNECT:
if( returnId == AT_RET_CONNECT_OK )
gprsInfo.state = STATE_IDLE;
else if( returnId == AT_RET_OK )
{
//gprsInfo.txTimer = 80;
ptrChar += strlen(at_ret[i].str);
}
break;
case STATE_WAIT_PROMPT:
if( returnId == AT_RET_PROMPT )
gprsInfo.state = STATE_SEND_UDP_PACKET;
else
gprs_reset(2);//gprsInfo.state = STATE_SEND_PACKET_INIT;
break;
case STATE_WAIT_UDP_OK:
if( returnId == AT_RET_SEND_OK )
gprsInfo.state = STATE_IDLE;
break;
case STATE_VOICE_OUT:
if( returnId==AT_RET_COLP )
gprsInfo.indication = 3;
case STATE_VOICE_IN:
if( (returnId==AT_RET_NO_CARRIER) || (returnId==AT_RET_BUSY) )
{
gprsInfo.state = STATE_IDLE;
gprsInfo.indication = 2;
}
break;
case STATE_VOICE_RING:
if(returnId==AT_RET_NO_CARRIER )
gprsInfo.state = STATE_IDLE;
break;
} /*end switch*/
} /*end if*/
} /*end for*/
}while( *ptrChar&&(returnId!=0) );
}
void gprs_receive_process(void)
{
unsigned int tmp;
if( ipInfo.rxState )
return;
tmp = at_serial_receive(&gprsInfo.rxPtr);
if( tmp )
{
gprsInfo.rxBytes += tmp;
}
else
{
if( gprsInfo.rxBytes )
{/*收到数据*/
/*xhb_debug 0*/
// if (STATE_RECEIVE_PACKET_INIT == gprsInfo.state)
debugDump(0, gprsRcvBuffer, gprsInfo.rxBytes);
gprsRcvBuffer[gprsInfo.rxBytes] = 0;
explain_at_return();
gprsInfo.rxBytes = 0;
gprsInfo.rxPtr = gprsRcvBuffer;
}
}
}
void gprs_auto_reset(void)
{
static unsigned char count=0;
/*要1分钟内必须收到数据包,否则模块断电*/
count ++;
if( gprsInfo.state >= STATE_VOICE_RING )
{
ipInfo.rxTimer = 0;
}
else if( count >= 20 )
{
count = 0;
ipInfo.rxTimer ++;
if( (gprsInfo.state<STATE_IDLE) && (ipInfo.rxTimer>=60*1))
{
gprs_reset(3);
}
else if(ipInfo.rxTimer >= 60*2 )
{
gprs_reset(4);
}
}
}
/*每50ms调用一次*/
void gprs_process(void)
{
static unsigned int data lastRxCount=0;
/*add for debug*/
// gprs_debug();
/*end of add*/
gprs_transmit_process();
gprs_receive_process();
if( gprsInfo.indication )
{
voice_indication(gprsInfo.indication, gprsInfo.inCallNumber);
gprsInfo.indication = 0;
gprsInfo.inCallNumber[0] = 0;
}
if( gprsInfo.txTimer )
{
gprsInfo.txTimer --;
if( (!gprsInfo.txTimer) && (gprsInfo.state<STATE_VOICE_RING) )
// if( (!gprsInfo.txTimer) && (gprsInfo.state<=STATE_VOICE_RING) )
{
switch( gprsInfo.state )
{
case STATE_RECEIVE_PREINIT:
gprsInfo.state = STATE_SEND_PREINIT;
break;
case STATE_RECEIVE_INIT:
gprsInfo.state = STATE_SEND_INIT;
break;
case STATE_IDLE:
break;
case STATE_RECEIVE_PACKET_INIT:
gprsInfo.errorCount ++;
if( gprsInfo.errorCount >= 20 )
gprs_reset(5);
else
gprsInfo.state = STATE_SEND_PACKET_INIT;
break;
case STATE_WAIT_UDP_OK:
gprsInfo.state = STATE_IDLE;
sprintf(debug_msg, "111:here\r\n");
sioc_send(debug_msg, strlen(debug_msg));
break;
case STATE_WAIT_PROMPT:
gprsInfo.state = STATE_SEND_UDP_PACKET;
sprintf(debug_msg, "222:here\r\n");
sioc_send(debug_msg, strlen(debug_msg));
break;
default:
gprsInfo.state = STATE_SEND_PACKET_INIT;
break;
//gprs_reset();
break;
}
}
}
gprs_auto_reset();
if( lastRxCount != ipInfo.rxCount )
{
ipInfo.ipLinkTimer = 0;
ipInfo.state = 1;
lastRxCount = ipInfo.rxCount;
}
else
{
ipInfo.ipLinkTimer ++;
if( (ipInfo.ipLinkTimer>20*60) || (lastRxCount==0) )
ipInfo.state = 0;
else
ipInfo.state = 1;
}
}
/***********************************************
*
************************************************/
static unsigned long data transIndex=300;
char udp_send2(char *ptr, unsigned char len)
{
return 0;
}
char udp_send(char *ptr, unsigned int len)
{
unsigned char *tmpPtr;
unsigned int i;
unsigned int checkSum;
if( gprsInfo.state != STATE_IDLE)
return -1;
gprsInfo.state = STATE_SEND_PACKET_INIT;
ipInfo.txTimer = 40;
ipInfo.txLength = len + 12 + 0; /*多发送一个字节*/
ptr[len+12] = 0;
tmpPtr = ptr + 12;
checkSum = 0;
for(i=0; i<len; i++)
{
checkSum += *tmpPtr;
tmpPtr ++;
}
tmpPtr = ptr + 8;
*tmpPtr++ = checkSum;
*tmpPtr++ = checkSum / 256;
*tmpPtr++ = LSB(len);
*tmpPtr++ = MSB(len);
memcpy(ipInfo.txBuffer, ptr, ipInfo.txLength);
return(0);
}
/***********************************************
*
************************************************/
unsigned char udp_receive(char **ptr)
{
if( ipInfo.rxState )
{
*ptr = ipInfo.rxBuffer;
return(ipInfo.rxLength);
}
return(0);
}
void udp_start_receive(void)
{
ipInfo.rxState = 0;
}
unsigned char udpOnline[]={0x4E, 0x4A, 0x50, 0x54, 0x02, 0, 0x07, 0x20, 0, 0x0, 0, 0x0E,\
0, 0, 0, 0,\
0x31, 0x32, 0x33, \
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31,\
};
void test_online(void)
{
udpOnline[15] ++;
udp_send2(udpOnline, sizeof(udpOnline)-12);
}
void udp_test(void)
{
/* static unsigned char count;
count ++;
if( count == 10 )
{
test_online();
}
else if( count >= 20 )
{
count = 0;
udp_send2(udpDebug, sizeof(udpDebug)-12);
}*/
}
/*陈剑修改,07年3月16日*/
/*************************
**返回值:0 表示无法连通
** 1 表示与中心连接
** 2 表示正在语音通话
**************************/
unsigned char get_gprs_state(void)
{
if( gprsInfo.state >= STATE_VOICE_RING )
return PPP_VOICE;
else if( ipInfo.state )
return PPP_CONECTTOCENTER;
else
return PPP_CONECTTING;
}
/**********************************************************/
char voice_call(char *number)
{
strcpy(gprsInfo.outCallNumber, number);
return 0;
}
void voice_hold_on(void)
{
if( gprsInfo.state >= STATE_VOICE_RING )
gprsInfo.state = STATE_HOLD_ON;
}
void voice_hold_off(void)
{
if( gprsInfo.state >= STATE_VOICE_RING )
gprsInfo.state = STATE_HOLD_OFF;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -