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