From 0ab54268fafd03b1599f54f9d7500710a284d985 Mon Sep 17 00:00:00 2001 From: skarg Date: Thu, 23 Mar 2006 19:47:38 +0000 Subject: [PATCH] Created demo Life Safety Point object. Integrated it with the demos. --- bacnet-stack/bacenum.h | 19 +- bacnet-stack/demo/dcc/Makefile | 1 + bacnet-stack/demo/dcc/makefile.b32 | 1 + bacnet-stack/demo/handler/h_rp.c | 22 ++ bacnet-stack/demo/handler/h_wp.c | 18 ++ bacnet-stack/demo/object/device.c | 37 ++- bacnet-stack/demo/object/lsp.c | 338 +++++++++++++++++++++++ bacnet-stack/demo/object/lsp.h | 60 ++++ bacnet-stack/demo/object/lsp.mak | 35 +++ bacnet-stack/demo/readfile/Makefile | 1 + bacnet-stack/demo/readfile/makefile.b32 | 1 + bacnet-stack/demo/readprop/Makefile | 1 + bacnet-stack/demo/readprop/makefile.b32 | 1 + bacnet-stack/demo/reinit/Makefile | 1 + bacnet-stack/demo/reinit/makefile.b32 | 1 + bacnet-stack/demo/server/Makefile | 1 + bacnet-stack/demo/server/makefile.b32 | 1 + bacnet-stack/demo/timesync/Makefile | 1 + bacnet-stack/demo/timesync/makefile.b32 | 1 + bacnet-stack/demo/whohas/Makefile | 1 + bacnet-stack/demo/whohas/makefile.b32 | 1 + bacnet-stack/demo/whois/Makefile | 1 + bacnet-stack/demo/whois/makefile.b32 | 1 + bacnet-stack/demo/writefile/Makefile | 1 + bacnet-stack/demo/writefile/makefile.b32 | 1 + bacnet-stack/demo/writeprop/Makefile | 1 + bacnet-stack/demo/writeprop/makefile.b32 | 1 + bacnet-stack/unittest.sh | 10 + 28 files changed, 555 insertions(+), 4 deletions(-) create mode 100644 bacnet-stack/demo/object/lsp.c create mode 100644 bacnet-stack/demo/object/lsp.h create mode 100755 bacnet-stack/demo/object/lsp.mak diff --git a/bacnet-stack/bacenum.h b/bacnet-stack/bacenum.h index 9c3a38c4..2e58e41e 100644 --- a/bacnet-stack/bacenum.h +++ b/bacnet-stack/bacenum.h @@ -574,6 +574,7 @@ typedef enum { } BACNET_FILE_ACCESS_METHOD; typedef enum { + MIN_LIFE_SAFETY_MODE = 0, LIFE_SAFETY_MODE_OFF = 0, LIFE_SAFETY_MODE_ON = 1, LIFE_SAFETY_MODE_TEST = 2, @@ -588,7 +589,8 @@ typedef enum { LIFE_SAFETY_MODE_ENABLED = 11, LIFE_SAFETY_MODE_DISABLED = 12, LIFE_SAFETY_MODE_AUTOMATIC_RELEASE_DISABLED = 13, - LIFE_SAFETY_MODE_DEFAULT = 14 + LIFE_SAFETY_MODE_DEFAULT = 14, + MAX_LIFE_SAFETY_MODE = 14 /* Enumerated values 0-255 are reserved for definition by ASHRAE. */ /* Enumerated values 256-65535 may be used by others subject to */ /* procedures and constraints described in Clause 23. */ @@ -611,6 +613,7 @@ typedef enum { } BACNET_LIFE_SAFETY_OPERATION; typedef enum { + MIN_LIFE_SAFETY_STATE = 0, LIFE_SAFETY_STATE_QUIET = 0, LIFE_SAFETY_STATE_PRE_ALARM = 1, LIFE_SAFETY_STATE_ALARM = 2, @@ -634,12 +637,24 @@ typedef enum { LIFE_SAFETY_STATE_LOCAL_ALARM = 20, LIFE_SAFETY_STATE_GENERAL_ALARM = 21, LIFE_SAFETY_STATE_SUPERVISORY = 22, - LIFE_SAFETY_STATE_TEST_SUPERVISORY = 23 + LIFE_SAFETY_STATE_TEST_SUPERVISORY = 23, + MAX_LIFE_SAFETY_STATE = 0 /* Enumerated values 0-255 are reserved for definition by ASHRAE. */ /* Enumerated values 256-65535 may be used by others subject to */ /* procedures and constraints described in Clause 23. */ } BACNET_LIFE_SAFETY_STATE; +typedef enum +{ + SILENCED_STATE_UNSILENCED = 0, + SILENCED_STATE_AUDIBLE_SILENCED = 1, + SILENCED_STATE_VISIBLE_SILENCED = 2, + SILENCED_STATE_ALL_SILENCED = 3, + /* Enumerated values 0-63 are reserved for definition by ASHRAE.*/ + /* Enumerated values 64-65535 may be used by others subject to */ + /* procedures and constraints described in Clause 23. */ +} BACNET_SILENCED_STATE; + typedef enum { MAINTENANCE_NONE = 0, MAINTENANCE_PERIODIC_TEST = 1, diff --git a/bacnet-stack/demo/dcc/Makefile b/bacnet-stack/demo/dcc/Makefile index 329f852f..a8fc1a32 100644 --- a/bacnet-stack/demo/dcc/Makefile +++ b/bacnet-stack/demo/dcc/Makefile @@ -37,6 +37,7 @@ SRCS = main.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/filename.c \ $(BACNET_ROOT)/rp.c \ diff --git a/bacnet-stack/demo/dcc/makefile.b32 b/bacnet-stack/demo/dcc/makefile.b32 index 8be81f2e..79da85d4 100644 --- a/bacnet-stack/demo/dcc/makefile.b32 +++ b/bacnet-stack/demo/dcc/makefile.b32 @@ -48,6 +48,7 @@ SRCS = main.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\tsm.c \ ..\..\address.c \ diff --git a/bacnet-stack/demo/handler/h_rp.c b/bacnet-stack/demo/handler/h_rp.c index dd5553c8..a9d33df4 100644 --- a/bacnet-stack/demo/handler/h_rp.c +++ b/bacnet-stack/demo/handler/h_rp.c @@ -41,6 +41,7 @@ #include "ao.h" #include "bi.h" #include "bo.h" +#include "lsp.h" #if BACFILE #include "bacfile.h" #endif @@ -188,6 +189,27 @@ void handler_read_property(uint8_t * service_request, } else error = true; break; + case OBJECT_LIFE_SAFETY_POINT: + if (Life_Safety_Point_Valid_Instance(data.object_instance)) { + len = Life_Safety_Point_Encode_Property_APDU(&Temp_Buf[0], + data.object_instance, + data.object_property, + data.array_index, &error_class, &error_code); + if (len >= 0) { + /* encode the APDU portion of the packet */ + data.application_data = &Temp_Buf[0]; + data.application_data_len = len; + /* FIXME: probably need a length limitation sent with encode */ + pdu_len += + rp_ack_encode_apdu(&Handler_Transmit_Buffer + [pdu_len], service_data->invoke_id, &data); + fprintf(stderr, "Sending Read Property Ack!\n"); + send = true; + } else + error = true; + } else + error = true; + break; #if BACFILE case OBJECT_FILE: if (bacfile_valid_instance(data.object_instance)) { diff --git a/bacnet-stack/demo/handler/h_wp.c b/bacnet-stack/demo/handler/h_wp.c index 29c4e91b..fde19137 100644 --- a/bacnet-stack/demo/handler/h_wp.c +++ b/bacnet-stack/demo/handler/h_wp.c @@ -41,6 +41,7 @@ #include "ao.h" #include "bi.h" #include "bo.h" +#include "lsp.h" #if BACFILE #include "bacfile.h" #endif @@ -145,6 +146,23 @@ void handler_write_property(uint8_t * service_request, fprintf(stderr, "Sending Write Access Error!\n"); } break; + case OBJECT_LIFE_SAFETY_POINT: + if (Life_Safety_Point_Write_Property(&wp_data, &error_class, + &error_code)) { + pdu_len += + encode_simple_ack(&Handler_Transmit_Buffer[pdu_len], + service_data->invoke_id, + SERVICE_CONFIRMED_WRITE_PROPERTY); + fprintf(stderr, "Sending Write Property Simple Ack!\n"); + } else { + pdu_len += + bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len], + service_data->invoke_id, + SERVICE_CONFIRMED_WRITE_PROPERTY, error_class, + error_code); + fprintf(stderr, "Sending Write Access Error!\n"); + } + break; default: pdu_len += bacerror_encode_apdu(&Handler_Transmit_Buffer[pdu_len], diff --git a/bacnet-stack/demo/object/device.c b/bacnet-stack/demo/object/device.c index 99ac8b39..eddfb853 100644 --- a/bacnet-stack/demo/object/device.c +++ b/bacnet-stack/demo/object/device.c @@ -35,6 +35,7 @@ #include "bi.h" /* object list dependency */ #include "bo.h" /* object list dependency */ #include "ao.h" /* object list dependency */ +#include "lsp.h" /* object list dependency */ #include "wp.h" /* write property handling */ #include "device.h" /* me */ #if BACFILE @@ -323,6 +324,7 @@ unsigned Device_Object_List_Count(void) count += Binary_Input_Count(); count += Binary_Output_Count(); count += Analog_Output_Count(); + count += Life_Safety_Point_Count(); #if BACFILE count += bacfile_count(); #endif @@ -388,12 +390,24 @@ bool Device_Object_List_Identifier(unsigned array_index, status = true; } } - /**/ + /* life safety point objects */ + if (!status) { + /* normalize the index since + we know it is not the previous objects */ + object_index -= Analog_Output_Count(); + /* is it a valid index for this object? */ + if (object_index < Life_Safety_Point_Count()) { + *object_type = OBJECT_LIFE_SAFETY_POINT; + *instance = Life_Safety_Point_Index_To_Instance(object_index); + status = true; + } + } + /* file objects */ #if BACFILE if (!status) { /* normalize the index since we know it is not the previous objects */ - object_index -= Analog_Output_Count(); + object_index -= Life_Safety_Point_Count(); /* is it a valid index for this object? */ if (object_index < bacfile_count()) { *object_type = OBJECT_FILE; @@ -453,6 +467,9 @@ char *Device_Valid_Object_Id(int object_type, uint32_t object_instance) case OBJECT_ANALOG_OUTPUT: name = Analog_Output_Name(object_instance); break; + case OBJECT_LIFE_SAFETY_POINT: + name = Analog_Output_Name(object_instance); + break; #if BACFILE case OBJECT_FILE: name = bacfile_name(object_instance); @@ -871,6 +888,22 @@ uint32_t Analog_Output_Index_To_Instance(unsigned index) return index; } +char *Life_Safety_Point_Name(uint32_t object_instance) +{ + (void) object_instance; + return ""; +} + +unsigned Life_Safety_Point_Count(void) +{ + return 0; +} + +uint32_t Life_Safety_Point_Index_To_Instance(unsigned index) +{ + return index; +} + uint32_t bacfile_count(void) { return 0; diff --git a/bacnet-stack/demo/object/lsp.c b/bacnet-stack/demo/object/lsp.c new file mode 100644 index 00000000..691e6521 --- /dev/null +++ b/bacnet-stack/demo/object/lsp.c @@ -0,0 +1,338 @@ +/************************************************************************** +* +* Copyright (C) 2005 Steve Karg +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*********************************************************************/ + +/* Life Safety Point Objects - customize for your use */ + +#include +#include +#include +#include "bacdef.h" +#include "bacdcode.h" +#include "bacenum.h" +#include "config.h" /* the custom stuff */ +#include "wp.h" + +#define MAX_LIFE_SAFETY_POINTS 7 + +/* Here are our stored levels.*/ +static BACNET_LIFE_SAFETY_MODE + Life_Safety_Point_Mode[MAX_LIFE_SAFETY_POINTS]; +static BACNET_LIFE_SAFETY_STATE + Life_Safety_Point_State[MAX_LIFE_SAFETY_POINTS]; +static BACNET_SILENCED_STATE + Life_Safety_Point_Silenced_State[MAX_LIFE_SAFETY_POINTS]; +static BACNET_LIFE_SAFETY_OPERATION + Life_Safety_Point_Operation[MAX_LIFE_SAFETY_POINTS]; +/* Writable out-of-service allows others to play with our Present Value */ +/* without changing the physical output */ +static bool Life_Safety_Point_Out_Of_Service[MAX_LIFE_SAFETY_POINTS]; + +void Life_Safety_Point_Init(void) +{ + static bool initialized = false; + unsigned i; + + if (!initialized) { + initialized = true; + + /* initialize all the analog output priority arrays to NULL */ + for (i = 0; i < MAX_LIFE_SAFETY_POINTS; i++) { + Life_Safety_Point_Mode[i] = LIFE_SAFETY_MODE_DEFAULT; + Life_Safety_Point_State[i] = LIFE_SAFETY_STATE_QUIET; + Life_Safety_Point_Silenced_State[i] = SILENCED_STATE_UNSILENCED; + Life_Safety_Point_Operation[i] = LIFE_SAFETY_OPERATION_NONE; + } + } + + return; +} + +/* we simply have 0-n object instances. Yours might be */ +/* more complex, and then you need validate that the */ +/* given instance exists */ +bool Life_Safety_Point_Valid_Instance(uint32_t object_instance) +{ + Life_Safety_Point_Init(); + if (object_instance < MAX_LIFE_SAFETY_POINTS) + return true; + + return false; +} + +/* we simply have 0-n object instances. Yours might be */ +/* more complex, and then count how many you have */ +unsigned Life_Safety_Point_Count(void) +{ + Life_Safety_Point_Init(); + return MAX_LIFE_SAFETY_POINTS; +} + +/* we simply have 0-n object instances. Yours might be */ +/* more complex, and then you need to return the instance */ +/* that correlates to the correct index */ +uint32_t Life_Safety_Point_Index_To_Instance(unsigned index) +{ + Life_Safety_Point_Init(); + return index; +} + +/* we simply have 0-n object instances. Yours might be */ +/* more complex, and then you need to return the index */ +/* that correlates to the correct instance number */ +unsigned Life_Safety_Point_Instance_To_Index(uint32_t object_instance) +{ + unsigned index = MAX_LIFE_SAFETY_POINTS; + + Life_Safety_Point_Init(); + if (object_instance < MAX_LIFE_SAFETY_POINTS) + index = object_instance; + + return index; +} + +static BACNET_LIFE_SAFETY_STATE Life_Safety_Point_Present_Value(uint32_t object_instance) +{ + BACNET_LIFE_SAFETY_STATE present_value = LIFE_SAFETY_STATE_QUIET; + unsigned index = 0; + + Life_Safety_Point_Init(); + index = Life_Safety_Point_Instance_To_Index(object_instance); + if (index < MAX_LIFE_SAFETY_POINTS) + present_value = Life_Safety_Point_State[index]; + + return present_value; +} + +/* note: the object name must be unique within this device */ +char *Life_Safety_Point_Name(uint32_t object_instance) +{ + static char text_string[32] = ""; /* okay for single thread */ + + if (object_instance < MAX_LIFE_SAFETY_POINTS) { + sprintf(text_string, "LS POINT %u", object_instance); + return text_string; + } + + return NULL; +} + +/* return apdu len, or -1 on error */ +int Life_Safety_Point_Encode_Property_APDU(uint8_t * apdu, + uint32_t object_instance, + BACNET_PROPERTY_ID property, + int32_t array_index, + BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code) +{ + int len = 0; + int apdu_len = 0; /* return value */ + BACNET_BIT_STRING bit_string; + BACNET_CHARACTER_STRING char_string; + BACNET_LIFE_SAFETY_STATE present_value = LIFE_SAFETY_STATE_QUIET; + BACNET_LIFE_SAFETY_MODE mode = LIFE_SAFETY_MODE_DEFAULT; + BACNET_SILENCED_STATE silenced_state = SILENCED_STATE_UNSILENCED; + BACNET_LIFE_SAFETY_OPERATION operation = LIFE_SAFETY_OPERATION_NONE; + unsigned object_index = 0; + bool state = false; + BACNET_RELIABILITY reliability = RELIABILITY_NO_FAULT_DETECTED; + + Life_Safety_Point_Init(); + switch (property) { + case PROP_OBJECT_IDENTIFIER: + apdu_len = encode_tagged_object_id(&apdu[0], OBJECT_LIFE_SAFETY_POINT, + object_instance); + break; + case PROP_OBJECT_NAME: + case PROP_DESCRIPTION: + characterstring_init_ansi(&char_string, + Life_Safety_Point_Name(object_instance)); + apdu_len = encode_tagged_character_string(&apdu[0], &char_string); + break; + case PROP_OBJECT_TYPE: + apdu_len = + encode_tagged_enumerated(&apdu[0], OBJECT_LIFE_SAFETY_POINT); + break; + case PROP_PRESENT_VALUE: + present_value = Life_Safety_Point_Present_Value(object_instance); + apdu_len = encode_tagged_enumerated(&apdu[0], present_value); + break; + case PROP_STATUS_FLAGS: + bitstring_init(&bit_string); + bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false); + bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false); + bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false); + bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE, false); + apdu_len = encode_tagged_bitstring(&apdu[0], &bit_string); + break; + case PROP_EVENT_STATE: + apdu_len = encode_tagged_enumerated(&apdu[0], EVENT_STATE_NORMAL); + break; + case PROP_OUT_OF_SERVICE: + object_index = Life_Safety_Point_Instance_To_Index(object_instance); + state = Life_Safety_Point_Out_Of_Service[object_index]; + apdu_len = encode_tagged_boolean(&apdu[0], state); + break; + case PROP_RELIABILITY: + /* see standard for details about this property */ + reliability = RELIABILITY_NO_FAULT_DETECTED; + apdu_len = encode_tagged_enumerated(&apdu[0], reliability); + break; + case PROP_MODE: + object_index = Life_Safety_Point_Instance_To_Index(object_instance); + mode = Life_Safety_Point_Mode[object_index]; + apdu_len = encode_tagged_enumerated(&apdu[0], mode); + break; + case PROP_ACCEPTED_MODES: + for (mode = MIN_LIFE_SAFETY_MODE; mode < MAX_LIFE_SAFETY_MODE; mode++) + { + len = encode_tagged_enumerated(&apdu[apdu_len], mode); + apdu_len += len; + } + break; + case PROP_SILENCED: + object_index = Life_Safety_Point_Instance_To_Index(object_instance); + silenced_state = Life_Safety_Point_Silenced_State[object_index]; + apdu_len = encode_tagged_enumerated(&apdu[0], silenced_state); + break; + case PROP_OPERATION_EXPECTED: + object_index = Life_Safety_Point_Instance_To_Index(object_instance); + operation = Life_Safety_Point_Operation[object_index]; + apdu_len = encode_tagged_enumerated(&apdu[0], operation); + break; + default: + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_UNKNOWN_PROPERTY; + apdu_len = -1; + break; + } + + return apdu_len; +} + +/* returns true if successful */ +bool Life_Safety_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data, + BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code) +{ + bool status = false; /* return value */ + unsigned int object_index = 0; + + Life_Safety_Point_Init(); + if (!Life_Safety_Point_Valid_Instance(wp_data->object_instance)) { + *error_class = ERROR_CLASS_OBJECT; + *error_code = ERROR_CODE_UNKNOWN_OBJECT; + return false; + } + /* decode the some of the request */ + switch (wp_data->object_property) { + case PROP_MODE: + if (wp_data->value.tag == BACNET_APPLICATION_TAG_ENUMERATED) { + if ((wp_data->value.type.Enumerated >= MIN_LIFE_SAFETY_MODE) && + (wp_data->value.type.Enumerated <= MIN_LIFE_SAFETY_MODE)) { + object_index = Life_Safety_Point_Instance_To_Index(wp_data->object_instance); + Life_Safety_Point_Mode[object_index] = wp_data->value.type.Enumerated; + status = true; + } else { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + } + } else { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_INVALID_DATA_TYPE; + } + break; + case PROP_OUT_OF_SERVICE: + if (wp_data->value.tag == BACNET_APPLICATION_TAG_BOOLEAN) { + object_index = + Life_Safety_Point_Instance_To_Index(wp_data->object_instance); + Life_Safety_Point_Out_Of_Service[object_index] = + wp_data->value.type.Boolean; + status = true; + } else { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_INVALID_DATA_TYPE; + } + break; + default: + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + break; + } + + return status; +} + + +#ifdef TEST +#include +#include +#include "ctest.h" + +void testAnalogOutput(Test * pTest) +{ + uint8_t apdu[MAX_APDU] = { 0 }; + int len = 0; + uint32_t len_value = 0; + uint8_t tag_number = 0; + BACNET_OBJECT_TYPE decoded_type = OBJECT_LIFE_SAFETY_POINT; + uint32_t decoded_instance = 0; + uint32_t instance = 123; + BACNET_ERROR_CLASS error_class; + BACNET_ERROR_CODE error_code; + + + len = Life_Safety_Point_Encode_Property_APDU(&apdu[0], + instance, + PROP_OBJECT_IDENTIFIER, + BACNET_ARRAY_ALL, &error_class, &error_code); + ct_test(pTest, len != 0); + len = decode_tag_number_and_value(&apdu[0], &tag_number, &len_value); + ct_test(pTest, tag_number == BACNET_APPLICATION_TAG_OBJECT_ID); + len = decode_object_id(&apdu[len], + (int *) &decoded_type, &decoded_instance); + ct_test(pTest, decoded_type == OBJECT_LIFE_SAFETY_POINT); + ct_test(pTest, decoded_instance == instance); + + return; +} + +#ifdef TEST_ANALOG_OUTPUT +int main(void) +{ + Test *pTest; + bool rc; + + pTest = ct_create("BACnet Analog Output", NULL); + /* individual tests */ + rc = ct_addTestFunction(pTest, testAnalogOutput); + assert(rc); + + ct_setStream(pTest, stdout); + ct_run(pTest); + (void) ct_report(pTest); + ct_destroy(pTest); + + return 0; +} +#endif /* TEST_ANALOG_INPUT */ +#endif /* TEST */ diff --git a/bacnet-stack/demo/object/lsp.h b/bacnet-stack/demo/object/lsp.h new file mode 100644 index 00000000..2b1cedc3 --- /dev/null +++ b/bacnet-stack/demo/object/lsp.h @@ -0,0 +1,60 @@ +/************************************************************************** +* +* Copyright (C) 2005 Steve Karg +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*********************************************************************/ +#ifndef LSP_H +#define LSP_H + +#include +#include +#include "bacdef.h" +#include "bacerror.h" +#include "wp.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + bool Life_Safety_Point_Valid_Instance(uint32_t object_instance); + unsigned Life_Safety_Point_Count(void); + uint32_t Life_Safety_Point_Index_To_Instance(unsigned index); + char *Life_Safety_Point_Name(uint32_t object_instance); + + int Life_Safety_Point_Encode_Property_APDU(uint8_t * apdu, + uint32_t object_instance, + BACNET_PROPERTY_ID property, + int32_t array_index, + BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code); + + bool Life_Safety_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data, + BACNET_ERROR_CLASS * error_class, BACNET_ERROR_CODE * error_code); + +#ifdef TEST +#include "ctest.h" + void testAnalogOutput(Test * pTest); +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif diff --git a/bacnet-stack/demo/object/lsp.mak b/bacnet-stack/demo/object/lsp.mak new file mode 100755 index 00000000..f2abab97 --- /dev/null +++ b/bacnet-stack/demo/object/lsp.mak @@ -0,0 +1,35 @@ +#Makefile to build test case +CC = gcc +BASEDIR = . +#CFLAGS = -Wall -I. +# -g for debugging with gdb +#CFLAGS = -Wall -I. -g +CFLAGS = -Wall -I. -Itest -DTEST -DTEST_LIFE_SAFETY_POINT -g + +# NOTE: this file is normally called by the unittest.sh from up directory +SRCS = bacdcode.c \ + bacstr.c \ + bigend.c \ + demo/object/lsp.c \ + test/ctest.c + +OBJS = ${SRCS:.c=.o} + +TARGET = lsp + +all: ${TARGET} + +${TARGET}: ${OBJS} + ${CC} -o $@ ${OBJS} + +.c.o: + ${CC} -c ${CFLAGS} $*.c -o $@ + +depend: + rm -f .depend + ${CC} -MM ${CFLAGS} *.c >> .depend + +clean: + rm -rf core ${TARGET} $(OBJS) *.bak *.1 *.ini + +include: .depend diff --git a/bacnet-stack/demo/readfile/Makefile b/bacnet-stack/demo/readfile/Makefile index 9262f707..dc72aba9 100644 --- a/bacnet-stack/demo/readfile/Makefile +++ b/bacnet-stack/demo/readfile/Makefile @@ -46,6 +46,7 @@ SRCS = readfile.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/arf.c \ $(BACNET_ROOT)/dcc.c \ diff --git a/bacnet-stack/demo/readfile/makefile.b32 b/bacnet-stack/demo/readfile/makefile.b32 index e83535cb..068175c4 100644 --- a/bacnet-stack/demo/readfile/makefile.b32 +++ b/bacnet-stack/demo/readfile/makefile.b32 @@ -44,6 +44,7 @@ SRCS = readfile.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\tsm.c \ ..\..\address.c \ diff --git a/bacnet-stack/demo/readprop/Makefile b/bacnet-stack/demo/readprop/Makefile index e49120f3..b2d6dbe7 100644 --- a/bacnet-stack/demo/readprop/Makefile +++ b/bacnet-stack/demo/readprop/Makefile @@ -36,6 +36,7 @@ SRCS = readprop.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/filename.c \ $(BACNET_ROOT)/rp.c \ diff --git a/bacnet-stack/demo/readprop/makefile.b32 b/bacnet-stack/demo/readprop/makefile.b32 index dcaf2191..ae62183a 100644 --- a/bacnet-stack/demo/readprop/makefile.b32 +++ b/bacnet-stack/demo/readprop/makefile.b32 @@ -48,6 +48,7 @@ SRCS = readprop.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\tsm.c \ ..\..\address.c \ diff --git a/bacnet-stack/demo/reinit/Makefile b/bacnet-stack/demo/reinit/Makefile index 5f06c17c..46e14f11 100644 --- a/bacnet-stack/demo/reinit/Makefile +++ b/bacnet-stack/demo/reinit/Makefile @@ -36,6 +36,7 @@ SRCS = main.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/filename.c \ $(BACNET_ROOT)/rp.c \ diff --git a/bacnet-stack/demo/reinit/makefile.b32 b/bacnet-stack/demo/reinit/makefile.b32 index d3e61ee4..fe12b896 100644 --- a/bacnet-stack/demo/reinit/makefile.b32 +++ b/bacnet-stack/demo/reinit/makefile.b32 @@ -48,6 +48,7 @@ SRCS = main.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\tsm.c \ ..\..\address.c \ diff --git a/bacnet-stack/demo/server/Makefile b/bacnet-stack/demo/server/Makefile index 97020d21..8c33e64b 100644 --- a/bacnet-stack/demo/server/Makefile +++ b/bacnet-stack/demo/server/Makefile @@ -39,6 +39,7 @@ SRCS = server.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/datalink.c \ $(BACNET_ROOT)/filename.c \ diff --git a/bacnet-stack/demo/server/makefile.b32 b/bacnet-stack/demo/server/makefile.b32 index 43139574..a31ff36a 100644 --- a/bacnet-stack/demo/server/makefile.b32 +++ b/bacnet-stack/demo/server/makefile.b32 @@ -56,6 +56,7 @@ SRCS = server.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\abort.c \ ..\..\reject.c \ diff --git a/bacnet-stack/demo/timesync/Makefile b/bacnet-stack/demo/timesync/Makefile index aa1cc2e0..044f8257 100644 --- a/bacnet-stack/demo/timesync/Makefile +++ b/bacnet-stack/demo/timesync/Makefile @@ -36,6 +36,7 @@ SRCS = main.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/filename.c \ $(BACNET_ROOT)/rp.c \ diff --git a/bacnet-stack/demo/timesync/makefile.b32 b/bacnet-stack/demo/timesync/makefile.b32 index 6f8751dc..5c5e5eef 100644 --- a/bacnet-stack/demo/timesync/makefile.b32 +++ b/bacnet-stack/demo/timesync/makefile.b32 @@ -38,6 +38,7 @@ SRCS = main.c \ $(BACNET_OBJECT)\ao.c \ $(BACNET_OBJECT)\bi.c \ $(BACNET_OBJECT)\bo.c \ + $(BACNET_OBJECT)\lsp.c \ $(BACNET_ROOT)\address.c \ $(BACNET_ROOT)\filename.c \ $(BACNET_ROOT)\bacdcode.c \ diff --git a/bacnet-stack/demo/whohas/Makefile b/bacnet-stack/demo/whohas/Makefile index b40fec12..11d6a4f6 100644 --- a/bacnet-stack/demo/whohas/Makefile +++ b/bacnet-stack/demo/whohas/Makefile @@ -36,6 +36,7 @@ SRCS = main.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/filename.c \ $(BACNET_ROOT)/rp.c \ diff --git a/bacnet-stack/demo/whohas/makefile.b32 b/bacnet-stack/demo/whohas/makefile.b32 index 112959fd..afa66ff2 100644 --- a/bacnet-stack/demo/whohas/makefile.b32 +++ b/bacnet-stack/demo/whohas/makefile.b32 @@ -50,6 +50,7 @@ SRCS = main.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\abort.c \ ..\..\reject.c \ diff --git a/bacnet-stack/demo/whois/Makefile b/bacnet-stack/demo/whois/Makefile index 8585d6da..f468bd9e 100644 --- a/bacnet-stack/demo/whois/Makefile +++ b/bacnet-stack/demo/whois/Makefile @@ -37,6 +37,7 @@ SRCS = main.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/filename.c \ $(BACNET_ROOT)/rp.c \ diff --git a/bacnet-stack/demo/whois/makefile.b32 b/bacnet-stack/demo/whois/makefile.b32 index 0055fd7a..fa0c6f6e 100644 --- a/bacnet-stack/demo/whois/makefile.b32 +++ b/bacnet-stack/demo/whois/makefile.b32 @@ -37,6 +37,7 @@ SRCS = main.c \ $(BACNET_OBJECT)\ao.c \ $(BACNET_OBJECT)\bi.c \ $(BACNET_OBJECT)\bo.c \ + $(BACNET_OBJECT)\lsp.c \ $(BACNET_ROOT)\address.c \ $(BACNET_ROOT)\filename.c \ $(BACNET_ROOT)\bacdcode.c \ diff --git a/bacnet-stack/demo/writefile/Makefile b/bacnet-stack/demo/writefile/Makefile index c3d8ce9a..dbc581ea 100644 --- a/bacnet-stack/demo/writefile/Makefile +++ b/bacnet-stack/demo/writefile/Makefile @@ -46,6 +46,7 @@ SRCS = writefile.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/arf.c \ $(BACNET_ROOT)/awf.c \ diff --git a/bacnet-stack/demo/writefile/makefile.b32 b/bacnet-stack/demo/writefile/makefile.b32 index 8a302b25..3c38576f 100644 --- a/bacnet-stack/demo/writefile/makefile.b32 +++ b/bacnet-stack/demo/writefile/makefile.b32 @@ -44,6 +44,7 @@ SRCS = writefile.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\tsm.c \ ..\..\address.c \ diff --git a/bacnet-stack/demo/writeprop/Makefile b/bacnet-stack/demo/writeprop/Makefile index 8f31704c..728a86b3 100644 --- a/bacnet-stack/demo/writeprop/Makefile +++ b/bacnet-stack/demo/writeprop/Makefile @@ -35,6 +35,7 @@ SRCS = writeprop.c \ $(BACNET_OBJECT)/ao.c \ $(BACNET_OBJECT)/bi.c \ $(BACNET_OBJECT)/bo.c \ + $(BACNET_OBJECT)/lsp.c \ $(BACNET_OBJECT)/bacfile.c \ $(BACNET_ROOT)/filename.c \ $(BACNET_ROOT)/rp.c \ diff --git a/bacnet-stack/demo/writeprop/makefile.b32 b/bacnet-stack/demo/writeprop/makefile.b32 index a4d9ff35..b18bde60 100644 --- a/bacnet-stack/demo/writeprop/makefile.b32 +++ b/bacnet-stack/demo/writeprop/makefile.b32 @@ -47,6 +47,7 @@ SRCS = writeprop.c \ ..\..\demo\object\ao.c \ ..\..\demo\object\bi.c \ ..\..\demo\object\bo.c \ + ..\..\demo\object\lsp.c \ ..\..\datalink.c \ ..\..\tsm.c \ ..\..\address.c \ diff --git a/bacnet-stack/unittest.sh b/bacnet-stack/unittest.sh index 0c4f6990..c63162ce 100755 --- a/bacnet-stack/unittest.sh +++ b/bacnet-stack/unittest.sh @@ -64,6 +64,11 @@ make -f demo/object/bi.mak ./binary_input >> test.log make -f demo/object/bi.mak clean +make -f demo/object/bo.mak clean +make -f demo/object/bo.mak +./binary_output >> test.log +make -f demo/object/bo.mak clean + make -f crc.mak clean make -f crc.mak ./crc >> test.log @@ -89,6 +94,11 @@ make -f indtext.mak ./indtext >> test.log make -f indtext.mak clean +make -f demo/object/lsp.mak clean +make -f demo/object/lsp.mak +./lsp >> test.log +make -f demo/object/lsp.mak clean + make -f mstp.mak clean make -f mstp.mak ./mstp >> test.log