]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/blobdiff - rpp/src/rpp/fr.c
Make the RPP layer thread safe
[pes-rpp/rpp-lib.git] / rpp / src / rpp / fr.c
index 9193a509374cf3809ea1d4b6fd3451fd7444a76a..728ee8053facfc58673bfb975b5c1f92954d6274 100644 (file)
@@ -27,6 +27,9 @@
 #include "string.h"
 #include "drv/drv.h"
 #include "drv/spi_tms570.h"
+#include "rpp/mutex.h"
+
+RPP_MUTEX_DEFINE(mutex_fr);
 
 static rpp_fr_state_t rpp_fr_state = RPP_FR_NOT_INITIALIZED;    /**< Stores the actual state of the FlexRay module */
 
@@ -39,6 +42,8 @@ int8_t rpp_fr_init_driver(const Fr_ConfigType *config_ptr, uint32_t *error)
 #ifndef FREERTOS_POSIX
        spi_tms570_init();
 #endif
+       if (!RPP_MUTEX_INIT(mutex_fr))
+               return FAILURE;
        Fr_Init(config_ptr);
        rpp_fr_state = RPP_FR_DRV_INITIALIZED;
        return SUCCESS;
@@ -47,197 +52,329 @@ int8_t rpp_fr_init_driver(const Fr_ConfigType *config_ptr, uint32_t *error)
 int8_t rpp_fr_init_controller(uint8_t ctrl, uint32_t *error)
 {
        Std_ReturnType retVal = ERR_PARAM_NO_ERROR;
-
+       RPP_MUTEX_LOCK(mutex_fr);
        if (rpp_fr_state == RPP_FR_DRV_INITIALIZED ||
                rpp_fr_state == RPP_FR_HALTED ||
                rpp_fr_state == RPP_FR_ABORTED) {
                retVal = Fr_ControllerInit(ctrl);
                if (retVal & E_OK) {
                        rpp_fr_state = RPP_FR_CTR_INITIALIZED;
+                       RPP_MUTEX_UNLOCK(mutex_fr);
                        return SUCCESS;
                }
                else {
                        *error = retVal;
+                       RPP_MUTEX_UNLOCK(mutex_fr);
                        return FAILURE;
                }
        }
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_start_communication(uint8_t ctrl, uint32_t *error)
 {
        Std_ReturnType retVal = ERR_PARAM_NO_ERROR;
 
+       RPP_MUTEX_LOCK(mutex_fr);
        if (rpp_fr_state == RPP_FR_CTR_INITIALIZED) {
                retVal = Fr_StartCommunication(ctrl);
                if (retVal & E_OK) {
                        rpp_fr_state = RPP_FR_RUNNING;
+                       RPP_MUTEX_UNLOCK(mutex_fr);
                        return SUCCESS;
+
                }
                else {
                        *error = retVal;
+                       RPP_MUTEX_UNLOCK(mutex_fr);
                        return FAILURE;
                }
        }
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
 }
 
 int8_t rpp_fr_all_slots(uint8_t ctrl)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_AllSlots(ctrl) & E_OK)
-               return SUCCESS;
-       return FAILURE;
+       int8_t ret;
+
+       RPP_MUTEX_LOCK(mutex_fr);
+       ret = (rpp_fr_state == RPP_FR_RUNNING && Fr_AllSlots(ctrl) & E_OK);
+       RPP_MUTEX_UNLOCK(mutex_fr);
+
+       return ret ? SUCCESS : FAILURE;
 }
 
 int8_t rpp_fr_halt_communication(uint8_t ctrl)
 {
+       RPP_MUTEX_LOCK(mutex_fr);
        if (rpp_fr_state == RPP_FR_RUNNING && Fr_HaltCommunication(ctrl) & E_OK) {
                rpp_fr_state = RPP_FR_HALTED;
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+
        }
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
 }
 
 int8_t rpp_fr_abort_communication(uint8_t ctrl)
 {
+       RPP_MUTEX_LOCK(mutex_fr);
        if (rpp_fr_state == RPP_FR_RUNNING && Fr_AbortCommunication(ctrl) & E_OK) {
                rpp_fr_state = RPP_FR_ABORTED;
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+
        }
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
 }
 
 int8_t rpp_fr_send_wup(uint8_t ctrl)
 {
-       if (rpp_fr_state == RPP_FR_CTR_INITIALIZED && Fr_SendWUP(ctrl) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_CTR_INITIALIZED && Fr_SendWUP(ctrl) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
 }
 
 int8_t rpp_fr_set_wu_channel(uint8_t ctrl, Fr_ChannelType channel)
 {
-       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_SetWakeupChannel(ctrl, channel) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_SetWakeupChannel(ctrl, channel) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
 }
 
 int8_t rpp_fr_get_poc_status(uint8_t ctrl, Fr_POCStatusType *poc_status_ptr)
 {
-       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetPOCStatus(ctrl, poc_status_ptr) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetPOCStatus(ctrl, poc_status_ptr) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
 }
 
 int8_t rpp_fr_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx, const uint8_t *lsdu, uint8_t lsdu_length)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_TransmitTxLPdu(ctrl, lpdu_idx, lsdu, lsdu_length) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_RUNNING && Fr_TransmitTxLPdu(ctrl, lpdu_idx, lsdu, lsdu_length) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+
