From caa9cdb17da0a77c50d3c96b926ac4e2a482b927 Mon Sep 17 00:00:00 2001 From: Mayank Chaudhary <chaudhary@fortiss.org> Date: Mon, 21 Mar 2016 14:49:11 +0000 Subject: [PATCH] --- ...pberryPi1ToCANBusConnectionCompositor.java | 8 +- ...pberryPi2ToCANBusConnectionCompositor.java | 8 +- ...pberryPi3ToCANBusConnectionCompositor.java | 8 +- .../ui/prototypes/PrototypeProvider.java | 2 +- .../trunk/META-INF/MANIFEST.MF | 2 + .../trunk/model/raspberry.ecore | 16 +- .../trunk/plugin.xml | 322 +----------------- ...yPlatformHierarchicalCompositionRules.java | 2 - .../generator/executable/BusExecutable.java | 3 +- .../executable/CANBusExecutable.java | 3 +- .../generator/executable/CoreExecutable.java | 292 +++++++++++++++- ...NBusTransmissionCatalogTransformation.java | 6 +- 12 files changed, 318 insertions(+), 354 deletions(-) diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi1ToCANBusConnectionCompositor.java b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi1ToCANBusConnectionCompositor.java index 6794a4ea..6d7feaef 100644 --- a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi1ToCANBusConnectionCompositor.java +++ b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi1ToCANBusConnectionCompositor.java @@ -21,8 +21,8 @@ import static org.fortiss.af3.platform.raspberry.utils.RaspberryModelElementFact import static org.fortiss.af3.platform.raspberry.utils.RaspberryModelElementFactory.createCANBusMasterPort; import static org.fortiss.af3.platform.utils.PlatformModelElementFactory.createTransmissionConnection; +import org.fortiss.af3.platform.model.PlatformArchitecture; import org.fortiss.af3.platform.raspberry.model.CANBus; -import org.fortiss.af3.platform.raspberry.model.Core; import org.fortiss.af3.platform.raspberry.model.RaspberryPi1; import org.fortiss.tooling.base.compose.HierarchicElementConnectionCompositorBase; import org.fortiss.tooling.base.model.element.IConnection; @@ -39,11 +39,11 @@ import org.fortiss.tooling.kernel.service.IPersistencyService; * @ConQAT.Rating RED Hash: */ public class RaspberryPi1ToCANBusConnectionCompositor extends - HierarchicElementConnectionCompositorBase<RaspberryPi1, Core, CANBus> { + HierarchicElementConnectionCompositorBase<PlatformArchitecture, RaspberryPi1, CANBus> { /** {@inheritDoc} */ @Override - public boolean canConnect(Core source, CANBus target, RaspberryPi1 parent, + public boolean canConnect(RaspberryPi1 source, CANBus target, PlatformArchitecture parent, IConnectionCompositionContext context) { if(source.eContainer() != target.eContainer()) { @@ -54,7 +54,7 @@ public class RaspberryPi1ToCANBusConnectionCompositor extends /** {@inheritDoc} */ @Override - public boolean connect(Core source, CANBus target, RaspberryPi1 parent, + public boolean connect(RaspberryPi1 source, CANBus target, PlatformArchitecture parent, IConnectionCompositionContext context) { IConnector sourceConnector = createEntryConnector(); avoidDuplicateConnectorName(source, sourceConnector); diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi2ToCANBusConnectionCompositor.java b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi2ToCANBusConnectionCompositor.java index 97062072..144fe3a2 100644 --- a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi2ToCANBusConnectionCompositor.java +++ b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi2ToCANBusConnectionCompositor.java @@ -21,8 +21,8 @@ import static org.fortiss.af3.platform.raspberry.utils.RaspberryModelElementFact import static org.fortiss.af3.platform.raspberry.utils.RaspberryModelElementFactory.createCANBusMasterPort; import static org.fortiss.af3.platform.utils.PlatformModelElementFactory.createTransmissionConnection; +import org.fortiss.af3.platform.model.PlatformArchitecture; import org.fortiss.af3.platform.raspberry.model.CANBus; -import org.fortiss.af3.platform.raspberry.model.Core; import org.fortiss.af3.platform.raspberry.model.RaspberryPi2; import org.fortiss.tooling.base.compose.HierarchicElementConnectionCompositorBase; import org.fortiss.tooling.base.model.element.IConnection; @@ -39,11 +39,11 @@ import org.fortiss.tooling.kernel.service.IPersistencyService; * @ConQAT.Rating RED Hash: */ public class RaspberryPi2ToCANBusConnectionCompositor extends - HierarchicElementConnectionCompositorBase<RaspberryPi2, Core, CANBus> { + HierarchicElementConnectionCompositorBase<PlatformArchitecture, RaspberryPi2, CANBus> { /** {@inheritDoc} */ @Override - public boolean canConnect(Core source, CANBus target, RaspberryPi2 parent, + public boolean canConnect(RaspberryPi2 source, CANBus target, PlatformArchitecture parent, IConnectionCompositionContext context) { if(source.eContainer() != target.eContainer()) { @@ -54,7 +54,7 @@ public class RaspberryPi2ToCANBusConnectionCompositor extends /** {@inheritDoc} */ @Override - public boolean connect(Core source, CANBus target, RaspberryPi2 parent, + public boolean connect(RaspberryPi2 source, CANBus target, PlatformArchitecture parent, IConnectionCompositionContext context) { IConnector sourceConnector = createEntryConnector(); avoidDuplicateConnectorName(source, sourceConnector); diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi3ToCANBusConnectionCompositor.java b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi3ToCANBusConnectionCompositor.java index db86d2ae..84a717a3 100644 --- a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi3ToCANBusConnectionCompositor.java +++ b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/compose/connections/RaspberryPi3ToCANBusConnectionCompositor.java @@ -21,8 +21,8 @@ import static org.fortiss.af3.platform.raspberry.utils.RaspberryModelElementFact import static org.fortiss.af3.platform.raspberry.utils.RaspberryModelElementFactory.createCANBusMasterPort; import static org.fortiss.af3.platform.utils.PlatformModelElementFactory.createTransmissionConnection; +import org.fortiss.af3.platform.model.PlatformArchitecture; import org.fortiss.af3.platform.raspberry.model.CANBus; -import org.fortiss.af3.platform.raspberry.model.Core; import org.fortiss.af3.platform.raspberry.model.RaspberryPi3; import org.fortiss.tooling.base.compose.HierarchicElementConnectionCompositorBase; import org.fortiss.tooling.base.model.element.IConnection; @@ -39,11 +39,11 @@ import org.fortiss.tooling.kernel.service.IPersistencyService; * @ConQAT.Rating RED Hash: */ public class RaspberryPi3ToCANBusConnectionCompositor extends - HierarchicElementConnectionCompositorBase<RaspberryPi3, Core, CANBus> { + HierarchicElementConnectionCompositorBase<PlatformArchitecture, RaspberryPi3, CANBus> { /** {@inheritDoc} */ @Override - public boolean canConnect(Core source, CANBus target, RaspberryPi3 parent, + public boolean canConnect(RaspberryPi3 source, CANBus target, PlatformArchitecture parent, IConnectionCompositionContext context) { if(source.eContainer() != target.eContainer()) { @@ -54,7 +54,7 @@ public class RaspberryPi3ToCANBusConnectionCompositor extends /** {@inheritDoc} */ @Override - public boolean connect(Core source, CANBus target, RaspberryPi3 parent, + public boolean connect(RaspberryPi3 source, CANBus target, PlatformArchitecture parent, IConnectionCompositionContext context) { IConnector sourceConnector = createEntryConnector(); avoidDuplicateConnectorName(source, sourceConnector); diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/prototypes/PrototypeProvider.java b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/prototypes/PrototypeProvider.java index 4f61640f..9b9cdb9e 100644 --- a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/prototypes/PrototypeProvider.java +++ b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/prototypes/PrototypeProvider.java @@ -80,7 +80,7 @@ public class PrototypeProvider extends PrototypeProviderBase { ActuatorOut actuatorOut = createActuatorOut("ActuatorOut"); setNodePosition(actuatorOut, 0, 0); setConnectorPosition(actuator, 0, 0); - registerPrototype("ActuatorOut", actuator, CATEGORY_NAME); + registerPrototype("ActuatorOut", actuatorOut, CATEGORY_NAME); Bus bus = createBus("Bus"); setNodePosition(bus, 0, 0); diff --git a/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF b/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF index bd0c3492..d6667c3a 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF +++ b/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF @@ -20,6 +20,8 @@ Require-Bundle: org.fortiss.af3.project, org.eclipse.jface;bundle-version="3.9.1" Export-Package: org.fortiss.af3.platform.raspberry.compositor, org.fortiss.af3.platform.raspberry.model, + org.fortiss.af3.platform.raspberry.model.impl, + org.fortiss.af3.platform.raspberry.model.util, org.fortiss.af3.platform.raspberry.utils Import-Package: org.fortiss.af3.deployment.generator, org.fortiss.af3.platform.model diff --git a/org.fortiss.af3.platform.raspberry/trunk/model/raspberry.ecore b/org.fortiss.af3.platform.raspberry/trunk/model/raspberry.ecore index 777c1223..01992bf0 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/model/raspberry.ecore +++ b/org.fortiss.af3.platform.raspberry/trunk/model/raspberry.ecore @@ -2,7 +2,7 @@ <ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model" nsURI="http://www.fortiss.org/af3/platform/raspberry" nsPrefix="org-fortiss-af3-platform-raspberry"> - <eClassifiers xsi:type="ecore:EClass" name="CANBus" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//TransmissionUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement #//IBoardDomain"/> + <eClassifiers xsi:type="ecore:EClass" name="CANBus" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//TransmissionUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement #//IBoardDomain"/> <eClassifiers xsi:type="ecore:EClass" name="IProcessorDomain" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IArchitectureDomain"> <eOperations name="getArchitectureDomainName" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> @@ -19,17 +19,17 @@ </eAnnotations> </eOperations> </eClassifiers> - <eClassifiers xsi:type="ecore:EClass" name="RaspberryPi1" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//GenericPlatformUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement #//IBoardDomain"/> - <eClassifiers xsi:type="ecore:EClass" name="RaspberryPi2" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//GenericPlatformUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement #//IBoardDomain"/> - <eClassifiers xsi:type="ecore:EClass" name="RaspberryPi3" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//GenericPlatformUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement #//IBoardDomain"/> + <eClassifiers xsi:type="ecore:EClass" name="RaspberryPi1" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//GenericPlatformUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement #//IBoardDomain"/> + <eClassifiers xsi:type="ecore:EClass" name="RaspberryPi2" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//GenericPlatformUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement #//IBoardDomain"/> + <eClassifiers xsi:type="ecore:EClass" name="RaspberryPi3" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//GenericPlatformUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement #//IBoardDomain"/> <eClassifiers xsi:type="ecore:EClass" name="Core" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ExecutionUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement #//IProcessorDomain"/> <eClassifiers xsi:type="ecore:EClass" name="Bus" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//TransmissionUnit platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement #//IProcessorDomain"/> - <eClassifiers xsi:type="ecore:EClass" name="Sensor" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Receiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformIOResource"/> - <eClassifiers xsi:type="ecore:EClass" name="Actuator" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transmitter platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformIOResource"/> + <eClassifiers xsi:type="ecore:EClass" name="Sensor" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Receiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformIOResource"/> + <eClassifiers xsi:type="ecore:EClass" name="Actuator" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transmitter platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformIOResource"/> <eClassifiers xsi:type="ecore:EClass" name="SensorIn" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Receiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IProcessorDomain platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformIOResource"/> <eClassifiers xsi:type="ecore:EClass" name="ActuatorOut" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transmitter platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IProcessorDomain platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformIOResource"/> <eClassifiers xsi:type="ecore:EClass" name="BusMasterInterface" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transceiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformInterface platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IProcessorDomain"/> <eClassifiers xsi:type="ecore:EClass" name="BusMasterPort" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transceiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IProcessorDomain"/> - <eClassifiers xsi:type="ecore:EClass" name="CANBusMasterPort" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transceiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain"/> - <eClassifiers xsi:type="ecore:EClass" name="CANBusMasterInterface" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transceiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IIpCorePlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformInterface platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain"/> + <eClassifiers xsi:type="ecore:EClass" name="CANBusMasterPort" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transceiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformPort platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain"/> + <eClassifiers xsi:type="ecore:EClass" name="CANBusMasterInterface" eSuperTypes="platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//Transceiver platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IBoardPlatformArchitectureElement platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//IPlatformInterface platform:/resource/org.fortiss.af3.platform/model/platform.ecore#//ICommunicationMaster #//IBoardDomain"/> </ecore:EPackage> diff --git a/org.fortiss.af3.platform.raspberry/trunk/plugin.xml b/org.fortiss.af3.platform.raspberry/trunk/plugin.xml index 66c99db1..f68d42be 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/plugin.xml +++ b/org.fortiss.af3.platform.raspberry/trunk/plugin.xml @@ -9,328 +9,12 @@ --> <plugin> - - <extension point="org.eclipse.emf.ecore.generated_package"> - <!-- @generated model --> + <extension point="org.eclipse.emf.ecore.generated_package"> + <!-- @generated raspberry --> <package uri="http://www.fortiss.org/af3/platform/raspberry" - class="org.fortiss.af3.platform.raspberry.model.ModelFactory" + class="org.fortiss.af3.platform.raspberry.model.ModelPackage" genModel="model/raspberry.genmodel"/> </extension> - - <extension - point="org.fortiss.tooling.kernel.transformationProvider"> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.RaspberryPi1ExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.RaspberryPi1"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.RaspberryPi1Executable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.RaspberryPi2ExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.RaspberryPi2"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.RaspberryPi2Executable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.RaspberryPi3ExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.RaspberryPi3"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.RaspberryPi3Executable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.CoreExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.Core"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.CoreExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.BusExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.Bus"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.BusExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.BusMasterInterfaceExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.BusMasterInterface"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.BusMasterInterfaceExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.BusMasterPortExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.BusMasterPort"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.BusMasterPortExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.CANBusExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.CANBus"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.CANBusExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.CANBusMasterInterfaceExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.CANBusMasterInterface"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.CANBusMasterInterfaceExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.CANBusMasterPortExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.CANBusMasterPort"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.CANBusMasterPortExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.SensorExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.Sensor"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.SensorExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.SensorInExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.SensorIn"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.SensorInExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.ActuatorExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.Actuator"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.ActuatorExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.ActuatorOutExecutableTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.ActuatorOut"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.generator.executable.ActuatorOutExecutable"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.ActuatorExecutableTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.Actuator"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.ActuatorOutExecutableTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.ActuatorOut"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.BusMasterInterfaceTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.BusMasterInterface"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider><transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.BusMasterPortTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.BusMasterPort"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.BusTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.Bus"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.CANBusTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.CANBus"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.CANBusMasterInterfaceTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.CANBusMasterInterface"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.CANBusMasterPortTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.CANBusMasterPort"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.SensorExecutableTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.Sensor"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - <transformationProvider - transformationProvider="org.fortiss.af3.platform.raspberry.generator.transform.SensorInExecutableTransmissionCatalogTransformation"> - <source> - <objectClass - objectClass="org.fortiss.af3.platform.raspberry.model.SensorIn"> - </objectClass> - </source> - <target> - <objectClass - objectClass="org.fortiss.af3.deployment.generator.TransmissionCatalog"> - </objectClass> - </target> - </transformationProvider> - </extension> </plugin> diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/compositor/RaspberryPlatformHierarchicalCompositionRules.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/compositor/RaspberryPlatformHierarchicalCompositionRules.java index b6ecf4a0..c7ed3e08 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/compositor/RaspberryPlatformHierarchicalCompositionRules.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/compositor/RaspberryPlatformHierarchicalCompositionRules.java @@ -49,8 +49,6 @@ public class RaspberryPlatformHierarchicalCompositionRules extends if(domain.equals(IPlatformDomain.class)) { rval.add(IBoardDomain.class); - } else if(hasEqualLevel(domain, IPlatformDomain.class)) { - rval.add(IPlatformDomain.class); } else if(hasEqualLevel(domain, IBoardDomain.class)) { rval.add(IProcessorDomain.class); } diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusExecutable.java index 1f555bbc..252a6ce5 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusExecutable.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusExecutable.java @@ -26,6 +26,7 @@ import org.fortiss.af3.generator.common.model.source.SourcePackage; import org.fortiss.af3.platform.language.executable.TransmissionUnitExecutableBase; import org.fortiss.af3.platform.model.ExecutionUnit; import org.fortiss.af3.platform.model.TransmissionUnit; +import org.fortiss.tooling.kernel.extension.data.ITransformationContext; /** * @@ -48,7 +49,7 @@ public class BusExecutable extends TransmissionUnitExecutableBase<TransmissionUn @Override public void createAllFiles(SourcePackage pack, Map<ExecutionUnit, List<Port>> euPortsPair, Map<ExecutionUnit, List<Component>> euComponentList, Component topComponent, - int deploymentID) { + int deploymentID, ITransformationContext context) { // TODO Auto-generated method stub } diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CANBusExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CANBusExecutable.java index 9b5a4a57..7ad0777f 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CANBusExecutable.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CANBusExecutable.java @@ -26,6 +26,7 @@ import org.fortiss.af3.generator.common.model.source.SourcePackage; import org.fortiss.af3.platform.language.executable.TransmissionUnitExecutableBase; import org.fortiss.af3.platform.model.ExecutionUnit; import org.fortiss.af3.platform.model.TransmissionUnit; +import org.fortiss.tooling.kernel.extension.data.ITransformationContext; /** * @@ -48,7 +49,7 @@ public class CANBusExecutable extends TransmissionUnitExecutableBase<Transmissio @Override public void createAllFiles(SourcePackage pack, Map<ExecutionUnit, List<Port>> euPortsPair, Map<ExecutionUnit, List<Component>> euComponentList, Component topComponent, - int deploymentID) { + int deploymentID, ITransformationContext context) { // TODO Auto-generated method stub } diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CoreExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CoreExecutable.java index 9f4401f4..d4c8c4a7 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CoreExecutable.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CoreExecutable.java @@ -17,18 +17,67 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.af3.platform.raspberry.generator.executable; +import static org.fortiss.af3.component.generator.component.ComponentFunctionIdentifierUtils.getInitializeFunctionName; +import static org.fortiss.af3.component.generator.component.ComponentFunctionIdentifierUtils.getPerformStepFunctionName; +import static org.fortiss.af3.component.generator.component.PortVariableUtils.getPortNoValAssignment; +import static org.fortiss.af3.component.generator.component.PortVariableUtils.getPortPortValueAssignment; +import static org.fortiss.af3.component.generator.component.PortVariableUtils.getPortValue; +import static org.fortiss.af3.component.generator.component.PortVariableUtils.getPortValueAssignment; +import static org.fortiss.af3.component.generator.component.PortVariableUtils.testPortVariableForNoVal; +import static org.fortiss.af3.component.utils.GeneratorModelElementFactory.createComponentFunction; +import static org.fortiss.af3.component.utils.GeneratorModelElementFactory.createComponentProgram; +import static org.fortiss.af3.component.utils.GeneratorModelElementFactory.createLocalFunction; +import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.assignment; +import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.createDataDictionary; +import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.funcCall; +import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.ifthenelse; +import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.sequence; +import static org.fortiss.af3.generator.common.utils.CLanguageModelElementFacade.addUserHeaderInclude; +import static org.fortiss.af3.generator.common.utils.CLanguageModelElementFactory.createCSourcePackage; +import static org.fortiss.af3.generator.common.utils.CLanguageModelElementFactory.createConfigureFile; +import static org.fortiss.af3.generator.common.utils.CLanguageModelElementFactory.createMakedefsFile; +import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.getRootElement; +import static org.fortiss.tooling.kernel.utils.LoggingUtils.error; +import static org.fortiss.tooling.kernel.utils.TransformationUtils.createTransformedObjectFor; + +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.conqat.lib.commons.collections.Pair; +import org.fortiss.af3.component.model.Channel; import org.fortiss.af3.component.model.Component; +import org.fortiss.af3.component.model.InputPort; +import org.fortiss.af3.component.model.OutputPort; import org.fortiss.af3.component.model.Port; +import org.fortiss.af3.component.model.generator.ComponentFunction; +import org.fortiss.af3.component.model.generator.ComponentProgram; +import org.fortiss.af3.component.model.generator.LocalFunction; +import org.fortiss.af3.expression.model.DataDictionary; import org.fortiss.af3.expression.model.terms.IExpressionTerm; +import org.fortiss.af3.expression.model.terms.imperative.Assignment; +import org.fortiss.af3.expression.model.terms.imperative.IStatementTerm; +import org.fortiss.af3.expression.model.terms.imperative.StatementSequence; +import org.fortiss.af3.generator.common.model.c.CImplementationFile; import org.fortiss.af3.generator.common.model.c.CSourcePackage; +import org.fortiss.af3.platform.AF3PlatformActivator; +import org.fortiss.af3.platform.language.executable.ExecutableBase; import org.fortiss.af3.platform.language.executable.ExecutionUnitExecutableBase; +import org.fortiss.af3.platform.language.executable.IInitializableExecutable; +import org.fortiss.af3.platform.language.executable.IReadableExecutable; +import org.fortiss.af3.platform.language.executable.IReadableExecutableWithNoValSupport; +import org.fortiss.af3.platform.language.executable.ITerminatableExecutable; +import org.fortiss.af3.platform.language.executable.IWritableExecutable; +import org.fortiss.af3.platform.language.executable.IWritableExecutableWithNoValSupport; import org.fortiss.af3.platform.model.ExecutionUnit; import org.fortiss.af3.platform.model.PlatformConnectorUnit; +import org.fortiss.af3.platform.model.generic.GenericReceiver; +import org.fortiss.af3.platform.model.generic.GenericTransceiver; +import org.fortiss.af3.platform.model.generic.GenericTransmitter; import org.fortiss.af3.platform.raspberry.model.Core; import org.fortiss.tooling.kernel.extension.data.ITransformationContext; +import org.fortiss.tooling.kernel.extension.exception.TransformationFailedException; /** * @@ -44,21 +93,18 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac */ public CoreExecutable(Core modelElement) { super(modelElement); - // TODO Auto-generated constructor stub } /** {@inheritDoc} */ @Override public IExpressionTerm getInitialization() { - // TODO Auto-generated method stub - return null; + return funcCall("init_generic_ecu"); } /** {@inheritDoc} */ @Override public IExpressionTerm getTermination() { - // TODO Auto-generated method stub - return null; + return funcCall("term_generic_ecu"); } /** {@inheritDoc} */ @@ -66,8 +112,240 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac protected CSourcePackage createExecutionUnitSourcePackage(String name, List<Pair<ExecutionUnit, Component>> deployedComponents, List<Pair<PlatformConnectorUnit, Port>> deployedPorts, ITransformationContext context) { - // TODO Auto-generated method stub - return null; + + /* need to check if all annotations are set */ + + CSourcePackage sourcePackage = createCSourcePackage(); + sourcePackage.setBaseLocation("app/" + name); + + // Fill the the two helper sets. Sets are used to ensure uniqueness of platform connectors. + Set<PlatformConnectorUnit> usedUnits = new HashSet<PlatformConnectorUnit>(); + Set<GenericTransceiver> usedTransceivers = new HashSet<GenericTransceiver>(); + for(Pair<PlatformConnectorUnit, Port> p : deployedPorts) { + usedUnits.add(p.getFirst()); + if(p.getFirst() instanceof GenericTransceiver) { + usedTransceivers.add((GenericTransceiver)p.getFirst()); + } + } + + // Create the system functions. + // ComponentFunction init = + // createInitializeFunction(deployedComponents, usedUnits, deployedPorts); + // ComponentFunction step = + // createStepFunction(deployedComponents, deployedPorts, usedTransceivers); + // ComponentProgram program = createComponentProgram("system", init, step); + // program.getLocalFunctions().add( + // createTerminationFunction(deployedPorts, deployedComponents)); + // program.getLocalFunctions().add( + // createReadInputFunction(deployedPorts, usedTransceivers, deployedComponents)); + + // Create the system functions. + ComponentFunction init = createInitializeFunction(deployedComponents, usedUnits); + ComponentFunction step = + createStepFunction(deployedComponents, deployedPorts, usedTransceivers); + ComponentProgram program = createComponentProgram("system", init, step); + program.getLocalFunctions().add(createTerminationFunction(usedUnits)); + program.getLocalFunctions().add(createReadInputFunction(deployedPorts, usedTransceivers)); + + // Fill the system program with the component sub-programs + try { + // deployed components + for(Pair<ExecutionUnit, Component> pair : deployedComponents) { + program.getSubPrograms().add( + createTransformedObjectFor(pair.getSecond(), ComponentProgram.class, + context)); + } + + // convert the program to C code + CSourcePackage cPack = + createTransformedObjectFor(program, CSourcePackage.class, context); + cPack.mergeInto(sourcePackage); + + if(!deployedComponents.isEmpty()) { + DataDictionary dataDict = + getRootElement(deployedComponents.get(0).getSecond(), DataDictionary.class); + if(dataDict == null) { + dataDict = createDataDictionary(); // dummy element => predefined types are + // created + } + CSourcePackage dataDictionaryPackage = + createTransformedObjectFor(dataDict, CSourcePackage.class, context); + dataDictionaryPackage.mergeInto(sourcePackage); + } + } catch(TransformationFailedException e) { + error(AF3PlatformActivator.getDefault(), e.getMessage(), e); + } + + fixSystemCImports((CImplementationFile)sourcePackage.getSrcGenPackage() + .findSourceUnitByName("system.c"), usedUnits, usedTransceivers); + + sourcePackage.getUnits().add(createConfigureFile(modelElement.getName())); + sourcePackage.getUnits().add(createMakedefsFile()); + return sourcePackage; + } + + /** Adds the platform connectors includes. */ + private void fixSystemCImports(CImplementationFile system, + Set<PlatformConnectorUnit> usedUnits, Set<GenericTransceiver> usedTransceivers) { + // Add includes for user code of generic HAL implementation + for(GenericTransceiver gt : usedTransceivers) { + addUserHeaderInclude(system, gt.getName()); + } + for(PlatformConnectorUnit unit : usedUnits) { + if(unit instanceof GenericTransmitter || unit instanceof GenericReceiver) { + addUserHeaderInclude(system, "io"); + break; + } + } + } + + /** Creates the initialize function. */ + protected ComponentFunction createInitializeFunction( + List<Pair<ExecutionUnit, Component>> deployedComponents, + Set<PlatformConnectorUnit> usedUnits) { + List<IStatementTerm> body = new ArrayList<IStatementTerm>(); + for(Pair<ExecutionUnit, Component> p : deployedComponents) { + body.add(assignment(funcCall(getInitializeFunctionName(p.getSecond())))); + } + + for(PlatformConnectorUnit pu : usedUnits) { + ExecutableBase<? extends PlatformConnectorUnit> exec = + getPlatformArchitectureExecutable().getExecutable(pu); + if(exec instanceof IInitializableExecutable) { + body.add(assignment(((IInitializableExecutable)exec).getInitialization())); + } + } + return createComponentFunction("initialize_system", null, sequence(body)); + } + + /** Creates the termination function. */ + protected LocalFunction createTerminationFunction(Set<PlatformConnectorUnit> usedUnits) { + List<IStatementTerm> body = new ArrayList<IStatementTerm>(); + for(PlatformConnectorUnit pu : usedUnits) { + ExecutableBase<? extends PlatformConnectorUnit> exec = + getPlatformArchitectureExecutable().getExecutable(pu); + if(exec instanceof ITerminatableExecutable) { + body.add(assignment(((ITerminatableExecutable)exec).getTermination())); + } + } + return createLocalFunction("terminate_system", null, sequence(body)); + } + + /** Creates the step function. */ + protected ComponentFunction createStepFunction( + List<Pair<ExecutionUnit, Component>> deployedComponents, + List<Pair<PlatformConnectorUnit, Port>> deployedPorts, + Set<GenericTransceiver> usedTransceivers) { + List<IStatementTerm> body = new ArrayList<IStatementTerm>(); + + // Search for local channels, i.e. channels that begin and end at components deployed to + // this generic execution unit. + // If such channels are found, we have to place the corresponding assignments here, since + // there is no super component that would do that for us. + for(Pair<ExecutionUnit, Component> p : deployedComponents) { + Component comp = p.getSecond(); + for(InputPort conn : comp.getInputPorts()) { + for(Channel ch : conn.getIncomingChannels()) { + if(ch.getSource().eContainer().equals(comp)) { + // We found a local channel; create the assignments + body.add(getPortPortValueAssignment(ch.getSource(), ch.getTarget())); + } + } + } + } + body.add(assignment(funcCall("read_input"))); + // Notify transceivers about start of output writing. + for(GenericTransceiver gt : usedTransceivers) { + body.add(assignment(funcCall("prepare_output_" + gt.getName()))); + } + // Perform component step + for(Pair<ExecutionUnit, Component> p : deployedComponents) { + Component comp = p.getSecond(); + if(comp.getSubComponents().isEmpty() && comp.isStronglyCausal()) { + writeOutputsForComponent(comp, deployedPorts, body); + } + body.add(assignment(funcCall(getPerformStepFunctionName(p.getSecond())))); + if(!comp.getSubComponents().isEmpty() || !comp.isStronglyCausal()) { + writeOutputsForComponent(comp, deployedPorts, body); + } + } + // Notify transceivers about end of output writing. + for(GenericTransceiver gt : usedTransceivers) { + body.add(assignment(funcCall("finish_output_" + gt.getName()))); + } + return createComponentFunction("run_system", null, sequence(body)); + } + + /** + * @param deployedPorts + * @param body + */ + private void writeOutputsForComponent(Component comp, + List<Pair<PlatformConnectorUnit, Port>> deployedPorts, List<IStatementTerm> body) { + // Write outputs to transmitter and transceivers. + for(Pair<PlatformConnectorUnit, Port> p : deployedPorts) { + if(p.getSecond().getComponent() != comp) { + continue; + } + ExecutableBase<? extends PlatformConnectorUnit> exec = + getPlatformArchitectureExecutable().getExecutable(p.getFirst()); + if(exec instanceof IWritableExecutable && p.getSecond() instanceof OutputPort) { + createWriteAccess((IWritableExecutable)exec, (OutputPort)p.getSecond(), body); + } + } + } + + /** Creates the read input function. */ + protected LocalFunction createReadInputFunction( + List<Pair<PlatformConnectorUnit, Port>> deployedPorts, + Set<GenericTransceiver> usedTransceivers) { + List<IStatementTerm> body = new ArrayList<IStatementTerm>(); + // Notify transceivers about start input reading. + for(GenericTransceiver gt : usedTransceivers) { + body.add(assignment(funcCall("prepare_input_" + gt.getName()))); + } + // Read input from transceivers and receivers. + for(Pair<PlatformConnectorUnit, Port> p : deployedPorts) { + ExecutableBase<? extends PlatformConnectorUnit> exec = + getPlatformArchitectureExecutable().getExecutable(p.getFirst()); + if(exec instanceof IReadableExecutable && p.getSecond() instanceof InputPort) { + createReadAccess((IReadableExecutable)exec, (InputPort)p.getSecond(), body); + } + } + // Notify transceivers about end of input reading. + for(GenericTransceiver gt : usedTransceivers) { + body.add(assignment(funcCall("finish_input_" + gt.getName()))); + } + return createLocalFunction("read_input", null, sequence(body)); + } + + /** Creates the read code for the given executable and port */ + protected void + createReadAccess(IReadableExecutable exec, InputPort p, List<IStatementTerm> body) { + IStatementTerm valueAssign = getPortValueAssignment(p, exec.getValueReadAccessor(p)); + if(exec instanceof IReadableExecutableWithNoValSupport) { + IExpressionTerm guard = + ((IReadableExecutableWithNoValSupport)exec).getNoValGuardAccessor(p); + StatementSequence thenBlock = sequence(getPortNoValAssignment(p)); + StatementSequence elseBlock = sequence(valueAssign); + body.add(ifthenelse(guard, thenBlock, elseBlock)); + } else { + body.add(valueAssign); + } + } + + /** Creates the write code for the given executable and port. */ + protected void createWriteAccess(IWritableExecutable exec, OutputPort p, + List<IStatementTerm> body) { + Assignment valueAssign = assignment(exec.getValueWriteAccessor(p, getPortValue(p))); + if(exec instanceof IWritableExecutableWithNoValSupport) { + IExpressionTerm guard = testPortVariableForNoVal(p); + Assignment thenBlock = + assignment(((IWritableExecutableWithNoValSupport)exec).getNoValWriteAccessor(p)); + body.add(ifthenelse(guard, sequence(thenBlock), sequence(valueAssign))); + } else { + body.add(valueAssign); + } } } diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/transform/CANBusTransmissionCatalogTransformation.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/transform/CANBusTransmissionCatalogTransformation.java index 02670224..40554b36 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/transform/CANBusTransmissionCatalogTransformation.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/transform/CANBusTransmissionCatalogTransformation.java @@ -17,7 +17,7 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.af3.platform.raspberry.generator.transform; -import org.fortiss.af3.platform.raspberry.generator.executable.CANBusExecutable; +import org.fortiss.af3.deployment.generator.TransmissionCatalog; import org.fortiss.af3.platform.raspberry.model.CANBus; import org.fortiss.tooling.kernel.extension.ITransformationProvider; import org.fortiss.tooling.kernel.extension.data.ITransformationContext; @@ -34,7 +34,7 @@ public class CANBusTransmissionCatalogTransformation implements ITransformationP /** {@inheritDoc} */ @Override public Class<?> getTargetClass() { - return CANBusExecutable.class; + return TransmissionCatalog.class; } /** {@inheritDoc} */ @@ -53,7 +53,7 @@ public class CANBusTransmissionCatalogTransformation implements ITransformationP /** {@inheritDoc} */ @Override public Object transform(Object source, ITransformationContext context) { - return new CANBusExecutable((CANBus)source); + return new TransmissionCatalog(); } } -- GitLab