X-Git-Url: http://rtime.felk.cvut.cz/gitweb/pes-rpp/rpp-lib.git/blobdiff_plain/d5d6a256f5970fb6ebb207d814d1e967b07ed608..573021795371f41a23ed0fe0b5171f38bb96d86e:/rpp/src/rpp/fr.c diff --git a/rpp/src/rpp/fr.c b/rpp/src/rpp/fr.c index 63720ba..728ee80 100644 --- a/rpp/src/rpp/fr.c +++ b/rpp/src/rpp/fr.c @@ -1,21 +1,13 @@ -/* Copyright (C) 2013 Czech Technical University in Prague +/* Copyright (C) 2013, 2015 Czech Technical University in Prague * * Authors: * - Carlos Jenkins * - Michal Horn * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * This document contains proprietary information belonging to Czech + * Technical University in Prague. Passing on and copying of this + * document, and communication of its contents is not permitted + * without prior written authorization. * * File : fr.c * Abstract: @@ -28,215 +20,380 @@ #include "rpp/rpp.h" + +#ifndef FREERTOS_POSIX + #include "stdio.h" #include "string.h" +#include "drv/drv.h" +#include "drv/spi_tms570.h" +#include "rpp/mutex.h" -#if rppCONFIG_INCLUDE_FR == 1 +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 */ +static rpp_fr_state_t rpp_fr_state = RPP_FR_NOT_INITIALIZED; /**< Stores the actual state of the FlexRay module */ /* AUTOSAR-like API */ -int8_t rpp_fr_init_driver(const Fr_ConfigType* config_ptr, uint32_t* error) { +int8_t rpp_fr_init_driver(const Fr_ConfigType *config_ptr, uint32_t *error) +{ if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED) return FAILURE; +#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; } -int8_t rpp_fr_init_controller(uint8_t ctrl, uint32_t* error) { +int8_t rpp_fr_init_controller(uint8_t ctrl, uint32_t *error) +{ Std_ReturnType retVal = ERR_PARAM_NO_ERROR; - if (rpp_fr_state == RPP_FR_DRV_INITIALIZED) { + 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) { +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 rpp_fr_all_slots(uint8_t ctrl) +{ + 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) { +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) { +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) { +int8_t rpp_fr_send_wup(uint8_t ctrl) +{ + 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) { +int8_t rpp_fr_set_wu_channel(uint8_t ctrl, Fr_ChannelType channel) +{ + 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) { +int8_t rpp_fr_get_poc_status(uint8_t ctrl, Fr_POCStatusType *poc_status_ptr) +{ + 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) { +int8_t rpp_fr_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx, const uint8_t *lsdu, uint8_t lsdu_length) +{ + 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) { +int8_t rpp_fr_cancel_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx) +{ + 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) { +int8_t rpp_fr_receive_lpdu(uint8_t ctrl, uint16_t lpdu_idx, uint8_t *lsdu, Fr_RxLPduStatusType *lpdu_status, uint8_t *lsdu_length) +{ + 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) { +int8_t rpp_fr_check_tx_lpdu_status(uint8_t ctrl, uint16_t lpdu_idx, Fr_TxLPduStatusType *lpdu_status) +{ + 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) +{ + 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) { +int8_t rpp_fr_disable_lpdu(uint8_t ctrl, uint16_t lpdu_idx) +{ + 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) { +int8_t rpp_fr_get_global_time(uint8_t ctrl, uint8_t *cycle, uint16_t *macroticks) +{ + 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) { +int8_t rpp_fr_get_network_management_vector(uint8_t ctrl, uint8_t *nm_vector) +{ + 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) { +int8_t rpp_fr_get_channel_status(uint8_t ctrl, uint16_t *channel_a_status, uint16_t *channel_b_status) +{ + 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) { +int8_t rpp_fr_get_clock_correction(uint8_t ctrl, int16_t *rate_correction, int32_t *offset_correction) +{ + 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) { +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) +{ + 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) { +int8_t rpp_fr_get_wakeup_rx_status(uint8_t ctrl, uint8_t *status) +{ + 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) { +int8_t rpp_fr_set_timer(uint8_t ctrl, uint8_t timer_idx, uint8_t cycle_set, uint16_t offset_threshold) +{ + 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) { +int8_t rpp_fr_cancel_timer(uint8_t ctrl, uint8_t timer_idx) +{ + 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) { +int8_t rpp_fr_clear_timer_irq(uint8_t ctrl, uint8_t timer_idx) +{ + 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) { +int8_t rpp_fr_get_timer_irq_status(uint8_t ctrl, uint8_t timer_idx, boolean_t *irq_pending) +{ + 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) { +int8_t rpp_fr_get_driver_version(Std_VersionInfoType *version) +{ Fr_GetVersionInfo(version); return SUCCESS; } -int8_t rpp_fr_read_com_ctrl_config(uint8_t ctrl, uint8_t param_idx, uint32_t* param_value) { +int8_t rpp_fr_read_com_ctrl_config(uint8_t ctrl, uint8_t param_idx, uint32_t *param_value) +{ + 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 /* rppCONFIG_INCLUDE_FR */ +#endif /* FREERTOS_POSIX */