void FreqData_Init(void) { Ringbuf_Init(&s_frequencyBuffer, (uint8_t*)s_freqData, sizeof(uint16_t), BUFFER_SIZE, true); Ringbuf_Init(&s_averageBuffer, (uint8_t*)s_averageData, sizeof(uint16_t), BUFFER_SIZE, true); // Fill the buffers with ideal frequency values uint8_t i = 0; uint16_t freq = IDEAL_F_MAINS * 1000U; for (i = 0; i < BUFFER_SIZE; ++i) { Ringbuf_Put(&s_frequencyBuffer, (uint8_t*)&freq); } }
/************************************************************************** * Description: initializes the BACnet library * Returns: none * Notes: none **************************************************************************/ void bacnet_init(void) { unsigned i; Ringbuf_Init(&Receive_Queue, (uint8_t *) & Receive_Buffer, sizeof(struct mstp_rx_packet), MSTP_RECEIVE_PACKET_COUNT); dlmstp_init(NULL); /* initialize objects */ Device_Init(NULL); /* set up our confirmed service unrecognized service handler - required! */ apdu_set_unrecognized_service_handler_handler (handler_unrecognized_service); /* we need to handle who-is to support dynamic device binding */ apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS, handler_who_is); apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_HAS, handler_who_has); /* Set the handlers for any confirmed services that we support. */ /* We must implement read property - it's required! */ apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY, handler_read_property); apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROP_MULTIPLE, handler_read_property_multiple); apdu_set_confirmed_handler(SERVICE_CONFIRMED_REINITIALIZE_DEVICE, handler_reinitialize_device); apdu_set_confirmed_handler(SERVICE_CONFIRMED_WRITE_PROPERTY, handler_write_property); /* handle communication so we can shut up when asked */ apdu_set_confirmed_handler(SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL, handler_device_communication_control); /* start the cyclic 1 second timer for DCC */ timer_interval_start_seconds(&DCC_Timer, DCC_CYCLE_SECONDS); /* start the cyclic 1 second timer for COV */ timer_interval_start_seconds(&COV_Timer, COV_CYCLE_SECONDS); /* start the cyclic 1 second timer for TSM */ timer_interval_start_seconds(&TSM_Timer, TSM_CYCLE_SECONDS); for (i = 0; i < MAX_ANALOG_INPUTS; i++) { Analog_Input_Units_Set( Analog_Input_Index_To_Instance(i), UNITS_PERCENT); } }
/* 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; }
void testRingBuf( Test * pTest) { RING_BUFFER test_buffer; char data_store[RING_BUFFER_DATA_SIZE * RING_BUFFER_COUNT]; char data[RING_BUFFER_DATA_SIZE]; char *test_data; unsigned index; unsigned data_index; unsigned count; unsigned dummy; bool status; Ringbuf_Init(&test_buffer, data_store, RING_BUFFER_DATA_SIZE, RING_BUFFER_COUNT); ct_test(pTest, Ringbuf_Empty(&test_buffer)); for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { data[data_index] = data_index; } status = Ringbuf_Put(&test_buffer, data); ct_test(pTest, status == true); ct_test(pTest, !Ringbuf_Empty(&test_buffer)); test_data = Ringbuf_Get_Front(&test_buffer); for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { ct_test(pTest, test_data[data_index] == data[data_index]); } ct_test(pTest, !Ringbuf_Empty(&test_buffer)); test_data = Ringbuf_Pop_Front(&test_buffer); for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { ct_test(pTest, test_data[data_index] == data[data_index]); } ct_test(pTest, Ringbuf_Empty(&test_buffer)); /* fill to max */ for (index = 0; index < RING_BUFFER_COUNT; index++) { for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { data[data_index] = index; } status = Ringbuf_Put(&test_buffer, data); ct_test(pTest, status == true); ct_test(pTest, !Ringbuf_Empty(&test_buffer)); } /* verify actions on full buffer */ for (index = 0; index < RING_BUFFER_COUNT; index++) { for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { data[data_index] = index; } status = Ringbuf_Put(&test_buffer, data); ct_test(pTest, status == false); ct_test(pTest, !Ringbuf_Empty(&test_buffer)); } /* check buffer full */ for (index = 0; index < RING_BUFFER_COUNT; index++) { test_data = Ringbuf_Get_Front(&test_buffer); for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { ct_test(pTest, test_data[data_index] == index); } test_data = Ringbuf_Pop_Front(&test_buffer); for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { ct_test(pTest, test_data[data_index] == index); } } ct_test(pTest, Ringbuf_Empty(&test_buffer)); /* test the ring around the buffer */ for (index = 0; index < RING_BUFFER_COUNT; index++) { for (count = 1; count < 4; count++) { dummy = index * count; for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { data[data_index] = dummy; } status = Ringbuf_Put(&test_buffer, data); ct_test(pTest, status == true); } for (count = 1; count < 4; count++) { dummy = index * count; test_data = Ringbuf_Get_Front(&test_buffer); for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { ct_test(pTest, test_data[data_index] == dummy); } test_data = Ringbuf_Pop_Front(&test_buffer); for (data_index = 0; data_index < RING_BUFFER_DATA_SIZE; data_index++) { ct_test(pTest, test_data[data_index] == dummy); } } } ct_test(pTest, Ringbuf_Empty(&test_buffer)); return; }