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