diff --git a/ports/at91sam7s/device.c b/ports/at91sam7s/device.c index 3ed3b225..26dc3fed 100644 --- a/ports/at91sam7s/device.c +++ b/ports/at91sam7s/device.c @@ -37,6 +37,7 @@ #include "rs485.h" #include "bacnet/version.h" #include "bacnet/basic/services.h" +#include "bacnet/proplist.h" /* objects */ #include "bacnet/basic/object/device.h" #include "bacnet/basic/object/ai.h" @@ -138,6 +139,9 @@ static int Read_Property_Common( int apdu_len = BACNET_STATUS_ERROR; BACNET_CHARACTER_STRING char_string; uint8_t *apdu = NULL; +#if (BACNET_PROTOCOL_REVISION >= 14) + struct special_property_list_t property_list; +#endif if ((rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { @@ -188,6 +192,19 @@ static int Read_Property_Common( &apdu[0], rpdata->object_type); } break; +#if (BACNET_PROTOCOL_REVISION >= 14) + case PROP_PROPERTY_LIST: + Device_Objects_Property_List( + rpdata->object_type, + rpdata->object_instance, + &property_list); + apdu_len = property_list_encode( + rpdata, + property_list.Required.pList, + property_list.Optional.pList, + property_list.Proprietary.pList); + break; +#endif default: if (pObject->Object_Read_Property) { apdu_len = pObject->Object_Read_Property(rpdata); diff --git a/ports/bdk-atxx4-mstp/Makefile b/ports/bdk-atxx4-mstp/Makefile index 5933554f..1f3caca6 100644 --- a/ports/bdk-atxx4-mstp/Makefile +++ b/ports/bdk-atxx4-mstp/Makefile @@ -130,6 +130,7 @@ CORESRC = \ $(BACNET_CORE)/ihave.c \ $(BACNET_CORE)/memcopy.c \ $(BACNET_CORE)/npdu.c \ + $(BACNET_CORE)/proplist.c \ $(BACNET_CORE)/rd.c \ $(BACNET_CORE)/reject.c \ $(BACNET_CORE)/rp.c \ diff --git a/ports/bdk-atxx4-mstp/bacnet.cproj b/ports/bdk-atxx4-mstp/bacnet.cproj index f3dfd7a2..99e48e43 100644 --- a/ports/bdk-atxx4-mstp/bacnet.cproj +++ b/ports/bdk-atxx4-mstp/bacnet.cproj @@ -353,6 +353,10 @@ compile BACnet Core\npdu.c + + compile + BACnet Core\npdu.c + compile BACnet Core\rd.c diff --git a/ports/bdk-atxx4-mstp/bacnet.ewp b/ports/bdk-atxx4-mstp/bacnet.ewp index ae9bde2b..394090e4 100644 --- a/ports/bdk-atxx4-mstp/bacnet.ewp +++ b/ports/bdk-atxx4-mstp/bacnet.ewp @@ -2235,6 +2235,9 @@ $PROJ_DIR$\..\..\src\bacnet\npdu.c + + $PROJ_DIR$\..\..\src\bacnet\proplist.c + $PROJ_DIR$\..\..\src\bacnet\rd.c diff --git a/ports/bdk-atxx4-mstp/bacnet.hzp b/ports/bdk-atxx4-mstp/bacnet.hzp index 6f1f7a1a..0d8cc710 100644 --- a/ports/bdk-atxx4-mstp/bacnet.hzp +++ b/ports/bdk-atxx4-mstp/bacnet.hzp @@ -67,6 +67,7 @@ + diff --git a/ports/bdk-atxx4-mstp/device.c b/ports/bdk-atxx4-mstp/device.c index 84a269d9..3de366f6 100644 --- a/ports/bdk-atxx4-mstp/device.c +++ b/ports/bdk-atxx4-mstp/device.c @@ -39,6 +39,7 @@ #include "stack.h" #include "bacnet/basic/services.h" #include "bname.h" +#include "bacnet/proplist.h" /* objects */ #include "bacnet/basic/object/device.h" #include "bacnet/basic/object/ai.h" @@ -136,7 +137,9 @@ int Device_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) { int apdu_len = BACNET_STATUS_ERROR; struct my_object_functions *pObject = NULL; - +#if (BACNET_PROTOCOL_REVISION >= 14) + struct special_property_list_t property_list; +#endif /* initialize the default return values */ rpdata->error_class = ERROR_CLASS_OBJECT; rpdata->error_code = ERROR_CODE_UNKNOWN_OBJECT; @@ -145,7 +148,20 @@ int Device_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) if (pObject->Object_Valid_Instance && pObject->Object_Valid_Instance(rpdata->object_instance)) { if (pObject->Object_Read_Property) { - apdu_len = pObject->Object_Read_Property(rpdata); +#if (BACNET_PROTOCOL_REVISION >= 14) + if ((int)rpdata->object_property == PROP_PROPERTY_LIST) { + Device_Objects_Property_List(rpdata->object_type, + rpdata->object_instance, + &property_list); + apdu_len = property_list_encode(rpdata, + property_list.Required.pList, + property_list.Optional.pList, + property_list.Proprietary.pList); + } else +#endif + { + apdu_len = pObject->Object_Read_Property(rpdata); + } } } } diff --git a/ports/rx62n/device.c b/ports/rx62n/device.c index 9f19b4b5..7a32c954 100644 --- a/ports/rx62n/device.c +++ b/ports/rx62n/device.c @@ -41,6 +41,7 @@ #include "bacnet/basic/services.h" #include "bacnet/datalink/datalink.h" #include "bacnet/basic/binding/address.h" +#include "bacnet/proplist.h" /* os specfic includes */ #include "bacnet/basic/sys/mstimer.h" /* objects */ @@ -129,6 +130,9 @@ static int Read_Property_Common( BACNET_CHARACTER_STRING char_string; char *pString = ""; uint8_t *apdu = NULL; +#if (BACNET_PROTOCOL_REVISION >= 14) + struct special_property_list_t property_list; +#endif if ((rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { @@ -157,6 +161,19 @@ static int Read_Property_Common( apdu_len = encode_application_enumerated(&apdu[0], rpdata->object_type); break; +#if (BACNET_PROTOCOL_REVISION >= 14) + case PROP_PROPERTY_LIST: + Device_Objects_Property_List( + rpdata->object_type, + rpdata->object_instance, + &property_list); + apdu_len = property_list_encode( + rpdata, + property_list.Required.pList, + property_list.Optional.pList, + property_list.Proprietary.pList); + break; +#endif default: if (pObject->Object_Read_Property) { apdu_len = pObject->Object_Read_Property(rpdata); diff --git a/ports/stm32f10x/bacnet.ewp b/ports/stm32f10x/bacnet.ewp index d2c3ff5e..eb684b8b 100644 --- a/ports/stm32f10x/bacnet.ewp +++ b/ports/stm32f10x/bacnet.ewp @@ -1101,6 +1101,9 @@ $PROJ_DIR$\..\..\src\bacnet\proplist.c + + $PROJ_DIR$\..\..\src\bacnet\proplist.c + $PROJ_DIR$\..\..\src\bacnet\rd.c diff --git a/ports/stm32f10x/device.c b/ports/stm32f10x/device.c index a02de167..8afd246a 100644 --- a/ports/stm32f10x/device.c +++ b/ports/stm32f10x/device.c @@ -37,6 +37,7 @@ #include "rs485.h" #include "bacnet/version.h" #include "bacnet/basic/services.h" +#include "bacnet/proplist.h" /* objects */ #include "bacnet/basic/object/device.h" #include "bacnet/basic/object/bo.h" @@ -118,6 +119,9 @@ static int Read_Property_Common( int apdu_len = BACNET_STATUS_ERROR; BACNET_CHARACTER_STRING char_string; uint8_t *apdu = NULL; +#if (BACNET_PROTOCOL_REVISION >= 14) + struct special_property_list_t property_list; +#endif if ((rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { @@ -168,6 +172,19 @@ static int Read_Property_Common( &apdu[0], rpdata->object_type); } break; +#if (BACNET_PROTOCOL_REVISION >= 14) + case PROP_PROPERTY_LIST: + Device_Objects_Property_List( + rpdata->object_type, + rpdata->object_instance, + &property_list); + apdu_len = property_list_encode( + rpdata, + property_list.Required.pList, + property_list.Optional.pList, + property_list.Proprietary.pList); + break; +#endif default: if (pObject->Object_Read_Property) { apdu_len = pObject->Object_Read_Property(rpdata); @@ -319,7 +336,8 @@ bool Device_Set_Object_Name(BACNET_CHARACTER_STRING *object_name) return status; } -bool Device_Reinitialize(BACNET_REINITIALIZE_DEVICE_DATA *rd_data) +bool Device_Reinitialize( + BACNET_REINITIALIZE_DEVICE_DATA * rd_data) { bool status = false; diff --git a/src/bacnet/basic/object/client/device-client.c b/src/bacnet/basic/object/client/device-client.c index 47dde0a0..d4ca1c4b 100644 --- a/src/bacnet/basic/object/client/device-client.c +++ b/src/bacnet/basic/object/client/device-client.c @@ -47,6 +47,7 @@ #include "bacnet/basic/services.h" #include "bacnet/datalink/datalink.h" #include "bacnet/basic/binding/address.h" +#include "bacnet/proplist.h" #if (BACNET_PROTOCOL_REVISION >= 17) #include "bacnet/basic/object/netport.h" #endif @@ -114,7 +115,7 @@ static object_functions_t Object_Table[] = { Device_Count, Device_Index_To_Instance, Device_Valid_Object_Instance_Number, Device_Object_Name, Device_Read_Property_Local, NULL /* Write_Property */, - NULL /* Property_Lists */, NULL /* ReadRangeInfo */, + Device_Property_Lists, NULL /* ReadRangeInfo */, NULL /* Iterator */, NULL /* Value_Lists */, NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */ }, #if (BACNET_PROTOCOL_REVISION >= 17) @@ -1004,6 +1005,9 @@ int Device_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) { int apdu_len = BACNET_STATUS_ERROR; struct object_functions *pObject = NULL; +#if (BACNET_PROTOCOL_REVISION >= 14) + struct special_property_list_t property_list; +#endif /* initialize the default return values */ rpdata->error_class = ERROR_CLASS_OBJECT; @@ -1013,7 +1017,19 @@ int Device_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) if (pObject->Object_Valid_Instance && pObject->Object_Valid_Instance(rpdata->object_instance)) { if (pObject->Object_Read_Property) { - apdu_len = pObject->Object_Read_Property(rpdata); +#if (BACNET_PROTOCOL_REVISION >= 14) + if ((int)rpdata->object_property == PROP_PROPERTY_LIST) { + Device_Objects_Property_List(rpdata->object_type, + rpdata->object_instance, &property_list); + apdu_len = property_list_encode(rpdata, + property_list.Required.pList, + property_list.Optional.pList, + property_list.Proprietary.pList); + } else +#endif + { + apdu_len = pObject->Object_Read_Property(rpdata); + } } } else { rpdata->error_class = ERROR_CLASS_OBJECT;