Added functions for manipulating the channel object list of members.

This commit is contained in:
skarg
2013-11-12 20:56:25 +00:00
parent 867131b91d
commit 9f154694f0
2 changed files with 132 additions and 15 deletions
+119 -13
View File
@@ -301,7 +301,7 @@ bool Channel_Number_Set(uint32_t object_instance, uint16_t value)
* *
* @return member count * @return member count
*/ */
static bool Channel_Control_Member_Valid( static bool Channel_Reference_List_Member_Valid(
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember) BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember)
{ {
bool status = false; bool status = false;
@@ -322,7 +322,7 @@ static bool Channel_Control_Member_Valid(
* *
* @return member count * @return member count
*/ */
unsigned Channel_Control_Member_Count(uint32_t object_instance) unsigned Channel_Reference_List_Member_Count(uint32_t object_instance)
{ {
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember = NULL; BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember = NULL;
unsigned count = 0; unsigned count = 0;
@@ -333,7 +333,7 @@ unsigned Channel_Control_Member_Count(uint32_t object_instance)
if (index < BACNET_CHANNELS_MAX) { if (index < BACNET_CHANNELS_MAX) {
for (m = 0; m < CHANNEL_MEMBERS_MAX; m++) { for (m = 0; m < CHANNEL_MEMBERS_MAX; m++) {
pMember = &Channel[index].Members[m]; pMember = &Channel[index].Members[m];
if (Channel_Control_Member_Valid(pMember)) { if (Channel_Reference_List_Member_Valid(pMember)) {
count++; count++;
} }
} }
@@ -346,13 +346,13 @@ unsigned Channel_Control_Member_Count(uint32_t object_instance)
* For a given object instance-number, returns the member element * For a given object instance-number, returns the member element
* *
* @param object_instance - object-instance number of the object * @param object_instance - object-instance number of the object
* @param element - member element number 1..N * @param array_index - 1-based array index
* *
* @return pointer to member element or NULL if not found * @return pointer to member element or NULL if not found
*/ */
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *
Channel_Control_Member_Element(uint32_t object_instance, Channel_Reference_List_Member_Element(uint32_t object_instance,
unsigned element) unsigned array_index)
{ {
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember = NULL; BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember = NULL;
unsigned count = 0; unsigned count = 0;
@@ -363,9 +363,9 @@ Channel_Control_Member_Element(uint32_t object_instance,
if (index < BACNET_CHANNELS_MAX) { if (index < BACNET_CHANNELS_MAX) {
for (m = 0; m < CHANNEL_MEMBERS_MAX; m++) { for (m = 0; m < CHANNEL_MEMBERS_MAX; m++) {
pMember = &Channel[index].Members[m]; pMember = &Channel[index].Members[m];
if (Channel_Control_Member_Valid(pMember)) { if (Channel_Reference_List_Member_Valid(pMember)) {
count++; count++;
if (count == element) { if (count == array_index) {
return pMember; return pMember;
} }
} }
@@ -375,6 +375,112 @@ Channel_Control_Member_Element(uint32_t object_instance,
return NULL; return NULL;
} }
/**
* For a given object instance-number, returns the member element
*
* @param object_instance - object-instance number of the object
* @param array_index - 1-based array index
*
* @return pointer to member element or NULL if not found
*/
bool Channel_Reference_List_Member_Element_Set(uint32_t object_instance,
unsigned array_index,
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMemberSrc)
{
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember = NULL;
unsigned count = 0;
unsigned m = 0;
unsigned index = 0;
bool status = false;
index = Channel_Instance_To_Index(object_instance);
if (index < BACNET_CHANNELS_MAX) {
for (m = 0; m < CHANNEL_MEMBERS_MAX; m++) {
pMember = &Channel[index].Members[m];
if (Channel_Reference_List_Member_Valid(pMember)) {
count++;
if (count == array_index) {
memcpy(pMember, pMemberSrc,
sizeof(BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE));
status = true;
break;
}
}
}
}
return status;
}
/**
* For a given object instance-number, adds a member element
*
* @param object_instance - object-instance number of the object
* @param pMemberSrc - pointer to a object property reference element
*
* @return array_index - 1-based array index value for added element, or
* zero if not added
*/
unsigned Channel_Reference_List_Member_Element_Add(uint32_t object_instance,
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMemberSrc)
{
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMember = NULL;
unsigned count = 0;
unsigned m = 0;
unsigned index = 0;
index = Channel_Instance_To_Index(object_instance);
if (index < BACNET_CHANNELS_MAX) {
for (m = 0; m < CHANNEL_MEMBERS_MAX; m++) {
pMember = &Channel[index].Members[m];
if (Channel_Reference_List_Member_Valid(pMember)) {
count++;
} else {
/* first empty slot */
count++;
memcpy(pMember, pMemberSrc,
sizeof(BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE));
break;
}
}
}
return count;
}
/**
* For a given object instance-number, adds a member element
*
* @param object_instance - object-instance number of the object
* @param type - object type
* @param instance - object instance number
* @param propertyIdentifier - property identifier BACNET_PROPERTY_ID
* @param array_index - 1-based array index of object property
*
* @return array_index - 1-based array index value for added element, or
* zero if not added
*/
unsigned Channel_Reference_List_Member_Local_Add(
uint32_t object_instance,
uint16_t type,
uint32_t instance,
BACNET_PROPERTY_ID propertyIdentifier,
uint32_t arrayIndex)
{
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE member = {{0}};
member.objectIdentifier.type = type;
member.objectIdentifier.instance = instance;
member.propertyIdentifier = propertyIdentifier;
member.arrayIndex = arrayIndex;
member.deviceIndentifier.type = OBJECT_DEVICE;
member.deviceIndentifier.instance = Device_Object_Instance_Number();
return Channel_Reference_List_Member_Element_Add(
object_instance,
&member);
}
/** /**
* For a given object instance-number, determines the Number * For a given object instance-number, determines the Number
* *
@@ -1324,14 +1430,14 @@ int Channel_Read_Property(BACNET_READ_PROPERTY_DATA * rpdata)
case PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES: case PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES:
if (rpdata->array_index == 0) { if (rpdata->array_index == 0) {
/* Array element zero is the number of elements in the array */ /* Array element zero is the number of elements in the array */
count = Channel_Control_Member_Count(rpdata->object_instance); count = Channel_Reference_List_Member_Count(rpdata->object_instance);
apdu_len = encode_application_unsigned(&apdu[0], count); apdu_len = encode_application_unsigned(&apdu[0], count);
} else if (rpdata->array_index == BACNET_ARRAY_ALL) { } else if (rpdata->array_index == BACNET_ARRAY_ALL) {
/* if no index was specified, then try to encode the entire list */ /* if no index was specified, then try to encode the entire list */
/* into one packet. */ /* into one packet. */
count = Channel_Control_Member_Count(rpdata->object_instance); count = Channel_Reference_List_Member_Count(rpdata->object_instance);
for (i = 1; i <= count; i++) { for (i = 1; i <= count; i++) {
pMember = Channel_Control_Member_Element( pMember = Channel_Reference_List_Member_Element(
rpdata->object_instance, i); rpdata->object_instance, i);
len += len +=
bacapp_encode_device_obj_property_ref(&apdu[apdu_len], bacapp_encode_device_obj_property_ref(&apdu[apdu_len],
@@ -1348,9 +1454,9 @@ int Channel_Read_Property(BACNET_READ_PROPERTY_DATA * rpdata)
} }
} else { } else {
/* a specific element was requested */ /* a specific element was requested */
count = Channel_Control_Member_Count(rpdata->object_instance); count = Channel_Reference_List_Member_Count(rpdata->object_instance);
if (rpdata->array_index <= count) { if (rpdata->array_index <= count) {
pMember = Channel_Control_Member_Element( pMember = Channel_Reference_List_Member_Element(
rpdata->object_instance, rpdata->array_index); rpdata->object_instance, rpdata->array_index);
apdu_len += apdu_len +=
bacapp_encode_device_obj_property_ref(&apdu[0], bacapp_encode_device_obj_property_ref(&apdu[0],
+13 -2
View File
@@ -155,10 +155,21 @@ extern "C" {
uint16_t Channel_Number(uint32_t object_instance); uint16_t Channel_Number(uint32_t object_instance);
bool Channel_Number_Set(uint32_t object_instance, uint16_t value); bool Channel_Number_Set(uint32_t object_instance, uint16_t value);
unsigned Channel_Control_Member_Count(uint32_t object_instance); unsigned Channel_Reference_List_Member_Count(uint32_t object_instance);
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *
Channel_Control_Member_Element(uint32_t object_instance, Channel_Reference_List_Member_Element(uint32_t object_instance,
unsigned element); unsigned element);
bool Channel_Reference_List_Member_Element_Set(uint32_t object_instance,
unsigned array_index,
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMemberSrc);
unsigned Channel_Reference_List_Member_Element_Add(uint32_t object_instance,
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *pMemberSrc);
unsigned Channel_Reference_List_Member_Local_Add(
uint32_t object_instance,
uint16_t type,
uint32_t instance,
BACNET_PROPERTY_ID propertyIdentifier,
uint32_t arrayIndex);
void Channel_Init(void); void Channel_Init(void);