diff --git a/src/common/network/dispatcher.c b/src/common/network/dispatcher.c new file mode 100644 index 0000000..1c4877a --- /dev/null +++ b/src/common/network/dispatcher.c @@ -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 +#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); + } + } +} + diff --git a/src/common/network/dispatcher.h b/src/common/network/dispatcher.h new file mode 100644 index 0000000..2a9249e --- /dev/null +++ b/src/common/network/dispatcher.h @@ -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 */ +