From 94dbe3d429dc2ef8a08b1ce9dce403c76a0cc31d Mon Sep 17 00:00:00 2001 From: skarg Date: Tue, 24 Nov 2015 22:22:17 +0000 Subject: [PATCH] =?UTF-8?q?Added=20BACnetTimeValue=20functions.=20=20Added?= =?UTF-8?q?=20demo=20Schedule=20object.=20=20Integrated=20new=20objects=20?= =?UTF-8?q?with=20demo=20server=20and=20unit=20tests.=20Thank=20you,=20Nik?= =?UTF-8?q?ola=20Jeli=C4=87!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bacnet-stack/demo/object/device.c | 48 ++++++++++++ bacnet-stack/demo/object/osv.c | 105 ++++++++++++------------- bacnet-stack/demo/object/osv.h | 62 ++++++--------- bacnet-stack/demo/object/piv.c | 108 ++++++++++++------------- bacnet-stack/demo/object/piv.h | 68 ++++++---------- bacnet-stack/demo/server/Makefile | 3 + bacnet-stack/include/bactimevalue.h | 62 +++++++++++++++ bacnet-stack/lib/Makefile | 1 + bacnet-stack/src/bactimevalue.c | 117 ++++++++++++++++++++++++++++ bacnet-stack/test.mak | 5 ++ 10 files changed, 381 insertions(+), 198 deletions(-) create mode 100644 bacnet-stack/include/bactimevalue.h create mode 100644 bacnet-stack/src/bactimevalue.c diff --git a/bacnet-stack/demo/object/device.c b/bacnet-stack/demo/object/device.c index c8167f97..948ae9d6 100644 --- a/bacnet-stack/demo/object/device.c +++ b/bacnet-stack/demo/object/device.c @@ -63,6 +63,9 @@ #include "ms-input.h" #include "mso.h" #include "msv.h" +#include "osv.h" +#include "piv.h" +#include "schedule.h" #include "trendlog.h" #if defined(INTRINSIC_REPORTING) #include "nc.h" @@ -401,6 +404,51 @@ static object_functions_t My_Object_Table[] = { NULL /* COV Clear */ , NULL /* Intrinsic Reporting */ }, #endif + {OBJECT_OCTETSTRING_VALUE, + OctetString_Value_Init, + OctetString_Value_Count, + OctetString_Value_Index_To_Instance, + OctetString_Value_Valid_Instance, + OctetString_Value_Object_Name, + OctetString_Value_Read_Property, + OctetString_Value_Write_Property, + OctetString_Value_Property_Lists, + NULL /* ReadRangeInfo */ , + NULL /* Iterator */ , + NULL /* Value_Lists */ , + NULL /* COV */ , + NULL /* COV Clear */ , + NULL /* Intrinsic Reporting */ }, + {OBJECT_POSITIVE_INTEGER_VALUE, + PositiveInteger_Value_Init, + PositiveInteger_Value_Count, + PositiveInteger_Value_Index_To_Instance, + PositiveInteger_Value_Valid_Instance, + PositiveInteger_Value_Object_Name, + PositiveInteger_Value_Read_Property, + PositiveInteger_Value_Write_Property, + PositiveInteger_Value_Property_Lists, + NULL /* ReadRangeInfo */ , + NULL /* Iterator */ , + NULL /* Value_Lists */ , + NULL /* COV */ , + NULL /* COV Clear */ , + NULL /* Intrinsic Reporting */ }, + {OBJECT_SCHEDULE, + Schedule_Init, + Schedule_Count, + Schedule_Index_To_Instance, + Schedule_Valid_Instance, + Schedule_Object_Name, + Schedule_Read_Property, + Schedule_Write_Property, + Schedule_Property_Lists, + NULL /* ReadRangeInfo */ , + NULL /* Iterator */ , + NULL /* Value_Lists */ , + NULL /* COV */ , + NULL /* COV Clear */ , + NULL /* Intrinsic Reporting */ }, {MAX_BACNET_OBJECT_TYPE, NULL /* Init */ , NULL /* Count */ , diff --git a/bacnet-stack/demo/object/osv.c b/bacnet-stack/demo/object/osv.c index 4d997d76..f6131f0b 100644 --- a/bacnet-stack/demo/object/osv.c +++ b/bacnet-stack/demo/object/osv.c @@ -23,7 +23,7 @@ * *********************************************************************/ -/* Octetstring Value Objects - customize for your use */ +/* OctetString Value Objects - customize for your use */ #include #include @@ -48,7 +48,7 @@ OCTETSTRING_VALUE_DESCR AV_Descr[MAX_OCTETSTRING_VALUES]; /* These three arrays are used by the ReadPropertyMultiple handler */ -static const int Octetstring_Value_Properties_Required[] = { +static const int OctetString_Value_Properties_Required[] = { PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE, @@ -57,48 +57,45 @@ static const int Octetstring_Value_Properties_Required[] = { -1 }; -static const int Octetstring_Value_Properties_Optional[] = { +static const int OctetString_Value_Properties_Optional[] = { PROP_EVENT_STATE, PROP_OUT_OF_SERVICE, PROP_DESCRIPTION, -1 }; -static const int Octetstring_Value_Properties_Proprietary[] = { +static const int OctetString_Value_Properties_Proprietary[] = { -1 }; -void Octetstring_Value_Property_Lists( - const int **pRequired, +void OctetString_Value_Property_Lists(const int **pRequired, const int **pOptional, const int **pProprietary) { if (pRequired) - *pRequired = Octetstring_Value_Properties_Required; + *pRequired = OctetString_Value_Properties_Required; if (pOptional) - *pOptional = Octetstring_Value_Properties_Optional; + *pOptional = OctetString_Value_Properties_Optional; if (pProprietary) - *pProprietary = Octetstring_Value_Properties_Proprietary; + *pProprietary = OctetString_Value_Properties_Proprietary; return; } -void Octetstring_Value_Init( - void) +void OctetString_Value_Init(void) { - unsigned i; + unsigned i; for (i = 0; i < MAX_OCTETSTRING_VALUES; i++) { memset(&AV_Descr[i], 0x00, sizeof(OCTETSTRING_VALUE_DESCR)); - octetstring_init (&AV_Descr[i].Present_Value, NULL, 0); + octetstring_init(&AV_Descr[i].Present_Value, NULL, 0); } } /* we simply have 0-n object instances. Yours might be */ /* more complex, and then you need validate that the */ /* given instance exists */ -bool Octetstring_Value_Valid_Instance( - uint32_t object_instance) +bool OctetString_Value_Valid_Instance(uint32_t object_instance) { if (object_instance < MAX_OCTETSTRING_VALUES) return true; @@ -108,8 +105,7 @@ bool Octetstring_Value_Valid_Instance( /* we simply have 0-n object instances. Yours might be */ /* more complex, and then count how many you have */ -unsigned Octetstring_Value_Count( - void) +unsigned OctetString_Value_Count(void) { return MAX_OCTETSTRING_VALUES; } @@ -117,8 +113,7 @@ unsigned Octetstring_Value_Count( /* 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 Octetstring_Value_Index_To_Instance( - unsigned index) +uint32_t OctetString_Value_Index_To_Instance(unsigned index) { return index; } @@ -126,8 +121,7 @@ uint32_t Octetstring_Value_Index_To_Instance( /* 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 Octetstring_Value_Instance_To_Index( - uint32_t object_instance) +unsigned OctetString_Value_Instance_To_Index(uint32_t object_instance) { unsigned index = MAX_OCTETSTRING_VALUES; @@ -147,29 +141,27 @@ unsigned Octetstring_Value_Instance_To_Index( * * @return true if values are within range and present-value is set. */ -bool Octetstring_Value_Present_Value_Set( - uint32_t object_instance, +bool OctetString_Value_Present_Value_Set(uint32_t object_instance, BACNET_OCTET_STRING * value, uint8_t priority) { unsigned index = 0; bool status = false; - index = Octetstring_Value_Instance_To_Index(object_instance); + index = OctetString_Value_Instance_To_Index(object_instance); if (index < MAX_OCTETSTRING_VALUES) { - octetstring_copy (&AV_Descr[index].Present_Value, value); + octetstring_copy(&AV_Descr[index].Present_Value, value); status = true; } return status; } -BACNET_OCTET_STRING * Octetstring_Value_Present_Value( - uint32_t object_instance) +BACNET_OCTET_STRING *OctetString_Value_Present_Value(uint32_t object_instance) { - BACNET_OCTET_STRING * value = NULL; + BACNET_OCTET_STRING *value = NULL; unsigned index = 0; - index = Octetstring_Value_Instance_To_Index(object_instance); + index = OctetString_Value_Instance_To_Index(object_instance); if (index < MAX_OCTETSTRING_VALUES) { value = &AV_Descr[index].Present_Value; } @@ -178,8 +170,7 @@ BACNET_OCTET_STRING * Octetstring_Value_Present_Value( } /* note: the object name must be unique within this device */ -bool Octetstring_Value_Object_Name( - uint32_t object_instance, +bool OctetString_Value_Object_Name(uint32_t object_instance, BACNET_CHARACTER_STRING * object_name) { static char text_string[32] = ""; /* okay for single thread */ @@ -195,13 +186,12 @@ bool Octetstring_Value_Object_Name( } /* return apdu len, or BACNET_STATUS_ERROR on error */ -int Octetstring_Value_Read_Property( - BACNET_READ_PROPERTY_DATA * rpdata) +int OctetString_Value_Read_Property(BACNET_READ_PROPERTY_DATA * rpdata) { int apdu_len = 0; /* return value */ BACNET_BIT_STRING bit_string; BACNET_CHARACTER_STRING char_string; - BACNET_OCTET_STRING * real_value = NULL; + BACNET_OCTET_STRING *real_value = NULL; unsigned object_index = 0; bool state = false; uint8_t *apdu = NULL; @@ -214,7 +204,8 @@ int Octetstring_Value_Read_Property( apdu = rpdata->application_data; - object_index = Octetstring_Value_Instance_To_Index(rpdata->object_instance); + object_index = + OctetString_Value_Instance_To_Index(rpdata->object_instance); if (object_index < MAX_OCTETSTRING_VALUES) CurrentAV = &AV_Descr[object_index]; else @@ -223,24 +214,27 @@ int Octetstring_Value_Read_Property( switch (rpdata->object_property) { case PROP_OBJECT_IDENTIFIER: apdu_len = - encode_application_object_id(&apdu[0], OBJECT_OCTETSTRING_VALUE, - rpdata->object_instance); + encode_application_object_id(&apdu[0], + OBJECT_OCTETSTRING_VALUE, rpdata->object_instance); break; case PROP_OBJECT_NAME: case PROP_DESCRIPTION: - Octetstring_Value_Object_Name(rpdata->object_instance, &char_string); + OctetString_Value_Object_Name(rpdata->object_instance, + &char_string); apdu_len = encode_application_character_string(&apdu[0], &char_string); break; case PROP_OBJECT_TYPE: apdu_len = - encode_application_enumerated(&apdu[0], OBJECT_OCTETSTRING_VALUE); + encode_application_enumerated(&apdu[0], + OBJECT_OCTETSTRING_VALUE); break; case PROP_PRESENT_VALUE: - real_value = Octetstring_Value_Present_Value(rpdata->object_instance); + real_value = + OctetString_Value_Present_Value(rpdata->object_instance); apdu_len = encode_application_octet_string(&apdu[0], real_value); break; @@ -283,8 +277,7 @@ int Octetstring_Value_Read_Property( } /* returns true if successful */ -bool Octetstring_Value_Write_Property( - BACNET_WRITE_PROPERTY_DATA * wp_data) +bool OctetString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data) { bool status = false; /* return value */ unsigned int object_index = 0; @@ -311,7 +304,8 @@ bool Octetstring_Value_Write_Property( wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; return false; } - object_index = Octetstring_Value_Instance_To_Index(wp_data->object_instance); + object_index = + OctetString_Value_Instance_To_Index(wp_data->object_instance); if (object_index < MAX_OCTETSTRING_VALUES) CurrentAV = &AV_Descr[object_index]; else @@ -323,8 +317,9 @@ bool Octetstring_Value_Write_Property( /* Command priority 6 is reserved for use by Minimum On/Off algorithm and may not be used for other purposes in any object. */ - if (Octetstring_Value_Present_Value_Set(wp_data->object_instance, - &value.type.Octet_String, wp_data->priority)) { + if (OctetString_Value_Present_Value_Set(wp_data-> + object_instance, &value.type.Octet_String, + wp_data->priority)) { status = true; } else if (wp_data->priority == 6) { /* Command priority 6 is reserved for use by Minimum On/Off @@ -371,8 +366,7 @@ bool Octetstring_Value_Write_Property( } -void Octetstring_Value_Intrinsic_Reporting( - uint32_t object_instance) +void OctetString_Value_Intrinsic_Reporting(uint32_t object_instance) { } @@ -381,8 +375,7 @@ void Octetstring_Value_Intrinsic_Reporting( #include #include "ctest.h" -bool WPValidateArgType( - BACNET_APPLICATION_DATA_VALUE * pValue, +bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE * pValue, uint8_t ucExpectedTag, BACNET_ERROR_CLASS * pErrorClass, BACNET_ERROR_CODE * pErrorCode) @@ -395,8 +388,7 @@ bool WPValidateArgType( return false; } -void testOctetstring_Value( - Test * pTest) +void testOctetString_Value(Test * pTest) { BACNET_READ_PROPERTY_DATA rpdata; uint8_t apdu[MAX_APDU] = { 0 }; @@ -406,14 +398,14 @@ void testOctetstring_Value( uint16_t decoded_type = 0; uint32_t decoded_instance = 0; - Octetstring_Value_Init(); + OctetString_Value_Init(); rpdata.application_data = &apdu[0]; rpdata.application_data_len = sizeof(apdu); rpdata.object_type = OBJECT_OCTETSTRING_VALUE; rpdata.object_instance = 1; rpdata.object_property = PROP_OBJECT_IDENTIFIER; rpdata.array_index = BACNET_ARRAY_ALL; - len = Octetstring_Value_Read_Property(&rpdata); + len = OctetString_Value_Read_Property(&rpdata); 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); @@ -425,15 +417,14 @@ void testOctetstring_Value( } #ifdef TEST_OCTETSTRING_VALUE -int main( - void) +int main(void) { Test *pTest; bool rc; - pTest = ct_create("BACnet Octetstring Value", NULL); + pTest = ct_create("BACnet OctetString Value", NULL); /* individual tests */ - rc = ct_addTestFunction(pTest, testOctetstring_Value); + rc = ct_addTestFunction(pTest, testOctetString_Value); assert(rc); ct_setStream(pTest, stdout); diff --git a/bacnet-stack/demo/object/osv.h b/bacnet-stack/demo/object/osv.h index 50b6e198..b66ad5b2 100644 --- a/bacnet-stack/demo/object/osv.h +++ b/bacnet-stack/demo/object/osv.h @@ -43,68 +43,50 @@ extern "C" { } OCTETSTRING_VALUE_DESCR; - void Octetstring_Value_Property_Lists( - const int **pRequired, + void OctetString_Value_Property_Lists(const int **pRequired, const int **pOptional, const int **pProprietary); - bool Octetstring_Value_Valid_Instance( - uint32_t object_instance); - unsigned Octetstring_Value_Count( - void); - uint32_t Octetstring_Value_Index_To_Instance( - unsigned index); - unsigned Octetstring_Value_Instance_To_Index( - uint32_t object_instance); + bool OctetString_Value_Valid_Instance(uint32_t object_instance); + unsigned OctetString_Value_Count(void); + uint32_t OctetString_Value_Index_To_Instance(unsigned index); + unsigned OctetString_Value_Instance_To_Index(uint32_t object_instance); - bool Octetstring_Value_Object_Name( - uint32_t object_instance, + bool OctetString_Value_Object_Name(uint32_t object_instance, BACNET_CHARACTER_STRING * object_name); - int Octetstring_Value_Read_Property( - BACNET_READ_PROPERTY_DATA * rpdata); + int OctetString_Value_Read_Property(BACNET_READ_PROPERTY_DATA * rpdata); - bool Octetstring_Value_Write_Property( - BACNET_WRITE_PROPERTY_DATA * wp_data); + bool OctetString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * + wp_data); - bool Octetstring_Value_Present_Value_Set( - uint32_t object_instance, + bool OctetString_Value_Present_Value_Set(uint32_t object_instance, BACNET_OCTET_STRING * value, uint8_t priority); - BACNET_OCTET_STRING * Octetstring_Value_Present_Value( - uint32_t object_instance); + BACNET_OCTET_STRING *OctetString_Value_Present_Value(uint32_t + object_instance); - bool Octetstring_Value_Change_Of_Value( - uint32_t instance); - void Octetstring_Value_Change_Of_Value_Clear( - uint32_t instance); - bool Octetstring_Value_Encode_Value_List( - uint32_t object_instance, + bool OctetString_Value_Change_Of_Value(uint32_t instance); + void OctetString_Value_Change_Of_Value_Clear(uint32_t instance); + bool OctetString_Value_Encode_Value_List(uint32_t object_instance, BACNET_PROPERTY_VALUE * value_list); - char *Octetstring_Value_Description( - uint32_t instance); - bool Octetstring_Value_Description_Set( - uint32_t instance, + char *OctetString_Value_Description(uint32_t instance); + bool OctetString_Value_Description_Set(uint32_t instance, char *new_name); - bool Octetstring_Value_Out_Of_Service( - uint32_t instance); - void Octetstring_Value_Out_Of_Service_Set( - uint32_t instance, + bool OctetString_Value_Out_Of_Service(uint32_t instance); + void OctetString_Value_Out_Of_Service_Set(uint32_t instance, bool oos_flag); /* note: header of Intrinsic_Reporting function is required even when INTRINSIC_REPORTING is not defined */ - void Octetstring_Value_Intrinsic_Reporting( - uint32_t object_instance); + void OctetString_Value_Intrinsic_Reporting(uint32_t object_instance); - void Octetstring_Value_Init( - void); + void OctetString_Value_Init(void); #ifdef TEST #include "ctest.h" - void testOctetstring_Value( - Test * pTest); + void testOctetString_Value(Test * pTest); #endif #ifdef __cplusplus diff --git a/bacnet-stack/demo/object/piv.c b/bacnet-stack/demo/object/piv.c index 4e267288..a1f5d95c 100644 --- a/bacnet-stack/demo/object/piv.c +++ b/bacnet-stack/demo/object/piv.c @@ -48,44 +48,41 @@ POSITIVEINTEGER_VALUE_DESCR PIV_Descr[MAX_POSITIVEINTEGER_VALUES]; /* These three arrays are used by the ReadPropertyMultiple handler */ -static const int Positiveinteger_Value_Properties_Required[] = { +static const int PositiveInteger_Value_Properties_Required[] = { PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_STATUS_FLAGS, - PROP_UNITS - -1 + PROP_UNITS - 1 }; -static const int Positiveinteger_Value_Properties_Optional[] = { +static const int PositiveInteger_Value_Properties_Optional[] = { PROP_OUT_OF_SERVICE, -1 }; -static const int Positiveinteger_Value_Properties_Proprietary[] = { +static const int PositiveInteger_Value_Properties_Proprietary[] = { -1 }; -void Positiveinteger_Value_Property_Lists( - const int **pRequired, +void PositiveInteger_Value_Property_Lists(const int **pRequired, const int **pOptional, const int **pProprietary) { if (pRequired) - *pRequired = Positiveinteger_Value_Properties_Required; + *pRequired = PositiveInteger_Value_Properties_Required; if (pOptional) - *pOptional = Positiveinteger_Value_Properties_Optional; + *pOptional = PositiveInteger_Value_Properties_Optional; if (pProprietary) - *pProprietary = Positiveinteger_Value_Properties_Proprietary; + *pProprietary = PositiveInteger_Value_Properties_Proprietary; return; } -void Positiveinteger_Value_Init( - void) +void PositiveInteger_Value_Init(void) { - unsigned i; + unsigned i; for (i = 0; i < MAX_POSITIVEINTEGER_VALUES; i++) { memset(&PIV_Descr[i], 0x00, sizeof(POSITIVEINTEGER_VALUE_DESCR)); @@ -95,8 +92,7 @@ void Positiveinteger_Value_Init( /* we simply have 0-n object instances. Yours might be */ /* more complex, and then you need validate that the */ /* given instance exists */ -bool Positiveinteger_Value_Valid_Instance( - uint32_t object_instance) +bool PositiveInteger_Value_Valid_Instance(uint32_t object_instance) { if (object_instance < MAX_POSITIVEINTEGER_VALUES) return true; @@ -106,8 +102,7 @@ bool Positiveinteger_Value_Valid_Instance( /* we simply have 0-n object instances. Yours might be */ /* more complex, and then count how many you have */ -unsigned Positiveinteger_Value_Count( - void) +unsigned PositiveInteger_Value_Count(void) { return MAX_POSITIVEINTEGER_VALUES; } @@ -115,8 +110,7 @@ unsigned Positiveinteger_Value_Count( /* 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 Positiveinteger_Value_Index_To_Instance( - unsigned index) +uint32_t PositiveInteger_Value_Index_To_Instance(unsigned index) { return index; } @@ -124,8 +118,7 @@ uint32_t Positiveinteger_Value_Index_To_Instance( /* 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 Positiveinteger_Value_Instance_To_Index( - uint32_t object_instance) +unsigned PositiveInteger_Value_Instance_To_Index(uint32_t object_instance) { unsigned index = MAX_POSITIVEINTEGER_VALUES; @@ -145,29 +138,27 @@ unsigned Positiveinteger_Value_Instance_To_Index( * * @return true if values are within range and present-value is set. */ -bool Positiveinteger_Value_Present_Value_Set( - uint32_t object_instance, +bool PositiveInteger_Value_Present_Value_Set(uint32_t object_instance, uint32_t value, uint8_t priority) { unsigned index = 0; bool status = false; - index = Positiveinteger_Value_Instance_To_Index(object_instance); + index = PositiveInteger_Value_Instance_To_Index(object_instance); if (index < MAX_POSITIVEINTEGER_VALUES) { - PIV_Descr[index].Present_Value = value; - status = true; + PIV_Descr[index].Present_Value = value; + status = true; } return status; } -uint32_t Positiveinteger_Value_Present_Value( - uint32_t object_instance) +uint32_t PositiveInteger_Value_Present_Value(uint32_t object_instance) { uint32_t value = 0; unsigned index = 0; - index = Positiveinteger_Value_Instance_To_Index(object_instance); + index = PositiveInteger_Value_Instance_To_Index(object_instance); if (index < MAX_POSITIVEINTEGER_VALUES) { value = PIV_Descr[index].Present_Value; } @@ -176,8 +167,7 @@ uint32_t Positiveinteger_Value_Present_Value( } /* note: the object name must be unique within this device */ -bool Positiveinteger_Value_Object_Name( - uint32_t object_instance, +bool PositiveInteger_Value_Object_Name(uint32_t object_instance, BACNET_CHARACTER_STRING * object_name) { static char text_string[32] = ""; /* okay for single thread */ @@ -193,8 +183,7 @@ bool Positiveinteger_Value_Object_Name( } /* return apdu len, or BACNET_STATUS_ERROR on error */ -int Positiveinteger_Value_Read_Property( - BACNET_READ_PROPERTY_DATA * rpdata) +int PositiveInteger_Value_Read_Property(BACNET_READ_PROPERTY_DATA * rpdata) { int apdu_len = 0; /* return value */ BACNET_BIT_STRING bit_string; @@ -211,7 +200,8 @@ int Positiveinteger_Value_Read_Property( apdu = rpdata->application_data; - object_index = Positiveinteger_Value_Instance_To_Index(rpdata->object_instance); + object_index = + PositiveInteger_Value_Instance_To_Index(rpdata->object_instance); if (object_index < MAX_POSITIVEINTEGER_VALUES) CurrentAV = &PIV_Descr[object_index]; else @@ -220,23 +210,27 @@ int Positiveinteger_Value_Read_Property( switch (rpdata->object_property) { case PROP_OBJECT_IDENTIFIER: apdu_len = - encode_application_object_id(&apdu[0], OBJECT_POSITIVE_INTEGER_VALUE, - rpdata->object_instance); + encode_application_object_id(&apdu[0], + OBJECT_POSITIVE_INTEGER_VALUE, rpdata->object_instance); break; case PROP_OBJECT_NAME: - Positiveinteger_Value_Object_Name(rpdata->object_instance, &char_string); + PositiveInteger_Value_Object_Name(rpdata->object_instance, + &char_string); apdu_len = encode_application_character_string(&apdu[0], &char_string); break; case PROP_OBJECT_TYPE: apdu_len = - encode_application_enumerated(&apdu[0], OBJECT_POSITIVE_INTEGER_VALUE); + encode_application_enumerated(&apdu[0], + OBJECT_POSITIVE_INTEGER_VALUE); break; case PROP_PRESENT_VALUE: - apdu_len = encode_application_unsigned(&apdu[0], Positiveinteger_Value_Present_Value(rpdata->object_instance)); + apdu_len = + encode_application_unsigned(&apdu[0], + PositiveInteger_Value_Present_Value(rpdata->object_instance)); break; case PROP_STATUS_FLAGS: @@ -251,8 +245,9 @@ int Positiveinteger_Value_Read_Property( break; case PROP_UNITS: - apdu_len = encode_application_enumerated(&apdu[0], CurrentAV->Units); - + apdu_len = + encode_application_enumerated(&apdu[0], CurrentAV->Units); + case PROP_OUT_OF_SERVICE: state = CurrentAV->Out_Of_Service; apdu_len = encode_application_boolean(&apdu[0], state); @@ -276,8 +271,7 @@ int Positiveinteger_Value_Read_Property( } /* returns true if successful */ -bool Positiveinteger_Value_Write_Property( - BACNET_WRITE_PROPERTY_DATA * wp_data) +bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data) { bool status = false; /* return value */ unsigned int object_index = 0; @@ -304,7 +298,8 @@ bool Positiveinteger_Value_Write_Property( wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; return false; } - object_index = Positiveinteger_Value_Instance_To_Index(wp_data->object_instance); + object_index = + PositiveInteger_Value_Instance_To_Index(wp_data->object_instance); if (object_index < MAX_POSITIVEINTEGER_VALUES) CurrentAV = &PIV_Descr[object_index]; else @@ -316,8 +311,9 @@ bool Positiveinteger_Value_Write_Property( /* Command priority 6 is reserved for use by Minimum On/Off algorithm and may not be used for other purposes in any object. */ - if (Positiveinteger_Value_Present_Value_Set(wp_data->object_instance, - value.type.Unsigned_Int, wp_data->priority)) { + if (PositiveInteger_Value_Present_Value_Set(wp_data-> + object_instance, value.type.Unsigned_Int, + wp_data->priority)) { status = true; } else if (wp_data->priority == 6) { /* Command priority 6 is reserved for use by Minimum On/Off @@ -363,8 +359,7 @@ bool Positiveinteger_Value_Write_Property( } -void Positiveinteger_Value_Intrinsic_Reporting( - uint32_t object_instance) +void PositiveInteger_Value_Intrinsic_Reporting(uint32_t object_instance) { } @@ -373,8 +368,7 @@ void Positiveinteger_Value_Intrinsic_Reporting( #include #include "ctest.h" -bool WPValidateArgType( - BACNET_APPLICATION_DATA_VALUE * pValue, +bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE * pValue, uint8_t ucExpectedTag, BACNET_ERROR_CLASS * pErrorClass, BACNET_ERROR_CODE * pErrorCode) @@ -387,8 +381,7 @@ bool WPValidateArgType( return false; } -void testPositiveinteger_Value( - Test * pTest) +void testPositiveInteger_Value(Test * pTest) { BACNET_READ_PROPERTY_DATA rpdata; uint8_t apdu[MAX_APDU] = { 0 }; @@ -398,14 +391,14 @@ void testPositiveinteger_Value( uint16_t decoded_type = 0; uint32_t decoded_instance = 0; - Positiveinteger_Value_Init(); + PositiveInteger_Value_Init(); rpdata.application_data = &apdu[0]; rpdata.application_data_len = sizeof(apdu); rpdata.object_type = OBJECT_POSITIVE_INTEGER_VALUE; rpdata.object_instance = 1; rpdata.object_property = PROP_OBJECT_IDENTIFIER; rpdata.array_index = BACNET_ARRAY_ALL; - len = Positiveinteger_Value_Read_Property(&rpdata); + len = PositiveInteger_Value_Read_Property(&rpdata); 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); @@ -417,15 +410,14 @@ void testPositiveinteger_Value( } #ifdef TEST_POSITIVEINTEGER_VALUE -int main( - void) +int main(void) { Test *pTest; bool rc; - pTest = ct_create("BACnet Positiveinteger Value", NULL); + pTest = ct_create("BACnet PositiveInteger Value", NULL); /* individual tests */ - rc = ct_addTestFunction(pTest, testPositiveinteger_Value); + rc = ct_addTestFunction(pTest, testPositiveInteger_Value); assert(rc); ct_setStream(pTest, stdout); diff --git a/bacnet-stack/demo/object/piv.h b/bacnet-stack/demo/object/piv.h index e4dd6f17..85aeb167 100644 --- a/bacnet-stack/demo/object/piv.h +++ b/bacnet-stack/demo/object/piv.h @@ -37,74 +37,56 @@ extern "C" { #endif /* __cplusplus */ typedef struct positiveinteger_value_descr { - bool Out_Of_Service:1; - uint32_t Present_Value; - uint16_t Units; + bool Out_Of_Service:1; + uint32_t Present_Value; + uint16_t Units; } POSITIVEINTEGER_VALUE_DESCR; - void Positiveinteger_Value_Property_Lists( - const int **pRequired, + void PositiveInteger_Value_Property_Lists(const int **pRequired, const int **pOptional, const int **pProprietary); - bool Positiveinteger_Value_Valid_Instance( - uint32_t object_instance); - unsigned Positiveinteger_Value_Count( - void); - uint32_t Positiveinteger_Value_Index_To_Instance( - unsigned index); - unsigned Positiveinteger_Value_Instance_To_Index( - uint32_t object_instance); + bool PositiveInteger_Value_Valid_Instance(uint32_t object_instance); + unsigned PositiveInteger_Value_Count(void); + uint32_t PositiveInteger_Value_Index_To_Instance(unsigned index); + unsigned PositiveInteger_Value_Instance_To_Index(uint32_t object_instance); - bool Positiveinteger_Value_Object_Name( - uint32_t object_instance, + bool PositiveInteger_Value_Object_Name(uint32_t object_instance, BACNET_CHARACTER_STRING * object_name); - int Positiveinteger_Value_Read_Property( - BACNET_READ_PROPERTY_DATA * rpdata); + int PositiveInteger_Value_Read_Property(BACNET_READ_PROPERTY_DATA * + rpdata); - bool Positiveinteger_Value_Write_Property( - BACNET_WRITE_PROPERTY_DATA * wp_data); + bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * + wp_data); - bool Positiveinteger_Value_Present_Value_Set( - uint32_t object_instance, + bool PositiveInteger_Value_Present_Value_Set(uint32_t object_instance, uint32_t value, uint8_t priority); - uint32_t Positiveinteger_Value_Present_Value( - uint32_t object_instance); + uint32_t PositiveInteger_Value_Present_Value(uint32_t object_instance); - bool Positiveinteger_Value_Change_Of_Value( - uint32_t instance); - void Positiveinteger_Value_Change_Of_Value_Clear( - uint32_t instance); - bool Positiveinteger_Value_Encode_Value_List( - uint32_t object_instance, + bool PositiveInteger_Value_Change_Of_Value(uint32_t instance); + void PositiveInteger_Value_Change_Of_Value_Clear(uint32_t instance); + bool PositiveInteger_Value_Encode_Value_List(uint32_t object_instance, BACNET_PROPERTY_VALUE * value_list); - char *Positiveinteger_Value_Description( - uint32_t instance); - bool Positiveinteger_Value_Description_Set( - uint32_t instance, + char *PositiveInteger_Value_Description(uint32_t instance); + bool PositiveInteger_Value_Description_Set(uint32_t instance, char *new_name); - bool Positiveinteger_Value_Out_Of_Service( - uint32_t instance); - void Positiveinteger_Value_Out_Of_Service_Set( - uint32_t instance, + bool PositiveInteger_Value_Out_Of_Service(uint32_t instance); + void PositiveInteger_Value_Out_Of_Service_Set(uint32_t instance, bool oos_flag); /* note: header of Intrinsic_Reporting function is required even when INTRINSIC_REPORTING is not defined */ - void Positiveinteger_Value_Intrinsic_Reporting( - uint32_t object_instance); + void PositiveInteger_Value_Intrinsic_Reporting(uint32_t object_instance); - void Positiveinteger_Value_Init( - void); + void PositiveInteger_Value_Init(void); #ifdef TEST #include "ctest.h" - void testPositiveinteger_Value( - Test * pTest); + void testPositiveInteger_Value(Test * pTest); #endif #ifdef __cplusplus diff --git a/bacnet-stack/demo/server/Makefile b/bacnet-stack/demo/server/Makefile index 1821d680..5ced91ce 100644 --- a/bacnet-stack/demo/server/Makefile +++ b/bacnet-stack/demo/server/Makefile @@ -29,8 +29,11 @@ OBJECT_SRC = \ $(BACNET_OBJECT)/ms-input.c \ $(BACNET_OBJECT)/mso.c \ $(BACNET_OBJECT)/msv.c \ + $(BACNET_OBJECT)/osv.c \ + $(BACNET_OBJECT)/piv.c \ $(BACNET_OBJECT)/nc.c \ $(BACNET_OBJECT)/trendlog.c \ + $(BACNET_OBJECT)/schedule.c \ $(BACNET_OBJECT)/bacfile.c SRCS = ${SRC} ${OBJECT_SRC} diff --git a/bacnet-stack/include/bactimevalue.h b/bacnet-stack/include/bactimevalue.h new file mode 100644 index 00000000..13648081 --- /dev/null +++ b/bacnet-stack/include/bactimevalue.h @@ -0,0 +1,62 @@ +/************************************************************************** +* +* Copyright (C) 2015 Nikola Jelic +* +* 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 _BAC_TIME_VALUE_H_ +#define _BAC_TIME_VALUE_H_ + +#include +#include +#include +#include "bacdef.h" +#include "bacenum.h" +#include "bacapp.h" + +typedef struct { + BACNET_TIME Time; + BACNET_APPLICATION_DATA_VALUE Value; +} BACNET_TIME_VALUE; + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + int bacapp_encode_time_value(uint8_t * apdu, + BACNET_TIME_VALUE * value); + + int bacapp_encode_context_time_value(uint8_t * apdu, + uint8_t tag_number, + BACNET_TIME_VALUE * value); + + int bacapp_decode_time_value(uint8_t * apdu, + BACNET_TIME_VALUE * value); + + int bacapp_decode_context_time_value(uint8_t * apdu, + uint8_t tag_number, + BACNET_TIME_VALUE * value); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif diff --git a/bacnet-stack/lib/Makefile b/bacnet-stack/lib/Makefile index dabddd9f..b5bda394 100644 --- a/bacnet-stack/lib/Makefile +++ b/bacnet-stack/lib/Makefile @@ -34,6 +34,7 @@ CORE_SRC = \ $(BACNET_CORE)/bacapp.c \ $(BACNET_CORE)/bacprop.c \ $(BACNET_CORE)/bactext.c \ + $(BACNET_CORE)/bactimevalue.c \ $(BACNET_CORE)/datetime.c \ $(BACNET_CORE)/indtext.c \ $(BACNET_CORE)/key.c \ diff --git a/bacnet-stack/src/bactimevalue.c b/bacnet-stack/src/bactimevalue.c new file mode 100644 index 00000000..a4d7374e --- /dev/null +++ b/bacnet-stack/src/bactimevalue.c @@ -0,0 +1,117 @@ +/*####COPYRIGHTBEGIN#### + ------------------------------------------- + Copyright (C) 2015 Nikola Jelic + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + The Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA. + + As a special exception, if other files instantiate templates or + use macros or inline functions from this file, or you compile + this file and link it with other works to produce a work based + on this file, this file does not by itself cause the resulting + work to be covered by the GNU General Public License. However + the source code for this file must still be made available in + accordance with section (3) of the GNU General Public License. + + This exception does not invalidate any other reasons why a work + based on this file might be covered by the GNU General Public + License. + ------------------------------------------- +####COPYRIGHTEND####*/ + +#include +#include +#include "bacdcode.h" +#include "bactimevalue.h" + +int bacapp_encode_time_value(uint8_t * apdu, + BACNET_TIME_VALUE * value) +{ + int len; + int apdu_len = 0; + + len = encode_application_time(&apdu[apdu_len], &value->Time); + apdu_len += len; + + len = bacapp_encode_application_data(&apdu[apdu_len], &value->Value); + apdu_len += len; + + return apdu_len; +} + +int bacapp_encode_context_time_value(uint8_t * apdu, + uint8_t tag_number, + BACNET_TIME_VALUE * value) +{ + int len; + int apdu_len = 0; + + len = encode_opening_tag(&apdu[apdu_len], tag_number); + apdu_len += len; + + len = bacapp_encode_time_value(&apdu[apdu_len], value); + apdu_len += len; + + len = encode_closing_tag(&apdu[apdu_len], tag_number); + apdu_len += len; + + return apdu_len; +} + +int bacapp_decode_time_value(uint8_t * apdu, + BACNET_TIME_VALUE * value) +{ + int len; + int apdu_len = 0; + + len = decode_application_time(&apdu[apdu_len], &value->Time); + if (len <= 0) + return -1; + apdu_len += len; + + len = bacapp_decode_application_data(&apdu[apdu_len], 2048, &value->Value); + if (len <= 0) + return -1; + apdu_len += len; + + return apdu_len; +} + +int bacapp_decode_context_time_value(uint8_t * apdu, + uint8_t tag_number, + BACNET_TIME_VALUE * value) +{ + int len = 0; + int section_length; + + if (decode_is_opening_tag_number(&apdu[len], tag_number)) + len++; + else + return -1; + + section_length = bacapp_decode_time_value(&apdu[len], value); + if (section_length > 0) + len += section_length; + else + return -1; + + if (decode_is_closing_tag_number(&apdu[len], tag_number)) + len++; + else + return -1; + + return len; +} diff --git a/bacnet-stack/test.mak b/bacnet-stack/test.mak index 330cd28f..c5150c93 100644 --- a/bacnet-stack/test.mak +++ b/bacnet-stack/test.mak @@ -296,3 +296,8 @@ piv: logfile demo/object/piv.mak $(MAKE) -s -C demo/object -f piv.mak clean all ( ./demo/object/positiveinteger_value >> ${LOGFILE} ) $(MAKE) -s -C demo/object -f piv.mak clean + +schedule: logfile demo/object/schedule.mak + $(MAKE) -s -C demo/object -f schedule.mak clean all + ( ./demo/object/schedule >> ${LOGFILE} ) + $(MAKE) -s -C demo/object -f schedule.mak clean