blob: 3892f7d0f84059e491908d59a68e6ca3e58346e7 [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, Rene Smodic, Thomas Strasser, Gerhard Ebenhofer,
* Ingo Hegny
* - initial API and implementation and/or initial documentation
*******************************************************************************/
#ifndef _DEV_MGR_H_
#define _DEV_MGR_H_
#include <funcbloc.h>
#include <mgmcmdstruct.h>
#include <commfb.h>
#include "IBootFileCallback.h"
class CDevice;
/*! \brief Implementation of the DEV_MGR FB.
*/
class DEV_MGR: public forte::com_infra::CCommFB, public IBootFileCallback {
DECLARE_FIRMWARE_FB(DEV_MGR)
public:
/*!\brief Type for the response of MGM command messages
*
* TODO fully define all responses as defined in IEC 61499 inc. numbers.
*/
static const char * const scm_sMGMResponseTexts[13];
DEV_MGR(CStringDictionary::TStringId paInstanceNameId, CResource *paSrcRes);
virtual ~DEV_MGR();
bool executeCommand(char *paDest, char *paCommand);
private:
EMGMResponse parseAndExecuteMGMCommand(char *paDest, char *paCommand);
static const CStringDictionary::TStringId scm_anDataInputNames[];
static const CStringDictionary::TStringId scm_anDataInputTypeIds[];
static const CStringDictionary::TStringId scm_anDataOutputNames[];
static const CStringDictionary::TStringId scm_anDataOutputTypeIds[];
static const TEventID scm_nEventINITID = 0;
static const TEventID scm_nEventREQID = 1;
static const TForteInt16 scm_anEIWithIndexes[];
static const TDataIOID scm_anEIWith[];
static const CStringDictionary::TStringId scm_anEventInputNames[];
static const TEventID scm_nEventINITOID = 0;
static const TEventID scm_nEventCNFID = 1;
static const TForteInt16 scm_anEOWithIndexes[];
static const TDataIOID scm_anEOWith[];
static const CStringDictionary::TStringId scm_anEventOutputNames[];
static const SFBInterfaceSpec scm_stFBInterfaceSpec;
FORTE_FB_DATA_ARRAY(2, 3, 4, 0);
//! The device the block is contained in
CDevice &m_poDevice;
void executeRQST(void);
/*! \brief Parse the given request header to determine the ID and the requested command
*
* \param paRequestString data of the request
* \param paCommand the command structure for holding command information
* \return pointer to the next part of the command zero on error
*/
static char* parseRequest(char *paRequestString, forte::core::SManagementCMD &paCommand);
/*! \brief Parse the given request that is left after parsing the header to parse FB data
*
* \param paRequestPartLeft data of the request that has been left after parsing the header
* \param paCommand the command structure for holding command information
* \return true if the FB data could be parsed
*/
static bool parseFBData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
/*! \brief Parse the given request that is left after parsing the header to parse FB or Adapter type
*
* \param paRequestPartLeft data of the request that has been left after parsing the header
* \param paCommand the command structure for holding command information
* \param pa_requestType the type that should be searched
* \return true if the FB type could be parsed
*/
static bool parseXType(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand, const char *paRequestType);
/*! \brief Parse the given request that is left after parsing the header to parse connection data
*
* \param paRequestPartLeft data of the request that has been left after parsing the header
* \param paCommand the command structure for holding command information
* \return true if the connection data could be parsed
*/
static bool parseConnectionData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
static bool parseWriteConnectionData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
static void parseCreateData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
static void parseDeleteData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
//! Check if an FB is given for a state change command (i.e., START, STOP, KILL, RESET)
static void parseAdditionalStateCommandData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
static void parseReadData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
static void parseWriteData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
#ifdef FORTE_SUPPORT_QUERY_CMD
static void parseQueryData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
static bool parseTypeListData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
#endif
/*! \brief parse a hierarchical identifier list
*
* The identifiers are separated by '.' and the end character for the list is '\"'
*
* @param paIdentifierStart pointer to the start of the identifier that will be parsed
* @param paIdentifier identifier vector where to write the parsed identifiers to
* @return number of bytes used from the character array or -1 if the identifier could not be parsed
*/
static int parseIdentifier(char *paIdentifierStart, forte::core::TNameIdentifier &paIdentifier);
virtual void executeEvent(int pa_nEIID);
#ifdef FORTE_SUPPORT_MONITORING
static bool parseMonitoringData(char *paRequestPartLeft, forte::core::SManagementCMD &paCommand);
void generateMonitorResponse(EMGMResponse paResp, forte::core::SManagementCMD &paCMD);
#endif //FORTE_SUPPORT_MONITORING
/*! \brief set the RESP output of the DEV_MGR according to the given response data
*
* \param pa_acID id of the response
* \param pa_eResp qualifier of the response
*/
void generateResponse(const char *paID, EMGMResponse paResp);
/*! \brief set the RESP output of the DEV_MGR according to the given response data
*
* \param pa_acID id of the response
* \param pa_eResp qualifier of the response
* \param paCMD the command type
*/
void generateLongResponse(EMGMResponse paResp, forte::core::SManagementCMD &paCMD);
void appedIdentifierName(CIEC_STRING& paDest, forte::core::TNameIdentifier &paIdentifier);
CIEC_BOOL &QI() {
return *static_cast<CIEC_BOOL*>(getDI(0));
};
CIEC_STRING &ID() {
return *static_cast<CIEC_STRING*>(getDI(1));
};
CIEC_STRING &RESP() {
return *static_cast<CIEC_STRING*>(getDI(2));
};
CIEC_BOOL &QO() {
return *static_cast<CIEC_BOOL*>(getDO(0));
};
CIEC_STRING &STATUS() {
return *static_cast<CIEC_STRING*>(getDO(1));
};
CIEC_STRING &DST() {
return *static_cast<CIEC_STRING*>(getDO(2));
};
CIEC_STRING &RQST() {
return *static_cast<CIEC_STRING*>(getDO(3));
};
forte::core::SManagementCMD mCommand;
};
#endif /*DEV_MGR_H_*/