blob: 1bcd9698a7412be329fe12dac9009671fc1eec65 [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, Gerhard Ebenhofer, Ingo Hegny
* - initial implementation and rework communication infrastructure
*******************************************************************************/
#include <string.h>
#include "basicfb.h"
CBasicFB::CBasicFB(CResource *pa_poSrcRes,
const SFBInterfaceSpec *pa_pstInterfaceSpec,
const CStringDictionary::TStringId pa_nInstanceNameId,
const SInternalVarsInformation *pa_pstVarInternals,
TForteByte *pa_acFBConnData, TForteByte *pa_acBasicFBVarsData) :
CFunctionBlock(pa_poSrcRes, pa_pstInterfaceSpec, pa_nInstanceNameId, pa_acFBConnData, pa_acBasicFBVarsData),
m_nECCState(0),
cm_pstVarInternals(pa_pstVarInternals){
m_aoInternals = 0;
if((0 != cm_pstVarInternals) && (cm_pstVarInternals->m_nNumIntVars) && (0 != pa_acBasicFBVarsData)) {
pa_acBasicFBVarsData += genFBVarsDataSize(m_pstInterfaceSpec->m_nNumDIs, m_pstInterfaceSpec->m_nNumDOs, m_pstInterfaceSpec->m_nNumAdapters);
m_aoInternals = reinterpret_cast<CIEC_ANY *>(pa_acBasicFBVarsData);
const CStringDictionary::TStringId *pnDataIds = cm_pstVarInternals->m_aunIntVarsDataTypeNames;
for(int i = 0; i < cm_pstVarInternals->m_nNumIntVars; ++i) {
createDataPoint(&pnDataIds, pa_acBasicFBVarsData);
pa_acBasicFBVarsData += sizeof(CIEC_ANY);
}
}
}
CBasicFB::~CBasicFB(){
if(0 != m_aoInternals){
for(int i = 0; i < cm_pstVarInternals->m_nNumIntVars; ++i){
getVarInternal(i)->~CIEC_ANY();
}
}
}
CIEC_ANY *CBasicFB::getVar(CStringDictionary::TStringId *paNameList,
unsigned int paNameListSize){
CIEC_ANY *poRetVal = CFunctionBlock::getVar(paNameList, paNameListSize);
if((0 == poRetVal) && (1 == paNameListSize)){
poRetVal = getInternalVar(*paNameList);
if(0 == poRetVal && !strcmp("$ECC", CStringDictionary::getInstance().get(*paNameList))) { //TODO consider if this can also be an string ID in a differnt way
poRetVal = &m_nECCState;
}
}
return poRetVal;
}
EMGMResponse CBasicFB::changeFBExecutionState(EMGMCommandType pa_unCommand){
EMGMResponse nRetVal = CFunctionBlock::changeFBExecutionState(pa_unCommand);
if((e_RDY == nRetVal) && (cg_nMGM_CMD_Reset == pa_unCommand)){
m_nECCState = 0;
}
return nRetVal;
}
CIEC_ANY *CBasicFB::getInternalVar(CStringDictionary::TStringId pa_nInternalName){
CIEC_ANY *retVal = 0;
if(0 != cm_pstVarInternals){
TPortId unVarId =
getPortId(pa_nInternalName, cm_pstVarInternals->m_nNumIntVars, cm_pstVarInternals->m_aunIntVarsNames);
if(cg_unInvalidPortId != unVarId){
retVal = getVarInternal(unVarId);
}
}
return retVal;
}