blob: 7b1faa784e7fbc3d6d097dd0f567299959db3a52 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 - 2015 Profactor GmbH, ACIN, 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:
* Thomas Strasser, Alois Zoitl, Gunnar Grabmaier, Gerhard Ebenhofer,
* Ingo Hegny
* - initial implementation and rework communication infrastructure
*******************************************************************************/
#ifndef _CFB_H_
#define _CFB_H_
#include "funcbloc.h"
class CInterface2InternalDataConnection;
struct SCFB_FBInstanceData {
CStringDictionary::TStringId m_nFBInstanceNameId;
CStringDictionary::TStringId m_nFBTypeNameId;
};
struct SCFB_FBConnectionData {
CStringDictionary::TStringId m_nSrcId;
int m_nSrcFBNum;
CStringDictionary::TStringId m_nDstId;
int m_nDstFBNum;
};
/*! \ingroup CORE
* \brief Connection data for a fanned out connection of a composite's FB network
*
* As fanned out connections are attached together they need different data than
* the first connection.
*/
struct SCFB_FBFannedOutConnectionData {
int m_nConnectionNum; //!<the connection this fanned out connection should be attached to.
CStringDictionary::TStringId m_nDstId;
int m_nDstFBNum;
};
struct SCFB_FBParameter {
unsigned int m_nFBNum;
CStringDictionary::TStringId m_nDINameID; //!< the data input id of the input param to set
const char * m_acParamValue;
};
struct SCFB_FBNData {
unsigned int m_nNumFBs;
const SCFB_FBInstanceData * m_pstFBInstances;
//TODO add FB parameters
unsigned int m_nNumEventConnections;
const SCFB_FBConnectionData * m_pstEventConnections;
unsigned int m_nNumFannedOutEventConnections;
const SCFB_FBFannedOutConnectionData * m_pstFannedOutEventConnections;
unsigned int m_nNumDataConnections;
const SCFB_FBConnectionData * m_pstDataConnections;
unsigned int m_nNumFannedOutDataConnections;
const SCFB_FBFannedOutConnectionData * m_pstFannedOutDataConnections;
unsigned int m_nNumParams;
const SCFB_FBParameter * m_pstParams;
};
//These two defines are here for legacy reasons. They allow that old CFBs can still be complied
/*! Generate a connection port id for a given fb-nameid / port-nameid combination
* This template will generate a constant and will therefore be very efficient
*/
#define GENERATE_CONNECTION_PORT_ID_2_ARG(FBNameId, PortNameId) (PortNameId)
/*! Generate a connection port id for a connection with a single source id e.g. interface connections
* This template will generate a constant and will therefore be very efficient
*/
#define GENERATE_CONNECTION_PORT_ID_1_ARG(PortNameId)\
GENERATE_CONNECTION_PORT_ID_2_ARG(CStringDictionary::scm_nInvalidStringId, PortNameId)
/*!\ingroup CORE
* \brief Class for handling firmware composite function blocks.
*/
class CCompositeFB: public CFunctionBlock {
public:
/*! \brief Indicator that the given FB id is an adapter.
*
*This will allow for 65535 FBs within an CFB, which should be sufficient.
*/
static const TForteInt32 scm_nAdapterMarker = 0x10000;
/*! \brief constant for retrieving an FB Num from an FBId marked with an Adapter Marker
*
* needs to correspond to scm_nAdapterMarker
*/
static const TForteInt32 scm_nAdapterFBRange = 0xFFFF;
/*!\brief The main constructor for a composite function block.
*
* The interface of the constructor has been extended from the basic FB's interface with the following values:
* \param pa_poSrcRes pointer to including resource
* \param pa_pstInterfaceSpec pointer to interface specification
* \param pa_nInstanceNameId StringId of instance name
* \param pa_cpoFBNData const pointer to description of internal structure of FB (FBs, Connections, ...)
* \param pa_acFBData ByteArray for FB-specific data (DI, DO, int. Vars, ...)
*/
CCompositeFB(CResource *pa_poSrcRes, const SFBInterfaceSpec *pa_pstInterfaceSpec,
const CStringDictionary::TStringId pa_nInstanceNameId,
const SCFB_FBNData * const pa_cpoFBNData, TForteByte *pa_acFBConnData, TForteByte *pa_acFBVarsData);
virtual ~CCompositeFB();
/*!\brief Connects specific data input of a CFB with a specific data connection.
*
* \param pa_unDINameId StringId of input name.
* \param pa_poDataCon Pointer to the data connection the CFB should be connected to.
* \return TRUE on success, FALSE if data output not exists or output is already connected.
*/
virtual bool connectDI(TPortId paDIPortId, CDataConnection *paDataCon);
virtual bool configureGenericDO(TPortId paDOPortId, const CIEC_ANY &paRefValue);
//! implement improved version of get Var for CFBs, allowing to read and write to internal elements
virtual CIEC_ANY* getVar(CStringDictionary::TStringId *paNameList,
unsigned int paNameListSize);
virtual EMGMResponse changeFBExecutionState(EMGMCommandType pa_unCommand);
#ifdef FORTE_SUPPORT_MONITORING
virtual CFunctionBlock *getFB(forte::core::TNameIdentifier::CIterator &paNameListIt);
#endif
private:
virtual void executeEvent(int pa_nEIID);
void createInternalFBs();
void createEventConnections();
void prepareIf2InEventCons();
void establishConnection(CConnection *paCon, CFunctionBlock *paDstFb, CStringDictionary::TStringId paDstNameId);
void createDataConnections();
void prepareIf2InDataCons();
void setParams();
void sendInternal2InterfaceOutputEvent(int pa_nEOID);
//!Acquire the functionblock for a given function block number this may be a contained fb, an adapter, or the composite itself.
CFunctionBlock *getFunctionBlock(int pa_nFBNum);
CInterface2InternalDataConnection *mIf2InDConns;
CDataConnection **m_apoIn2IfDConns;
const SCFB_FBNData * const cm_cpoFBNData;
TFunctionBlockPtr *m_apoInternalFBs;
CEventConnection **m_apoEventConnections;
CDataConnection **m_apoDataConnections;
//!Array storing the holding the connections to be used in the execute event for triggering the internal FBs
CEventConnection **mInterface2InternalEventCons;
#ifdef FORTE_FMU
friend class fmuInstance;
#endif //FORTE_FMU
};
#define COMPOSITE_FUNCTION_BLOCK_CTOR(fbclass) \
fbclass(const CStringDictionary::TStringId pa_nInstanceNameId, CResource *pa_poSrcRes) : \
CCompositeFB(pa_poSrcRes, &scm_stFBInterfaceSpec, pa_nInstanceNameId, &scm_stFBNData, m_anFBConnData, m_anFBVarsData)
#endif /*_CFB_H_*/