added channel object to proplist. Added unit test to proplist.

This commit is contained in:
skarg
2013-10-08 15:57:41 +00:00
parent 35a8ef1ba2
commit c0843c8134
3 changed files with 152 additions and 4 deletions
+139 -3
View File
@@ -408,6 +408,30 @@ static const int Calendar_Properties_Optional[] = {
-1
};
static const int Channel_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME,
PROP_OBJECT_TYPE,
PROP_PRESENT_VALUE,
PROP_LAST_PRIORITY,
PROP_WRITE_STATUS,
PROP_STATUS_FLAGS,
PROP_OUT_OF_SERVICE,
PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES,
PROP_CHANNEL_NUMBER,
PROP_CONTROL_GROUPS,
-1
};
static const int Channel_Properties_Optional[] = {
PROP_DESCRIPTION,
PROP_RELIABILITY,
PROP_EXECUTION_DELAY,
PROP_ALLOW_GROUP_DELAY_INHIBIT,
PROP_PROFILE_NAME,
-1
};
static const int Command_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME,
@@ -698,7 +722,11 @@ static const int File_Properties_Optional[] = {
-1
};
/* Function that returns the number of properties in a list
/**
* Function that returns the number of BACnet object properties in a list
*
* @param pList - array of type 'int' that is a list of BACnet object
* properties, terminated by a '-1' value.
*/
unsigned property_list_count(
const int *pList)
@@ -715,8 +743,14 @@ unsigned property_list_count(
return property_count;
}
/* Function that returns the list of Required or Optional properties
/**
* Function that returns the list of Required or Optional properties
* of known standard objects.
*
* @param object_type - enumerated BACNET_OBJECT_TYPE
* @param pPropertyList - returns a pointer to two '-1' terminated arrays of
* type 'int' that contain BACnet object properties for the given object
* type.
*/
void property_list_special(
BACNET_OBJECT_TYPE object_type,
@@ -768,6 +802,10 @@ void property_list_special(
pPropertyList->Required.pList = Calendar_Properties_Required;
pPropertyList->Optional.pList = Calendar_Properties_Optional;
break;
case OBJECT_CHANNEL:
pPropertyList->Required.pList = Channel_Properties_Required;
pPropertyList->Optional.pList = Channel_Properties_Optional;
break;
case OBJECT_COMMAND:
pPropertyList->Required.pList = Command_Properties_Required;
pPropertyList->Optional.pList = Command_Properties_Optional;
@@ -851,6 +889,8 @@ void property_list_special(
case OBJECT_POSITIVE_INTEGER_VALUE:
case OBJECT_TIME_PATTERN_VALUE:
case OBJECT_TIME_VALUE:
case OBJECT_NOTIFICATION_FORWARDER:
case OBJECT_ALERT_ENROLLMENT:
pPropertyList->Required.pList = Default_Properties_Required;
pPropertyList->Optional.pList = NULL;
pPropertyList->Proprietary.pList = NULL;
@@ -876,6 +916,73 @@ void property_list_special(
return;
}
BACNET_PROPERTY_ID property_list_special_property(
BACNET_OBJECT_TYPE object_type,
BACNET_PROPERTY_ID special_property,
unsigned index)
{
int property = -1; /* return value */
unsigned required, optional, proprietary;
struct special_property_list_t PropertyList = {{0}};
property_list_special(object_type, &PropertyList);
required = PropertyList.Required.count;
optional = PropertyList.Optional.count;
proprietary = PropertyList.Proprietary.count;
if (special_property == PROP_ALL) {
if (index < required) {
if (PropertyList.Required.pList) {
property = PropertyList.Required.pList[index];
}
} else if (index < (required + optional)) {
if (PropertyList.Optional.pList) {
index -= required;
property = PropertyList.Optional.pList[index];
}
} else if (index < (required + optional + proprietary)) {
if (PropertyList.Proprietary.pList) {
index -= (required + optional);
property = PropertyList.Proprietary.pList[index];
}
}
} else if (special_property == PROP_REQUIRED) {
if (index < required) {
if (PropertyList.Required.pList) {
property = PropertyList.Required.pList[index];
}
}
} else if (special_property == PROP_OPTIONAL) {
if (index < optional) {
if (PropertyList.Optional.pList) {
property = PropertyList.Optional.pList[index];
}
}
}
return (BACNET_PROPERTY_ID) property;
}
unsigned property_list_special_count(
BACNET_OBJECT_TYPE object_type,
BACNET_PROPERTY_ID special_property)
{
unsigned count = 0; /* return value */
struct special_property_list_t PropertyList = {{0}};
property_list_special(object_type, &PropertyList);
if (special_property == PROP_ALL) {
count =
PropertyList.Required.count + PropertyList.Optional.count +
PropertyList.Proprietary.count;
} else if (special_property == PROP_REQUIRED) {
count = PropertyList.Required.count;
} else if (special_property == PROP_OPTIONAL) {
count = PropertyList.Optional.count;
}
return count;
}
#ifdef TEST
#include <assert.h>
#include <string.h>
@@ -884,7 +991,36 @@ void property_list_special(
void testPropList(
Test * pTest)
{
ct_test(pTest, 0);
unsigned i = 0, j = 0;
unsigned count = 0;
BACNET_PROPERTY_ID property = MAX_BACNET_PROPERTY_ID;
unsigned object_id = 0, object_name = 0, object_type = 0;
for (i = 0; i < PROPRIETARY_BACNET_OBJECT_TYPE; i++) {
count = property_list_special_count((BACNET_OBJECT_TYPE)i, PROP_ALL);
ct_test(pTest, count >= 3);
object_id = 0;
object_name = 0;
object_type = 0;
for (j = 0; j < count; j++) {
property = property_list_special_property(
(BACNET_OBJECT_TYPE)i,
PROP_ALL,
j);
if (property == PROP_OBJECT_TYPE) {
object_type++;
}
if (property == PROP_OBJECT_IDENTIFIER) {
object_id++;
}
if (property == PROP_OBJECT_NAME) {
object_name++;
}
}
ct_test(pTest, object_type == 1);
ct_test(pTest, object_id == 1);
ct_test(pTest, object_name == 1);
}
}
#ifdef TEST_PROPLIST