- added network/dispatcher
git-svn-id: http://moon:8086/svn/mips@228 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/cFiles/file.c to edit this template
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include "dispatcher.h"
|
||||
|
||||
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
|
||||
|
||||
dispatcher_func find_entry(Dispatcher *pObj, void const *pKey, size_t size)
|
||||
{
|
||||
dispatcher_func result = NULL;
|
||||
for (int i=0; i < ARRAY_SIZE(pObj->func_list); i++)
|
||||
{
|
||||
dispatcher_func func = pObj->func_list[i];
|
||||
if (func)
|
||||
{
|
||||
if (func(Op_can, pKey, size))
|
||||
{
|
||||
result = func;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void dispatcher_init(Dispatcher *pObj)
|
||||
{
|
||||
pObj->num_funcs = 0;
|
||||
memset(pObj->func_list, 0, sizeof(pObj->func_list));
|
||||
}
|
||||
|
||||
void dispatcher_add(Dispatcher *pObj, dispatcher_func listener, void const *pKey, size_t size)
|
||||
{
|
||||
assert (pObj->num_funcs < DISPATCHER_MAX_NUM_FUNC);
|
||||
assert (!find_entry(pObj, pKey, size));
|
||||
|
||||
for (int i=0; i < ARRAY_SIZE(pObj->func_list); i++)
|
||||
{
|
||||
dispatcher_func func = pObj->func_list[i];
|
||||
if (!func)
|
||||
{
|
||||
func = listener;
|
||||
pObj->num_funcs++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void dispatcher_remove(Dispatcher *pObj, void const *pKey, size_t size)
|
||||
{
|
||||
for (int i=0; i < ARRAY_SIZE(pObj->func_list); i++)
|
||||
{
|
||||
dispatcher_func func = pObj->func_list[i];
|
||||
if (func)
|
||||
{
|
||||
if (func(Op_can, pKey, size))
|
||||
{
|
||||
func = NULL;
|
||||
pObj->num_funcs--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dispatcher_process(Dispatcher *pObj, void const *pData, size_t size)
|
||||
{
|
||||
for (int i=0; i < ARRAY_SIZE(pObj->func_list); i++)
|
||||
{
|
||||
dispatcher_func func = pObj->func_list[i];
|
||||
if (func)
|
||||
{
|
||||
func(Op_data, pData, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/cFiles/file.h to edit this template
|
||||
*/
|
||||
|
||||
/*
|
||||
* File: dispatcher.h
|
||||
* Author: jens
|
||||
*
|
||||
* Created on 22. Dezember 2021, 11:05
|
||||
*/
|
||||
|
||||
#ifndef DISPATCHER_H
|
||||
#define DISPATCHER_H
|
||||
|
||||
#include "ethernet.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define DISPATCHER_MAX_NUM_FUNC 8
|
||||
|
||||
typedef enum _eOp_t
|
||||
{
|
||||
Op_nop = 0,
|
||||
Op_can,
|
||||
Op_data
|
||||
} Op_t;
|
||||
|
||||
typedef int (*dispatcher_func)(Op_t op, void const *pData, size_t size);
|
||||
|
||||
typedef struct _sDispatcher
|
||||
{
|
||||
size_t num_funcs;
|
||||
dispatcher_func func_list[DISPATCHER_MAX_NUM_FUNC];
|
||||
|
||||
} Dispatcher;
|
||||
|
||||
void dispatcher_init(Dispatcher *pObj);
|
||||
void dispatcher_add(Dispatcher *pObj, dispatcher_func func, void const *pKey, size_t size);
|
||||
void dispatcher_remove(Dispatcher *pObj, void const *pKey, size_t size);
|
||||
void dispatcher_process(Dispatcher *pObj, void const *pData, size_t size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* DISPATCHER_H */
|
||||
|
||||
Reference in New Issue
Block a user