4326128e72
* Refactored and secured BACnetActionCommand codec into bacaction.c module for command object and added to bacapp module encode/decode with define for enabling and pseudo application tag for internal use. * Simplified bacapp_data_len() and moved into bacdcode module as bacnet_enclosed_data_len() function. * Secured ReadProperty-REQUEST and -ACK decoding. * Removed deprecated Keylist_Key() functions from usage. * Removed pseudo application datatypes from bacapp_data_decode() which only uses primitive application tag encoded values. * Defined INT_MAX when it is not already defined by compiler or libc. * Deprecated bacapp_decode_application_data_len() and bacapp_decode_context_data_len() as they are no longer used in any code in the library. * Added BACnetScale to bacapp module. Improved complex property value decoding. Refactored bacapp_decode_known_property() function. * Refactored and improved the bacapp_snprintf() function for printing EPICS. * Fixed Lighting Output WriteProperty to handle known property decoding.
106 lines
2.6 KiB
C
106 lines
2.6 KiB
C
/**
|
|
* @file
|
|
* @author Steve Karg <skarg@users.sourceforge.net>
|
|
* @date 2008
|
|
* @brief A basic BACnet device object list management implementation
|
|
* @copyright SPDX-License-Identifier: GPL-2.0-or-later WITH GCC-exception-2.0
|
|
*/
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "bacnet/basic/sys/keylist.h"
|
|
#include "bacnet/basic/object/objects.h"
|
|
|
|
/* list of devices */
|
|
static OS_Keylist Device_List = NULL;
|
|
|
|
void objects_init(void)
|
|
{
|
|
if (!Device_List) {
|
|
Device_List = Keylist_Create();
|
|
}
|
|
}
|
|
|
|
int objects_device_count(void)
|
|
{
|
|
objects_init();
|
|
return Keylist_Count(Device_List);
|
|
}
|
|
|
|
uint32_t objects_device_id(int index)
|
|
{
|
|
uint32_t instance = UINT32_MAX;
|
|
|
|
(void)Keylist_Index_Key(Device_List, index, &instance);
|
|
|
|
return instance;
|
|
}
|
|
|
|
OBJECT_DEVICE_T *objects_device_data(int index)
|
|
{
|
|
objects_init();
|
|
return Keylist_Data_Index(Device_List, index);
|
|
}
|
|
|
|
OBJECT_DEVICE_T *objects_device_by_instance(uint32_t device_instance)
|
|
{
|
|
objects_init();
|
|
return Keylist_Data(Device_List, device_instance);
|
|
}
|
|
|
|
OBJECT_DEVICE_T *objects_device_new(uint32_t device_instance)
|
|
{
|
|
OBJECT_DEVICE_T *pDevice = NULL;
|
|
KEY key = device_instance;
|
|
|
|
objects_init();
|
|
if (Device_List) {
|
|
/* does this device already exist? */
|
|
pDevice = Keylist_Data(Device_List, key);
|
|
if (pDevice) {
|
|
memset(pDevice, 0, sizeof(OBJECT_DEVICE_T));
|
|
} else {
|
|
pDevice = calloc(1, sizeof(OBJECT_DEVICE_T));
|
|
if (pDevice) {
|
|
pDevice->Object_Identifier.type = OBJECT_DEVICE;
|
|
pDevice->Object_Identifier.instance = device_instance;
|
|
pDevice->Object_Type = OBJECT_DEVICE;
|
|
pDevice->Object_List = Keylist_Create();
|
|
Keylist_Data_Add(Device_List, key, pDevice);
|
|
}
|
|
}
|
|
}
|
|
|
|
return pDevice;
|
|
}
|
|
|
|
bool objects_device_delete(int index)
|
|
{
|
|
bool result = false;
|
|
OBJECT_DEVICE_T *pDevice = NULL;
|
|
BACNET_OBJECT_ID *pObject;
|
|
|
|
objects_init();
|
|
if (Device_List) {
|
|
pDevice = Keylist_Data_Delete_By_Index(Device_List, index);
|
|
if (pDevice) {
|
|
if (pDevice->Object_List) {
|
|
do {
|
|
pObject =
|
|
Keylist_Data_Delete_By_Index(pDevice->Object_List, 0);
|
|
/* free any dynamic memory used */
|
|
if (pObject) {
|
|
free(pObject);
|
|
}
|
|
} while (pObject);
|
|
Keylist_Delete(pDevice->Object_List);
|
|
}
|
|
free(pDevice);
|
|
result = true;
|
|
}
|
|
}
|
|
return result;
|
|
}
|