| /** |
| * ******************************************************************************* |
| * Copyright (c) 2017 Timing-Architects Embedded Systems GmbH and others. |
| * 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: |
| * Timing-Architects Embedded Systems GmbH - initial API and implementation |
| * |
| * ******************************************************************************* |
| */ |
| package org.eclipse.app4mc.amalthea.generator.ui; |
| |
| import java.math.BigInteger; |
| |
| import org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties; |
| import org.eclipse.app4mc.amalthea.generator.configuration.Generation; |
| import org.eclipse.app4mc.amalthea.generator.configuration.IntegerTimeDistribution; |
| import org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution; |
| import org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation; |
| import org.eclipse.app4mc.amalthea.generator.configuration.PeriodicTriangleShift; |
| import org.eclipse.app4mc.amalthea.generator.configuration.RTMGC; |
| import org.eclipse.app4mc.amalthea.generator.configuration.RTMGCFactory; |
| import org.eclipse.app4mc.amalthea.generator.configuration.Recurrence; |
| import org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation; |
| import org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit; |
| import org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.ScrolledComposite; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Spinner; |
| import org.eclipse.swt.widgets.TabFolder; |
| import org.eclipse.swt.widgets.TabItem; |
| |
| public class ActivationsConfigurationHelper implements IConfigurationHelper { |
| |
| private Spinner periodicProbabilitySpinner; |
| private IntegerTimeDistributionGroup periodicOffset; |
| private RecurrenceGroup periodicRecurrence; |
| |
| private Spinner triangleProbabilitySpinner; |
| private IntegerTimeDistributionGroup triangleOffset; |
| private RecurrenceGroup triangleRecurrence; |
| |
| private Spinner sporadicProbabilitySpinner; |
| private IntegerTimeDistributionGroup sporadicMin; |
| private PercentageDistributionGroup sporadicAvg; |
| private PercentageDistributionGroup sporadicMax; |
| |
| public void addTabItem(TabFolder parent) { |
| TabItem tab = new TabItem(parent, SWT.NONE); |
| tab.setText("Activations"); |
| |
| ScrolledComposite sc = new ScrolledComposite(parent, SWT.BORDER | SWT.V_SCROLL); |
| |
| Composite container = new Composite(sc, SWT.NONE); |
| container.setLayout(new GridLayout()); |
| GridLayout gridLayout = new GridLayout(); |
| container.setLayout(gridLayout); |
| gridLayout.numColumns = 2; |
| |
| sc.setExpandVertical(true); |
| sc.setExpandHorizontal(true); |
| |
| // periodic |
| Label label = new Label(container, SWT.NONE); |
| label.setText("Periodic Activations [%]"); |
| label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); |
| periodicProbabilitySpinner = new Spinner(container, SWT.NONE); |
| periodicProbabilitySpinner.setMinimum(0); |
| periodicProbabilitySpinner.setMaximum(100); |
| periodicProbabilitySpinner.setIncrement(1); |
| periodicProbabilitySpinner.setSelection(100); |
| |
| this.periodicOffset = new IntegerTimeDistributionGroup(container, "Offset", 0, 5, 50, TimeUnit.MS); |
| this.periodicRecurrence = new RecurrenceGroup(container, "Recurrence", 1, 10, 1000, TimeUnit.MS); |
| |
| // periodic triangle shift |
| label = new Label(container, SWT.NONE); |
| label.setText(""); |
| GridData gridData = new GridData(GridData.FILL, GridData.CENTER, true, false); |
| gridData.horizontalSpan = 2; |
| gridData.heightHint = 30; |
| label.setLayoutData(gridData); |
| label = new Label(container, SWT.NONE); |
| label.setText("Periodic Triangle Shifts [%]"); |
| label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); |
| triangleProbabilitySpinner = new Spinner(container, SWT.NONE); |
| triangleProbabilitySpinner.setMinimum(0); |
| triangleProbabilitySpinner.setMaximum(Integer.MAX_VALUE); |
| triangleProbabilitySpinner.setIncrement(1); |
| triangleProbabilitySpinner.setSelection(0); |
| |
| this.triangleRecurrence = new RecurrenceGroup(container, "Recurrence"); |
| this.triangleOffset = new IntegerTimeDistributionGroup(container, "Offset"); |
| |
| // sporadic |
| label = new Label(container, SWT.NONE); |
| label.setText(""); |
| gridData = new GridData(GridData.FILL, GridData.CENTER, true, false); |
| gridData.horizontalSpan = 2; |
| gridData.heightHint = 30; |
| label.setLayoutData(gridData); |
| label = new Label(container, SWT.NONE); |
| label.setText("Sporadic Activations [%]"); |
| label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); |
| sporadicProbabilitySpinner = new Spinner(container, SWT.NONE); |
| sporadicProbabilitySpinner.setMinimum(0); |
| sporadicProbabilitySpinner.setMaximum(Integer.MAX_VALUE); |
| sporadicProbabilitySpinner.setIncrement(1); |
| sporadicProbabilitySpinner.setSelection(0); |
| |
| // min value |
| this.sporadicMin = new IntegerTimeDistributionGroup(container, "Minimum Value"); |
| this.sporadicAvg = new PercentageDistributionGroup(container, "Average Distance"); |
| this.sporadicMax = new PercentageDistributionGroup(container, "Maximum Distance"); |
| |
| sc.setContent(container); |
| sc.setMinSize(container.computeSize(SWT.DEFAULT, SWT.DEFAULT)); |
| tab.setControl(sc);; |
| } |
| |
| public void loadConfiguration(RTMGC rtmgc) { |
| if(null != rtmgc) { |
| Generation generation = rtmgc.getGeneration(); |
| if(null != generation) { |
| ActivationProperties activations = generation.getActivations(); |
| if(null != activations) { |
| PeriodicActivation periodic = activations.getPeriodicActivation(); |
| if(null != periodic) { |
| this.periodicProbabilitySpinner.setSelection(periodic.getAppearanceProbability().intValue()); |
| IntegerTimeDistribution offset = periodic.getOffset(); |
| this.periodicOffset.set(offset); |
| Recurrence recurrence = periodic.getRecurrence(); |
| this.periodicRecurrence.set(recurrence); |
| } |
| PeriodicTriangleShift triangle = activations.getPeriodicTriangleShift(); |
| if(null != triangle) { |
| this.triangleProbabilitySpinner.setSelection(triangle.getAppearanceProbability().intValue()); |
| IntegerTimeDistribution offset = triangle.getOffset(); |
| this.triangleOffset.set(offset); |
| Recurrence recurrence = triangle.getRecurrence(); |
| this.triangleRecurrence.set(recurrence); |
| |
| TriangleClock clock = triangle.getClock(); |
| if(null != clock) { |
| //TODO: |
| } |
| } |
| SporadicActivation sporadic = activations.getSporadicActivation(); |
| if(null != sporadic) { |
| this.sporadicProbabilitySpinner.setSelection(sporadic.getAppearanceProbability().intValue()); |
| IntegerTimeDistribution min = sporadic.getMinValue(); |
| this.sporadicMin.set(min); |
| PercentageDistribution avg = sporadic.getAvgValueDistance(); |
| this.sporadicAvg.set(avg); |
| PercentageDistribution max = sporadic.getMaxValueDistance(); |
| this.sporadicMax.set(max); |
| } |
| } |
| } |
| } |
| } |
| |
| /* |
| * Update configuration values with the values from the UI widgets |
| */ |
| public void updateConfiguration(RTMGC rtmgc) { |
| if(null != rtmgc) { |
| Generation generation = rtmgc.getGeneration(); |
| if(null == generation) { |
| generation = RTMGCFactory.eINSTANCE.createGeneration(); |
| rtmgc.setGeneration(generation); |
| } |
| ActivationProperties activations = generation.getActivations(); |
| if(null == activations) { |
| activations = RTMGCFactory.eINSTANCE.createActivationProperties(); |
| generation.setActivations(activations); |
| } |
| updatePeriodic(activations); |
| updateTriangle(activations); |
| updateSporadic(activations); |
| } |
| } |
| |
| private void updatePeriodic(ActivationProperties activations) { |
| PeriodicActivation periodic = activations.getPeriodicActivation(); |
| if(null == periodic) { |
| periodic = RTMGCFactory.eINSTANCE.createPeriodicActivation(); |
| activations.setPeriodicActivation(periodic); |
| } |
| periodic.setAppearanceProbability(BigInteger.valueOf(this.periodicProbabilitySpinner.getSelection())); |
| IntegerTimeDistribution offset = this.periodicOffset.get(); |
| periodic.setOffset(offset); |
| Recurrence recurrence = this.periodicRecurrence.get(); |
| periodic.setRecurrence(recurrence); |
| } |
| |
| private void updateTriangle(ActivationProperties activations) { |
| PeriodicTriangleShift triangle = activations.getPeriodicTriangleShift(); |
| if(null == triangle) { |
| triangle = RTMGCFactory.eINSTANCE.createPeriodicTriangleShift(); |
| activations.setPeriodicTriangleShift(triangle); |
| } |
| triangle.setAppearanceProbability(BigInteger.valueOf(this.triangleProbabilitySpinner.getSelection())); |
| IntegerTimeDistribution offset = this.triangleOffset.get(); |
| triangle.setOffset(offset); |
| Recurrence recurrence = this.triangleRecurrence.get(); |
| triangle.setRecurrence(recurrence); |
| |
| TriangleClock clock = triangle.getClock(); |
| if(null == clock) { |
| //TODO: |
| } |
| } |
| |
| private void updateSporadic(final ActivationProperties activations) { |
| SporadicActivation sporadic = activations.getSporadicActivation(); |
| if(null == sporadic) { |
| sporadic = RTMGCFactory.eINSTANCE.createSporadicActivation(); |
| activations.setSporadicActivation(sporadic); |
| } |
| sporadic.setAppearanceProbability(BigInteger.valueOf(this.sporadicProbabilitySpinner.getSelection())); |
| IntegerTimeDistribution min = this.sporadicMin.get(); |
| sporadic.setMinValue(min); |
| PercentageDistribution avg = this.sporadicAvg.get(); |
| sporadic.setAvgValueDistance(avg); |
| PercentageDistribution max = this.sporadicMax.get(); |
| sporadic.setMaxValueDistance(max); |
| } |
| |
| @Override |
| public boolean isValid() { |
| return true; |
| } |
| } |