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

📄 eventq.c

📁 使用标准C开发的同时支持CMPP3.0 和 CMPP2.0 的SP短信网关程序
💻 C
字号:
#ifndef LINUX
#include <windows.h>
#endif

#include <stdlib.h>
#include <stdio.h>
#include "vscp_os.h"
#include "iblock.h"
#include "./coding/coding.h"
#include "interface.h"

static QueueType	mesq;
static QueueType	ismgq;
static CriticalSection  storecs;

int nullfunc(void * prim)
{
	printf("null receive to %0x\n", ((unsigned short*)prim)[0]);
	DiscardPrim(prim);
	return 0;
}

void InitScanQueue(void)
{
	InitQueue(&mesq);
	InitQueue(&ismgq);
	CriticalSectionInit(&storecs);
}

const int QUEUELEN =	10000;

unsigned int GetIsmgQCount(void)
{
	return ismgq.count;
}

unsigned int GetMesQCount(void)
{
	return mesq.count;
}

int SendToIsmgq(void * ptr)
{
	if(ismgq.count > QUEUELEN) {
		return 1;
	}

	AddMember(&ismgq, ptr);
	return 0;
}

void * ScanIsmgQq()
{
	void * ptr;
	ptr = DelMember(&ismgq);
	return ptr;
}

int SendToMesq(void * ptr)
{
	if(mesq.count > QUEUELEN) {
		DiscardPrim(ptr);
		return 1;
	}
	CriticalSectionEnter(&storecs);
	{
		AddMember(&mesq, ptr);
	}
	CriticalSectionLeave(&storecs);
	return 0;
}

extern void RecvSMCFromISMG(void * ptr);
extern void IsmgStateConnect(void *ptr);
extern void IsmgStateDisconnect(void *ptr);
extern void RecvSMCReqFromVscp(void *ptr);

void (* SMCDispatch[])(void * ptr)=
{
#ifdef WITHSMC
RecvSMCFromISMG,		/* 0 */
IsmgStateConnect,		/* 1 */
IsmgStateDisconnect,	/* 2 */
RecvSMCReqFromVscp,		/* 3 */
QuerySetParamReq,		/* 4 */
ModiSetParamReq,		/* 5 */
ModiPwdReq,				/* 6 */
QuerySMCSourceReq,		/* 7 */
ModiSMCSysTimerReq,		/* 8 */
ResetSMCSysTimerReq,	/* 9 */
QueryISMGStatusReq,		/* 10 */
WatchRestartReq,		/* 11 */
CheckLinkStatusReq,		/* 12 */
#else
nullfunc,
nullfunc,
nullfunc,
nullfunc,
nullfunc,
nullfunc,
nullfunc,
nullfunc,
nullfunc,
nullfunc,
nullfunc,
#endif
};

typedef struct DispatchSTR {
	unsigned int num;
	void (* *func)(void *para);
} DispatchType;

DispatchType dispatchfunc[]=
{
	{0,NULL},		/* 0 */
	{0,NULL},		/* 1 */
	{0,NULL},		/* 2 */
	{0,NULL},		/* 3 */
	{0,NULL},		/* 4 */
#ifdef WITHSMC
	{sizeof(SMCDispatch)/sizeof(void *), SMCDispatch}, /* 5 */
#else
	{0,NULL},
#endif

};


void ScanReceiveQueue()
{
	void * ptr;
	static int n,m;

	if((ptr = DelMember(&mesq)) == NULL) 
	{
		if (n++>1000)
		{
			printf("ok!\n");
			n=0;
		}
		return;
	}

	if ((*((unsigned char *)ptr+1) < sizeof(dispatchfunc)/sizeof(DispatchType)) &&\
		(*((unsigned char *)ptr) < dispatchfunc[*((unsigned char *)ptr+1)].num) && 
		(dispatchfunc[*((unsigned char *)ptr+1)].func[*(unsigned char *)ptr] != NULL))
	{
		dispatchfunc[*((unsigned char *)ptr+1)].func[*(unsigned char *)ptr](ptr);
	}
	else
	{
		if (m++>1000)
		{
			printf("ok!\n");
			n=0;
		}

		DiscardPrim(ptr);
	}

}

⌨️ 快捷键说明

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