blob: 579716fe0ea962f1903bfd2bd9ce9d4f27d71f5c [file] [log] [blame]
/**
* Copyright (c) 2011 protos software gmbh (http://www.protos.de).
* 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:
* Henrik Rentz-Reichert (initial contribution)
* Peter Karlitschek
*/
package org.eclipse.etrice.generator.cpp.gen;
import com.google.common.base.Objects;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.etrice.core.fsm.fSM.ModelComponent;
import org.eclipse.etrice.core.fsm.fSM.State;
import org.eclipse.etrice.core.genmodel.fsm.fsmgen.ExpandedModelComponent;
import org.eclipse.etrice.generator.base.GlobalGeneratorSettings;
import org.eclipse.etrice.generator.cpp.Main;
import org.eclipse.etrice.generator.generic.GenericStateMachineGenerator;
import org.eclipse.etrice.generator.generic.RoomExtensions;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Extension;
@Singleton
@SuppressWarnings("all")
public class StateMachineGen extends GenericStateMachineGenerator {
@Inject
@Extension
private RoomExtensions _roomExtensions;
@Override
public CharSequence genExtra(final ExpandedModelComponent xpac, final boolean generateImplementation) {
CharSequence _xblockexpression = null;
{
final ArrayList<State> states = CollectionLiterals.<State>newArrayList();
ModelComponent ac = xpac.getModelComponent();
ModelComponent _modelComponent = xpac.getModelComponent();
final String clsName = _modelComponent.getComponentName();
while ((!Objects.equal(ac, null))) {
{
List<State> _allBaseStates = this._fSMHelpers.getAllBaseStates(ac);
List<State> _leafStatesLast = this._roomExtensions.getLeafStatesLast(_allBaseStates);
states.addAll(0, _leafStatesLast);
ModelComponent _base = ac.getBase();
ac = _base;
}
}
CharSequence _xifexpression = null;
if (generateImplementation) {
StringConcatenation _builder = new StringConcatenation();
{
if ((Main.getSettings().isGenerateMSCInstrumentation() || Main.getSettings().isGenerateWithVerboseOutput())) {
_builder.append("// state names");
_builder.newLine();
_builder.append("const String ");
_builder.append(clsName, "");
_builder.append("::s_stateStrings[] = {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\"<no state>\",");
_builder.newLine();
_builder.append("\t");
_builder.append("\"<top>\",");
_builder.newLine();
{
boolean _hasElements = false;
for(final State state : states) {
if (!_hasElements) {
_hasElements = true;
} else {
_builder.appendImmediate(",", "\t");
}
_builder.append("\t");
_builder.append("\"");
String _genStatePathName = this._codegenHelpers.getGenStatePathName(state);
_builder.append(_genStatePathName, "\t");
_builder.append("\"");
_builder.newLineIfNotEmpty();
}
}
_builder.append("};");
_builder.newLine();
}
}
_builder.append("const int ");
_builder.append(clsName, "");
_builder.append("::s_numberOfStates = ");
int _size = states.size();
int _plus = (2 + _size);
_builder.append(_plus, "");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("void ");
_builder.append(clsName, "");
_builder.append("::setState(int new_state) {");
_builder.newLineIfNotEmpty();
{
GlobalGeneratorSettings _settings = Main.getSettings();
boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
if (_isGenerateMSCInstrumentation) {
_builder.append("\t");
_builder.append("DebuggingService::getInstance().addActorState(*this, s_stateStrings[new_state].c_str());");
_builder.newLine();
}
}
{
GlobalGeneratorSettings _settings_1 = Main.getSettings();
boolean _isGenerateWithVerboseOutput = _settings_1.isGenerateWithVerboseOutput();
if (_isGenerateWithVerboseOutput) {
_builder.append("\t");
_builder.append("if (s_stateStrings[new_state] != \"Idle\") {");
_builder.newLine();
_builder.append("\t");
_builder.append("\t");
_builder.append("std::cout << getInstancePath().c_str() << \" -> \" << s_stateStrings[new_state].c_str() << std::endl;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.append("\t");
_builder.append("m_state = new_state;");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_xifexpression = _builder;
} else {
StringConcatenation _builder_1 = new StringConcatenation();
{
if ((Main.getSettings().isGenerateMSCInstrumentation() || Main.getSettings().isGenerateWithVerboseOutput())) {
_builder_1.append("static const String s_stateStrings[];");
_builder_1.newLine();
}
}
_builder_1.append("static const int s_numberOfStates;");
_builder_1.newLine();
_builder_1.newLine();
_builder_1.append("int history[");
int _size_1 = states.size();
int _plus_1 = (2 + _size_1);
_builder_1.append(_plus_1, "");
_builder_1.append("];");
_builder_1.newLineIfNotEmpty();
_builder_1.newLine();
_builder_1.append("void setState(int new_state);");
_builder_1.newLine();
_xifexpression = _builder_1;
}
_xblockexpression = _xifexpression;
}
return _xblockexpression;
}
@Override
public String stateType() {
return "etInt16";
}
@Override
public String boolType() {
return "etBool";
}
}