blob: 74878fd49b06a8ec4fc81a66843323eb8567f6e5 [file] [log] [blame]
/**
* Copyright (c) 2011 Draeger Medical GmbH (http://www.draeger.com).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* CONTRIBUTORS:
* Peter Karlitschek (initial contribution)
*/
package org.eclipse.etrice.generator.cpp.gen;
import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.etrice.core.fsm.fSM.DetailCode;
import org.eclipse.etrice.core.genmodel.etricegen.Root;
import org.eclipse.etrice.core.genmodel.fsm.base.ILogger;
import org.eclipse.etrice.core.room.Attribute;
import org.eclipse.etrice.core.room.CommunicationType;
import org.eclipse.etrice.core.room.DataClass;
import org.eclipse.etrice.core.room.DataType;
import org.eclipse.etrice.core.room.GeneralProtocolClass;
import org.eclipse.etrice.core.room.InterfaceItem;
import org.eclipse.etrice.core.room.Message;
import org.eclipse.etrice.core.room.MessageHandler;
import org.eclipse.etrice.core.room.Port;
import org.eclipse.etrice.core.room.PortClass;
import org.eclipse.etrice.core.room.PortOperation;
import org.eclipse.etrice.core.room.ProtocolClass;
import org.eclipse.etrice.core.room.RefableType;
import org.eclipse.etrice.core.room.RoomModel;
import org.eclipse.etrice.core.room.SAP;
import org.eclipse.etrice.core.room.SPP;
import org.eclipse.etrice.core.room.VarDecl;
import org.eclipse.etrice.generator.base.GlobalGeneratorSettings;
import org.eclipse.etrice.generator.cpp.Main;
import org.eclipse.etrice.generator.cpp.gen.CppExtensions;
import org.eclipse.etrice.generator.cpp.gen.Initialization;
import org.eclipse.etrice.generator.fsm.base.FileSystemHelpers;
import org.eclipse.etrice.generator.fsm.base.IGeneratorFileIo;
import org.eclipse.etrice.generator.generic.GenericProtocolClassGenerator;
import org.eclipse.etrice.generator.generic.ProcedureHelpers;
import org.eclipse.etrice.generator.generic.RoomExtensions;
import org.eclipse.etrice.generator.generic.TypeHelpers;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;
@Singleton
@SuppressWarnings("all")
public class ProtocolClassGen extends GenericProtocolClassGenerator {
@Inject
private IGeneratorFileIo fileIO;
@Inject
@Extension
private CppExtensions stdExt;
@Inject
@Extension
private RoomExtensions roomExt;
@Inject
@Extension
private ProcedureHelpers helpers;
@Inject
@Extension
private TypeHelpers _typeHelpers;
@Inject
@Extension
private FileSystemHelpers _fileSystemHelpers;
@Inject
private Initialization initHelper;
@Inject
private ILogger logger;
public void doGenerate(final Root root) {
EList<ProtocolClass> _usedProtocolClasses = root.getUsedProtocolClasses();
final Function1<ProtocolClass, Boolean> _function = new Function1<ProtocolClass, Boolean>() {
public Boolean apply(final ProtocolClass cl) {
return Boolean.valueOf(ProtocolClassGen.this._fileSystemHelpers.isValidGenerationLocation(cl));
}
};
Iterable<ProtocolClass> _filter = IterableExtensions.<ProtocolClass>filter(_usedProtocolClasses, _function);
for (final ProtocolClass pc : _filter) {
{
String _generationTargetPath = this.roomExt.getGenerationTargetPath(pc);
String _path = this.roomExt.getPath(pc);
final String path = (_generationTargetPath + _path);
String _generationInfoPath = this.roomExt.getGenerationInfoPath(pc);
String _path_1 = this.roomExt.getPath(pc);
final String infopath = (_generationInfoPath + _path_1);
CommunicationType _commType = pc.getCommType();
if (_commType != null) {
switch (_commType) {
case EVENT_DRIVEN:
String _cppHeaderFileName = this.stdExt.getCppHeaderFileName(pc);
CharSequence _generateHeaderFile = this.generateHeaderFile(root, pc);
this.fileIO.generateFile("generating ProtocolClass declaration", path, infopath, _cppHeaderFileName, _generateHeaderFile);
String _cppSourceFileName = this.stdExt.getCppSourceFileName(pc);
CharSequence _generateSourceFile = this.generateSourceFile(root, pc);
this.fileIO.generateFile("generating ProtocolClass implementation", path, infopath, _cppSourceFileName, _generateSourceFile);
break;
case DATA_DRIVEN:
String _cppHeaderFileName_1 = this.stdExt.getCppHeaderFileName(pc);
CharSequence _generateDataDrivenHeaderFile = this.generateDataDrivenHeaderFile(root, pc);
this.fileIO.generateFile("generating ProtocolClass declaration", path, infopath, _cppHeaderFileName_1, _generateDataDrivenHeaderFile);
String _cppSourceFileName_1 = this.stdExt.getCppSourceFileName(pc);
CharSequence _generateDataDrivenSourceFile = this.generateDataDrivenSourceFile(root, pc);
this.fileIO.generateFile("generating ProtocolClass implementation", path, infopath, _cppSourceFileName_1, _generateDataDrivenSourceFile);
break;
case SYNCHRONOUS:
this.logger.logError("synchronous protocols not supported yet", pc);
break;
default:
break;
}
}
}
}
}
protected CharSequence generateHeaderFile(final Root root, final ProtocolClass pc) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("/**");
_builder.newLine();
_builder.append(" ");
_builder.append("* @author generated by eTrice");
_builder.newLine();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("* Header File of ProtocolClass ");
String _name = pc.getName();
_builder.append(_name, " ");
_builder.newLineIfNotEmpty();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("*/");
_builder.newLine();
_builder.newLine();
CharSequence _generateIncludeGuardBegin = this.stdExt.generateIncludeGuardBegin(pc, "");
_builder.append(_generateIncludeGuardBegin, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("#include \"common/modelbase/InterfaceItemBase.h\"");
_builder.newLine();
_builder.append("#include \"common/modelbase/PortBase.h\"");
_builder.newLine();
_builder.append("#include \"common/modelbase/ReplicatedInterfaceItemBase.h\"");
_builder.newLine();
_builder.append("#include \"common/modelbase/ReplicatedPortBase.h\"");
_builder.newLine();
_builder.append("#include \"common/etDatatypesCpp.hpp\"");
_builder.newLine();
_builder.newLine();
{
EList<DataClass> _referencedDataClasses = root.getReferencedDataClasses(pc);
for(final DataClass dataClass : _referencedDataClasses) {
_builder.append("#include \"");
String _path = this.roomExt.getPath(dataClass);
_builder.append(_path, "");
String _name_1 = dataClass.getName();
_builder.append(_name_1, "");
_builder.append(".h\"");
_builder.newLineIfNotEmpty();
}
}
_builder.newLine();
DetailCode _userCode1 = pc.getUserCode1();
CharSequence _userCode = this.helpers.userCode(_userCode1);
_builder.append(_userCode, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
String _generateNamespaceBegin = this.stdExt.generateNamespaceBegin(pc);
_builder.append(_generateNamespaceBegin, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("class ");
String _name_2 = pc.getName();
_builder.append(_name_2, "");
_builder.append(" {");
_builder.newLineIfNotEmpty();
_builder.append(" ");
_builder.append("public:");
_builder.newLine();
_builder.append("\t\t");
_builder.append("/* message IDs */");
_builder.newLine();
_builder.append("\t\t");
String _genMessageIDs = this.genMessageIDs(pc);
_builder.append(_genMessageIDs, "\t\t");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("\t\t");
CharSequence _userCode_1 = this.helpers.userCode(pc, 2);
_builder.append(_userCode_1, "\t\t");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("\t\t");
_builder.append("static bool isValidEvtID(int evtId) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return ((MSG_MIN < evtId) && (evtId < MSG_MAX));");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t\t");
_builder.append("static bool isValidOutgoingEvtID(int evtId) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return ((MSG_MIN < evtId) && (evtId < ");
{
EList<Message> _incomingMessages = pc.getIncomingMessages();
int _size = _incomingMessages.size();
boolean _equals = (_size == 0);
if (_equals) {
_builder.append("MSG_MAX");
} else {
_builder.append("IN_");
EList<Message> _incomingMessages_1 = pc.getIncomingMessages();
Message _get = _incomingMessages_1.get(0);
String _name_3 = _get.getName();
_builder.append(_name_3, "\t\t\t");
}
}
_builder.append("));");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t\t");
_builder.append("static bool isValidIncomingEvtID(int evtId) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return ((");
{
EList<Message> _incomingMessages_2 = pc.getIncomingMessages();
int _size_1 = _incomingMessages_2.size();
boolean _equals_1 = (_size_1 == 0);
if (_equals_1) {
_builder.append("MSG_MAX");
} else {
_builder.append("IN_");
EList<Message> _incomingMessages_3 = pc.getIncomingMessages();
Message _get_1 = _incomingMessages_3.get(0);
String _name_4 = _get_1.getName();
_builder.append(_name_4, "\t\t\t");
}
}
_builder.append(" <= evtId) && (evtId < MSG_MAX));");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t\t");
_builder.append("static const std::string& getMessageString(int msg_id);");
_builder.newLine();
_builder.newLine();
_builder.append("\t");
_builder.append("private:");
_builder.newLine();
_builder.append("\t\t");
_builder.append("static const std::string s_messageStrings[];");
_builder.newLine();
_builder.newLine();
_builder.append("};");
_builder.newLine();
_builder.newLine();
CharSequence _portClassDeclaration = this.portClassDeclaration(pc, false);
_builder.append(_portClassDeclaration, "");
_builder.newLineIfNotEmpty();
CharSequence _portClassDeclaration_1 = this.portClassDeclaration(pc, true);
_builder.append(_portClassDeclaration_1, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
String _generateNamespaceEnd = this.stdExt.generateNamespaceEnd(pc);
_builder.append(_generateNamespaceEnd, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
CharSequence _generateIncludeGuardEnd = this.stdExt.generateIncludeGuardEnd(pc, "");
_builder.append(_generateIncludeGuardEnd, "");
_builder.newLineIfNotEmpty();
return _builder;
}
protected CharSequence portClassDeclaration(final ProtocolClass pc, final boolean conj) {
CharSequence _xblockexpression = null;
{
PortClass pclass = this.roomExt.getPortClass(pc, conj);
String portClassName = this.roomExt.getPortClassName(pc, conj);
String replPortClassName = this.roomExt.getPortClassName(pc, conj, true);
StringConcatenation _builder = new StringConcatenation();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.append("// ");
{
if (conj) {
_builder.append("conjugated ");
}
}
_builder.append("port class");
_builder.newLineIfNotEmpty();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.append("class ");
_builder.append(portClassName, "");
_builder.append(" : public etRuntime::PortBase {");
_builder.newLineIfNotEmpty();
{
boolean _notEquals = (!Objects.equal(pclass, null));
if (_notEquals) {
_builder.append("\t");
DetailCode _userCode = pclass.getUserCode();
CharSequence _userCode_1 = this.helpers.userCode(_userCode);
_builder.append(_userCode_1, "\t");
_builder.newLineIfNotEmpty();
}
}
_builder.append(" ");
_builder.append("public:");
_builder.newLine();
_builder.append("\t ");
_builder.append(portClassName, "\t ");
_builder.append("(etRuntime::IInterfaceItemOwner* actor, const std::string& name, int localId);");
_builder.newLineIfNotEmpty();
_builder.append("\t ");
_builder.append(portClassName, "\t ");
_builder.append("(etRuntime::IInterfaceItemOwner* actor, const std::string& name, int localId, int idx);");
_builder.newLineIfNotEmpty();
_builder.newLine();
{
GlobalGeneratorSettings _settings = Main.getSettings();
boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
if (_isGenerateMSCInstrumentation) {
_builder.append("\t");
_builder.append("virtual void destroy();");
_builder.newLine();
}
}
_builder.newLine();
_builder.append("\t ");
_builder.append("virtual void receive(const etRuntime::Message* m);");
_builder.newLine();
_builder.newLine();
{
boolean _notEquals_1 = (!Objects.equal(pclass, null));
if (_notEquals_1) {
_builder.append("\t");
EList<Attribute> _attributes = pclass.getAttributes();
CharSequence _attributes_1 = this.helpers.attributes(_attributes);
_builder.append(_attributes_1, "\t");
_builder.newLineIfNotEmpty();
_builder.append("\t");
EList<PortOperation> _operations = pclass.getOperations();
CharSequence _operationsDeclaration = this.helpers.operationsDeclaration(_operations, portClassName);
_builder.append(_operationsDeclaration, "\t");
_builder.newLineIfNotEmpty();
}
}
_builder.newLine();
_builder.append("\t ");
_builder.append("// sent messages");
_builder.newLine();
{
List<Message> _allMessages = this._roomHelpers.getAllMessages(pc, conj);
for(final Message m : _allMessages) {
_builder.append("\t");
CharSequence _messageSignature = this.messageSignature(m);
_builder.append(_messageSignature, "\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
}
}
_builder.append("};");
_builder.newLine();
_builder.newLine();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.append("// ");
{
if (conj) {
_builder.append("conjugated ");
}
}
_builder.append("replicated port class");
_builder.newLineIfNotEmpty();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.append("class ");
_builder.append(replPortClassName, "");
_builder.append(" : public etRuntime::ReplicatedPortBase {");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("\t");
_builder.append("public:");
_builder.newLine();
_builder.append("\t\t");
_builder.append(replPortClassName, "\t\t");
_builder.append("(etRuntime::IInterfaceItemOwner* actor, const std::string& name, int localId);");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("\t\t");
_builder.append("int getReplication() const { return getNInterfaceItems(); }");
_builder.newLine();
_builder.append("\t\t");
_builder.append("int getIndexOf(const etRuntime::InterfaceItemBase& ifitem) const { return ifitem.getIdx(); }");
_builder.newLine();
_builder.append("\t\t");
_builder.append(portClassName, "\t\t");
_builder.append("& get(int idx) const { return *dynamic_cast<");
_builder.append(portClassName, "\t\t");
_builder.append("*>(getInterfaceItem(idx)); }");
_builder.newLineIfNotEmpty();
_builder.newLine();
{
if (conj) {
_builder.append("\t\t");
_builder.append("// incoming messages");
_builder.newLine();
{
List<Message> _allIncomingMessages = this._roomHelpers.getAllIncomingMessages(pc);
for(final Message m_1 : _allIncomingMessages) {
_builder.append("\t\t");
CharSequence _messageSignature_1 = this.messageSignature(m_1);
_builder.append(_messageSignature_1, "\t\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
}
}
} else {
_builder.append("\t\t");
_builder.append("// outgoing messages");
_builder.newLine();
{
List<Message> _allOutgoingMessages = this._roomHelpers.getAllOutgoingMessages(pc);
for(final Message m_2 : _allOutgoingMessages) {
_builder.append("\t\t");
CharSequence _messageSignature_2 = this.messageSignature(m_2);
_builder.append(_messageSignature_2, "\t\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
}
}
}
}
_builder.newLine();
_builder.append("\t");
_builder.append("protected:");
_builder.newLine();
_builder.append("\t\t");
_builder.append("virtual etRuntime::InterfaceItemBase* createInterfaceItem(etRuntime::IInterfaceItemOwner* rcv, const std::string& name, int lid, int idx) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return new ");
_builder.append(portClassName, "\t\t\t");
_builder.append("(rcv, name, lid, idx);");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("};");
_builder.newLine();
_xblockexpression = _builder;
}
return _xblockexpression;
}
protected CharSequence generateSourceFile(final Root root, final ProtocolClass pc) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("/**");
_builder.newLine();
_builder.append(" ");
_builder.append("* @author generated by eTrice");
_builder.newLine();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("* Source File of ProtocolClass ");
String _name = pc.getName();
_builder.append(_name, " ");
_builder.newLineIfNotEmpty();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("*/");
_builder.newLine();
_builder.newLine();
_builder.append("#include \"");
String _cppHeaderFileName = this.stdExt.getCppHeaderFileName(pc);
_builder.append(_cppHeaderFileName, "");
_builder.append("\"");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("#include \"common/debugging/DebuggingService.h\"");
_builder.newLine();
_builder.append("#include \"common/messaging/AbstractMessageReceiver.h\"");
_builder.newLine();
_builder.append("#include \"common/messaging/Address.h\"");
_builder.newLine();
_builder.append("#include \"common/messaging/Message.h\"");
_builder.newLine();
_builder.append("#include \"common/modelbase/IEventReceiver.h\"");
_builder.newLine();
_builder.append("#include <iterator>");
_builder.newLine();
_builder.append("#include <vector>");
_builder.newLine();
_builder.newLine();
_builder.append("using namespace etRuntime;");
_builder.newLine();
_builder.newLine();
String _generateNamespaceBegin = this.stdExt.generateNamespaceBegin(pc);
_builder.append(_generateNamespaceBegin, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
CharSequence _userCode = this.helpers.userCode(pc, 3);
_builder.append(_userCode, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("/* message names as strings for debugging (generate MSC) */");
_builder.newLine();
_builder.append("const std::string ");
String _name_1 = pc.getName();
_builder.append(_name_1, "");
_builder.append("::s_messageStrings[] = {\"MIN\", ");
{
List<Message> _allOutgoingMessages = this._roomHelpers.getAllOutgoingMessages(pc);
for(final Message m : _allOutgoingMessages) {
_builder.append("\"");
String _name_2 = m.getName();
_builder.append(_name_2, "");
_builder.append("\",");
}
}
_builder.append(" ");
{
List<Message> _allIncomingMessages = this._roomHelpers.getAllIncomingMessages(pc);
for(final Message m_1 : _allIncomingMessages) {
_builder.append("\"");
String _name_3 = m_1.getName();
_builder.append(_name_3, "");
_builder.append("\",");
}
}
_builder.append("\"MAX\"};");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("const std::string& ");
String _name_4 = pc.getName();
_builder.append(_name_4, "");
_builder.append("::getMessageString(int msg_id) {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("if ((MSG_MIN < msg_id ) && ( msg_id < MSG_MAX )) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return s_messageStrings[msg_id];");
_builder.newLine();
_builder.append("\t");
_builder.append("} else {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("// id out of range");
_builder.newLine();
_builder.append("\t\t");
_builder.append("static const std::string errorMsg = \"Message ID out of range\";");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return errorMsg;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
CharSequence _portClassImplementation = this.portClassImplementation(pc, false);
_builder.append(_portClassImplementation, "");
_builder.newLineIfNotEmpty();
CharSequence _portClassImplementation_1 = this.portClassImplementation(pc, true);
_builder.append(_portClassImplementation_1, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
String _generateNamespaceEnd = this.stdExt.generateNamespaceEnd(pc);
_builder.append(_generateNamespaceEnd, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
return _builder;
}
protected CharSequence portClassImplementation(final ProtocolClass pc, final boolean conj) {
CharSequence _xblockexpression = null;
{
PortClass pclass = this.roomExt.getPortClass(pc, conj);
String portClassName = this.roomExt.getPortClassName(pc, conj);
String replPortClassName = this.roomExt.getPortClassName(pc, conj, true);
StringConcatenation _builder = new StringConcatenation();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.append("// ");
{
if (conj) {
_builder.append("conjugated ");
}
}
_builder.append("port class");
_builder.newLineIfNotEmpty();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.newLine();
_builder.append(portClassName, "");
_builder.append("::");
_builder.append(portClassName, "");
_builder.append("(IInterfaceItemOwner* actor, const std::string& name, int localId)");
_builder.newLineIfNotEmpty();
_builder.append("\t");
CharSequence _generateConstructorInitalizerList = this.generateConstructorInitalizerList(pclass, "0");
_builder.append(_generateConstructorInitalizerList, "\t");
_builder.newLineIfNotEmpty();
_builder.append("{");
_builder.newLine();
{
GlobalGeneratorSettings _settings = Main.getSettings();
boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
if (_isGenerateMSCInstrumentation) {
_builder.append("\t");
_builder.append("DebuggingService::getInstance().addPortInstance(*this);");
_builder.newLine();
}
}
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append(portClassName, "");
_builder.append("::");
_builder.append(portClassName, "");
_builder.append("(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx)");
_builder.newLineIfNotEmpty();
_builder.append("\t");
CharSequence _generateConstructorInitalizerList_1 = this.generateConstructorInitalizerList(pclass, "idx");
_builder.append(_generateConstructorInitalizerList_1, "\t");
_builder.newLineIfNotEmpty();
_builder.append("{");
_builder.newLine();
_builder.append("\t");
{
boolean _notEquals = (!Objects.equal(pclass, null));
if (_notEquals) {
EList<Attribute> _attributes = pclass.getAttributes();
CharSequence _genExtraInitializers = this.initHelper.genExtraInitializers(_attributes);
_builder.append(_genExtraInitializers, "\t");
}
}
_builder.newLineIfNotEmpty();
{
GlobalGeneratorSettings _settings_1 = Main.getSettings();
boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
if (_isGenerateMSCInstrumentation_1) {
_builder.append("\t");
_builder.append("DebuggingService::getInstance().addPortInstance(*this);");
_builder.newLine();
}
}
_builder.append("}");
_builder.newLine();
{
GlobalGeneratorSettings _settings_2 = Main.getSettings();
boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation();
if (_isGenerateMSCInstrumentation_2) {
_builder.newLine();
_builder.append("void ");
_builder.append(portClassName, "");
_builder.append("::destroy() {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("DebuggingService::getInstance().removePortInstance(*this);");
_builder.newLine();
_builder.append("\t");
_builder.append("PortBase::destroy();");
_builder.newLine();
_builder.append("}");
_builder.newLine();
}
}
_builder.newLine();
_builder.append("void ");
_builder.append(portClassName, "");
_builder.append("::receive(const Message* msg) {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("// TODO JH further");
_builder.newLine();
_builder.append("\t");
_builder.append("if (! ");
String _name = pc.getName();
_builder.append(_name, "\t");
_builder.append("::");
{
if (conj) {
_builder.append("isValidOutgoingEvtID");
} else {
_builder.append("isValidIncomingEvtID");
}
}
_builder.append("(msg->getEvtId())) {");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("std::cout << \"unknown\" << std::endl;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.newLine();
{
GlobalGeneratorSettings _settings_3 = Main.getSettings();
boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation();
if (_isGenerateMSCInstrumentation_3) {
_builder.append("\t");
_builder.append("DebuggingService::getInstance().addMessageAsyncIn(getPeerAddress(), getAddress(), ");
String _name_1 = pc.getName();
_builder.append(_name_1, "\t");
_builder.append("::getMessageString(msg->getEvtId()));");
_builder.newLineIfNotEmpty();
}
}
_builder.newLine();
{
boolean _handlesReceive = this.roomExt.handlesReceive(pc, conj);
if (_handlesReceive) {
_builder.append("\t");
_builder.append("switch (msg->getEvtId()) {");
_builder.newLine();
{
List<MessageHandler> _receiveHandlers = this.roomExt.getReceiveHandlers(pc, conj);
for(final MessageHandler hdlr : _receiveHandlers) {
_builder.append("\t");
_builder.append("\t");
_builder.append("case ");
String _name_2 = pc.getName();
_builder.append(_name_2, "\t\t");
_builder.append("::");
Message _msg = hdlr.getMsg();
String _codeName = this.roomExt.getCodeName(_msg);
_builder.append(_codeName, "\t\t");
_builder.append(":");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("\t");
_builder.append("{");
_builder.newLine();
{
DetailCode _detailCode = hdlr.getDetailCode();
EList<String> _lines = _detailCode.getLines();
for(final String command : _lines) {
_builder.append("\t");
_builder.append("\t");
_builder.append("\t\t");
_builder.append(command, "\t\t\t\t");
_builder.newLineIfNotEmpty();
}
}
_builder.append("\t");
_builder.append("\t");
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("\t");
_builder.append("\t");
_builder.append("break;");
_builder.newLine();
}
}
_builder.append("\t");
_builder.append("\t");
_builder.append("default:");
_builder.newLine();
}
}
_builder.append("\t");
_builder.append("getActor()->receiveEvent(this, msg->getEvtId(),\tmsg->getData());");
_builder.newLine();
{
boolean _handlesReceive_1 = this.roomExt.handlesReceive(pc, conj);
if (_handlesReceive_1) {
_builder.append("\t");
_builder.append("\t\t");
_builder.append("break;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.append("}");
_builder.newLine();
_builder.newLine();
{
boolean _notEquals_1 = (!Objects.equal(pclass, null));
if (_notEquals_1) {
EList<PortOperation> _operations = pclass.getOperations();
CharSequence _operationsImplementation = this.helpers.operationsImplementation(_operations, portClassName);
_builder.append(_operationsImplementation, "");
_builder.newLineIfNotEmpty();
}
}
_builder.newLine();
_builder.append("// sent messages");
_builder.newLine();
{
List<Message> _allMessages = this._roomHelpers.getAllMessages(pc, conj);
for(final Message m : _allMessages) {
String _name_3 = pc.getName();
CharSequence _sendMessage = this.sendMessage(m, _name_3, portClassName, conj);
_builder.append(_sendMessage, "");
_builder.newLineIfNotEmpty();
}
}
_builder.newLine();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.append("// ");
{
if (conj) {
_builder.append("conjugated ");
}
}
_builder.append("replicated port class");
_builder.newLineIfNotEmpty();
_builder.append("//------------------------------------------------------------------------------------------------------------");
_builder.newLine();
_builder.append(replPortClassName, "");
_builder.append("::");
_builder.append(replPortClassName, "");
_builder.append("(IInterfaceItemOwner* actor, const std::string& name, int localId) :");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("ReplicatedPortBase(actor, name, localId)");
_builder.newLine();
_builder.append("{");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
{
if (conj) {
_builder.append("// incoming messages");
_builder.newLine();
{
List<Message> _allIncomingMessages = this._roomHelpers.getAllIncomingMessages(pc);
for(final Message m_1 : _allIncomingMessages) {
CharSequence _messageSignatureDefinition = this.messageSignatureDefinition(m_1, replPortClassName);
_builder.append(_messageSignatureDefinition, "");
_builder.append("{");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("for (std::vector<etRuntime::InterfaceItemBase*>::iterator it = getItems().begin(); it != getItems().end(); ++it) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("(dynamic_cast<");
_builder.append(portClassName, "\t\t");
_builder.append("*>(*it))->");
CharSequence _messageCall = this.messageCall(m_1);
_builder.append(_messageCall, "\t\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
}
}
} else {
_builder.append("// outgoing messages");
_builder.newLine();
{
List<Message> _allOutgoingMessages = this._roomHelpers.getAllOutgoingMessages(pc);
for(final Message m_2 : _allOutgoingMessages) {
CharSequence _messageSignatureDefinition_1 = this.messageSignatureDefinition(m_2, replPortClassName);
_builder.append(_messageSignatureDefinition_1, "");
_builder.append("{");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("for (std::vector<etRuntime::InterfaceItemBase*>::iterator it = getItems().begin(); it != getItems().end(); ++it) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("(dynamic_cast<");
_builder.append(portClassName, "\t\t");
_builder.append("*>(*it))->");
CharSequence _messageCall_1 = this.messageCall(m_2);
_builder.append(_messageCall_1, "\t\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
}
}
}
}
_xblockexpression = _builder;
}
return _xblockexpression;
}
private CharSequence generateConstructorInitalizerList(final PortClass pc, final String index) {
CharSequence _xblockexpression = null;
{
@Extension
final Initialization initHelper = this.initHelper;
final List<CharSequence> initList = CollectionLiterals.<CharSequence>newArrayList();
StringConcatenation _builder = new StringConcatenation();
_builder.append("PortBase(actor, name, localId, ");
_builder.append(index, "");
_builder.append(")");
initList.add(_builder.toString());
boolean _notEquals = (!Objects.equal(pc, null));
if (_notEquals) {
EList<Attribute> _attributes = pc.getAttributes();
final Function1<Attribute, String> _function = new Function1<Attribute, String>() {
public String apply(final Attribute it) {
StringConcatenation _builder = new StringConcatenation();
String _name = it.getName();
_builder.append(_name, "");
_builder.append("(");
String _initializerListValue = initHelper.getInitializerListValue(it);
_builder.append(_initializerListValue, "");
_builder.append(")");
return _builder.toString();
}
};
List<String> _map = ListExtensions.<Attribute, String>map(_attributes, _function);
Iterables.<CharSequence>addAll(initList, _map);
}
_xblockexpression = initHelper.generateCtorInitializerList(initList);
}
return _xblockexpression;
}
protected CharSequence messageCall(final Message m) {
StringConcatenation _builder = new StringConcatenation();
String _name = m.getName();
_builder.append(_name, "");
_builder.append("(");
{
VarDecl _data = m.getData();
boolean _notEquals = (!Objects.equal(_data, null));
if (_notEquals) {
_builder.append(" ");
VarDecl _data_1 = m.getData();
String _name_1 = _data_1.getName();
_builder.append(_name_1, "");
}
}
_builder.append(")");
return _builder;
}
protected CharSequence messageSignature(final Message m) {
StringConcatenation _builder = new StringConcatenation();
{
boolean _isPriv = m.isPriv();
if (_isPriv) {
_builder.append("private:");
} else {
_builder.append("public:");
}
}
_builder.append(" void ");
String _name = m.getName();
_builder.append(_name, "");
_builder.append("(");
{
VarDecl _data = m.getData();
boolean _notEquals = (!Objects.equal(_data, null));
if (_notEquals) {
VarDecl _data_1 = m.getData();
RefableType _refType = _data_1.getRefType();
String _signatureString = this.helpers.signatureString(_refType);
_builder.append(_signatureString, "");
_builder.append(" ");
VarDecl _data_2 = m.getData();
String _name_1 = _data_2.getName();
_builder.append(_name_1, "");
}
}
_builder.append(")");
return _builder;
}
protected CharSequence messageSignatureDefinition(final Message m, final String classPrefix) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("void ");
_builder.append(classPrefix, "");
_builder.append("::");
String _name = m.getName();
_builder.append(_name, "");
_builder.append("(");
{
VarDecl _data = m.getData();
boolean _notEquals = (!Objects.equal(_data, null));
if (_notEquals) {
VarDecl _data_1 = m.getData();
RefableType _refType = _data_1.getRefType();
String _signatureString = this.helpers.signatureString(_refType);
_builder.append(_signatureString, "");
_builder.append(" ");
VarDecl _data_2 = m.getData();
String _name_1 = _data_2.getName();
_builder.append(_name_1, "");
}
}
_builder.append(")");
return _builder;
}
protected CharSequence sendMessage(final Message m, final String portClassName, final String classPrefix, final boolean conj) {
CharSequence _xblockexpression = null;
{
String _xifexpression = null;
if (conj) {
_xifexpression = "IN";
} else {
_xifexpression = "OUT";
}
String dir = _xifexpression;
MessageHandler hdlr = this.roomExt.getSendHandler(m, conj);
String _xifexpression_1 = null;
VarDecl _data = m.getData();
boolean _notEquals = (!Objects.equal(_data, null));
if (_notEquals) {
StringConcatenation _builder = new StringConcatenation();
_builder.append(", ");
{
VarDecl _data_1 = m.getData();
RefableType _refType = _data_1.getRefType();
boolean _isRef = _refType.isRef();
if (_isRef) {
VarDecl _data_2 = m.getData();
String _name = _data_2.getName();
_builder.append(_name, "");
} else {
_builder.append("&");
VarDecl _data_3 = m.getData();
String _name_1 = _data_3.getName();
_builder.append(_name_1, "");
_builder.append(", sizeof(");
VarDecl _data_4 = m.getData();
RefableType _refType_1 = _data_4.getRefType();
DataType _type = _refType_1.getType();
String _typeName = this._typeHelpers.typeName(_type);
_builder.append(_typeName, "");
_builder.append(")");
}
}
_xifexpression_1 = _builder.toString();
}
final String dataArg = _xifexpression_1;
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("new Message(getPeerAddress(), ");
_builder_1.append(portClassName, "");
_builder_1.append("::");
_builder_1.append(dir, "");
_builder_1.append("_");
String _name_2 = m.getName();
_builder_1.append(_name_2, "");
String _elvis = null;
if (dataArg != null) {
_elvis = dataArg;
} else {
_elvis = "";
}
_builder_1.append(_elvis, "");
_builder_1.append(")");
final String message = _builder_1.toString();
StringConcatenation _builder_2 = new StringConcatenation();
CharSequence _messageSignatureDefinition = this.messageSignatureDefinition(m, classPrefix);
_builder_2.append(_messageSignatureDefinition, "");
_builder_2.append(" {");
_builder_2.newLineIfNotEmpty();
{
boolean _notEquals_1 = (!Objects.equal(hdlr, null));
if (_notEquals_1) {
_builder_2.append("\t");
{
DetailCode _detailCode = hdlr.getDetailCode();
EList<String> _lines = _detailCode.getLines();
for(final String command : _lines) {
_builder_2.append("\t");
_builder_2.append(command, "\t");
_builder_2.newLineIfNotEmpty();
}
}
} else {
_builder_2.append("\t");
_builder_2.append("DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),");
_builder_2.newLine();
_builder_2.append("\t");
_builder_2.append("\t");
_builder_2.append(portClassName, "\t\t");
_builder_2.append("::getMessageString(");
_builder_2.append(portClassName, "\t\t");
_builder_2.append("::");
_builder_2.append(dir, "\t\t");
_builder_2.append("_");
String _name_3 = m.getName();
_builder_2.append(_name_3, "\t\t");
_builder_2.append("));");
_builder_2.newLineIfNotEmpty();
_builder_2.append("\t");
_builder_2.append("if (getPeerAddress().isValid()){");
_builder_2.newLine();
_builder_2.append("\t");
_builder_2.append("\t");
_builder_2.append("getPeerMsgReceiver()->receive(");
_builder_2.append(message, "\t\t");
_builder_2.append(");");
_builder_2.newLineIfNotEmpty();
_builder_2.append("\t");
_builder_2.append("}");
_builder_2.newLine();
}
}
_builder_2.append("}");
_builder_2.newLine();
_xblockexpression = _builder_2;
}
return _xblockexpression;
}
protected CharSequence generateDataDrivenHeaderFile(final Root root, final ProtocolClass pc) {
CharSequence _xblockexpression = null;
{
List<Message> _allIncomingMessages = this._roomHelpers.getAllIncomingMessages(pc);
final Function1<Message, Boolean> _function = new Function1<Message, Boolean>() {
public Boolean apply(final Message m) {
VarDecl _data = m.getData();
return Boolean.valueOf((!Objects.equal(_data, null)));
}
};
final Iterable<Message> sentMsgs = IterableExtensions.<Message>filter(_allIncomingMessages, _function);
final EList<RoomModel> models = root.getReferencedModels(pc);
StringConcatenation _builder = new StringConcatenation();
_builder.append("/**");
_builder.newLine();
_builder.append(" ");
_builder.append("* @author generated by eTrice");
_builder.newLine();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("* Header File of ProtocolClass ");
String _name = pc.getName();
_builder.append(_name, " ");
_builder.newLineIfNotEmpty();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("*/");
_builder.newLine();
_builder.newLine();
CharSequence _generateIncludeGuardBegin = this.stdExt.generateIncludeGuardBegin(pc, "");
_builder.append(_generateIncludeGuardBegin, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("#include \"common/etDatatypesCpp.hpp\"");
_builder.newLine();
_builder.append("#include \"common/modelbase/DataPort.h\"");
_builder.newLine();
{
EList<DataClass> _referencedDataClasses = root.getReferencedDataClasses(pc);
for(final DataClass dataClass : _referencedDataClasses) {
_builder.append("#include \"");
String _path = this.roomExt.getPath(dataClass);
_builder.append(_path, "");
String _name_1 = dataClass.getName();
_builder.append(_name_1, "");
_builder.append(".h\"");
_builder.newLineIfNotEmpty();
}
}
_builder.newLine();
DetailCode _userCode1 = pc.getUserCode1();
CharSequence _userCode = this.helpers.userCode(_userCode1);
_builder.append(_userCode, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
String _generateNamespaceBegin = this.stdExt.generateNamespaceBegin(pc);
_builder.append(_generateNamespaceBegin, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("class ");
String _name_2 = pc.getName();
_builder.append(_name_2, "");
_builder.append(" {");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("\t");
DetailCode _userCode2 = pc.getUserCode2();
CharSequence _userCode_1 = this.helpers.userCode(_userCode2);
_builder.append(_userCode_1, "\t");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("};");
_builder.newLine();
_builder.newLine();
_builder.append("// send port holds data");
_builder.newLine();
_builder.append("class ");
String _portClassName = this.roomExt.getPortClassName(pc, true);
_builder.append(_portClassName, "");
_builder.append(" : public etRuntime::DataSendPort {");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("public:");
_builder.newLine();
_builder.append("\t");
String _portClassName_1 = this.roomExt.getPortClassName(pc, true);
_builder.append(_portClassName_1, "\t");
_builder.append("(etRuntime::IRTObject* parent, const std::string& name, int localId);");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("\t");
_builder.append("// getters and setters");
_builder.newLine();
{
for(final Message msg : sentMsgs) {
_builder.append("\t");
_builder.append("void ");
String _name_3 = msg.getName();
_builder.append(_name_3, "\t");
_builder.append("(");
VarDecl _data = msg.getData();
RefableType _refType = _data.getRefType();
DataType _type = _refType.getType();
String _typeName = this._typeHelpers.typeName(_type);
_builder.append(_typeName, "\t");
_builder.append(" ");
String _name_4 = msg.getName();
_builder.append(_name_4, "\t");
_builder.append(") {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("m_");
String _name_5 = msg.getName();
_builder.append(_name_5, "\t\t");
_builder.append(" = ");
String _name_6 = msg.getName();
_builder.append(_name_6, "\t\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
VarDecl _data_1 = msg.getData();
RefableType _refType_1 = _data_1.getRefType();
DataType _type_1 = _refType_1.getType();
String _typeName_1 = this._typeHelpers.typeName(_type_1);
_builder.append(_typeName_1, "\t");
_builder.append(" ");
String _name_7 = msg.getName();
_builder.append(_name_7, "\t");
_builder.append("() const {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("return m_");
String _name_8 = msg.getName();
_builder.append(_name_8, "\t\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.newLine();
_builder.append("private:");
_builder.newLine();
{
for(final Message msg_1 : sentMsgs) {
_builder.append("\t");
VarDecl _data_2 = msg_1.getData();
RefableType _refType_2 = _data_2.getRefType();
DataType _type_2 = _refType_2.getType();
String _typeName_2 = this._typeHelpers.typeName(_type_2);
_builder.append(_typeName_2, "\t");
_builder.append(" m_");
String _name_9 = msg_1.getName();
_builder.append(_name_9, "\t");
_builder.append(";");
_builder.newLineIfNotEmpty();
}
}
_builder.append("};");
_builder.newLine();
_builder.newLine();
_builder.append("// receive port accesses send port");
_builder.newLine();
_builder.append("class ");
String _portClassName_2 = this.roomExt.getPortClassName(pc, false);
_builder.append(_portClassName_2, "");
_builder.append(" : public etRuntime::DataReceivePort {");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("public:");
_builder.newLine();
_builder.append("\t");
String _portClassName_3 = this.roomExt.getPortClassName(pc, false);
_builder.append(_portClassName_3, "\t");
_builder.append("(etRuntime::IRTObject* parent, const std::string& name, int localId);");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("\t");
_builder.append("// getters");
_builder.newLine();
{
for(final Message msg_2 : sentMsgs) {
_builder.append("\t");
VarDecl _data_3 = msg_2.getData();
RefableType _refType_3 = _data_3.getRefType();
DataType _type_3 = _refType_3.getType();
String _typeName_3 = this._typeHelpers.typeName(_type_3);
_builder.append(_typeName_3, "\t");
_builder.append(" ");
String _name_10 = msg_2.getName();
_builder.append(_name_10, "\t");
_builder.append("() const;");
_builder.newLineIfNotEmpty();
}
}
_builder.newLine();
_builder.append("protected:");
_builder.newLine();
_builder.append("\t");
_builder.append("virtual void connect(etRuntime::DataSendPort* dataSendPort);");
_builder.newLine();
_builder.newLine();
_builder.append("private:");
_builder.newLine();
_builder.append("\t");
String _portClassName_4 = this.roomExt.getPortClassName(pc, true);
_builder.append(_portClassName_4, "\t");
_builder.append("* m_peer;");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("};");
_builder.newLine();
_builder.newLine();
String _generateNamespaceEnd = this.stdExt.generateNamespaceEnd(pc);
_builder.append(_generateNamespaceEnd, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
CharSequence _generateIncludeGuardEnd = this.stdExt.generateIncludeGuardEnd(pc, "");
_builder.append(_generateIncludeGuardEnd, "");
_builder.newLineIfNotEmpty();
_xblockexpression = _builder;
}
return _xblockexpression;
}
protected CharSequence generateDataDrivenSourceFile(final Root root, final ProtocolClass pc) {
CharSequence _xblockexpression = null;
{
List<Message> _allIncomingMessages = this._roomHelpers.getAllIncomingMessages(pc);
final Function1<Message, Boolean> _function = new Function1<Message, Boolean>() {
public Boolean apply(final Message m) {
VarDecl _data = m.getData();
return Boolean.valueOf((!Objects.equal(_data, null)));
}
};
final Iterable<Message> sentMsgs = IterableExtensions.<Message>filter(_allIncomingMessages, _function);
final EList<RoomModel> models = root.getReferencedModels(pc);
StringConcatenation _builder = new StringConcatenation();
_builder.append("/**");
_builder.newLine();
_builder.append(" ");
_builder.append("* @author generated by eTrice");
_builder.newLine();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("* Source File of ProtocolClass ");
String _name = pc.getName();
_builder.append(_name, " ");
_builder.newLineIfNotEmpty();
_builder.append(" ");
_builder.append("*");
_builder.newLine();
_builder.append(" ");
_builder.append("*/");
_builder.newLine();
_builder.newLine();
_builder.append("#include \"");
String _cppHeaderFileName = this.stdExt.getCppHeaderFileName(pc);
_builder.append(_cppHeaderFileName, "");
_builder.append("\"");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("using namespace etRuntime;");
_builder.newLine();
_builder.newLine();
String _generateNamespaceBegin = this.stdExt.generateNamespaceBegin(pc);
_builder.append(_generateNamespaceBegin, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
DetailCode _userCode3 = pc.getUserCode3();
CharSequence _userCode = this.helpers.userCode(_userCode3);
_builder.append(_userCode, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("// send port holds data");
_builder.newLine();
_builder.newLine();
_builder.append("// constructor");
_builder.newLine();
String _portClassName = this.roomExt.getPortClassName(pc, true);
_builder.append(_portClassName, "");
_builder.append("::");
String _portClassName_1 = this.roomExt.getPortClassName(pc, true);
_builder.append(_portClassName_1, "");
_builder.append("(IRTObject* parent, const std::string& name, int localId) :");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("DataSendPort(parent, name, localId)");
_builder.newLine();
_builder.append("{");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("// receive port accesses send port");
_builder.newLine();
_builder.newLine();
_builder.append("// constructor");
_builder.newLine();
String _portClassName_2 = this.roomExt.getPortClassName(pc, false);
_builder.append(_portClassName_2, "");
_builder.append("::");
String _portClassName_3 = this.roomExt.getPortClassName(pc, false);
_builder.append(_portClassName_3, "");
_builder.append("(IRTObject* parent, const std::string& name, int localId) :");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("DataReceivePort(parent, name, localId),");
_builder.newLine();
_builder.append("\t\t");
_builder.append("m_peer(0)");
_builder.newLine();
_builder.append("{");
_builder.newLine();
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("// getters");
_builder.newLine();
{
for(final Message msg : sentMsgs) {
VarDecl _data = msg.getData();
RefableType _refType = _data.getRefType();
DataType _type = _refType.getType();
String _typeName = this._typeHelpers.typeName(_type);
_builder.append(_typeName, "");
_builder.append(" ");
String _portClassName_4 = this.roomExt.getPortClassName(pc, false);
_builder.append(_portClassName_4, "");
_builder.append("::");
String _name_1 = msg.getName();
_builder.append(_name_1, "");
_builder.append("() const {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("// TODO needs default value");
_builder.newLine();
_builder.append("\t");
_builder.append("//if (m_peer == 0)");
_builder.newLine();
_builder.append("\t");
_builder.append("/*\treturn ");
VarDecl _data_1 = msg.getData();
RefableType _refType_1 = _data_1.getRefType();
DataType _type_1 = _refType_1.getType();
String _defaultValue = this.stdExt.defaultValue(_type_1);
_builder.append(_defaultValue, "\t");
_builder.append("; */");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("return m_peer->");
String _name_2 = msg.getName();
_builder.append(_name_2, "\t");
_builder.append("();");
_builder.newLineIfNotEmpty();
_builder.append("}");
_builder.newLine();
}
}
_builder.newLine();
_builder.append("void ");
String _portClassName_5 = this.roomExt.getPortClassName(pc, false);
_builder.append(_portClassName_5, "");
_builder.append("::connect(DataSendPort* dataSendPort) {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
String _portClassName_6 = this.roomExt.getPortClassName(pc, true);
_builder.append(_portClassName_6, "\t");
_builder.append("* peer = dynamic_cast<");
String _portClassName_7 = this.roomExt.getPortClassName(pc, true);
_builder.append(_portClassName_7, "\t");
_builder.append("*>(dataSendPort);");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("if (peer != 0)");
_builder.newLine();
_builder.append("\t\t");
_builder.append("m_peer = peer;");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
String _generateNamespaceEnd = this.stdExt.generateNamespaceEnd(pc);
_builder.append(_generateNamespaceEnd, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_xblockexpression = _builder;
}
return _xblockexpression;
}
public String getMessageID(final Message msg, final InterfaceItem item) {
if ((item instanceof Port)) {
Port p = ((Port) item);
String _xifexpression = null;
boolean _isConjugated = p.isConjugated();
if (_isConjugated) {
_xifexpression = "OUT_";
} else {
_xifexpression = "IN_";
}
String direction = _xifexpression;
GeneralProtocolClass _protocol = p.getProtocol();
String _name = _protocol.getName();
String _name_1 = msg.getName();
String _plus = (direction + _name_1);
return this.enumInUse(_name, _plus);
} else {
if ((item instanceof SAP)) {
SAP sap = ((SAP) item);
ProtocolClass _protocol_1 = sap.getProtocol();
String _name_2 = _protocol_1.getName();
String _name_3 = msg.getName();
String _plus_1 = ("OUT_" + _name_3);
return this.enumInUse(_name_2, _plus_1);
} else {
if ((item instanceof SPP)) {
SPP spp = ((SPP) item);
ProtocolClass _protocol_2 = spp.getProtocol();
String _name_4 = _protocol_2.getName();
String _name_5 = msg.getName();
String _plus_2 = ("IN_" + _name_5);
return this.enumInUse(_name_4, _plus_2);
}
}
}
return "unknown interface item";
}
protected String enumInUse(final String namespace, final String member) {
return ((namespace + "::") + member);
}
}