blob: 5b851d90de3836f60a78a614b5c0bb6c19b90f59 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 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:
* Monika Wenger
* - initial API and implementation and/or initial documentation
*******************************************************************************/
#include "luaadaptertypeentry.h"
#include "luaengine.h"
#include "luatype.h"
#include "luaadapter.h"
#include "resource.h"
#include "adapter.h"
CLuaAdapterTypeEntry::CLuaAdapterTypeEntry(CStringDictionary::TStringId paTypeNameId, CIEC_STRING paLuaScriptAsString, SFBInterfaceSpec& paInterfaceSpec) :
CTypeLib::CAdapterTypeEntry(paTypeNameId, 0, &mSocketInterfaceSpec), cm_sLuaScriptAsString(paLuaScriptAsString), mSocketInterfaceSpec(paInterfaceSpec) {
initPlugInterfaceSpec(mSocketInterfaceSpec);
}
CLuaAdapterTypeEntry::~CLuaAdapterTypeEntry() {
deleteInterfaceSpec(mSocketInterfaceSpec);
}
CLuaAdapterTypeEntry* CLuaAdapterTypeEntry::createLuaAdapterTypeEntry(CStringDictionary::TStringId paTypeNameId, CIEC_STRING& paLuaScriptAsString) {
CLuaEngine luaEngine;
if(!luaEngine.loadString(std::string(paLuaScriptAsString.getValue()))) {
return NULL;
}
//interfaceSpec
SFBInterfaceSpec interfaceSpec = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
if(!luaEngine.pushField(-1, "interfaceSpec", LUA_TTABLE)) {
return NULL;
}
if(!initInterfaceSpec(interfaceSpec, &luaEngine, -1)) {
deleteInterfaceSpec(interfaceSpec);
return NULL;
}
luaEngine.pop(); //pop interfaceSpec
luaEngine.pop(); //pop loaded defs
return new CLuaAdapterTypeEntry(paTypeNameId, paLuaScriptAsString, interfaceSpec);
}
CAdapter* CLuaAdapterTypeEntry::createAdapterInstance(CStringDictionary::TStringId pa_nInstanceNameId, CResource *pa_poSrcRes, bool pa_bIsPlug) {
CLuaEngine* luaEngine = pa_poSrcRes->getLuaEngine();
if(!luaEngine->load(this) && (!luaEngine->loadString(std::string(cm_sLuaScriptAsString.getValue())))) {
return NULL;
}
TForteByte* connData = 0;
TForteByte* varsData = 0;
if(pa_bIsPlug) {
connData = new TForteByte[CAdapter::genAdapterFBConnDataSize(mPlugInterfaceSpec.m_nNumEIs, mPlugInterfaceSpec.m_nNumEOs, mPlugInterfaceSpec.m_nNumDIs,
mPlugInterfaceSpec.m_nNumDOs)];
varsData = new TForteByte[CAdapter::genFBVarsDataSize(mPlugInterfaceSpec.m_nNumDIs, mPlugInterfaceSpec.m_nNumDOs, mPlugInterfaceSpec.m_nNumAdapters)];
} else {
connData = new TForteByte[CAdapter::genAdapterFBConnDataSize(mSocketInterfaceSpec.m_nNumEIs, mSocketInterfaceSpec.m_nNumEOs, mSocketInterfaceSpec.m_nNumDIs,
mSocketInterfaceSpec.m_nNumDOs)];
varsData = new TForteByte[CAdapter::genFBVarsDataSize(mSocketInterfaceSpec.m_nNumDIs, mSocketInterfaceSpec.m_nNumDOs, mSocketInterfaceSpec.m_nNumAdapters)];
}
return new CLuaAdapter(pa_nInstanceNameId, this, pa_bIsPlug, connData, varsData, pa_poSrcRes);
}
bool CLuaAdapterTypeEntry::initInterfaceSpec(SFBInterfaceSpec& paInterfaceSpec, CLuaEngine* paLuaEngine, int paIndex) {
//EI
paInterfaceSpec.m_nNumEIs = paLuaEngine->getField<TForteUInt8, &CLuaEngine::getInteger<TForteUInt8> >(paIndex, "numEIs");
size_t numEIs = paInterfaceSpec.m_nNumEIs;
paInterfaceSpec.m_aunEINames = paLuaEngine->getArrayField<CStringDictionary::TStringId, &CLuaEngine::getStringId>(paIndex, "EINames", numEIs);
size_t numEIWith = SIZE_MAX;
paInterfaceSpec.m_anEIWith = paLuaEngine->getArrayField<TDataIOID, &CLuaEngine::getInteger<TDataIOID> >(paIndex, "EIWith", numEIWith);
paInterfaceSpec.m_anEIWithIndexes = paLuaEngine->getArrayField<TForteInt16, &CLuaEngine::getInteger<TForteInt16> >(paIndex, "EIWithIndexes", numEIs);
//EO
paInterfaceSpec.m_nNumEOs = paLuaEngine->getField<TForteUInt8, &CLuaEngine::getInteger<TForteUInt8> >(paIndex, "numEOs");
size_t numEOs = paInterfaceSpec.m_nNumEOs;
paInterfaceSpec.m_aunEONames = paLuaEngine->getArrayField<CStringDictionary::TStringId, &CLuaEngine::getStringId>(paIndex, "EONames", numEOs);
size_t numEOWith = SIZE_MAX;
paInterfaceSpec.m_anEOWith = paLuaEngine->getArrayField<TDataIOID, &CLuaEngine::getInteger<TDataIOID> >(paIndex, "EOWith", numEOWith);
paInterfaceSpec.m_anEOWithIndexes = paLuaEngine->getArrayField<TForteInt16, &CLuaEngine::getInteger<TForteInt16> >(paIndex, "EOWithIndexes", numEOs);
//DI
paInterfaceSpec.m_nNumDIs = paLuaEngine->getField<TForteUInt8, &CLuaEngine::getInteger<TForteUInt8> >(paIndex, "numDIs");
size_t numDIs = paInterfaceSpec.m_nNumDIs;
paInterfaceSpec.m_aunDINames = paLuaEngine->getArrayField<CStringDictionary::TStringId, &CLuaEngine::getStringId>(paIndex, "DINames", numDIs);
size_t numDIDataTypeNames = SIZE_MAX;
paInterfaceSpec.m_aunDIDataTypeNames = paLuaEngine->getCustomArrayField<CStringDictionary::TStringId, luatype::getTypeNameId>(paIndex, "DIDataTypeNames",
numDIDataTypeNames);
//DO
paInterfaceSpec.m_nNumDOs = paLuaEngine->getField<TForteUInt8, &CLuaEngine::getInteger<TForteUInt8> >(paIndex, "numDOs");
size_t numDOs = paInterfaceSpec.m_nNumDOs;
paInterfaceSpec.m_aunDONames = paLuaEngine->getArrayField<CStringDictionary::TStringId, &CLuaEngine::getStringId>(paIndex, "DONames", numDOs);
size_t numDODataTypeNames = SIZE_MAX;
paInterfaceSpec.m_aunDODataTypeNames = paLuaEngine->getCustomArrayField<CStringDictionary::TStringId, luatype::getTypeNameId>(paIndex, "DODataTypeNames",
numDODataTypeNames);
paInterfaceSpec.m_nNumAdapters = 0;
paInterfaceSpec.m_pstAdapterInstanceDefinition = 0;
//checks
if(paInterfaceSpec.m_aunEINames == NULL || paInterfaceSpec.m_anEIWith == NULL || paInterfaceSpec.m_anEIWithIndexes == NULL
|| paInterfaceSpec.m_aunEONames == NULL || paInterfaceSpec.m_anEOWith == NULL || paInterfaceSpec.m_anEOWithIndexes == NULL
|| paInterfaceSpec.m_aunDINames == NULL || paInterfaceSpec.m_aunDIDataTypeNames == NULL || paInterfaceSpec.m_aunDONames == NULL
|| paInterfaceSpec.m_aunDODataTypeNames == NULL) {
return false;
}
for(size_t i = 0; i < numEIs; i++) {
if(paInterfaceSpec.m_anEIWithIndexes[i] >= (TForteInt16) numEIWith) {
return false;
}
}
for(size_t i = 0; i < numEOs; i++) {
if(paInterfaceSpec.m_anEOWithIndexes[i] >= (TForteInt16) numEOWith) {
return false;
}
}
return true;
}
bool CLuaAdapterTypeEntry::initPlugInterfaceSpec(SFBInterfaceSpec& paInterfaceSpec) {
//EI
mPlugInterfaceSpec.m_nNumEIs = paInterfaceSpec.m_nNumEOs;
mPlugInterfaceSpec.m_aunEINames = paInterfaceSpec.m_aunEONames;
mPlugInterfaceSpec.m_anEIWith = paInterfaceSpec.m_anEOWith;
mPlugInterfaceSpec.m_anEIWithIndexes = paInterfaceSpec.m_anEOWithIndexes;
//EO
mPlugInterfaceSpec.m_nNumEOs = paInterfaceSpec.m_nNumEIs;
mPlugInterfaceSpec.m_aunEONames = paInterfaceSpec.m_aunEINames;
mPlugInterfaceSpec.m_anEOWith = paInterfaceSpec.m_anEIWith;
mPlugInterfaceSpec.m_anEOWithIndexes = paInterfaceSpec.m_anEIWithIndexes;
//DI
mPlugInterfaceSpec.m_nNumDIs = paInterfaceSpec.m_nNumDOs;
mPlugInterfaceSpec.m_aunDINames = paInterfaceSpec.m_aunDONames;
mPlugInterfaceSpec.m_aunDIDataTypeNames = paInterfaceSpec.m_aunDODataTypeNames;
//DO
mPlugInterfaceSpec.m_nNumDOs = paInterfaceSpec.m_nNumDIs;
mPlugInterfaceSpec.m_aunDONames = paInterfaceSpec.m_aunDINames;
mPlugInterfaceSpec.m_aunDODataTypeNames = paInterfaceSpec.m_aunDIDataTypeNames;
mPlugInterfaceSpec.m_nNumAdapters = 0;
mPlugInterfaceSpec.m_pstAdapterInstanceDefinition = 0;
return true;
}
void CLuaAdapterTypeEntry::deleteInterfaceSpec(SFBInterfaceSpec& paInterfaceSpec) {
delete[] paInterfaceSpec.m_aunEINames;
delete[] paInterfaceSpec.m_anEIWith;
delete[] paInterfaceSpec.m_anEIWithIndexes;
delete[] paInterfaceSpec.m_aunEONames;
delete[] paInterfaceSpec.m_anEOWith;
delete[] paInterfaceSpec.m_anEOWithIndexes;
delete[] paInterfaceSpec.m_aunDINames;
delete[] paInterfaceSpec.m_aunDIDataTypeNames;
delete[] paInterfaceSpec.m_aunDONames;
delete[] paInterfaceSpec.m_aunDODataTypeNames;
}