Beispiel #1
0
void
ble_hs_unlock(void)
{
    int rc;

    rc = os_mutex_release(&ble_hs_mutex);
    BLE_HS_DBG_ASSERT_EVAL(rc == 0 || rc == OS_NOT_STARTED);
}
Beispiel #2
0
static void
nffs_unlock(void)
{
    int rc;

    rc = os_mutex_release(&nffs_mutex);
    assert(rc == 0 || rc == OS_NOT_STARTED);
}
Beispiel #3
0
uint8_t kalman_update(
        kalman_robot_handle_t * handle,
        const position_t * measurement,
        float delta_t,
        robot_pos_t * dest)
{
    if(handle == NULL || dest == NULL || delta_t < 0.0f) {
        return 0;
    }

    os_mutex_take(&(handle->_mutex));

    // predict new state
    predict_state(&(handle->_state), delta_t, &(handle->_state));

    // predict new covariance
    covariance_t proc_noise_cov;
    process_noise_covariance(handle, delta_t, &proc_noise_cov);
    predict_covariance(
            &(handle->_state_covariance),
            &proc_noise_cov,
            delta_t,
            &(handle->_state_covariance));

    // if there is a measurement make kalman update
    if(measurement != NULL) {
        // compute kalman gain
        kalman_gain_t gain;
        kalman_gain(
                &(handle->_state_covariance),
                &(handle->_measurement_covariance),
                &gain);

        // compute difference between prediction and measurement
        vec2d_t residual;
        residual._x = measurement->x - handle->_state._x;
        residual._y = measurement->y - handle->_state._y;

        // estimate new state considering measurement
        update_state(&(handle->_state), &gain, &residual, &(handle->_state));

        update_covariance(
                &(handle->_state_covariance),
                &gain,
                &(handle->_state_covariance));
    }

    // write resulting position (and associated variances) to dest
    dest->x = handle->_state._x;
    dest->y = handle->_state._y;
    dest->var_x = handle->_state_covariance._cov_a._a;
    dest->var_y = handle->_state_covariance._cov_a._d;
    dest->cov_xy = handle->_state_covariance._cov_a._b;

    os_mutex_release(&(handle->_mutex));

    return 1;
}
Beispiel #4
0
uint8_t kalman_init(
        kalman_robot_handle_t * handle,
        const robot_pos_t * initial_config)
{
    // verify input
    if(handle == NULL || initial_config == NULL) {
        return 0;
    }

    // initialize mutex
    os_mutex_init(&(handle->_mutex));

    os_mutex_take(&(handle->_mutex));

    // set initial state of robot
    handle->_state._x = initial_config->x;
    handle->_state._y = initial_config->y;
    // assume that the robot is standing still initially
    handle->_state._v_x = 0.0f;
    handle->_state._v_y = 0.0f;

    // set initial state covariance
    handle->_state_covariance._cov_a._a = initial_config->var_x;
    handle->_state_covariance._cov_a._b = initial_config->cov_xy;
    handle->_state_covariance._cov_a._c = initial_config->cov_xy;
    handle->_state_covariance._cov_a._d = initial_config->var_y;

    handle->_state_covariance._cov_b._a = 0.0f;
    handle->_state_covariance._cov_b._b = 0.0f;
    handle->_state_covariance._cov_b._c = 0.0f;
    handle->_state_covariance._cov_b._d = 0.0f;

    handle->_state_covariance._cov_c._a = 0.0f;
    handle->_state_covariance._cov_c._b = 0.0f;
    handle->_state_covariance._cov_c._c = 0.0f;
    handle->_state_covariance._cov_c._d = 0.0f;

    handle->_state_covariance._cov_d._a = 0.0f;
    handle->_state_covariance._cov_d._b = 0.0f;
    handle->_state_covariance._cov_d._c = 0.0f;
    handle->_state_covariance._cov_d._d = 0.0f;

    // set default measurment covariance
    handle->_measurement_covariance._a = MEAS_VAR_X;
    handle->_measurement_covariance._b = MEAS_COV_XY;
    handle->_measurement_covariance._c = MEAS_COV_XY;
    handle->_measurement_covariance._d = MEAS_VAR_Y;

    // default max acc of robot
    handle->_max_acc = MAX_ACC;

    // default proportionality constant for process noise covariance
    handle->_process_noise_proportionality = PROC_NOISE_PROP;

    os_mutex_release(&(handle->_mutex));

    return 1;
}
/**
 * Unlock access to the charge_control_itf specified by bi.
 *
 * @param The charge_control_itf to unlock access to
 *
 * @return 0 on success, non-zero on failure.
 */
static void
adp5061_itf_unlock(struct charge_control_itf *cci)
{
    if (!cci->cci_lock) {
        return;
    }

    os_mutex_release(cci->cci_lock);
}
Beispiel #6
0
static void
os_malloc_unlock(void)
{
    int rc;

    if (g_os_started) {
        rc = os_mutex_release(&os_malloc_mutex);
        assert(rc == 0);
    }
}
int
fcb_getnext(struct fcb *fcb, struct fcb_entry *loc)
{
    int rc;

    rc = os_mutex_pend(&fcb->f_mtx, OS_WAIT_FOREVER);
    if (rc && rc != OS_NOT_STARTED) {
        return FCB_ERR_ARGS;
    }
    rc = fcb_getnext_nolock(fcb, loc);
    os_mutex_release(&fcb->f_mtx);

    return rc;
}
/**
 * Close the STM32F4 ADC device.
 *
 * This function unlocks the device.
 *
 * @param odev The device to close.
 */
