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; }
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; }