]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/blobdiff - rpp/src/rpp/irc.c
Make the RPP layer thread safe
[pes-rpp/rpp-lib.git] / rpp / src / rpp / irc.c
index a399cfb946aed1bedaf285a53ecb69142193a227..6886744dd76f52ed66bf4e9e4db4a3128f67f5f5 100644 (file)
  */
 
 #include "rpp/rpp.h"
+#include "rpp/mutex.h"
 
-#if rppCONFIG_INCLUDE_IRC == 1
+RPP_MUTEX_DEFINE(mutex_irc);
 
-#if rppCONFIG_DRV == 1
-#include "sys/ti_drv_het2.h"
-#include "sys/sys_pinmux.h"
+#ifndef FREERTOS_POSIX
+#include "sys/sys.h"
+#else
+#define setMuxForIRC(a, b)
+#define ircEnable(a)
+#define ircDisable(a)
 #endif
 
 static boolean_t initialized = FALSE;
+static boolean_t rpp_irc_enabled[2] = {FALSE, FALSE};
 
-boolean_t rpp_irc1_enabled = FALSE;
-boolean_t rpp_irc2_enabled = FALSE;
-
-int8_t rpp_irc_init() {
+int8_t rpp_irc_init()
+{
 
-    if (initialized) {
-        return FAILURE;
-    }
+       if (initialized)
+               return FAILURE;
+       if (!RPP_MUTEX_INIT(mutex_irc))
+               return FAILURE;
 
-#if rppCONFIG_DRV == 1
-    het2Init();
+#ifndef FREERTOS_POSIX
+       het2Init();
 #endif
 
-    initialized = TRUE;
-    return SUCCESS;
+       initialized = TRUE;
+       return SUCCESS;
 }
 
-int8_t rpp_irc_enable(uint8_t irc) {
+int8_t rpp_irc_enable(uint8_t irc)
+{
 
-    if (!initialized)
-        return FAILURE;
+       if (!initialized)
+               return FAILURE;
 
-    if (irc < 1 || irc > 2)
-        return -RPP_EINVAL;
+       if (irc < 1 || irc > 2)
+               return -RPP_EINVAL;
 
-    switch (irc) {
-    case 1:
-        rpp_irc1_enabled = TRUE;
-        break;
-    case 2:
-        rpp_irc2_enabled = TRUE;
-        break;
-    }
+       RPP_MUTEX_LOCK(mutex_irc);
+       rpp_irc_enabled[irc-1] = TRUE;
 
-    setMuxForIRC(irc, TRUE);
-    ircEnable(irc);
+       setMuxForIRC(irc, TRUE);
+       ircEnable(irc);
+       RPP_MUTEX_UNLOCK(mutex_irc);
 
-    return SUCCESS;
+       return SUCCESS;
 }
 
-int8_t rpp_irc_status(uint8_t irc) {
+int8_t rpp_irc_status(uint8_t irc)
+{
 
-    if (!initialized)
-        return FAILURE;
+       if (!initialized)
+               return FAILURE;
 
-    if (irc < 1 || irc > 2)
-        return -RPP_EINVAL;
+       if (irc < 1 || irc > 2)
+               return -RPP_EINVAL;
 
-    switch (irc) {
-    case 1:
-        return rpp_irc1_enabled ? 1 : 0;
-    case 2:
-        return rpp_irc2_enabled ? 1 : 0;
-    }
-    return FAILURE;
+       RPP_MUTEX_LOCK(mutex_irc);
+       boolean_t ret_val = rpp_irc_enabled[irc-1];
+       RPP_MUTEX_UNLOCK(mutex_irc);
+
+       return ret_val;
 }
 
-int32_t rpp_irc_get(uint8_t irc) {
+int32_t rpp_irc_get(uint8_t irc)
+{
 
-    if (!initialized)
-        return FAILURE;
+       if (!initialized)
+               return FAILURE;
 
-    if (irc < 1 || irc > 2)
-        return 0;
+       if (irc < 1 || irc > 2)
+               return 0;
 
-    if (rpp_irc_status(irc) != 1)
-        return FAILURE;
+       if (rpp_irc_status(irc) != 1)
+               return FAILURE;
 
-#if rppCONFIG_DRV == 1
-    return ircGet(irc);
+#ifndef FREERTOS_POSIX
+       RPP_MUTEX_LOCK(mutex_irc);
+       int32_t ret_val = ircGet(irc);
+       RPP_MUTEX_UNLOCK(mutex_irc);
+       return ret_val;
 #else
-    return 1;
+       return 1;
 #endif
 }
 
-int8_t rpp_irc_disable(uint8_t irc) {
+int8_t rpp_irc_disable(uint8_t irc)
+{
 
-    if (!initialized)
-        return FAILURE;
+       if (!initialized)
+               return FAILURE;
 
-    if (irc < 1 || irc > 2)
-        return -RPP_EINVAL;
+       if (irc < 1 || irc > 2)
+               return -RPP_EINVAL;
 
-    if (rpp_irc_status(irc) != 1)
-        return FAILURE;
+       if (rpp_irc_status(irc) != 1)
+               return FAILURE;
 
-    ircDisable(irc);
-    setMuxForIRC(irc, FALSE);
-    switch (irc) {
-    case 1:
-        rpp_irc1_enabled = FALSE;
-        break;
-    case 2:
-        rpp_irc2_enabled = FALSE;
-        break;
-    }
-    return FAILURE;
+       RPP_MUTEX_LOCK(mutex_irc);
+       ircDisable(irc);
+       setMuxForIRC(irc, FALSE);
+       rpp_irc_enabled[irc-1] = FALSE;
+       RPP_MUTEX_UNLOCK(mutex_irc);
+       return SUCCESS;
 }
-
-#endif /* rppCONFIG_INCLUDE_IRC */