/** * \file * \brief Implementation of generic triggers. * \author Erich Styger, erich.styger@hslu.ch * \license SPDX-License-Identifier: BSD-3-Clause * This module implements a trigger module. * Triggers are special events which are triggered in a given time in the future */ #include "platform.h" #include "Trigger.h" #include "McuCriticalSection.h" #include /* for NULL */ /*! \brief Descriptor for a trigger. */ typedef struct TRG_TriggerDesc { TRG_TriggerTime ticks; /*!< tick count until trigger */ TRG_Callback callback; /*!< callback function */ TRG_CallBackDataPtr data; /*!< additional data pointer for callback */ } TRG_TriggerDesc; static TRG_TriggerDesc TRG_Triggers[TRG_NOF_TRIGGERS]; /*!< Array of triggers */ uint8_t TRG_SetTrigger(TRG_TriggerKind trigger, TRG_TriggerTime ticks, TRG_Callback callback, TRG_CallBackDataPtr data) { McuCriticalSection_CriticalVariable() McuCriticalSection_EnterCritical(); TRG_Triggers[trigger].ticks = ticks; TRG_Triggers[trigger].callback = callback; TRG_Triggers[trigger].data = data; McuCriticalSection_ExitCritical(); return ERR_OK; } uint8_t TRG_StopTrigger(TRG_TriggerKind trigger) { McuCriticalSection_CriticalVariable() McuCriticalSection_EnterCritical(); TRG_Triggers[trigger].ticks = 0; TRG_Triggers[trigger].callback = NULL; TRG_Triggers[trigger].data = NULL; McuCriticalSection_ExitCritical(); return ERR_OK; } /*! * \brief Goes through the list of triggers and returns TRUE in case we have to call a callback. * \return Returns TRUE if we have called a callback. */ static bool CheckCallbacks(void) { TRG_TriggerKind i; TRG_Callback callback; TRG_CallBackDataPtr data; bool calledCallBack = FALSE; McuCriticalSection_CriticalVariable() for(i=(TRG_TriggerKind)0;i