blob: 5b73233c95fd51ebd93f69736954ae357aab7b3e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006-2015 ACIN, Profactor GmbH, fortiss GmbH
* 2018 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:
* Rene Smodic, Thomas Strasser, Alois Zoitl, Michael Hofmann,
* Martin Melik-Merkumians, Ingo Hegny, Patrick Smejkal
* - initial implementation and rework communication infrastructure
* Alois Zoitl - introduced new CGenFB class for better handling generic FBs
*******************************************************************************/
#ifndef _SRC_CORE_COMINFRA_BASECOMMFB_H_
#define _SRC_CORE_COMINFRA_BASECOMMFB_H_
#include <forte_config.h>
#include "comtypes.h"
#include "../genfb.h"
#include "../esfb.h"
namespace forte {
namespace com_infra {
class CComLayer;
class CBaseCommFB : public CGenFunctionBlock<CEventSourceFB> {
public:
virtual ~CBaseCommFB();
virtual EMGMResponse changeFBExecutionState(EMGMCommandType pa_unCommand);
forte::com_infra::EComServiceType getComServiceType() const {
return m_eCommServiceType;
}
unsigned int getNumSD() const {
return m_pstInterfaceSpec->m_nNumDIs - 2;
}
unsigned int getNumRD() const {
return m_pstInterfaceSpec->m_nNumDOs - 2;
}
CIEC_ANY *getSDs() {
return getDI(2);
}
CIEC_ANY *getRDs() {
return getDO(2);
}
void interruptCommFB(CComLayer *pa_poComLayer);
CIEC_BOOL& QI() {
return *static_cast<CIEC_BOOL*>(getDI(0));
}
#ifdef FORTE_USE_WSTRING_DATATYPE
CIEC_WSTRING& ID() {
return *static_cast<CIEC_WSTRING*>(getDI(1));
}
CIEC_WSTRING& STATUS() {
return *static_cast<CIEC_WSTRING*>(getDO(1));
}
#else
//TODO after fixing discussion on the new compliance profile fix these values to STRING
CIEC_STRING& ID() {
return *static_cast<CIEC_STRING*>(getDI(1));
}
CIEC_STRING& STATUS() {
return *static_cast<CIEC_STRING*>(getDO(1));
}
#endif
CIEC_BOOL& QO() {
return *static_cast<CIEC_BOOL*>(getDO(0));
}
protected:
CBaseCommFB(const CStringDictionary::TStringId pa_nInstanceNameId, CResource *pa_poSrcRes, forte::com_infra::EComServiceType pa_eCommServiceType);
static char *extractLayerIdAndParams(char **paRemainingID, char **paLayerParams);
/*!\brief Generate a layer ID formed by a root with a prefix and a suffix
*
* @param paPrefix the prefix to prepend
* @param paIDRoot the root which would get appended and prepended
* @param paSuffix the suffix to append
* @return ID with layer configuration
*/
static char *buildIDString(const char *paPrefix, const char *paIDRoot, const char *paSuffix);
virtual EComResponse receiveData() = 0;
virtual EComResponse sendData() = 0;
/*!\brief Close the connection and delete the communication stack
*
* This function, aided by the the layer destructor, will close and
* delete bottom layers after closing its connection.
*/
void closeConnection();
static const char * const scm_sResponseTexts[];
/*!\brief Create the whole communication stack and open the connection
*
* This function will configure every layer.
*
* \return status of the opening process
*/
EComResponse openConnection();
/*\brief go through the given commID and create the according stack of communciation layers
*/
EComResponse createComstack(char *commID);
/*!\brief Generate the default layer ID
*
* If the ID string does not contain [], this function will be called
* to generate a default layer configuration. This function may be
* overwritten by special Comfbs to provide their own default layer
* config. See for example GEN_PUBL or GEN_SUBL.
*
* @param paID original ID
* @return ID with layer configuration
*/
virtual char * getDefaultIDString(const char *paID) = 0;
EComServiceType m_eCommServiceType;
CComLayer *m_poTopOfComStack;
unsigned int m_unComInterruptQueueCount; //!< number of triggers pending from the network
CComLayer *m_apoInterruptQueue[cg_unCommunicationInterruptQueueSize];
};
}
}
#endif //_SRC_CORE_COMINFRA_BASECOMMFB_H_