Esempio n. 1
0
/**************************************************************************
* 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);
    }
}
Esempio n. 2
0
/* test the ring buffer */
void testRingAroundBuffer(
    Test * pTest,
    RING_BUFFER * test_buffer,
    uint8_t * data_element,
    unsigned element_size,
    unsigned element_count)
{
    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_Get_Front(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);
                }
            }

            test_data = Ringbuf_Pop_Front(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);
                }
            }
        }
    }
    ct_test(pTest, Ringbuf_Empty(test_buffer));
}
/****************************************************************************
* DESCRIPTION: Looks at the data from the head of the list without removing it
* RETURN:      pointer to the data, or NULL if nothing in the list
* ALGORITHM:   none
* NOTES:       none
*****************************************************************************/
volatile uint8_t *Ringbuf_Peek(
    RING_BUFFER const *b)
{
    volatile uint8_t *data_element = NULL;      /* return value */

    if (!Ringbuf_Empty(b)) {
        data_element = b->buffer;
        data_element += ((b->tail % b->element_count) * b->element_size);
    }

    return data_element;
}
Esempio n. 4
0
/****************************************************************************
* DESCRIPTION: Gets the data from the front of the list, and removes it
* RETURN:      pointer to the data, or NULL if nothing in the list
* ALGORITHM:   none
* NOTES:       none
*****************************************************************************/
volatile uint8_t *Ringbuf_Pop_Front(
    RING_BUFFER * b)
{
    volatile uint8_t *data_element = NULL;

    if (!Ringbuf_Empty(b)) {
        data_element = b->buffer;
        data_element += ((b->tail % b->element_count) * b->element_size);
        b->tail++;
    }

    return data_element;
}
/****************************************************************************
* DESCRIPTION: Copy the data from the front of the list, and removes it
* RETURN:      true if data was copied, false if list is empty
* ALGORITHM:   none
* NOTES:       none
*****************************************************************************/
bool Ringbuf_Pop(
    RING_BUFFER * b,
    uint8_t * data_element)
{
    bool status = false;        /* return value */
    volatile uint8_t *ring_data = NULL; /* used to help point ring data */
    unsigned i; /* loop counter */

    if (!Ringbuf_Empty(b)) {
        ring_data = b->buffer;
        ring_data += ((b->tail % b->element_count) * b->element_size);
        if (data_element) {
            for (i = 0; i < b->element_size; i++) {
                data_element[i] = ring_data[i];
            }
        }
        b->tail++;
        status = true;
    }

    return status;
}
/* 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;
}
Esempio n. 7
0
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;
}