📄 gprsdrv.c
字号:
/****************************************************************
** *
** FILE : Gprsdrv.C *
** COPYRIGHT : (c) 2001 .Xiamen Yaxon NetWork CO.LTD *
** *
** *
** By : CCH 2002.1.15 *
****************************************************************/
#include "includes.h"
#include "bsp.h"
#include "message.h"
#include "public.h"
#include "tools.h"
#include "timetask.h"
#include "errtask.h"
#include "gsmtask.h"
#include "phonedrv.h"
#include "at_core.h"
#include "gprsrecv.h"
#include "gprssend.h"
#include "tcpdrv.h"
#include "udpdrv.h"
#include "ivudpdrv.h"
#include "gprsdrv.h"
#include "ipport.h"
#include "netbuf.h"
#include "net.h"
#include "zprint.h"
/*
********************************************************************************
* DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define MAX_ATTACH 3
#define MAX_TROUBLE 3
#define MAX_TEST (10*60)
#define PERIOD_TESTATTACH SECOND, 1
#define PERIOD_WAITATTACH_DEF SECOND, 40
#define PERIOD_WAITATTACH_ERR SECOND, 130
#define PERIOD_SUSPENDWAIT SECOND, 10
#define PERIOD_DELAY_DEACTIVE SECOND, 10
/*
********************************************************************************
* DEFINE BACKUP PARAMETERS
********************************************************************************
*/
static const INT16U backupmask[] = {0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200,
0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002};
/*
********************************************************************************
* DEFINE status
********************************************************************************
*/
#define ACTIVE_ 0x01
#define ONLINE_ 0x02
#define ATTACHING_ 0x04
#define SUSPEND_ 0x08
#define IVUDPLINK_ 0x10
#define UDPLINK_ 0x20
#define DELAY_DEACTIVE_ 0x40
/*
********************************************************************************
* DEFINE MODULE VARIANT
********************************************************************************
*/
static INT8U status;
static INT8U curindex;
static INT16U ct_attach, ct_test, ivudplinktime;
static TMR_TSK *monitortmr;
static INT16U ct_trouble;
extern void ppp_up(void);
extern int ModemIsIdle(int unit);
extern char * print_ipad(unsigned long ipaddr);
extern struct net netstatic[STATIC_NETS];
static BOOLEAN CurIndexValid(void)
{
return GprsIP.ippara[curindex].isvalid;
}
static void GetNextIndex(void)
{
INT8U i;
for (i = 0; i < MAX_IPNUM; i++) {
if (++curindex >= MAX_IPNUM) curindex = 0;
if (CurIndexValid()) break;
}
}
static void AttachGPRS(void)
{
status &= ~ONLINE_;
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<now, test to attach GPRS>\n");
#endif
if (!CurIndexValid()) GetNextIndex();
if (!CurIndexValid()) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<sorry, invalid GPRS parameters>\n");
#endif
DeactivateGPRS();
return;
}
if (modem_CanRingupPhone(PHONE_GPRS) && ModemIsIdle(0)) {
status |= ATTACHING_;
ProhibitSM();
ct_test = 0;
SetGprsAPN(GprsIP.ippara[curindex].apn);
ppp_up();
ct_attach++;
if (ct_trouble >= MAX_TROUBLE)
StartTmr(monitortmr, PERIOD_WAITATTACH_ERR);
else
StartTmr(monitortmr, PERIOD_WAITATTACH_DEF);
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<try to attach GPRS>\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<APN: ");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, GprsIP.ippara[curindex].apn);
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, ">\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<TCP IP ADDR: ");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, GprsIP.ippara[curindex].tcp_ip);
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, ">\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<TCP PORT: ");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, GprsIP.ippara[curindex].tcp_port);
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, ">\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<UDP IP ADDR: ");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, GprsIP.ippara[curindex].udp_ip);
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, ">\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<UDP PORT: ");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, GprsIP.ippara[curindex].udp_port);
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, ">\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<IV UDP IP ADDR: ");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, GprsIP.ippara[curindex].ivudp_ip);
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, ">\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<IVUDP PORT: ");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, GprsIP.ippara[curindex].ivudp_port);
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, ">\n");
#endif
} else {
if(PHONE_TALKING == GetPhoneStatus(PHONE_GPRS)) RequestResetGSM();
StartTmr(monitortmr, PERIOD_TESTATTACH);
if (!ModemIsIdle(0)) {
if (++ct_test > MAX_TEST) ErrExit(ERR_GPRSDRV_TEST);
}
}
if (ct_attach >= MAX_ATTACH) {
ct_attach = 0;
if (ct_trouble < MAX_TROUBLE) ct_trouble++;
RequestResetGSM();
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<attach GPRS error, now request reset gsm>\n");
#endif
}
}
static void DeattachGPRS(void)
{
modem_HangupPhone(PHONE_GPRS);
}
static void ActivateDriver(void)
{
ActivateTCPDrv(GprsIP.ippara[curindex].tcp_ip, GprsIP.ippara[curindex].tcp_port);
if (status & UDPLINK_)
ActivateUDPDrv(GprsIP.ippara[curindex].udp_ip, GprsIP.ippara[curindex].udp_port);
if (status & IVUDPLINK_)
ActivateIVUDPDrv(GprsIP.ippara[curindex].ivudp_ip, GprsIP.ippara[curindex].ivudp_port, ivudplinktime);
}
void ActivateGPRS(INT8U mode)
{
status &= ~DELAY_DEACTIVE_;
status &= ~SUSPEND_;
if (status & ACTIVE_) {
DeactivateTCPDrv();
DeactivateUDPDrv();
DeactivateIVUDPDrv();
status &= ~UDPLINK_;
} else {
status |= ACTIVE_;
}
if (mode == ACTIVATE_TCP) {
status &= ~UDPLINK_;
} else {
status |= UDPLINK_;
}
if (status & ONLINE_) {
ActivateDriver();
} else {
ct_attach = 0;
curindex = 0;
AttachGPRS();
}
}
void ActivateGPRS_DEF(void)
{
if (OnlineMode.gprsonline == 0x01 || OnlineMode.gprsonline == 0x02) {
ActivateGPRS(ACTIVATE_TCP);
} else {
ActivateGPRS(ACTIVATE_UDP);
}
}
void DeactivateGPRS(void)
{
status &= ~(ACTIVE_ | ONLINE_);
UnprohibitSM();
StopTmr(monitortmr);
DeactivateTCPDrv();
DeactivateUDPDrv();
DeactivateIVUDPDrv();
DeattachGPRS();
}
void DelayDeactivateGPRS(void)
{
StartTmr(monitortmr, PERIOD_DELAY_DEACTIVE);
status |= DELAY_DEACTIVE_;
}
void ActivateGPRS_IVUDP(INT16U linktime)
{
status |= IVUDPLINK_;
ivudplinktime = linktime;
if (GprsIsOnline()) {
ActivateIVUDPDrv(GprsIP.ippara[curindex].ivudp_ip, GprsIP.ippara[curindex].ivudp_port, ivudplinktime);
} else if (!GprsActivated()) {
ActivateGPRS_DEF();
}
}
void DeactivateGPRS_IVUDP(void)
{
status &= ~IVUDPLINK_;
DeactivateIVUDPDrv();
}
void SuspendGPRS(void)
{
if (GprsIsOnline()) {
status |= SUSPEND_;
StartTmr(monitortmr, PERIOD_SUSPENDWAIT);
}
}
static void monitortmrproc(void)
{
if (status & ACTIVE_) {
if (status & SUSPEND_) {
status &= ~SUSPEND_;
DeactivateGPRS();
if (status & UDPLINK_)
ActivateGPRS(ACTIVATE_UDP);
else
ActivateGPRS(ACTIVATE_TCP);
} else if (status & DELAY_DEACTIVE_) {
status &= ~DELAY_DEACTIVE_;
DeactivateGPRS();
} else {
AttachGPRS();
}
} else {
DeactivateGPRS();
}
}
static void DiagnoseProc(void)
{
if ((status & ONLINE_) == 0) {
if (TCPDrvActivated() || UDPDrvActivated()) ErrExit(ERR_GPRSDRV_STATUS);
} else {
if (!TCPDrvActivated() && !UDPDrvActivated()) ErrExit(ERR_GPRSDRV_STATUS);
}
if ((status & (ACTIVE_ | ONLINE_)) == ACTIVE_) {
if (!GetTmrSwitch(monitortmr)) ErrExit(ERR_GPRSDRV_TMR);
}
}
void InitGprsDrv(void)
{
status = 0;
ct_trouble = 0;
monitortmr = CreateTimer(monitortmrproc, 0);
InitGPRSSend();
InitGPRSRecv();
InitTCPDrv();
InitUDPDrv();
InitIVUDPDrv();
InstallDiagProc(DiagnoseProc);
if (OnlineMode.gprsonline == 0x00 || OnlineMode.gprsonline == 0x01) ActivateGPRS_DEF();
}
BOOLEAN GprsActivated(void)
{
if (status & ACTIVE_) return TRUE;
else return FALSE;
}
BOOLEAN GprsIsOnline(void)
{
if ((status & (ACTIVE_ | ONLINE_)) == (ACTIVE_ | ONLINE_)) return TRUE;
else return FALSE;
}
BOOLEAN GPRSComIsSuspended(void)
{
if (GetPhoneStatus(PHONE_COM) != PHONE_FREE)
return TRUE;
else
return FALSE;
}
void HdlMsg_GPRSComERR(void)
{
if (status & ACTIVE_) {
DeattachGPRS();
DeactivateTCPDrv();
DeactivateUDPDrv();
DeactivateIVUDPDrv();
GetNextIndex();
ct_attach = 0;
AttachGPRS();
} else {
DeactivateGPRS();
}
}
void HdlMsg_PPPESTABLISH(void)
{
if ((status & (ACTIVE_ | ATTACHING_)) == (ACTIVE_ | ATTACHING_)) {
status |= (ACTIVE_ | ONLINE_);
status &= ~ATTACHING_;
UnprohibitSM();
ct_trouble = 0;
ct_attach = 0;
StopTmr(monitortmr);
ActivateDriver();
} else {
DeattachGPRS();
}
}
void HdlMsg_PPPBROKEN(void)
{
if (status & ACTIVE_) {
status &= ~ONLINE_;
UnprohibitSM();
DeactivateTCPDrv();
DeactivateUDPDrv();
DeactivateIVUDPDrv();
if (ct_trouble >= MAX_TROUBLE)
StartTmr(monitortmr, PERIOD_WAITATTACH_ERR);
else
StartTmr(monitortmr, PERIOD_WAITATTACH_DEF);
} else {
DeactivateGPRS();
}
}
void PPP_Established(void)
{
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<attach GPRS success>\n");
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "current ip address is: ");
SendFromUART_STR(DEBUG_UARTNo_GSMSTATUS, (INT8U *)print_ipad(netstatic[0].n_ipaddr));
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "\n");
#endif
OSQPost(GsmTaskMsgQue, MSG_GPRSDRV_PPPESTABLISH, 0, 0);
}
void PPP_Broken(void)
{
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<deattach from GPRS>\n");
#endif
OSQPost(GsmTaskMsgQue, MSG_GPRSDRV_PPPBROKEN, 0, 0);
}
BOOLEAN NeedSmBackup(INT8U type)
{
if (GprsBackup.backuptype & backupmask[type]) return TRUE;
else return FALSE;
}
INT16U GetServiceAttrib(INT8U type)
{
INT16U attrib;
if (CanSendFromTcpLink()) {
attrib = SM_ATTR_TCP;
} else {
attrib = SM_ATTR_UDP;
}
if (NeedSmBackup(type)) {
attrib |= SM_ATTR_SM;
}
return attrib;
}
BOOLEAN CanSendFromTcpLink(void)
{
if (status & ACTIVE_) {
if (status & UDPLINK_) return FALSE;
else return TRUE;
} else {
if (OnlineMode.gprsonline == 0x01 || OnlineMode.gprsonline == 0x02) return TRUE;
else return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -