blob: 13ee3dc45ac002c31915cb70446aa41af8fceb44 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 - 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, Gerhard Ebenhofer, Ingo Hegny
* - initial API and implementation and/or initial documentation
*******************************************************************************/
#ifndef RTESINGLE_H_
#define RTESINGLE_H_
#include <funcbloc.h>
#include <ecet.h>
/*!\brief Base class for all single output real-time event function blocks.
*
*/
class CRTEventSingle: public CFunctionBlock{
private:
CEventChainExecutionThread m_oECEO;
CSyncObject m_oSyncObj; //!<Lock for protected the RT_E_FB from mutual events
//CIEC_TIME *m_poDeadline;
bool m_bInitialized;
virtual CIEC_TIME &Deadline() = 0;
virtual CIEC_BOOL &QI() = 0;
virtual CIEC_BOOL &QO() = 0;
/*! \brief check if the succeeding EC part needs to be activated.
*
* This function makes the assumption that the input event with
* the id 0 is the INIT event input.
* \param pa_nEIID the event id of the event that triggered the FB
* \return if true the succeeding EC part will be activated.
*/
virtual bool checkActivation(int pa_nEIID) = 0;
virtual void executeEvent(int pa_nEIID) {
if(0 != pa_nEIID) { //it is not the init event
if(m_bInitialized && checkActivation(pa_nEIID)) {
CEventConnection *eoCon = getEOConUnchecked(1);
if(eoCon->isConnected()) {
eoCon->triggerEvent(m_oECEO);
m_oECEO.resumeSelfSuspend();
}
}
} else { // we got init
if(QI() == true) {
if(!m_bInitialized) {
m_oECEO.changeExecutionState(cg_nMGM_CMD_Start);
m_bInitialized = true;
}
m_oECEO.setDeadline(Deadline());
} else {
m_oECEO.changeExecutionState(cg_nMGM_CMD_Stop);
m_bInitialized = false;
}
QO() = QI();
sendOutputEvent(0);
}
}
public:
CRTEventSingle(CResource *pa_poSrcRes, const SFBInterfaceSpec *pa_pstInterfaceSpec,
const CStringDictionary::TStringId pa_nInstanceNameId, TForteByte *pa_acFBConnData, TForteByte *pa_acFBVarsData) :
CFunctionBlock( pa_poSrcRes, pa_pstInterfaceSpec, pa_nInstanceNameId, pa_acFBConnData, pa_acFBVarsData)
{
m_bInitialized = false;
};
virtual ~CRTEventSingle(){};
};
#endif /*RTESINGLE_H_*/