diff --git a/bacnet-stack/ports/linux/dlmstp.c b/bacnet-stack/ports/linux/dlmstp.c index b3b74172..d97f4d97 100644 --- a/bacnet-stack/ports/linux/dlmstp.c +++ b/bacnet-stack/ports/linux/dlmstp.c @@ -45,6 +45,7 @@ #include "dlmstp.h" #include "rs485.h" #include "npdu.h" +#include "bits.h" /* Number of MS/TP Packets Rx/Tx */ uint16_t MSTP_Packets = 0; @@ -281,7 +282,7 @@ uint16_t MSTP_Put_Receive( mstp_port->SourceAddress); packet.pdu_len = pdu_len; /* ready is not used in this scheme */ - packet.ready = true; + packet.ready = true; write(Receive_Server_SockFD, &packet, sizeof(packet)); } @@ -371,7 +372,7 @@ uint16_t MSTP_Get_Send( &mstp_port->OutputBuffer[0], /* <-- loading this */ mstp_port->OutputBufferSize, packet.frame_type, - destination, + destination, mstp_port->This_Station, &packet.pdu[0], packet.pdu_len); @@ -399,7 +400,7 @@ bool dlmstp_same_bacnet_address(BACNET_ADDRESS * dest, BACNET_ADDRESS * src) if (dest->adr[i] != src->adr[i]) return false; } - + return true; } @@ -412,8 +413,8 @@ bool dlmstp_compare_data_expecting_reply( BACNET_ADDRESS *dest_address) { uint16_t offset; - /* One way to check the message is to compare NPDU - src, dest, along with the APDU type, invoke id. + /* One way to check the message is to compare NPDU + src, dest, along with the APDU type, invoke id. Seems a bit overkill */ struct DER_compare_t { BACNET_NPDU_DATA npdu_data; @@ -428,7 +429,7 @@ bool dlmstp_compare_data_expecting_reply( /* decode the request data */ request.address.mac[0] = src_address; request.address.mac_len = 1; - offset = npdu_decode(&request_pdu[0], + offset = npdu_decode(&request_pdu[0], NULL, &request.address, &request.npdu_data); if (request.npdu_data.network_layer_message) { return false; @@ -445,12 +446,12 @@ bool dlmstp_compare_data_expecting_reply( request.service_choice = request_pdu[offset+3]; /* decode the reply data */ dlmstp_copy_bacnet_address(&reply.address, dest_address); - offset = npdu_decode(&reply_pdu[0], + offset = npdu_decode(&reply_pdu[0], &reply.address, NULL, &reply.npdu_data); if (reply.npdu_data.network_layer_message) { return false; } - /* reply could be a lot of things: + /* reply could be a lot of things: confirmed, simple ack, abort, reject, error */ reply.pdu_type = reply_pdu[offset] & 0xF0; switch (reply.pdu_type) { @@ -508,7 +509,7 @@ bool dlmstp_compare_data_expecting_reply( if (!dlmstp_same_bacnet_address(&request.address, &reply.address)) { return false; } - + return true; } diff --git a/bacnet-stack/ports/win32/dlmstp.c b/bacnet-stack/ports/win32/dlmstp.c index 0a5397f1..b70e38ef 100644 --- a/bacnet-stack/ports/win32/dlmstp.c +++ b/bacnet-stack/ports/win32/dlmstp.c @@ -33,6 +33,7 @@ #include "dlmstp.h" #include "rs485.h" #include "npdu.h" +#include "bits.h" #define WIN32_LEAN_AND_MEAN #define STRICT 1 @@ -113,12 +114,11 @@ int dlmstp_send_pdu(BACNET_ADDRESS * dest, /* destination address */ unsigned pdu_len) { /* number of bytes of data */ int bytes_sent = 0; - uint8_t destination = 0; /* destination address */ unsigned i = 0; if (!Transmit_Packet.ready) { if (npdu_data->data_expecting_reply) { - Transmit_Packet.frame_type = + Transmit_Packet.frame_type = FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY; } else { Transmit_Packet.frame_type = @@ -308,7 +308,7 @@ uint16_t MSTP_Get_Send( &mstp_port->OutputBuffer[0], /* <-- loading this */ mstp_port->OutputBufferSize, Transmit_Packet.frame_type, - destination, + destination, mstp_port->This_Station, &Transmit_Packet.pdu[0], Transmit_Packet.pdu_len); @@ -337,7 +337,7 @@ bool dlmstp_same_bacnet_address(BACNET_ADDRESS * dest, BACNET_ADDRESS * src) if (dest->adr[i] != src->adr[i]) return false; } - + return true; } @@ -350,8 +350,8 @@ bool dlmstp_compare_data_expecting_reply( BACNET_ADDRESS *dest_address) { uint16_t offset; - /* One way to check the message is to compare NPDU - src, dest, along with the APDU type, invoke id. + /* One way to check the message is to compare NPDU + src, dest, along with the APDU type, invoke id. Seems a bit overkill */ struct DER_compare_t { BACNET_NPDU_DATA npdu_data; @@ -366,7 +366,7 @@ bool dlmstp_compare_data_expecting_reply( /* decode the request data */ request.address.mac[0] = src_address; request.address.mac_len = 1; - offset = npdu_decode(&request_pdu[0], + offset = npdu_decode(&request_pdu[0], NULL, &request.address, &request.npdu_data); if (request.npdu_data.network_layer_message) { return false; @@ -383,12 +383,12 @@ bool dlmstp_compare_data_expecting_reply( request.service_choice = request_pdu[offset+3]; /* decode the reply data */ dlmstp_copy_bacnet_address(&reply.address, dest_address); - offset = npdu_decode(&reply_pdu[0], + offset = npdu_decode(&reply_pdu[0], &reply.address, NULL, &reply.npdu_data); if (reply.npdu_data.network_layer_message) { return false; } - /* reply could be a lot of things: + /* reply could be a lot of things: confirmed, simple ack, abort, reject, error */ reply.pdu_type = reply_pdu[offset] & 0xF0; switch (reply.pdu_type) { @@ -446,7 +446,7 @@ bool dlmstp_compare_data_expecting_reply( if (!dlmstp_same_bacnet_address(&request.address, &reply.address)) { return false; } - + return true; } @@ -700,6 +700,16 @@ bool dlmstp_init(char *ifname) #ifdef TEST_DLMSTP #include + +void apdu_handler(BACNET_ADDRESS * src, /* source address */ + uint8_t * apdu, /* APDU data */ + uint16_t pdu_len) /* for confirmed messages */ +{ + (void)src; + (void)apdu; + (void)pdu_len; +} + /* returns a delta timestamp */ uint32_t timestamp_ms(void) { diff --git a/bacnet-stack/ports/win32/dlmstp.cbp b/bacnet-stack/ports/win32/dlmstp.cbp index acd210c2..09b0d5f4 100644 --- a/bacnet-stack/ports/win32/dlmstp.cbp +++ b/bacnet-stack/ports/win32/dlmstp.cbp @@ -3,11 +3,12 @@ diff --git a/bacnet-stack/ports/win32/rx_fsm.mak b/bacnet-stack/ports/win32/rx_fsm.mak new file mode 100644 index 00000000..d60c3fba --- /dev/null +++ b/bacnet-stack/ports/win32/rx_fsm.mak @@ -0,0 +1,113 @@ +# +# Simple makefile to build an executable for Win32 console +# +# This makefile assumes Borland development environment +# on Windows NT/9x/2000/XP +# Tools: bcc32, make, ilink + +!ifndef BORLAND_DIR +BORLAND_DIR_Not_Defined: + @echo . + @echo You must define environment variable BORLAND_DIR to compile. +!endif + +PRODUCT = rx_fsm +PRODUCT_EXE = $(PRODUCT).exe + +# Choose the Data Link Layer to Enable +DEFINES = -DBACDL_MSTP + +SRCS = rs485.c \ + rx_fsm.c \ + ..\..\mstp.c \ + ..\..\mstptext.c \ + ..\..\indtext.c \ + ..\..\crc.c + +OBJS = $(SRCS:.c=.obj) + +# Compiler definitions +# +BCC_CFG = bcc32.cfg +CC = $(BORLAND_DIR)\bin\bcc32 +$(BCC_CFG) +#LINK = $(BORLAND_DIR)\bin\tlink32 +LINK = $(BORLAND_DIR)\bin\ilink32 +TLIB = $(BORLAND_DIR)\bin\tlib + +# +# Include directories +# +CC_DIR = $(BORLAND_DIR)\BIN +BACNET_INCL = ..\..\;..\..\demo\handler\;..\..\demo\object\;. +INCL_DIRS = -I$(BORLAND_DIR)\include;$(BACNET_INCL) + +CFLAGS = $(INCL_DIRS) $(CS_FLAGS) $(DEFINES) + +# Libraries +# +C_LIB_DIR = $(BORLAND_DIR)\lib + +LIBS = $(C_LIB_DIR)\IMPORT32.lib \ +$(C_LIB_DIR)\CW32MT.lib + +# +# Main target +# +# This should be the first one in the makefile + +all : $(BCC_CFG) $(PRODUCT_EXE) + +# Linker specific: the link below is for BCC linker/compiler. If you link +# with a different linker - please change accordingly. +# + +# need a temp response file (@&&) because command line is too long +$(PRODUCT_EXE) : $(OBJS) + @echo Running Linker for $(PRODUCT_EXE) + $(LINK) -L$(C_LIB_DIR) -m -c -s -v @&&| # temp response file, starts with | + $(BORLAND_DIR)\lib\c0x32.obj $** # $** lists each dependency + $< + $*.map + $(LIBS) +| # end of temp response file + +# +# Utilities + +clean : + @echo Deleting obj files, $(PRODUCT_EXE) and map files. + del $(OBJS) + del $(PRODUCT_EXE) + del *.map + del $(BCC_CFG) + +# +# Generic rules +# +.SUFFIXES: .cpp .c .sbr .obj + +# +# cc generic rule +# +.c.obj: + $(CC) -o$@ $< + +# Compiler configuration file +$(BCC_CFG) : + Copy &&| +$(CFLAGS) +-c +-y #include line numbers in OBJ's +-v #include debug info +-w+ #turn on all warnings +-Od #disable all optimizations +#-a4 #32 bit data alignment +#-M # generate link map +#-ls # linker options +#-WM- #not multithread +-WM #multithread +-w-aus # ignore warning assigned a value that is never used +-w-sig # ignore warning conversion may lose sig digits +| $@ + +# EOF: makefile