diff --git a/bacnet-stack/include/bo.h b/bacnet-stack/include/bo.h index 6ff591f1..a55abafe 100644 --- a/bacnet-stack/include/bo.h +++ b/bacnet-stack/include/bo.h @@ -84,6 +84,8 @@ extern "C" { bool Binary_Output_Write_Property( BACNET_WRITE_PROPERTY_DATA * wp_data); + BACNET_BINARY_PV Binary_Output_Present_Value( + uint32_t instance); bool Binary_Output_Present_Value_Set( uint32_t instance, BACNET_BINARY_PV binary_value, diff --git a/bacnet-stack/ports/bdk-atxx4-mstp/Makefile b/bacnet-stack/ports/bdk-atxx4-mstp/Makefile index e0590db7..d4e5da5d 100644 --- a/bacnet-stack/ports/bdk-atxx4-mstp/Makefile +++ b/bacnet-stack/ports/bdk-atxx4-mstp/Makefile @@ -74,7 +74,9 @@ DEMOSRC = $(BACNET_DEMO)/handler/txbuf.c \ $(BACNET_DEMO)/handler/h_wp.c \ $(BACNET_DEMO)/handler/h_rp.c \ $(BACNET_DEMO)/handler/h_rpm.c \ + $(BACNET_DEMO)/handler/h_whohas.c \ $(BACNET_DEMO)/handler/s_iam.c \ + $(BACNET_DEMO)/handler/s_ihave.c \ $(BACNET_DEMO)/handler/noserv.c # core BACnet stack files @@ -89,12 +91,14 @@ CORESRC = \ $(BACNET_CORE)/bacreal.c \ $(BACNET_CORE)/bacstr.c \ $(BACNET_CORE)/iam.c \ + $(BACNET_CORE)/ihave.c \ $(BACNET_CORE)/dcc.c \ $(BACNET_CORE)/rp.c \ $(BACNET_CORE)/rd.c \ $(BACNET_CORE)/rpm.c \ $(BACNET_CORE)/wp.c \ $(BACNET_CORE)/whois.c \ + $(BACNET_CORE)/whohas.c \ $(BACNET_CORE)/bacaddr.c \ $(BACNET_CORE)/abort.c \ $(BACNET_CORE)/reject.c \ @@ -137,8 +141,8 @@ DEFINES = OPTIMIZE_FLAGS = -mcall-prologues OPTIMIZE_FLAGS += -finline-functions-called-once # default is for debugging from AVR Studio -OPTIMIZATION = -O0 -DEBUGGING = -g +OPTIMIZATION = -Os $(OPTIMIZE_FLAGS) +DEBUGGING = ifeq (${BUILD},debug) OPTIMIZATION = -O0 DEBUGGING = -g diff --git a/bacnet-stack/ports/bdk-atxx4-mstp/PICS.odt b/bacnet-stack/ports/bdk-atxx4-mstp/PICS.odt index 4546f3c6..1af320d6 100644 Binary files a/bacnet-stack/ports/bdk-atxx4-mstp/PICS.odt and b/bacnet-stack/ports/bdk-atxx4-mstp/PICS.odt differ diff --git a/bacnet-stack/ports/bdk-atxx4-mstp/bo.c b/bacnet-stack/ports/bdk-atxx4-mstp/bo.c index f82415b0..e8d305bd 100644 --- a/bacnet-stack/ports/bdk-atxx4-mstp/bo.c +++ b/bacnet-stack/ports/bdk-atxx4-mstp/bo.c @@ -150,7 +150,7 @@ static BACNET_BINARY_PV Present_Value( return value; } -static BACNET_BINARY_PV Binary_Output_Present_Value( +BACNET_BINARY_PV Binary_Output_Present_Value( uint32_t object_instance) { unsigned index = 0; @@ -160,7 +160,7 @@ static BACNET_BINARY_PV Binary_Output_Present_Value( return Present_Value(index); } -void Binary_Output_Level_Sync( +static void Binary_Output_Level_Sync( uint32_t instance) { BACNET_BINARY_PV pv; @@ -198,19 +198,25 @@ void Binary_Output_Level_Sync( } } -void Binary_Output_Level_Set( +bool Binary_Output_Present_Value_Set( uint32_t instance, - unsigned int priority, - BACNET_BINARY_PV level) + BACNET_BINARY_PV binary_value, + unsigned priority) /* 0..15 */ { + bool status = false; + if (instance < MAX_BINARY_OUTPUTS) { if (priority < BACNET_MAX_PRIORITY) { - Binary_Output_Level[instance][priority] = (uint8_t) level; + Binary_Output_Level[instance][priority] = (uint8_t) binary_value; seeprom_bytes_write(NV_SEEPROM_BINARY_OUTPUT(instance, NV_SEEPROM_BO_PRIORITY_ARRAY_1 + priority), &Binary_Output_Level[instance][priority], 1); + Binary_Output_Level_Sync(instance); + status = true; } } + + return status; } void Binary_Output_Polarity_Set( @@ -434,10 +440,9 @@ bool Binary_Output_Write_Property( (value.type.Enumerated <= MAX_BINARY_PV)) { level = (BACNET_BINARY_PV) value.type.Enumerated; priority--; - Binary_Output_Level_Set( + Binary_Output_Present_Value_Set( wp_data->object_instance, - priority, level); - Binary_Output_Level_Sync(wp_data->object_instance); + level, priority); } else if (priority == 6) { /* Command priority 6 is reserved for use by Minimum On/Off algorithm and may not be used for other purposes in any @@ -460,10 +465,9 @@ bool Binary_Output_Write_Property( priority = wp_data->priority; if (priority && (priority <= BACNET_MAX_PRIORITY)) { priority--; - Binary_Output_Level_Set( + Binary_Output_Present_Value_Set( wp_data->object_instance, - priority, level); - Binary_Output_Level_Sync(wp_data->object_instance); + level, priority); } else if (priority == 6) { status = false; /* Command priority 6 is reserved for use by Minimum On/Off diff --git a/bacnet-stack/ports/bdk-atxx4-mstp/main.c b/bacnet-stack/ports/bdk-atxx4-mstp/main.c index 631a7b33..823b7841 100644 --- a/bacnet-stack/ports/bdk-atxx4-mstp/main.c +++ b/bacnet-stack/ports/bdk-atxx4-mstp/main.c @@ -97,7 +97,10 @@ static void bacnet_init( apdu_set_unrecognized_service_handler_handler (handler_unrecognized_service); /* we need to handle who-is to support dynamic device binding */ - apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS, handler_who_is); + apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS, + handler_who_is); + apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_HAS, + handler_who_has); /* Set the handlers for any confirmed services that we support. */ /* We must implement read property - it's required! */ apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY, @@ -187,22 +190,16 @@ void test_task( /* echo the character */ serial_byte_send(data_register); if (data_register == '0') { - Binary_Output_Level_Set(0, 1, BINARY_INACTIVE); - Binary_Output_Level_Sync(0); - Binary_Output_Level_Set(1, 1, BINARY_INACTIVE); - Binary_Output_Level_Sync(1); + Binary_Output_Present_Value_Set(0, 0, BINARY_INACTIVE); + Binary_Output_Present_Value_Set(1, 0, BINARY_INACTIVE); } if (data_register == '1') { - Binary_Output_Level_Set(0, 1, BINARY_ACTIVE); - Binary_Output_Level_Sync(0); - Binary_Output_Level_Set(1, 1, BINARY_ACTIVE); - Binary_Output_Level_Sync(1); + Binary_Output_Present_Value_Set(0, 0, BINARY_ACTIVE); + Binary_Output_Present_Value_Set(1, 0, BINARY_ACTIVE); } if (data_register == '2') { - Binary_Output_Level_Set(0, 1, BINARY_NULL); - Binary_Output_Level_Sync(0); - Binary_Output_Level_Set(1, 1, BINARY_NULL); - Binary_Output_Level_Sync(1); + Binary_Output_Present_Value_Set(0, 0, BINARY_NULL); + Binary_Output_Present_Value_Set(1, 0, BINARY_NULL); } serial_byte_send('\r'); serial_byte_send('\n');