blob: cd483486dcb95fdb01b618ce1e8bf7f6b98b1ba7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 - 2018 ACIN, Profactor GmbH, fortiss GmbH, Johannes Kepler University
* 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, Rene Smodic, Thomas Strasser, Gerhard Ebenhofer, Ingo Hegny,
* - initial implementation and rework communication infrastructure
*******************************************************************************/
#ifndef _RESOURCE_H_
#define _RESOURCE_H_
#include "fbcontainer.h"
#include "funcbloc.h"
#include <forte_sync.h>
#ifdef FORTE_SUPPORT_MONITORING
#include <monitoring.h>
#endif
#ifdef FORTE_DYNAMIC_TYPE_LOAD
class CLuaEngine;
#endif
class CDevice;
class CInterface2InternalDataConnection;
/*! \ingroup CORE\brief Base class for all resources handling the reconfiguration management within this
* resource and the background execution of event chains.
*
* CResource is inherited from CFBContainer in order to make the implementation of getResource easier. Furthermore
* also the forwarding of management commands is less effort.
* TODO think if CFBContainer inheritance should be public or private
*/
class CResource : public CFunctionBlock, public forte::core::CFBContainer{
public:
CSyncObject m_oResDataConSync;
/*! \brief The main constructor for a resource.
*
* The resource can only be generated with a given device the resource is contained. A resource can not exist outside of an device.
* \param pa_poDevice the device the resource is contained in
* \param pa_pstInterfaceSpec interface-specification of resource
* \param pa_nInstanceNameId StringId of instance-name
* \param pa_roObjectHandler reference to object handler
* \param pa_acFBData Byte-array for resource-specific data
*/
CResource(CResource* pa_poDevice, const SFBInterfaceSpec *pa_pstInterfaceSpec,
const CStringDictionary::TStringId pa_nInstanceNameId,
TForteByte *pa_acFBConnData, TForteByte *pa_acFBVarsData);
virtual ~CResource();
/*!\brief Execute the given management command
*
* Evaluates the m_sDestination parameter of the command if empty the resource tries
* to execute the management command if not it tries to apply the mgm command to a
* contained FB if possible.
* \param paCommand internal representation of the management command
* \return response of the MGMCommand execution as defined in IEC 61499
*/
virtual EMGMResponse executeMGMCommand(forte::core::SManagementCMD &paCommand);
/*! \brief Get the device the resource is contained in
*/
CDevice &getDevice(void){
return (CDevice &) getResource();
}
;
CEventChainExecutionThread *getResourceEventExecution(void) const{
return mResourceEventExecution;
};
virtual EMGMResponse changeFBExecutionState(EMGMCommandType pa_unCommand);
/*!\brief Write a parameter value to a given FB-input
*
* @param paNameList the identifier name list of the parameter to be written
* @param paValue the value to be writen
* @return response of the command execution as defined in IEC 61499
*/
EMGMResponse writeValue(forte::core::TNameIdentifier &paNameList, const CIEC_STRING & paValue, bool paForce = false);
#ifdef FORTE_SUPPORT_MONITORING
forte::core::CMonitoringHandler &getMonitoringHandler(){
return mMonitoringHandler;
}
#endif
#ifdef FORTE_DYNAMIC_TYPE_LOAD
CLuaEngine *getLuaEngine(){
return luaEngine;
}
#endif
protected:
CResource(const SFBInterfaceSpec *pa_pstInterfaceSpec,
const CStringDictionary::TStringId pa_nInstanceNameId,
TForteByte *pa_acFBConnData, TForteByte *pa_acFBVarsData);
virtual void executeEvent(int) {
}
/*!Wrapper for simplifying connection creation in resources
*
*/
EMGMResponse createConnection(forte::core::SManagementCMD &paCommand);
#ifdef FORTE_DYNAMIC_TYPE_LOAD
CLuaEngine *luaEngine; //!< The Lua engine for this container
#endif
private:
/*!\brief Create a new connection between source and destination
*
* This function is protected so that devices and resource can utilize to setup their connections.
* @param paSrcNameList identifier name list for the source of the connection
* @param padstNameList identifier name list for the destination of the connection
* @return response of the command execution as defined in IEC 61499
*/
EMGMResponse createConnection(forte::core::TNameIdentifier &paSrcNameList,
forte::core::TNameIdentifier &paDstNameList);
/*! Handle and perform the actions required for an execution state change
* command (i.e., START, STOP, KILL, RESET)
*
* @param paCMD the ecuctoin state change command to be performed
* @param paTarget identifier which is the target for this request if empty the target is the resource
* @return response of the command execution as defined in IEC 61499
*/
EMGMResponse handleExecutionStateCmd(EMGMCommandType paCMD,
forte::core::TNameIdentifier &paTarget);
/*!\brief Create a new connection between source and destination
*
* @param paSrcNameList identifier name list for the source of the connection
* @param padstNameList identifier name list for the destination of the connection
* @return response of the command execution as defined in IEC 61499
*/
EMGMResponse deleteConnection(forte::core::TNameIdentifier &paSrcNameList,
forte::core::TNameIdentifier &paDstNameList);
/*!\brief Read a parameter value from a given FB
*
* @param paNameList the identifier name list of the parameter to be read
* @param paValue the destination for the value to be read
* @return response of the command execution as defined in IEC 61499
*/
EMGMResponse readValue(forte::core::TNameIdentifier &paNameList, CIEC_STRING & paValue);
#ifdef FORTE_SUPPORT_QUERY_CMD
/*!\brief Read the existing fb types.
*
* @return response of the command execution as defined in IEC 61499
*/
static EMGMResponse queryAllFBTypes(CIEC_STRING& paValue);
/*!\brief Read the existing adapter types.
*
* @return response of the command execution as defined in IEC 61499
*/
static EMGMResponse queryAllAdapterTypes(CIEC_STRING& paValue);
/*!\brief Retrieve the list of FB instances
*
* @param paValue the result of the query
* @return response of the command execution as defined in IEC 61499
*/
EMGMResponse queryFBs(CIEC_STRING& paValue);
EMGMResponse queryConnections(CIEC_STRING &paValue);
void createEOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult);
void createDOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult);
void createAOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult);
void createConnectionResponseMessage(const CStringDictionary::TStringId srcId, const CStringDictionary::TStringId dstId, const CFunctionBlock& paDstFb,
const CFunctionBlock& paFb, CIEC_STRING& paValue) const;
EMGMResponse createFBTypeResponseMessage(const CStringDictionary::TStringId paValue, CIEC_STRING & paReqResult);
EMGMResponse createAdapterTypeResponseMessage(const CStringDictionary::TStringId paValue, CIEC_STRING & paReqResult);
EMGMResponse createXTypeResponseMessage(const CTypeLib::CSpecTypeEntry* paInterfaceSpec, const CStringDictionary::TStringId paValue, EMGMResponse retVal, CIEC_STRING& paReqResult);
void createEventInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult);
void createDataInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult);
void createAdapterInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult);
void createInterfaceResponseMessages(CIEC_STRING& paReqResult, const char *paType, const CStringDictionary::TStringId* paNameList,
const CStringDictionary::TStringId* paTypeList, const int pa_nNumberOfElements = 0, const TDataIOID* paEWith = 0, const TForteInt16* paEWithIndexes = 0,
const CStringDictionary::TStringId* paDNameList = 0);
void createInterfaceResponseMessage(CIEC_STRING& paReqResult, const char* pa_pcType, const CIEC_STRING& paName, const CIEC_STRING& paType,
const TDataIOID* paEWith = 0, const TForteInt16* paEWithIndexes = 0, const int pa_nIndex = 0,
const CStringDictionary::TStringId* paENameList = 0) const;
#endif //FORTE_SUPPORT_QUERY_CMD
#ifdef FORTE_DYNAMIC_TYPE_LOAD
/*!\brief create
*
* @return response of the command execution as defined in IEC 61499
*/
EMGMResponse createFBTypeFromLua(CStringDictionary::TStringId typeNameId,
CIEC_STRING & paLuaScriptAsString);
EMGMResponse createAdapterTypeFromLua(CStringDictionary::TStringId typeNameId,
CIEC_STRING & paLuaScriptAsString);
#endif
/*!\brief get the variable with the given name identifier
*
* @param paNameList the identifier name list of the variable to be retrieved
* @return the pointer to the variable or 0 if the variable with the given identifier name list does not exist
*/
CIEC_ANY *getVariable(forte::core::TNameIdentifier &paNameList);
/*!\brief get the connection object for the given source identifier
*
* @param paSrcNameList array of the name hierarchy the requested connection source
* @return pointer to the requested connection, returns 0 if there is no such source
*/
CConnection *getConnection(forte::core::TNameIdentifier &paSrcNameList);
CConnection *getResIf2InConnection(CStringDictionary::TStringId paResInput) const;
void initializeResIf2InConnections();
/*!\brief The event chain execution of background (low priority) event chains started within this resource
*/
CEventChainExecutionThread *mResourceEventExecution;
CInterface2InternalDataConnection *mResIf2InConnections; //!< List of all connections from the res interface to internal FBs
#ifdef FORTE_SUPPORT_MONITORING
forte::core::CMonitoringHandler mMonitoringHandler;
#endif //#ifdef FORTE_SUPPORT_MONITORING
};
#endif /*RESOURCE_H_*/