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

📄 ivudpdrv.c

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


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

extern struct net netstatic[STATIC_NETS];


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

static void Turninto_LOGING(void)
{    
    if (status & LOGED_) {
        ct_log  = 0;
        status &= ~LOGED_;
        ClearGPRSSendChannel(CHA_IV_UDP);
    }
    
    if (!GPRSChannelReady(CHA_IV_UDP)) ClearGPRSSendChannel(CHA_IV_UDP);
    
    InitStrm(&wstrm, (STREAMMEM *)tempbuf, sizeof(tempbuf));    
    WriteHWORD_Strm(&wstrm, EgCode.egcode);                              /* field egcode */
    WriteBYTE_Strm(&wstrm, GetSysFrameVersion());                       /* field version */
    EncodeTel(GetStrmPtr(&wstrm), MyTel.tel, MyTel.len, SYS_TELLEN);    /* field mytel */
    MovStrmPtr(&wstrm, SYS_TELLEN);
    WriteLONG_Strm(&wstrm, netstatic[0].n_ipaddr);                      /* field ip address */
    WriteBYTE_Strm(&wstrm, linktime);                                   /* field linktime */

    StartTmr(monitortmr, PERIOD_TESTLOG);
    if (!GPRSComIsSuspended()) {
        if (++ct_log <= MAX_LOG) {
            #if DEBUG_UARTNo_GSMSTATUS <= 3
            PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log request for IV UDP>\n");
            #endif

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

static void Turninto_LOGED(void)
{
    if (IVUDPDrvConnect()) {
        status |= LOGED_;
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log success for IV UDP>\n");
        #endif
        
        StartTmr(monitortmr, MINUTE, linktime);
        OSQPost(GsmTaskMsgQue, MSG_IVUDPDRV_LOG,  0, 0);
    }
}

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

    RequestCloseIVUDPCom();
    ClearGPRSSendChannel(CHA_IV_UDP);
    OSQPost(GsmTaskMsgQue, MSG_IVUDPDRV_CLOSE,  0, 0);
}

static void Turninto_DELINK(void)
{
    if ((status & DELINK_) == 0) {
        status  |= DELINK_;
        ct_delink = 0;
    }

    if (!GPRSChannelReady(CHA_IV_UDP)) ClearGPRSSendChannel(CHA_IV_UDP);
    InitStrm(&wstrm, (STREAMMEM *)tempbuf, sizeof(tempbuf));
    EncodeTel(GetStrmPtr(&wstrm), MyTel.tel, MyTel.len, SYS_TELLEN);    /* field mytel */
    MovStrmPtr(&wstrm, SYS_TELLEN);
    
    StartTmr(monitortmr, PERIOD_TESTDELINK);
    if (!GPRSComIsSuspended()) {
        if (++ct_delink <= MAX_DELINK) {
            #if DEBUG_UARTNo_GSMSTATUS <= 3
            PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<delink request for IV UDP>\n");
            #endif
            SendFromGPRS(CHA_IV_UDP, 0x10, 0x06, tempbuf, GetStrmLen(&wstrm));
        }
    }
    if (ct_delink > MAX_DELINK) {
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<delink error for IV UDP>\n");
        #endif
        
        CloseIVUDPDrv();
    }
}

static void MonitorTmrProc(void)
{
    if (IVUDPDrvIsDelink()) Turninto_DELINK();
    else if (IVUDPDrvLoged()) DeactivateIVUDPDrv();
    else if (IVUDPDrvConnect()) Turninto_LOGING();
    else if (IVUDPDrvActivated()) StartConnect();
    else StopTmr(monitortmr);
}

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

void ActivateIVUDPDrv(char *addr, char* port, INT16U time)
{
    status  |= (ACTIVE_ | CONNECT_);
    status  &= ~(LOGED_ | DELINK_); 
    linktime = time;

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

void DeactivateIVUDPDrv(void)
{
    if ((IVUDPDrvLoged() || IVUDPDrvIsDelink()) && GprsIsOnline()) Turninto_DELINK();
    else CloseIVUDPDrv();
}

void Informer_IVUDPLinkInexist(void)
{
    if (IVUDPDrvLoged()) Turninto_LOGING();
}

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

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

void InformMsg_IVUDPComLoged(void)
{
    if (IVUDPDrvConnect()) Turninto_LOGED();
}

void InformMsg_IVUDPComDelink(void)
{
    CloseIVUDPDrv();
}

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

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

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

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

BOOLEAN IVUDPDrvCanCom(void)
{
    if (GPRSComIsSuspended() || !IVUDPDrvLoged()) return FALSE;
    else return TRUE;
}

⌨️ 快捷键说明

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