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)); } }
static void print_address_cache( void) { unsigned i, j; BACNET_ADDRESS address; uint32_t device_id = 0; unsigned max_apdu = 0; fprintf(stderr, "Device\tMAC\tMaxAPDU\tNet\n"); for (i = 0; i < MAX_ADDRESS_CACHE; i++) { if (address_get_by_index(i, &device_id, &max_apdu, &address)) { fprintf(stderr, "%u\t", device_id); for (j = 0; j < address.mac_len; j++) { fprintf(stderr, "%02X", address.mac[j]); } fprintf(stderr, "\t"); fprintf(stderr, "%hu\t", max_apdu); fprintf(stderr, "%hu\n", address.net); } } }
static void Read_Properties( void) { uint32_t device_id = 0; bool status = false; unsigned max_apdu = 0; BACNET_ADDRESS src; bool next_device = false; static unsigned index = 0; static unsigned property = 0; /* list of required (and some optional and proprietary) properties in the Device Object. Note that this demo tests for error messages so that the device doesn't have to have all the properties listed here. */ const int object_props[] = { PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_SYSTEM_STATUS, PROP_VENDOR_NAME, PROP_VENDOR_IDENTIFIER, PROP_MODEL_NAME, PROP_FIRMWARE_REVISION, PROP_APPLICATION_SOFTWARE_VERSION, PROP_PROTOCOL_VERSION, PROP_PROTOCOL_CONFORMANCE_CLASS, PROP_PROTOCOL_SERVICES_SUPPORTED, PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED, PROP_MAX_APDU_LENGTH_ACCEPTED, PROP_SEGMENTATION_SUPPORTED, PROP_LOCAL_TIME, PROP_LOCAL_DATE, PROP_UTC_OFFSET, PROP_DAYLIGHT_SAVINGS_STATUS, PROP_APDU_SEGMENT_TIMEOUT, PROP_APDU_TIMEOUT, PROP_NUMBER_OF_APDU_RETRIES, PROP_TIME_SYNCHRONIZATION_RECIPIENTS, PROP_MAX_MASTER, PROP_MAX_INFO_FRAMES, PROP_DEVICE_ADDRESS_BINDING, /* note: PROP_OBJECT_LIST is missing because the result can be very large. Read index 0 which gives us the number of objects in the list, and then we can read index 1, 2.. n one by one, rather than trying to read the entire object list in one message. */ /* some proprietary properties */ 514, 515, /* end of list */ -1 }; if (address_count()) { if (address_get_by_index(index, &device_id, &max_apdu, &src)) { if (object_props[property] < 0) next_device = true; else { /* note: if we wanted to do this synchronously, we would get the invoke ID from the sending of the request, and wait until we got the reply with matching invoke ID or the TSM of the invoke ID expired. This demo is doing things asynchronously. */ status = Send_Read_Property_Request(device_id, /* destination device */ OBJECT_DEVICE, device_id, object_props[property], BACNET_ARRAY_ALL); if (status) property++; } } else next_device = true; if (next_device) { next_device = false; index++; if (index >= MAX_ADDRESS_CACHE) index = 0; property = 0; } } return; }
static void Read_Properties( void) { uint32_t device_id = 0; bool status = false; unsigned max_apdu = 0; BACNET_ADDRESS src; bool next_device = false; static unsigned index = 0; static unsigned property = 0; /* list of required (and some optional) properties in the Device Object note: you could just loop through all the properties in all the objects. */ const int object_props[] = { PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_SYSTEM_STATUS, PROP_VENDOR_NAME, PROP_VENDOR_IDENTIFIER, PROP_MODEL_NAME, PROP_FIRMWARE_REVISION, PROP_APPLICATION_SOFTWARE_VERSION, PROP_PROTOCOL_VERSION, PROP_PROTOCOL_SERVICES_SUPPORTED, PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED, PROP_MAX_APDU_LENGTH_ACCEPTED, PROP_SEGMENTATION_SUPPORTED, PROP_LOCAL_TIME, PROP_LOCAL_DATE, PROP_UTC_OFFSET, PROP_DAYLIGHT_SAVINGS_STATUS, PROP_APDU_SEGMENT_TIMEOUT, PROP_APDU_TIMEOUT, PROP_NUMBER_OF_APDU_RETRIES, PROP_TIME_SYNCHRONIZATION_RECIPIENTS, PROP_MAX_MASTER, PROP_MAX_INFO_FRAMES, PROP_DEVICE_ADDRESS_BINDING, /* note: PROP_OBJECT_LIST is missing cause we need to get it with an index method since the list could be very large */ /* some proprietary properties */ 514, 515, /* end of list */ -1 }; if (address_count()) { if (address_get_by_index(index, &device_id, &max_apdu, &src)) { if (object_props[property] < 0) next_device = true; else { status = Send_Read_Property_Request(device_id, /* destination device */ OBJECT_DEVICE, device_id, object_props[property], BACNET_ARRAY_ALL); if (status) property++; } } else next_device = true; if (next_device) { next_device = false; index++; if (index >= MAX_ADDRESS_CACHE) index = 0; property = 0; } } return; }