📄 gprs.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include "gprs.h"
#include "etr232i.h"
#include "etr_ppp.h"
#define ListNum 10
struct ActionItem
{
char* ATCmdString;
char* ATEchoString;
int (* DoRoutine)();
long TimeOut;
};
char GATCmdStr[40];
char GATEchoStr[40];
unsigned long GTimeOut;
unsigned long StartTick;
char ReturnStr[2560];
int Returnlen=0;
int EchoStrlen;
int InPro = 0;
int FirstFlg = 0;
PPPGPRSState State=POWERON;
int GPRSPowerOn( );
int PPPInit( );
int SendATCmd( );
int PPPLinkUp( );
int PPPPolling( );
int PPPTermNet( );
int GPRSPowerIsOn( );
int EnableIGT( );
int DisableIGT( );
struct ActionItem ActionList[ListNum] =
{ { 0, 0, GPRSPowerOn, 200 },
{ 0, 0, PPPInit, 0 },
{ "ATE0\r", "OK", SendATCmd, 40 },
{ "AT+CGATT?\r", "1", SendATCmd, 40 },
{ "AT+CGATT=1\r", "OK", SendATCmd, 100 },
{ "AT+CGDCONT=1,\"IP\",\"CMNET\"\r", "OK", SendATCmd, 40 },
{ "ATD*99***1#\r", "CONNECT", SendATCmd, 40 },
{ 0, 0, PPPLinkUp, 200 },
{ 0, 0, PPPPolling, 0 },
{ 0, 0, PPPTermNet, 220 } };
int EnableIGT( )
{
GPRS_AUX( 0 );
GPRS_STB( 1 );
return 0;
}
int DisableIGT( )
{
GPRS_STB( 0 );
return 0;
}
int GPRSPowerIsOn( )
{
unsigned char status;
// check GPRS module power state
status = GPRS_PWR( );
return status;
}
// return = 1: time out, =0: not yet!
int IsTimeOut( )
{
unsigned long CurrentTick;
if( GTimeOut == 0 ) return 0;
// for vrtx, replace with sc_gettime( );
CurrentTick = NB_clock( );
if( CurrentTick >= (StartTick+GTimeOut) ) return 1;
else return 0;
}
int GPRSPowerOn( )
{
int i;
switch( InPro )
{
case 0:
if( !GPRSPowerIsOn( ) )
{
DisableIGT( );
NB_Delay( 10 );
EnableIGT( );
NB_Delay( 100 );
DisableIGT( );
StartTick = NB_clock( );
InPro = 1;
}
break;
case 1:
if( IsTimeOut( ) )
InPro = 0;
break;
}
return InPro;
}
int PPPInit( )
{
int i;
InPro = 0;
i = InitPPPNet( );
if( i < 0 ) return -1;
return 0;
}
int SendATCmd( )
{
int i1;
char abyte;
switch( InPro )
{
case 0:
SendATCmdString( GATCmdStr );
EchoStrlen = strlen( GATEchoStr );
StartTick = NB_clock( );
InPro = 1;
Returnlen = 0;
break;
case 1:
i1 = GetATCmdEcho( );
if( i1 != -1 )
{
abyte = (char)i1;
if( abyte == '\r' ) ReturnStr[Returnlen] = 'r';
else if( abyte == '\n' ) ReturnStr[Returnlen] = 'n';
else ReturnStr[Returnlen] = abyte;
Returnlen++;
ReturnStr[Returnlen] = '\0';
if( Returnlen >= EchoStrlen )
if( strncmpi( &ReturnStr[Returnlen-EchoStrlen], GATEchoStr, EchoStrlen )==0 )
{
InPro = 0;
return 0;
}
if( Returnlen >= 2560 )
{
InPro = 0;
return -1;
}
}
if( IsTimeOut( ) )
{
InPro = 0;
return -1;
}
break;
}
return InPro;
}
int PPPLinkUp( )
{
int i;
switch( InPro )
{
case 0:
i = SetupPPPLink( 0 );
StartTick = NB_clock( );
InPro = 1;
break;
case 1:
i = SetupPPPLink( 0 );
if( i==0 )
{
InPro = 0;
return 0;
}
if( IsTimeOut( ) )
{
InPro = 0;
return -1;
}
break;
}
return InPro;
}
int PPPPolling( )
{
InPro = 0;
if( !GPRSPowerIsOn( ) ) return -1;
if( GetPPPState( ) !=1 ) return -1;
return 0;
}
int PPPTermNet( )
{
switch( InPro )
{
case 0:
TermPPPNet( );
StartTick = NB_clock( );
GPRS_AUX( 1 );
InPro = 1;
break;
case 1:
if( GPRSPowerIsOn( ) ) GPRS_AUX( 1 );
else InPro = 0;
if( IsTimeOut( ) )
InPro = 0;
break;
}
return InPro;
}
// return 0 1: PPPInit
// return 7: SetupPPPLink
// return 8: PPPLinkup
// return 9: PPPTerm
// other( 2 3 4 5 6 ): ATCmd
PPPGPRSState PPP_Running( )
{
int i, i1;
i = State;
if( ActionList[i].ATCmdString != NULL )
{
strcpy( GATCmdStr, ActionList[i].ATCmdString );
strcpy( GATEchoStr, ActionList[i].ATEchoString );
}
GTimeOut = ActionList[i].TimeOut;
i1 = ActionList[i].DoRoutine( );
switch( State )
{
case POWERON:
if( i1==0 ) State = PPPINIT;
break;
case PPPINIT:
if( i1==0 ) State = ATE0;
else State = POWERON;
break;
case ATE0:
if( i1==0 ) State = ATCGATT;
else if( i1<0 ) State = PPPTERM;
break;
case ATCGATT:
if( i1==0 ) State = ATCGDCONT;
else if( i1<0 ) State = ATCGATT_1;
break;
case ATCGATT_1:
if( i1==0 ) { State = ATCGATT; FirstFlg=0; }
else if( i1<0 )
{
FirstFlg++;
if( FirstFlg>1 ) { State = PPPTERM; FirstFlg=0; }
}
break;
case ATCGDCONT:
if( i1==0 ) State = ATD99;
else if( i1<0 ) State = PPPTERM;
break;
case ATD99:
if( i1==0 )
{
State = PPPLINKUP;
FirstFlg = 0;
}
else if( i1<0 )
{
FirstFlg++;
if( FirstFlg>1 ) {FirstFlg=0; State = PPPTERM;}
}
break;
case PPPLINKUP:
if( i1==0 ) State = PPPPOLLING;
else if( i1<0 ) State = PPPTERM;
break;
case PPPPOLLING:
if( i1==-1 ) State = PPPTERM;
break;
case PPPTERM:
if( i1==0 ) State = POWERON;
break;
}
return State;
}
void PPP_Restart( )
{
if( State < ATE0 ) return;
InPro = 0;
State = PPPTERM;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -