Quellcode durchsuchen

Added simulation of valued events

Andreas Mülder vor 13 Jahren
Ursprung
Commit
b733cd9938
12 geänderte Dateien mit 103 neuen und 96 gelöschten Zeilen
  1. 42 52
      plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/impl/ExecutionFlowInterpreter.xtend
  2. 4 2
      plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/stext/Function.java
  3. 2 2
      plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/stext/StextStatementInterpreter.xtend
  4. 2 2
      plugins/org.yakindu.sct.model.sexec.interpreter/xtend-gen/org/yakindu/sct/model/sexec/interpreter/stext/StextStatementInterpreter.java
  5. 2 2
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/IExecutionContext.java
  6. 2 2
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/IExecutionContextListener.java
  7. 2 2
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/impl/AbstractExecutionContext.java
  8. 9 8
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/impl/ExecutionContextImpl.java
  9. 10 11
      plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/view/ExecutionContextContentProvider.java
  10. 16 0
      plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/view/SimulationView.java
  11. 7 8
      plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/view/editing/ScopeSlotEditingSupport.java
  12. 5 5
      test-plugins/org.yakindu.sct.model.sexec.interpreter.test/src/org/yakindu/sct/model/sexec/interpreter/test/util/AbstractExecutionFlowTest.java

+ 42 - 52
plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/impl/ExecutionFlowInterpreter.xtend

@@ -8,53 +8,52 @@
  * 	committers of YAKINDU - initial API and implementation
  * 
  */
-package org.yakindu.sct.model.sexec.interpreter.impl
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import org.yakindu.base.types.ITypeSystemAccess
-import org.yakindu.sct.model.sexec.Call
-import org.yakindu.sct.model.sexec.Check
-import org.yakindu.sct.model.sexec.EnterState
-import org.yakindu.sct.model.sexec.Execution
-import org.yakindu.sct.model.sexec.ExecutionFlow
-import org.yakindu.sct.model.sexec.ExitState
-import org.yakindu.sct.model.sexec.HistoryEntry
-import org.yakindu.sct.model.sexec.If
-import org.yakindu.sct.model.sexec.SaveHistory
-import org.yakindu.sct.model.sexec.ScheduleTimeEvent
-import org.yakindu.sct.model.sexec.Sequence
-import org.yakindu.sct.model.sexec.SexecFactory
-import org.yakindu.sct.model.sexec.StateSwitch
-import org.yakindu.sct.model.sexec.Step
-import org.yakindu.sct.model.sexec.TimeEvent
-import org.yakindu.sct.model.sexec.Trace
-import org.yakindu.sct.model.sexec.TraceBeginRunCycle
-import org.yakindu.sct.model.sexec.TraceEndRunCycle
-import org.yakindu.sct.model.sexec.UnscheduleTimeEvent
-import org.yakindu.sct.model.sexec.interpreter.IExecutionFlowInterpreter
-import org.yakindu.sct.model.sexec.interpreter.IStatementInterpreter
-import org.yakindu.sct.model.sexec.interpreter.ITimingService
-import org.yakindu.sct.model.sgraph.Scope
-import org.yakindu.sct.model.stext.naming.StextNameProvider
-import org.yakindu.sct.model.stext.stext.EventDefinition
-import org.yakindu.sct.model.stext.stext.InterfaceScope
-import org.yakindu.sct.model.stext.stext.InternalScope
-import org.yakindu.sct.model.stext.stext.VariableDefinition
-import org.yakindu.sct.simulation.core.runtime.AbstractExecutionFacade
-import org.yakindu.sct.simulation.core.runtime.IExecutionContext
-import org.yakindu.sct.simulation.core.runtime.IExecutionContextListener
-import org.yakindu.sct.simulation.core.runtime.impl.ExecutionEvent
+package org.yakindu.sct.model.sexec.interpreter.impl
+
+import com.google.inject.Inject
+import com.google.inject.name.Named
+import org.yakindu.base.types.ITypeSystemAccess
+import org.yakindu.base.types.Type
+import org.yakindu.sct.model.sexec.Call
+import org.yakindu.sct.model.sexec.Check
+import org.yakindu.sct.model.sexec.EnterState
+import org.yakindu.sct.model.sexec.Execution
+import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.ExitState
+import org.yakindu.sct.model.sexec.HistoryEntry
+import org.yakindu.sct.model.sexec.If
+import org.yakindu.sct.model.sexec.SaveHistory
+import org.yakindu.sct.model.sexec.ScheduleTimeEvent
+import org.yakindu.sct.model.sexec.Sequence
+import org.yakindu.sct.model.sexec.SexecFactory
+import org.yakindu.sct.model.sexec.StateSwitch
+import org.yakindu.sct.model.sexec.Step
+import org.yakindu.sct.model.sexec.TimeEvent
+import org.yakindu.sct.model.sexec.Trace
+import org.yakindu.sct.model.sexec.TraceBeginRunCycle
+import org.yakindu.sct.model.sexec.TraceEndRunCycle
+import org.yakindu.sct.model.sexec.UnscheduleTimeEvent
+import org.yakindu.sct.model.sexec.interpreter.IExecutionFlowInterpreter
+import org.yakindu.sct.model.sexec.interpreter.IStatementInterpreter
+import org.yakindu.sct.model.sexec.interpreter.ITimingService
+import org.yakindu.sct.model.sgraph.Scope
+import org.yakindu.sct.model.stext.naming.StextNameProvider
+import org.yakindu.sct.model.stext.stext.EventDefinition
+import org.yakindu.sct.model.stext.stext.InterfaceScope
+import org.yakindu.sct.model.stext.stext.InternalScope
+import org.yakindu.sct.model.stext.stext.OperationDefinition
+import org.yakindu.sct.model.stext.stext.VariableDefinition
+import org.yakindu.sct.simulation.core.runtime.AbstractExecutionFacade
+import org.yakindu.sct.simulation.core.runtime.IExecutionContext
+import org.yakindu.sct.simulation.core.runtime.impl.ExecutionEvent
 import org.yakindu.sct.simulation.core.runtime.impl.ExecutionVariable
