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:
Steve Karg
2021-06-23 10:10:12 -05:00
committed by GitHub
parent 31b7fb3c40
commit 810a2f93de
139 changed files with 1142 additions and 4375 deletions
+7 -7
View File
@@ -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
View File
@@ -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
-1
View File
@@ -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
View File
@@ -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 */
+6 -8
View File
@@ -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);
+8 -10
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
-151
View File
@@ -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
-75
View File
@@ -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
-43
View File
@@ -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
+2 -70
View File
@@ -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
+13 -81
View File
@@ -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 */
-7
View File
@@ -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 */
-42
View File
@@ -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
-67
View File
@@ -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 */
-7
View File
@@ -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 */
-43
View File
@@ -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
+2 -70
View File
@@ -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 */
-7
View File
@@ -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 */
-43
View File
@@ -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
+2 -69
View File
@@ -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 */
-7
View File
@@ -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 */
-42
View File
@@ -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
+4 -73
View File
@@ -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 */
-7
View File
@@ -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 */
-42
View File
@@ -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
View File
@@ -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 */
-7
View File
@@ -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 */
-43
View File
@@ -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
+7 -80
View File
@@ -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 */
-7
View File
@@ -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 */
-42
View File
@@ -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
View File
@@ -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 */
-7
View File
@@ -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 */
-42
View File
@@ -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
+4 -5
View File
@@ -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 */
+6 -75
View File
@@ -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 */
-7
View File
@@ -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 */
-42
View File
@@ -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
+7 -72
View File
@@ -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 */
-42
View File
@@ -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
+7 -18
View File
@@ -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 };
-42
View File
@@ -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
+7 -9
View File
@@ -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:
+2 -24
View File
@@ -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 };
-43
View File
@@ -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
+4 -18
View File
@@ -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 };
-42
View File
@@ -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
+60 -63
View File
@@ -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;
} }
-54
View File
@@ -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
+4 -4
View File
@@ -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),
+4 -5
View File
@@ -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);
+12 -15
View File
@@ -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;
} }
-42
View File
@@ -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
+10 -22
View File
@@ -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 };
-42
View File
@@ -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
+4 -18
View File
@@ -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 };
-42
View File
@@ -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
+57 -69
View File
@@ -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 };
-42
View File
@@ -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
+7 -18
View File
@@ -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 };
-42
View File
@@ -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
+4 -18
View File
@@ -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 };
-42
View File
@@ -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
+4 -8
View File
@@ -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 =
+6 -21
View File
@@ -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 };
-43
View File
@@ -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
+5 -20
View File
@@ -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;
-43
View File
@@ -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
+5 -20
View File
@@ -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;
-42
View File
@@ -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
+2 -2
View File
@@ -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);
-43
View File
@@ -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
+24 -28
View File
@@ -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
View File
@@ -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;
+16
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+20 -21
View File
@@ -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;
}
+1 -1
View File
@@ -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