- added network/dispatcher

git-svn-id: http://moon:8086/svn/mips@228 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2021-12-22 15:42:24 +00:00
parent b7909dcca1
commit a1d3731529
2 changed files with 131 additions and 0 deletions
+81
View File
@@ -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);
}
}
}
+50
View File
@@ -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 */