diff --git a/bacnet-stack/bacdef.h b/bacnet-stack/bacdef.h index dce15b32..a8839af2 100644 --- a/bacnet-stack/bacdef.h +++ b/bacnet-stack/bacdef.h @@ -87,7 +87,7 @@ typedef struct BACnet_Date { uint16_t year; /* AD */ uint8_t month; /* 1=Jan */ uint8_t day; /* 1..31 */ - uint8_t wday; /* 1=Monday */ + uint8_t wday; /* 1=Monday-7=Sunday */ } BACNET_DATE; /* time */ diff --git a/bacnet-stack/demo/handler/client.h b/bacnet-stack/demo/handler/client.h index 51c838a2..c69422f6 100644 --- a/bacnet-stack/demo/handler/client.h +++ b/bacnet-stack/demo/handler/client.h @@ -73,6 +73,10 @@ extern "C" { uint8_t Send_Device_Communication_Control_Request(uint32_t device_id, uint16_t timeDuration, /* 0=optional */ BACNET_COMMUNICATION_ENABLE_DISABLE state, char *password); /* NULL=optional */ + void Send_TimeSync(BACNET_DATE *bdate, BACNET_TIME *btime); + void Send_TimeSyncUTC(BACNET_DATE *bdate, BACNET_TIME *btime); + + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/bacnet-stack/demo/handler/h_ts.c b/bacnet-stack/demo/handler/h_ts.c new file mode 100644 index 00000000..7465ffc4 --- /dev/null +++ b/bacnet-stack/demo/handler/h_ts.c @@ -0,0 +1,88 @@ +/************************************************************************** +* +* Copyright (C) 2006 Steve Karg +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*********************************************************************/ +#include +#include +#include +#include "config.h" +#include "txbuf.h" +#include "bacdef.h" +#include "bacdcode.h" +#include "timesync.h" + +static void show_bacnet_date_time( + BACNET_DATE *bdate, + BACNET_TIME *btime) +{ + /* show the date received */ + fprintf(stderr, "%u", (unsigned)bdate->year); + fprintf(stderr, "/%u", (unsigned)bdate->month); + fprintf(stderr, "/%u", (unsigned)bdate->day); + /* show the time received */ + fprintf(stderr, " %u", (unsigned)btime->hour); + fprintf(stderr, ":%u", (unsigned)btime->min); + fprintf(stderr, ":%u", (unsigned)btime->sec); + fprintf(stderr, ".%02u", (unsigned)btime->hundredths); + fprintf(stderr, "\r\n"); +} + +void handler_timesync(uint8_t * service_request, + uint16_t service_len, BACNET_ADDRESS * src) +{ + int len = 0; + BACNET_DATE bdate; + BACNET_TIME btime; + + (void) src; + (void) service_len; + len = timesync_decode_service_request(service_request, + service_len, + &bdate, + &btime); + fprintf(stderr, "Received TimeSyncronization Request\r\n"); + show_bacnet_date_time(&bdate, &btime); + /* FIXME: set the time? */ + + return; +} + +void handler_timesync_utc(uint8_t * service_request, + uint16_t service_len, BACNET_ADDRESS * src) +{ + int len = 0; + BACNET_DATE bdate; + BACNET_TIME btime; + + (void) src; + (void) service_len; + len = timesync_decode_service_request(service_request, + service_len, + &bdate, + &btime); + fprintf(stderr, "Received TimeSyncronization Request\r\n"); + show_bacnet_date_time(&bdate, &btime); + /* FIXME: set the time? */ + + return; +} diff --git a/bacnet-stack/demo/handler/handlers.h b/bacnet-stack/demo/handler/handlers.h index eea70115..08132293 100644 --- a/bacnet-stack/demo/handler/handlers.h +++ b/bacnet-stack/demo/handler/handlers.h @@ -90,6 +90,12 @@ extern "C" { void handler_i_have(uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src); + + void handler_timesync(uint8_t * service_request, + uint16_t service_len, BACNET_ADDRESS * src); + + void handler_timesync_utc(uint8_t * service_request, + uint16_t service_len, BACNET_ADDRESS * src); #ifdef __cplusplus } diff --git a/bacnet-stack/demo/handler/s_ts.c b/bacnet-stack/demo/handler/s_ts.c new file mode 100644 index 00000000..04ae8471 --- /dev/null +++ b/bacnet-stack/demo/handler/s_ts.c @@ -0,0 +1,93 @@ +/************************************************************************** +* +* Copyright (C) 2005 Steve Karg +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*********************************************************************/ +#include +#include +#include +#include "config.h" +#include "config.h" +#include "txbuf.h" +#include "bacdef.h" +#include "bacdcode.h" +#include "address.h" +#include "tsm.h" +#include "npdu.h" +#include "apdu.h" +#include "device.h" +#include "datalink.h" +#include "dcc.h" +#include "timesync.h" +/* some demo stuff needed */ +#include "handlers.h" +#include "txbuf.h" + +void Send_TimeSync(BACNET_DATE *bdate, BACNET_TIME *btime) +{ + int pdu_len = 0; + BACNET_ADDRESS dest; + int bytes_sent = 0; + + if (!dcc_communication_enabled()) + return; + + /* we could use unicast or broadcast */ + datalink_get_broadcast_address(&dest); + /* encode the NPDU portion of the packet */ + pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, NULL, false, /* true for confirmed messages */ + MESSAGE_PRIORITY_NORMAL); + /* encode the APDU portion of the packet */ + pdu_len += timesync_encode_apdu(&Handler_Transmit_Buffer[pdu_len], + bdate, btime); + /* send it out the datalink */ + bytes_sent = datalink_send_pdu(&dest, + &Handler_Transmit_Buffer[0], pdu_len); + if (bytes_sent <= 0) + fprintf(stderr, "Failed to Send Time-Synchronization Request (%s)!\n", + strerror(errno)); +} + +void Send_TimeSyncUTC(BACNET_DATE *bdate, BACNET_TIME *btime) +{ + int pdu_len = 0; + BACNET_ADDRESS dest; + int bytes_sent = 0; + + if (!dcc_communication_enabled()) + return; + + /* we could use unicast or broadcast */ + datalink_get_broadcast_address(&dest); + /* encode the NPDU portion of the packet */ + pdu_len = npdu_encode_apdu(&Handler_Transmit_Buffer[0], &dest, NULL, false, /* true for confirmed messages */ + MESSAGE_PRIORITY_NORMAL); + /* encode the APDU portion of the packet */ + pdu_len += timesync_utc_encode_apdu(&Handler_Transmit_Buffer[pdu_len], + bdate, btime); + /* send it out the datalink */ + bytes_sent = datalink_send_pdu(&dest, + &Handler_Transmit_Buffer[0], pdu_len); + if (bytes_sent <= 0) + fprintf(stderr, "Failed to Send UTC-Time-Synchronization Request (%s)!\n", + strerror(errno)); +} diff --git a/bacnet-stack/demo/object/bacfile.c b/bacnet-stack/demo/object/bacfile.c index 4fc42c19..8f6f3f89 100644 --- a/bacnet-stack/demo/object/bacfile.c +++ b/bacnet-stack/demo/object/bacfile.c @@ -144,6 +144,8 @@ int bacfile_encode_property_apdu(uint8_t * apdu, int apdu_len = 0; /* return value */ char text_string[32] = { "" }; BACNET_CHARACTER_STRING char_string; + BACNET_DATE bdate; + BACNET_TIME btime; (void) array_index; switch (property) { @@ -173,11 +175,18 @@ int bacfile_encode_property_apdu(uint8_t * apdu, bacfile_file_size(object_instance)); break; case PROP_MODIFICATION_DATE: + /* FIXME: get the actual value instead of April Fool's Day */ + bdate.year = 2006; /* AD */ + bdate.month = 4; /* 1=Jan */ + bdate.day = 1; /* 1..31 */ + bdate.wday = 6; /* 1=Monday */ + apdu_len = encode_tagged_date(&apdu[0], &bdate); /* FIXME: get the actual value */ - apdu_len = encode_tagged_date(&apdu[0], - 2005, 12, 25, 7 /* sunday */ ); - /* FIXME: get the actual value */ - apdu_len += encode_tagged_time(&apdu[apdu_len], 12, 0, 0, 0); + btime.hour = 7; + btime.min = 0; + btime.sec = 3; + btime.hundredths = 1; + apdu_len += encode_tagged_time(&apdu[apdu_len], &btime); break; case PROP_ARCHIVE: /* FIXME: get the actual value: note it may be inverse... */ diff --git a/bacnet-stack/demo/timesync/Makefile b/bacnet-stack/demo/timesync/Makefile new file mode 100644 index 00000000..fb3050f3 --- /dev/null +++ b/bacnet-stack/demo/timesync/Makefile @@ -0,0 +1,81 @@ +#Makefile to build BACnet Application for the Linux Port +CC = gcc +BASEDIR = . +#CFLAGS = -Wall -I. +# -g for debugging with gdb +#CFLAGS = -Wall -I. -O2 -g +# Note: you can strip out symbols using the strip command +# to get an idea of how big the compile really is. +#DEFINES = -DBACFILE=1 -DBACDL_ETHERNET=1 +#DEFINES = -DBACFILE=1 -DBACDL_ARCNET=1 +#DEFINES = -DBACFILE=1 -DBACDL_MSTP=1 +DEFINES = -DBACFILE=1 -DTSM_ENABLED=0 -DBACDL_BIP=1 -DUSE_INADDR=0 +BACNET_PORT = ../../ports/linux +BACNET_OBJECT = ../object +BACNET_HANDLER = ../handler +BACNET_ROOT = ../.. +INCLUDES = -I$(BACNET_ROOT) -I$(BACNET_PORT) -I$(BACNET_OBJECT) -I$(BACNET_HANDLER) + +CFLAGS = -Wall -g $(INCLUDES) $(DEFINES) + +TARGET = bacts + +SRCS = main.c \ + $(BACNET_PORT)/bip-init.c \ + $(BACNET_ROOT)/bip.c \ + $(BACNET_HANDLER)/txbuf.c \ + $(BACNET_HANDLER)/noserv.c \ + $(BACNET_HANDLER)/h_whois.c \ + $(BACNET_HANDLER)/h_ihave.c \ + $(BACNET_HANDLER)/h_iam.c \ + $(BACNET_HANDLER)/h_rp.c \ + $(BACNET_HANDLER)/h_ts.c \ + $(BACNET_HANDLER)/s_ts.c \ + $(BACNET_OBJECT)/device.c \ + $(BACNET_OBJECT)/ai.c \ + $(BACNET_OBJECT)/ao.c \ + $(BACNET_OBJECT)/bacfile.c \ + $(BACNET_ROOT)/filename.c \ + $(BACNET_ROOT)/rp.c \ + $(BACNET_ROOT)/wp.c \ + $(BACNET_ROOT)/bacdcode.c \ + $(BACNET_ROOT)/bacapp.c \ + $(BACNET_ROOT)/bacprop.c \ + $(BACNET_ROOT)/bacstr.c \ + $(BACNET_ROOT)/bactext.c \ + $(BACNET_ROOT)/indtext.c \ + $(BACNET_ROOT)/bigend.c \ + $(BACNET_ROOT)/whois.c \ + $(BACNET_ROOT)/iam.c \ + $(BACNET_ROOT)/whohas.c \ + $(BACNET_ROOT)/ihave.c \ + $(BACNET_ROOT)/datalink.c \ + $(BACNET_ROOT)/address.c \ + $(BACNET_ROOT)/arf.c \ + $(BACNET_ROOT)/dcc.c \ + $(BACNET_ROOT)/timesync.c \ + $(BACNET_ROOT)/abort.c \ + $(BACNET_ROOT)/reject.c \ + $(BACNET_ROOT)/bacerror.c \ + $(BACNET_ROOT)/apdu.c \ + $(BACNET_ROOT)/npdu.c + +OBJS = ${SRCS:.c=.o} + +all: ${TARGET} + +${TARGET}: ${OBJS} + ${CC} -o $@ ${OBJS} + +.c.o: + ${CC} -c ${CFLAGS} $*.c -o $@ + +depend: + rm -f .depend + ${CC} -MM ${CFLAGS} *.c >> .depend + +clean: + rm -rf core ${TARGET} $(OBJS) *.bak ports/linux/*.bak *.1 *.ini + +include: .depend + diff --git a/bacnet-stack/demo/timesync/main.c b/bacnet-stack/demo/timesync/main.c new file mode 100644 index 00000000..7cc8ecd5 --- /dev/null +++ b/bacnet-stack/demo/timesync/main.c @@ -0,0 +1,207 @@ +/************************************************************************** +* +* Copyright (C) 2006 Steve Karg +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*********************************************************************/ + +/* command line tool that sends a BACnet service, and displays the reply */ +#include +#include +#include +#include +#include /* for time */ +#include +#include "bactext.h" +#include "config.h" +#include "bacdef.h" +#include "npdu.h" +#include "apdu.h" +#include "device.h" +#include "net.h" +#include "datalink.h" +#include "timesync.h" +/* some demo stuff needed */ +#include "filename.h" +#include "handlers.h" +#include "client.h" +#include "txbuf.h" + +/* buffer used for receive */ +static uint8_t Rx_Buf[MAX_MPDU] = { 0 }; + +/* global variables used in this file */ +static int32_t Target_Object_Instance_Min = 0; +static int32_t Target_Object_Instance_Max = BACNET_MAX_INSTANCE; + +static bool Error_Detected = false; + +void MyAbortHandler(BACNET_ADDRESS * src, + uint8_t invoke_id, uint8_t abort_reason) +{ + /* FIXME: verify src and invoke id */ + (void) src; + (void) invoke_id; + printf("BACnet Abort: %s\r\n", + bactext_abort_reason_name(abort_reason)); + Error_Detected = true; +} + +void MyRejectHandler(BACNET_ADDRESS * src, + uint8_t invoke_id, uint8_t reject_reason) +{ + /* FIXME: verify src and invoke id */ + (void) src; + (void) invoke_id; + printf("BACnet Reject: %s\r\n", + bactext_reject_reason_name(reject_reason)); + Error_Detected = true; +} + +static void Init_Service_Handlers(void) +{ + /* we need to handle who-is + to support dynamic device binding to us */ + apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS, + handler_who_is); + /* set the handler for all the services we don't implement + It is required to send the proper reject message... */ + apdu_set_unrecognized_service_handler_handler + (handler_unrecognized_service); + /* we must implement read property - it's required! */ + apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY, + handler_read_property); + /* handle the reply (request) coming in */ + apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION, + handler_timesync_utc); + apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION, + handler_timesync); + /* handle any errors coming back */ + apdu_set_abort_handler(MyAbortHandler); + apdu_set_reject_handler(MyRejectHandler); +} + +#ifdef BIP_DEBUG +static void print_address(char *name, BACNET_ADDRESS * dest) +{ /* destination address */ + int i = 0; /* counter */ + + if (dest) { + printf("%s: ", name); + for (i = 0; i < dest->mac_len; i++) { + printf("%02X", dest->mac[i]); + } + printf("\n"); + } +} +#endif + +int main(int argc, char *argv[]) +{ + BACNET_ADDRESS src = { 0 }; /* address where message came from */ + uint16_t pdu_len = 0; + unsigned timeout = 100; /* milliseconds */ + time_t elapsed_seconds = 0; + time_t last_seconds = 0; + time_t current_seconds = 0; + time_t timeout_seconds = 0; + time_t rawtime; + struct tm * my_time; + BACNET_DATE bdate; + BACNET_TIME btime; + +#ifdef BIP_DEBUG + BACNET_ADDRESS my_address, broadcast_address; +#endif + + /* FIXME: we could send directed time sync, and how to we send UTC? */ + #if 0 + if (argc < 2) { + printf("Usage: %s date time [device-instance]\r\n" + "Send BACnet TimeSynchronization request to all devices.\r\n" + "date format: year/month/day:dayofweek (e.g. 2006/4/1:6)\r\n" + "year: AD, such as 2006\r\n" + "month: 1=January, 12=December\r\n" + "day: 1-31\r\n" + "dayofweek: 1=Monday, 7=Sunday\r\n" + "\r\n" + "time format: hour:minute:second.hundredths (e.g. 23:59:59.12)\r\n" + "hour: 0-23\r\n" + "minute: 0-59\r\n" + "second: 0-59\r\n" + "hundredths: 0-99\r\n" + "\r\n" + "Optional device-instance sends a unicast time sync.\r\n", + filename_remove_path(argv[0])); + return 0; + } + #endif + /* setup my info */ + Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE); + Init_Service_Handlers(); + /* configure standard BACnet/IP port */ + bip_set_interface("eth0"); /* for linux */ + bip_set_port(0xBAC0); + if (!bip_init()) + return 1; +#ifdef BIP_DEBUG + datalink_get_broadcast_address(&broadcast_address); + print_address("Broadcast", &broadcast_address); + datalink_get_my_address(&my_address); + print_address("Address", &my_address); +#endif + /* configure the timeout values */ + last_seconds = time(NULL); + timeout_seconds = Device_APDU_Timeout() / 1000; + /* send the request */ + time ( &rawtime ); + my_time = localtime ( &rawtime ); + bdate.year = my_time->tm_year + 1900; + bdate.month = my_time->tm_mon + 1; + bdate.day = my_time->tm_mday; + bdate.wday = my_time->tm_wday?my_time->tm_wday:7; + btime.hour = my_time->tm_hour; + btime.min = my_time->tm_min; + btime.sec = my_time->tm_sec; + btime.hundredths = 0; + Send_TimeSync(&bdate,&btime); + /* loop forever - not necessary for time sync, but we can watch */ + for (;;) { + /* increment timer - exit if timed out */ + current_seconds = time(NULL); + /* returns 0 bytes on timeout */ + pdu_len = bip_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout); + /* process */ + if (pdu_len) { + npdu_handler(&src, &Rx_Buf[0], pdu_len); + } + if (Error_Detected) + break; + /* increment timer - exit if timed out */ + elapsed_seconds += (current_seconds - last_seconds); + if (elapsed_seconds > timeout_seconds) + break; + /* keep track of time for next check */ + last_seconds = current_seconds; + } + + return 0; +} diff --git a/bacnet-stack/demo/timesync/makefile.b32 b/bacnet-stack/demo/timesync/makefile.b32 new file mode 100644 index 00000000..4878080f --- /dev/null +++ b/bacnet-stack/demo/timesync/makefile.b32 @@ -0,0 +1,154 @@ +# +# Simple makefile to build an executable for Win32 +# +# This makefile assumes Borland bcc32 development environment +# on Windows NT/9x/2000/XP +# + +!ifndef BORLAND_DIR +BORLAND_DIR_Not_Defined: + @echo . + @echo You must define environment variable BORLAND_DIR to compile. +!endif + +PRODUCT = bacts +PRODUCT_EXE = $(PRODUCT).exe + +# Choose the Data Link Layer to Enable +DEFINES = -DBACDL_BIP=1;TSM_ENABLED=0;USE_INADDR=0 +# Directories +BACNET_PORT = ..\..\ports\win32 +BACNET_OBJECT = ..\object +BACNET_HANDLER = ..\handler +BACNET_ROOT = ..\.. + +SRCS = main.c \ + $(BACNET_PORT)\bip-init.c \ + $(BACNET_ROOT)\bip.c \ + $(BACNET_HANDLER)\txbuf.c \ + $(BACNET_HANDLER)\noserv.c \ + $(BACNET_HANDLER)\h_whois.c \ + $(BACNET_HANDLER)\h_iam.c \ + $(BACNET_HANDLER)\h_rp.c \ + $(BACNET_HANDLER)\h_ts.c \ + $(BACNET_HANDLER)\s_ts.c \ + $(BACNET_OBJECT)\bacfile.c \ + $(BACNET_OBJECT)\device.c \ + $(BACNET_OBJECT)\ai.c \ + $(BACNET_OBJECT)\ao.c \ + $(BACNET_ROOT)\address.c \ + $(BACNET_ROOT)\filename.c \ + $(BACNET_ROOT)\bacdcode.c \ + $(BACNET_ROOT)\bacapp.c \ + $(BACNET_ROOT)\bacstr.c \ + $(BACNET_ROOT)\bactext.c \ + $(BACNET_ROOT)\indtext.c \ + $(BACNET_ROOT)\bigend.c \ + $(BACNET_ROOT)\whois.c \ + $(BACNET_ROOT)\iam.c \ + $(BACNET_ROOT)\whohas.c \ + $(BACNET_ROOT)\ihave.c \ + $(BACNET_ROOT)\rd.c \ + $(BACNET_ROOT)\rp.c \ + $(BACNET_ROOT)\wp.c \ + $(BACNET_ROOT)\arf.c \ + $(BACNET_ROOT)\awf.c \ + $(BACNET_ROOT)\dcc.c \ + $(BACNET_ROOT)\timesync.c \ + $(BACNET_ROOT)\datalink.c \ + $(BACNET_ROOT)\abort.c \ + $(BACNET_ROOT)\reject.c \ + $(BACNET_ROOT)\bacerror.c \ + $(BACNET_ROOT)\apdu.c \ + $(BACNET_ROOT)\npdu.c + +OBJS = $(SRCS:.c=.obj) + +# Compiler definitions +# +CC = $(BORLAND_DIR)\bin\bcc32 +bcc32.cfg +#LINK = $(BORLAND_DIR)\bin\tlink32 +LINK = $(BORLAND_DIR)\bin\ilink32 +TLIB = $(BORLAND_DIR)\bin\tlib + +# +# Include directories +# +CC_DIR = $(BORLAND_DIR)\BIN +INCL_DIRS = -I$(BORLAND_DIR)\include;$(BACNET_ROOT)\;$(BACNET_OBJECT)\;$(BACNET_HANDLER)\;$(BACNET_PORT)\;. + +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 : bcc32.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) # command too long, bummer! + del *.obj + del $(BACNET_ROOT)\*.obj + del $(BACNET_HANDLER)\*.obj + del $(BACNET_OBJECT)\*.obj + del $(BACNET_PORT)\*.obj + del $(PRODUCT_EXE) + del *.map + del bcc32.cfg + +# +# Generic rules +# +.SUFFIXES: .cpp .c .sbr .obj + +# +# cc generic rule +# +.c.obj: + $(CC) -o$@ $< + +# Compiler configuration file +bcc32.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 diff --git a/bacnet-stack/demo/whois/Makefile b/bacnet-stack/demo/whois/Makefile index f276cb59..88306c1a 100644 --- a/bacnet-stack/demo/whois/Makefile +++ b/bacnet-stack/demo/whois/Makefile @@ -9,7 +9,7 @@ BASEDIR = . #DEFINES = -DBACFILE=1 -DBACDL_ETHERNET=1 #DEFINES = -DBACFILE=1 -DBACDL_ARCNET=1 #DEFINES = -DBACFILE=1 -DBACDL_MSTP=1 -DEFINES = -DBACFILE=1 -DTSM_ENABLED=0 -DBACDL_BIP=1 +DEFINES = -DBACFILE=1 -DTSM_ENABLED=0 -DBACDL_BIP=1 -DUSE_INADDR=1 BACNET_PORT = ../../ports/linux BACNET_OBJECT = ../object BACNET_HANDLER = ../handler diff --git a/bacnet-stack/timesync.c b/bacnet-stack/timesync.c index ddf958a4..0b6e7b07 100644 --- a/bacnet-stack/timesync.c +++ b/bacnet-stack/timesync.c @@ -194,20 +194,20 @@ void testTimeSyncData(Test * pTest, void testTimeSync(Test * pTest) { - BACNET_DATE my_date; - BACNET_TIME my_time; + BACNET_DATE bdate; + BACNET_TIME btime; - my_date.year = 2006; /* AD */ - my_date.month = 4; /* 1=Jan */ - my_date.day = 11; /* 1..31 */ - my_date.wday = 1; /* 1=Monday */ + bdate.year = 2006; /* AD */ + bdate.month = 4; /* 1=Jan */ + bdate.day = 11; /* 1..31 */ + bdate.wday = 1; /* 1=Monday */ - my_time.hour = 7; - my_time.min = 0; - my_time.sec = 3; - my_time.hundredths = 1; + btime.hour = 7; + btime.min = 0; + btime.sec = 3; + btime.hundredths = 1; - testTimeSyncData(pTest, &my_date, &my_time); + testTimeSyncData(pTest, &bdate, &btime); } #ifdef TEST_TIMESYNC diff --git a/bacnet-stack/timesync.h b/bacnet-stack/timesync.h index 334aca7e..8e71eef4 100644 --- a/bacnet-stack/timesync.h +++ b/bacnet-stack/timesync.h @@ -54,7 +54,6 @@ extern "C" { unsigned apdu_len, BACNET_DATE *my_date, BACNET_TIME *my_time); - int timesync_utc_decode_apdu(uint8_t * apdu, unsigned apdu_len, BACNET_DATE *my_date,