blob: e9494e5ad3be302c850a980ae9c47c8185ce306f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 - 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:
* Alois Zoitl, Matthias Plasch
* - initial API and implementation and/or initial documentation
* Alois Zoitl - introduced new CGenFB class for better handling generic FBs
*******************************************************************************/
#include "GEN_E_MUX.h"
#ifdef FORTE_ENABLE_GENERATED_SOURCE_CPP
#include "GEN_E_MUX_gen.cpp"
#endif
#include <stdio.h>
DEFINE_GENERIC_FIRMWARE_FB(GEN_E_MUX, g_nStringIdGEN_E_MUX);
const CStringDictionary::TStringId GEN_E_MUX::scm_anDataOutputNames[] = { g_nStringIdK };
const CStringDictionary::TStringId GEN_E_MUX::scm_aunDODataTypeIds[] = { g_nStringIdUINT };
const TForteInt16 GEN_E_MUX::scm_anEOWithIndexes[] = { 0 };
const TDataIOID GEN_E_MUX::scm_anEOWith[] = { 0, 255 };
const CStringDictionary::TStringId GEN_E_MUX::scm_anEventOutputNames[] = { g_nStringIdEO };
GEN_E_MUX::GEN_E_MUX(const CStringDictionary::TStringId paInstanceNameId, CResource *paSrcRes) :
CGenFunctionBlock<CFunctionBlock>(paSrcRes, paInstanceNameId), m_anEventInputNames(0){
}
GEN_E_MUX::~GEN_E_MUX(){
delete[] m_anEventInputNames;
}
void GEN_E_MUX::executeEvent(int paEIID){
if(paEIID < m_pstInterfaceSpec->m_nNumEIs){
K() = static_cast<TForteUInt16>(paEIID);
sendOutputEvent(scm_nEventEOID);
}
}
bool GEN_E_MUX::createInterfaceSpec(const char *paConfigString, SFBInterfaceSpec &paInterfaceSpec){
const char *acPos = strrchr(paConfigString, '_');
if(0 != acPos){
++acPos;
if('M' != *acPos){
//we have an underscore and it is not the first underscore after E
paInterfaceSpec.m_nNumEIs = static_cast<TForteUInt8>(forte::core::util::strtoul(acPos, 0, 10));
if(paInterfaceSpec.m_nNumEIs < CFunctionBlock::scm_nMaxInterfaceEvents && paInterfaceSpec.m_nNumEIs >= 2){
m_anEventInputNames = new CStringDictionary::TStringId[paInterfaceSpec.m_nNumEIs];
generateGenericInterfacePointNameArray("EI", m_anEventInputNames, paInterfaceSpec.m_nNumEIs);
paInterfaceSpec.m_aunEINames = m_anEventInputNames;
paInterfaceSpec.m_anEIWith = 0;
paInterfaceSpec.m_anEIWithIndexes = 0;
paInterfaceSpec.m_nNumEOs = 1;
paInterfaceSpec.m_aunEONames = scm_anEventOutputNames;
paInterfaceSpec.m_anEOWith = scm_anEOWith;
paInterfaceSpec.m_anEOWithIndexes = scm_anEOWithIndexes;
paInterfaceSpec.m_nNumDIs = 0;
paInterfaceSpec.m_aunDINames = 0;
paInterfaceSpec.m_aunDIDataTypeNames = 0;
paInterfaceSpec.m_nNumDOs = 1;
paInterfaceSpec.m_aunDONames = scm_anDataOutputNames;
paInterfaceSpec.m_aunDODataTypeNames = scm_aunDODataTypeIds;
return true;
}
else{
if(paInterfaceSpec.m_nNumEIs >= CFunctionBlock::scm_nMaxInterfaceEvents){
DEVLOG_ERROR("Cannot configure FB-Instance E_MUX_%d. Number of event inputs exceeds maximum of %d.\n", paInterfaceSpec.m_nNumEIs, CFunctionBlock::scm_nMaxInterfaceEvents);
}
else{
DEVLOG_ERROR("Cannot configure FB-Instance E_MUX_%d. Number of event inputs smaller than minimum of 2.\n", paInterfaceSpec.m_nNumEIs);
}
}
}
}
return false;
}