-import org.yakindu.base.types.Type
-import org.yakindu.sct.model.stext.stext.OperationDefinition
 
 /**
  * 
  * @author andreas muelder - Initial contribution and API
  * 
  */
-class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecutionFlowInterpreter,IExecutionContextListener {
+class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecutionFlowInterpreter {
 	
 	@Inject
 	IStatementInterpreter interpreter
@@ -83,7 +82,6 @@ class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecu
 			scope.declareContents
 		} 
 		executionContext.initStateConfigurationVector(flow.stateVector.size)
-		executionContext.addExecutionContextListener(this);
 		
 		brc = SexecFactory::eINSTANCE.createTraceBeginRunCycle
 		erc = SexecFactory::eINSTANCE.createTraceEndRunCycle
@@ -155,13 +153,13 @@ class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecu
 	def dispatch void addToScope(EventDefinition event){
 		var fqName = provider.qualifiedName(event).toString
 		if(event.type.^boolean){
-				executionContext.declareEvent(new ExecutionEvent(fqName,typeof(Boolean),null))
+				executionContext.declareEvent(new ExecutionEvent(fqName,typeof(Boolean),false))
 		}
 		else if(event.type.integer){
-			executionContext.declareEvent(new ExecutionEvent(fqName,typeof(Integer),null))
+			executionContext.declareEvent(new ExecutionEvent(fqName,typeof(Integer),0))
 		}
 		else if(event.type.real){
-			executionContext.declareEvent(new ExecutionEvent(fqName,typeof(Float),null))
+			executionContext.declareEvent(new ExecutionEvent(fqName,typeof(Float),Float::parseFloat("0.0")))
 		}
 		else if(event.type.^void){
 				executionContext.declareEvent(new ExecutionEvent(fqName,typeof(Void)))
@@ -313,14 +311,6 @@ class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecu
 		null
 	}
 	
-	override void eventRaised(ExecutionEvent event){
-		
-	}
-
-	override void variableValueChanged(ExecutionVariable variable){
-		
-	}
-
 	override getExecutionContext() {
 		return executionContext;
 	}

+ 4 - 2
plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/stext/Function.java

@@ -105,7 +105,7 @@ public class Function {
 		return null;
 	}
 
-	private  void addFunctionMethods(Class<?> functionClass,
+	private void addFunctionMethods(Class<?> functionClass,
 			List<Method> methodList) {
 		List<Method> result = new ArrayList<Method>();
 		Method[] methods = functionClass.getDeclaredMethods();
@@ -136,10 +136,12 @@ public class Function {
 
 	}
 
-	public  Function lookup(Class<?> functionClass, String name,
+	public Function lookup(Class<?> functionClass, String name,
 			Object... params) {
 		Class<?>[] paramTypes = new Class<?>[params.length];
 		for (int i = 0; i < params.length; i++) {
+			if (params[i] == null)
+				continue;
 			paramTypes[i] = params[i].getClass();
 		}
 		return lookup(functionClass, name, paramTypes);

+ 2 - 2
plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/stext/StextStatementInterpreter.xtend

@@ -72,10 +72,10 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 		var scopeVariable = context.getVariable(assignment.varRef.variable.fullyQualifiedName.toString)
 		var result = assignment.expression.execute
 		if(assignment.operator == AssignmentOperator::ASSIGN){
-			context.setVariableValue(scopeVariable.getName, result)
+			context.setSlotValue(scopeVariable.getName, result)
 		}else{
 			var operator = AbstractStatementInterpreter::assignFunctionMap.get(assignment.operator.getName())
-			context.setVariableValue(scopeVariable.name, evaluate(operator, scopeVariable.getValue,result))
+			context.setSlotValue(scopeVariable.name, evaluate(operator, scopeVariable.getValue,result))
 		}
 		result		
 	}

+ 2 - 2
plugins/org.yakindu.sct.model.sexec.interpreter/xtend-gen/org/yakindu/sct/model/sexec/interpreter/stext/StextStatementInterpreter.java

@@ -92,7 +92,7 @@ public class StextStatementInterpreter extends AbstractStatementInterpreter {
       boolean _equals = Objects.equal(_operator, AssignmentOperator.ASSIGN);
       if (_equals) {
         String _name = scopeVariable.getName();
-        this.context.setVariableValue(_name, result);
+        this.context.setSlotValue(_name, result);
       } else {
         AssignmentOperator _operator_1 = assignment.getOperator();
         String _name_1 = _operator_1.getName();
@@ -100,7 +100,7 @@ public class StextStatementInterpreter extends AbstractStatementInterpreter {
         String _name_2 = scopeVariable.getName();
         Object _value = scopeVariable.getValue();
         Object _evaluate = this.evaluate(operator, _value, result);
-        this.context.setVariableValue(_name_2, _evaluate);
+        this.context.setSlotValue(_name_2, _evaluate);
       }
       _xblockexpression = (result);
     }

+ 2 - 2
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/IExecutionContext.java

@@ -84,9 +84,9 @@ public interface IExecutionContext {
 	public ExecutionVariable getVariable(String varName);
 
 	/**
-	 * Changes the value of a variable
+	 * Changes the value of a variable / event
 	 */
-	public void setVariableValue(String name, Object value)
+	public void setSlotValue(String name, Object value)
 			throws ExecutionException;
 
 	/**

+ 2 - 2
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/IExecutionContextListener.java

@@ -10,8 +10,8 @@
  */
 package org.yakindu.sct.simulation.core.runtime;
 
+import org.yakindu.sct.simulation.core.runtime.impl.AbstractSlot;
 import org.yakindu.sct.simulation.core.runtime.impl.ExecutionEvent;
-import org.yakindu.sct.simulation.core.runtime.impl.ExecutionVariable;
 
 /**
  * 
@@ -28,5 +28,5 @@ public interface IExecutionContextListener {
 	/**
 	 * called when a variable value changed
 	 */
-	public void variableValueChanged(ExecutionVariable variable);
+	public void slotValueChanged(AbstractSlot variable);
 }

+ 2 - 2
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/impl/AbstractExecutionContext.java

@@ -52,10 +52,10 @@ public abstract class AbstractExecutionContext implements IExecutionContext {
 		}
 	}
 
-	public void notifyVariableValueChanged(ExecutionVariable variable) {
+	public void notifyValueChanged(AbstractSlot slot) {
 		synchronized (_listeners) {
 			for (IExecutionContextListener listener : _listeners) {
-				listener.variableValueChanged(variable);
+				listener.slotValueChanged(slot);
 			}
 		}
 	}

+ 9 - 8
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/impl/ExecutionContextImpl.java

@@ -84,7 +84,7 @@ public class ExecutionContextImpl extends AbstractExecutionContext implements
 			raisedEvents.clear();
 		}
 	}
-
+	
 	public void raiseEvent(String eventName, Object value) {
 		ExecutionEvent event = getDeclaredEvent(eventName);
 		if (event == null)
@@ -166,14 +166,15 @@ public class ExecutionContextImpl extends AbstractExecutionContext implements
 		}
 	}
 
-	public void setVariableValue(String name, Object value)
+	public void setSlotValue(String name, Object value)
 			throws ExecutionException {
-		ExecutionVariable variable = getVariable(name);
-		if (variable == null)
-			throw new ExecutionException("Variable with name " + name
-					+ " is undefined!");
-		variable.setValue(value);
-		notifyVariableValueChanged(variable);
+		AbstractSlot slot = getVariable(name);
+		if(slot == null)
+			slot = getDeclaredEvent(name);
+		if (slot == null)
+			throw new ExecutionException("Unknown slot " + name);
+		slot.setValue(value);
+		notifyValueChanged(slot);
 
 	}
 

+ 10 - 11
plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/view/ExecutionContextContentProvider.java

@@ -25,7 +25,6 @@ import org.yakindu.sct.simulation.core.runtime.IExecutionContext;
 import org.yakindu.sct.simulation.core.runtime.IExecutionContextListener;
 import org.yakindu.sct.simulation.core.runtime.impl.AbstractSlot;
 import org.yakindu.sct.simulation.core.runtime.impl.ExecutionEvent;
-import org.yakindu.sct.simulation.core.runtime.impl.ExecutionVariable;
 import org.yakindu.sct.simulation.ui.SimulationActivator;
 import org.yakindu.sct.simulation.ui.view.actions.HideTimeEventsAction;
 
@@ -132,12 +131,11 @@ public class ExecutionContextContentProvider implements ITreeContentProvider,
 
 	public void eventRaised(ExecutionEvent event) {
 	}
-	
+
 	public void timeScaleFactorChanged(double oldFactor, double newFactor) {
 	}
 
-
-	public void variableValueChanged(ExecutionVariable variable) {
+	public void slotValueChanged(AbstractSlot variable) {
 		Display.getDefault().asyncExec(new Runnable() {
 			public void run() {
 				if (viewer != null && !viewer.getControl().isDisposed())
@@ -167,13 +165,14 @@ public class ExecutionContextContentProvider implements ITreeContentProvider,
 	 */
 	public static class Container {
 		String name = "Default";
-		Set<AbstractSlot> slots = new TreeSet<AbstractSlot>(new Comparator<AbstractSlot>() {
+		Set<AbstractSlot> slots = new TreeSet<AbstractSlot>(
+				new Comparator<AbstractSlot>() {
 
-			public int compare(AbstractSlot arg0, AbstractSlot arg1) {
-				return arg0.getName().compareTo(arg1.getName());
-			}
-			
-		});
+					public int compare(AbstractSlot arg0, AbstractSlot arg1) {
+						return arg0.getName().compareTo(arg1.getName());
+					}
+
+				});
 
 		public Container() {
 			super();
@@ -209,5 +208,5 @@ public class ExecutionContextContentProvider implements ITreeContentProvider,
 		}
 
 	}
-	
+
 }

+ 16 - 0
plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/view/SimulationView.java

@@ -27,9 +27,13 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.TreeViewerColumn;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerCell;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
@@ -108,6 +112,8 @@ public class SimulationView extends ViewPart implements IDebugContextListener,
 		viewer.getTree().setFocus();
 	}
 
+	protected Point mouseLocation;
+
 	protected Viewer createViewer(Composite parent) {
 		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL
 				| SWT.FULL_SELECTION);
@@ -130,8 +136,18 @@ public class SimulationView extends ViewPart implements IDebugContextListener,
 		valueColumn.setLabelProvider(new ExecutionContextLabelProvider(1));
 		viewer.setContentProvider(new ExecutionContextContentProvider());
 
+		viewer.getControl().addMouseMoveListener(new MouseMoveListener() {
+			public void mouseMove(MouseEvent e) {
+				mouseLocation = new Point(e.x, e.y);
+			}
+		});
 		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
 			public void selectionChanged(SelectionChangedEvent event) {
+
+				ViewerCell cell = viewer.getCell(mouseLocation);
+				if (cell == null || cell.getColumnIndex() != 0)
+					return;
+
 				Object firstElement = ((IStructuredSelection) event
 						.getSelection()).getFirstElement();
 				if (firstElement instanceof ExecutionEvent) {

+ 7 - 8
plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/view/editing/ScopeSlotEditingSupport.java

@@ -13,7 +13,6 @@ package org.yakindu.sct.simulation.ui.view.editing;
 import org.eclipse.jface.viewers.ColumnViewer;
 import org.yakindu.sct.simulation.core.runtime.IExecutionContext;
 import org.yakindu.sct.simulation.core.runtime.impl.AbstractSlot;
-import org.yakindu.sct.simulation.core.runtime.impl.ExecutionVariable;
 
 /**
  * 
@@ -42,9 +41,11 @@ public abstract class ScopeSlotEditingSupport extends PublicEditingSupport {
 	@Override
 	public Object getValue(Object element) {
 		if (element instanceof AbstractSlot) {
-			return String.valueOf(((AbstractSlot) element).getValue());
+			Object value = ((AbstractSlot) element).getValue();
+			if (value != null)
+				return String.valueOf(value);
 		}
-		return null;
+		return "";
 	}
 
 	@Override
@@ -52,11 +53,9 @@ public abstract class ScopeSlotEditingSupport extends PublicEditingSupport {
 		value = convertValue(value);
 		if (value == null)
 			return;
-		if (element instanceof ExecutionVariable) {
-			IExecutionContext input = (IExecutionContext) getViewer()
-					.getInput();
-			input.setVariableValue(((ExecutionVariable) element).getName(),
-					value);
+		IExecutionContext input = (IExecutionContext) getViewer().getInput();
+		if (element instanceof AbstractSlot) {
+			input.setSlotValue(((AbstractSlot) element).getName(), value);
 		}
 	}
 }

+ 5 - 5
test-plugins/org.yakindu.sct.model.sexec.interpreter.test/src/org/yakindu/sct/model/sexec/interpreter/test/util/AbstractExecutionFlowTest.java

@@ -42,7 +42,7 @@ public abstract class AbstractExecutionFlowTest {
 
 	protected void initInterpreter(ExecutionFlow flow) {
 		interpreter.initialize(flow);
-		//interpreter.enter(); -ToDelete
+		// interpreter.enter(); -ToDelete
 	}
 
 	protected int getInteger(String varName) {
@@ -66,22 +66,22 @@ public abstract class AbstractExecutionFlowTest {
 	}
 
 	protected int setInteger(String varName, int v) {
-		context().setVariableValue(varName, (Integer)v);
+		context().setSlotValue(varName, (Integer) v);
 		return v;
 	}
 
 	protected boolean setBoolean(String varName, boolean v) {
-		context().setVariableValue(varName, (Boolean)v);
+		context().setSlotValue(varName, (Boolean) v);
 		return v;
 	}
 
 	protected double setReal(String varName, double v) {
-		context().setVariableValue(varName, (Double) v);
+		context().setSlotValue(varName, (Double) v);
 		return v;
 	}
 
 	protected String setString(String varName, String v) {
-		context().setVariableValue(varName, v);
+		context().setSlotValue(varName, v);
 		return v;
 	}