static int
stm32f4_adc_close(struct os_dev *odev)
{
    struct adc_dev *dev;

    dev = (struct adc_dev *) odev;

    stm32f4_adc_uninit(dev);

    if (os_started()) {
        os_mutex_release(&dev->ad_lock);
    }

    return (OS_OK);
}
void
ble_hs_unlock(void)
{
    int rc;

#if BLE_HS_DEBUG
    if (!os_started()) {
        BLE_HS_DBG_ASSERT(ble_hs_dbg_mutex_locked);
        ble_hs_dbg_mutex_locked = 0;
        return;
    }
#endif

    rc = os_mutex_release(&ble_hs_mutex);
    BLE_HS_DBG_ASSERT_EVAL(rc == 0 || rc == OS_NOT_STARTED);
}
/**
 * Close the NRF52 ADC device.
 *
 * This function unlocks the device.
 *
 * @param odev The device to close.
 */
static int
nrf52_adc_close(struct os_dev *odev)
{
    struct adc_dev *dev;

    dev = (struct adc_dev *) odev;

    nrfx_saadc_uninit();

    global_adc_dev = NULL;
    global_adc_config = NULL;

    if (os_started()) {
        os_mutex_release(&dev->ad_lock);
    }

    return (0);
}
Beispiel #11
0
int 
cbmem_lock_release(struct cbmem *cbmem)
{
    int rc;

    if (!os_started()) {
        return (0);
    }

    rc = os_mutex_release(&cbmem->c_lock);
    if (rc != 0) {
        goto err;
    }

    return (0);
err:
    return (rc);
}
Beispiel #12
0
uint8_t kalman_update_measurement_covariance(
        kalman_robot_handle_t * handle,
        float var_x,
        float var_y,
        float cov_xy)
{
    if(handle == NULL) {
        return 0;
    }

    os_mutex_take(&(handle->_mutex));

    handle->_measurement_covariance._a = var_x;
    handle->_measurement_covariance._b = cov_xy;
    handle->_measurement_covariance._c = cov_xy;
    handle->_measurement_covariance._d = var_y;

    os_mutex_release(&(handle->_mutex));

    return 1;
}
/**
 * Open the NRF52 ADC device
 *
 * This function locks the device for access from other tasks.
 *
 * @param odev The OS device to open
 * @param wait The time in MS to wait.  If 0 specified, returns immediately
 *             if resource unavailable.  If OS_WAIT_FOREVER specified, blocks
 *             until resource is available.
 * @param arg  Argument provided by higher layer to open, in this case
 *             it can be a nrfx_saadc_config_t, to override the default
 *             configuration.
 *
 * @return 0 on success, non-zero on failure.
 */
static int
nrf52_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
{
    struct adc_dev *dev;
    struct nrf52_adc_dev_cfg *cfg = arg;
    int rc;

    dev = (struct adc_dev *) odev;

    if (os_started()) {
        rc = os_mutex_pend(&dev->ad_lock, wait);
        if (rc != OS_OK) {
            goto err;
        }
    }

    if (odev->od_flags & OS_DEV_F_STATUS_OPEN) {
        os_mutex_release(&dev->ad_lock);
        rc = OS_EBUSY;
        goto err;
    }

    /* If user did not provide config let us use init */
    if (!cfg) {
        cfg = init_adc_config;
    }

    /* Initialize the device */
    rc = nrfx_saadc_init(&cfg->saadc_cfg, nrf52_saadc_event_handler);
    if (rc != NRFX_SUCCESS) {
        goto err;
    }

    global_adc_dev = dev;
    global_adc_config = arg;

    return (0);
err:
    return (rc);
}
/**
 * Open the STM32F4 ADC device
 *
 * This function locks the device for access from other tasks.
 *
 * @param odev The OS device to open
 * @param wait The time in MS to wait.  If 0 specified, returns immediately
 *             if resource unavailable.  If OS_WAIT_FOREVER specified, blocks
 *             until resource is available.
 * @param arg  Argument provided by higher layer to open.
 *
 * @return 0 on success, non-zero on failure.
 */
static int
stm32f4_adc_open(struct os_dev *odev, uint32_t wait, void *arg)
{
    DMA_HandleTypeDef *hdma;
    ADC_HandleTypeDef *hadc;
    struct stm32f4_adc_dev_cfg *cfg;
    struct adc_dev *dev;
    int rc;

    assert(odev);
    rc = OS_OK;
    dev = (struct adc_dev *) odev;

    if (os_started()) {
        rc = os_mutex_pend(&dev->ad_lock, wait);
        if (rc != OS_OK) {
            goto err;
        }
    }

    if (odev->od_flags & OS_DEV_F_STATUS_OPEN) {
        os_mutex_release(&dev->ad_lock);
        rc = OS_EBUSY;
        goto err;
    }

    stm32f4_adc_init(dev);

    cfg  = (struct stm32f4_adc_dev_cfg *)dev->ad_dev.od_init_arg;
    hadc = cfg->sac_adc_handle;
    hdma = hadc->DMA_Handle;

    adc_dma[stm32f4_resolve_dma_handle_idx(hdma)] = dev;

    return (OS_OK);
err:
    return (rc);
}