From a7a67a76fd73123d1217e924f9bb5acc91304cff Mon Sep 17 00:00:00 2001 From: skarg Date: Mon, 16 Apr 2012 14:52:27 +0000 Subject: [PATCH] Added more object properties to the property list module - it now more than EPICS demo used from existing demo objects. --- bacnet-stack/demo/epics/Makefile | 3 +- bacnet-stack/demo/epics/main.c | 2 +- bacnet-stack/include/proplist.h | 4 +- bacnet-stack/src/proplist.c | 354 ++++++++++++++++++++++++++++--- 4 files changed, 328 insertions(+), 35 deletions(-) diff --git a/bacnet-stack/demo/epics/Makefile b/bacnet-stack/demo/epics/Makefile index fd1741f3..01ddb04b 100644 --- a/bacnet-stack/demo/epics/Makefile +++ b/bacnet-stack/demo/epics/Makefile @@ -8,7 +8,8 @@ TARGET = bacepics TARGET_BIN = ${TARGET}$(TARGET_EXT) -SRCS = main.c +SRCS = main.c \ + ../object/device-client.c OBJS = ${SRCS:.c=.o} diff --git a/bacnet-stack/demo/epics/main.c b/bacnet-stack/demo/epics/main.c index 754d48c4..b69882a3 100644 --- a/bacnet-stack/demo/epics/main.c +++ b/bacnet-stack/demo/epics/main.c @@ -766,7 +766,7 @@ static uint8_t Read_Properties( * In practice, this should only happen for simple devices that don't * implement RPM or have really limited MAX_APDU size. */ - Property_List_Special(pMyObject->type, &PropertyListStruct); + property_list_special(pMyObject->type, &PropertyListStruct); pPropList = PropertyListStruct.Required.pList; if (pPropList != NULL) { Property_List_Length = PropertyListStruct.Required.count; diff --git a/bacnet-stack/include/proplist.h b/bacnet-stack/include/proplist.h index 8d7155bc..a69d3b27 100644 --- a/bacnet-stack/include/proplist.h +++ b/bacnet-stack/include/proplist.h @@ -47,7 +47,9 @@ extern "C" { #endif /* __cplusplus */ -void Property_List_Special( +unsigned property_list_count( + const int *pList); +void property_list_special( BACNET_OBJECT_TYPE object_type, struct special_property_list_t *pPropertyList); diff --git a/bacnet-stack/src/proplist.c b/bacnet-stack/src/proplist.c index 26bc1942..d0615dda 100644 --- a/bacnet-stack/src/proplist.c +++ b/bacnet-stack/src/proplist.c @@ -426,6 +426,35 @@ static const int Command_Properties_Optional[] = { -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_PROFILE_NAME, + -1 +}; + static const int Load_Control_Properties_Required[] = { PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, @@ -447,13 +476,211 @@ static const int Load_Control_Properties_Required[] = { 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_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_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_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_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_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_PROFILE_NAME, + PROP_ALIGN_INTERVALS, + PROP_INTERVAL_OFFSET, + PROP_TRIGGER, + PROP_RELIABILITY, -1 }; /* Function that returns the number of properties in a list */ -static unsigned property_list_count( +unsigned property_list_count( const int *pList) { unsigned property_count = 0; @@ -471,7 +698,7 @@ static unsigned property_list_count( /* Function that returns the list of Required or Optional properties * of known standard objects. */ -void Property_List_Special( +void property_list_special( BACNET_OBJECT_TYPE object_type, struct special_property_list_t *pPropertyList) { @@ -481,68 +708,131 @@ void Property_List_Special( pPropertyList->Proprietary.pList = NULL; switch (object_type) { case OBJECT_DEVICE: - pPropertyList->Required.pList = Device_Properties_Required; - pPropertyList->Optional.pList = Device_Properties_Optional; + pPropertyList->Required.pList = + Device_Properties_Required; + pPropertyList->Optional.pList = + Device_Properties_Optional; break; break; case OBJECT_ACCUMULATOR: - pPropertyList->Required.pList = Accumulator_Properties_Required; - pPropertyList->Optional.pList = Accumulator_Properties_Optional; + pPropertyList->Required.pList = + Accumulator_Properties_Required; + pPropertyList->Optional.pList = + Accumulator_Properties_Optional; break; case OBJECT_ANALOG_INPUT: - pPropertyList->Required.pList = Analog_Input_Properties_Required; - pPropertyList->Optional.pList = Analog_Input_Properties_Optional; + pPropertyList->Required.pList = + Analog_Input_Properties_Required; + pPropertyList->Optional.pList = + Analog_Input_Properties_Optional; break; case OBJECT_ANALOG_OUTPUT: - pPropertyList->Required.pList = Analog_Output_Properties_Required; - pPropertyList->Optional.pList = Analog_Output_Properties_Optional; + pPropertyList->Required.pList = + Analog_Output_Properties_Required; + pPropertyList->Optional.pList = + Analog_Output_Properties_Optional; break; case OBJECT_ANALOG_VALUE: - pPropertyList->Required.pList = Analog_Value_Properties_Required; - pPropertyList->Optional.pList = Analog_Value_Properties_Optional; + pPropertyList->Required.pList = + Analog_Value_Properties_Required; + pPropertyList->Optional.pList = + Analog_Value_Properties_Optional; break; case OBJECT_AVERAGING: - pPropertyList->Required.pList = Averaging_Properties_Required; - pPropertyList->Optional.pList = Averaging_Properties_Optional; + pPropertyList->Required.pList = + Averaging_Properties_Required; + pPropertyList->Optional.pList = + Averaging_Properties_Optional; break; case OBJECT_BINARY_INPUT: - pPropertyList->Required.pList = Binary_Input_Properties_Required; - pPropertyList->Optional.pList = Binary_Input_Properties_Optional; + pPropertyList->Required.pList = + Binary_Input_Properties_Required; + pPropertyList->Optional.pList = + Binary_Input_Properties_Optional; break; case OBJECT_BINARY_OUTPUT: - pPropertyList->Required.pList = Binary_Output_Properties_Required; - pPropertyList->Optional.pList = Binary_Output_Properties_Optional; + pPropertyList->Required.pList = + Binary_Output_Properties_Required; + pPropertyList->Optional.pList = + Binary_Output_Properties_Optional; break; case OBJECT_BINARY_VALUE: - pPropertyList->Required.pList = Binary_Value_Properties_Required; - pPropertyList->Optional.pList = Binary_Value_Properties_Optional; + pPropertyList->Required.pList = + Binary_Value_Properties_Required; + pPropertyList->Optional.pList = + Binary_Value_Properties_Optional; break; case OBJECT_CALENDAR: - pPropertyList->Required.pList = Calendar_Properties_Required; - pPropertyList->Optional.pList = Calendar_Properties_Optional; + pPropertyList->Required.pList = + Calendar_Properties_Required; + pPropertyList->Optional.pList = + Calendar_Properties_Optional; break; case OBJECT_COMMAND: - pPropertyList->Required.pList = Command_Properties_Required; - pPropertyList->Optional.pList = Command_Properties_Optional; + pPropertyList->Required.pList = + Command_Properties_Required; + pPropertyList->Optional.pList = + Command_Properties_Optional; + break; + case OBJECT_CHARACTERSTRING_VALUE: + pPropertyList->Required.pList = + CharacterString_Value_Properties_Required; + pPropertyList->Optional.pList = + CharacterString_Value_Properties_Optional; + break; + case OBJECT_LOAD_CONTROL: + pPropertyList->Required.pList = + Load_Control_Properties_Required; + pPropertyList->Optional.pList = + Load_Control_Properties_Optional; + break; + case OBJECT_LIFE_SAFETY_POINT: + pPropertyList->Required.pList = + Life_Safety_Point_Properties_Required; + pPropertyList->Optional.pList = + Life_Safety_Point_Properties_Optional; + break; + case OBJECT_MULTI_STATE_INPUT: + pPropertyList->Required.pList = + Multistate_Input_Properties_Required; + pPropertyList->Optional.pList = + Multistate_Input_Properties_Optional; + break; + case OBJECT_MULTI_STATE_OUTPUT: + pPropertyList->Required.pList = + Multistate_Output_Properties_Required; + pPropertyList->Optional.pList = + Multistate_Output_Properties_Optional; + break; + case OBJECT_MULTI_STATE_VALUE: + pPropertyList->Required.pList = + Multistate_Value_Properties_Required; + pPropertyList->Optional.pList = + Multistate_Value_Properties_Optional; + break; + case OBJECT_NOTIFICATION_CLASS: + pPropertyList->Required.pList = + Notification_Class_Properties_Required; + pPropertyList->Optional.pList = + Notification_Class_Properties_Optional; + break; + case OBJECT_TRENDLOG: + pPropertyList->Required.pList = + Trend_Log_Properties_Required; + pPropertyList->Optional.pList = + Trend_Log_Properties_Optional; break; case OBJECT_EVENT_ENROLLMENT: case OBJECT_FILE: case OBJECT_GROUP: case OBJECT_LOOP: - case OBJECT_MULTI_STATE_INPUT: - case OBJECT_MULTI_STATE_OUTPUT: - case OBJECT_NOTIFICATION_CLASS: case OBJECT_PROGRAM: case OBJECT_SCHEDULE: - case OBJECT_MULTI_STATE_VALUE: - case OBJECT_TRENDLOG: - case OBJECT_LIFE_SAFETY_POINT: case OBJECT_LIFE_SAFETY_ZONE: case OBJECT_PULSE_CONVERTER: case OBJECT_EVENT_LOG: case OBJECT_GLOBAL_GROUP: case OBJECT_TREND_LOG_MULTIPLE: - case OBJECT_LOAD_CONTROL: case OBJECT_STRUCTURED_VIEW: case OBJECT_ACCESS_DOOR: case OBJECT_LIGHTING_OUTPUT: @@ -554,7 +844,6 @@ void Property_List_Special( case OBJECT_CREDENTIAL_DATA_INPUT: case OBJECT_NETWORK_SECURITY: case OBJECT_BITSTRING_VALUE: - case OBJECT_CHARACTERSTRING_VALUE: case OBJECT_DATE_PATTERN_VALUE: case OBJECT_DATE_VALUE: case OBJECT_DATETIME_PATTERN_VALUE: @@ -570,6 +859,7 @@ void Property_List_Special( pPropertyList->Proprietary.pList = NULL; break; default: + /* proprietary objects */ pPropertyList->Required.pList = Default_Properties_Required; pPropertyList->Optional.pList = NULL; pPropertyList->Proprietary.pList = NULL;