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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
#include "bacdef.h"
|
||||
#include "datetime.h"
|
||||
#include "bacstr.h"
|
||||
#include "bacint.h"
|
||||
#include "bacreal.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "bacdef.h"
|
||||
#include "bacaddr.h"
|
||||
#include "npdu.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user