blob: 66f9d4366d38933888b28b8dcde838e9d86311d3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017, 2019 Dortmund University of Applied Sciences and Arts and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Dortmund University of Applied Sciences and Arts - initial API and implementation
*******************************************************************************/
package org.eclipse.app4mc.multicore.execution.ui.widget.emtracewidget;
import org.eclipse.app4mc.multicore.execution.logic.executionmodel.ExecutionModel;
import org.eclipse.app4mc.multicore.execution.logic.executionmodel.misc.EMTimeType;
import org.eclipse.app4mc.multicore.execution.logic.executionmodel.types.EMCore;
import org.eclipse.app4mc.multicore.execution.logic.executionmodel.types.EMTask;
import org.eclipse.app4mc.multicore.execution.logic.executionmodel.types.EMTask.DeadlineEntry;
import org.eclipse.app4mc.multicore.execution.logic.executionmodel.types.EMTaskEvent;
import org.eclipse.app4mc.multicore.execution.logic.executionmodel.types.EMTaskHistState;
import org.eclipse.app4mc.multicore.execution.ui.widget.model.XUtil;
import org.eclipse.app4mc.multicore.execution.ui.widget.tracewidget.TraceWidget;
import java.util.function.BiConsumer;
public class EMTraceWidget extends TraceWidget implements IEMTraceWidget {
boolean isFin;
public EMTraceWidget() {
super();
isFin = false;
}
@Override
public void addExecutionModel(ExecutionModel em) {
System.out.println("################################");
System.out.println("################################");
System.out.println("#########" + " Add Em " + "#########");
System.out.println("################################");
System.out.println("################################");
reset();
setExMod(em);
if (em.getTimeScale() != EMTimeType.NONE) {
setAxisLabels(em.getTimeScale().toString().toLowerCase());
}
System.out.println("----" + em.getPath());
setxContainer(XUtil.startWithInput(1, em.getPath()));
// compute already present data in the model
for (EMCore c : em.getCores().values()) {
addEMCore(c);
}
for (EMTask h : em.getTasks().values()) {
// task state is chosen
addEMTask(h);
if (h.getStateHistory().size() > 1) {
for (EMTaskHistState he : h.getStateHistory()) {
addEMTaskHist(h, he);
}
}
for (DeadlineEntry entry : h.getMissedDeadlines()) {
addDeadlineMissed(h, entry);
}
}
em.addTaskHistEntryAddedListener(new BiConsumer<EMTask, EMTaskHistState>() {
@Override
public void accept(EMTask t, EMTaskHistState u) {
// System.out.println("Task: "+t.getName());
// System.out.println("State:" + u.getState());
}
});
// register listener => if the model changes the view will present the
// new data also.
// same as implementing Consumer<EMTask> and pass this but more flexible
// because we can also register static methods and we don't need a bunch
// of
// interfaces for every event (with the same parameter) and can use the
// generic Consumer<Type>.
em.addTaskAddedListener(this::addEMTask);
em.addCoreAddedListener(this::addEMCore);
em.addTaskHistEntryAddedListener(this::addEMTaskHist);
em.addTaskDeadlineListener(this::addDeadlineMissed);
}
@Override
public void setFinish() {
isFin = true;
}
@Override
public boolean getFinish() {
return isFin;
}
private void addEMCore(final EMCore c) {
addCore(c.getName());
}
private void addEMTask(final EMTask t) {
// in the view we have a direct allocation of a task to a core
// therefore we wait until addEMTaskHist gets invoked
}
/**
* Add EMTaskHist to the view. This will only work if it has a reference to
* a core because the view has a direct allocation from core to task (one
* gantt-chart for every core; each line in the core represents a task).
*
* @param t
* @param e
*/
private void addEMTaskHist(final EMTask t, final EMTaskHistState e) {
if (e.getCore() != null) {
addTask(e.getCore().getName(), t.getName()); // multiple calls have
// no effect
switch (e.getState()) {
case RUNNING:
addTaskRunning(e.getCore().getName(), t.getName(), e.getStart(), e.getEnd());
break;
case WAITING:
String note = "\nSuppressor: " + e.getNote();
addTaskWaiting(e.getCore().getName(), t.getName(), note, e.getStart(), e.getEnd());
break;
case READY:
addTaskReady(e.getCore().getName(), t.getName(), e.getStart(), e.getEnd());
if (e.getEvent() == EMTaskEvent.ACTIVATE) {
addTaskActivation(e.getCore().getName(), t.getName(), e.getStart());
}
break;
case SUSPENDED:
addTaskSuspended(e.getCore().getName(), t.getName(), e.getStart(), e.getEnd());
break;
default:
break;
}
}
}
private void addDeadlineMissed(final EMTask t, DeadlineEntry entry) {
addTaskDeadlineMissed(entry.core.getName(), t.getName(), entry.time);
}
}