X-Git-Url: http://rtime.felk.cvut.cz/gitweb/pes-rpp/rpp-lib.git/blobdiff_plain/3e0b650fe9e8a76af16b119a0730c9a5df02c40c..16f135fef9a28d3b8c72bd4cc1bc8a2309b887c1:/rpp/src/rpp/mout.c diff --git a/rpp/src/rpp/mout.c b/rpp/src/rpp/mout.c index d1a330b..ae2d4a9 100644 --- a/rpp/src/rpp/mout.c +++ b/rpp/src/rpp/mout.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2013 Czech Technical University in Prague +/* Copyright (C) 2013, 2016 Czech Technical University in Prague * * Authors: * - Carlos Jenkins @@ -19,6 +19,9 @@ #include "rpp/rpp.h" +#include "rpp/mutex.h" + +RPP_MUTEX_DEFINE(mutex_mout); #ifndef FREERTOS_POSIX #include "drv/mout.h" @@ -28,88 +31,88 @@ static boolean_t initialized = FALSE; int8_t rpp_mout_init() { - if(initialized) { - return FAILURE; - } - initialized = TRUE; + if (initialized) + return FAILURE; + if (!RPP_MUTEX_INIT(mutex_mout)) + return FAILURE; + initialized = TRUE; #ifndef FREERTOS_POSIX - dmmInit(); - gioInit(); - hetInit(); + dmmInit(); + gioInit(); + hetInit(); #endif - return SUCCESS; + return SUCCESS; } static uint8_t cache[] = { - LOW, LOW, LOW, LOW, LOW, LOW + LOW, LOW, LOW, LOW, LOW, LOW }; int8_t rpp_mout_set(uint8_t pin, uint8_t val) { - // Check range - if((pin < 1) || (pin > 6)) { - return -1; - } + int ret; + // Check range + if ((pin < 1) || (pin > 6)) + return -1; - // Check val - if((val != HIGH) && (val != LOW)) { - return -2; - } + // Check val + if ((val != HIGH) && (val != LOW)) + return -2; - uint8_t idx = pin - 1; + uint8_t idx = pin - 1; #ifndef FREERTOS_POSIX - // Set and store value - if(drv_mout_set(idx, val) != SUCCESS) { - return -3; - } - cache[idx] = val; - - // FIXME Wait some time for synchronization - // Don't use vTaskDelay() here because the minimum time to wait is one tick, - // and depending of the configuration of the user model one tick can overrun - // the program. - int wait; - for(wait = 0; wait < 10; wait++) { - asm(" nop"); - } - - // Get value back and compare - if(drv_mout_diag(idx) == FAILURE) { - return -4; - } + // Set and store value + RPP_MUTEX_LOCK(mutex_mout); + ret = drv_mout_set(idx, val); + if (ret == SUCCESS) + cache[idx] = val; + else { + RPP_MUTEX_UNLOCK(mutex_mout); + return -3; + } + + ret = drv_mout_diag(idx); + RPP_MUTEX_UNLOCK(mutex_mout); + if (ret == 0) + return -4; #else - cache[idx] = val; + RPP_MUTEX_LOCK(mutex_mout); + cache[idx] = val; + RPP_MUTEX_UNLOCK(mutex_mout); #endif - return SUCCESS; + return SUCCESS; } int8_t rpp_mout_get(uint8_t pin) { - // Check range - if((pin < 1) || (pin > 6)) { - return -1; - } + // Check range + if ((pin < 1) || (pin > 6)) + return -1; + + RPP_MUTEX_LOCK(mutex_mout); + int8_t ret_val = cache[pin - 1]; + RPP_MUTEX_UNLOCK(mutex_mout); - return cache[pin - 1]; + return ret_val; } int8_t rpp_mout_diag(uint8_t pin) { - // Check range - if((pin < 1) || (pin > 6)) { - return -1; - } + int ret; + // Check range + if ((pin < 1) || (pin > 6)) + return -RPP_EINVAL; #ifndef FREERTOS_POSIX - if(drv_mout_diag(pin - 1) == 0) { - return FAILURE; - } + RPP_MUTEX_LOCK(mutex_mout); + ret = drv_mout_diag(pin - 1); + RPP_MUTEX_UNLOCK(mutex_mout); #endif - return SUCCESS; + return ret; }