/************************************************************************** * Description: handles recurring task * Returns: none * Notes: none **************************************************************************/ void bacnet_task(void) { struct mstp_rx_packet pkt = {{0}}; bool pdu_available = false; /* hello, World! */ if (Device_ID != Device_Object_Instance_Number()) { Device_ID = Device_Object_Instance_Number(); Send_I_Am(&Handler_Transmit_Buffer[0]); } /* handle the timers */ if (timer_interval_expired(&DCC_Timer)) { timer_interval_reset(&DCC_Timer); dcc_timer_seconds(DCC_CYCLE_SECONDS); led_on_interval(LED_DEBUG,500); } if (timer_interval_expired(&TSM_Timer)) { timer_interval_reset(&TSM_Timer); tsm_timer_milliseconds(timer_interval(&TSM_Timer)); } reinit_task(); bacnet_test_task(); /* handle the messaging */ if ((!dlmstp_send_pdu_queue_full()) && (!Ringbuf_Empty(&Receive_Queue))) { Ringbuf_Pop(&Receive_Queue, (uint8_t *)&pkt); pdu_available = true; } if (pdu_available) { led_on_interval(LED_APDU,125); npdu_handler(&pkt.src, &pkt.buffer[0], pkt.length); } }
/* test the ring buffer */ static void testRingAroundBuffer( Test * pTest, RING_BUFFER * test_buffer, uint8_t * data_element, unsigned element_size, unsigned element_count) { volatile uint8_t *test_data; unsigned index; unsigned data_index; unsigned count; unsigned dummy; bool status; ct_test(pTest, Ringbuf_Empty(test_buffer)); /* test the ring around the buffer */ for (index = 0; index < element_count; index++) { for (count = 1; count < 4; count++) { dummy = index * count; for (data_index = 0; data_index < element_size; data_index++) { data_element[data_index] = dummy; } status = Ringbuf_Put(test_buffer, data_element); ct_test(pTest, status == true); } for (count = 1; count < 4; count++) { dummy = index * count; test_data = Ringbuf_Peek(test_buffer); ct_test(pTest, test_data); if (test_data) { for (data_index = 0; data_index < element_size; data_index++) { ct_test(pTest, test_data[data_index] == dummy); } } (void) Ringbuf_Pop(test_buffer, NULL); } } ct_test(pTest, Ringbuf_Empty(test_buffer)); }
/* test the ring buffer */ static void testRingBuf( Test * pTest, uint8_t * data_store, uint8_t * data_element, unsigned element_size, unsigned element_count) { RING_BUFFER test_buffer; volatile uint8_t *test_data; unsigned index; unsigned data_index; bool status; Ringbuf_Init(&test_buffer, data_store, element_size, element_count); ct_test(pTest, Ringbuf_Empty(&test_buffer)); for (data_index = 0; data_index < element_size; data_index++) { data_element[data_index] = data_index; } status = Ringbuf_Put(&test_buffer, data_element); ct_test(pTest, status == true); ct_test(pTest, !Ringbuf_Empty(&test_buffer)); test_data = Ringbuf_Peek(&test_buffer); for (data_index = 0; data_index < element_size; data_index++) { ct_test(pTest, test_data[data_index] == data_element[data_index]); } ct_test(pTest, !Ringbuf_Empty(&test_buffer)); (void) Ringbuf_Pop(&test_buffer, NULL); ct_test(pTest, Ringbuf_Empty(&test_buffer)); /* fill to max */ for (index = 0; index < element_count; index++) { for (data_index = 0; data_index < element_size; data_index++) { data_element[data_index] = index; } status = Ringbuf_Put(&test_buffer, data_element); ct_test(pTest, status == true); ct_test(pTest, !Ringbuf_Empty(&test_buffer)); } /* verify actions on full buffer */ for (index = 0; index < element_count; index++) { for (data_index = 0; data_index < element_size; data_index++) { data_element[data_index] = index; } status = Ringbuf_Put(&test_buffer, data_element); ct_test(pTest, status == false); ct_test(pTest, !Ringbuf_Empty(&test_buffer)); } /* check buffer full */ for (index = 0; index < element_count; index++) { test_data = Ringbuf_Peek(&test_buffer); ct_test(pTest, test_data); if (test_data) { for (data_index = 0; data_index < element_size; data_index++) { ct_test(pTest, test_data[data_index] == index); } } (void) Ringbuf_Pop(&test_buffer, NULL); } ct_test(pTest, Ringbuf_Empty(&test_buffer)); testRingAroundBuffer(pTest, &test_buffer, data_element, element_size, element_count); /* adjust the internal index of Ringbuf to test unsigned wrapping */ test_buffer.head = UINT_MAX - 1; test_buffer.tail = UINT_MAX - 1; testRingAroundBuffer(pTest, &test_buffer, data_element, element_size, element_count); return; }