int main(int argc, char **argv) { uint8_t rx_buf[bacnet_MAX_MPDU]; uint16_t pdu_len; BACNET_ADDRESS src; pthread_t minute_tick_id, second_tick_id; bacnet_Device_Set_Object_Instance_Number(BACNET_INSTANCE_NO); bacnet_address_init(); /* Setup device objects */ bacnet_Device_Init(server_objects); BN_UNC(WHO_IS, who_is); BN_CON(READ_PROPERTY, read_property); bacnet_BIP_Debug = true; bacnet_bip_set_port(htons(BACNET_PORT)); bacnet_datalink_set(BACNET_DATALINK_TYPE); bacnet_datalink_init(BACNET_INTERFACE); atexit(bacnet_datalink_cleanup); memset(&src, 0, sizeof(src)); register_with_bbmd(); bacnet_Send_I_Am(bacnet_Handler_Transmit_Buffer); pthread_create(&minute_tick_id, 0, minute_tick, NULL); pthread_create(&second_tick_id, 0, second_tick, NULL); /* Start another thread here to retrieve your allocated registers from the * modbus server. This thread should have the following structure (in a * separate function): * * Initialise: * Connect to the modbus server * * Loop: * Read the required number of registers from the modbus server * Store the register data into a linked list */ while (1) { pdu_len = bacnet_datalink_receive( &src, rx_buf, bacnet_MAX_MPDU, BACNET_SELECT_TIMEOUT_MS); if (pdu_len) { /* May call any registered handler. * Thread safety: May block, however we still need to guarantee * atomicity with the timers, so hold the lock anyway */ pthread_mutex_lock(&timer_lock); bacnet_npdu_handler(&src, rx_buf, pdu_len); pthread_mutex_unlock(&timer_lock); } ms_tick(); } return 0; }
int main(int argc, char **argv) { uint8_t rx_buf[bacnet_MAX_MPDU]; uint16_t pdu_len; BACNET_ADDRESS src; pthread_t minute_tick_id, second_tick_id, modbus_side_id; // Used for creation of threads bacnet_Device_Set_Object_Instance_Number(BACNET_INSTANCE_NO); bacnet_address_init(); /* Setup device objects */ bacnet_Device_Init(server_objects); BN_UNC(WHO_IS, who_is); BN_CON(READ_PROPERTY, read_property); bacnet_BIP_Debug = true; bacnet_bip_set_port(htons(BACNET_PORT)); bacnet_datalink_set(BACNET_DATALINK_TYPE); bacnet_datalink_init(BACNET_INTERFACE); atexit(bacnet_datalink_cleanup); memset(&src, 0, sizeof(src)); register_with_bbmd(); bacnet_Send_I_Am(bacnet_Handler_Transmit_Buffer); pthread_create(&minute_tick_id, 0, minute_tick, NULL); // Create thread for minute_tick function pthread_create(&second_tick_id, 0, second_tick, NULL); // Create thread for second_tick function pthread_create(&modbus_side_id, 0, modbus_side, NULL); // Create thread for modbus_side function while (1) { pdu_len = bacnet_datalink_receive( &src, rx_buf, bacnet_MAX_MPDU, BACNET_SELECT_TIMEOUT_MS); if (pdu_len) { /* May call any registered handler. * Thread safety: May block, however we still need to guarantee * atomicity with the timers, so hold the lock anyway */ pthread_mutex_lock(&timer_lock); bacnet_npdu_handler(&src, rx_buf, pdu_len); pthread_mutex_unlock(&timer_lock); } ms_tick(); } return 0; }