| /** |
| * 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 _genArrayInitializers = this.initHelper.genArrayInitializers(_attributes); |
| _builder.append(_genArrayInitializers, "\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); |
| } |
| } |