Files
bacnet_stack/zephyr/subsys/object/object.h
T
Mikhail Antropov 1b147e2edc OSCBS-23 Scalable BACnet object arrays, part #2
Add processing object table as section iterable for zephyr
      - zephyr/subset/object/device.c
      - zephyr/subset/object/objects.ld
    Add object descriptor array as dynamic list
      - zephyr/subset/object/object.h
      - zephyr/subset/object/*.c
2022-06-17 11:56:17 +03:00

82 lines
4.4 KiB
C

/*
* Copyright (c) 2022 Legrand North America, LLC.
*
* SPDX-License-Identifier: MIT
*/
#ifndef ZTEST_UNITTEST
#include <zephyr.h>
#else
#include "stdlib.h"
#define k_malloc(a) malloc(a)
#define k_free(a) free(a)
#define _DO_CONCAT(x, y) x ## y
#define _CONCAT(x, y) _DO_CONCAT(x, y)
#endif
#include "bacnet/basic/sys/keylist.h"
#define OBJECT_ENUM_FUNCTIONS(object_name, descr_type) \
descr_type *_CONCAT(object_name, _Find_Description)(uint32_t instance) \
{ return Keylist_Data(Object_List, instance); } \
unsigned _CONCAT(object_name, _Count)(void) \
{ return Keylist_Count(Object_List); } \
uint32_t _CONCAT(object_name, _Index_To_Instance)(unsigned index) \
{ return Keylist_Key(Object_List, index); } \
unsigned _CONCAT(object_name, _Instance_To_Index)(uint32_t instance) \
{ return (unsigned)Keylist_Index(Object_List, instance); }
#define OBJECT_MEMORY_FUNCTIONS(object_name, descr_type) \
bool _CONCAT(object_name, _Create)(uint32_t instance) \
{ \
descr_type *descr = Keylist_Data(Object_List, instance); \
if (!descr) { \
descr = k_malloc(sizeof(descr_type)); \
if (descr) { \
_CONCAT(object_name, _Init_Description)(descr, instance); \
return Keylist_Data_Add(Object_List, instance, descr) >= 0; \
} \
} \
return false; \
} \
void _CONCAT(object_name, _Cleanup)(void) \
{ \
descr_type *descr; \
if (Object_List) { \
do { \
descr = Keylist_Data_Pop(Object_List); \
if (descr) { \
k_free(descr); \
} \
} while (descr); \
Keylist_Delete(Object_List); \
Object_List = NULL; \
} \
} \
bool _CONCAT(object_name, _Delete)(uint32_t instance) \
{ \
bool status = false; \
descr_type *descr = Keylist_Data_Delete(Object_List, instance); \
if (descr) { \
k_free(descr); \
status = true; \
} \
return status; \
}
#define OBJECT_FUNCTIONS_WITHOUT_INIT(object_name, descr_type) \
static OS_Keylist Object_List = NULL; \
OBJECT_ENUM_FUNCTIONS(object_name, descr_type) \
OBJECT_MEMORY_FUNCTIONS(object_name, descr_type)
#define OBJECT_FUNCTIONS(object_name, descr_type) \
OBJECT_FUNCTIONS_WITHOUT_INIT(object_name, descr_type) \
void _CONCAT(object_name, _Init)(void){ \
if (!Object_List) { \
Object_List = Keylist_Create(); \
} \
}