blob: 590d57a7b20fbc4fae6b1152d330adc56c376cdd [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, Gunnar Grabmair, Alois Zoitl, Gerhard Ebenhofer, Ingo Hegny
* - initial implementation and rework communication infrastructure
*******************************************************************************/
#ifndef _BASICFB_H_
#define _BASICFB_H_
#include "funcbloc.h"
#ifndef FORTE_BASIC_FB_DATA_ARRAY //with this check we can overwrite this define in a platform specific file (e.g., config.h)
/*! Define that adds the data array to a Basic FB
* May be overwritten by a platform specific version that adapts for example some alignment requirements
*/
#define FORTE_BASIC_FB_DATA_ARRAY(a_nNumEOs, a_nNumDIs, a_nNumDOs, a_nNumIntVars, a_nNumAdapters) \
union{ \
TForteByte m_anFBConnData[genFBConnDataSizeTemplate<a_nNumEOs, a_nNumDIs, a_nNumDOs>::value]; \
};\
union{ \
TForteByte m_anFBVarsData[genBasicFBVarsDataSizeTemplate<a_nNumDIs, a_nNumDOs, a_nNumIntVars, a_nNumAdapters>::value]; \
};
#endif
/*!\ingroup CORE
* \brief structure to hold the data needed for creating the internal vars
*
*/
struct SInternalVarsInformation{
TPortId m_nNumIntVars; //!< Number of internal vars
const CStringDictionary::TStringId * m_aunIntVarsNames; //!< List of the internalvarsnames
const CStringDictionary::TStringId * m_aunIntVarsDataTypeNames; //!< List of the data type names for the internal vars
};
/*!\ingroup CORE
*
* \brief Class for handling firmware basic function blocks.
*/
class CBasicFB : public CFunctionBlock{
public:
/*!\brief The main constructur for a basic function block.
*/
CBasicFB(CResource *pa_poSrcRes,
const SFBInterfaceSpec *pa_pstInterfaceSpec,
const CStringDictionary::TStringId pa_nInstanceNameId,
const SInternalVarsInformation *pa_pstVarInternals,
TForteByte *pa_acFBConnData, TForteByte *pa_acBasicFBVarsData);
virtual ~CBasicFB();
virtual CIEC_ANY* getVar(CStringDictionary::TStringId *paNameList,
unsigned int paNameListSize);
virtual EMGMResponse changeFBExecutionState(EMGMCommandType pa_unCommand);
template<unsigned int ta_nNumDIs, unsigned int ta_nNumDOs, unsigned int ta_nNumIntVars,
unsigned int ta_nNumAdapters = 0>
struct genBasicFBVarsDataSizeTemplate{
enum {
value = ((sizeof(TDataConnectionPtr) + sizeof(CIEC_ANY)) * ta_nNumIntVars +
genFBVarsDataSizeTemplate<ta_nNumDIs, ta_nNumDOs, ta_nNumAdapters>::value)
};
};
static size_t genBasicFBVarsDataSize(unsigned int pa_nNumDIs, unsigned int pa_nNumDOs,
unsigned int pa_nNumIntVars, unsigned int pa_nNumAdapters = 0){
return ((sizeof(TDataConnectionPtr) + sizeof(CIEC_ANY)) * pa_nNumIntVars +
genFBVarsDataSize(pa_nNumDIs, pa_nNumDOs, pa_nNumAdapters));
}
;
protected:
/*! \brief Get the internal variable with given number
*
* Attention this function will not perform any range checks on the pa_nVarIntNum parameter!
* @param pa_nVarIntNum number of the internal variable starting with 0
* @return pointer to the internal variable
*/
CIEC_ANY *getVarInternal(unsigned int pa_nVarIntNum){
return m_aoInternals + pa_nVarIntNum;
}
CIEC_UINT m_nECCState; //! the current state of the ecc. start value is 0 = initial state id
const SInternalVarsInformation * const cm_pstVarInternals; //!< struct holding the information on the internal vars.
private:
/*!\brief Get the pointer to a internal variable of the basic FB.
*
* \param pa_nInternalName StringId of the internal variable name.
* \return Pointer to the internal variable or 0.
*/
CIEC_ANY *getInternalVar(CStringDictionary::TStringId pa_nInternalName);
CIEC_ANY *m_aoInternals; //!< A list of pointers to the internal variables.
#ifdef FORTE_FMU
friend class fmuInstance;
#endif //FORTE_FMU
};
#endif /*_BASICFB_H_*/