]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/blobdiff - rpp/src/rpp/mout.c
mout: Remove stupid waiting in rpp_mout_set()
[pes-rpp/rpp-lib.git] / rpp / src / rpp / mout.c
index d1a330b2a2e43311fefd3cba6af47942434a4571..ae2d4a9501ac476272fd4babe3653b2950b70fa4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2013 Czech Technical University in Prague
+/* Copyright (C) 2013, 2016 Czech Technical University in Prague
  *
  * Authors:
  *     - Carlos Jenkins <carlos@jenkins.co.cr>
@@ -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;
 }