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

📄 tcpdrv.c

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


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

#define PERIOD_MONITORCONNECT       SECOND, 30
#define PERIOD_TESTCONNECT          SECOND, 15
#define PERIOD_CONNECTWAIT          SECOND, 20
#define PERIOD_TESTLOG              SECOND, 30
#define PERIOD_DEFAULTQUERY         MINUTE, 2


/*
********************************************************************************
*                  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 char     ipaddr[20], ipport[10];
static INT8U    tempbuf[50];



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

static void Turninto_LOGING(void)
{
    if (status & LOGED_) {
        ct_log  = 0;
        status &= ~LOGED_;
        ClearGPRSSendChannel(CHA_TCP);
    }
    
    if (!GPRSChannelReady(CHA_TCP)) ClearGPRSSendChannel(CHA_TCP);
    tempbuf[0] = 0x01;
    tempbuf[1] = 0x01;
    tempbuf[2] = SYS_TELLEN;
    if (PubParaValid(MYTEL_)) {
        EncodeTel(&tempbuf[3], MyTel.tel, MyTel.len, SYS_TELLEN);
    } else {
        InitBuf(&tempbuf[3], ' ', 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 TCP>\n");
            #endif
            SendFromGPRS(CHA_TCP, 0x10, 0x11, tempbuf, SYS_TELLEN + 3);
        }
    }
    if (ct_log > MAX_LOG) {
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log error for TCP>\n");
        #endif
        OSQPost(GsmTaskMsgQue, MSG_TCPDRV_LOGERR, 0, 0);
    }
}

static void Turninto_LOGED(void)
{
    if (TCPDrvConnect()) {
        status |= LOGED_;
        StartTmr(monitortmr, PERIOD_DEFAULTQUERY);
        OSQPost(GsmTaskMsgQue, MSG_TCPDRV_LOG,  0, 0);
    }
}

static void MonitorTmrProc(void)
{
    if (status & ACTIVE_) {
        if (status & CONNECT_) {
            #if DEBUG_UARTNo_GSMSTATUS <= 3
            if (status & LOGED_) 
                PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<TCP link is overflow time>\n");
            #endif
            Turninto_LOGING();
            if (TCPDrvLoged()) Informer_UDPLinkInexist();
        } else
            StartConnect();
    } else {
        StopTmr(monitortmr);
    }
}

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

void ActivateTCPDrv(char *addr, char* port)
{
    status |= (ACTIVE_ | CONNECT_);
    status &= ~LOGED_; 
    memcpy(ipaddr, addr, sizeof(ipaddr));
    memcpy(ipport, port, sizeof(ipport));
    
    StartConnect();
}

void DeactivateTCPDrv(void)
{
    status = 0;
    StopTmr(monitortmr);
    RequestCloseSocket();
    ClearGPRSSendChannel(CHA_TCP);
}

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

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

void InformMsg_TCPLoged(void)
{
    if (TCPDrvConnect()) {
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log success for TCP>\n");
        #endif
        
        Turninto_LOGED();
    }
}

void InformMsg_QueryTCP(INT16U nexttime)
{
    if (TCPDrvLoged()) {
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<receive query from TCP, and send ACK>\n");
	#endif
        
        StartTmr(monitortmr, MINUTE, nexttime + 1);
        tempbuf[0] = 0x01;
        SendFromGPRS(CHA_TCP, 0x10, 0x04, tempbuf, 1);
    }
}

void Informer_TCPLinkInexist(void)
{
    if (TCPDrvLoged()) Turninto_LOGING();
}

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

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

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

BOOLEAN TcpDrvCanCom(void)
{
    if (GPRSComIsSuspended() || !TCPDrvLoged()) return FALSE;
    else return TRUE;
}

⌨️ 快捷键说明

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