firmata: very crude ISR implementation for EDGE_BOTH
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com> Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
committed by
Brendan Le Foll
parent
319c932036
commit
49ab97f81c
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
static t_firmata* firmata_dev;
|
static t_firmata* firmata_dev;
|
||||||
static pthread_t thread_id;
|
static pthread_t thread_id;
|
||||||
|
static volatile int isr_detected;
|
||||||
|
|
||||||
mraa_firmata_context
|
mraa_firmata_context
|
||||||
mraa_firmata_init(int feature)
|
mraa_firmata_init(int feature)
|
||||||
@@ -415,6 +416,34 @@ mraa_firmata_gpio_dir_replace(mraa_gpio_context dev, mraa_gpio_dir_t dir)
|
|||||||
return MRAA_SUCCESS;
|
return MRAA_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static mraa_result_t
|
||||||
|
mraa_firmata_gpio_edge_mode_replace(mraa_gpio_context dev, mraa_gpio_edge_t mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case MRAA_GPIO_EDGE_BOTH:
|
||||||
|
return MRAA_SUCCESS;
|
||||||
|
default:
|
||||||
|
return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static mraa_result_t
|
||||||
|
mraa_firmata_gpio_interrupt_handler_init_replace(mraa_gpio_context dev)
|
||||||
|
{
|
||||||
|
return MRAA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static mraa_result_t
|
||||||
|
mraa_firmata_gpio_wait_interrupt_replace(mraa_gpio_context dev)
|
||||||
|
{
|
||||||
|
while (!((isr_detected >> dev->pin) & 1)) {
|
||||||
|
usleep(100);
|
||||||
|
}
|
||||||
|
// might want to lock here?
|
||||||
|
isr_detected &= ~(1 << dev->pin);
|
||||||
|
return MRAA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static mraa_result_t
|
static mraa_result_t
|
||||||
mraa_firmata_gpio_close_replace(mraa_gpio_context dev)
|
mraa_firmata_gpio_close_replace(mraa_gpio_context dev)
|
||||||
{
|
{
|
||||||
@@ -471,8 +500,18 @@ mraa_firmata_pwm_enable_replace(mraa_pwm_context dev, int enable)
|
|||||||
static void*
|
static void*
|
||||||
mraa_firmata_pull_handler(void* vp)
|
mraa_firmata_pull_handler(void* vp)
|
||||||
{
|
{
|
||||||
|
int i, isr_now, isr_prev;
|
||||||
|
isr_prev = 0;
|
||||||
while(1) {
|
while(1) {
|
||||||
|
isr_now = 0;
|
||||||
firmata_pull(firmata_dev);
|
firmata_pull(firmata_dev);
|
||||||
|
// would prefer to send board pointer as argument
|
||||||
|
for(i = 0; i < 14; i++) {
|
||||||
|
isr_now |= (firmata_dev->pins[i].value & 1) << i;
|
||||||
|
}
|
||||||
|
// might want to lock here?
|
||||||
|
isr_detected = isr_prev ^ isr_now; //both edges for now
|
||||||
|
isr_prev = isr_now;
|
||||||
usleep(100);
|
usleep(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -605,6 +644,9 @@ mraa_firmata_plat_init(const char* uart_dev)
|
|||||||
b->adv_func->gpio_init_internal_replace = &mraa_firmata_gpio_init_internal_replace;
|
b->adv_func->gpio_init_internal_replace = &mraa_firmata_gpio_init_internal_replace;
|
||||||
b->adv_func->gpio_mode_replace = &mraa_firmata_gpio_mode_replace;
|
b->adv_func->gpio_mode_replace = &mraa_firmata_gpio_mode_replace;
|
||||||
b->adv_func->gpio_dir_replace = &mraa_firmata_gpio_dir_replace;
|
b->adv_func->gpio_dir_replace = &mraa_firmata_gpio_dir_replace;
|
||||||
|
b->adv_func->gpio_edge_mode_replace = &mraa_firmata_gpio_edge_mode_replace;
|
||||||
|
b->adv_func->gpio_interrupt_handler_init_replace = &mraa_firmata_gpio_interrupt_handler_init_replace;
|
||||||
|
b->adv_func->gpio_wait_interrupt_replace = &mraa_firmata_gpio_wait_interrupt_replace;
|
||||||
b->adv_func->gpio_read_replace = &mraa_firmata_gpio_read_replace;
|
b->adv_func->gpio_read_replace = &mraa_firmata_gpio_read_replace;
|
||||||
b->adv_func->gpio_write_replace = &mraa_firmata_gpio_write_replace;
|
b->adv_func->gpio_write_replace = &mraa_firmata_gpio_write_replace;
|
||||||
b->adv_func->gpio_close_replace = &mraa_firmata_gpio_close_replace;
|
b->adv_func->gpio_close_replace = &mraa_firmata_gpio_close_replace;
|
||||||
|
|||||||
Reference in New Issue
Block a user