static void sig_handler( int signo) { datalink_cleanup(); print_address_cache(); print_tsm_stats(); exit(0); }
int main( int argc, char *argv[]) { BACNET_ADDRESS src = { 0 }; /* address where message came from */ uint16_t pdu_len = 0; unsigned timeout = 100; /* milliseconds */ BACNET_ADDRESS my_address, broadcast_address; (void) argc; (void) argv; Device_Set_Object_Instance_Number(4194300); address_init(); Init_Service_Handlers(); dlenv_init(); datalink_get_broadcast_address(&broadcast_address); print_address("Broadcast", &broadcast_address); datalink_get_my_address(&my_address); print_address("Address", &my_address); printf("BACnet stack running...\n"); /* loop forever */ for (;;) { /* input */ /* 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 (I_Am_Request) { I_Am_Request = false; Send_I_Am(&Handler_Transmit_Buffer[0]); } else if (Who_Is_Request) { Who_Is_Request = false; Send_WhoIs(-1, -1); } else { Read_Properties(); } /* output */ /* blink LEDs, Turn on or off outputs, etc */ /* wait for ESC from keyboard before quitting */ if (kbhit() && (getch() == 0x1B)) break; } print_address_cache(); return 0; }
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 total_seconds = 0; time_t elapsed_seconds = 0; time_t last_seconds = 0; time_t current_seconds = 0; time_t timeout_seconds = 0; BACNET_ADDRESS dest; int argi; /* print help if requested */ for (argi = 1; argi < argc; argi++) { if (strcmp(argv[argi], "--help") == 0) { print_help(filename_remove_path(argv[0])); return 0; } } datalink_get_broadcast_address(&dest); /* decode the command line parameters */ if (argc >= 2) { char *s; long v = strtol(argv[1], &s, 0); if (*s++ == ':') { if (argv[1][0] != ':') dest.net = (uint16_t) v; dest.mac_len = 0; if (isdigit(*s)) parse_bac_address(&dest, s); } else { Target_Object_Instance_Min = Target_Object_Instance_Max = v; } } if (argc <= 2) { /* empty */ } else if (argc == 3) { if (Target_Object_Instance_Min == -1) Target_Object_Instance_Min = Target_Object_Instance_Max = strtol(argv[2], NULL, 0); else Target_Object_Instance_Max = strtol(argv[2], NULL, 0); } else if (argc == 4) { Target_Object_Instance_Min = strtol(argv[2], NULL, 0); Target_Object_Instance_Max = strtol(argv[3], NULL, 0); } else { print_usage(filename_remove_path(argv[0])); return 1; } if (Target_Object_Instance_Min > BACNET_MAX_INSTANCE) { fprintf(stderr, "device-instance-min=%u - it must be less than %u\r\n", Target_Object_Instance_Min, BACNET_MAX_INSTANCE + 1); return 1; } if (Target_Object_Instance_Max > BACNET_MAX_INSTANCE) { fprintf(stderr, "device-instance-max=%u - it must be less than %u\r\n", Target_Object_Instance_Max, BACNET_MAX_INSTANCE + 1); return 1; } /* setup my info */ Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE); init_service_handlers(); address_init(); dlenv_init(); atexit(datalink_cleanup); /* configure the timeout values */ last_seconds = time(NULL); timeout_seconds = apdu_timeout() / 1000; /* send the request */ Send_WhoIs_To_Network(&dest, Target_Object_Instance_Min, Target_Object_Instance_Max); /* loop forever */ 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) { #if defined(BACDL_BIP) && BBMD_ENABLED bvlc_maintenance_timer(elapsed_seconds); #endif } total_seconds += elapsed_seconds; if (total_seconds > timeout_seconds) break; /* keep track of time for next check */ last_seconds = current_seconds; } print_address_cache(); return 0; }