Beispiel #1
0
static mraa_boolean_t
mraa_ftdi_ft4222_has_internal_gpio_triggered(int pin)
{
    uint16 num_events = 0;
    FT4222_STATUS ft4222Status = FT4222_GPIO_GetTriggerStatus(ftHandleGpio, pin, &num_events);
    if (num_events > 0) {
        int i;
        uint16 num_events_read;
        GPIO_Trigger event;
        for (i = 0; i < num_events; ++i)
            FT4222_GPIO_ReadTriggerQueue(ftHandleGpio, pin, &event, 1, &num_events_read);
        return TRUE;
    } else
        return FALSE;
}
Beispiel #2
0
static void*
mraa_ftdi_ft4222_gpio_interrupt_handler_replace(mraa_gpio_context dev)
{
#ifdef USE_FT4222_GPIO_TRIGGER
    // FIXME: Use big buffer; shouldn't be more than this many events to read
    GPIO_Trigger event_buf[256];
    int prev_level = mraa_ftdi_ft4222_gpio_read_replace(dev);
    while (1) {
        uint16 num_events = 0;
        FT4222_STATUS status = FT4222_GPIO_GetTriggerStatus(ftHandleGpio, GPIO_PORT_IO_STATUS, &num_events);
        if (status != FT4222_OK)
            printf("FT4222_GPIO_GetTriggerStatus failed with code %d\n", status);
        printf("%u: FT4222_GPIO_GetTriggerStatus Events = %d\n", mraa_ftdi_ft4222_get_tick_count_ms(), num_events);
        if (num_events > 0) {
            int level = mraa_ftdi_ft4222_gpio_read_replace(dev);
            uint16 num_events_read;
            FT4222_GPIO_ReadTriggerQueue(ftHandleGpio, GPIO_PORT_IO_STATUS, event_buf, num_events, &num_events_read);
            // printf("%u: FT4222_GPIO_ReadTriggerQueue Events= %d\n", mraa_ftdi_ft4222_get_tick_count_ms(), num_events_read);
            printf("%u: level = %d\n", mraa_ftdi_ft4222_get_tick_count_ms(), level);
            if (level != prev_level) {
                dev->isr(dev->isr_args);
                prev_level = level;
            }

        }
        mraa_ftdi_ft4222_sleep_ms(20);
        // int level = mraa_ftdi_ft4222_gpio_read_replace(dev);
        // printf("level = %d\n", level);
    }
#else
    int prev_level = mraa_ftdi_ft4222_gpio_read_replace(dev);
    while (1) {
        int level = mraa_ftdi_ft4222_gpio_read_replace(dev);
        // MRAA_GPIO_EDGE_BOTH
        if (level != prev_level) {
            dev->isr(dev->isr_args);
            prev_level = level;
        }
        mraa_ftdi_ft4222_sleep_ms(100);
    }
#endif
    return NULL;
}