Feature/write property type check refactor (#182)
* refactor write-property tag check * modify ports objects to use write-property tag check API * modify example objects to use write-property tag check API * Fix object unit test builds * Fix and run unit ztests via CMake * Enable unit testing on Travis CI Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
@@ -44,10 +44,10 @@ jobs:
|
|||||||
# Execute the build. You can specify a specific target with "--target <NAME>"
|
# Execute the build. You can specify a specific target with "--target <NAME>"
|
||||||
run: cmake --build . --config $BUILD_TYPE
|
run: cmake --build . --config $BUILD_TYPE
|
||||||
|
|
||||||
# TODO: add tests to the pipeline
|
- name: Test
|
||||||
# - name: Test
|
# Use a bash shell to execute tests in the pipeline
|
||||||
# working-directory: ${{runner.workspace}}/build
|
working-directory: ${{runner.workspace}}/build
|
||||||
# shell: bash
|
shell: bash
|
||||||
# # Execute tests defined by the CMake configuration.
|
# Execute tests defined by the CMake configuration.
|
||||||
# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||||
# run: make tests && ./tests
|
run: make test
|
||||||
|
|||||||
+4
-2
@@ -30,10 +30,12 @@ jobs:
|
|||||||
- i686-w64-mingw32-gcc --version
|
- i686-w64-mingw32-gcc --version
|
||||||
script:
|
script:
|
||||||
- make win32
|
- make win32
|
||||||
- stage: demos-build-cmake
|
- stage: demos-test-build-cmake
|
||||||
os: linux
|
os: linux
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
script: mkdir build && cd build && cmake .. -DBUILD_SHARED_LIBS=ON && cmake --build . --clean-first
|
script:
|
||||||
|
- mkdir build && cd build && cmake .. -DBUILD_SHARED_LIBS=ON && cmake --build . --clean-first
|
||||||
|
- make test
|
||||||
- stage: gateway-build
|
- stage: gateway-build
|
||||||
os: linux
|
os: linux
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
|
|||||||
@@ -172,7 +172,6 @@ add_library(${PROJECT_NAME}
|
|||||||
src/bacnet/basic/object/lo.h
|
src/bacnet/basic/object/lo.h
|
||||||
src/bacnet/basic/object/lsp.c
|
src/bacnet/basic/object/lsp.c
|
||||||
src/bacnet/basic/object/lsp.h
|
src/bacnet/basic/object/lsp.h
|
||||||
src/bacnet/basic/object/Makefile
|
|
||||||
src/bacnet/basic/object/ms-input.c
|
src/bacnet/basic/object/ms-input.c
|
||||||
src/bacnet/basic/object/ms-input.h
|
src/bacnet/basic/object/ms-input.h
|
||||||
src/bacnet/basic/object/mso.c
|
src/bacnet/basic/object/mso.c
|
||||||
|
|||||||
+22
-122
@@ -1134,8 +1134,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_OBJECT_ID,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_OBJECT_ID);
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
||||||
(Device_Set_Object_Instance_Number(
|
(Device_Set_Object_Instance_Number(
|
||||||
@@ -1150,36 +1150,32 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
apdu_retries_set((uint8_t)value.type.Unsigned_Int);
|
apdu_retries_set((uint8_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_APDU_TIMEOUT:
|
case PROP_APDU_TIMEOUT:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
apdu_timeout_set((uint16_t)value.type.Unsigned_Int);
|
apdu_timeout_set((uint16_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_VENDOR_IDENTIFIER:
|
case PROP_VENDOR_IDENTIFIER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
Device_Set_Vendor_Identifier((uint16_t)value.type.Unsigned_Int);
|
Device_Set_Vendor_Identifier((uint16_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_SYSTEM_STATUS:
|
case PROP_SYSTEM_STATUS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
temp = Device_Set_System_Status(
|
temp = Device_Set_System_Status(
|
||||||
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
||||||
@@ -1196,9 +1192,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
status = WPValidateString(&value,
|
status = write_property_string_valid(&wp_data, &value,
|
||||||
characterstring_capacity(&My_Object_Name), false,
|
characterstring_capacity(&My_Object_Name));
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* All the object names in a device must be unique */
|
/* All the object names in a device must be unique */
|
||||||
if (Device_Valid_Object_Name(&value.type.Character_String,
|
if (Device_Valid_Object_Name(&value.type.Character_String,
|
||||||
@@ -1218,8 +1213,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_LOCATION:
|
case PROP_LOCATION:
|
||||||
status = WPValidateString(&value, MAX_DEV_LOC_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_LOC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Location(
|
Device_Set_Location(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1228,8 +1223,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_DESCRIPTION:
|
case PROP_DESCRIPTION:
|
||||||
status = WPValidateString(&value, MAX_DEV_DESC_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_DESC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Description(
|
Device_Set_Description(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1237,8 +1232,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MODEL_NAME:
|
case PROP_MODEL_NAME:
|
||||||
status = WPValidateString(&value, MAX_DEV_MOD_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_MOD_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Model_Name(
|
Device_Set_Model_Name(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1248,9 +1243,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
case PROP_MAX_INFO_FRAMES:
|
case PROP_MAX_INFO_FRAMES:
|
||||||
#if defined(BACDL_MSTP)
|
#if defined(BACDL_MSTP)
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Unsigned_Int <= 255) {
|
if (value.type.Unsigned_Int <= 255) {
|
||||||
dlmstp_set_max_info_frames(
|
dlmstp_set_max_info_frames(
|
||||||
@@ -1265,9 +1259,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#endif
|
#endif
|
||||||
case PROP_MAX_MASTER:
|
case PROP_MAX_MASTER:
|
||||||
#if defined(BACDL_MSTP)
|
#if defined(BACDL_MSTP)
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Unsigned_Int > 0) &&
|
if ((value.type.Unsigned_Int > 0) &&
|
||||||
(value.type.Unsigned_Int <= 127)) {
|
(value.type.Unsigned_Int <= 127)) {
|
||||||
@@ -1585,96 +1578,3 @@ void Routing_Device_Init(uint32_t first_object_instance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* BAC_ROUTING */
|
#endif /* BAC_ROUTING */
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WPValidateString(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
int iMaxLen,
|
|
||||||
bool bEmptyAllowed,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
iMaxLen = iMaxLen;
|
|
||||||
bEmptyAllowed = bEmptyAllowed;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int handler_cov_encode_subscriptions(uint8_t *apdu, int max_apdu)
|
|
||||||
{
|
|
||||||
apdu = apdu;
|
|
||||||
max_apdu = max_apdu;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testDevice(Test *pTest)
|
|
||||||
{
|
|
||||||
bool status = false;
|
|
||||||
const char *name = "Patricia";
|
|
||||||
|
|
||||||
status = Device_Set_Object_Instance_Number(0);
|
|
||||||
ct_test(pTest, Device_Object_Instance_Number() == 0);
|
|
||||||
ct_test(pTest, status == true);
|
|
||||||
status = Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
|
|
||||||
ct_test(pTest, Device_Object_Instance_Number() == BACNET_MAX_INSTANCE);
|
|
||||||
ct_test(pTest, status == true);
|
|
||||||
status = Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE / 2);
|
|
||||||
ct_test(
|
|
||||||
pTest, Device_Object_Instance_Number() == (BACNET_MAX_INSTANCE / 2));
|
|
||||||
ct_test(pTest, status == true);
|
|
||||||
status = Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE + 1);
|
|
||||||
ct_test(
|
|
||||||
pTest, Device_Object_Instance_Number() != (BACNET_MAX_INSTANCE + 1));
|
|
||||||
ct_test(pTest, status == false);
|
|
||||||
|
|
||||||
Device_Set_System_Status(STATUS_NON_OPERATIONAL, true);
|
|
||||||
ct_test(pTest, Device_System_Status() == STATUS_NON_OPERATIONAL);
|
|
||||||
|
|
||||||
ct_test(pTest, Device_Vendor_Identifier() == BACNET_VENDOR_ID);
|
|
||||||
|
|
||||||
Device_Set_Model_Name(name, strlen(name));
|
|
||||||
ct_test(pTest, strcmp(Device_Model_Name(), name) == 0);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_DEVICE
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Device", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testDevice);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_DEVICE */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -338,8 +338,8 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
if (status) {
|
if (status) {
|
||||||
status =
|
status =
|
||||||
Analog_Value_Present_Value_Set(wp_data->object_instance,
|
Analog_Value_Present_Value_Set(wp_data->object_instance,
|
||||||
@@ -360,9 +360,8 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
#if 0
|
#if 0
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
object_index =
|
object_index =
|
||||||
Analog_Value_Instance_To_Index(wp_data->object_instance);
|
Analog_Value_Instance_To_Index(wp_data->object_instance);
|
||||||
@@ -372,9 +371,8 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#endif
|
#endif
|
||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
#if 0
|
#if 0
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
object_index =
|
object_index =
|
||||||
Analog_Value_Instance_To_Index(wp_data->object_instance);
|
Analog_Value_Instance_To_Index(wp_data->object_instance);
|
||||||
|
|||||||
@@ -392,9 +392,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
@@ -420,8 +419,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
level = BINARY_NULL;
|
level = BINARY_NULL;
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
@@ -445,17 +444,16 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Binary_Output_Out_Of_Service_Set(
|
Binary_Output_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_POLARITY:
|
case PROP_POLARITY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Enumerated < MAX_POLARITY) {
|
if (value.type.Enumerated < MAX_POLARITY) {
|
||||||
Binary_Output_Polarity_Set(wp_data->object_instance,
|
Binary_Output_Polarity_Set(wp_data->object_instance,
|
||||||
|
|||||||
+22
-112
@@ -629,9 +629,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch ((int)wp_data->object_property) {
|
switch ((int)wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (CurrentAI->Out_Of_Service == true) {
|
if (CurrentAI->Out_Of_Service == true) {
|
||||||
Analog_Input_Present_Value_Set(
|
Analog_Input_Present_Value_Set(
|
||||||
@@ -645,8 +644,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Analog_Input_Out_Of_Service_Set(
|
Analog_Input_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -654,17 +653,16 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Units = value.type.Enumerated;
|
CurrentAI->Units = value.type.Enumerated;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_COV_INCREMENT:
|
case PROP_COV_INCREMENT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Real >= 0.0) {
|
if (value.type.Real >= 0.0) {
|
||||||
Analog_Input_COV_Increment_Set(
|
Analog_Input_COV_Increment_Set(
|
||||||
@@ -679,10 +677,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
#if defined(INTRINSIC_REPORTING)
|
#if defined(INTRINSIC_REPORTING)
|
||||||
case PROP_TIME_DELAY:
|
case PROP_TIME_DELAY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Time_Delay = value.type.Unsigned_Int;
|
CurrentAI->Time_Delay = value.type.Unsigned_Int;
|
||||||
CurrentAI->Remaining_Time_Delay = CurrentAI->Time_Delay;
|
CurrentAI->Remaining_Time_Delay = CurrentAI->Time_Delay;
|
||||||
@@ -690,28 +686,24 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_NOTIFICATION_CLASS:
|
case PROP_NOTIFICATION_CLASS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Notification_Class = value.type.Unsigned_Int;
|
CurrentAI->Notification_Class = value.type.Unsigned_Int;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_HIGH_LIMIT:
|
case PROP_HIGH_LIMIT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->High_Limit = value.type.Real;
|
CurrentAI->High_Limit = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_LOW_LIMIT:
|
case PROP_LOW_LIMIT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Low_Limit = value.type.Real;
|
CurrentAI->Low_Limit = value.type.Real;
|
||||||
}
|
}
|
||||||
@@ -720,17 +712,14 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
case PROP_DEADBAND:
|
case PROP_DEADBAND:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
&wp_data->error_class, &wp_data->error_code);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Deadband = value.type.Real;
|
CurrentAI->Deadband = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_LIMIT_ENABLE:
|
case PROP_LIMIT_ENABLE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BIT_STRING,
|
BACNET_APPLICATION_TAG_BIT_STRING);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Bit_String.bits_used == 2) {
|
if (value.type.Bit_String.bits_used == 2) {
|
||||||
CurrentAI->Limit_Enable = value.type.Bit_String.value[0];
|
CurrentAI->Limit_Enable = value.type.Bit_String.value[0];
|
||||||
@@ -743,10 +732,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_EVENT_ENABLE:
|
case PROP_EVENT_ENABLE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BIT_STRING,
|
BACNET_APPLICATION_TAG_BIT_STRING);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Bit_String.bits_used == 3) {
|
if (value.type.Bit_String.bits_used == 3) {
|
||||||
CurrentAI->Event_Enable = value.type.Bit_String.value[0];
|
CurrentAI->Event_Enable = value.type.Bit_String.value[0];
|
||||||
@@ -759,10 +746,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_NOTIFY_TYPE:
|
case PROP_NOTIFY_TYPE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) {
|
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) {
|
||||||
case NOTIFY_EVENT:
|
case NOTIFY_EVENT:
|
||||||
@@ -1324,78 +1309,3 @@ int Analog_Input_Alarm_Summary(
|
|||||||
return -1; /* end of list */
|
return -1; /* end of list */
|
||||||
}
|
}
|
||||||
#endif /* defined(INTRINSIC_REPORTING) */
|
#endif /* defined(INTRINSIC_REPORTING) */
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
bool bResult;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* start out assuming success and only set up error
|
|
||||||
* response if validation fails.
|
|
||||||
*/
|
|
||||||
bResult = true;
|
|
||||||
if (pValue->tag != ucExpectedTag) {
|
|
||||||
bResult = false;
|
|
||||||
*pErrorClass = ERROR_CLASS_PROPERTY;
|
|
||||||
*pErrorCode = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAnalogInput(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Analog_Input_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ANALOG_INPUT;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Analog_Input_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ANALOG_INPUT
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Analog Input", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAnalogInput);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ANALOG_INPUT */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
+4
-71
@@ -392,8 +392,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
level = BINARY_NULL;
|
level = BINARY_NULL;
|
||||||
object_index = Binary_Output_Instance_To_Index(
|
object_index = Binary_Output_Instance_To_Index(
|
||||||
@@ -418,8 +418,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
object_index =
|
object_index =
|
||||||
Binary_Output_Instance_To_Index(wp_data->object_instance);
|
Binary_Output_Instance_To_Index(wp_data->object_instance);
|
||||||
@@ -448,70 +448,3 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testBinaryOutput(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Binary_Output_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_BINARY_OUTPUT;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Binary_Output_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_BINARY_OUTPUT
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Binary Output", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testBinaryOutput);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_BINARY_INPUT */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
+34
-138
@@ -1254,8 +1254,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_OBJECT_ID,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_OBJECT_ID);
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
||||||
(Device_Set_Object_Instance_Number(
|
(Device_Set_Object_Instance_Number(
|
||||||
@@ -1270,36 +1270,32 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
apdu_retries_set((uint8_t)value.type.Unsigned_Int);
|
apdu_retries_set((uint8_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_APDU_TIMEOUT:
|
case PROP_APDU_TIMEOUT:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
apdu_timeout_set((uint16_t)value.type.Unsigned_Int);
|
apdu_timeout_set((uint16_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_VENDOR_IDENTIFIER:
|
case PROP_VENDOR_IDENTIFIER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
Device_Set_Vendor_Identifier((uint16_t)value.type.Unsigned_Int);
|
Device_Set_Vendor_Identifier((uint16_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_SYSTEM_STATUS:
|
case PROP_SYSTEM_STATUS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
temp = Device_Set_System_Status(
|
temp = Device_Set_System_Status(
|
||||||
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
||||||
@@ -1316,9 +1312,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
status = WPValidateString(&value,
|
status = write_property_string_valid(&wp_data, &value,
|
||||||
characterstring_capacity(&My_Object_Name), false,
|
characterstring_capacity(&My_Object_Name));
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* All the object names in a device must be unique */
|
/* All the object names in a device must be unique */
|
||||||
if (Device_Valid_Object_Name(&value.type.Character_String,
|
if (Device_Valid_Object_Name(&value.type.Character_String,
|
||||||
@@ -1338,8 +1333,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_LOCATION:
|
case PROP_LOCATION:
|
||||||
status = WPValidateString(&value, MAX_DEV_LOC_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_LOC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Location(
|
Device_Set_Location(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1348,8 +1343,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_DESCRIPTION:
|
case PROP_DESCRIPTION:
|
||||||
status = WPValidateString(&value, MAX_DEV_DESC_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_DESC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Description(
|
Device_Set_Description(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1357,8 +1352,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MODEL_NAME:
|
case PROP_MODEL_NAME:
|
||||||
status = WPValidateString(&value, MAX_DEV_MOD_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_MOD_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Model_Name(
|
Device_Set_Model_Name(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1367,7 +1362,9 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
#if defined(BACNET_TIME_MASTER)
|
#if defined(BACNET_TIME_MASTER)
|
||||||
case PROP_TIME_SYNCHRONIZATION_INTERVAL:
|
case PROP_TIME_SYNCHRONIZATION_INTERVAL:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if (value.type.Unsigned_Int < 65535) {
|
if (value.type.Unsigned_Int < 65535) {
|
||||||
minutes = value.type.Unsigned_Int;
|
minutes = value.type.Unsigned_Int;
|
||||||
Device_Time_Sync_Interval_Set(minutes);
|
Device_Time_Sync_Interval_Set(minutes);
|
||||||
@@ -1376,22 +1373,20 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_ALIGN_INTERVALS:
|
case PROP_ALIGN_INTERVALS:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
|
if (status) {
|
||||||
Device_Align_Intervals_Set(value.type.Boolean);
|
Device_Align_Intervals_Set(value.type.Boolean);
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_INTERVAL_OFFSET:
|
case PROP_INTERVAL_OFFSET:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if (value.type.Unsigned_Int < 65535) {
|
if (value.type.Unsigned_Int < 65535) {
|
||||||
minutes = value.type.Unsigned_Int;
|
minutes = value.type.Unsigned_Int;
|
||||||
Device_Interval_Offset_Set(minutes);
|
Device_Interval_Offset_Set(minutes);
|
||||||
@@ -1400,9 +1395,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
@@ -1414,7 +1406,9 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case PROP_UTC_OFFSET:
|
case PROP_UTC_OFFSET:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_SIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_SIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if ((value.type.Signed_Int < (12 * 60)) &&
|
if ((value.type.Signed_Int < (12 * 60)) &&
|
||||||
(value.type.Signed_Int > (-12 * 60))) {
|
(value.type.Signed_Int > (-12 * 60))) {
|
||||||
Device_UTC_Offset_Set(value.type.Signed_Int);
|
Device_UTC_Offset_Set(value.type.Signed_Int);
|
||||||
@@ -1423,16 +1417,12 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if defined(BACDL_MSTP)
|
#if defined(BACDL_MSTP)
|
||||||
case PROP_MAX_INFO_FRAMES:
|
case PROP_MAX_INFO_FRAMES:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Unsigned_Int <= 255) {
|
if (value.type.Unsigned_Int <= 255) {
|
||||||
dlmstp_set_max_info_frames(
|
dlmstp_set_max_info_frames(
|
||||||
@@ -1445,9 +1435,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_MASTER:
|
case PROP_MAX_MASTER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Unsigned_Int > 0) &&
|
if ((value.type.Unsigned_Int > 0) &&
|
||||||
(value.type.Unsigned_Int <= 127)) {
|
(value.type.Unsigned_Int <= 127)) {
|
||||||
@@ -1781,96 +1770,3 @@ void Routing_Device_Init(uint32_t first_object_instance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* BAC_ROUTING */
|
#endif /* BAC_ROUTING */
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WPValidateString(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
int iMaxLen,
|
|
||||||
bool bEmptyAllowed,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
iMaxLen = iMaxLen;
|
|
||||||
bEmptyAllowed = bEmptyAllowed;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int handler_cov_encode_subscriptions(uint8_t *apdu, int max_apdu)
|
|
||||||
{
|
|
||||||
apdu = apdu;
|
|
||||||
max_apdu = max_apdu;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testDevice(Test *pTest)
|
|
||||||
{
|
|
||||||
bool status = false;
|
|
||||||
const char *name = "Patricia";
|
|
||||||
|
|
||||||
status = Device_Set_Object_Instance_Number(0);
|
|
||||||
ct_test(pTest, Device_Object_Instance_Number() == 0);
|
|
||||||
ct_test(pTest, status == true);
|
|
||||||
status = Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
|
|
||||||
ct_test(pTest, Device_Object_Instance_Number() == BACNET_MAX_INSTANCE);
|
|
||||||
ct_test(pTest, status == true);
|
|
||||||
status = Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE / 2);
|
|
||||||
ct_test(
|
|
||||||
pTest, Device_Object_Instance_Number() == (BACNET_MAX_INSTANCE / 2));
|
|
||||||
ct_test(pTest, status == true);
|
|
||||||
status = Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE + 1);
|
|
||||||
ct_test(
|
|
||||||
pTest, Device_Object_Instance_Number() != (BACNET_MAX_INSTANCE + 1));
|
|
||||||
ct_test(pTest, status == false);
|
|
||||||
|
|
||||||
Device_Set_System_Status(STATUS_NON_OPERATIONAL, true);
|
|
||||||
ct_test(pTest, Device_System_Status() == STATUS_NON_OPERATIONAL);
|
|
||||||
|
|
||||||
ct_test(pTest, Device_Vendor_Identifier() == BACNET_VENDOR_ID);
|
|
||||||
|
|
||||||
Device_Set_Model_Name(name, strlen(name));
|
|
||||||
ct_test(pTest, strcmp(Device_Model_Name(), name) == 0);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_DEVICE
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Device", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testDevice);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_DEVICE */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
+8
-10
@@ -365,9 +365,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
@@ -393,8 +392,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
level = BINARY_NULL;
|
level = BINARY_NULL;
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
@@ -418,17 +417,16 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Binary_Output_Out_Of_Service_Set(
|
Binary_Output_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_POLARITY:
|
case PROP_POLARITY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Enumerated < MAX_POLARITY) {
|
if (value.type.Enumerated < MAX_POLARITY) {
|
||||||
Binary_Output_Polarity_Set(wp_data->object_instance,
|
Binary_Output_Polarity_Set(wp_data->object_instance,
|
||||||
|
|||||||
+10
-11
@@ -805,8 +805,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_OBJECT_ID,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_OBJECT_ID);
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
||||||
(Device_Set_Object_Instance_Number(
|
(Device_Set_Object_Instance_Number(
|
||||||
@@ -821,9 +821,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_SYSTEM_STATUS:
|
case PROP_SYSTEM_STATUS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
temp = Device_Set_System_Status(
|
temp = Device_Set_System_Status(
|
||||||
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
||||||
@@ -840,8 +839,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
status = WPValidateString(&value, MAX_DEV_NAME_LEN, false,
|
status = write_property_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_NAME_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Object_Name(
|
Device_Set_Object_Name(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -849,8 +848,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_LOCATION:
|
case PROP_LOCATION:
|
||||||
status = WPValidateString(&value, MAX_DEV_LOC_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_LOC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Location(
|
Device_Set_Location(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -859,8 +858,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_DESCRIPTION:
|
case PROP_DESCRIPTION:
|
||||||
status = WPValidateString(&value, MAX_DEV_DESC_LEN, true,
|
status = write_property_empty_string_valid(&wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_DESC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Description(
|
Device_Set_Description(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
|
|||||||
+8
-10
@@ -370,9 +370,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
@@ -398,8 +397,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
level = BINARY_NULL;
|
level = BINARY_NULL;
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
@@ -423,17 +422,16 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Binary_Output_Out_Of_Service_Set(
|
Binary_Output_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_POLARITY:
|
case PROP_POLARITY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Enumerated < MAX_POLARITY) {
|
if (value.type.Enumerated < MAX_POLARITY) {
|
||||||
Binary_Output_Polarity_Set(wp_data->object_instance,
|
Binary_Output_Polarity_Set(wp_data->object_instance,
|
||||||
|
|||||||
+6
-7
@@ -287,8 +287,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch ((int)wp_data->object_property) {
|
switch ((int)wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
if (status) {
|
if (status) {
|
||||||
if (Analog_Input_Out_Of_Service(wp_data->object_instance)) {
|
if (Analog_Input_Out_Of_Service(wp_data->object_instance)) {
|
||||||
Analog_Input_Present_Value_Set(
|
Analog_Input_Present_Value_Set(
|
||||||
@@ -301,17 +301,16 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Analog_Input_Out_Of_Service_Set(
|
Analog_Input_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
Analog_Input_Out_Of_Service_Set(
|
Analog_Input_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Enumerated);
|
wp_data->object_instance, value.type.Enumerated);
|
||||||
|
|||||||
@@ -1,151 +0,0 @@
|
|||||||
# Unit tests for the BACnet Stack project
|
|
||||||
|
|
||||||
LOGFILE = test.log
|
|
||||||
|
|
||||||
all: accumulator ai ao av bi bo bv csv lc lo lsp \
|
|
||||||
mso msv ms-input netport osv piv command \
|
|
||||||
access_credential access_door access_point access_rights \
|
|
||||||
access_user access_zone credential_data_input
|
|
||||||
|
|
||||||
clean: logfile
|
|
||||||
rm ${LOGFILE}
|
|
||||||
|
|
||||||
logfile:
|
|
||||||
touch ${LOGFILE}
|
|
||||||
|
|
||||||
report:
|
|
||||||
cat ${LOGFILE}
|
|
||||||
|
|
||||||
accumulator: logfile acc.mak
|
|
||||||
$(MAKE) -s -f acc.mak clean all
|
|
||||||
( ./accumulator >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f acc.mak clean
|
|
||||||
|
|
||||||
access_credential: logfile access_credential.mak
|
|
||||||
$(MAKE) -s -f access_credential.mak clean all
|
|
||||||
( ./access_credential >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f access_credential.mak clean
|
|
||||||
|
|
||||||
access_door: logfile access_door.mak
|
|
||||||
$(MAKE) -s -f access_door.mak clean all
|
|
||||||
( ./access_door >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f access_door.mak clean
|
|
||||||
|
|
||||||
access_point: logfile access_point.mak
|
|
||||||
$(MAKE) -s -f access_point.mak clean all
|
|
||||||
( ./access_point >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f access_point.mak clean
|
|
||||||
|
|
||||||
access_rights: logfile access_rights.mak
|
|
||||||
$(MAKE) -s -f access_rights.mak clean all
|
|
||||||
( ./access_rights >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f access_rights.mak clean
|
|
||||||
|
|
||||||
access_user: logfile access_user.mak
|
|
||||||
$(MAKE) -s -f access_user.mak clean all
|
|
||||||
( ./access_user >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f access_user.mak clean
|
|
||||||
|
|
||||||
access_zone: logfile access_zone.mak
|
|
||||||
$(MAKE) -s -f access_zone.mak clean all
|
|
||||||
( ./access_zone >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f access_zone.mak clean
|
|
||||||
|
|
||||||
credential_data_input: logfile credential_data_input.mak
|
|
||||||
$(MAKE) -s -f credential_data_input.mak clean all
|
|
||||||
( ./credential_data_input >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f credential_data_input.mak clean
|
|
||||||
|
|
||||||
ai: logfile ai.mak
|
|
||||||
$(MAKE) -s -f ai.mak clean all
|
|
||||||
( ./analog_input >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f ai.mak clean
|
|
||||||
|
|
||||||
ao: logfile ao.mak
|
|
||||||
$(MAKE) -s -f ao.mak clean all
|
|
||||||
( ./analog_output >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f ao.mak clean
|
|
||||||
|
|
||||||
av: logfile av.mak
|
|
||||||
$(MAKE) -s -f av.mak clean all
|
|
||||||
( ./analog_value >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f av.mak clean
|
|
||||||
|
|
||||||
bi: logfile bi.mak
|
|
||||||
$(MAKE) -s -f bi.mak clean all
|
|
||||||
$(MAKE) -s -f bi.mak clean
|
|
||||||
|
|
||||||
bo: logfile bo.mak
|
|
||||||
$(MAKE) -s -f bo.mak clean all
|
|
||||||
( ./binary_output >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f bo.mak clean
|
|
||||||
|
|
||||||
bv: logfile bv.mak
|
|
||||||
$(MAKE) -s -f bv.mak clean all
|
|
||||||
( ./binary_value >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f bv.mak clean
|
|
||||||
|
|
||||||
command: logfile command.mak
|
|
||||||
$(MAKE) -s -f command.mak clean all
|
|
||||||
( ./command >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f command.mak clean
|
|
||||||
|
|
||||||
csv: logfile csv.mak
|
|
||||||
$(MAKE) -s -f csv.mak clean all
|
|
||||||
( ./characterstring_value >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f csv.mak clean
|
|
||||||
|
|
||||||
device: logfile device.mak
|
|
||||||
$(MAKE) -s -f device.mak clean all
|
|
||||||
( ./device >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f device.mak clean
|
|
||||||
|
|
||||||
lc: logfile lc.mak
|
|
||||||
$(MAKE) -s -f lc.mak clean all
|
|
||||||
( ./load_control >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f lc.mak clean
|
|
||||||
|
|
||||||
lo: logfile lo.mak
|
|
||||||
$(MAKE) -s -f lo.mak clean all
|
|
||||||
( ./lighting_output >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f lo.mak clean
|
|
||||||
|
|
||||||
lsp: logfile lsp.mak
|
|
||||||
$(MAKE) -s -f lsp.mak clean all
|
|
||||||
( ./life_safety_point >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f lsp.mak clean
|
|
||||||
|
|
||||||
ms-input: logfile ms-input.mak
|
|
||||||
$(MAKE) -s -f ms-input.mak clean all
|
|
||||||
( ./multistate_input >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f ms-input.mak clean
|
|
||||||
|
|
||||||
mso: logfile mso.mak
|
|
||||||
$(MAKE) -s -f mso.mak clean all
|
|
||||||
( ./multistate_output >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f mso.mak clean
|
|
||||||
|
|
||||||
msv: logfile msv.mak
|
|
||||||
$(MAKE) -s -f msv.mak clean all
|
|
||||||
( ./multistate_value >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f msv.mak clean
|
|
||||||
|
|
||||||
osv: logfile osv.mak
|
|
||||||
$(MAKE) -s -f osv.mak clean all
|
|
||||||
( ./octetstring_value >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f osv.mak clean
|
|
||||||
|
|
||||||
netport: logfile netport.mak
|
|
||||||
$(MAKE) -s -f netport.mak clean all
|
|
||||||
( ./network_port >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f netport.mak clean
|
|
||||||
|
|
||||||
piv: logfile piv.mak
|
|
||||||
$(MAKE) -s -f piv.mak clean all
|
|
||||||
( ./positiveinteger_value >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f piv.mak clean
|
|
||||||
|
|
||||||
schedule: logfile schedule.mak
|
|
||||||
$(MAKE) -s -f schedule.mak clean all
|
|
||||||
( ./schedule >> ${LOGFILE} )
|
|
||||||
$(MAKE) -s -f schedule.mak clean
|
|
||||||
@@ -441,78 +441,3 @@ void Accumulator_Init(void)
|
|||||||
unsigned_value |= (unsigned_value << 1);
|
unsigned_value |= (unsigned_value << 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TEST_ACCUMULATOR
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
#include "bactext.h"
|
|
||||||
|
|
||||||
void test_Accumulator(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
int test_len = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata = { 0 };
|
|
||||||
BACNET_APPLICATION_DATA_VALUE value = { 0 };
|
|
||||||
const int *property = &Properties_Required[0];
|
|
||||||
BACNET_UNSIGNED_INTEGER unsigned_value = 1;
|
|
||||||
|
|
||||||
Accumulator_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ACCUMULATOR;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
|
|
||||||
while ((*property) >= 0) {
|
|
||||||
rpdata.object_property = *property;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Accumulator_Read_Property(&rpdata);
|
|
||||||
ct_test(pTest, len != 0);
|
|
||||||
if (IS_CONTEXT_SPECIFIC(rpdata.application_data[0])) {
|
|
||||||
test_len = bacapp_decode_context_data(
|
|
||||||
rpdata.application_data, len, &value, rpdata.object_property);
|
|
||||||
} else {
|
|
||||||
test_len = bacapp_decode_application_data(
|
|
||||||
rpdata.application_data, len, &value);
|
|
||||||
}
|
|
||||||
if (len != test_len) {
|
|
||||||
printf("property '%s': failed to decode!\n",
|
|
||||||
bactext_property_name(rpdata.object_property));
|
|
||||||
}
|
|
||||||
ct_test(pTest, len == test_len);
|
|
||||||
property++;
|
|
||||||
}
|
|
||||||
/* test 1-bit to 64-bit encode/decode of present-value */
|
|
||||||
rpdata.object_property = PROP_PRESENT_VALUE;
|
|
||||||
while (unsigned_value != BACNET_UNSIGNED_INTEGER_MAX) {
|
|
||||||
Accumulator_Present_Value_Set(0, unsigned_value);
|
|
||||||
len = Accumulator_Read_Property(&rpdata);
|
|
||||||
ct_test(pTest, len != 0);
|
|
||||||
test_len = bacapp_decode_application_data(
|
|
||||||
rpdata.application_data, len, &value);
|
|
||||||
ct_test(pTest, len == test_len);
|
|
||||||
unsigned_value |= (unsigned_value << 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Accumulator", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, test_Accumulator);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
HANDLER_DIR = ../handler
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I. -I$(HANDLER_DIR)
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBACDL_ALL -DBAC_TEST -DTEST_ACCUMULATOR
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = acc.c \
|
|
||||||
$(SRC_DIR)/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacint.c \
|
|
||||||
$(SRC_DIR)/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bactext.c \
|
|
||||||
$(SRC_DIR)/indtext.c \
|
|
||||||
$(SRC_DIR)/datetime.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = accumulator
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
|
|
||||||
@@ -342,9 +342,8 @@ bool Access_Credential_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
Access_Credential_Instance_To_Index(wp_data->object_instance);
|
Access_Credential_Instance_To_Index(wp_data->object_instance);
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_GLOBAL_IDENTIFIER:
|
case PROP_GLOBAL_IDENTIFIER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
ac_descr[object_index].global_identifier =
|
ac_descr[object_index].global_identifier =
|
||||||
value.type.Unsigned_Int;
|
value.type.Unsigned_Int;
|
||||||
@@ -373,70 +372,3 @@ bool Access_Credential_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAccessCredential(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Access_Credential_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ACCESS_CREDENTIAL;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Access_Credential_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ACCESS_CREDENTIAL
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Access Credential", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAccessCredential);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ACCESS_CREDENTIAL */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ACCESS_CREDENTIAL
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = access_credential.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/assigned_access_rights.c \
|
|
||||||
$(SRC_DIR)/bacnet/authentication_factor.c \
|
|
||||||
$(SRC_DIR)/bacnet/credential_authentication_factor.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = access_credential
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -462,7 +462,9 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
object_index = Access_Door_Instance_To_Index(wp_data->object_instance);
|
object_index = Access_Door_Instance_To_Index(wp_data->object_instance);
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
|
if (status) {
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
object. */
|
object. */
|
||||||
@@ -480,8 +482,8 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
status = Access_Door_Present_Value_Relinquish(
|
status = Access_Door_Present_Value_Relinquish(
|
||||||
wp_data->object_instance, wp_data->priority);
|
wp_data->object_instance, wp_data->priority);
|
||||||
@@ -493,8 +495,8 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Access_Door_Out_Of_Service_Set(
|
Access_Door_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -502,9 +504,8 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
case PROP_DOOR_STATUS:
|
case PROP_DOOR_STATUS:
|
||||||
if (Access_Door_Out_Of_Service(wp_data->object_instance)) {
|
if (Access_Door_Out_Of_Service(wp_data->object_instance)) {
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
ad_descr[object_index].door_status =
|
ad_descr[object_index].door_status =
|
||||||
(BACNET_DOOR_STATUS)value.type.Enumerated;
|
(BACNET_DOOR_STATUS)value.type.Enumerated;
|
||||||
@@ -516,9 +517,8 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
case PROP_LOCK_STATUS:
|
case PROP_LOCK_STATUS:
|
||||||
if (Access_Door_Out_Of_Service(wp_data->object_instance)) {
|
if (Access_Door_Out_Of_Service(wp_data->object_instance)) {
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
ad_descr[object_index].lock_status =
|
ad_descr[object_index].lock_status =
|
||||||
(BACNET_LOCK_STATUS)value.type.Enumerated;
|
(BACNET_LOCK_STATUS)value.type.Enumerated;
|
||||||
@@ -530,9 +530,8 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
case PROP_DOOR_ALARM_STATE:
|
case PROP_DOOR_ALARM_STATE:
|
||||||
if (Access_Door_Out_Of_Service(wp_data->object_instance)) {
|
if (Access_Door_Out_Of_Service(wp_data->object_instance)) {
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
ad_descr[object_index].door_alarm_state =
|
ad_descr[object_index].door_alarm_state =
|
||||||
(BACNET_DOOR_ALARM_STATE)value.type.Enumerated;
|
(BACNET_DOOR_ALARM_STATE)value.type.Enumerated;
|
||||||
@@ -566,70 +565,3 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAccessDoor(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Access_Door_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ACCESS_DOOR;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Access_Door_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ACCESS_DOOR
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Access Door", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAccessDoor);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ACCESS_DOOR */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -159,13 +159,6 @@ extern "C" {
|
|||||||
void Access_Door_Init(
|
void Access_Door_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAccessDoor(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ACCESS_DOOR
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = access_door.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = access_door
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -362,70 +362,3 @@ bool Access_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAccessPoint(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Access_Point_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ACCESS_POINT;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Access_Point_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ACCESS_POINT
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Access Point", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAccessPoint);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ACCESS_POINT */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -124,13 +124,6 @@ extern "C" {
|
|||||||
void Access_Point_Init(
|
void Access_Point_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAccessPoint(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ACCESS_POINT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = access_point.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/timestamp.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = access_point
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -308,9 +308,8 @@ bool Access_Rights_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
object_index = Access_Rights_Instance_To_Index(wp_data->object_instance);
|
object_index = Access_Rights_Instance_To_Index(wp_data->object_instance);
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_GLOBAL_IDENTIFIER:
|
case PROP_GLOBAL_IDENTIFIER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
ar_descr[object_index].global_identifier =
|
ar_descr[object_index].global_identifier =
|
||||||
value.type.Unsigned_Int;
|
value.type.Unsigned_Int;
|
||||||
@@ -335,70 +334,3 @@ bool Access_Rights_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAccessRights(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Access_Rights_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ACCESS_RIGHTS;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Access_Rights_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ACCESS_RIGHTS
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Access Rights", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAccessRights);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ACCESS_RIGHTS */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -112,13 +112,6 @@ extern "C" {
|
|||||||
void Access_Rights_Init(
|
void Access_Rights_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAccessRights(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ACCESS_RIGHTS
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = access_rights.c \
|
|
||||||
$(SRC_DIR)/bacnet/access_rule.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = access_rights
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -250,9 +250,8 @@ bool Access_User_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
object_index = Access_User_Instance_To_Index(wp_data->object_instance);
|
object_index = Access_User_Instance_To_Index(wp_data->object_instance);
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_GLOBAL_IDENTIFIER:
|
case PROP_GLOBAL_IDENTIFIER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
au_descr[object_index].global_identifier =
|
au_descr[object_index].global_identifier =
|
||||||
value.type.Unsigned_Int;
|
value.type.Unsigned_Int;
|
||||||
@@ -278,69 +277,3 @@ bool Access_User_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAccessUser(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Access_User_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ACCESS_USER;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Access_User_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ACCESS_USER
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Access User", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAccessUser);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ACCESS_USER */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -105,13 +105,6 @@ extern "C" {
|
|||||||
void Access_User_Init(
|
void Access_User_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAccessUser(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ACCESS_USER
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = access_user.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = access_user
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -301,9 +301,8 @@ bool Access_Zone_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
object_index = Access_Zone_Instance_To_Index(wp_data->object_instance);
|
object_index = Access_Zone_Instance_To_Index(wp_data->object_instance);
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_GLOBAL_IDENTIFIER:
|
case PROP_GLOBAL_IDENTIFIER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
az_descr[object_index].global_identifier =
|
az_descr[object_index].global_identifier =
|
||||||
value.type.Unsigned_Int;
|
value.type.Unsigned_Int;
|
||||||
@@ -311,9 +310,8 @@ bool Access_Zone_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
case PROP_RELIABILITY:
|
case PROP_RELIABILITY:
|
||||||
if (Access_Zone_Out_Of_Service(wp_data->object_instance)) {
|
if (Access_Zone_Out_Of_Service(wp_data->object_instance)) {
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
az_descr[object_index].reliability =
|
az_descr[object_index].reliability =
|
||||||
(BACNET_RELIABILITY)value.type.Enumerated;
|
(BACNET_RELIABILITY)value.type.Enumerated;
|
||||||
@@ -343,70 +341,3 @@ bool Access_Zone_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAccessZone(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Access_Zone_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ACCESS_ZONE;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Access_Zone_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ACCESS_ZONE
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Access Zone", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAccessZone);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ACCESS_ZONE */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -121,13 +121,6 @@ extern "C" {
|
|||||||
void Access_Zone_Init(
|
void Access_Zone_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAccessZone(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ACCESS_ZONE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = access_zone.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = access_zone
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
+24
-114
@@ -633,9 +633,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch ((int)wp_data->object_property) {
|
switch ((int)wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (CurrentAI->Out_Of_Service == true) {
|
if (CurrentAI->Out_Of_Service == true) {
|
||||||
Analog_Input_Present_Value_Set(
|
Analog_Input_Present_Value_Set(
|
||||||
@@ -649,8 +648,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Analog_Input_Out_Of_Service_Set(
|
Analog_Input_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -658,17 +657,16 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Units = value.type.Enumerated;
|
CurrentAI->Units = value.type.Enumerated;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_COV_INCREMENT:
|
case PROP_COV_INCREMENT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Real >= 0.0) {
|
if (value.type.Real >= 0.0) {
|
||||||
Analog_Input_COV_Increment_Set(
|
Analog_Input_COV_Increment_Set(
|
||||||
@@ -683,10 +681,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
#if defined(INTRINSIC_REPORTING)
|
#if defined(INTRINSIC_REPORTING)
|
||||||
case PROP_TIME_DELAY:
|
case PROP_TIME_DELAY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Time_Delay = value.type.Unsigned_Int;
|
CurrentAI->Time_Delay = value.type.Unsigned_Int;
|
||||||
CurrentAI->Remaining_Time_Delay = CurrentAI->Time_Delay;
|
CurrentAI->Remaining_Time_Delay = CurrentAI->Time_Delay;
|
||||||
@@ -694,47 +690,40 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_NOTIFICATION_CLASS:
|
case PROP_NOTIFICATION_CLASS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Notification_Class = value.type.Unsigned_Int;
|
CurrentAI->Notification_Class = value.type.Unsigned_Int;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_HIGH_LIMIT:
|
case PROP_HIGH_LIMIT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->High_Limit = value.type.Real;
|
CurrentAI->High_Limit = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_LOW_LIMIT:
|
case PROP_LOW_LIMIT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Low_Limit = value.type.Real;
|
CurrentAI->Low_Limit = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_DEADBAND:
|
case PROP_DEADBAND:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAI->Deadband = value.type.Real;
|
CurrentAI->Deadband = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_LIMIT_ENABLE:
|
case PROP_LIMIT_ENABLE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BIT_STRING,
|
BACNET_APPLICATION_TAG_BIT_STRING);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Bit_String.bits_used == 2) {
|
if (value.type.Bit_String.bits_used == 2) {
|
||||||
CurrentAI->Limit_Enable = value.type.Bit_String.value[0];
|
CurrentAI->Limit_Enable = value.type.Bit_String.value[0];
|
||||||
@@ -747,10 +736,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_EVENT_ENABLE:
|
case PROP_EVENT_ENABLE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BIT_STRING,
|
BACNET_APPLICATION_TAG_BIT_STRING);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Bit_String.bits_used == 3) {
|
if (value.type.Bit_String.bits_used == 3) {
|
||||||
CurrentAI->Event_Enable = value.type.Bit_String.value[0];
|
CurrentAI->Event_Enable = value.type.Bit_String.value[0];
|
||||||
@@ -763,10 +750,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_NOTIFY_TYPE:
|
case PROP_NOTIFY_TYPE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) {
|
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) {
|
||||||
case NOTIFY_EVENT:
|
case NOTIFY_EVENT:
|
||||||
@@ -1366,78 +1351,3 @@ int Analog_Input_Alarm_Summary(
|
|||||||
return -1; /* end of list */
|
return -1; /* end of list */
|
||||||
}
|
}
|
||||||
#endif /* defined(INTRINSIC_REPORTING) */
|
#endif /* defined(INTRINSIC_REPORTING) */
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
bool bResult;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* start out assuming success and only set up error
|
|
||||||
* response if validation fails.
|
|
||||||
*/
|
|
||||||
bResult = true;
|
|
||||||
if (pValue->tag != ucExpectedTag) {
|
|
||||||
bResult = false;
|
|
||||||
*pErrorClass = ERROR_CLASS_PROPERTY;
|
|
||||||
*pErrorCode = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAnalogInput(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Analog_Input_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ANALOG_INPUT;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Analog_Input_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ANALOG_INPUT
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Analog Input", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAnalogInput);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ANALOG_INPUT */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -198,13 +198,6 @@ extern "C" {
|
|||||||
void Analog_Input_Init(
|
void Analog_Input_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAnalogInput(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
HANDLER_DIR = ../handler
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I. -I$(HANDLER_DIR)
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBACDL_ALL -DBAC_TEST -DTEST_ANALOG_INPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = ai.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = analog_input
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -424,7 +424,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_REAL) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
if (status) {
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
object. */
|
object. */
|
||||||
@@ -442,8 +444,8 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
status = Analog_Output_Present_Value_Relinquish(
|
status = Analog_Output_Present_Value_Relinquish(
|
||||||
wp_data->object_instance, wp_data->priority);
|
wp_data->object_instance, wp_data->priority);
|
||||||
@@ -455,8 +457,8 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Analog_Output_Out_Of_Service_Set(
|
Analog_Output_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -481,78 +483,3 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
bool bResult;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* start out assuming success and only set up error
|
|
||||||
* response if validation fails.
|
|
||||||
*/
|
|
||||||
bResult = true;
|
|
||||||
if (pValue->tag != ucExpectedTag) {
|
|
||||||
bResult = false;
|
|
||||||
*pErrorClass = ERROR_CLASS_PROPERTY;
|
|
||||||
*pErrorCode = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAnalogOutput(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Analog_Output_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ANALOG_OUTPUT;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Analog_Output_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_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 /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -161,13 +161,6 @@ extern "C" {
|
|||||||
void Analog_Output_Init(
|
void Analog_Output_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAnalogOutput(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ANALOG_OUTPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = ao.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = analog_output
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
+25
-104
@@ -745,7 +745,9 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_REAL) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
if (status) {
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
object. */
|
object. */
|
||||||
@@ -770,25 +772,24 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Out_Of_Service = value.type.Boolean;
|
CurrentAV->Out_Of_Service = value.type.Boolean;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Units = value.type.Enumerated;
|
CurrentAV->Units = value.type.Enumerated;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_COV_INCREMENT:
|
case PROP_COV_INCREMENT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Real >= 0.0) {
|
if (value.type.Real >= 0.0) {
|
||||||
Analog_Value_COV_Increment_Set(
|
Analog_Value_COV_Increment_Set(
|
||||||
@@ -803,10 +804,8 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
#if defined(INTRINSIC_REPORTING)
|
#if defined(INTRINSIC_REPORTING)
|
||||||
case PROP_TIME_DELAY:
|
case PROP_TIME_DELAY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Time_Delay = value.type.Unsigned_Int;
|
CurrentAV->Time_Delay = value.type.Unsigned_Int;
|
||||||
CurrentAV->Remaining_Time_Delay = CurrentAV->Time_Delay;
|
CurrentAV->Remaining_Time_Delay = CurrentAV->Time_Delay;
|
||||||
@@ -814,47 +813,40 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_NOTIFICATION_CLASS:
|
case PROP_NOTIFICATION_CLASS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Notification_Class = value.type.Unsigned_Int;
|
CurrentAV->Notification_Class = value.type.Unsigned_Int;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_HIGH_LIMIT:
|
case PROP_HIGH_LIMIT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->High_Limit = value.type.Real;
|
CurrentAV->High_Limit = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_LOW_LIMIT:
|
case PROP_LOW_LIMIT:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Low_Limit = value.type.Real;
|
CurrentAV->Low_Limit = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_DEADBAND:
|
case PROP_DEADBAND:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Deadband = value.type.Real;
|
CurrentAV->Deadband = value.type.Real;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_LIMIT_ENABLE:
|
case PROP_LIMIT_ENABLE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BIT_STRING,
|
BACNET_APPLICATION_TAG_BIT_STRING);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Bit_String.bits_used == 2) {
|
if (value.type.Bit_String.bits_used == 2) {
|
||||||
CurrentAV->Limit_Enable = value.type.Bit_String.value[0];
|
CurrentAV->Limit_Enable = value.type.Bit_String.value[0];
|
||||||
@@ -867,10 +859,8 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_EVENT_ENABLE:
|
case PROP_EVENT_ENABLE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BIT_STRING,
|
BACNET_APPLICATION_TAG_BIT_STRING);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Bit_String.bits_used == 3) {
|
if (value.type.Bit_String.bits_used == 3) {
|
||||||
CurrentAV->Event_Enable = value.type.Bit_String.value[0];
|
CurrentAV->Event_Enable = value.type.Bit_String.value[0];
|
||||||
@@ -883,10 +873,8 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_NOTIFY_TYPE:
|
case PROP_NOTIFY_TYPE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) {
|
switch ((BACNET_NOTIFY_TYPE)value.type.Enumerated) {
|
||||||
case NOTIFY_EVENT:
|
case NOTIFY_EVENT:
|
||||||
@@ -1462,70 +1450,3 @@ int Analog_Value_Alarm_Summary(
|
|||||||
return -1; /* end of list */
|
return -1; /* end of list */
|
||||||
}
|
}
|
||||||
#endif /* defined(INTRINSIC_REPORTING) */
|
#endif /* defined(INTRINSIC_REPORTING) */
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testAnalog_Value(Test *pTest)
|
|
||||||
{
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
|
|
||||||
Analog_Value_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_ANALOG_VALUE;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Analog_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_ANALOG_VALUE
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Analog Value", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testAnalog_Value);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_ANALOG_VALUE */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -211,13 +211,6 @@ extern "C" {
|
|||||||
void Analog_Value_Init(
|
void Analog_Value_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testAnalog_Value(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_ANALOG_VALUE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = av.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = analog_value
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -309,8 +309,8 @@ bool bacfile_write_property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
property shall be logical TRUE only if no changes have been
|
property shall be logical TRUE only if no changes have been
|
||||||
made to the file data by internal processes or through File
|
made to the file data by internal processes or through File
|
||||||
Access Services since the last time the object was archived. */
|
Access Services since the last time the object was archived. */
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Boolean) {
|
if (value.type.Boolean) {
|
||||||
/* FIXME: do something to wp_data->object_instance */
|
/* FIXME: do something to wp_data->object_instance */
|
||||||
@@ -323,9 +323,8 @@ bool bacfile_write_property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
/* If the file size can be changed by writing to the file,
|
/* If the file size can be changed by writing to the file,
|
||||||
and File_Access_Method is STREAM_ACCESS, then this property
|
and File_Access_Method is STREAM_ACCESS, then this property
|
||||||
shall be writable. */
|
shall be writable. */
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: do something with value.type.Unsigned
|
/* FIXME: do something with value.type.Unsigned
|
||||||
to wp_data->object_instance */
|
to wp_data->object_instance */
|
||||||
|
|||||||
@@ -429,9 +429,8 @@ bool Binary_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Enumerated <= MAX_BINARY_PV) {
|
if (value.type.Enumerated <= MAX_BINARY_PV) {
|
||||||
Binary_Input_Present_Value_Set(wp_data->object_instance,
|
Binary_Input_Present_Value_Set(wp_data->object_instance,
|
||||||
@@ -444,17 +443,16 @@ bool Binary_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Binary_Input_Out_Of_Service_Set(
|
Binary_Input_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_POLARITY:
|
case PROP_POLARITY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Enumerated < MAX_POLARITY) {
|
if (value.type.Enumerated < MAX_POLARITY) {
|
||||||
Binary_Input_Polarity_Set(wp_data->object_instance,
|
Binary_Input_Polarity_Set(wp_data->object_instance,
|
||||||
@@ -483,70 +481,3 @@ bool Binary_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testBinaryInput(Test *pTest)
|
|
||||||
{
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
|
|
||||||
Binary_Input_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_BINARY_INPUT;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Binary_Input_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_BINARY_INPUT
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Binary Input", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testBinaryInput);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_BINARY_INPUT */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -155,13 +155,6 @@ extern "C" {
|
|||||||
void Binary_Input_Init(
|
void Binary_Input_Init(
|
||||||
void);
|
void);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include "ctest.h"
|
|
||||||
BACNET_STACK_EXPORT
|
|
||||||
void testBinaryInput(
|
|
||||||
Test * pTest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DTEST_BINARY_INPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = bi.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = binary_input
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -363,7 +363,9 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
|
if (status) {
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
@@ -394,8 +396,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
level = BINARY_NULL;
|
level = BINARY_NULL;
|
||||||
object_index = Binary_Output_Instance_To_Index(
|
object_index = Binary_Output_Instance_To_Index(
|
||||||
@@ -420,8 +422,8 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
object_index =
|
object_index =
|
||||||
Binary_Output_Instance_To_Index(wp_data->object_instance);
|
Binary_Output_Instance_To_Index(wp_data->object_instance);
|
||||||
@@ -450,70 +452,3 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "ctest.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testBinaryOutput(Test *pTest)
|
|
||||||
{
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
|
||||||
int len = 0;
|
|
||||||
uint32_t len_value = 0;
|
|
||||||
uint8_t tag_number = 0;
|
|
||||||
uint16_t decoded_type = 0;
|
|
||||||
uint32_t decoded_instance = 0;
|
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
|
||||||
|
|
||||||
Binary_Output_Init();
|
|
||||||
rpdata.application_data = &apdu[0];
|
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
|
||||||
rpdata.object_type = OBJECT_BINARY_OUTPUT;
|
|
||||||
rpdata.object_instance = 1;
|
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
|
||||||
len = Binary_Output_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);
|
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
|
||||||
ct_test(pTest, decoded_type == rpdata.object_type);
|
|
||||||
ct_test(pTest, decoded_instance == rpdata.object_instance);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TEST_BINARY_OUTPUT
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
Test *pTest;
|
|
||||||
bool rc;
|
|
||||||
|
|
||||||
pTest = ct_create("BACnet Binary Output", NULL);
|
|
||||||
/* individual tests */
|
|
||||||
rc = ct_addTestFunction(pTest, testBinaryOutput);
|
|
||||||
assert(rc);
|
|
||||||
|
|
||||||
ct_setStream(pTest, stdout);
|
|
||||||
ct_run(pTest);
|
|
||||||
(void)ct_report(pTest);
|
|
||||||
ct_destroy(pTest);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* TEST_BINARY_INPUT */
|
|
||||||
#endif /* BAC_TEST */
|
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_BINARY_OUTPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = bo.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = binary_output
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -457,7 +457,9 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
|
if (status) {
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
@@ -486,8 +488,8 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
level = BINARY_NULL;
|
level = BINARY_NULL;
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
@@ -510,8 +512,8 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Binary_Value_Out_Of_Service_Set(
|
Binary_Value_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -542,19 +544,6 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testBinary_Value(Test *pTest)
|
void testBinary_Value(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_BINARY_VALUE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = bv.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = binary_value
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -1513,8 +1513,8 @@ bool Channel_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
status = Channel_Present_Value_Set(wp_data, &value);
|
status = Channel_Present_Value_Set(wp_data, &value);
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Channel_Out_Of_Service_Set(
|
Channel_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -1531,16 +1531,17 @@ bool Channel_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
ERROR_CODE_OPTIONAL_FUNCTIONALITY_NOT_SUPPORTED;
|
ERROR_CODE_OPTIONAL_FUNCTIONALITY_NOT_SUPPORTED;
|
||||||
break;
|
break;
|
||||||
case PROP_CHANNEL_NUMBER:
|
case PROP_CHANNEL_NUMBER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
Channel_Number_Set(
|
Channel_Number_Set(
|
||||||
wp_data->object_instance, value.type.Unsigned_Int);
|
wp_data->object_instance, value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_CONTROL_GROUPS:
|
case PROP_CONTROL_GROUPS:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if (wp_data->array_index == 0) {
|
if (wp_data->array_index == 0) {
|
||||||
/* Array element zero is the number of elements in the array
|
/* Array element zero is the number of elements in the array
|
||||||
*/
|
*/
|
||||||
@@ -1596,9 +1597,6 @@ bool Channel_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
|
|||||||
@@ -781,9 +781,8 @@ bool Command_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch ((int)wp_data->object_property) {
|
switch ((int)wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Unsigned_Int >= MAX_COMMAND_ACTIONS) {
|
if (value.type.Unsigned_Int >= MAX_COMMAND_ACTIONS) {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -827,27 +826,6 @@ void Command_Intrinsic_Reporting(uint32_t object_instance)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
bool bResult;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* start out assuming success and only set up error
|
|
||||||
* response if validation fails.
|
|
||||||
*/
|
|
||||||
bResult = true;
|
|
||||||
if (pValue->tag != ucExpectedTag) {
|
|
||||||
bResult = false;
|
|
||||||
*pErrorClass = ERROR_CLASS_PROPERTY;
|
|
||||||
*pErrorCode = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testCommand(Test *pTest)
|
void testCommand(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
HANDLER_DIR = ../handler
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I. -I$(HANDLER_DIR)
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBACDL_ALL -DBAC_TEST -DTEST_COMMAND
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = command.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = command
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -333,9 +333,8 @@ bool Credential_Data_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
case PROP_RELIABILITY:
|
case PROP_RELIABILITY:
|
||||||
if (Credential_Data_Input_Out_Of_Service(
|
if (Credential_Data_Input_Out_Of_Service(
|
||||||
wp_data->object_instance)) {
|
wp_data->object_instance)) {
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
cdi_descr[object_index].reliability =
|
cdi_descr[object_index].reliability =
|
||||||
(BACNET_RELIABILITY)value.type.Enumerated;
|
(BACNET_RELIABILITY)value.type.Enumerated;
|
||||||
@@ -369,19 +368,6 @@ bool Credential_Data_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testCredentialDataInput(Test *pTest)
|
void testCredentialDataInput(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_CREDENTIAL_DATA_INPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = credential_data_input.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/authentication_factor.c \
|
|
||||||
$(SRC_DIR)/bacnet/authentication_factor_format.c \
|
|
||||||
$(SRC_DIR)/bacnet/timestamp.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = credential_data_input
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -589,9 +589,8 @@ bool CharacterString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status = WPValidateArgType(&value,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
BACNET_APPLICATION_TAG_CHARACTER_STRING, &wp_data->error_class,
|
BACNET_APPLICATION_TAG_CHARACTER_STRING);
|
||||||
&wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
status = CharacterString_Value_Present_Value_Set(
|
status = CharacterString_Value_Present_Value_Set(
|
||||||
wp_data->object_instance, &value.type.Character_String);
|
wp_data->object_instance, &value.type.Character_String);
|
||||||
@@ -602,8 +601,8 @@ bool CharacterString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
CharacterString_Value_Out_Of_Service_Set(
|
CharacterString_Value_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -632,19 +631,6 @@ bool CharacterString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testCharacterStringValue(Test *pTest)
|
void testCharacterStringValue(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_CHARACTERSTRING_VALUE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = csv.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = characterstring_value
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -1392,8 +1392,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_OBJECT_ID,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_OBJECT_ID);
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
||||||
(Device_Set_Object_Instance_Number(
|
(Device_Set_Object_Instance_Number(
|
||||||
@@ -1408,36 +1408,32 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_NUMBER_OF_APDU_RETRIES:
|
case PROP_NUMBER_OF_APDU_RETRIES:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
apdu_retries_set((uint8_t)value.type.Unsigned_Int);
|
apdu_retries_set((uint8_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_APDU_TIMEOUT:
|
case PROP_APDU_TIMEOUT:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
apdu_timeout_set((uint16_t)value.type.Unsigned_Int);
|
apdu_timeout_set((uint16_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_VENDOR_IDENTIFIER:
|
case PROP_VENDOR_IDENTIFIER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* FIXME: bounds check? */
|
/* FIXME: bounds check? */
|
||||||
Device_Set_Vendor_Identifier((uint16_t)value.type.Unsigned_Int);
|
Device_Set_Vendor_Identifier((uint16_t)value.type.Unsigned_Int);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_SYSTEM_STATUS:
|
case PROP_SYSTEM_STATUS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
result = Device_Set_System_Status(
|
result = Device_Set_System_Status(
|
||||||
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
(BACNET_DEVICE_STATUS)value.type.Enumerated, false);
|
||||||
@@ -1455,9 +1451,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
status = WPValidateString(&value,
|
status = write_property_string_valid(wp_data, &value,
|
||||||
characterstring_capacity(&My_Object_Name), false,
|
characterstring_capacity(&My_Object_Name));
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* All the object names in a device must be unique */
|
/* All the object names in a device must be unique */
|
||||||
if (Device_Valid_Object_Name(&value.type.Character_String,
|
if (Device_Valid_Object_Name(&value.type.Character_String,
|
||||||
@@ -1477,8 +1472,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_LOCATION:
|
case PROP_LOCATION:
|
||||||
status = WPValidateString(&value, MAX_DEV_LOC_LEN, true,
|
status = write_property_empty_string_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_LOC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Location(
|
Device_Set_Location(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1487,8 +1482,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_DESCRIPTION:
|
case PROP_DESCRIPTION:
|
||||||
status = WPValidateString(&value, MAX_DEV_DESC_LEN, true,
|
status = write_property_empty_string_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_DESC_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Description(
|
Device_Set_Description(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1496,8 +1491,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MODEL_NAME:
|
case PROP_MODEL_NAME:
|
||||||
status = WPValidateString(&value, MAX_DEV_MOD_LEN, true,
|
status = write_property_empty_string_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_MOD_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Device_Set_Model_Name(
|
Device_Set_Model_Name(
|
||||||
characterstring_value(&value.type.Character_String),
|
characterstring_value(&value.type.Character_String),
|
||||||
@@ -1506,7 +1501,9 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
#if defined(BACNET_TIME_MASTER)
|
#if defined(BACNET_TIME_MASTER)
|
||||||
case PROP_TIME_SYNCHRONIZATION_INTERVAL:
|
case PROP_TIME_SYNCHRONIZATION_INTERVAL:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if (value.type.Unsigned_Int < 65535) {
|
if (value.type.Unsigned_Int < 65535) {
|
||||||
minutes = value.type.Unsigned_Int;
|
minutes = value.type.Unsigned_Int;
|
||||||
Device_Time_Sync_Interval_Set(minutes);
|
Device_Time_Sync_Interval_Set(minutes);
|
||||||
@@ -1515,22 +1512,20 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_ALIGN_INTERVALS:
|
case PROP_ALIGN_INTERVALS:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
|
if (status) {
|
||||||
Device_Align_Intervals_Set(value.type.Boolean);
|
Device_Align_Intervals_Set(value.type.Boolean);
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_INTERVAL_OFFSET:
|
case PROP_INTERVAL_OFFSET:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if (value.type.Unsigned_Int < 65535) {
|
if (value.type.Unsigned_Int < 65535) {
|
||||||
minutes = value.type.Unsigned_Int;
|
minutes = value.type.Unsigned_Int;
|
||||||
Device_Interval_Offset_Set(minutes);
|
Device_Interval_Offset_Set(minutes);
|
||||||
@@ -1539,9 +1534,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
@@ -1553,7 +1545,9 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case PROP_UTC_OFFSET:
|
case PROP_UTC_OFFSET:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_SIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_SIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if ((value.type.Signed_Int < (12 * 60)) &&
|
if ((value.type.Signed_Int < (12 * 60)) &&
|
||||||
(value.type.Signed_Int > (-12 * 60))) {
|
(value.type.Signed_Int > (-12 * 60))) {
|
||||||
Device_UTC_Offset_Set(value.type.Signed_Int);
|
Device_UTC_Offset_Set(value.type.Signed_Int);
|
||||||
@@ -1562,16 +1556,12 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if defined(BACDL_MSTP)
|
#if defined(BACDL_MSTP)
|
||||||
case PROP_MAX_INFO_FRAMES:
|
case PROP_MAX_INFO_FRAMES:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Unsigned_Int <= 255) {
|
if (value.type.Unsigned_Int <= 255) {
|
||||||
dlmstp_set_max_info_frames(
|
dlmstp_set_max_info_frames(
|
||||||
@@ -1584,9 +1574,8 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_MASTER:
|
case PROP_MAX_MASTER:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Unsigned_Int > 0) &&
|
if ((value.type.Unsigned_Int > 0) &&
|
||||||
(value.type.Unsigned_Int <= 127)) {
|
(value.type.Unsigned_Int <= 127)) {
|
||||||
@@ -1926,30 +1915,38 @@ void Routing_Device_Init(uint32_t first_object_instance)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
bool write_property_type_valid(
|
||||||
uint8_t ucExpectedTag,
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
uint8_t expected_tag)
|
||||||
{
|
{
|
||||||
pValue = pValue;
|
(void)wp_data;
|
||||||
ucExpectedTag = ucExpectedTag;
|
(void)value;
|
||||||
pErrorClass = pErrorClass;
|
(void)expected_tag;
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WPValidateString(BACNET_APPLICATION_DATA_VALUE *pValue,
|
bool write_property_string_valid(
|
||||||
int iMaxLen,
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
bool bEmptyAllowed,
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
int len_max)
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
{
|
||||||
pValue = pValue;
|
(void)wp_data;
|
||||||
iMaxLen = iMaxLen;
|
(void)value;
|
||||||
bEmptyAllowed = bEmptyAllowed;
|
(void)len_max;
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool write_property_empty_string_valid(
|
||||||
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
|
int len_max)
|
||||||
|
{
|
||||||
|
(void)wp_data;
|
||||||
|
(void)value;
|
||||||
|
(void)len_max;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
PORTS_DIR = ../../ports/linux
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I$(PORTS_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0
|
|
||||||
DEFINES += -DBAC_TEST -DBACDL_TEST
|
|
||||||
DEFINES += -DBACAPP_ALL
|
|
||||||
DEFINES += -DMAX_TSM_TRANSACTIONS=0
|
|
||||||
DEFINES += -DTEST_DEVICE
|
|
||||||
DEFINES += -DBACNET_PROPERTY_LISTS=1
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = device.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/proplist.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/basic/service/h_apdu.c \
|
|
||||||
$(SRC_DIR)/bacnet/address.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacaddr.c \
|
|
||||||
$(SRC_DIR)/bacnet/dcc.c \
|
|
||||||
$(SRC_DIR)/bacnet/version.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = device
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -498,8 +498,8 @@ bool Routed_Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_OBJECT_ID,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_OBJECT_ID);
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
|
||||||
(Routed_Device_Set_Object_Instance_Number(
|
(Routed_Device_Set_Object_Instance_Number(
|
||||||
@@ -514,8 +514,8 @@ bool Routed_Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
status = WPValidateString(&value, MAX_DEV_NAME_LEN, false,
|
status = write_property_string_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
MAX_DEV_NAME_LEN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Routed_Device_Set_Object_Name(
|
Routed_Device_Set_Object_Name(
|
||||||
characterstring_encoding(&value.type.Character_String),
|
characterstring_encoding(&value.type.Character_String),
|
||||||
|
|||||||
@@ -431,17 +431,16 @@ bool Integer_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_SIGNED_INT,
|
BACNET_APPLICATION_TAG_SIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
Integer_Value_Present_Value_Set(wp_data->object_instance,
|
Integer_Value_Present_Value_Set(wp_data->object_instance,
|
||||||
value.type.Signed_Int, wp_data->priority);
|
value.type.Signed_Int, wp_data->priority);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Integer_Value_Out_Of_Service_Set(
|
Integer_Value_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
|
|||||||
@@ -916,8 +916,8 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_START_TIME:
|
case PROP_START_TIME:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_DATE,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_DATE);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
/* don't continue if we don't have a valid date */
|
/* don't continue if we don't have a valid date */
|
||||||
break;
|
break;
|
||||||
@@ -928,8 +928,8 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
bacapp_decode_application_data(wp_data->application_data + len,
|
bacapp_decode_application_data(wp_data->application_data + len,
|
||||||
wp_data->application_data_len - len, &value);
|
wp_data->application_data_len - len, &value);
|
||||||
if (len) {
|
if (len) {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_TIME,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_TIME);
|
||||||
if (status) {
|
if (status) {
|
||||||
/* Write time and date and set written flag */
|
/* Write time and date and set written flag */
|
||||||
Start_Time[object_index].date = TempDate;
|
Start_Time[object_index].date = TempDate;
|
||||||
@@ -944,9 +944,8 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_SHED_DURATION:
|
case PROP_SHED_DURATION:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
Shed_Duration[object_index] = value.type.Unsigned_Int;
|
Shed_Duration[object_index] = value.type.Unsigned_Int;
|
||||||
Load_Control_Request_Written[object_index] = true;
|
Load_Control_Request_Written[object_index] = true;
|
||||||
@@ -954,9 +953,8 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_DUTY_WINDOW:
|
case PROP_DUTY_WINDOW:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
Duty_Window[object_index] = value.type.Unsigned_Int;
|
Duty_Window[object_index] = value.type.Unsigned_Int;
|
||||||
Load_Control_Request_Written[object_index] = true;
|
Load_Control_Request_Written[object_index] = true;
|
||||||
@@ -964,9 +962,8 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_SHED_LEVELS:
|
case PROP_SHED_LEVELS:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
/* re-write the size of the array? */
|
/* re-write the size of the array? */
|
||||||
if (wp_data->array_index == 0) {
|
if (wp_data->array_index == 0) {
|
||||||
@@ -989,8 +986,8 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_ENABLE:
|
case PROP_ENABLE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Load_Control_Enable[object_index] = value.type.Boolean;
|
Load_Control_Enable[object_index] = value.type.Boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_LOAD_CONTROL
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = lc.c ao.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = load_control
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -1111,7 +1111,9 @@ bool Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_REAL) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_REAL);
|
||||||
|
if (status) {
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
object. */
|
object. */
|
||||||
@@ -1129,8 +1131,8 @@ bool Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
if (wp_data->priority == 6) {
|
if (wp_data->priority == 6) {
|
||||||
/* Command priority 6 is reserved for use by Minimum
|
/* Command priority 6 is reserved for use by Minimum
|
||||||
@@ -1152,21 +1154,20 @@ bool Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_LIGHTING_COMMAND:
|
case PROP_LIGHTING_COMMAND:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_LIGHTING_COMMAND) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_LIGHTING_COMMAND);
|
||||||
|
if (status) {
|
||||||
status = Lighting_Output_Lighting_Command_Set(
|
status = Lighting_Output_Lighting_Command_Set(
|
||||||
wp_data->object_instance, &value.type.Lighting_Command);
|
wp_data->object_instance, &value.type.Lighting_Command);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Lighting_Output_Out_Of_Service_Set(
|
Lighting_Output_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -1336,19 +1337,6 @@ void Lighting_Output_Init(void)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testLightingOutput(Test *pTest)
|
void testLightingOutput(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_LIGHTING_OUTPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = lo.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = lighting_output
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -322,9 +322,8 @@ bool Life_Safety_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_MODE:
|
case PROP_MODE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Enumerated <= MAX_LIFE_SAFETY_MODE) {
|
if (value.type.Enumerated <= MAX_LIFE_SAFETY_MODE) {
|
||||||
object_index = Life_Safety_Point_Instance_To_Index(
|
object_index = Life_Safety_Point_Instance_To_Index(
|
||||||
@@ -339,8 +338,8 @@ bool Life_Safety_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
object_index = Life_Safety_Point_Instance_To_Index(
|
object_index = Life_Safety_Point_Instance_To_Index(
|
||||||
wp_data->object_instance);
|
wp_data->object_instance);
|
||||||
@@ -378,19 +377,6 @@ bool Life_Safety_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testLifeSafetyPoint(Test *pTest)
|
void testLifeSafetyPoint(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_LIFE_SAFETY_POINT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = lsp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = life_safety_point
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -603,7 +603,9 @@ bool Multistate_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_CHARACTER_STRING);
|
||||||
|
if (status) {
|
||||||
/* All the object names in a device must be unique */
|
/* All the object names in a device must be unique */
|
||||||
if (Device_Valid_Object_Name(&value.type.Character_String,
|
if (Device_Valid_Object_Name(&value.type.Character_String,
|
||||||
&object_type, &object_instance)) {
|
&object_type, &object_instance)) {
|
||||||
@@ -621,25 +623,20 @@ bool Multistate_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->object_instance, &value.type.Character_String,
|
wp_data->object_instance, &value.type.Character_String,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
&wp_data->error_class, &wp_data->error_code);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_DESCRIPTION:
|
case PROP_DESCRIPTION:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_CHARACTER_STRING);
|
||||||
|
if (status) {
|
||||||
status = Multistate_Input_Description_Write(
|
status = Multistate_Input_Description_Write(
|
||||||
wp_data->object_instance, &value.type.Character_String,
|
wp_data->object_instance, &value.type.Character_String,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
&wp_data->error_class, &wp_data->error_code);
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
status = Multistate_Input_Present_Value_Set(
|
status = Multistate_Input_Present_Value_Set(
|
||||||
wp_data->object_instance, value.type.Unsigned_Int);
|
wp_data->object_instance, value.type.Unsigned_Int);
|
||||||
@@ -650,64 +647,68 @@ bool Multistate_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Multistate_Input_Out_Of_Service_Set(
|
Multistate_Input_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_STATE_TEXT:
|
case PROP_STATE_TEXT:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
if (wp_data->array_index == 0) {
|
||||||
if (wp_data->array_index == 0) {
|
/* Array element zero is the number of
|
||||||
/* Array element zero is the number of
|
elements in the array. We have a fixed
|
||||||
elements in the array. We have a fixed
|
size array, so we are read-only. */
|
||||||
size array, so we are read-only. */
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
||||||
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
} else if (wp_data->array_index == BACNET_ARRAY_ALL) {
|
||||||
} else if (wp_data->array_index == BACNET_ARRAY_ALL) {
|
max_states =
|
||||||
max_states =
|
Multistate_Input_Max_States(wp_data->object_instance);
|
||||||
Multistate_Input_Max_States(wp_data->object_instance);
|
array_index = 1;
|
||||||
array_index = 1;
|
element_len = len;
|
||||||
element_len = len;
|
do {
|
||||||
do {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
if (element_len) {
|
BACNET_APPLICATION_TAG_CHARACTER_STRING);
|
||||||
status = Multistate_Input_State_Text_Write(
|
if (!status) {
|
||||||
wp_data->object_instance, array_index,
|
break;
|
||||||
&value.type.Character_String,
|
}
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
if (element_len) {
|
||||||
|
status = Multistate_Input_State_Text_Write(
|
||||||
|
wp_data->object_instance, array_index,
|
||||||
|
&value.type.Character_String,
|
||||||
|
&wp_data->error_class, &wp_data->error_code);
|
||||||
|
}
|
||||||
|
max_states--;
|
||||||
|
array_index++;
|
||||||
|
if (max_states) {
|
||||||
|
element_len = bacapp_decode_application_data(
|
||||||
|
&wp_data->application_data[len],
|
||||||
|
wp_data->application_data_len - len, &value);
|
||||||
|
if (element_len < 0) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code =
|
||||||
|
ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
max_states--;
|
len += element_len;
|
||||||
array_index++;
|
}
|
||||||
if (max_states) {
|
} while (max_states);
|
||||||
element_len = bacapp_decode_application_data(
|
} else {
|
||||||
&wp_data->application_data[len],
|
max_states =
|
||||||
wp_data->application_data_len - len, &value);
|
Multistate_Input_Max_States(wp_data->object_instance);
|
||||||
if (element_len < 0) {
|
if (wp_data->array_index <= max_states) {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
status = write_property_type_valid(wp_data, &value,
|
||||||
wp_data->error_code =
|
BACNET_APPLICATION_TAG_CHARACTER_STRING);
|
||||||
ERROR_CODE_VALUE_OUT_OF_RANGE;
|
if (status) {
|
||||||
break;
|
|
||||||
}
|
|
||||||
len += element_len;
|
|
||||||
}
|
|
||||||
} while (max_states);
|
|
||||||
} else {
|
|
||||||
max_states =
|
|
||||||
Multistate_Input_Max_States(wp_data->object_instance);
|
|
||||||
if (wp_data->array_index <= max_states) {
|
|
||||||
status = Multistate_Input_State_Text_Write(
|
status = Multistate_Input_State_Text_Write(
|
||||||
wp_data->object_instance, wp_data->array_index,
|
wp_data->object_instance, wp_data->array_index,
|
||||||
&value.type.Character_String, &wp_data->error_class,
|
&value.type.Character_String, &wp_data->error_class,
|
||||||
&wp_data->error_code);
|
&wp_data->error_code);
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
@@ -739,19 +740,6 @@ bool Device_Valid_Object_Name(BACNET_CHARACTER_STRING *object_name,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testMultistateInput(Test *pTest)
|
void testMultistateInput(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_MULTISTATE_INPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = ms-input.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = multistate_input
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -375,7 +375,9 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
priority = wp_data->priority;
|
priority = wp_data->priority;
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
@@ -408,8 +410,8 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
level = MULTISTATE_NULL;
|
level = MULTISTATE_NULL;
|
||||||
object_index = Multistate_Output_Instance_To_Index(
|
object_index = Multistate_Output_Instance_To_Index(
|
||||||
@@ -435,8 +437,8 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Multistate_Output_Out_Of_Service_Set(
|
Multistate_Output_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -468,19 +470,6 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testMultistateOutput(Test *pTest)
|
void testMultistateOutput(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_MULTISTATE_OUTPUT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = mso.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = multistate_output
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -538,9 +538,8 @@ bool Multistate_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
status = Multistate_Value_Present_Value_Set(
|
status = Multistate_Value_Present_Value_Set(
|
||||||
wp_data->object_instance, value.type.Unsigned_Int);
|
wp_data->object_instance, value.type.Unsigned_Int);
|
||||||
@@ -551,8 +550,8 @@ bool Multistate_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Multistate_Value_Out_Of_Service_Set(
|
Multistate_Value_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
@@ -583,19 +582,6 @@ bool Multistate_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testMultistateInput(Test *pTest)
|
void testMultistateInput(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_MULTISTATE_VALUE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = msv.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = multistate_value
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -417,10 +417,8 @@ bool Notification_Class_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRIORITY:
|
case PROP_PRIORITY:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (wp_data->array_index == 0) {
|
if (wp_data->array_index == 0) {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -472,10 +470,8 @@ bool Notification_Class_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_ACK_REQUIRED:
|
case PROP_ACK_REQUIRED:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_BIT_STRING,
|
BACNET_APPLICATION_TAG_BIT_STRING);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Bit_String.bits_used == 3) {
|
if (value.type.Bit_String.bits_used == 3) {
|
||||||
CurrentNotify->Ack_Required =
|
CurrentNotify->Ack_Required =
|
||||||
|
|||||||
@@ -2146,7 +2146,9 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
/* FIXME: len < application_data_len: more data? */
|
/* FIXME: len < application_data_len: more data? */
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_MAX_MASTER:
|
case PROP_MAX_MASTER:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if (value.type.Unsigned_Int <= 255) {
|
if (value.type.Unsigned_Int <= 255) {
|
||||||
status = Network_Port_MSTP_Max_Master_Set(
|
status = Network_Port_MSTP_Max_Master_Set(
|
||||||
wp_data->object_instance, value.type.Unsigned_Int);
|
wp_data->object_instance, value.type.Unsigned_Int);
|
||||||
@@ -2158,13 +2160,12 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_MAX_INFO_FRAMES:
|
case PROP_MAX_INFO_FRAMES:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
if (value.type.Unsigned_Int <= 255) {
|
if (value.type.Unsigned_Int <= 255) {
|
||||||
status = Network_Port_MSTP_Max_Info_Frames_Set(
|
status = Network_Port_MSTP_Max_Info_Frames_Set(
|
||||||
wp_data->object_instance, value.type.Unsigned_Int);
|
wp_data->object_instance, value.type.Unsigned_Int);
|
||||||
@@ -2177,9 +2178,6 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
@@ -2316,19 +2314,6 @@ void Network_Port_Init(void)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_network_port(Test *pTest)
|
void test_network_port(Test *pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBACNET_UNIT_TEST -DTEST_NETWORK_PORT
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = netport.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/proplist.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = network_port
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -303,7 +303,9 @@ bool OctetString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_OCTET_STRING) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_OCTET_STRING);
|
||||||
|
if (status) {
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
object. */
|
object. */
|
||||||
@@ -321,16 +323,12 @@ bool OctetString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
status = false;
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Out_Of_Service = value.type.Boolean;
|
CurrentAV->Out_Of_Service = value.type.Boolean;
|
||||||
}
|
}
|
||||||
@@ -363,19 +361,6 @@ void OctetString_Value_Intrinsic_Reporting(uint32_t object_instance)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testOctetString_Value(Test *pTest)
|
void testOctetString_Value(Test *pTest)
|
||||||
{
|
{
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
BACNET_READ_PROPERTY_DATA rpdata;
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DBACNET_PROPERTY_LISTS -DTEST_OCTETSTRING_VALUE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = osv.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/proplist.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = octetstring_value
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -309,7 +309,9 @@ bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
status = write_property_type_valid(wp_data, &value,
|
||||||
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
|
if (status) {
|
||||||
/* Command priority 6 is reserved for use by Minimum On/Off
|
/* Command priority 6 is reserved for use by Minimum On/Off
|
||||||
algorithm and may not be used for other purposes in any
|
algorithm and may not be used for other purposes in any
|
||||||
object. */
|
object. */
|
||||||
@@ -327,16 +329,12 @@ bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
status = false;
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentAV->Out_Of_Service = value.type.Boolean;
|
CurrentAV->Out_Of_Service = value.type.Boolean;
|
||||||
}
|
}
|
||||||
@@ -368,19 +366,6 @@ void PositiveInteger_Value_Intrinsic_Reporting(uint32_t object_instance)
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testPositiveInteger_Value(Test *pTest)
|
void testPositiveInteger_Value(Test *pTest)
|
||||||
{
|
{
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
BACNET_READ_PROPERTY_DATA rpdata;
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_POSITIVEINTEGER_VALUE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = piv.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = positiveinteger_value
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -347,8 +347,8 @@ bool Schedule_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
suitable time for
|
suitable time for
|
||||||
review by all interested parties. Say 6 months -> September
|
review by all interested parties. Say 6 months -> September
|
||||||
2016 */
|
2016 */
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
Schedule_Out_Of_Service_Set(
|
Schedule_Out_Of_Service_Set(
|
||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
#Makefile to build test case
|
|
||||||
CC = gcc
|
|
||||||
SRC_DIR = ../../src
|
|
||||||
TEST_DIR = ../../test
|
|
||||||
INCLUDES = -I../../include -I$(TEST_DIR) -I.
|
|
||||||
DEFINES = -DBIG_ENDIAN=0 -DBAC_TEST -DBACAPP_ALL -DTEST_SCHEDULE
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
|
||||||
|
|
||||||
SRCS = schedule.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdcode.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacint.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacstr.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacdevobjpropref.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactimevalue.c \
|
|
||||||
$(SRC_DIR)/bacnet/datetime.c \
|
|
||||||
$(SRC_DIR)/bacnet/lighting.c \
|
|
||||||
$(SRC_DIR)/bacnet/bacapp.c \
|
|
||||||
$(SRC_DIR)/bacnet/bactext.c \
|
|
||||||
$(SRC_DIR)/bacnet/indtext.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET = schedule
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
|
|
||||||
${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)
|
|
||||||
|
|
||||||
include: .depend
|
|
||||||
@@ -448,8 +448,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_ENABLE:
|
case PROP_ENABLE:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
/* Section 12.25.5 can't enable a full log with stop when full
|
/* Section 12.25.5 can't enable a full log with stop when full
|
||||||
* set */
|
* set */
|
||||||
@@ -490,8 +490,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_STOP_WHEN_FULL:
|
case PROP_STOP_WHEN_FULL:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
/* Only trigger this on a change of state */
|
/* Only trigger this on a change of state */
|
||||||
if (CurrentLog->bStopWhenFull != value.type.Boolean) {
|
if (CurrentLog->bStopWhenFull != value.type.Boolean) {
|
||||||
@@ -522,9 +522,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_RECORD_COUNT:
|
case PROP_RECORD_COUNT:
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Unsigned_Int == 0) {
|
if (value.type.Unsigned_Int == 0) {
|
||||||
/* Time to clear down the log */
|
/* Time to clear down the log */
|
||||||
@@ -540,9 +539,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
/* logic
|
/* logic
|
||||||
* triggered and polled options.
|
* triggered and polled options.
|
||||||
*/
|
*/
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if (value.type.Enumerated != LOGGING_TYPE_COV) {
|
if (value.type.Enumerated != LOGGING_TYPE_COV) {
|
||||||
CurrentLog->LoggingType =
|
CurrentLog->LoggingType =
|
||||||
@@ -571,8 +569,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
case PROP_START_TIME:
|
case PROP_START_TIME:
|
||||||
/* Copy the date part to safe place */
|
/* Copy the date part to safe place */
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_DATE,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_DATE);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -583,8 +581,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->application_data_len - len, &value);
|
wp_data->application_data_len - len, &value);
|
||||||
|
|
||||||
if (len) {
|
if (len) {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_TIME,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_TIME);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -622,8 +620,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
|
|
||||||
case PROP_STOP_TIME:
|
case PROP_STOP_TIME:
|
||||||
/* Copy the date part to safe place */
|
/* Copy the date part to safe place */
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_DATE,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_DATE);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -634,8 +632,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->application_data_len - len, &value);
|
wp_data->application_data_len - len, &value);
|
||||||
|
|
||||||
if (len) {
|
if (len) {
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_TIME,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_TIME);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -714,9 +712,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
if ((CurrentLog->LoggingType == LOGGING_TYPE_POLLED) &&
|
if ((CurrentLog->LoggingType == LOGGING_TYPE_POLLED) &&
|
||||||
(value.type.Unsigned_Int == 0)) {
|
(value.type.Unsigned_Int == 0)) {
|
||||||
@@ -740,8 +737,8 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_ALIGN_INTERVALS:
|
case PROP_ALIGN_INTERVALS:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentLog->bAlignIntervals = value.type.Boolean;
|
CurrentLog->bAlignIntervals = value.type.Boolean;
|
||||||
}
|
}
|
||||||
@@ -750,17 +747,16 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
case PROP_INTERVAL_OFFSET:
|
case PROP_INTERVAL_OFFSET:
|
||||||
/* We only log to 1 sec accuracy so must divide by 100 before
|
/* We only log to 1 sec accuracy so must divide by 100 before
|
||||||
* passing it on */
|
* passing it on */
|
||||||
status =
|
status = write_property_type_valid(wp_data, &value,
|
||||||
WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
|
BACNET_APPLICATION_TAG_UNSIGNED_INT);
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
|
||||||
if (status) {
|
if (status) {
|
||||||
CurrentLog->ulIntervalOffset = value.type.Unsigned_Int / 100;
|
CurrentLog->ulIntervalOffset = value.type.Unsigned_Int / 100;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_TRIGGER:
|
case PROP_TRIGGER:
|
||||||
status = WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
&wp_data->error_class, &wp_data->error_code);
|
BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
if (status) {
|
if (status) {
|
||||||
/* We will not allow triggered operation if polling with
|
/* We will not allow triggered operation if polling with
|
||||||
* aligning to the clock as that will produce non aligned
|
* aligning to the clock as that will produce non aligned
|
||||||
|
|||||||
+126
@@ -198,6 +198,131 @@ int wp_decode_service_request(
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief simple validation of value tag for Write Property argument
|
||||||
|
* @param wp_data - #BACNET_WRITE_PROPERTY_DATA data, including
|
||||||
|
* requested data and space for the reply, or error response.
|
||||||
|
* @param value - #BACNET_APPLICATION_DATA_VALUE data, for the tag
|
||||||
|
* @param expected_tag - the tag that is expected for this property value
|
||||||
|
*/
|
||||||
|
bool write_property_type_valid(
|
||||||
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
|
uint8_t expected_tag)
|
||||||
|
{
|
||||||
|
/* assume success */
|
||||||
|
bool valid = true;
|
||||||
|
|
||||||
|
if (value && (value->tag != expected_tag)) {
|
||||||
|
valid = false;
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (valid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief simple validation of character string value for Write Property
|
||||||
|
* @param wp_data - #BACNET_WRITE_PROPERTY_DATA data, including
|
||||||
|
* requested data and space for the reply, or error response.
|
||||||
|
* @param value - #BACNET_APPLICATION_DATA_VALUE data, for the tag
|
||||||
|
* @param expected_tag - the tag that is expected for this property value
|
||||||
|
*/
|
||||||
|
bool write_property_string_valid(
|
||||||
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
|
int len_max)
|
||||||
|
{
|
||||||
|
bool valid = false;
|
||||||
|
|
||||||
|
if (value && (value->tag == BACNET_APPLICATION_TAG_CHARACTER_STRING)) {
|
||||||
|
if (characterstring_encoding(&value->type.Character_String) ==
|
||||||
|
CHARACTER_ANSI_X34) {
|
||||||
|
if (characterstring_length(&value->type.Character_String) == 0) {
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
|
} else if (!characterstring_printable(
|
||||||
|
&value->type.Character_String)) {
|
||||||
|
/* assumption: non-empty also means must be "printable" */
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
|
} else if (characterstring_length(&value->type.Character_String) >
|
||||||
|
(uint16_t)len_max) {
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_RESOURCES;
|
||||||
|
wp_data->error_code = ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* It's all good! */
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_CHARACTER_SET_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (valid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief simple validation of character string value for Write Property
|
||||||
|
* for character strings which can be empty
|
||||||
|
* @param wp_data - #BACNET_WRITE_PROPERTY_DATA data, including
|
||||||
|
* requested data and space for the reply, or error response.
|
||||||
|
* @param value - #BACNET_APPLICATION_DATA_VALUE data, for the tag
|
||||||
|
* @param expected_tag - the tag that is expected for this property value
|
||||||
|
*/
|
||||||
|
bool write_property_empty_string_valid(
|
||||||
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
|
int len_max)
|
||||||
|
{
|
||||||
|
bool valid = false;
|
||||||
|
|
||||||
|
if (value && (value->tag == BACNET_APPLICATION_TAG_CHARACTER_STRING)) {
|
||||||
|
if (characterstring_encoding(&value->type.Character_String) ==
|
||||||
|
CHARACTER_ANSI_X34) {
|
||||||
|
if (characterstring_length(&value->type.Character_String) >
|
||||||
|
(uint16_t)len_max) {
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_RESOURCES;
|
||||||
|
wp_data->error_code = ERROR_CODE_NO_SPACE_TO_WRITE_PROPERTY;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* It's all good! */
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_CHARACTER_SET_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (wp_data) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (valid);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
#ifdef BAC_TEST
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -257,6 +382,7 @@ void testWritePropertyTag(Test *pTest, BACNET_APPLICATION_DATA_VALUE *value)
|
|||||||
len = bacapp_decode_application_data(test_data.application_data,
|
len = bacapp_decode_application_data(test_data.application_data,
|
||||||
test_data.application_data_len, &test_value);
|
test_data.application_data_len, &test_value);
|
||||||
ct_test(pTest, test_value.tag == value->tag);
|
ct_test(pTest, test_value.tag == value->tag);
|
||||||
|
ct_test(pTest, write_property_type_valid(&wpdata, value, test_value.tag));
|
||||||
switch (test_value.tag) {
|
switch (test_value.tag) {
|
||||||
case BACNET_APPLICATION_TAG_NULL:
|
case BACNET_APPLICATION_TAG_NULL:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -80,6 +80,22 @@ extern "C" {
|
|||||||
unsigned apdu_len,
|
unsigned apdu_len,
|
||||||
BACNET_WRITE_PROPERTY_DATA * wp_data);
|
BACNET_WRITE_PROPERTY_DATA * wp_data);
|
||||||
|
|
||||||
|
BACNET_STACK_EXPORT
|
||||||
|
bool write_property_type_valid(
|
||||||
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
|
uint8_t expected_tag);
|
||||||
|
BACNET_STACK_EXPORT
|
||||||
|
bool write_property_string_valid(
|
||||||
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
|
int len_max);
|
||||||
|
BACNET_STACK_EXPORT
|
||||||
|
bool write_property_empty_string_valid(
|
||||||
|
BACNET_WRITE_PROPERTY_DATA * wp_data,
|
||||||
|
BACNET_APPLICATION_DATA_VALUE * value,
|
||||||
|
int len_max);
|
||||||
|
|
||||||
#ifdef BAC_TEST
|
#ifdef BAC_TEST
|
||||||
#include "ctest.h"
|
#include "ctest.h"
|
||||||
BACNET_STACK_EXPORT
|
BACNET_STACK_EXPORT
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ project(test_${basename}
|
|||||||
VERSION 1.0.0
|
VERSION 1.0.0
|
||||||
LANGUAGES C)
|
LANGUAGES C)
|
||||||
|
|
||||||
|
|
||||||
string(REGEX REPLACE
|
string(REGEX REPLACE
|
||||||
"/test/bacnet/[a-zA-Z_/-]*$"
|
"/test/bacnet/[a-zA-Z_/-]*$"
|
||||||
"/src"
|
"/src"
|
||||||
@@ -39,3 +38,4 @@ add_executable(${PROJECT_NAME}
|
|||||||
${ZTST_DIR}/ztest_mock.c
|
${ZTST_DIR}/ztest_mock.c
|
||||||
${ZTST_DIR}/ztest.c
|
${ZTST_DIR}/ztest.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+440
-31
@@ -1,43 +1,452 @@
|
|||||||
#Makefile to build test case
|
# CMAKE generated file: DO NOT EDIT!
|
||||||
CC = gcc
|
# Generated by "Unix Makefiles" Generator, CMake Version 3.13
|
||||||
SRC_DIR = ../../../src
|
|
||||||
TEST_DIR = ../../../test
|
|
||||||
INCLUDES = -I$(SRC_DIR) -I$(TEST_DIR)
|
|
||||||
DEFINES = -DDEBUG_ENABLED=0
|
|
||||||
|
|
||||||
CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g
|
# Default target executed when no arguments are given to make.
|
||||||
|
default_target: all
|
||||||
|
|
||||||
SRCS = main.c \
|
.PHONY : default_target
|
||||||
$(SRC_DIR)/bacnet/bacreal.c \
|
|
||||||
$(SRC_DIR)/bacnet/basic/sys/bigend.c \
|
|
||||||
$(TEST_DIR)/ctest.c
|
|
||||||
|
|
||||||
TARGET_NAME = unittest
|
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
|
||||||
ifeq ($(OS),Windows_NT)
|
.NOTPARALLEL:
|
||||||
TARGET_EXT = .exe
|
|
||||||
else
|
|
||||||
TARGET_EXT =
|
|
||||||
endif
|
|
||||||
TARGET = $(TARGET_NAME)$(TARGET_EXT)
|
|
||||||
|
|
||||||
all: ${TARGET}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
#=============================================================================
|
||||||
|
# Special targets provided by cmake.
|
||||||
|
|
||||||
${TARGET}: ${OBJS}
|
# Disable implicit rules so canonical targets will work.
|
||||||
${CC} -o $@ ${OBJS}
|
.SUFFIXES:
|
||||||
|
|
||||||
.c.o:
|
|
||||||
${CC} -c ${CFLAGS} $*.c -o $@
|
|
||||||
|
|
||||||
depend:
|
# Remove some rules from gmake that .SUFFIXES does not remove.
|
||||||
rm -f .depend
|
SUFFIXES =
|
||||||
${CC} -MM ${CFLAGS} *.c >> .depend
|
|
||||||
|
|
||||||
|
.SUFFIXES: .hpux_make_needs_suffix_list
|
||||||
|
|
||||||
|
|
||||||
|
# Suppress display of executed commands.
|
||||||
|
$(VERBOSE).SILENT:
|
||||||
|
|
||||||
|
|
||||||
|
# A target that is always out of date.
|
||||||
|
cmake_force:
|
||||||
|
|
||||||
|
.PHONY : cmake_force
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Set environment variables for the build.
|
||||||
|
|
||||||
|
# The shell in which to execute make rules.
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
# The CMake executable.
|
||||||
|
CMAKE_COMMAND = /usr/bin/cmake
|
||||||
|
|
||||||
|
# The command to remove a file.
|
||||||
|
RM = /usr/bin/cmake -E remove -f
|
||||||
|
|
||||||
|
# Escaping for special characters.
|
||||||
|
EQUALS = =
|
||||||
|
|
||||||
|
# The top-level source directory on which CMake was run.
|
||||||
|
CMAKE_SOURCE_DIR = /home/skarg/Projects/bacnet-stack
|
||||||
|
|
||||||
|
# The top-level build directory on which CMake was run.
|
||||||
|
CMAKE_BINARY_DIR = /home/skarg/Projects/bacnet-stack
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Targets provided globally by CMake.
|
||||||
|
|
||||||
|
# Special rule for the target install/strip
|
||||||
|
install/strip: preinstall
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..."
|
||||||
|
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
|
||||||
|
.PHONY : install/strip
|
||||||
|
|
||||||
|
# Special rule for the target install/strip
|
||||||
|
install/strip/fast: preinstall/fast
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..."
|
||||||
|
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
|
||||||
|
.PHONY : install/strip/fast
|
||||||
|
|
||||||
|
# Special rule for the target install/local
|
||||||
|
install/local: preinstall
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..."
|
||||||
|
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
|
||||||
|
.PHONY : install/local
|
||||||
|
|
||||||
|
# Special rule for the target install/local
|
||||||
|
install/local/fast: preinstall/fast
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..."
|
||||||
|
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
|
||||||
|
.PHONY : install/local/fast
|
||||||
|
|
||||||
|
# Special rule for the target test
|
||||||
|
test:
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..."
|
||||||
|
/usr/bin/ctest --force-new-ctest-process $(ARGS)
|
||||||
|
.PHONY : test
|
||||||
|
|
||||||
|
# Special rule for the target test
|
||||||
|
test/fast: test
|
||||||
|
|
||||||
|
.PHONY : test/fast
|
||||||
|
|
||||||
|
# Special rule for the target list_install_components
|
||||||
|
list_install_components:
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"dev\" \"lib\""
|
||||||
|
.PHONY : list_install_components
|
||||||
|
|
||||||
|
# Special rule for the target list_install_components
|
||||||
|
list_install_components/fast: list_install_components
|
||||||
|
|
||||||
|
.PHONY : list_install_components/fast
|
||||||
|
|
||||||
|
# Special rule for the target edit_cache
|
||||||
|
edit_cache:
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
|
||||||
|
/usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
|
||||||
|
.PHONY : edit_cache
|
||||||
|
|
||||||
|
# Special rule for the target edit_cache
|
||||||
|
edit_cache/fast: edit_cache
|
||||||
|
|
||||||
|
.PHONY : edit_cache/fast
|
||||||
|
|
||||||
|
# Special rule for the target rebuild_cache
|
||||||
|
rebuild_cache:
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
|
||||||
|
/usr/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
|
||||||
|
.PHONY : rebuild_cache
|
||||||
|
|
||||||
|
# Special rule for the target rebuild_cache
|
||||||
|
rebuild_cache/fast: rebuild_cache
|
||||||
|
|
||||||
|
.PHONY : rebuild_cache/fast
|
||||||
|
|
||||||
|
# Special rule for the target install
|
||||||
|
install: preinstall
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..."
|
||||||
|
/usr/bin/cmake -P cmake_install.cmake
|
||||||
|
.PHONY : install
|
||||||
|
|
||||||
|
# Special rule for the target install
|
||||||
|
install/fast: preinstall/fast
|
||||||
|
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..."
|
||||||
|
/usr/bin/cmake -P cmake_install.cmake
|
||||||
|
.PHONY : install/fast
|
||||||
|
|
||||||
|
# The main all target
|
||||||
|
all: cmake_check_build_system
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(CMAKE_COMMAND) -E cmake_progress_start /home/skarg/Projects/bacnet-stack/CMakeFiles /home/skarg/Projects/bacnet-stack/test/bacnet/bacreal/CMakeFiles/progress.marks
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f CMakeFiles/Makefile2 test/bacnet/bacreal/all
|
||||||
|
$(CMAKE_COMMAND) -E cmake_progress_start /home/skarg/Projects/bacnet-stack/CMakeFiles 0
|
||||||
|
.PHONY : all
|
||||||
|
|
||||||
|
# The main clean target
|
||||||
clean:
|
clean:
|
||||||
rm -rf ${TARGET} $(OBJS)
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f CMakeFiles/Makefile2 test/bacnet/bacreal/clean
|
||||||
|
.PHONY : clean
|
||||||
|
|
||||||
test: ${TARGET}
|
# The main clean target
|
||||||
./${TARGET}
|
clean/fast: clean
|
||||||
|
|
||||||
|
.PHONY : clean/fast
|
||||||
|
|
||||||
|
# Prepare targets for installation.
|
||||||
|
preinstall: all
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f CMakeFiles/Makefile2 test/bacnet/bacreal/preinstall
|
||||||
|
.PHONY : preinstall
|
||||||
|
|
||||||
|
# Prepare targets for installation.
|
||||||
|
preinstall/fast:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f CMakeFiles/Makefile2 test/bacnet/bacreal/preinstall
|
||||||
|
.PHONY : preinstall/fast
|
||||||
|
|
||||||
|
# clear depends
|
||||||
|
depend:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
|
||||||
|
.PHONY : depend
|
||||||
|
|
||||||
|
# Convenience name for target.
|
||||||
|
test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/rule:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f CMakeFiles/Makefile2 test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/rule
|
||||||
|
.PHONY : test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/rule
|
||||||
|
|
||||||
|
# Convenience name for target.
|
||||||
|
test_bacreal: test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/rule
|
||||||
|
|
||||||
|
.PHONY : test_bacreal
|
||||||
|
|
||||||
|
# fast build rule for target.
|
||||||
|
test_bacreal/fast:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build
|
||||||
|
.PHONY : test_bacreal/fast
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacdcode.o: __/__/__/src/bacnet/bacdcode.c.o
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacdcode.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
__/__/__/src/bacnet/bacdcode.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacdcode.c.o
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacdcode.c.o
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacdcode.i: __/__/__/src/bacnet/bacdcode.c.i
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacdcode.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
__/__/__/src/bacnet/bacdcode.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacdcode.c.i
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacdcode.c.i
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacdcode.s: __/__/__/src/bacnet/bacdcode.c.s
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacdcode.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
__/__/__/src/bacnet/bacdcode.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacdcode.c.s
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacdcode.c.s
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacint.o: __/__/__/src/bacnet/bacint.c.o
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacint.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
__/__/__/src/bacnet/bacint.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacint.c.o
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacint.c.o
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacint.i: __/__/__/src/bacnet/bacint.c.i
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacint.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
__/__/__/src/bacnet/bacint.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacint.c.i
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacint.c.i
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacint.s: __/__/__/src/bacnet/bacint.c.s
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacint.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
__/__/__/src/bacnet/bacint.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacint.c.s
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacint.c.s
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacreal.o: __/__/__/src/bacnet/bacreal.c.o
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacreal.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
__/__/__/src/bacnet/bacreal.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacreal.c.o
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacreal.c.o
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacreal.i: __/__/__/src/bacnet/bacreal.c.i
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacreal.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
__/__/__/src/bacnet/bacreal.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacreal.c.i
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacreal.c.i
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacreal.s: __/__/__/src/bacnet/bacreal.c.s
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacreal.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
__/__/__/src/bacnet/bacreal.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacreal.c.s
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacreal.c.s
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacstr.o: __/__/__/src/bacnet/bacstr.c.o
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacstr.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
__/__/__/src/bacnet/bacstr.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacstr.c.o
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacstr.c.o
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacstr.i: __/__/__/src/bacnet/bacstr.c.i
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacstr.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
__/__/__/src/bacnet/bacstr.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacstr.c.i
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacstr.c.i
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/bacstr.s: __/__/__/src/bacnet/bacstr.c.s
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacstr.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
__/__/__/src/bacnet/bacstr.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/bacstr.c.s
|
||||||
|
.PHONY : __/__/__/src/bacnet/bacstr.c.s
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/basic/sys/bigend.o: __/__/__/src/bacnet/basic/sys/bigend.c.o
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/basic/sys/bigend.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
__/__/__/src/bacnet/basic/sys/bigend.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/basic/sys/bigend.c.o
|
||||||
|
.PHONY : __/__/__/src/bacnet/basic/sys/bigend.c.o
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/basic/sys/bigend.i: __/__/__/src/bacnet/basic/sys/bigend.c.i
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/basic/sys/bigend.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
__/__/__/src/bacnet/basic/sys/bigend.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/basic/sys/bigend.c.i
|
||||||
|
.PHONY : __/__/__/src/bacnet/basic/sys/bigend.c.i
|
||||||
|
|
||||||
|
__/__/__/src/bacnet/basic/sys/bigend.s: __/__/__/src/bacnet/basic/sys/bigend.c.s
|
||||||
|
|
||||||
|
.PHONY : __/__/__/src/bacnet/basic/sys/bigend.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
__/__/__/src/bacnet/basic/sys/bigend.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/__/src/bacnet/basic/sys/bigend.c.s
|
||||||
|
.PHONY : __/__/__/src/bacnet/basic/sys/bigend.c.s
|
||||||
|
|
||||||
|
__/__/ztest/src/ztest.o: __/__/ztest/src/ztest.c.o
|
||||||
|
|
||||||
|
.PHONY : __/__/ztest/src/ztest.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
__/__/ztest/src/ztest.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/ztest/src/ztest.c.o
|
||||||
|
.PHONY : __/__/ztest/src/ztest.c.o
|
||||||
|
|
||||||
|
__/__/ztest/src/ztest.i: __/__/ztest/src/ztest.c.i
|
||||||
|
|
||||||
|
.PHONY : __/__/ztest/src/ztest.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
__/__/ztest/src/ztest.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/ztest/src/ztest.c.i
|
||||||
|
.PHONY : __/__/ztest/src/ztest.c.i
|
||||||
|
|
||||||
|
__/__/ztest/src/ztest.s: __/__/ztest/src/ztest.c.s
|
||||||
|
|
||||||
|
.PHONY : __/__/ztest/src/ztest.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
__/__/ztest/src/ztest.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/ztest/src/ztest.c.s
|
||||||
|
.PHONY : __/__/ztest/src/ztest.c.s
|
||||||
|
|
||||||
|
__/__/ztest/src/ztest_mock.o: __/__/ztest/src/ztest_mock.c.o
|
||||||
|
|
||||||
|
.PHONY : __/__/ztest/src/ztest_mock.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
__/__/ztest/src/ztest_mock.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/ztest/src/ztest_mock.c.o
|
||||||
|
.PHONY : __/__/ztest/src/ztest_mock.c.o
|
||||||
|
|
||||||
|
__/__/ztest/src/ztest_mock.i: __/__/ztest/src/ztest_mock.c.i
|
||||||
|
|
||||||
|
.PHONY : __/__/ztest/src/ztest_mock.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
__/__/ztest/src/ztest_mock.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/ztest/src/ztest_mock.c.i
|
||||||
|
.PHONY : __/__/ztest/src/ztest_mock.c.i
|
||||||
|
|
||||||
|
__/__/ztest/src/ztest_mock.s: __/__/ztest/src/ztest_mock.c.s
|
||||||
|
|
||||||
|
.PHONY : __/__/ztest/src/ztest_mock.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
__/__/ztest/src/ztest_mock.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/__/__/ztest/src/ztest_mock.c.s
|
||||||
|
.PHONY : __/__/ztest/src/ztest_mock.c.s
|
||||||
|
|
||||||
|
src/main.o: src/main.c.o
|
||||||
|
|
||||||
|
.PHONY : src/main.o
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
src/main.c.o:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/src/main.c.o
|
||||||
|
.PHONY : src/main.c.o
|
||||||
|
|
||||||
|
src/main.i: src/main.c.i
|
||||||
|
|
||||||
|
.PHONY : src/main.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
src/main.c.i:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/src/main.c.i
|
||||||
|
.PHONY : src/main.c.i
|
||||||
|
|
||||||
|
src/main.s: src/main.c.s
|
||||||
|
|
||||||
|
.PHONY : src/main.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
src/main.c.s:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(MAKE) -f test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/build.make test/bacnet/bacreal/CMakeFiles/test_bacreal.dir/src/main.c.s
|
||||||
|
.PHONY : src/main.c.s
|
||||||
|
|
||||||
|
# Help Target
|
||||||
|
help:
|
||||||
|
@echo "The following are some of the valid targets for this Makefile:"
|
||||||
|
@echo "... all (the default if no target is provided)"
|
||||||
|
@echo "... clean"
|
||||||
|
@echo "... depend"
|
||||||
|
@echo "... install/strip"
|
||||||
|
@echo "... install/local"
|
||||||
|
@echo "... test"
|
||||||
|
@echo "... list_install_components"
|
||||||
|
@echo "... test_bacreal"
|
||||||
|
@echo "... edit_cache"
|
||||||
|
@echo "... rebuild_cache"
|
||||||
|
@echo "... install"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacdcode.o"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacdcode.i"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacdcode.s"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacint.o"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacint.i"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacint.s"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacreal.o"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacreal.i"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacreal.s"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacstr.o"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacstr.i"
|
||||||
|
@echo "... __/__/__/src/bacnet/bacstr.s"
|
||||||
|
@echo "... __/__/__/src/bacnet/basic/sys/bigend.o"
|
||||||
|
@echo "... __/__/__/src/bacnet/basic/sys/bigend.i"
|
||||||
|
@echo "... __/__/__/src/bacnet/basic/sys/bigend.s"
|
||||||
|
@echo "... __/__/ztest/src/ztest.o"
|
||||||
|
@echo "... __/__/ztest/src/ztest.i"
|
||||||
|
@echo "... __/__/ztest/src/ztest.s"
|
||||||
|
@echo "... __/__/ztest/src/ztest_mock.o"
|
||||||
|
@echo "... __/__/ztest/src/ztest_mock.i"
|
||||||
|
@echo "... __/__/ztest/src/ztest_mock.s"
|
||||||
|
@echo "... src/main.o"
|
||||||
|
@echo "... src/main.i"
|
||||||
|
@echo "... src/main.s"
|
||||||
|
.PHONY : help
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Special targets to cleanup operation of make.
|
||||||
|
|
||||||
|
# Special rule to run CMake to check the build system integrity.
|
||||||
|
# No rule that depends on this can have commands that come from listfiles
|
||||||
|
# because they might be regenerated.
|
||||||
|
cmake_check_build_system:
|
||||||
|
cd /home/skarg/Projects/bacnet-stack && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
|
||||||
|
.PHONY : cmake_check_build_system
|
||||||
|
|
||||||
include: .depend
|
|
||||||
|
|||||||
@@ -21,39 +21,41 @@
|
|||||||
*/
|
*/
|
||||||
static void test_Accumulator(void)
|
static void test_Accumulator(void)
|
||||||
{
|
{
|
||||||
#if 0 /*TODO: Refactor implementation to expose for testing */
|
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int test_len = 0;
|
int test_len = 0;
|
||||||
BACNET_READ_PROPERTY_DATA rpdata = {0};
|
BACNET_READ_PROPERTY_DATA rpdata = {0};
|
||||||
BACNET_APPLICATION_DATA_VALUE value = {0};
|
BACNET_APPLICATION_DATA_VALUE value = {0};
|
||||||
const int *property = &Properties_Required[0];
|
int *required_property = NULL;
|
||||||
BACNET_UNSIGNED_INTEGER unsigned_value = 1;
|
BACNET_UNSIGNED_INTEGER unsigned_value = 1;
|
||||||
|
|
||||||
Accumulator_Init();
|
Accumulator_Init();
|
||||||
rpdata.application_data = &apdu[0];
|
rpdata.application_data = &apdu[0];
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
rpdata.application_data_len = sizeof(apdu);
|
||||||
rpdata.object_type = OBJECT_ACCUMULATOR;
|
rpdata.object_type = OBJECT_ACCUMULATOR;
|
||||||
rpdata.object_instance = 1;
|
rpdata.object_instance = Accumulator_Index_To_Instance(0);
|
||||||
|
|
||||||
while ((*property) >= 0) {
|
Accumulator_Property_Lists(&required_property, NULL, NULL);
|
||||||
rpdata.object_property = *property;
|
while ((*required_property) >= 0) {
|
||||||
|
rpdata.object_property = *required_property;
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
rpdata.array_index = BACNET_ARRAY_ALL;
|
||||||
len = Accumulator_Read_Property(&rpdata);
|
len = Accumulator_Read_Property(&rpdata);
|
||||||
zassert_not_equal(len, 0, NULL);
|
zassert_true(len >= 0, NULL);
|
||||||
if (IS_CONTEXT_SPECIFIC(rpdata.application_data[0])) {
|
if (len >= 0) {
|
||||||
test_len = bacapp_decode_context_data(rpdata.application_data,
|
if (IS_CONTEXT_SPECIFIC(rpdata.application_data[0])) {
|
||||||
len, &value, rpdata.object_property);
|
test_len = bacapp_decode_context_data(rpdata.application_data,
|
||||||
} else {
|
len, &value, rpdata.object_property);
|
||||||
test_len = bacapp_decode_application_data(rpdata.application_data,
|
} else {
|
||||||
len, &value);
|
test_len = bacapp_decode_application_data(
|
||||||
|
rpdata.application_data, len, &value);
|
||||||
|
}
|
||||||
|
if (len != test_len) {
|
||||||
|
printf("property '%s': failed to decode!\n",
|
||||||
|
bactext_property_name(rpdata.object_property));
|
||||||
|
}
|
||||||
|
zassert_equal(len, test_len, NULL);
|
||||||
}
|
}
|
||||||
if (len != test_len) {
|
required_property++;
|
||||||
printf("property '%s': failed to decode!\n",
|
|
||||||
bactext_property_name(rpdata.object_property));
|
|
||||||
}
|
|
||||||
zassert_equal(len, test_len, NULL);
|
|
||||||
property++;
|
|
||||||
}
|
}
|
||||||
/* test 1-bit to 64-bit encode/decode of present-value */
|
/* test 1-bit to 64-bit encode/decode of present-value */
|
||||||
rpdata.object_property = PROP_PRESENT_VALUE;
|
rpdata.object_property = PROP_PRESENT_VALUE;
|
||||||
@@ -68,9 +70,6 @@ static void test_Accumulator(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
#else
|
|
||||||
ztest_test_skip();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ add_executable(${PROJECT_NAME}
|
|||||||
${SRC_DIR}/bacnet/datetime.c
|
${SRC_DIR}/bacnet/datetime.c
|
||||||
${SRC_DIR}/bacnet/indtext.c
|
${SRC_DIR}/bacnet/indtext.c
|
||||||
${SRC_DIR}/bacnet/lighting.c
|
${SRC_DIR}/bacnet/lighting.c
|
||||||
./stubs.c
|
${SRC_DIR}/bacnet/wp.c
|
||||||
# Test and test library files
|
# Test and test library files
|
||||||
./src/main.c
|
./src/main.c
|
||||||
${ZTST_DIR}/ztest_mock.c
|
${ZTST_DIR}/ztest_mock.c
|
||||||
|
|||||||
@@ -23,26 +23,46 @@ static void testAccessCredential(void)
|
|||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU] = { 0 };
|
uint8_t apdu[MAX_APDU] = { 0 };
|
||||||
int len = 0;
|
int len = 0;
|
||||||
uint32_t len_value = 0;
|
int test_len = 0;
|
||||||
uint8_t tag_number = 0;
|
BACNET_READ_PROPERTY_DATA rpdata = {0};
|
||||||
uint32_t decoded_instance = 0;
|
BACNET_APPLICATION_DATA_VALUE value = {0};
|
||||||
BACNET_OBJECT_TYPE decoded_type = 0;
|
BACNET_APPLICATION_DATA_VALUE value2 = {0};
|
||||||
BACNET_READ_PROPERTY_DATA rpdata;
|
int *required_property = NULL;
|
||||||
|
BACNET_UNSIGNED_INTEGER unsigned_value = 1;
|
||||||
|
|
||||||
Access_Credential_Init();
|
Access_Credential_Init();
|
||||||
rpdata.application_data = &apdu[0];
|
rpdata.application_data = &apdu[0];
|
||||||
rpdata.application_data_len = sizeof(apdu);
|
rpdata.application_data_len = sizeof(apdu);
|
||||||
rpdata.object_type = OBJECT_ACCESS_CREDENTIAL;
|
rpdata.object_type = OBJECT_ACCESS_CREDENTIAL;
|
||||||
rpdata.object_instance = 1;
|
rpdata.object_instance = Access_Credential_Index_To_Instance(0);
|
||||||
rpdata.object_property = PROP_OBJECT_IDENTIFIER;
|
|
||||||
rpdata.array_index = BACNET_ARRAY_ALL;
|
Access_Credential_Property_Lists(&required_property, NULL, NULL);
|
||||||
len = Access_Credential_Read_Property(&rpdata);
|
while ((*required_property) >= 0) {
|
||||||
zassert_not_equal(len, 0, NULL);
|
rpdata.object_property = *required_property;
|
||||||
len = decode_tag_number_and_value(&apdu[0], &tag_number, &len_value);
|
rpdata.array_index = BACNET_ARRAY_ALL;
|
||||||
zassert_equal(tag_number, BACNET_APPLICATION_TAG_OBJECT_ID, NULL);
|
len = Access_Credential_Read_Property(&rpdata);
|
||||||
len = decode_object_id(&apdu[len], &decoded_type, &decoded_instance);
|
zassert_true(len >= 0, NULL);
|
||||||
zassert_equal(decoded_type, rpdata.object_type, NULL);
|
if (len >= 0) {
|
||||||
zassert_equal(decoded_instance, rpdata.object_instance, NULL);
|
if (IS_CONTEXT_SPECIFIC(rpdata.application_data[0])) {
|
||||||
|
test_len = bacapp_decode_context_data(rpdata.application_data,
|
||||||
|
len, &value, rpdata.object_property);
|
||||||
|
} else {
|
||||||
|
test_len = bacapp_decode_application_data(
|
||||||
|
rpdata.application_data, len, &value);
|
||||||
|
if (test_len < len) {
|
||||||
|
test_len += bacapp_decode_application_data(
|
||||||
|
rpdata.application_data+test_len, len-test_len,
|
||||||
|
&value2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (len != test_len) {
|
||||||
|
fprintf(stderr, "property '%d': failed to decode!\n",
|
||||||
|
rpdata.object_property);
|
||||||
|
}
|
||||||
|
zassert_true(len == test_len, NULL);
|
||||||
|
}
|
||||||
|
required_property++;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/* Binary Input Objects customize for your use */
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "bacnet/bacapp.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -45,7 +45,7 @@ add_executable(${PROJECT_NAME}
|
|||||||
${SRC_DIR}/bacnet/datetime.c
|
${SRC_DIR}/bacnet/datetime.c
|
||||||
${SRC_DIR}/bacnet/indtext.c
|
${SRC_DIR}/bacnet/indtext.c
|
||||||
${SRC_DIR}/bacnet/lighting.c
|
${SRC_DIR}/bacnet/lighting.c
|
||||||
./stubs.c
|
${SRC_DIR}/bacnet/wp.c
|
||||||
# Test and test library files
|
# Test and test library files
|
||||||
./src/main.c
|
./src/main.c
|
||||||
${ZTST_DIR}/ztest_mock.c
|
${ZTST_DIR}/ztest_mock.c
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/* Binary Input Objects customize for your use */
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "bacnet/bacapp.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -46,7 +46,7 @@ add_executable(${PROJECT_NAME}
|
|||||||
${SRC_DIR}/bacnet/datetime.c
|
${SRC_DIR}/bacnet/datetime.c
|
||||||
${SRC_DIR}/bacnet/indtext.c
|
${SRC_DIR}/bacnet/indtext.c
|
||||||
${SRC_DIR}/bacnet/lighting.c
|
${SRC_DIR}/bacnet/lighting.c
|
||||||
./stubs.c
|
${SRC_DIR}/bacnet/wp.c
|
||||||
# Test and test library files
|
# Test and test library files
|
||||||
./src/main.c
|
./src/main.c
|
||||||
${ZTST_DIR}/ztest_mock.c
|
${ZTST_DIR}/ztest_mock.c
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/* Binary Input Objects customize for your use */
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "bacnet/bacapp.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -45,7 +45,7 @@ add_executable(${PROJECT_NAME}
|
|||||||
${SRC_DIR}/bacnet/datetime.c
|
${SRC_DIR}/bacnet/datetime.c
|
||||||
${SRC_DIR}/bacnet/indtext.c
|
${SRC_DIR}/bacnet/indtext.c
|
||||||
${SRC_DIR}/bacnet/lighting.c
|
${SRC_DIR}/bacnet/lighting.c
|
||||||
./stubs.c
|
${SRC_DIR}/bacnet/wp.c
|
||||||
# Test and test library files
|
# Test and test library files
|
||||||
./src/main.c
|
./src/main.c
|
||||||
${ZTST_DIR}/ztest_mock.c
|
${ZTST_DIR}/ztest_mock.c
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/* Binary Input Objects customize for your use */
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "bacnet/bacapp.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -49,7 +49,7 @@ add_executable(${PROJECT_NAME}
|
|||||||
${SRC_DIR}/bacnet/datetime.c
|
${SRC_DIR}/bacnet/datetime.c
|
||||||
${SRC_DIR}/bacnet/indtext.c
|
${SRC_DIR}/bacnet/indtext.c
|
||||||
${SRC_DIR}/bacnet/lighting.c
|
${SRC_DIR}/bacnet/lighting.c
|
||||||
./stubs.c
|
${SRC_DIR}/bacnet/wp.c
|
||||||
# Test and test library files
|
# Test and test library files
|
||||||
./src/main.c
|
./src/main.c
|
||||||
${ZTST_DIR}/ztest_mock.c
|
${ZTST_DIR}/ztest_mock.c
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
/* Binary Input Objects customize for your use */
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "bacnet/bacapp.h"
|
|
||||||
|
|
||||||
bool WPValidateArgType(BACNET_APPLICATION_DATA_VALUE *pValue,
|
|
||||||
uint8_t ucExpectedTag,
|
|
||||||
BACNET_ERROR_CLASS *pErrorClass,
|
|
||||||
BACNET_ERROR_CODE *pErrorCode)
|
|
||||||
{
|
|
||||||
pValue = pValue;
|
|
||||||
ucExpectedTag = ucExpectedTag;
|
|
||||||
pErrorClass = pErrorClass;
|
|
||||||
pErrorCode = pErrorCode;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -47,7 +47,7 @@ add_executable(${PROJECT_NAME}
|
|||||||
${SRC_DIR}/bacnet/indtext.c
|
${SRC_DIR}/bacnet/indtext.c
|
||||||
${SRC_DIR}/bacnet/lighting.c
|
${SRC_DIR}/bacnet/lighting.c
|
||||||
${SRC_DIR}/bacnet/memcopy.c
|
${SRC_DIR}/bacnet/memcopy.c
|
||||||
./stubs.c
|
${SRC_DIR}/bacnet/wp.c
|
||||||
# Test and test library files
|
# Test and test library files
|
||||||
./src/main.c
|
./src/main.c
|
||||||
${ZTST_DIR}/ztest_mock.c
|
${ZTST_DIR}/ztest_mock.c
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user