Files
bacnet_stack/src/bacnet/property.c
T
Steve Karg d50c190957 Issue 2 move folders and use deep path include file names to prevent collisions (#4)
* moving folders and files and adjust server demo build

* Fix Makefile for apps/server on Linux

* fix unit test source file folders

* fix datetime convert UTC functions. Add Code::Blocks project for datetime testing

* added some ignore extensions

* disable parallel make option

* fix build for abort, dcc, and epics apps

* fix build for dcc, epics, error, and getevent apps.

* Fixed building of all apps

* fix the ipv4 to ipv6 router app build

* Change indent style from Google to Webkit

* make pretty to re-format style

* removed common Makefile since we already had one and two was too many

* remove scripts from root folder that are no longer maintained or used

* remove mercurial EOL and ignore files for git repo

* remove .vscodeconfig files from repo

* tweak clang-format style

* clang-format src and apps with tweaked style

* added clang-tidy to fix readability if braces in src

* result of make tidy for src and apps

* fix clang-tidy mangling

* Added code::blocks project for BACnet server simulation

* added code::blocks linux project for WhoIs app

* update text files for EOL

* fix EOL in some files

* fixed make win32 apps for older gcc

* Removed Borland C++ Makefile in apps. Unable to maintain support for Borland C++ compiler.

* created codeblocks project for apps/epics for Windows

* fixing ports/xplained to work with new data structure.

* fix ports/xplained example for Atmel Studio compile

* fix ports/stm32f10x example for gcc Makefile compile

* fix ports/stm32f10x example for IAR EWARM compile

* fix ports/xplained timer callback

* fix ports/bdk_atxx_mspt build with subdirs

* fix ports/bdk_atxx_mspt build with subdirs

* updated git ignore for IAR build artifacts

* updated gitignore for non-tracked files and folders

* fixed bdk-atxx4-mstp port for Rowley Crossworks project file

* fixed bdk-atxx4-mstp port for GCC AVR Makefile

* fixed atmega168 port for IAR AVR and GCC AVR Makefile

* fixed at91sam7s port for IAR ARM and GCC ARM Makefile

* removed unmaintainable DOS, RTOS32, and atmega8 ports.  Updated rx62n (untested).

* changed arm7 to uip port
2019-12-13 15:19:10 -06:00

710 lines
29 KiB
C

/*####COPYRIGHTBEGIN####
-------------------------------------------
Copyright (C) 2012 Steve Karg
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to:
The Free Software Foundation, Inc.
59 Temple Place - Suite 330
Boston, MA 02111-1307, USA.
As a special exception, if other files instantiate templates or
use macros or inline functions from this file, or you compile
this file and link it with other works to produce a work based
on this file, this file does not by itself cause the resulting
work to be covered by the GNU General Public License. However
the source code for this file must still be made available in
accordance with section (3) of the GNU General Public License.
This exception does not invalidate any other reasons why a work
based on this file might be covered by the GNU General Public
License.
-------------------------------------------
####COPYRIGHTEND####*/
#include <stdint.h>
#include "bacnet/bacenum.h"
#include "bacnet/bacdef.h"
#include "bacnet/bacdcode.h"
#include "bacnet/bacenum.h"
#include "bacnet/rpm.h"
#include "bacnet/rp.h"
#include "bacnet/proplist.h"
#include "bacnet/property.h"
#ifndef BACNET_PROPERTY_LISTS
#define BACNET_PROPERTY_LISTS 0
#endif
#if BACNET_PROPERTY_LISTS
/** @file proplist.c List of Required and Optional object properties */
/* note: the PROP_PROPERTY_LIST is NOT included in these lists, on purpose */
static const int Default_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, -1 };
static const int Device_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_SYSTEM_STATUS, PROP_VENDOR_NAME,
PROP_VENDOR_IDENTIFIER, PROP_MODEL_NAME, PROP_FIRMWARE_REVISION,
PROP_APPLICATION_SOFTWARE_VERSION, PROP_PROTOCOL_VERSION,
PROP_PROTOCOL_REVISION, PROP_PROTOCOL_SERVICES_SUPPORTED,
PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED, PROP_OBJECT_LIST,
PROP_MAX_APDU_LENGTH_ACCEPTED, PROP_SEGMENTATION_SUPPORTED,
PROP_APDU_TIMEOUT, PROP_NUMBER_OF_APDU_RETRIES, PROP_DEVICE_ADDRESS_BINDING,
PROP_DATABASE_REVISION, -1 };
static const int Device_Properties_Optional[] = { PROP_LOCATION,
PROP_DESCRIPTION, PROP_STRUCTURED_OBJECT_LIST, PROP_MAX_SEGMENTS_ACCEPTED,
PROP_VT_CLASSES_SUPPORTED, PROP_ACTIVE_VT_SESSIONS, PROP_LOCAL_TIME,
PROP_LOCAL_DATE, PROP_UTC_OFFSET, PROP_DAYLIGHT_SAVINGS_STATUS,
PROP_APDU_SEGMENT_TIMEOUT, PROP_TIME_SYNCHRONIZATION_RECIPIENTS,
PROP_MAX_MASTER, PROP_MAX_INFO_FRAMES, PROP_CONFIGURATION_FILES,
PROP_LAST_RESTORE_TIME, PROP_BACKUP_FAILURE_TIMEOUT,
PROP_BACKUP_PREPARATION_TIME, PROP_RESTORE_PREPARATION_TIME,
PROP_RESTORE_COMPLETION_TIME, PROP_BACKUP_AND_RESTORE_STATE,
PROP_ACTIVE_COV_SUBSCRIPTIONS, PROP_SLAVE_PROXY_ENABLE,
PROP_MANUAL_SLAVE_ADDRESS_BINDING, PROP_AUTO_SLAVE_DISCOVERY,
PROP_SLAVE_ADDRESS_BINDING, PROP_LAST_RESTART_REASON,
PROP_TIME_OF_DEVICE_RESTART, PROP_RESTART_NOTIFICATION_RECIPIENTS,
PROP_UTC_TIME_SYNCHRONIZATION_RECIPIENTS,
PROP_TIME_SYNCHRONIZATION_INTERVAL, PROP_ALIGN_INTERVALS,
PROP_INTERVAL_OFFSET, PROP_PROFILE_NAME, -1 };
static const int Accumulator_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_SCALE, PROP_UNITS,
PROP_MAX_PRES_VALUE, -1 };
static const int Accumulator_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_RELIABILITY, PROP_PRESCALE, PROP_VALUE_CHANGE_TIME,
PROP_VALUE_BEFORE_CHANGE, PROP_VALUE_SET, PROP_LOGGING_RECORD,
PROP_LOGGING_OBJECT, PROP_PULSE_RATE, PROP_HIGH_LIMIT, PROP_LOW_LIMIT,
PROP_LIMIT_MONITORING_INTERVAL, PROP_NOTIFICATION_CLASS, PROP_TIME_DELAY,
PROP_LIMIT_ENABLE, PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS,
PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Analog_Input_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_UNITS, -1 };
static const int Analog_Input_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_RELIABILITY, PROP_UPDATE_INTERVAL,
PROP_MIN_PRES_VALUE, PROP_MAX_PRES_VALUE, PROP_RESOLUTION,
PROP_COV_INCREMENT, PROP_TIME_DELAY, PROP_NOTIFICATION_CLASS,
PROP_HIGH_LIMIT, PROP_LOW_LIMIT, PROP_DEADBAND, PROP_LIMIT_ENABLE,
PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE,
PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Analog_Output_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_UNITS, PROP_PRIORITY_ARRAY,
PROP_RELINQUISH_DEFAULT, -1 };
static const int Analog_Output_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_RELIABILITY, PROP_MIN_PRES_VALUE,
PROP_MAX_PRES_VALUE, PROP_RESOLUTION, PROP_COV_INCREMENT, PROP_TIME_DELAY,
PROP_NOTIFICATION_CLASS, PROP_HIGH_LIMIT, PROP_LOW_LIMIT, PROP_DEADBAND,
PROP_LIMIT_ENABLE, PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS,
PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Analog_Value_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_UNITS, -1 };
static const int Analog_Value_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_RELIABILITY, PROP_PRIORITY_ARRAY, PROP_RELINQUISH_DEFAULT,
PROP_COV_INCREMENT, PROP_TIME_DELAY, PROP_NOTIFICATION_CLASS,
PROP_HIGH_LIMIT, PROP_LOW_LIMIT, PROP_DEADBAND, PROP_LIMIT_ENABLE,
PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE,
PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Averaging_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_MINIMUM_VALUE, PROP_AVERAGE_VALUE,
PROP_MAXIMUM_VALUE, PROP_STATUS_FLAGS, PROP_EVENT_STATE,
PROP_OUT_OF_SERVICE, PROP_UNITS, -1 };
static const int Averaging_Properties_Optional[] = { PROP_PROFILE_NAME,
PROP_MINIMUM_VALUE_TIMESTAMP, PROP_VARIANCE_VALUE,
PROP_MAXIMUM_VALUE_TIMESTAMP, PROP_DESCRIPTION, PROP_ATTEMPTED_SAMPLES,
PROP_VALID_SAMPLES, PROP_OBJECT_PROPERTY_REFERENCE, PROP_WINDOW_INTERVAL,
PROP_WINDOW_SAMPLES, -1 };
static const int Binary_Input_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_POLARITY, -1 };
static const int Binary_Input_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_RELIABILITY, PROP_INACTIVE_TEXT, PROP_ACTIVE_TEXT,
PROP_CHANGE_OF_STATE_TIME, PROP_CHANGE_OF_STATE_COUNT,
PROP_TIME_OF_STATE_COUNT_RESET, PROP_ELAPSED_ACTIVE_TIME,
PROP_TIME_OF_ACTIVE_TIME_RESET, PROP_TIME_DELAY, PROP_NOTIFICATION_CLASS,
PROP_ALARM_VALUE, PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS,
PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Binary_Output_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_POLARITY, PROP_PRIORITY_ARRAY,
PROP_RELINQUISH_DEFAULT, -1 };
static const int Binary_Output_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_RELIABILITY, PROP_INACTIVE_TEXT, PROP_ACTIVE_TEXT,
PROP_CHANGE_OF_STATE_TIME, PROP_CHANGE_OF_STATE_COUNT,
PROP_TIME_OF_STATE_COUNT_RESET, PROP_ELAPSED_ACTIVE_TIME,
PROP_TIME_OF_ACTIVE_TIME_RESET, PROP_MINIMUM_OFF_TIME, PROP_MINIMUM_ON_TIME,
PROP_TIME_DELAY, PROP_NOTIFICATION_CLASS, PROP_FEEDBACK_VALUE,
PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE,
PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Binary_Value_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, -1 };
static const int Binary_Value_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_RELIABILITY, PROP_INACTIVE_TEXT, PROP_ACTIVE_TEXT,
PROP_CHANGE_OF_STATE_TIME, PROP_CHANGE_OF_STATE_COUNT,
PROP_TIME_OF_STATE_COUNT_RESET, PROP_ELAPSED_ACTIVE_TIME,
PROP_TIME_OF_ACTIVE_TIME_RESET, PROP_MINIMUM_OFF_TIME, PROP_MINIMUM_ON_TIME,
PROP_PRIORITY_ARRAY, PROP_RELINQUISH_DEFAULT, PROP_TIME_DELAY,
PROP_NOTIFICATION_CLASS, PROP_ALARM_VALUE, PROP_EVENT_ENABLE,
PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS,
PROP_EVENT_MESSAGE_TEXTS, PROP_RELIABILITY_EVALUATION_INHIBIT,
PROP_PROFILE_NAME, -1 };
static const int Calendar_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_DATE_LIST,
-1 };
static const int Calendar_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_PROFILE_NAME, -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_EVENT_DETECTION_ENABLE, PROP_NOTIFICATION_CLASS, PROP_EVENT_ENABLE,
PROP_EVENT_STATE, PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE,
PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_EVENT_MESSAGE_TEXTS_CONFIG, PROP_RELIABILITY_EVALUATION_INHIBIT,
PROP_PROFILE_NAME, -1 };
static const int Command_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_IN_PROCESS,
PROP_ALL_WRITES_SUCCESSFUL, PROP_ACTION, -1 };
static const int Command_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_ACTION_TEXT, PROP_PROFILE_NAME, -1 };
static const int CharacterString_Value_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE,
PROP_PRESENT_VALUE, PROP_STATUS_FLAGS, -1
};
static const int CharacterString_Value_Properties_Optional[] = {
PROP_DESCRIPTION, PROP_EVENT_STATE, PROP_RELIABILITY, PROP_OUT_OF_SERVICE,
PROP_PRIORITY_ARRAY, PROP_RELINQUISH_DEFAULT, PROP_TIME_DELAY,
PROP_NOTIFICATION_CLASS, PROP_ALARM_VALUES, PROP_FAULT_VALUES,
PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE,
PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1
};
static const int Lighting_Output_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE,
PROP_PRESENT_VALUE, PROP_TRACKING_VALUE, PROP_LIGHTING_COMMAND,
PROP_IN_PROGRESS, PROP_STATUS_FLAGS, PROP_OUT_OF_SERVICE,
PROP_BLINK_WARN_ENABLE, PROP_EGRESS_TIME, PROP_EGRESS_ACTIVE,
PROP_DEFAULT_FADE_TIME, PROP_DEFAULT_RAMP_RATE, PROP_DEFAULT_STEP_INCREMENT,
PROP_PRIORITY_ARRAY, PROP_RELINQUISH_DEFAULT,
PROP_LIGHTING_COMMAND_DEFAULT_PRIORITY, -1
};
static const int Lighting_Output_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_RELIABILITY, PROP_TRANSITION, PROP_FEEDBACK_VALUE, PROP_POWER,
PROP_INSTANTANEOUS_POWER, PROP_MIN_ACTUAL_VALUE, PROP_MAX_ACTUAL_VALUE,
PROP_COV_INCREMENT, PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME,
-1 };
static const int Load_Control_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_REQUESTED_SHED_LEVEL, PROP_START_TIME,
PROP_SHED_DURATION, PROP_DUTY_WINDOW, PROP_ENABLE, PROP_EXPECTED_SHED_LEVEL,
PROP_ACTUAL_SHED_LEVEL, PROP_SHED_LEVELS, PROP_SHED_LEVEL_DESCRIPTIONS,
-1 };
static const int Load_Control_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_STATE_DESCRIPTION, PROP_RELIABILITY, PROP_FULL_DUTY_BASELINE,
PROP_NOTIFICATION_CLASS, PROP_TIME_DELAY, PROP_EVENT_ENABLE,
PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS,
PROP_EVENT_MESSAGE_TEXTS, PROP_RELIABILITY_EVALUATION_INHIBIT,
PROP_PROFILE_NAME, -1 };
static const int Life_Safety_Point_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE,
PROP_PRESENT_VALUE, PROP_TRACKING_VALUE, PROP_STATUS_FLAGS,
PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_RELIABILITY, PROP_MODE,
PROP_ACCEPTED_MODES, PROP_SILENCED, PROP_OPERATION_EXPECTED, -1
};
static const int Life_Safety_Point_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_NOTIFICATION_CLASS, PROP_LIFE_SAFETY_ALARM_VALUES,
PROP_ALARM_VALUES, PROP_FAULT_VALUES, PROP_EVENT_ENABLE,
PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS,
PROP_EVENT_MESSAGE_TEXTS, PROP_MAINTENANCE_REQUIRED, PROP_SETTING,
PROP_DIRECT_READING, PROP_UNITS, PROP_MEMBER_OF,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Multistate_Input_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE,
PROP_PRESENT_VALUE, PROP_STATUS_FLAGS, PROP_EVENT_STATE,
PROP_OUT_OF_SERVICE, PROP_NUMBER_OF_STATES, -1
};
static const int Multistate_Input_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_RELIABILITY, PROP_STATE_TEXT, PROP_TIME_DELAY,
PROP_NOTIFICATION_CLASS, PROP_ALARM_VALUES, PROP_FAULT_VALUES,
PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE,
PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int Multistate_Output_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE,
PROP_PRESENT_VALUE, PROP_STATUS_FLAGS, PROP_EVENT_STATE,
PROP_OUT_OF_SERVICE, PROP_NUMBER_OF_STATES, PROP_PRIORITY_ARRAY,
PROP_RELINQUISH_DEFAULT, -1
};
static const int Multistate_Output_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_DEVICE_TYPE, PROP_RELIABILITY, PROP_STATE_TEXT, PROP_TIME_DELAY,
PROP_NOTIFICATION_CLASS, PROP_FEEDBACK_VALUE, PROP_EVENT_ENABLE,
PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS,
PROP_EVENT_MESSAGE_TEXTS, PROP_RELIABILITY_EVALUATION_INHIBIT,
PROP_PROFILE_NAME, -1 };
static const int Multistate_Value_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE,
PROP_PRESENT_VALUE, PROP_STATUS_FLAGS, PROP_EVENT_STATE,
PROP_OUT_OF_SERVICE, PROP_NUMBER_OF_STATES, -1
};
static const int Multistate_Value_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_RELIABILITY, PROP_STATE_TEXT, PROP_PRIORITY_ARRAY,
PROP_RELINQUISH_DEFAULT, PROP_TIME_DELAY, PROP_NOTIFICATION_CLASS,
PROP_ALARM_VALUES, PROP_FAULT_VALUES, PROP_EVENT_ENABLE,
PROP_ACKED_TRANSITIONS, PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS,
PROP_EVENT_MESSAGE_TEXTS, PROP_RELIABILITY_EVALUATION_INHIBIT,
PROP_PROFILE_NAME, -1 };
static const int Notification_Class_Properties_Required[] = {
PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE,
PROP_NOTIFICATION_CLASS, PROP_PRIORITY, PROP_ACK_REQUIRED,
PROP_RECIPIENT_LIST, -1
};
static const int Notification_Class_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_PROFILE_NAME, -1 };
static const int Trend_Log_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_ENABLE, PROP_STOP_WHEN_FULL,
PROP_BUFFER_SIZE, PROP_LOG_BUFFER, PROP_RECORD_COUNT,
PROP_TOTAL_RECORD_COUNT, PROP_EVENT_STATE, PROP_LOGGING_TYPE,
PROP_STATUS_FLAGS, -1 };
static const int Trend_Log_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_START_TIME, PROP_STOP_TIME, PROP_LOG_DEVICE_OBJECT_PROPERTY,
PROP_LOG_INTERVAL, PROP_COV_RESUBSCRIPTION_INTERVAL,
PROP_CLIENT_COV_INCREMENT, PROP_NOTIFICATION_THRESHOLD,
PROP_RECORDS_SINCE_NOTIFICATION, PROP_LAST_NOTIFY_RECORD,
PROP_NOTIFICATION_CLASS, PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS,
PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_ALIGN_INTERVALS, PROP_INTERVAL_OFFSET, PROP_TRIGGER, PROP_RELIABILITY,
PROP_RELIABILITY_EVALUATION_INHIBIT, PROP_PROFILE_NAME, -1 };
static const int File_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_FILE_TYPE, PROP_FILE_SIZE,
PROP_MODIFICATION_DATE, PROP_ARCHIVE, PROP_READ_ONLY,
PROP_FILE_ACCESS_METHOD, -1 };
static const int File_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_RECORD_COUNT, PROP_PROFILE_NAME, -1 };
/* These three arrays are used by the ReadPropertyMultiple handler */
static const int Integer_Value_Properties_Required[] = { PROP_OBJECT_IDENTIFIER,
PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS,
PROP_UNITS, -1 };
static const int Integer_Value_Properties_Optional[] = { PROP_DESCRIPTION,
PROP_EVENT_STATE, PROP_RELIABILITY, PROP_OUT_OF_SERVICE,
PROP_PRIORITY_ARRAY, PROP_RELINQUISH_DEFAULT, PROP_COV_INCREMENT,
PROP_TIME_DELAY, PROP_NOTIFICATION_CLASS, PROP_HIGH_LIMIT, PROP_LOW_LIMIT,
PROP_DEADBAND, PROP_LIMIT_ENABLE, PROP_EVENT_ENABLE, PROP_ACKED_TRANSITIONS,
PROP_NOTIFY_TYPE, PROP_EVENT_TIME_STAMPS, PROP_EVENT_MESSAGE_TEXTS,
PROP_EVENT_MESSAGE_TEXTS_CONFIG, PROP_EVENT_DETECTION_ENABLE,
PROP_EVENT_ALGORITHM_INHIBIT_REF, PROP_EVENT_ALGORITHM_INHIBIT,
PROP_TIME_DELAY_NORMAL, PROP_RELIABILITY_EVALUATION_INHIBIT,
PROP_MIN_PRES_VALUE, PROP_MAX_PRES_VALUE, PROP_RESOLUTION,
PROP_PROFILE_NAME, -1 };
/**
* Function that returns the list of all Optional 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_optional(BACNET_OBJECT_TYPE object_type)
{
const int *pList = NULL;
switch (object_type) {
case OBJECT_DEVICE:
pList = Device_Properties_Optional;
break;
case OBJECT_ACCUMULATOR:
pList = Accumulator_Properties_Optional;
break;
case OBJECT_ANALOG_INPUT:
pList = Analog_Input_Properties_Optional;
break;
case OBJECT_ANALOG_OUTPUT:
pList = Analog_Output_Properties_Optional;
break;
case OBJECT_ANALOG_VALUE:
pList = Analog_Value_Properties_Optional;
break;
case OBJECT_AVERAGING:
pList = Averaging_Properties_Optional;
break;
case OBJECT_BINARY_INPUT:
pList = Binary_Input_Properties_Optional;
break;
case OBJECT_BINARY_OUTPUT:
pList = Binary_Output_Properties_Optional;
break;
case OBJECT_BINARY_VALUE:
pList = Binary_Value_Properties_Optional;
break;
case OBJECT_CALENDAR:
pList = Calendar_Properties_Optional;
break;
case OBJECT_CHANNEL:
pList = Channel_Properties_Optional;
break;
case OBJECT_COMMAND:
pList = Command_Properties_Optional;
break;
case OBJECT_CHARACTERSTRING_VALUE:
pList = CharacterString_Value_Properties_Optional;
break;
case OBJECT_LIGHTING_OUTPUT:
pList = Lighting_Output_Properties_Optional;
break;
case OBJECT_LOAD_CONTROL:
pList = Load_Control_Properties_Optional;
break;
case OBJECT_LIFE_SAFETY_POINT:
pList = Life_Safety_Point_Properties_Optional;
break;
case OBJECT_MULTI_STATE_INPUT:
pList = Multistate_Input_Properties_Optional;
break;
case OBJECT_MULTI_STATE_OUTPUT:
pList = Multistate_Output_Properties_Optional;
break;
case OBJECT_MULTI_STATE_VALUE:
pList = Multistate_Value_Properties_Optional;
break;
case OBJECT_NOTIFICATION_CLASS:
pList = Notification_Class_Properties_Optional;
break;
case OBJECT_TRENDLOG:
pList = Trend_Log_Properties_Optional;
break;
case OBJECT_FILE:
pList = File_Properties_Optional;
break;
case OBJECT_INTEGER_VALUE:
pList = Integer_Value_Properties_Optional;
break;
default:
break;
}
return pList;
}
/**
* 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_required(BACNET_OBJECT_TYPE object_type)
{
const int *pList = NULL;
switch (object_type) {
case OBJECT_DEVICE:
pList = Device_Properties_Required;
break;
case OBJECT_ACCUMULATOR:
pList = Accumulator_Properties_Required;
break;
case OBJECT_ANALOG_INPUT:
pList = Analog_Input_Properties_Required;
break;
case OBJECT_ANALOG_OUTPUT:
pList = Analog_Output_Properties_Required;
break;
case OBJECT_ANALOG_VALUE:
pList = Analog_Value_Properties_Required;
break;
case OBJECT_AVERAGING:
pList = Averaging_Properties_Required;
break;
case OBJECT_BINARY_INPUT:
pList = Binary_Input_Properties_Required;
break;
case OBJECT_BINARY_OUTPUT:
pList = Binary_Output_Properties_Required;
break;
case OBJECT_BINARY_VALUE:
pList = Binary_Value_Properties_Required;
break;
case OBJECT_CALENDAR:
pList = Calendar_Properties_Required;
break;
case OBJECT_CHANNEL:
pList = Channel_Properties_Required;
break;
case OBJECT_COMMAND:
pList = Command_Properties_Required;
break;
case OBJECT_CHARACTERSTRING_VALUE:
pList = CharacterString_Value_Properties_Required;
break;
case OBJECT_LOAD_CONTROL:
pList = Load_Control_Properties_Required;
break;
case OBJECT_LIGHTING_OUTPUT:
pList = Lighting_Output_Properties_Required;
break;
case OBJECT_LIFE_SAFETY_POINT:
pList = Life_Safety_Point_Properties_Required;
break;
case OBJECT_MULTI_STATE_INPUT:
pList = Multistate_Input_Properties_Required;
break;
case OBJECT_MULTI_STATE_OUTPUT:
pList = Multistate_Output_Properties_Required;
break;
case OBJECT_MULTI_STATE_VALUE:
pList = Multistate_Value_Properties_Required;
break;
case OBJECT_NOTIFICATION_CLASS:
pList = Notification_Class_Properties_Required;
break;
case OBJECT_TRENDLOG:
pList = Trend_Log_Properties_Required;
break;
case OBJECT_FILE:
pList = File_Properties_Required;
break;
case OBJECT_INTEGER_VALUE:
pList = Integer_Value_Properties_Required;
break;
default:
pList = Default_Properties_Required;
break;
}
return pList;
}
/**
* 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,
struct special_property_list_t *pPropertyList)
{
if (pPropertyList == NULL) {
return;
}
pPropertyList->Required.pList = property_list_required(object_type);
pPropertyList->Optional.pList = property_list_optional(object_type);
pPropertyList->Proprietary.pList = NULL;
/* Fetch the counts if available otherwise zero them */
pPropertyList->Required.count =
property_list_count(pPropertyList->Required.pList);
pPropertyList->Optional.count =
property_list_count(pPropertyList->Optional.pList);
pPropertyList->Proprietary.count = 0;
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;
}
#endif
#ifdef TEST
#include <assert.h>
#include <string.h>
#include "ctest.h"
void testPropList(Test *pTest)
{
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;
struct special_property_list_t property_list = { 0 };
for (i = 0; i < OBJECT_PROPRIETARY_MIN; 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);
/* test member function */
property_list_special((BACNET_OBJECT_TYPE)i, &property_list);
ct_test(pTest,
property_list_member(
property_list.Required.pList, PROP_OBJECT_TYPE));
ct_test(pTest,
property_list_member(
property_list.Required.pList, PROP_OBJECT_IDENTIFIER));
ct_test(pTest,
property_list_member(
property_list.Required.pList, PROP_OBJECT_NAME));
}
}
#ifdef TEST_PROPLIST
int main(void)
{
Test *pTest;
bool rc;
pTest = ct_create("BACnet Property List", NULL);
/* individual tests */
rc = ct_addTestFunction(pTest, testPropList);
assert(rc);
ct_setStream(pTest, stdout);
ct_run(pTest);
(void)ct_report(pTest);
ct_destroy(pTest);
return 0;
}
#endif /* TEST_PROPLIST */
#endif /* TEST */