📄 udpdrv.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 + -