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;