void testAddress( Test * pTest) { unsigned i, count; BACNET_ADDRESS src; uint32_t device_id = 0; unsigned max_apdu = 480; BACNET_ADDRESS test_address; uint32_t test_device_id = 0; unsigned test_max_apdu = 0; /* create a fake address database */ for (i = 0; i < MAX_ADDRESS_CACHE; i++) { set_address(i, &src); device_id = i * 255; address_add(device_id, max_apdu, &src); count = address_count(); ct_test(pTest, count == (i + 1)); } for (i = 0; i < MAX_ADDRESS_CACHE; i++) { device_id = i * 255; set_address(i, &src); /* test the lookup by device id */ ct_test(pTest, address_get_by_device(device_id, &test_max_apdu, &test_address)); ct_test(pTest, test_max_apdu == max_apdu); ct_test(pTest, bacnet_address_same(&test_address, &src)); ct_test(pTest, address_get_by_index(i, &test_device_id, &test_max_apdu, &test_address)); ct_test(pTest, test_device_id == device_id); ct_test(pTest, test_max_apdu == max_apdu); ct_test(pTest, bacnet_address_same(&test_address, &src)); ct_test(pTest, address_count() == MAX_ADDRESS_CACHE); /* test the lookup by MAC */ ct_test(pTest, address_get_device_id(&src, &test_device_id)); ct_test(pTest, test_device_id == device_id); } for (i = 0; i < MAX_ADDRESS_CACHE; i++) { device_id = i * 255; address_remove_device(device_id); ct_test(pTest, !address_get_by_device(device_id, &test_max_apdu, &test_address)); count = address_count(); ct_test(pTest, count == (MAX_ADDRESS_CACHE - i - 1)); } }
void Notification_Class_common_reporting_function( BACNET_EVENT_NOTIFICATION_DATA * event_data) { /* Fill the parameters common for all types of events. */ NOTIFICATION_CLASS_INFO *CurrentNotify; BACNET_DESTINATION *pBacDest; uint32_t notify_index; uint8_t index; notify_index = Notification_Class_Instance_To_Index(event_data->notificationClass); if (notify_index < MAX_NOTIFICATION_CLASSES) CurrentNotify = &NC_Info[notify_index]; else return; /* Initiating Device Identifier */ event_data->initiatingObjectIdentifier.type = OBJECT_DEVICE; event_data->initiatingObjectIdentifier.instance = Device_Object_Instance_Number(); /* Priority and AckRequired */ switch (event_data->toState) { case EVENT_STATE_NORMAL: event_data->priority = CurrentNotify->Priority[TRANSITION_TO_NORMAL]; event_data->ackRequired = (CurrentNotify-> Ack_Required & TRANSITION_TO_NORMAL_MASKED) ? true : false; break; case EVENT_STATE_FAULT: event_data->priority = CurrentNotify->Priority[TRANSITION_TO_FAULT]; event_data->ackRequired = (CurrentNotify-> Ack_Required & TRANSITION_TO_FAULT_MASKED) ? true : false; break; case EVENT_STATE_OFFNORMAL: case EVENT_STATE_HIGH_LIMIT: case EVENT_STATE_LOW_LIMIT: event_data->priority = CurrentNotify->Priority[TRANSITION_TO_OFFNORMAL]; event_data->ackRequired = (CurrentNotify->Ack_Required & TRANSITION_TO_OFFNORMAL_MASKED) ? true : false; break; default: /* shouldn't happen */ break; } /* send notifications for active recipients */ /* pointer to first recipient */ pBacDest = &CurrentNotify->Recipient_List[0]; for (index = 0; index < NC_MAX_RECIPIENTS; index++, pBacDest++) { /* check if recipient is defined */ if (pBacDest->Recipient.RecipientType == RECIPIENT_TYPE_NOTINITIALIZED) break; /* recipient doesn't defined - end of list */ if (IsRecipientActive(pBacDest, event_data->toState) == true) { BACNET_ADDRESS dest; uint32_t device_id; unsigned max_apdu; /* Process Identifier */ event_data->processIdentifier = pBacDest->ProcessIdentifier; /* send notification */ if (pBacDest->Recipient.RecipientType == RECIPIENT_TYPE_DEVICE) { /* send notification to the specified device */ device_id = pBacDest->Recipient._.DeviceIdentifier; if (pBacDest->ConfirmedNotify == true) Send_CEvent_Notify(device_id, event_data); else if (address_get_by_device(device_id, &max_apdu, &dest)) Send_UEvent_Notify(Handler_Transmit_Buffer, event_data, &dest); } else if (pBacDest->Recipient.RecipientType == RECIPIENT_TYPE_ADDRESS) { /* send notification to the address indicated */ if (pBacDest->ConfirmedNotify == true) { if (address_get_device_id(&dest, &device_id)) Send_CEvent_Notify(device_id, event_data); } else { dest = pBacDest->Recipient._.Address; Send_UEvent_Notify(Handler_Transmit_Buffer, event_data, &dest); } } } } }