mraa_result_t mraa_gpio_isr(mraa_gpio_context dev, mraa_gpio_edge_t mode, void (*fptr)(void*), void* args) { // we only allow one isr per mraa_gpio_context if (dev->thread_id != 0) { return MRAA_ERROR_NO_RESOURCES; } if (MRAA_SUCCESS != mraa_gpio_edge_mode(dev, mode)) { return MRAA_ERROR_UNSPECIFIED; } dev->isr = fptr; #if defined(SWIGJAVA) || defined(JAVACALLBACK) JNIEnv *jenv; /* Most UPM sensors use the C API, the global ref must be created here. */ /* The reason for checking the callback function is internal callbacks. */ if (fptr == mraa_java_isr_callback) { (*globVM)->GetEnv(globVM, (void **)&jenv, JNI_VERSION_1_8); jobject grunnable = (*jenv)->NewGlobalRef(jenv, (jobject) args); args = (void *) grunnable; } #endif dev->isr_args = args; pthread_create(&dev->thread_id, NULL, mraa_gpio_interrupt_handler, (void*) dev); return MRAA_SUCCESS; }
mraa_result_t mraa_gpio_isr_exit(mraa_gpio_context dev) { mraa_result_t ret = MRAA_SUCCESS; if (dev == NULL) { return MRAA_ERROR_INVALID_HANDLE; } if (IS_FUNC_DEFINED(dev, gpio_isr_exit_replace)) { return dev->advance_func->gpio_isr_exit_replace(dev); } // wasting our time, there is no isr to exit from if (dev->thread_id == 0 && dev->isr_value_fp == -1) { return ret; } // mark the beginning of the thread termination process for interested parties dev->isr_thread_terminating = 1; // stop isr being useful ret = mraa_gpio_edge_mode(dev, MRAA_GPIO_EDGE_NONE); if ((dev->thread_id != 0)) { #ifdef HAVE_PTHREAD_CANCEL if ((pthread_cancel(dev->thread_id) != 0) || (pthread_join(dev->thread_id, NULL) != 0)) { ret = MRAA_ERROR_INVALID_RESOURCE; } #else close(dev->isr_control_pipe[1]); if (pthread_join(dev->thread_id, NULL) != 0) ret = MRAA_ERROR_INVALID_RESOURCE; close(dev->isr_control_pipe[0]); dev->isr_control_pipe[0] = dev->isr_control_pipe[1] = -1; #endif } // close the filehandle in case it's still open if (dev->isr_value_fp != -1) { if (close(dev->isr_value_fp) != 0) { ret = MRAA_ERROR_INVALID_RESOURCE; } } // assume our thread will exit either way we just lost it's handle dev->thread_id = 0; dev->isr_value_fp = -1; dev->isr_thread_terminating = 0; return ret; }
mraa_result_t mraa_gpio_isr(mraa_gpio_context dev, gpio_edge_t mode, void (*fptr)(void *), void * args) { // we only allow one isr per mraa_gpio_context if (dev->thread_id != 0) { return MRAA_ERROR_NO_RESOURCES; } if (MRAA_SUCCESS != mraa_gpio_edge_mode(dev, mode)) { return MRAA_ERROR_UNSPECIFIED; } dev->isr = fptr; dev->isr_args = args; pthread_create (&dev->thread_id, NULL, mraa_gpio_interrupt_handler, (void *) dev); return MRAA_SUCCESS; }
mraa_result_t mraa_gpio_isr(mraa_gpio_context dev, mraa_gpio_edge_t mode, void (*fptr)(void*), void* args) { if (dev == NULL) { syslog(LOG_ERR, "gpio: isr: context is invalid"); return MRAA_ERROR_INVALID_HANDLE; } if (IS_FUNC_DEFINED(dev, gpio_isr_replace)) { return dev->advance_func->gpio_isr_replace(dev, mode, fptr, args); } // we only allow one isr per mraa_gpio_context if (dev->thread_id != 0) { return MRAA_ERROR_NO_RESOURCES; } mraa_result_t ret = mraa_gpio_edge_mode(dev, mode); if (ret != MRAA_SUCCESS) { return ret; } dev->isr = fptr; /* Most UPM sensors use the C API, the Java global ref must be created here. */ /* The reason for checking the callback function is internal callbacks. */ if (lang_func->java_create_global_ref != NULL) { if (dev->isr == lang_func->java_isr_callback) { args = lang_func->java_create_global_ref(args); } } dev->isr_args = args; pthread_create(&dev->thread_id, NULL, mraa_gpio_interrupt_handler, (void*) dev); return MRAA_SUCCESS; }
mraa_result_t mraa_gpio_isr_exit(mraa_gpio_context dev) { mraa_result_t ret = MRAA_SUCCESS; // wasting our time, there is no isr to exit from if (dev->thread_id == 0 && dev->isr_value_fp == -1) { return ret; } // stop isr being useful ret = mraa_gpio_edge_mode(dev, MRAA_GPIO_EDGE_NONE); if ((dev->thread_id != 0)) { if ((pthread_cancel(dev->thread_id) != 0) || (pthread_join(dev->thread_id, NULL) != 0)) { ret = MRAA_ERROR_INVALID_HANDLE; } } // close the filehandle in case it's still open if (dev->isr_value_fp != -1) { if (close(dev->isr_value_fp) != 0) { ret = MRAA_ERROR_INVALID_PARAMETER; } } #ifdef SWIGPYTHON // Dereference our Python call back function Py_DECREF(dev->isr); #endif // assume our thread will exit either way we just lost it's handle dev->thread_id = 0; dev->isr_value_fp = -1; return ret; }
/** * Set the edge mode for ISR * * @param mode The edge mode to set * @return Result of operation */ Result edge(Edge mode) { return (Result) mraa_gpio_edge_mode(m_gpio, (mraa_gpio_edge_t) mode); }
/** * Set the edge mode for ISR * * @param mode The edge mode to set * @return Result of operation */ mraa_result_t edge(Edge mode) { return mraa_gpio_edge_mode(m_gpio, (gpio_edge_t) mode); }