diff --git a/bacnet-stack/demo/dcc/Makefile b/bacnet-stack/demo/dcc/Makefile index 73835025..216579f3 100644 --- a/bacnet-stack/demo/dcc/Makefile +++ b/bacnet-stack/demo/dcc/Makefile @@ -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 diff --git a/bacnet-stack/demo/dcc/makefile.b32 b/bacnet-stack/demo/dcc/makefile.b32 index 53b04700..dae4c1c4 100644 --- a/bacnet-stack/demo/dcc/makefile.b32 +++ b/bacnet-stack/demo/dcc/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/epics/Makefile b/bacnet-stack/demo/epics/Makefile index a33ac418..cae78439 100644 --- a/bacnet-stack/demo/epics/Makefile +++ b/bacnet-stack/demo/epics/Makefile @@ -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 diff --git a/bacnet-stack/demo/epics/makefile.b32 b/bacnet-stack/demo/epics/makefile.b32 index 1b59fa27..dd9c0bcf 100644 --- a/bacnet-stack/demo/epics/makefile.b32 +++ b/bacnet-stack/demo/epics/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/readfile/Makefile b/bacnet-stack/demo/readfile/Makefile index f1fe2366..ee45b1d7 100644 --- a/bacnet-stack/demo/readfile/Makefile +++ b/bacnet-stack/demo/readfile/Makefile @@ -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 diff --git a/bacnet-stack/demo/readfile/makefile.b32 b/bacnet-stack/demo/readfile/makefile.b32 index 8680de92..8940fefc 100644 --- a/bacnet-stack/demo/readfile/makefile.b32 +++ b/bacnet-stack/demo/readfile/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/readprop/Makefile b/bacnet-stack/demo/readprop/Makefile index 32378c62..5d49e0a8 100644 --- a/bacnet-stack/demo/readprop/Makefile +++ b/bacnet-stack/demo/readprop/Makefile @@ -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 diff --git a/bacnet-stack/demo/readprop/makefile.b32 b/bacnet-stack/demo/readprop/makefile.b32 index 53ee38c9..b742ba51 100644 --- a/bacnet-stack/demo/readprop/makefile.b32 +++ b/bacnet-stack/demo/readprop/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/reinit/Makefile b/bacnet-stack/demo/reinit/Makefile index 6c3cd121..5997aa19 100644 --- a/bacnet-stack/demo/reinit/Makefile +++ b/bacnet-stack/demo/reinit/Makefile @@ -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 diff --git a/bacnet-stack/demo/reinit/makefile.b32 b/bacnet-stack/demo/reinit/makefile.b32 index a44d5a46..36c9339d 100644 --- a/bacnet-stack/demo/reinit/makefile.b32 +++ b/bacnet-stack/demo/reinit/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/server/Makefile b/bacnet-stack/demo/server/Makefile index 8b7f1ac3..f37400c5 100644 --- a/bacnet-stack/demo/server/Makefile +++ b/bacnet-stack/demo/server/Makefile @@ -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 diff --git a/bacnet-stack/demo/server/makefile.b32 b/bacnet-stack/demo/server/makefile.b32 index 02ae4b7b..0c7dee40 100644 --- a/bacnet-stack/demo/server/makefile.b32 +++ b/bacnet-stack/demo/server/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/timesync/Makefile b/bacnet-stack/demo/timesync/Makefile index aa3b9974..a71b088e 100644 --- a/bacnet-stack/demo/timesync/Makefile +++ b/bacnet-stack/demo/timesync/Makefile @@ -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 diff --git a/bacnet-stack/demo/timesync/makefile.b32 b/bacnet-stack/demo/timesync/makefile.b32 index be6355c6..ec7cfeb0 100644 --- a/bacnet-stack/demo/timesync/makefile.b32 +++ b/bacnet-stack/demo/timesync/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/ucov/Makefile b/bacnet-stack/demo/ucov/Makefile index 598905b4..6bad65aa 100644 --- a/bacnet-stack/demo/ucov/Makefile +++ b/bacnet-stack/demo/ucov/Makefile @@ -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 diff --git a/bacnet-stack/demo/ucov/makefile.b32 b/bacnet-stack/demo/ucov/makefile.b32 index 419927e1..6a77f4b9 100644 --- a/bacnet-stack/demo/ucov/makefile.b32 +++ b/bacnet-stack/demo/ucov/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/whohas/Makefile b/bacnet-stack/demo/whohas/Makefile index 085bd352..d9bd6b9a 100644 --- a/bacnet-stack/demo/whohas/Makefile +++ b/bacnet-stack/demo/whohas/Makefile @@ -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 diff --git a/bacnet-stack/demo/whohas/makefile.b32 b/bacnet-stack/demo/whohas/makefile.b32 index 3ec0fdfa..8cb4635f 100644 --- a/bacnet-stack/demo/whohas/makefile.b32 +++ b/bacnet-stack/demo/whohas/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/whois/Makefile b/bacnet-stack/demo/whois/Makefile index 83e20de0..961aef33 100644 --- a/bacnet-stack/demo/whois/Makefile +++ b/bacnet-stack/demo/whois/Makefile @@ -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 diff --git a/bacnet-stack/demo/whois/makefile.b32 b/bacnet-stack/demo/whois/makefile.b32 index 3be0b0fa..2b67e393 100644 --- a/bacnet-stack/demo/whois/makefile.b32 +++ b/bacnet-stack/demo/whois/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/writefile/Makefile b/bacnet-stack/demo/writefile/Makefile index 9f501a91..4b1e2c6d 100644 --- a/bacnet-stack/demo/writefile/Makefile +++ b/bacnet-stack/demo/writefile/Makefile @@ -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 diff --git a/bacnet-stack/demo/writefile/makefile.b32 b/bacnet-stack/demo/writefile/makefile.b32 index e4e193f3..5c0b149b 100644 --- a/bacnet-stack/demo/writefile/makefile.b32 +++ b/bacnet-stack/demo/writefile/makefile.b32 @@ -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) diff --git a/bacnet-stack/demo/writeprop/Makefile b/bacnet-stack/demo/writeprop/Makefile index 5ff99373..ec2cc874 100644 --- a/bacnet-stack/demo/writeprop/Makefile +++ b/bacnet-stack/demo/writeprop/Makefile @@ -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 diff --git a/bacnet-stack/demo/writeprop/makefile.b32 b/bacnet-stack/demo/writeprop/makefile.b32 index 431822e7..e937bc5b 100644 --- a/bacnet-stack/demo/writeprop/makefile.b32 +++ b/bacnet-stack/demo/writeprop/makefile.b32 @@ -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) diff --git a/bacnet-stack/include/bacapp.h b/bacnet-stack/include/bacapp.h index c63410ea..9aa8f2a5 100644 --- a/bacnet-stack/include/bacapp.h +++ b/bacnet-stack/include/bacapp.h @@ -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; diff --git a/bacnet-stack/include/bacdcode.h b/bacnet-stack/include/bacdcode.h index 0bd71fe6..dec68ea6 100644 --- a/bacnet-stack/include/bacdcode.h +++ b/bacnet-stack/include/bacdcode.h @@ -40,6 +40,8 @@ #include "bacdef.h" #include "datetime.h" #include "bacstr.h" +#include "bacint.h" +#include "bacreal.h" #ifdef __cplusplus extern "C" { diff --git a/bacnet-stack/include/bacstr.h b/bacnet-stack/include/bacstr.h index 01989a04..8b21def8 100644 --- a/bacnet-stack/include/bacstr.h +++ b/bacnet-stack/include/bacstr.h @@ -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 */ diff --git a/bacnet-stack/include/config.h b/bacnet-stack/include/config.h index 267be280..0ff1d42b 100644 --- a/bacnet-stack/include/config.h +++ b/bacnet-stack/include/config.h @@ -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 diff --git a/bacnet-stack/include/iam.h b/bacnet-stack/include/iam.h index 074749cb..fb223182 100644 --- a/bacnet-stack/include/iam.h +++ b/bacnet-stack/include/iam.h @@ -37,6 +37,8 @@ #include #include #include "bacdef.h" +#include "bacaddr.h" +#include "npdu.h" #ifdef __cplusplus extern "C" { diff --git a/bacnet-stack/lib/Makefile b/bacnet-stack/lib/Makefile index d24a9638..67304eca 100644 --- a/bacnet-stack/lib/Makefile +++ b/bacnet-stack/lib/Makefile @@ -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 diff --git a/bacnet-stack/lib/makefile.b32 b/bacnet-stack/lib/makefile.b32 index ea025b56..0ee9ca9e 100644 --- a/bacnet-stack/lib/makefile.b32 +++ b/bacnet-stack/lib/makefile.b32 @@ -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) diff --git a/bacnet-stack/ports/atmega168/Makefile b/bacnet-stack/ports/atmega168/Makefile index c415665e..6030aab3 100644 --- a/bacnet-stack/ports/atmega168/Makefile +++ b/bacnet-stack/ports/atmega168/Makefile @@ -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 diff --git a/bacnet-stack/ports/atmega168/apdu.c b/bacnet-stack/ports/atmega168/apdu.c index 378e8483..21044482 100644 --- a/bacnet-stack/ports/atmega168/apdu.c +++ b/bacnet-stack/ports/atmega168/apdu.c @@ -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); diff --git a/bacnet-stack/ports/atmega168/av.c b/bacnet-stack/ports/atmega168/av.c index 8f6b2a22..151d2af7 100644 --- a/bacnet-stack/ports/atmega168/av.c +++ b/bacnet-stack/ports/atmega168/av.c @@ -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; diff --git a/bacnet-stack/ports/atmega168/bacnet.aps b/bacnet-stack/ports/atmega168/bacnet.aps index aaa27439..5de9c8e0 100644 --- a/bacnet-stack/ports/atmega168/bacnet.aps +++ b/bacnet-stack/ports/atmega168/bacnet.aps @@ -1 +1 @@ -13-Aug-2007 15:08:2716-Oct-2007 16:07:19013-Aug-2007 15:08:2744, 13, 0, 528AVR GCC241bacnet13-Aug-2007 15:11:0713-Aug-2007 15:11:07241013-Aug-2007 15:11:0744, 13, 0, 528AVR GCCbacnet.elfC:\code\bacnet-stack\ports\atmega168\ATmega168falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31AVR DragonAVR SimulatorATmega168.xmlAuto000main.crs485.ctimer.cdlmstp.cC:\code\bacnet-stack\demo\handler\txbuf.cdevice.cC:\code\bacnet-stack\src\crc.cC:\code\bacnet-stack\src\iam\iam_server.cC:\code\bacnet-stack\src\npdu.cai.capdu.ch_rp.cavr035.hhardware.hrs485.htimer.hC:\code\bacnet-stack\include\crc.hC:\code\bacnet-stack\include\dlmstp.hC:\code\bacnet-stack\include\iam.hC:\code\bacnet-stack\include\npdu.hC:\code\bacnet-stack\include\txbuf.hC:\code\bacnet-stack\include\bacenum.hMakefiledefaultYESMakefileatmega168100bacnet.elfdefault\0..\..\demo\handler\.\..\..\..\..\demo\object\-Wall -gdwarf-2 -DMAX_APDU=50 -DBACDL_MSTP -DBIG_ENDIAN=0 -DF_CPU=7372800UL -O0 -fsigned-chardefault1C:\WinAVR-20070525\bin\avr-gcc.exeC:\WinAVR-20070525\utils\bin\make.exe0282161937372800011000001920010000000001011main100000C:\WinAVR-20070525\avr\include\avr\eeprom.h100001C:\WinAVR-20070525\avr\include\avr\iomx8.h100002C:\WinAVR-20070525\examples\stdiodemo\uart.c100003main.c25900004C:\WinAVR-20070525\avr\include\avr\interrupt.h100005C:\WinAVR-20070525\avr\include\avr\io.h100006rs485.c25900007dlmstp.c25900008timer.c25900009h_rp.c25800010avr035.h100011ai.c1576 906 736 9330 0816 246 1425 6810 0651 628 811 6550 0742 319 1472 701156 01035 428 1195 4550 0649 657 809 6840 0654 231 1652 7610 0803 385 1801 9150 0627 209 1625 7390 0566 143 1296 5250 0588 165 1318 5470 0 +13-Aug-2007 15:08:2719-Oct-2007 09:38:42013-Aug-2007 15:08:2744, 13, 0, 528AVR GCC241bacnet13-Aug-2007 15:11:0713-Aug-2007 15:11:07241013-Aug-2007 15:11:0744, 13, 0, 528AVR GCCbacnet.elfC:\code\bacnet-stack\ports\atmega168\ATmega168falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31AVR DragonAVR SimulatorATmega168.xmlAuto000main.crs485.ctimer.cdlmstp.cC:\code\bacnet-stack\demo\handler\txbuf.cdevice.cC:\code\bacnet-stack\src\crc.cC:\code\bacnet-stack\src\npdu.cai.capdu.ch_rp.cC:\code\bacnet-stack\src\iam.cav.ch_wp.cC:\code\bacnet-stack\src\bacapp.cavr035.hhardware.hrs485.htimer.hC:\code\bacnet-stack\include\crc.hC:\code\bacnet-stack\include\dlmstp.hC:\code\bacnet-stack\include\iam.hC:\code\bacnet-stack\include\npdu.hC:\code\bacnet-stack\include\txbuf.hC:\code\bacnet-stack\include\bacenum.hC:\code\bacnet-stack\include\bacdcode.hMakefiledefaultYESMakefileatmega168100bacnet.elfdefault\1..\..\demo\handler\.\..\..\..\..\demo\object\-Wall -gdwarf-2 -DMAX_APDU=50 -DBACDL_MSTP -DBIG_ENDIAN=0 -DF_CPU=7372800UL -O0 -fsigned-chardefault1C:\WinAVR-20070525\bin\avr-gcc.exeC:\WinAVR-20070525\utils\bin\make.exe0282161937372800011000001920010000000001011main100000C:\WinAVR-20070525\avr\include\avr\eeprom.h100001C:\WinAVR-20070525\avr\include\avr\iomx8.h100002C:\WinAVR-20070525\examples\stdiodemo\uart.c100003main.c100004C:\WinAVR-20070525\avr\include\avr\interrupt.h100005C:\WinAVR-20070525\avr\include\avr\io.h100006rs485.c25800007dlmstp.c25800008timer.c25800009avr035.h100010C:\code\bacnet-stack\src\iam.c25800011C:\code\bacnet-stack\src\crc.c25800012av.c100013Makefile100014C:\code\bacnet-stack\src\bacapp.c100015C:\code\bacnet-stack\include\av.h1580 912 740 9390 0565 677 725 7040 0649 628 809 6550 0654 231 1436 613122 01033 428 1193 4550 0647 657 807 6840 0566 677 726 7010 0742 319 1524 70136 27588 165 1370 54750 16610 187 1392 569220 0698 275 1480 6570 0 diff --git a/bacnet-stack/ports/atmega168/h_wp.c b/bacnet-stack/ports/atmega168/h_wp.c index deef0347..4d0ef07f 100644 --- a/bacnet-stack/ports/atmega168/h_wp.c +++ b/bacnet-stack/ports/atmega168/h_wp.c @@ -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 diff --git a/bacnet-stack/ports/atmega168/main.c b/bacnet-stack/ports/atmega168/main.c index 84af9c70..76584d0d 100644 --- a/bacnet-stack/ports/atmega168/main.c +++ b/bacnet-stack/ports/atmega168/main.c @@ -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; } } diff --git a/bacnet-stack/src/bacapp.c b/bacnet-stack/src/bacapp.c index 218efbeb..1dd8fe0c 100644 --- a/bacnet-stack/src/bacapp.c +++ b/bacnet-stack/src/bacapp.c @@ -39,6 +39,8 @@ #include #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 #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) { diff --git a/bacnet-stack/src/bacstr.c b/bacnet-stack/src/bacstr.c index cd142503..7b258923 100644 --- a/bacnet-stack/src/bacstr.c +++ b/bacnet-stack/src/bacstr.c @@ -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) {