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

📄 gprsdrv.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -