Example #1
0
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;
}
Example #2
0
File: gpio.c Project: fboudra/mraa
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;
}
Example #3
0
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;
}
Example #4
0
File: gpio.c Project: fboudra/mraa
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;
}
Example #5
0
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;
}
Example #6
0
 /**
  * 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);
 }