Enabled BACnetARRAY checking when using proplist.c and added to apps/epics (#823)
This commit is contained in:
@@ -300,6 +300,14 @@ bool Access_Rights_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
||||
BACNET_APPLICATION_DATA_VALUE value = { 0 };
|
||||
unsigned object_index = 0;
|
||||
|
||||
/* only array properties can have array options */
|
||||
is_array = property_list_bacnet_array_member(
|
||||
wp_data->object_type, wp_data->object_property);
|
||||
if (!is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) {
|
||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||
wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||
return false;
|
||||
}
|
||||
/* decode the some of the request */
|
||||
len = bacapp_decode_application_data(
|
||||
wp_data->application_data, wp_data->application_data_len, &value);
|
||||
@@ -310,14 +318,6 @@ bool Access_Rights_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||
return false;
|
||||
}
|
||||
/* only array properties can have array options */
|
||||
is_array = property_list_bacnet_array_member(
|
||||
wp_data->object_type, wp_data->object_property);
|
||||
if (is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) {
|
||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||
wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||
return false;
|
||||
}
|
||||
object_index = Access_Rights_Instance_To_Index(wp_data->object_instance);
|
||||
switch (wp_data->object_property) {
|
||||
case PROP_GLOBAL_IDENTIFIER:
|
||||
|
||||
@@ -421,7 +421,16 @@ bool Schedule_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
||||
bool status = false; /* return value */
|
||||
int len;
|
||||
BACNET_APPLICATION_DATA_VALUE value = { 0 };
|
||||
bool is_array;
|
||||
|
||||
/* only array properties can have array options */
|
||||
is_array = property_list_bacnet_array_member(
|
||||
wp_data->object_type, wp_data->object_property);
|
||||
if (!is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) {
|
||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||
wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||
return false;
|
||||
}
|
||||
/* decode the some of the request */
|
||||
len = bacapp_decode_application_data(
|
||||
wp_data->application_data, wp_data->application_data_len, &value);
|
||||
@@ -432,12 +441,10 @@ bool Schedule_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||
return false;
|
||||
}
|
||||
|
||||
object_index = Schedule_Instance_To_Index(wp_data->object_instance);
|
||||
if (object_index >= MAX_SCHEDULES) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch ((int)wp_data->object_property) {
|
||||
case PROP_OUT_OF_SERVICE:
|
||||
status = write_property_type_valid(
|
||||
|
||||
@@ -262,6 +262,7 @@ int Trend_Log_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
|
||||
BACNET_CHARACTER_STRING char_string;
|
||||
TL_LOG_INFO *CurrentLog;
|
||||
uint8_t *apdu = NULL;
|
||||
bool is_array;
|
||||
|
||||
if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
|
||||
(rpdata->application_data_len == 0)) {
|
||||
@@ -405,8 +406,9 @@ int Trend_Log_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
|
||||
break;
|
||||
}
|
||||
/* only array properties can have array options */
|
||||
if ((apdu_len >= 0) &&
|
||||
(rpdata->object_property != PROP_EVENT_TIME_STAMPS) &&
|
||||
is_array = property_list_bacnet_array_member(
|
||||
rpdata->object_type, rpdata->object_property);
|
||||
if ((apdu_len >= 0) && (!is_array) &&
|
||||
(rpdata->array_index != BACNET_ARRAY_ALL)) {
|
||||
rpdata->error_class = ERROR_CLASS_PROPERTY;
|
||||
rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||
@@ -427,7 +429,16 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
||||
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE TempSource;
|
||||
bool bEffectiveEnable;
|
||||
int log_index;
|
||||
bool is_array;
|
||||
|
||||
/* only array properties can have array options */
|
||||
is_array = property_list_bacnet_array_member(
|
||||
wp_data->object_type, wp_data->object_property);
|
||||
if (!is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) {
|
||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||
wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||
return false;
|
||||
}
|
||||
/* Pin down which log to look at */
|
||||
log_index = Trend_Log_Instance_To_Index(wp_data->object_instance);
|
||||
CurrentLog = &LogInfo[log_index];
|
||||
@@ -442,13 +453,6 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||
return false;
|
||||
}
|
||||
if ((wp_data->object_property != PROP_EVENT_TIME_STAMPS) &&
|
||||
(wp_data->array_index != BACNET_ARRAY_ALL)) {
|
||||
/* only array properties can have array options */
|
||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||
wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||
return false;
|
||||
}
|
||||
switch (wp_data->object_property) {
|
||||
case PROP_ENABLE:
|
||||
status = write_property_type_valid(
|
||||
|
||||
@@ -19,10 +19,6 @@
|
||||
#define BACNET_PROPERTY_LISTS 0
|
||||
#endif
|
||||
|
||||
#ifndef BACNET_PROPERTY_ARRAY_LISTS
|
||||
#define BACNET_PROPERTY_ARRAY_LISTS 0
|
||||
#endif
|
||||
|
||||
#if BACNET_PROPERTY_LISTS
|
||||
/** @file property.c List of Required and Optional object properties */
|
||||
/* note: the PROP_PROPERTY_LIST is NOT included in these lists, on purpose */
|
||||
@@ -3194,98 +3190,6 @@ unsigned property_list_special_count(
|
||||
}
|
||||
#endif
|
||||
|
||||
#if BACNET_PROPERTY_ARRAY_LISTS
|
||||
/* standard properties that are arrays
|
||||
but not necessary supported in every object */
|
||||
|
||||
static const int Properties_BACnetARRAY[] = {
|
||||
/* unordered list of properties */
|
||||
PROP_AUTHENTICATION_FACTORS,
|
||||
PROP_ASSIGNED_ACCESS_RIGHTS,
|
||||
PROP_PRIORITY_ARRAY,
|
||||
PROP_VALUE_SOURCE_ARRAY,
|
||||
PROP_COMMAND_TIME_ARRAY,
|
||||
PROP_ALARM_VALUES,
|
||||
PROP_FAULT_VALUES,
|
||||
PROP_EVENT_TIME_STAMPS,
|
||||
PROP_EVENT_MESSAGE_TEXTS,
|
||||
PROP_EVENT_MESSAGE_TEXTS_CONFIG,
|
||||
PROP_SUPPORTED_FORMATS,
|
||||
PROP_SUPPORTED_FORMAT_CLASSES,
|
||||
PROP_SUBORDINATE_LIST,
|
||||
PROP_SUBORDINATE_ANNOTATIONS,
|
||||
PROP_SUBORDINATE_TAGS,
|
||||
PROP_SUBORDINATE_NODE_TYPES,
|
||||
PROP_SUBORDINATE_RELATIONSHIPS,
|
||||
PROP_GROUP_MEMBERS,
|
||||
PROP_GROUP_MEMBER_NAMES,
|
||||
PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES,
|
||||
PROP_EXECUTION_DELAY,
|
||||
PROP_CONTROL_GROUPS,
|
||||
PROP_BIT_TEXT,
|
||||
PROP_PORT_FILTER,
|
||||
PROP_NOTIFICATION_CLASS,
|
||||
PROP_STATE_CHANGE_VALUES,
|
||||
PROP_LINK_SPEEDS,
|
||||
PROP_IP_DNS_SERVER,
|
||||
PROP_IPV6_DNS_SERVER,
|
||||
PROP_FLOOR_TEXT,
|
||||
PROP_CAR_DOOR_TEXT,
|
||||
PROP_ASSIGNED_LANDING_CALLS,
|
||||
PROP_MAKING_CAR_CALL,
|
||||
PROP_REGISTERED_CAR_CALL,
|
||||
PROP_CAR_DOOR_STATUS,
|
||||
PROP_CAR_DOOR_COMMAND,
|
||||
PROP_LANDING_DOOR_STATUS,
|
||||
PROP_STAGES,
|
||||
PROP_STAGE_NAMES,
|
||||
PROP_TARGET_REFERENCES,
|
||||
PROP_MONITORED_OBJECTS,
|
||||
PROP_TAGS,
|
||||
-1
|
||||
};
|
||||
|
||||
/**
|
||||
* Function that returns the list of Required properties
|
||||
* of known standard objects.
|
||||
*
|
||||
* @param object_type - enumerated BACNET_OBJECT_TYPE
|
||||
* @return returns a pointer to a '-1' terminated array of
|
||||
* type 'int' that contain BACnet object properties for the given object
|
||||
* type.
|
||||
*/
|
||||
const int *property_list_bacnet_array(void)
|
||||
{
|
||||
return Properties_BACnetARRAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Determine if the object property is a BACnetARRAY property
|
||||
* @param object_type - object-type to be checked
|
||||
* @param object_property - object-property to be checked
|
||||
* @return true if the property is a BACnetARRAY property
|
||||
*/
|
||||
bool property_list_bacnet_array_member(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID object_property)
|
||||
{
|
||||
switch (object_type) {
|
||||
case OBJECT_GLOBAL_GROUP:
|
||||
switch (object_property) {
|
||||
case PROP_PRESENT_VALUE:
|
||||
/* special - the only present-value that is an array! */
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return property_list_member(Properties_BACnetARRAY, object_property);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Determine if this property is required to be writable
|
||||
* @note Property Conformance Code of W means writable
|
||||
|
||||
@@ -36,12 +36,6 @@ BACNET_PROPERTY_ID property_list_special_property(
|
||||
BACNET_STACK_EXPORT
|
||||
unsigned property_list_special_count(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID special_property);
|
||||
|
||||
BACNET_STACK_EXPORT
|
||||
const int *property_list_bacnet_array(void);
|
||||
BACNET_STACK_EXPORT
|
||||
bool property_list_bacnet_array_member(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID object_property);
|
||||
BACNET_STACK_EXPORT
|
||||
bool property_list_writable_member(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID object_property);
|
||||
|
||||
@@ -334,3 +334,213 @@ bool property_list_common(BACNET_PROPERTY_ID property)
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/* standard properties that are arrays
|
||||
but not required to be supported in every object */
|
||||
static const int Properties_BACnetARRAY[] = {
|
||||
/* unordered list of properties */
|
||||
PROP_OBJECT_LIST,
|
||||
PROP_STRUCTURED_OBJECT_LIST,
|
||||
PROP_CONFIGURATION_FILES,
|
||||
PROP_PROPERTY_LIST,
|
||||
PROP_AUTHENTICATION_FACTORS,
|
||||
PROP_ASSIGNED_ACCESS_RIGHTS,
|
||||
PROP_ACTION,
|
||||
PROP_ACTION_TEXT,
|
||||
PROP_PRIORITY_ARRAY,
|
||||
PROP_VALUE_SOURCE_ARRAY,
|
||||
PROP_COMMAND_TIME_ARRAY,
|
||||
PROP_ALARM_VALUES,
|
||||
PROP_FAULT_VALUES,
|
||||
PROP_EVENT_TIME_STAMPS,
|
||||
PROP_EVENT_MESSAGE_TEXTS,
|
||||
PROP_EVENT_MESSAGE_TEXTS_CONFIG,
|
||||
PROP_SUPPORTED_FORMATS,
|
||||
PROP_SUPPORTED_FORMAT_CLASSES,
|
||||
PROP_SUBORDINATE_LIST,
|
||||
PROP_SUBORDINATE_ANNOTATIONS,
|
||||
PROP_SUBORDINATE_TAGS,
|
||||
PROP_SUBORDINATE_NODE_TYPES,
|
||||
PROP_SUBORDINATE_RELATIONSHIPS,
|
||||
PROP_GROUP_MEMBERS,
|
||||
PROP_GROUP_MEMBER_NAMES,
|
||||
PROP_EXECUTION_DELAY,
|
||||
PROP_CONTROL_GROUPS,
|
||||
PROP_BIT_TEXT,
|
||||
PROP_PORT_FILTER,
|
||||
PROP_NOTIFICATION_CLASS,
|
||||
PROP_STATE_CHANGE_VALUES,
|
||||
PROP_LINK_SPEEDS,
|
||||
PROP_IP_DNS_SERVER,
|
||||
PROP_IPV6_DNS_SERVER,
|
||||
PROP_FLOOR_TEXT,
|
||||
PROP_CAR_DOOR_TEXT,
|
||||
PROP_ASSIGNED_LANDING_CALLS,
|
||||
PROP_MAKING_CAR_CALL,
|
||||
PROP_REGISTERED_CAR_CALL,
|
||||
PROP_CAR_DOOR_STATUS,
|
||||
PROP_CAR_DOOR_COMMAND,
|
||||
PROP_LANDING_DOOR_STATUS,
|
||||
PROP_STAGES,
|
||||
PROP_STAGE_NAMES,
|
||||
PROP_STATE_TEXT,
|
||||
PROP_TARGET_REFERENCES,
|
||||
PROP_MONITORED_OBJECTS,
|
||||
PROP_SHED_LEVELS,
|
||||
PROP_SHED_LEVEL_DESCRIPTIONS,
|
||||
PROP_WEEKLY_SCHEDULE,
|
||||
PROP_EXCEPTION_SCHEDULE,
|
||||
PROP_TAGS,
|
||||
-1
|
||||
};
|
||||
|
||||
/**
|
||||
* Function that returns the list of Required properties
|
||||
* of known standard objects.
|
||||
*
|
||||
* @param object_type - enumerated BACNET_OBJECT_TYPE
|
||||
* @return returns a pointer to a '-1' terminated array of
|
||||
* type 'int' that contain BACnet object properties for the given object
|
||||
* type.
|
||||
*/
|
||||
const int *property_list_bacnet_array(void)
|
||||
{
|
||||
return Properties_BACnetARRAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Determine if the object property is a BACnetARRAY property
|
||||
* @param object_type - object-type to be checked
|
||||
* @param object_property - object-property to be checked
|
||||
* @return true if the property is a BACnetARRAY property
|
||||
*/
|
||||
bool property_list_bacnet_array_member(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID object_property)
|
||||
{
|
||||
/* exceptions where property is an BACnetARRAY only in specific objects */
|
||||
switch (object_type) {
|
||||
case OBJECT_GLOBAL_GROUP:
|
||||
switch (object_property) {
|
||||
case PROP_PRESENT_VALUE:
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case OBJECT_CHANNEL:
|
||||
switch (object_property) {
|
||||
case PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES:
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if ((object_property >= PROP_PROPRIETARY_RANGE_MIN) &&
|
||||
(object_property <= PROP_PROPRIETARY_RANGE_MAX)) {
|
||||
/* all proprietary properties could be a BACnetARRAY */
|
||||
return true;
|
||||
}
|
||||
|
||||
return property_list_member(Properties_BACnetARRAY, object_property);
|
||||
}
|
||||
|
||||
/* standard properties that are BACnetLIST */
|
||||
static const int Properties_BACnetLIST[] = {
|
||||
/* unordered list of properties */
|
||||
PROP_DATE_LIST,
|
||||
PROP_VT_CLASSES_SUPPORTED,
|
||||
PROP_ACTIVE_VT_SESSIONS,
|
||||
PROP_TIME_SYNCHRONIZATION_RECIPIENTS,
|
||||
PROP_DEVICE_ADDRESS_BINDING,
|
||||
PROP_ACTIVE_COV_SUBSCRIPTIONS,
|
||||
PROP_RESTART_NOTIFICATION_RECIPIENTS,
|
||||
PROP_UTC_TIME_SYNCHRONIZATION_RECIPIENTS,
|
||||
PROP_ACTIVE_COV_MULTIPLE_SUBSCRIPTIONS,
|
||||
PROP_LIST_OF_GROUP_MEMBERS,
|
||||
PROP_ACCEPTED_MODES,
|
||||
PROP_LIFE_SAFETY_ALARM_VALUES,
|
||||
PROP_ALARM_VALUES,
|
||||
PROP_FAULT_VALUES,
|
||||
PROP_MEMBER_OF,
|
||||
PROP_ZONE_MEMBERS,
|
||||
PROP_RECIPIENT_LIST,
|
||||
PROP_LOG_BUFFER,
|
||||
PROP_MASKED_ALARM_VALUES,
|
||||
PROP_FAILED_ATTEMPT_EVENTS,
|
||||
PROP_ACCESS_ALARM_EVENTS,
|
||||
PROP_ACCESS_TRANSACTION_EVENTS,
|
||||
PROP_CREDENTIALS_IN_ZONE,
|
||||
PROP_ENTRY_POINTS,
|
||||
PROP_EXIT_POINTS,
|
||||
PROP_MEMBERS,
|
||||
PROP_CREDENTIALS,
|
||||
PROP_REASON_FOR_DISABLE,
|
||||
PROP_AUTHORIZATION_EXEMPTIONS,
|
||||
PROP_COVU_RECIPIENTS,
|
||||
PROP_SUBSCRIBED_RECIPIENTS,
|
||||
PROP_BBMD_BROADCAST_DISTRIBUTION_TABLE,
|
||||
PROP_BBMD_FOREIGN_DEVICE_TABLE,
|
||||
PROP_MANUAL_SLAVE_ADDRESS_BINDING,
|
||||
PROP_SLAVE_ADDRESS_BINDING,
|
||||
PROP_VIRTUAL_MAC_ADDRESS_TABLE,
|
||||
PROP_ROUTING_TABLE,
|
||||
PROP_LANDING_CALLS,
|
||||
PROP_FAULT_SIGNALS,
|
||||
-1
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the list of BACnetLIST properties of known standard objects.
|
||||
*
|
||||
* @param object_type - enumerated BACNET_OBJECT_TYPE
|
||||
* @return returns a pointer to a '-1' terminated array of
|
||||
* type 'int' that contain BACnet object properties for the given object
|
||||
* type.
|
||||
*/
|
||||
const int *property_list_bacnet_list(void)
|
||||
{
|
||||
return Properties_BACnetLIST;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Determine if the object property is a BACnetLIST property
|
||||
* @param object_type - object-type to be checked
|
||||
* @param object_property - object-property to be checked
|
||||
* @return true if the property is a BACnetLIST property
|
||||
*/
|
||||
bool property_list_bacnet_list_member(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID object_property)
|
||||
{
|
||||
/* exceptions where property is an BACnetLIST only in specific objects */
|
||||
switch (object_type) {
|
||||
case OBJECT_GROUP:
|
||||
switch (object_property) {
|
||||
case PROP_PRESENT_VALUE:
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case OBJECT_SCHEDULE:
|
||||
case OBJECT_TIMER:
|
||||
switch (object_property) {
|
||||
case PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES:
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if ((object_property >= PROP_PROPRIETARY_RANGE_MIN) &&
|
||||
(object_property <= PROP_PROPRIETARY_RANGE_MAX)) {
|
||||
/* all proprietary properties could be a BACnetLIST */
|
||||
return true;
|
||||
}
|
||||
|
||||
return property_list_member(Properties_BACnetLIST, object_property);
|
||||
}
|
||||
|
||||
@@ -52,6 +52,17 @@ int property_list_common_encode(
|
||||
BACNET_STACK_EXPORT
|
||||
bool property_list_common(BACNET_PROPERTY_ID property);
|
||||
|
||||
BACNET_STACK_EXPORT
|
||||
const int *property_list_bacnet_array(void);
|
||||
BACNET_STACK_EXPORT
|
||||
bool property_list_bacnet_array_member(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID object_property);
|
||||
BACNET_STACK_EXPORT
|
||||
const int *property_list_bacnet_list(void);
|
||||
BACNET_STACK_EXPORT
|
||||
bool property_list_bacnet_list_member(
|
||||
BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID object_property);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
Reference in New Issue
Block a user