blob: 2f471d5a0c3d0cf44521bd71f5f964f84f204e0a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 - 2015 ACIN, Profactor GmbH, fortiss GmbH
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alois Zoitl, Thomas Strasser, Rene Smodic, Monika Wenger, Ingo Hegny
* - initial API and implementation and/or initial documentation
*******************************************************************************/
#ifndef _TIMERHA_H_
#define _TIMERHA_H_
#include <forte_config.h>
#include "../core/extevhan.h"
#include <forte_sync.h>
class CEventSourceFB;
class CIEC_TIME;
enum ETimerActivationType{
e_SingleShot, e_Periodic
};
//! Data stored for each FB that is registered to the timer handler
struct STimedFBListEntry{
uint_fast64_t mTimeOut; //!< absolut time when the next trigger of the FB should occure
CEventSourceFB *mTimedFB; //!< Functionblock to be triggered
TForteUInt32 mInterval; //!< relative time between FB trigger points (mainly needed for the different periodic timed FBs)
ETimerActivationType mType; //!< type of activation. e.g. singleshot, periodic, ...
STimedFBListEntry *mNext; //!< pointer to the next entry in the list
};
/*! \brief External event handler for the Timer.
* \ingroup EXTEVHAND
*/
class CTimerHandler : public CExternalEventHandler{
DECLARE_HANDLER(CTimerHandler);
public:
/*!\brief create the timer handler and set the parameter pointer with the the new timer handler.
*
* This function is not implemented in the standardtimerhandler and has to be implemented in the specific implementation.
* implementations should check that not two timerhanlders can be created.
*/
static CTimerHandler* createTimerHandler(CDeviceExecution& paDeviceExecution);
/*!\brief Sets the priority of the event source
*
* \param pa_nPriority new priority of the event source
*/
virtual void setPriority(int paPriority) = 0;
/*!\brief Get the current priority of the event source
*
* \return current priority
*/
virtual int getPriority(void) const = 0;
/*! \brief Get the time base of the runtime
*
* \return internal runtime ticks per second
*/
static TForteUInt32 getTicksPerSecond(void){
return cg_nForteTicksPerSecond;
}
/*!\brief Register an Event source Functionblock to this external event source.
*
* \param paTimerListEntry TimerListEntry data
* \param paTimeInterval time interval to next event
*/
void registerTimedFB(STimedFBListEntry *paTimerListEntry, const CIEC_TIME &paTimeInterval);
/*!\brief Unregister an FB from an the timmer
*
* \param paTimedFB FB to unregister from this external event handler
*/
void unregisterTimedFB(CEventSourceFB *paTimedFB);
//! one tick of time elapsed. Implementations should call this function on each tick.
void nextTick(void);
//! returns the time since startup of FORTE
uint_fast64_t getForteTime() const{
return mForteTime;
}
protected:
CSyncObject mSync;
private:
//!Add an entry to the timed list.
void addTimedFBEntry(STimedFBListEntry *paTimerListEntry);
//!The runtime time in ticks till the start of FORTE.
uint_fast64_t mForteTime;
//! List of function blocks currently registered to the timer handler
STimedFBListEntry *mTimedFBList;
};
#endif /*TIMERHA_H_*/