Added defines for each BACAPP datatype so that the developer could only use the ones they need for their WriteProperty applications.

This commit is contained in:
skarg
2007-10-19 17:11:31 +00:00
parent 740bb873be
commit 4d2f46b395
39 changed files with 536 additions and 358 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ TARGET = bacdcc
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -33,7 +33,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -8,7 +8,7 @@ TARGET = bacepics
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -8,7 +8,7 @@ TARGET = bacarf
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -9,7 +9,7 @@ TARGET = bacrp
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -10,7 +10,7 @@ TARGET = bacrd
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -10,7 +10,7 @@ TARGET = bacserv
#BACDL_DEFINE = -DBACDL_ARCNET
#BACDL_DEFINE = -DBACDL_MSTP
BACDL_DEFINE = -DBACDL_BIP -DBIP_DEBUG
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -35,7 +35,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACFILE
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACFILE -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP -DCRC_USE_TABLE
BACDL_DEFINE=-DBACDL_BIP
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -10,7 +10,7 @@ TARGET = bacts
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -10,7 +10,7 @@ TARGET = bacucov
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -10,7 +10,7 @@ TARGET = bacwh
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -8,7 +8,7 @@ TARGET = bacwi
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -10,7 +10,7 @@ TARGET = bacawf
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+1 -1
View File
@@ -10,7 +10,7 @@ TARGET = bacwp
#BACDL_DEFINE = -DBACDL_ARCNET=1
#BACDL_DEFINE = -DBACDL_MSTP=1
BACDL_DEFINE = -DBACDL_BIP=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1
BACNET_DEFINES = -DBACFILE=1 -DPRINT_ENABLED=1 -DBACAPP_ALL
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
# Directories
+1 -1
View File
@@ -32,7 +32,7 @@ INCLUDES = \
-I$(BORLAND_DIR)\include
#
BACNET_DEFINES = -DPRINT_ENABLED=1
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP=1
BACDL_DEFINE=-DBACDL_BIP=1
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+24
View File
@@ -48,18 +48,42 @@ typedef struct BACnet_Application_Data_Value {
uint8_t tag; /* application tag data type */
union {
/* NULL - not needed as it is encoded in the tag alone */
#if defined (BACAPP_BOOLEAN)
bool Boolean;
#endif
#if defined (BACAPP_UNSIGNED)
uint32_t Unsigned_Int;
#endif
#if defined (BACAPP_SIGNED)
int32_t Signed_Int;
#endif
#if defined (BACAPP_REAL)
float Real;
#endif
#if defined (BACAPP_DOUBLE)
double Double;
#endif
#if defined (BACAPP_OCTET_STRING)
BACNET_OCTET_STRING Octet_String;
#endif
#if defined (BACAPP_CHARACTER_STRING)
BACNET_CHARACTER_STRING Character_String;
#endif
#if defined (BACAPP_BIT_STRING)
BACNET_BIT_STRING Bit_String;
#endif
#if defined (BACAPP_ENUMERATED)
int Enumerated;
#endif
#if defined (BACAPP_DATE)
BACNET_DATE Date;
#endif
#if defined (BACAPP_TIME)
BACNET_TIME Time;
#endif
#if defined (BACAPP_OBJECT_ID)
BACNET_OBJECT_ID Object_Id;
#endif
} type;
/* simple linked list if needed */
struct BACnet_Application_Data_Value *next;
+2
View File
@@ -40,6 +40,8 @@
#include "bacdef.h"
#include "datetime.h"
#include "bacstr.h"
#include "bacint.h"
#include "bacreal.h"
#ifdef __cplusplus
extern "C" {
+5 -1
View File
@@ -81,7 +81,11 @@ extern "C" {
bool bitstring_set_octet(BACNET_BIT_STRING * bit_string, uint8_t index,
uint8_t octet);
bool bitstring_set_bits_used(BACNET_BIT_STRING * bit_string,
uint8_t bytes_used, uint8_t unused_bits);
uint8_t bytes_used, uint8_t unused_bits);
bool bitstring_copy(
BACNET_BIT_STRING * dest,
BACNET_BIT_STRING * src);
/* returns false if the string exceeds capacity
initialize by using length=0 */
+20 -1
View File
@@ -17,7 +17,9 @@
#endif
#endif
/* Define your processor architecture as Big Endian or Little Endian */
/* Define your processor architecture as
Big Endian (PowerPC,68K,Sparc) or Little Endian (Intel,AVR)
ARM and MIPS can be either - what is your setup? */
#if !defined(BIG_ENDIAN)
#define BIG_ENDIAN 0
#endif
@@ -63,4 +65,21 @@
#define PRINT_ENABLED 0
#endif
/* BACAPP decodes WriteProperty service requests
Choose the datatypes that your application supports */
#if defined (BACAPP_ALL)
#define BACAPP_BOOLEAN
#define BACAPP_UNSIGNED
#define BACAPP_SIGNED
#define BACAPP_REAL
/* FIXME: not implemented #define BACAPP_DOUBLE */
#define BACAPP_OCTET_STRING
#define BACAPP_CHARACTER_STRING
#define BACAPP_BIT_STRING
#define BACAPP_ENUMERATED
#define BACAPP_DATE
#define BACAPP_TIME
#define BACAPP_OBJECT_ID
#endif
#endif
+2
View File
@@ -37,6 +37,8 @@
#include <stdint.h>
#include <stdbool.h>
#include "bacdef.h"
#include "bacaddr.h"
#include "npdu.h"
#ifdef __cplusplus
extern "C" {
+1 -1
View File
@@ -9,7 +9,7 @@ TARGET = bacnet
LIBRARY = lib$(TARGET).a
# configuration
BACNET_DEFINES=-DPRINT_ENABLED=1
BACNET_DEFINES=-DPRINT_ENABLED=1 -DBACAPP_ALL -DBACFILE
#BACDL_DEFINE=-DBACDL_ETHERNET=1
#BACDL_DEFINE=-DBACDL_ARCNET=1
BACDL_DEFINE=-DBACDL_BIP=1
+1 -1
View File
@@ -18,7 +18,7 @@ CC = $(BORLAND_DIR)\bin\bcc32
TLIB = $(BORLAND_DIR)\bin\tlib
MAKE = $(BORLAND_DIR)\bin\make
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACFILE
BACNET_DEFINES = -DPRINT_ENABLED=1 -DBACFILE -DBACAPP_ALL
#BACDL_DEFINE=-DBACDL_MSTP -DCRC_USE_TABLE
#BACDL_DEFINE=-DBACDL_BIP
DEFINES = $(BACNET_DEFINES) $(BACDL_DEFINE)
+6 -6
View File
@@ -27,11 +27,11 @@ CSRC = main.c \
DEMOSRC = h_rp.c \
device.c \
ai.c \
av.c \
$(BACNET_DEMO)/handler/txbuf.c \
$(BACNET_DEMO)/handler/noserv.c \
h_whois.c
# h_wp.c \
h_whois.c \
h_wp.c
CORESRC = \
$(BACNET_CORE)/apdu.c \
@@ -42,14 +42,15 @@ CORESRC = \
$(BACNET_CORE)/bacstr.c \
$(BACNET_CORE)/iam.c \
$(BACNET_CORE)/rp.c \
$(BACNET_CORE)/wp.c \
$(BACNET_CORE)/whois.c \
$(BACNET_CORE)/bacaddr.c \
$(BACNET_CORE)/abort.c \
$(BACNET_CORE)/reject.c \
$(BACNET_CORE)/bacerror.c \
$(BACNET_CORE)/bacapp.c \
$(BACNET_CORE)/version.c
# $(BACNET_CORE)/bacapp.c \
# $(BACNET_CORE)/bacprop.c \
# $(BACNET_CORE)/bactext.c \
# $(BACNET_CORE)/datetime.c \
@@ -65,7 +66,6 @@ CORESRC = \
# $(BACNET_CORE)/rpm.c \
# $(BACNET_CORE)/timesync.c \
# $(BACNET_CORE)/whohas.c \
# $(BACNET_CORE)/wp.c \
# $(BACNET_CORE)/filename.c \
# $(BACNET_CORE)/tsm.c \
# $(BACNET_CORE)/address.c \
@@ -92,7 +92,7 @@ BFLAGS += -DMAX_APDU=128
BFLAGS += -DBIG_ENDIAN=0
BFLAGS += -DMAX_TSM_TRANSACTIONS=0
#BFLAGS += -DCRC_USE_TABLE
BFLAGS += -DTEST_MSTP
BFLAGS += -DBACAPP_REAL
CFLAGS = $(COMMON)
# dead code removal
CFLAGS += -ffunction-sections -fdata-sections
+6
View File
@@ -48,6 +48,9 @@ bool apdu_service_supported(BACNET_SERVICES_SUPPORTED service_supported)
if (service_supported == SERVICE_SUPPORTED_READ_PROPERTY) {
status = true;
}
if (service_supported == SERVICE_SUPPORTED_WRITE_PROPERTY) {
status = true;
}
return status;
}
@@ -99,6 +102,9 @@ void apdu_handler(BACNET_ADDRESS * src, uint8_t * apdu, /* APDU data */
if (service_choice == SERVICE_CONFIRMED_READ_PROPERTY) {
handler_read_property(service_request,
service_request_len, src, &service_data);
} else if (service_choice == SERVICE_CONFIRMED_WRITE_PROPERTY) {
handler_write_property(service_request,
service_request_len, src, &service_data);
} else {
handler_unrecognized_service(service_request,
service_request_len, src, &service_data);
+3 -60
View File
@@ -168,73 +168,16 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
switch (wp_data->object_property) {
case PROP_PRESENT_VALUE:
if (value.tag == BACNET_APPLICATION_TAG_REAL) {
priority = wp_data->priority;
/* Command priority 6 is reserved for use by Minimum On/Off
algorithm and may not be used for other purposes in any
object. */
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
(priority != 6 /* reserved */ ) &&
(value.type.Real >= 0.0) && (value.type.Real <= 100.0)) {
object_index =
Analog_Value_Instance_To_Index(wp_data->
object_instance);
priority--;
Present_Value[object_index] = value.type.Real;
/* Note: you could set the physical output here if we
are the highest priority.
However, if Out of Service is TRUE, then don't set the
physical output. This comment may apply to the
main loop (i.e. check out of service before changing output) */
status = true;
} else if (priority == 6) {
/* Command priority 6 is reserved for use by Minimum On/Off
algorithm and may not be used for other purposes in any
object. */
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
} else {
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
}
#if 0
} else if (value.tag == BACNET_APPLICATION_TAG_NULL) {
level = ANALOG_LEVEL_NULL;
object_index =
Analog_Value_Instance_To_Index(wp_data->object_instance);
priority = wp_data->priority;
if (priority && (priority <= BACNET_MAX_PRIORITY)) {
priority--;
Present_Value[object_index][priority] = level;
/* Note: you could set the physical output here to the next
highest priority, or to the relinquish default if no
priorities are set.
However, if Out of Service is TRUE, then don't set the
physical output. This comment may apply to the
main loop (i.e. check out of service before changing output) */
status = true;
} else {
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
}
#endif
} else {
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_INVALID_DATA_TYPE;
}
break;
#if 0
case PROP_OUT_OF_SERVICE:
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
object_index =
Analog_Value_Instance_To_Index(wp_data->object_instance);
Analog_Value_Out_Of_Service[object_index] = value.type.Boolean;
Analog_Value_Instance_To_Index(wp_data->
object_instance);
Present_Value[object_index] = value.type.Real;
status = true;
} else {
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_INVALID_DATA_TYPE;
}
break;
#endif
default:
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -38,9 +38,9 @@
#include "wp.h"
/* demo objects */
#include "device.h"
#include "av.h"
#if 0
#include "ai.h"
#include "av.h"
#include "bi.h"
#include "bv.h"
#endif
-5
View File
@@ -113,18 +113,13 @@ static void NPDU_LED_On(void)
NPDU_Timer = 20;
}
extern float Present_Value[9];
void task_milliseconds(void)
{
static uint16_t counter = 0;
while (Timer_Milliseconds) {
Timer_Milliseconds--;
/* add other millisecond timer tasks here */
RS485_LED_Timers();
NDPU_Timers();
counter++;
Present_Value[0] = counter;
Present_Value[1] = counter;
}
}
+421 -257
View File
@@ -39,6 +39,8 @@
#include <ctype.h>
#include "bacenum.h"
#include "bacdcode.h"
#include "bacint.h"
#include "bacreal.h"
#include "bacdef.h"
#include "bacapp.h"
#include "bactext.h"
@@ -51,57 +53,83 @@ int bacapp_encode_application_data(uint8_t * apdu,
if (value && apdu) {
switch (value->tag) {
#if defined (BACAPP_NULL)
case BACNET_APPLICATION_TAG_NULL:
apdu[0] = value->tag;
apdu_len++;
break;
#endif
#if defined (BACAPP_BOOLEAN)
case BACNET_APPLICATION_TAG_BOOLEAN:
apdu_len = encode_application_boolean(&apdu[0],
value->type.Boolean);
break;
#endif
#if defined (BACAPP_UNSIGNED)
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
apdu_len = encode_application_unsigned(&apdu[0],
value->type.Unsigned_Int);
break;
#endif
#if defined (BACAPP_SIGNED)
case BACNET_APPLICATION_TAG_SIGNED_INT:
apdu_len = encode_application_signed(&apdu[0],
value->type.Signed_Int);
break;
#endif
#if defined (BACAPP_REAL)
case BACNET_APPLICATION_TAG_REAL:
apdu_len = encode_application_real(&apdu[0], value->type.Real);
break;
case BACNET_APPLICATION_TAG_ENUMERATED:
apdu_len = encode_application_enumerated(&apdu[0],
value->type.Enumerated);
break;
case BACNET_APPLICATION_TAG_DATE:
apdu_len = encode_application_date(&apdu[0], &value->type.Date);
break;
case BACNET_APPLICATION_TAG_TIME:
apdu_len = encode_application_time(&apdu[0], &value->type.Time);
break;
case BACNET_APPLICATION_TAG_OBJECT_ID:
apdu_len = encode_application_object_id(&apdu[0],
value->type.Object_Id.type,
value->type.Object_Id.instance);
#endif
#if defined (BACAPP_DOUBLE)
case BACNET_APPLICATION_TAG_DOUBLE:
/* FIXME: double is not implemented yet. */
apdu_len = encode_application_double(&apdu[0],
value->type.Double);
break;
#endif
#if defined (BACAPP_OCTET_STRING)
case BACNET_APPLICATION_TAG_OCTET_STRING:
apdu_len = encode_application_octet_string(&apdu[0],
&value->type.Octet_String);
break;
#endif
#if defined (BACAPP_CHARACTER_STRING)
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
apdu_len = encode_application_character_string(&apdu[0],
&value->type.Character_String);
break;
#endif
#if defined (BACAPP_BIT_STRING)
case BACNET_APPLICATION_TAG_BIT_STRING:
apdu_len = encode_application_bitstring(&apdu[0],
&value->type.Bit_String);
break;
case BACNET_APPLICATION_TAG_DOUBLE:
/* FIXME: double is not implemented yet.
apdu_len = encode_application_double(&apdu[0],
value->type.Double);
*/
#endif
#if defined (BACAPP_ENUMERATED)
case BACNET_APPLICATION_TAG_ENUMERATED:
apdu_len = encode_application_enumerated(&apdu[0],
value->type.Enumerated);
break;
#endif
#if defined (BACAPP_DATE)
case BACNET_APPLICATION_TAG_DATE:
apdu_len = encode_application_date(&apdu[0], &value->type.Date);
break;
#endif
#if defined (BACAPP_TIME)
case BACNET_APPLICATION_TAG_TIME:
apdu_len = encode_application_time(&apdu[0], &value->type.Time);
break;
#endif
#if defined (BACAPP_OBJECT_ID)
case BACNET_APPLICATION_TAG_OBJECT_ID:
apdu_len = encode_application_object_id(&apdu[0],
value->type.Object_Id.type,
value->type.Object_Id.instance);
break;
#endif
default:
break;
}
@@ -117,61 +145,88 @@ int bacapp_decode_data(uint8_t * apdu,
uint32_t len_value_type, BACNET_APPLICATION_DATA_VALUE * value)
{
int len = 0;
int object_type = 0;
uint32_t instance = 0;
if (apdu && value) {
switch (tag_data_type) {
#if defined (BACAPP_NULL)
case BACNET_APPLICATION_TAG_NULL:
/* nothing else to do */
break;
#endif
#if defined (BACAPP_BOOLEAN)
case BACNET_APPLICATION_TAG_BOOLEAN:
value->type.Boolean = decode_boolean(len_value_type);
break;
#endif
#if defined (BACAPP_UNSIGNED)
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
len = decode_unsigned(&apdu[0],
len_value_type, &value->type.Unsigned_Int);
break;
#endif
#if defined (BACAPP_SIGNED)
case BACNET_APPLICATION_TAG_SIGNED_INT:
len = decode_signed(&apdu[0],
len_value_type, &value->type.Signed_Int);
break;
#endif
#if defined (BACAPP_REAL)
case BACNET_APPLICATION_TAG_REAL:
len = decode_real(&apdu[0], &(value->type.Real));
break;
#if 0
#endif
#if defined (BACAPP_DOUBLE)
case BACNET_APPLICATION_TAG_DOUBLE:
len = decode_double(&apdu[0], &(value->type.Double));
break;
#endif
case BACNET_APPLICATION_TAG_ENUMERATED:
len = decode_enumerated(&apdu[0],
len_value_type, &value->type.Enumerated);
break;
case BACNET_APPLICATION_TAG_DATE:
len = decode_date(&apdu[0], &value->type.Date);
break;
case BACNET_APPLICATION_TAG_TIME:
len = decode_bacnet_time(&apdu[0], &value->type.Time);
break;
case BACNET_APPLICATION_TAG_OBJECT_ID:
len = decode_object_id(&apdu[0], &object_type, &instance);
value->type.Object_Id.type = object_type;
value->type.Object_Id.instance = instance;
break;
#if defined (BACAPP_OCTET_STRING)
case BACNET_APPLICATION_TAG_OCTET_STRING:
len = decode_octet_string(&apdu[0],
len_value_type, &value->type.Octet_String);
break;
#endif
#if defined (BACAPP_CHARACTER_STRING)
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
len = decode_character_string(&apdu[0],
len_value_type, &value->type.Character_String);
break;
#endif
#if defined (BACAPP_BIT_STRING)
case BACNET_APPLICATION_TAG_BIT_STRING:
len = decode_bitstring(&apdu[0],
len_value_type, &value->type.Bit_String);
break;
default:
#endif
#if defined (BACAPP_ENUMERATED)
case BACNET_APPLICATION_TAG_ENUMERATED:
len = decode_enumerated(&apdu[0],
len_value_type, &value->type.Enumerated);
break;
#endif
#if defined (BACAPP_DATE)
case BACNET_APPLICATION_TAG_DATE:
len = decode_date(&apdu[0], &value->type.Date);
break;
#endif
#if defined (BACAPP_TIME)
case BACNET_APPLICATION_TAG_TIME:
len = decode_bacnet_time(&apdu[0], &value->type.Time);
break;
#endif
#if defined (BACAPP_OBJECT_ID)
case BACNET_APPLICATION_TAG_OBJECT_ID:
{
int object_type = 0;
uint32_t instance = 0;
len = decode_object_id(&apdu[0], &object_type, &instance);
value->type.Object_Id.type = object_type;
value->type.Object_Id.instance = instance;
}
break;
#endif
default:
break;
}
}
@@ -212,68 +267,92 @@ int bacapp_encode_context_data_value(uint8_t * apdu,
if (value && apdu) {
switch (value->tag) {
#if defined (BACAPP_NULL)
case BACNET_APPLICATION_TAG_NULL:
apdu_len = encode_context_null(&apdu[0], context_tag_number);
break;
#endif
#if defined (BACAPP_BOOLEAN)
case BACNET_APPLICATION_TAG_BOOLEAN:
apdu_len = encode_context_boolean(&apdu[0], context_tag_number,
value->type.Boolean);
break;
#endif
#if defined (BACAPP_UNSIGNED)
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
apdu_len =
encode_context_unsigned(&apdu[0], context_tag_number,
value->type.Unsigned_Int);
break;
#endif
#if defined (BACAPP_SIGNED)
case BACNET_APPLICATION_TAG_SIGNED_INT:
apdu_len = encode_context_signed(&apdu[0], context_tag_number,
value->type.Signed_Int);
break;
#endif
#if defined (BACAPP_REAL)
case BACNET_APPLICATION_TAG_REAL:
apdu_len = encode_context_real(&apdu[0], context_tag_number,
value->type.Real);
break;
case BACNET_APPLICATION_TAG_ENUMERATED:
apdu_len =
encode_context_enumerated(&apdu[0], context_tag_number,
value->type.Enumerated);
break;
case BACNET_APPLICATION_TAG_DATE:
apdu_len = encode_context_date(&apdu[0], context_tag_number,
&value->type.Date);
break;
case BACNET_APPLICATION_TAG_TIME:
apdu_len = encode_context_time(&apdu[0], context_tag_number,
&value->type.Time);
break;
case BACNET_APPLICATION_TAG_OBJECT_ID:
apdu_len =
encode_context_object_id(&apdu[0], context_tag_number,
value->type.Object_Id.type,
value->type.Object_Id.instance);
break;
case BACNET_APPLICATION_TAG_OCTET_STRING:
apdu_len =
encode_context_octet_string(&apdu[0], context_tag_number,
&value->type.Octet_String);
break;
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
apdu_len =
encode_context_character_string(&apdu[0],
context_tag_number, &value->type.Character_String);
break;
case BACNET_APPLICATION_TAG_BIT_STRING:
apdu_len =
encode_context_bitstring(&apdu[0], context_tag_number,
&value->type.Bit_String);
break;
#if 0
#endif
#if defined (BACAPP_DOUBLE)
case BACNET_APPLICATION_TAG_DOUBLE:
/* FIXME: double is not implemented yet. */
apdu_len = encode_context_double(&apdu[0], context_tag_number,
value->type.Double);
break;
#endif
default:
#if defined (BACAPP_OCTET_STRING)
case BACNET_APPLICATION_TAG_OCTET_STRING:
apdu_len =
encode_context_octet_string(&apdu[0], context_tag_number,
&value->type.Octet_String);
break;
#endif
#if defined (BACAPP_CHARACTER_STRING)
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
apdu_len =
encode_context_character_string(&apdu[0],
context_tag_number, &value->type.Character_String);
break;
#endif
#if defined (BACAPP_BIT_STRING)
case BACNET_APPLICATION_TAG_BIT_STRING:
apdu_len =
encode_context_bitstring(&apdu[0], context_tag_number,
&value->type.Bit_String);
break;
#endif
#if defined (BACAPP_ENUMERATED)
case BACNET_APPLICATION_TAG_ENUMERATED:
apdu_len =
encode_context_enumerated(&apdu[0], context_tag_number,
value->type.Enumerated);
break;
#endif
#if defined (BACAPP_DATE)
case BACNET_APPLICATION_TAG_DATE:
apdu_len = encode_context_date(&apdu[0], context_tag_number,
&value->type.Date);
break;
#endif
#if defined (BACAPP_TIME)
case BACNET_APPLICATION_TAG_TIME:
apdu_len = encode_context_time(&apdu[0], context_tag_number,
&value->type.Time);
break;
#endif
#if defined (BACAPP_OBJECT_ID)
case BACNET_APPLICATION_TAG_OBJECT_ID:
apdu_len =
encode_context_object_id(&apdu[0], context_tag_number,
value->type.Object_Id.type,
value->type.Object_Id.instance);
break;
#endif
default:
break;
}
}
@@ -427,50 +506,79 @@ bool bacapp_copy(BACNET_APPLICATION_DATA_VALUE * dest_value,
if (dest_value && src_value) {
dest_value->tag = src_value->tag;
switch (src_value->tag) {
#if defined (BACAPP_NULL)
case BACNET_APPLICATION_TAG_NULL:
break;
#endif
#if defined (BACAPP_BOOLEAN)
case BACNET_APPLICATION_TAG_BOOLEAN:
dest_value->type.Boolean = src_value->type.Boolean;
break;
#endif
#if defined (BACAPP_UNSIGNED)
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
dest_value->type.Unsigned_Int = src_value->type.Unsigned_Int;
break;
#endif
#if defined (BACAPP_SIGNED)
case BACNET_APPLICATION_TAG_SIGNED_INT:
dest_value->type.Signed_Int = src_value->type.Signed_Int;
break;
#endif
#if defined (BACAPP_REAL)
case BACNET_APPLICATION_TAG_REAL:
dest_value->type.Real = src_value->type.Real;
break;
#endif
#if defined (BACAPP_DOUBLE)
case BACNET_APPLICATION_TAG_DOUBLE:
dest_value->type.Double = src_value->type.Double;
break;
#endif
#if defined (BACAPP_OCTET_STRING)
case BACNET_APPLICATION_TAG_OCTET_STRING:
octetstring_copy(&dest_value->type.Octet_String,
&src_value->type.Octet_String);
break;
#endif
#if defined (BACAPP_CHARACTER_STRING)
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
characterstring_copy(&dest_value->type.Character_String,
&src_value->type.Character_String);
break;
#endif
#if defined (BACAPP_BIT_STRING)
case BACNET_APPLICATION_TAG_BIT_STRING:
bitstring_copy(&dest_value->type.Bit_String,
&src_value->type.Bit_String);
break;
#endif
#if defined (BACAPP_ENUMERATED)
case BACNET_APPLICATION_TAG_ENUMERATED:
dest_value->type.Enumerated = src_value->type.Enumerated;
break;
#endif
#if defined (BACAPP_DATE)
case BACNET_APPLICATION_TAG_DATE:
datetime_copy_date(&dest_value->type.Date,
&src_value->type.Date);
break;
#endif
#if defined (BACAPP_TIME)
case BACNET_APPLICATION_TAG_TIME:
datetime_copy_time(&dest_value->type.Time,
&src_value->type.Time);
break;
case BACNET_APPLICATION_TAG_OBJECT_ID:
#endif
#if defined (BACAPP_OBJECT_ID)
case BACNET_APPLICATION_TAG_OBJECT_ID:
dest_value->type.Object_Id.type =
src_value->type.Object_Id.type;
dest_value->type.Object_Id.instance =
src_value->type.Object_Id.instance;
break;
case BACNET_APPLICATION_TAG_OCTET_STRING:
octetstring_copy(&dest_value->type.Octet_String,
&src_value->type.Octet_String);
break;
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
characterstring_copy(&dest_value->type.Character_String,
&src_value->type.Character_String);
break;
case BACNET_APPLICATION_TAG_BIT_STRING:
default:
#endif
default:
status = false;
break;
}
@@ -569,9 +677,45 @@ bool bacapp_print_value(FILE * stream,
case BACNET_APPLICATION_TAG_REAL:
fprintf(stream, "%f", (double) value->type.Real);
break;
#if defined (BACAPP_DOUBLE)
case BACNET_APPLICATION_TAG_DOUBLE:
fprintf(stream, "%f", value->type.Double);
break;
#endif
case BACNET_APPLICATION_TAG_OCTET_STRING:
len = octetstring_length(&value->type.Octet_String);
octet_str = octetstring_value(&value->type.Octet_String);
for (i = 0; i < len; i++) {
fprintf(stream, "%02X", *octet_str);
octet_str++;
}
break;
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
len = characterstring_length(&value->type.Character_String);
char_str =
characterstring_value(&value->type.Character_String);
fprintf(stream, "\"");
for (i = 0; i < len; i++) {
if (isprint(*char_str))
fprintf(stream, "%c", *char_str);
else
fprintf(stream, ".");
char_str++;
}
fprintf(stream, "\"");
break;
case BACNET_APPLICATION_TAG_BIT_STRING:
len = bitstring_bits_used(&value->type.Bit_String);
fprintf(stream, "{");
for (i = 0; i < len; i++) {
fprintf(stream, "%s",
bitstring_bit(&value->type.Bit_String,
(uint8_t) i) ? "true" : "false");
if (i < len - 1)
fprintf(stream, ",");
}
fprintf(stream, "}");
break;
case BACNET_APPLICATION_TAG_ENUMERATED:
switch (property) {
case PROP_OBJECT_TYPE:
@@ -627,40 +771,6 @@ bool bacapp_print_value(FILE * stream,
bactext_object_type_name(value->type.Object_Id.type),
value->type.Object_Id.instance);
break;
case BACNET_APPLICATION_TAG_OCTET_STRING:
len = octetstring_length(&value->type.Octet_String);
octet_str = octetstring_value(&value->type.Octet_String);
for (i = 0; i < len; i++) {
fprintf(stream, "%02X", *octet_str);
octet_str++;
}
break;
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
len = characterstring_length(&value->type.Character_String);
char_str =
characterstring_value(&value->type.Character_String);
fprintf(stream, "\"");
for (i = 0; i < len; i++) {
if (isprint(*char_str))
fprintf(stream, "%c", *char_str);
else
fprintf(stream, ".");
char_str++;
}
fprintf(stream, "\"");
break;
case BACNET_APPLICATION_TAG_BIT_STRING:
len = bitstring_bits_used(&value->type.Bit_String);
fprintf(stream, "{");
for (i = 0; i < len; i++) {
fprintf(stream, "%s",
bitstring_bit(&value->type.Bit_String,
(uint8_t) i) ? "true" : "false");
if (i < len - 1)
fprintf(stream, ",");
}
fprintf(stream, "}");
break;
default:
status = false;
break;
@@ -669,7 +779,9 @@ bool bacapp_print_value(FILE * stream,
return status;
}
#endif
#ifdef BACAPP_PRINT_ENABLED
/* used to load the app data struct with the proper data
converted from a command line argument */
bool bacapp_parse_application_data(BACNET_APPLICATION_TAG tag_number,
@@ -688,75 +800,99 @@ bool bacapp_parse_application_data(BACNET_APPLICATION_TAG tag_number,
if (value && (tag_number < MAX_BACNET_APPLICATION_TAG)) {
status = true;
value->tag = tag_number;
if (tag_number == BACNET_APPLICATION_TAG_BOOLEAN) {
long_value = strtol(argv, NULL, 0);
if (long_value)
value->type.Boolean = true;
else
value->type.Boolean = false;
} else if (tag_number == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
unsigned_long_value = strtoul(argv, NULL, 0);
value->type.Unsigned_Int = unsigned_long_value;
} else if (tag_number == BACNET_APPLICATION_TAG_SIGNED_INT) {
long_value = strtol(argv, NULL, 0);
value->type.Signed_Int = long_value;
} else if (tag_number == BACNET_APPLICATION_TAG_REAL) {
double_value = strtod(argv, NULL);
value->type.Real = (float) double_value;
} else if (tag_number == BACNET_APPLICATION_TAG_DOUBLE) {
double_value = strtod(argv, NULL);
value->type.Double = double_value;
} else if (tag_number == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
status =
characterstring_init_ansi(&value->type.Character_String,
(char *) argv);
} else if (tag_number == BACNET_APPLICATION_TAG_OCTET_STRING) {
status = octetstring_init(&value->type.Octet_String,
(uint8_t *) argv, strlen(argv));
} else if (tag_number == BACNET_APPLICATION_TAG_ENUMERATED) {
unsigned_long_value = strtoul(argv, NULL, 0);
value->type.Enumerated = unsigned_long_value;
} else if (tag_number == BACNET_APPLICATION_TAG_DATE) {
count =
sscanf(argv, "%d/%d/%d:%d", &year, &month, &day, &wday);
if (count == 3) {
datetime_set_date(&value->type.Date,
(uint16_t)year, (uint8_t)month, (uint8_t)day);
} else if (count == 4) {
value->type.Date.year = year;
value->type.Date.month = month;
value->type.Date.day = day;
value->type.Date.wday = wday;
} else
status = false;
} else if (tag_number == BACNET_APPLICATION_TAG_TIME) {
count =
sscanf(argv, "%d:%d:%d.%d", &hour, &min, &sec,
&hundredths);
if (count == 4) {
value->type.Time.hour = hour;
value->type.Time.min = min;
value->type.Time.sec = sec;
value->type.Time.hundredths = hundredths;
} else if (count == 3) {
value->type.Time.hour = hour;
value->type.Time.min = min;
value->type.Time.sec = sec;
value->type.Time.hundredths = 0;
} else if (count == 2) {
value->type.Time.hour = hour;
value->type.Time.min = min;
value->type.Time.sec = 0;
value->type.Time.hundredths = 0;
} else
status = false;
} else if (tag_number == BACNET_APPLICATION_TAG_OBJECT_ID) {
count = sscanf(argv, "%d:%d", &object_type, &instance);
if (count == 2) {
value->type.Object_Id.type = object_type;
value->type.Object_Id.instance = instance;
} else
switch (tag_number) {
case BACNET_APPLICATION_TAG_BOOLEAN:
long_value = strtol(argv, NULL, 0);
if (long_value)
value->type.Boolean = true;
else
value->type.Boolean = false;
break;
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
unsigned_long_value = strtoul(argv, NULL, 0);
value->type.Unsigned_Int = unsigned_long_value;
break;
case BACNET_APPLICATION_TAG_SIGNED_INT:
long_value = strtol(argv, NULL, 0);
value->type.Signed_Int = long_value;
break;
case BACNET_APPLICATION_TAG_REAL:
double_value = strtod(argv, NULL);
value->type.Real = (float) double_value;
break;
#if defined (BACAPP_DOUBLE)
case BACNET_APPLICATION_TAG_DOUBLE:
double_value = strtod(argv, NULL);
value->type.Double = double_value;
break;
#endif
case BACNET_APPLICATION_TAG_OCTET_STRING:
status = octetstring_init(&value->type.Octet_String,
(uint8_t *) argv, strlen(argv));
break;
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
status =
characterstring_init_ansi(&value->type.Character_String,
(char *) argv);
break;
case BACNET_APPLICATION_TAG_BIT_STRING:
/* FIXME: how to parse a bit string? */
status = false;
bitstring_init(&value->type.Bit_String);
break;
case BACNET_APPLICATION_TAG_ENUMERATED:
unsigned_long_value = strtoul(argv, NULL, 0);
value->type.Enumerated = unsigned_long_value;
break;
case BACNET_APPLICATION_TAG_DATE:
count =
sscanf(argv, "%d/%d/%d:%d", &year, &month, &day, &wday);
if (count == 3) {
datetime_set_date(&value->type.Date,
(uint16_t)year, (uint8_t)month, (uint8_t)day);
} else if (count == 4) {
value->type.Date.year = year;
value->type.Date.month = month;
value->type.Date.day = day;
value->type.Date.wday = wday;
} else {
status = false;
}
break;
case BACNET_APPLICATION_TAG_TIME:
count =
sscanf(argv, "%d:%d:%d.%d", &hour, &min, &sec,
&hundredths);
if (count == 4) {
value->type.Time.hour = hour;
value->type.Time.min = min;
value->type.Time.sec = sec;
value->type.Time.hundredths = hundredths;
} else if (count == 3) {
value->type.Time.hour = hour;
value->type.Time.min = min;
value->type.Time.sec = sec;
value->type.Time.hundredths = 0;
} else if (count == 2) {
value->type.Time.hour = hour;
value->type.Time.min = min;
value->type.Time.sec = 0;
value->type.Time.hundredths = 0;
} else {
status = false;
}
break;
case BACNET_APPLICATION_TAG_OBJECT_ID:
count = sscanf(argv, "%d:%d", &object_type, &instance);
if (count == 2) {
value->type.Object_Id.type = object_type;
value->type.Object_Id.instance = instance;
} else {
status = false;
}
break;
default:
break;
}
value->next = NULL;
}
@@ -770,6 +906,104 @@ bool bacapp_parse_application_data(BACNET_APPLICATION_TAG tag_number,
#include <string.h>
#include "ctest.h"
/* generic - can be used by other unit tests
returns true if matching or same, false if different */
bool bacapp_same_value(BACNET_APPLICATION_DATA_VALUE * value,
BACNET_APPLICATION_DATA_VALUE * test_value)
{
bool status = false; /*return value */
bool tag
/* does the tag match? */
if (test_value->tag == value->tag)
status = true;
if (status) {
/* second test for same-ness */
status = false;
/* does the value match? */
switch (test_value->tag) {
#if defined (BACAPP_NULL)
case BACNET_APPLICATION_TAG_NULL:
status = true;
break;
#endif
#if defined (BACAPP_BOOLEAN)
case BACNET_APPLICATION_TAG_BOOLEAN:
if (test_value->type.Boolean == value->type.Boolean)
status = true;
break;
#endif
#if defined (BACAPP_UNSIGNED)
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
if (test_value->type.Unsigned_Int == value->type.Unsigned_Int)
status = true;
break;
#endif
#if defined (BACAPP_SIGNED)
case BACNET_APPLICATION_TAG_SIGNED_INT:
if (test_value->type.Signed_Int == value->type.Signed_Int)
status = true;
break;
#endif
#if defined (BACAPP_REAL)
case BACNET_APPLICATION_TAG_REAL:
if (test_value->type.Real == value->type.Real)
status = true;
break;
#endif
#if defined (BACAPP_DOUBLE)
case BACNET_APPLICATION_TAG_DOUBLE:
if (test_value->type.Double == value->type.Double)
status = true;
break;
#endif
#if defined (BACAPP_ENUMERATED)
case BACNET_APPLICATION_TAG_ENUMERATED:
if (test_value->type.Enumerated == value->type.Enumerated)
status = true;
break;
#endif
#if defined (BACAPP_DATE)
case BACNET_APPLICATION_TAG_DATE:
if (datetime_compare_date(&test_value->type.Date,
&value->type.Date) == 0)
status = true;
break;
#endif
#if defined (BACAPP_TIME)
case BACNET_APPLICATION_TAG_TIME:
if (datetime_compare_time(&test_value->type.Time,
&value->type.Time) == 0)
status = true;
break;
#endif
#if defined (BACAPP_OBJECT_ID)
case BACNET_APPLICATION_TAG_OBJECT_ID:
if ((test_value->type.Object_Id.type ==
value->type.Object_Id.type) &&
(test_value->type.Object_Id.instance ==
value->type.Object_Id.instance)) {
status = true;
}
break;
#endif
#if defined (BACAPP_CHARACTER_STRING)
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
status = characterstring_same(&value->type.Character_String,
&test_value->type.Character_String);
break;
#endif
#if defined (BACAPP_BIT_STRING)
case BACNET_APPLICATION_TAG_BIT_STRING:
default:
status = false;
break;
}
}
#endif
return status;
}
void testBACnetApplicationDataLength(Test * pTest)
{
int apdu_len = 0; /* total length of the apdu, return value */
@@ -915,76 +1149,6 @@ void testBACnetApplicationDataLength(Test * pTest)
ct_test(pTest, test_len == len);
}
/* generic - can be used by other unit tests
returns true if matching or same, false if different */
bool bacapp_same_value(BACNET_APPLICATION_DATA_VALUE * value,
BACNET_APPLICATION_DATA_VALUE * test_value)
{
bool status = true; /*return value */
/* does the tag match? */
if (test_value->tag != value->tag)
status = false;
if (status) {
/* does the value match? */
switch (test_value->tag) {
case BACNET_APPLICATION_TAG_NULL:
break;
case BACNET_APPLICATION_TAG_BOOLEAN:
if (test_value->type.Boolean != value->type.Boolean)
status = false;
break;
case BACNET_APPLICATION_TAG_UNSIGNED_INT:
if (test_value->type.Unsigned_Int != value->type.Unsigned_Int)
status = false;
break;
case BACNET_APPLICATION_TAG_SIGNED_INT:
if (test_value->type.Signed_Int != value->type.Signed_Int)
status = false;
break;
case BACNET_APPLICATION_TAG_REAL:
if (test_value->type.Real != value->type.Real)
status = false;
break;
case BACNET_APPLICATION_TAG_DOUBLE:
if (test_value->type.Double != value->type.Double)
status = false;
break;
case BACNET_APPLICATION_TAG_ENUMERATED:
if (test_value->type.Enumerated != value->type.Enumerated)
status = false;
break;
case BACNET_APPLICATION_TAG_DATE:
if (datetime_compare_date(&test_value->type.Date,
&value->type.Date) != 0)
status = false;
break;
case BACNET_APPLICATION_TAG_TIME:
if (datetime_compare_time(&test_value->type.Time,
&value->type.Time) != 0)
status = false;
break;
case BACNET_APPLICATION_TAG_OBJECT_ID:
if (test_value->type.Object_Id.type !=
value->type.Object_Id.type)
status = false;
if (test_value->type.Object_Id.instance !=
value->type.Object_Id.instance)
status = false;
break;
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
status = characterstring_same(&value->type.Character_String,
&test_value->type.Character_String);
break;
case BACNET_APPLICATION_TAG_BIT_STRING:
default:
status = false;
break;
}
}
return status;
}
static bool testBACnetApplicationDataValue(BACNET_APPLICATION_DATA_VALUE *
value)
{
+19
View File
@@ -155,6 +155,24 @@ uint8_t bitstring_bits_capacity(BACNET_BIT_STRING * bit_string)
return 0;
}
bool bitstring_copy(
BACNET_BIT_STRING * dest,
BACNET_BIT_STRING * src)
{
unsigned i;
bool status = false;
if (dest && src) {
dest->bits_used = src->bits_used;
for (i = 0; i < MAX_BITSTRING_BYTES; i++) {
dest->value[i] = src->value[i];
}
status = true;
}
return status;
}
#define CHARACTER_STRING_CAPACITY (MAX_CHARACTER_STRING_BYTES - 1)
/* returns false if the string exceeds capacity
initialize by using length=0 */
@@ -205,6 +223,7 @@ bool characterstring_copy(BACNET_CHARACTER_STRING * dest,
characterstring_value(src), characterstring_length(src));
}
/* returns true if the character encoding and string contents are the same */
bool characterstring_same(BACNET_CHARACTER_STRING * dest,
BACNET_CHARACTER_STRING * src)
{