/** * Sends a TimeSync message using the local time from the device. */ void Send_TimeSync_Device(void) { BACNET_DATE_TIME local_time; Device_getCurrentDateTime(&local_time); Send_TimeSync(&local_time.date, &local_time.time); }
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; /* FIXME: we could send directed time sync, and how do 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; } #else (void) argc; (void) argv; #endif /* setup my info */ Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE); Init_Service_Handlers(); dlenv_init(); atexit(datalink_cleanup); /* configure the timeout values */ last_seconds = time(NULL); timeout_seconds = 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 = datalink_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; }