+       }
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_cancel_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelTxLPdu(ctrl, lpdu_idx) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelTxLPdu(ctrl, lpdu_idx) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_receive_lpdu(uint8_t ctrl, uint16_t lpdu_idx, uint8_t *lsdu, Fr_RxLPduStatusType *lpdu_status, uint8_t *lsdu_length)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_ReceiveRxLPdu(ctrl, lpdu_idx, lsdu, lpdu_status, lsdu_length) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_RUNNING && Fr_ReceiveRxLPdu(ctrl, lpdu_idx, lsdu, lpdu_status, lsdu_length) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_check_tx_lpdu_status(uint8_t ctrl, uint16_t lpdu_idx, Fr_TxLPduStatusType *lpdu_status)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_CheckTxLPduStatus(ctrl, lpdu_idx, lpdu_status) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_RUNNING && Fr_CheckTxLPduStatus(ctrl, lpdu_idx, lpdu_status) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_reconfigure_lpdu(uint8_t ctrl, uint16_t lpdu_idx, uint16_t frame_id, Fr_ChannelType channel, uint8_t cycle_set, uint8_t cycle_offset, uint8_t payload, uint16_t header_crc)
 {
-       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_ReconfigLPdu(ctrl, lpdu_idx, frame_id, channel, cycle_set, cycle_offset, payload, header_crc) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_ReconfigLPdu(ctrl, lpdu_idx, frame_id, channel, cycle_set, cycle_offset, payload, header_crc) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_disable_lpdu(uint8_t ctrl, uint16_t lpdu_idx)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_DisableLPdu(ctrl, lpdu_idx) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_RUNNING && Fr_DisableLPdu(ctrl, lpdu_idx) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_global_time(uint8_t ctrl, uint8_t *cycle, uint16_t *macroticks)
 {
-       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetGlobalTime(ctrl, cycle, macroticks) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetGlobalTime(ctrl, cycle, macroticks) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_network_management_vector(uint8_t ctrl, uint8_t *nm_vector)
 {
-       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetNmVector(ctrl, nm_vector) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetNmVector(ctrl, nm_vector) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_channel_status(uint8_t ctrl, uint16_t *channel_a_status, uint16_t *channel_b_status)
 {
-       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetChannelStatus(ctrl, channel_a_status, channel_b_status) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetChannelStatus(ctrl, channel_a_status, channel_b_status) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_clock_correction(uint8_t ctrl, int16_t *rate_correction, int32_t *offset_correction)
 {
-       if (rpp_fr_state >= RPP_FR_RUNNING && Fr_GetClockCorrection(ctrl, rate_correction, offset_correction) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_RUNNING && Fr_GetClockCorrection(ctrl, rate_correction, offset_correction) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_sync_frame_list(uint8_t ctrl, uint8_t list_size, uint16_t *channel_a_even_list, uint16_t *channel_b_even_list, uint16_t *channel_a_odd_list, uint16_t *channel_b_odd_list)
 {
-       if (rpp_fr_state >= RPP_FR_RUNNING && Fr_GetSyncFrameList(ctrl, list_size, channel_a_even_list, channel_b_even_list, channel_a_odd_list, channel_b_odd_list) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_RUNNING && Fr_GetSyncFrameList(ctrl, list_size, channel_a_even_list, channel_b_even_list, channel_a_odd_list, channel_b_odd_list) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_wakeup_rx_status(uint8_t ctrl, uint8_t *status)
 {
-       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetWakeupRxStatus(ctrl, status) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetWakeupRxStatus(ctrl, status) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_set_timer(uint8_t ctrl, uint8_t timer_idx, uint8_t cycle_set, uint16_t offset_threshold)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_SetAbsoluteTimer(ctrl, timer_idx, cycle_set, offset_threshold) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_RUNNING && Fr_SetAbsoluteTimer(ctrl, timer_idx, cycle_set, offset_threshold) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_cancel_timer(uint8_t ctrl, uint8_t timer_idx)
 {
-       if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelAbsoluteTimer(ctrl, timer_idx) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelAbsoluteTimer(ctrl, timer_idx) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_clear_timer_irq(uint8_t ctrl, uint8_t timer_idx)
 {
-       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_AckAbsoluteTimerIRQ(ctrl, timer_idx) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_AckAbsoluteTimerIRQ(ctrl, timer_idx) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_timer_irq_status(uint8_t ctrl, uint8_t timer_idx, boolean_t *irq_pending)
 {
-       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetAbsoluteTimerIRQStatus(ctrl, timer_idx, irq_pending) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetAbsoluteTimerIRQStatus(ctrl, timer_idx, irq_pending) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
 
 int8_t rpp_fr_get_driver_version(Std_VersionInfoType *version)
@@ -248,8 +385,15 @@ int8_t rpp_fr_get_driver_version(Std_VersionInfoType *version)
 
 int8_t rpp_fr_read_com_ctrl_config(uint8_t ctrl, uint8_t param_idx, uint32_t *param_value)
 {
-       if (Fr_ReadCCConfig(ctrl, param_idx, param_value) & E_OK)
+       RPP_MUTEX_LOCK(mutex_fr);
+       if (Fr_ReadCCConfig(ctrl, param_idx, param_value) & E_OK) {
+               RPP_MUTEX_UNLOCK(mutex_fr);
                return SUCCESS;
+       }
+
+       RPP_MUTEX_UNLOCK(mutex_fr);
        return FAILURE;
+
 }
+
 #endif /* FREERTOS_POSIX */