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

📄 udpdrv.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  UDPDrv.C                                    *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2003.4.18                                          *
****************************************************************/
#include "includes.h"
#include "message.h"
#include "public.h"
#include "tools.h"
#include "stream.h"
#include "timetask.h"
#include "sysframe.h"
#include "gsmtask.h"
#include "gprssend.h"
#include "udptask.h"
#include "udpdrv.h"

#include "ipport.h"
#include "netbuf.h"
#include "net.h"



/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define MAX_CONNECT                 3
#define MAX_LOG                     3
#define MAX_DELINK                  3

#define PERIOD_MONITORCONNECT       SECOND, 30
#define PERIOD_TESTCONNECT          SECOND, 10
#define PERIOD_TESTLOG              SECOND, 10
#define PERIOD_TESTDELINK           SECOND, 10

/*
********************************************************************************
*                  DEFINE status
********************************************************************************
*/
#define ACTIVE_                     0x01
#define CONNECT_                    0x02
#define LOGED_                      0x04


/*
********************************************************************************
*                  DEFINE MODULE VARIANT
********************************************************************************
*/
static INT8U    status;
static INT16U   ct_connect, ct_log;
static TMR_TSK *monitortmr;
static STREAM   wstrm;
static char     ipaddr[20], ipport[10];
static INT8U    tempbuf[50];



static void StartConnect(void)
{
    if (status & CONNECT_) {
        status    &= ~CONNECT_;
        ct_connect = 0;
    }
    
    if (UDPComIsClosed()) {
        if (!GPRSComIsSuspended()) {
            if (++ct_connect <= MAX_CONNECT) RequestOpenUDPCom(ipaddr, ipport);
        }
        StartTmr(monitortmr, PERIOD_MONITORCONNECT);
    } else {
        RequestCloseUDPCom();
        StartTmr(monitortmr, PERIOD_TESTCONNECT);
    }
    if (ct_connect > MAX_CONNECT) {
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<connect error for UDP>\n");
        #endif
        OSQPost(GsmTaskMsgQue, MSG_UDPDRV_CONNECTERR, 0, 0);
        ct_connect = 0;
    }
}

static void Turninto_LOGING(void)
{
    INT8U i;
    
    if (status & LOGED_) {
        ct_log  = 0;
        status &= ~LOGED_;
        ClearGPRSSendChannel(CHA_UDP);
    }
    
    if (!GPRSChannelReady(CHA_UDP)) ClearGPRSSendChannel(CHA_UDP);

    InitStrm(&wstrm, (STREAMMEM *)tempbuf, sizeof(tempbuf));
    WriteBYTE_Strm(&wstrm, 0x01);
    WriteBYTE_Strm(&wstrm, 0x01);
    WriteBYTE_Strm(&wstrm, SYS_TELLEN);
    if (PubParaValid(MYTEL_)) {
        EncodeTel(GetStrmPtr(&wstrm), MyTel.tel, MyTel.len, SYS_TELLEN);    
    } else {
        for (i = 0; i < SYS_TELLEN; i++) WriteBYTE_Strm(&wstrm, ' ');
    }
    MovStrmPtr(&wstrm, SYS_TELLEN);
    
    StartTmr(monitortmr, PERIOD_TESTLOG);
    if (!GPRSComIsSuspended()) {
        if (++ct_log <= MAX_LOG) {
            #if DEBUG_UARTNo_GSMSTATUS <= 3
            PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log request for UDP>\n");
            #endif

            SendFromGPRS(CHA_UDP, 0x10, 0x11, tempbuf, GetStrmLen(&wstrm));
        }
    }
    if (ct_log > MAX_LOG) {
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log error for UDP>\n");
        #endif
        OSQPost(GsmTaskMsgQue, MSG_UDPDRV_LOGERR, 0, 0);
    }
}

static void Turninto_LOGED(void)
{
    if (UDPDrvConnect()) {
        status |= LOGED_;
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log success for UDP>\n");
        #endif
        StopTmr(monitortmr);
        OSQPost(GsmTaskMsgQue, MSG_UDPDRV_LOG,  0, 0);
    }
}

static void CloseUDPDrv(void)
{
    status = 0;
    StopTmr(monitortmr);

    RequestCloseUDPCom();
    ClearGPRSSendChannel(CHA_UDP);
}

static void MonitorTmrProc(void)
{
    if (UDPDrvConnect()) {
        Turninto_LOGING();
    } else if (UDPDrvActivated()) {
        StartConnect();
    } else {
        StopTmr(monitortmr);
    }
}

void InitUDPDrv(void)
{
    status     = 0;
    monitortmr = CreateTimer(MonitorTmrProc, 0);
}

void ActivateUDPDrv(char *addr, char* port)
{
    status |= (ACTIVE_ | CONNECT_);
    status &= ~LOGED_; 

    memcpy((INT8U *)ipaddr, (INT8U *)addr, sizeof(ipaddr));
    memcpy((INT8U *)ipport, (INT8U *)port, sizeof(ipport));
    StartConnect();
}

void DeactivateUDPDrv(void)
{
    CloseUDPDrv();
}

void Informer_UDPLinkInexist(void)
{
    if (UDPDrvLoged()) Turninto_LOGING();
}

void InformMsg_UDPComOpen(void)
{
    if (status & ACTIVE_) {
        status    |= (CONNECT_ | LOGED_);
        ct_connect = 0;
        Turninto_LOGING();
    }
}

void InformMsg_UDPComClose(void)
{
    if (status & ACTIVE_) {
        status &= ~(CONNECT_ | LOGED_);
        StartTmr(monitortmr, PERIOD_TESTCONNECT);
    }
}

void InformMsg_UDPComLoged(void)
{
    if (UDPDrvConnect()) Turninto_LOGED();
}

void InformMsg_UDPComDelink(void)
{
    CloseUDPDrv();
}

void InformMsg_QueryUDP(INT16U nexttime)
{
    nexttime = nexttime;
    if (UDPDrvLoged()) {
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<receive query from UDP, and send ACK>\n");
        #endif
        
        tempbuf[0] = 0x01;
        SendFromGPRS(CHA_UDP, 0x10, 0x04, tempbuf, 1);
    }
}

BOOLEAN UDPDrvLoged(void)
{
    if ((status & (ACTIVE_ | CONNECT_ | LOGED_)) == (ACTIVE_ | CONNECT_ | LOGED_)) return TRUE;
    else return FALSE;
}

BOOLEAN UDPDrvConnect(void)
{
    if ((status & (ACTIVE_ | CONNECT_)) == (ACTIVE_ | CONNECT_)) return TRUE;
    else return FALSE;
}

BOOLEAN UDPDrvActivated(void)
{
    if (status & ACTIVE_) return TRUE;
    else return FALSE;
}

BOOLEAN UDPDrvCanCom(void)
{
    if (GPRSComIsSuspended() || !UDPDrvLoged()) return FALSE;
    else return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -