diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/ActuatorOutExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/ActuatorOutExecutable.java index ef3db36e4fb68d4c77724299fee29f9f97debbb8..42527fef733a3a01115264fecc6ebc1148fc69e6 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/ActuatorOutExecutable.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/ActuatorOutExecutable.java @@ -21,12 +21,13 @@ import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.fun import static org.fortiss.tooling.base.utils.AnnotationUtils.getAnnotation; import org.fortiss.af3.component.model.OutputPort; +import org.fortiss.af3.deployment.model.Deployment; import org.fortiss.af3.expression.model.terms.IExpressionTerm; import org.fortiss.af3.expression.utils.ExpressionModelElementFactory; -import org.fortiss.af3.platform.language.executable.IInitializableExecutable; -import org.fortiss.af3.platform.language.executable.ITerminatableExecutable; -import org.fortiss.af3.platform.language.executable.IWritableExecutableWithNoValSupport; import org.fortiss.af3.platform.language.executable.TransmitterExecutableBase; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.ITermExecutable; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.IWriteExecutableWithNoValSupport; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.InitExecutable; import org.fortiss.af3.platform.raspberry.model.ActuatorOut; import org.fortiss.af3.platform.raspberry.model.annotation.PinNumber; @@ -38,7 +39,7 @@ import org.fortiss.af3.platform.raspberry.model.annotation.PinNumber; * @ConQAT.Rating RED Hash: */ public class ActuatorOutExecutable extends TransmitterExecutableBase<ActuatorOut> implements - IInitializableExecutable, ITerminatableExecutable, IWritableExecutableWithNoValSupport { + InitExecutable, ITermExecutable, IWriteExecutableWithNoValSupport { /** * @param modelElement @@ -51,13 +52,13 @@ public class ActuatorOutExecutable extends TransmitterExecutableBase<ActuatorOut /** {@inheritDoc} */ @Override public IExpressionTerm getInitialization() { - return funcCall("init_" + modelElement.getName()); + return funcCall("init_Actuator");// + modelElement.getName() } /** {@inheritDoc} */ @Override public IExpressionTerm getTermination() { - return funcCall("term_" + modelElement.getName()); + return funcCall("term_Actuator"); } /** {@inheritDoc} */ @@ -72,7 +73,52 @@ public class ActuatorOutExecutable extends TransmitterExecutableBase<ActuatorOut /** {@inheritDoc} */ @Override public IExpressionTerm getNoValWriteAccessor(OutputPort logicalSignal) { - return funcCall("set_noval_" + modelElement.getName()); + return funcCall("set_noval_Actuator"); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getValueWriteAccessor(OutputPort logicalSignal, IExpressionTerm value, + Deployment depl) { + PinNumber ias = getAnnotation(modelElement, PinNumber.class); + int pinNr = ias.getPinNumber(); + return funcCall("write_Actuator", ExpressionModelElementFactory.createVar(pinNr + "")); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getTermination(IExpressionTerm signal) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getTermination(Deployment depl) { + // TODO Auto-generated method stub + return funcCall("term_Actuator"); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(IExpressionTerm term) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(IExpressionTerm port, IExpressionTerm portName, + IExpressionTerm readOrWrite) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(Deployment depl) { + // TODO Auto-generated method stub + return funcCall("init_Actuator"); } } diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusMasterPortExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusMasterPortExecutable.java index 74593e20df71f6456898d31e5178f91aef459d03..a533cb50963452e50a7a729328a9d51246b00fb0 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusMasterPortExecutable.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/BusMasterPortExecutable.java @@ -17,17 +17,25 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.af3.platform.raspberry.generator.executable; +import static org.fortiss.af3.deployment.utils.DeploymentUtils.findECUforDeployedComponent; import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.funcCall; +import static org.fortiss.tooling.base.utils.AnnotationUtils.getAnnotation; +import org.eclipse.emf.common.util.EList; +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.deployment.model.Deployment; import org.fortiss.af3.expression.model.terms.IExpressionTerm; import org.fortiss.af3.expression.utils.ExpressionModelElementFactory; -import org.fortiss.af3.platform.language.executable.IInitializableExecutable; -import org.fortiss.af3.platform.language.executable.IReadableExecutableWithNoValSupport; -import org.fortiss.af3.platform.language.executable.ITerminatableExecutable; -import org.fortiss.af3.platform.language.executable.IWritableExecutableWithNoValSupport; import org.fortiss.af3.platform.language.executable.TransceiverExecutableBase; +import org.fortiss.af3.platform.model.ExecutionUnit; +import org.fortiss.af3.platform.model.IPlatformArchitectureElement; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.IReadExecutableWithNoValSupport; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.ITermExecutable; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.IWriteExecutableWithNoValSupport; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.InitExecutable; import org.fortiss.af3.platform.raspberry.model.BusMasterPort; import org.fortiss.af3.platform.raspberry.model.annotation.CoreAddress; @@ -39,8 +47,8 @@ import org.fortiss.af3.platform.raspberry.model.annotation.CoreAddress; * @ConQAT.Rating RED Hash: */ public class BusMasterPortExecutable extends TransceiverExecutableBase<BusMasterPort> implements - IInitializableExecutable, ITerminatableExecutable, IReadableExecutableWithNoValSupport, - IWritableExecutableWithNoValSupport { + InitExecutable, ITermExecutable, IReadExecutableWithNoValSupport, + IWriteExecutableWithNoValSupport { /** * @param modelElement @@ -52,46 +60,151 @@ public class BusMasterPortExecutable extends TransceiverExecutableBase<BusMaster /** {@inheritDoc} */ @Override - public IExpressionTerm getInitialization() { - return funcCall("init_" + modelElement.getName()); + public IExpressionTerm getInitialization(Deployment depl) { + int coreId = getParentCoreId(depl); + + return funcCall("init_" + modelElement.getName(), + ExpressionModelElementFactory.createVar(coreId + "")); } /** {@inheritDoc} */ @Override - public IExpressionTerm getTermination() { - return funcCall("term_" + modelElement.getName()); + public IExpressionTerm getTermination(Deployment depl) { + int coreId = getParentCoreId(depl); + return funcCall("term_" + modelElement.getName(), + ExpressionModelElementFactory.createVar(coreId + "")); } /** {@inheritDoc} */ @Override - public IExpressionTerm getValueWriteAccessor(OutputPort logicalSignal, IExpressionTerm value) { - return funcCall("write_" + modelElement.getName() + "_" + logicalSignal.getName(), value); + public IExpressionTerm getValueWriteAccessor(OutputPort logicalSignal, IExpressionTerm value, + Deployment depl) { + int coreAddress = getTargetCoreAddress(logicalSignal, depl); + return funcCall("write_" + modelElement.getName(), + ExpressionModelElementFactory.createVar(coreAddress + ""), + ExpressionModelElementFactory.createVar(logicalSignal.getName() + "")); + // return funcCall("write_" + modelElement.getName(), value); } /** {@inheritDoc} */ @Override - public IExpressionTerm getValueReadAccessor(InputPort logicalSignal) { - CoreAddress ias = - org.fortiss.tooling.base.utils.AnnotationUtils.getAnnotation( - modelElement.getPlatformElement(), CoreAddress.class); + public IExpressionTerm getValueReadAccessor(InputPort logicalSignal, Deployment depl) { + + int coreAddress = getSourceCoreAddress(logicalSignal, depl); - int coreAddress = ias.getCoreAddress(); - // return funcCall("read_" + modelElement.getName() + "_" + logicalSignal.getName()); return funcCall("read_" + modelElement.getName(), - ExpressionModelElementFactory.createVar(coreAddress + "")); + ExpressionModelElementFactory.createVar(coreAddress + ""), + ExpressionModelElementFactory.createVar(logicalSignal.getName() + "")); } /** {@inheritDoc} */ @Override public IExpressionTerm getNoValWriteAccessor(OutputPort logicalSignal) { - return funcCall("set_noval_" + modelElement.getName() + "_" + logicalSignal.getName()); + return funcCall("set_noval_" + modelElement.getName());// + "_" + logicalSignal.getName() } /** {@inheritDoc} */ @Override public IExpressionTerm getNoValGuardAccessor(InputPort logicalSignal) { - return funcCall("is_noval_" + modelElement.getName() + "_" + logicalSignal.getName()); + return funcCall("is_noval_" + modelElement.getName());// + "_" + logicalSignal.getName() + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getValueReadAccessor(InputPort logicalSignal) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getNoValGuardAccessor(IExpressionTerm signal, IExpressionTerm buffer) { + // TODO Auto-generated method stub + return null; + } + + /** + * @param logicalSignal + * @return + * returns core ID + */ + + private int getSourceCoreAddress(InputPort logicalSignal, Deployment depl) { + EList<Channel> channels = logicalSignal.getIncomingChannels(); + // get one of the channels, usually only one channel will be connected per input port + Component sourceComponent = channels.get(0).getSource().getComponent(); + ExecutionUnit sourceCore = findECUforDeployedComponent(sourceComponent, depl); + CoreAddress ias = getAnnotation(sourceCore, CoreAddress.class); + return ias.getCoreAddress();// sourceCore.getId(); + } + + /** + * @param logicalSignal + * @return + * returns core ID + */ + private int getTargetCoreAddress(OutputPort logicalSignal, Deployment depl) { + EList<Channel> channels = logicalSignal.getOutgoingChannels(); + // get one of the channels, usually only one channel will be connected per output port + Component targetComponent = channels.get(0).getTarget().getComponent(); + ExecutionUnit targetCore = findECUforDeployedComponent(targetComponent, depl); + CoreAddress ias = getAnnotation(targetCore, CoreAddress.class); + return ias.getCoreAddress(); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getValueWriteAccessor(OutputPort logicalSignal, IExpressionTerm value) { + // TODO Auto-generated method stub + return null; + } + + /** + * @param depl + * @return + * returns parent core ID + */ + private int getParentCoreId(Deployment depl) { + IPlatformArchitectureElement parentElement = modelElement.getPlatformElement(); + CoreAddress ias = getAnnotation(parentElement, CoreAddress.class); + return ias.getCoreAddress(); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getTermination() { + // TODO Auto-generated method stub + return funcCall("term_" + modelElement.getName()); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization() { + // TODO Auto-generated method stub + return funcCall("init_" + modelElement.getName()); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getTermination(IExpressionTerm signal) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(IExpressionTerm term) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(IExpressionTerm port, IExpressionTerm portName, + IExpressionTerm readOrWrite) { + // TODO Auto-generated method stub + return null; } } 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 7016414014797b91c00bd53ff04b0161a8abbff9..3ef20de8c6dc2b2210932714ac1670ad3016a165 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 @@ -55,6 +55,8 @@ 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.deployment.generator.DeploymentExecutableTransformationContext; +import org.fortiss.af3.deployment.model.Deployment; import org.fortiss.af3.expression.model.DataDictionary; import org.fortiss.af3.expression.model.terms.IExpressionTerm; import org.fortiss.af3.expression.model.terms.imperative.Assignment; @@ -68,18 +70,18 @@ import org.fortiss.af3.generator.common.model.source.StaticContentSourceUnit; 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.GenericPlatformUnit; 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.generator.executable.interfaces.IReadExecutable; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.IReadExecutableWithNoValSupport; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.ITermExecutable; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.IWriteExecutable; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.IWriteExecutableWithNoValSupport; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.InitExecutable; import org.fortiss.af3.platform.raspberry.model.Core; import org.fortiss.af3.platform.raspberry.templates.RaspberryTemplateLoader; import org.fortiss.tooling.kernel.extension.data.ITransformationContext; @@ -147,12 +149,17 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac // createReadInputFunction(deployedPorts, usedTransceivers, deployedComponents)); // Create the system functions. - ComponentFunction init = createInitializeFunction(deployedComponents, usedUnits); + DeploymentExecutableTransformationContext depctx = + (DeploymentExecutableTransformationContext)context; + Deployment depl = depctx.getDeploymentExecutable().getDeployment(); + + ComponentFunction init = createInitializeFunction(deployedComponents, usedUnits, depl); ComponentFunction step = - createStepFunction(deployedComponents, deployedPorts, usedTransceivers); + createStepFunction(deployedComponents, deployedPorts, usedTransceivers, depl); ComponentProgram program = createComponentProgram("system", init, step); - program.getLocalFunctions().add(createTerminationFunction(usedUnits)); - program.getLocalFunctions().add(createReadInputFunction(deployedPorts, usedTransceivers)); + program.getLocalFunctions().add(createTerminationFunction(usedUnits, depl)); + program.getLocalFunctions().add( + createReadInputFunction(deployedPorts, usedTransceivers, depl)); program.getLocalFunctions().add(createMainFunction()); // Fill the system program with the component sub-programs try { @@ -225,7 +232,7 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac /** Creates the initialize function. */ protected ComponentFunction createInitializeFunction( List<Pair<ExecutionUnit, Component>> deployedComponents, - Set<PlatformConnectorUnit> usedUnits) { + Set<PlatformConnectorUnit> usedUnits, Deployment depl) { List<IStatementTerm> body = new ArrayList<IStatementTerm>(); for(Pair<ExecutionUnit, Component> p : deployedComponents) { body.add(assignment(funcCall(getInitializeFunctionName(p.getSecond())))); @@ -234,21 +241,22 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac for(PlatformConnectorUnit pu : usedUnits) { ExecutableBase<? extends PlatformConnectorUnit> exec = getPlatformArchitectureExecutable().getExecutable(pu); - if(exec instanceof IInitializableExecutable) { - body.add(assignment(((IInitializableExecutable)exec).getInitialization())); + if(exec instanceof InitExecutable) { + body.add(assignment(((InitExecutable)exec).getInitialization(depl))); } } return createComponentFunction("initialize_system", null, sequence(body)); } /** Creates the termination function. */ - protected LocalFunction createTerminationFunction(Set<PlatformConnectorUnit> usedUnits) { + protected LocalFunction createTerminationFunction(Set<PlatformConnectorUnit> usedUnits, + Deployment depl) { 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())); + if(exec instanceof ITermExecutable) { + body.add(assignment(((ITermExecutable)exec).getTermination(depl))); } } return createLocalFunction("terminate_system", null, sequence(body)); @@ -258,7 +266,7 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac protected ComponentFunction createStepFunction( List<Pair<ExecutionUnit, Component>> deployedComponents, List<Pair<PlatformConnectorUnit, Port>> deployedPorts, - Set<GenericTransceiver> usedTransceivers) { + Set<GenericTransceiver> usedTransceivers, Deployment depl) { List<IStatementTerm> body = new ArrayList<IStatementTerm>(); // Search for local channels, i.e. channels that begin and end at components deployed to @@ -285,11 +293,11 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac for(Pair<ExecutionUnit, Component> p : deployedComponents) { Component comp = p.getSecond(); if(comp.getSubComponents().isEmpty() && comp.isStronglyCausal()) { - writeOutputsForComponent(comp, deployedPorts, body); + writeOutputsForComponent(comp, deployedPorts, body, depl); } body.add(assignment(funcCall(getPerformStepFunctionName(p.getSecond())))); if(!comp.getSubComponents().isEmpty() || !comp.isStronglyCausal()) { - writeOutputsForComponent(comp, deployedPorts, body); + writeOutputsForComponent(comp, deployedPorts, body, depl); } } // Notify transceivers about end of output writing. @@ -304,7 +312,8 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac * @param body */ private void writeOutputsForComponent(Component comp, - List<Pair<PlatformConnectorUnit, Port>> deployedPorts, List<IStatementTerm> body) { + List<Pair<PlatformConnectorUnit, Port>> deployedPorts, List<IStatementTerm> body, + Deployment depl) { // Write outputs to transmitter and transceivers. for(Pair<PlatformConnectorUnit, Port> p : deployedPorts) { if(p.getSecond().getComponent() != comp) { @@ -312,8 +321,8 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac } ExecutableBase<? extends PlatformConnectorUnit> exec = getPlatformArchitectureExecutable().getExecutable(p.getFirst()); - if(exec instanceof IWritableExecutable && p.getSecond() instanceof OutputPort) { - createWriteAccess((IWritableExecutable)exec, (OutputPort)p.getSecond(), body); + if(exec instanceof IWriteExecutable && p.getSecond() instanceof OutputPort) { + createWriteAccess((IWriteExecutable)exec, (OutputPort)p.getSecond(), body, depl); } } } @@ -340,7 +349,7 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac /** Creates the read input function. */ protected LocalFunction createReadInputFunction( List<Pair<PlatformConnectorUnit, Port>> deployedPorts, - Set<GenericTransceiver> usedTransceivers) { + Set<GenericTransceiver> usedTransceivers, Deployment depl) { List<IStatementTerm> body = new ArrayList<IStatementTerm>(); // Notify transceivers about start input reading. for(GenericTransceiver gt : usedTransceivers) { @@ -350,8 +359,8 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac 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); + if(exec instanceof IReadExecutable && p.getSecond() instanceof InputPort) { + createReadAccess((IReadExecutable)exec, (InputPort)p.getSecond(), body, depl); } } // Notify transceivers about end of input reading. @@ -362,12 +371,12 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac } /** 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) { + protected void createReadAccess(IReadExecutable exec, InputPort p, List<IStatementTerm> body, + Deployment depl) { + IStatementTerm valueAssign = getPortValueAssignment(p, exec.getValueReadAccessor(p, depl)); + if(exec instanceof IReadExecutableWithNoValSupport) { IExpressionTerm guard = - ((IReadableExecutableWithNoValSupport)exec).getNoValGuardAccessor(p); + ((IReadExecutableWithNoValSupport)exec).getNoValGuardAccessor(p); StatementSequence thenBlock = sequence(getPortNoValAssignment(p)); StatementSequence elseBlock = sequence(valueAssign); body.add(ifthenelse(guard, thenBlock, elseBlock)); @@ -377,13 +386,13 @@ public class CoreExecutable extends ExecutionUnitExecutableBase<Core, CSourcePac } /** 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) { + protected void createWriteAccess(IWriteExecutable exec, OutputPort p, + List<IStatementTerm> body, Deployment depl) { + Assignment valueAssign = assignment(exec.getValueWriteAccessor(p, getPortValue(p), depl)); + if(exec instanceof IWriteExecutableWithNoValSupport) { IExpressionTerm guard = testPortVariableForNoVal(p); Assignment thenBlock = - assignment(((IWritableExecutableWithNoValSupport)exec).getNoValWriteAccessor(p)); + assignment(((IWriteExecutableWithNoValSupport)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/executable/SensorInExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/SensorInExecutable.java index d63aecf71d422c15771ca9b4cbb25e03d5fe4e3d..f4519c30dec688d1f968ad02ad714a3ee7ac65c2 100644 --- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/SensorInExecutable.java +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/SensorInExecutable.java @@ -21,12 +21,13 @@ import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.fun import static org.fortiss.tooling.base.utils.AnnotationUtils.getAnnotation; import org.fortiss.af3.component.model.InputPort; +import org.fortiss.af3.deployment.model.Deployment; import org.fortiss.af3.expression.model.terms.IExpressionTerm; import org.fortiss.af3.expression.utils.ExpressionModelElementFactory; -import org.fortiss.af3.platform.language.executable.IInitializableExecutable; -import org.fortiss.af3.platform.language.executable.IReadableExecutableWithNoValSupport; -import org.fortiss.af3.platform.language.executable.ITerminatableExecutable; import org.fortiss.af3.platform.language.executable.ReceiverExecutableBase; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.IReadExecutableWithNoValSupport; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.ITermExecutable; +import org.fortiss.af3.platform.raspberry.generator.executable.interfaces.InitExecutable; import org.fortiss.af3.platform.raspberry.model.SensorIn; import org.fortiss.af3.platform.raspberry.model.annotation.PinNumber; @@ -37,8 +38,8 @@ import org.fortiss.af3.platform.raspberry.model.annotation.PinNumber; * @version $Rev$ * @ConQAT.Rating RED Hash: */ -public class SensorInExecutable extends ReceiverExecutableBase<SensorIn> implements - IInitializableExecutable, ITerminatableExecutable, IReadableExecutableWithNoValSupport { +public class SensorInExecutable extends ReceiverExecutableBase<SensorIn> implements InitExecutable, + ITermExecutable, IReadExecutableWithNoValSupport { /** * @param modelElement @@ -48,21 +49,16 @@ public class SensorInExecutable extends ReceiverExecutableBase<SensorIn> impleme // TODO Auto-generated constructor stub } - // @Override - // public IExpressionTerm getValueReadAccessor(IExpressionTerm signal, IExpressionTerm buffer) { - // return funcCall("read_gpio", signal, buffer); - // } - /** {@inheritDoc} */ @Override public IExpressionTerm getInitialization() { - return funcCall("init_" + modelElement.getName()); + return funcCall("init_Sensor");// + modelElement.getName() } /** {@inheritDoc} */ @Override public IExpressionTerm getTermination() { - return funcCall("term_" + modelElement.getName()); + return funcCall("term_Sensor"); } /** {@inheritDoc} */ @@ -71,13 +67,64 @@ public class SensorInExecutable extends ReceiverExecutableBase<SensorIn> impleme PinNumber ias = getAnnotation(modelElement, PinNumber.class); int pinNr = ias.getPinNumber(); - return funcCall("read_Sensor",// + modelElement.getName() - ExpressionModelElementFactory.createVar(pinNr + "")); + return funcCall("read_Sensor", ExpressionModelElementFactory.createVar(pinNr + "")); } /** {@inheritDoc} */ @Override public IExpressionTerm getNoValGuardAccessor(InputPort logicalSignal) { - return funcCall("is_noval_" + modelElement.getName()); + return funcCall("is_noval_Sensor"); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getValueReadAccessor(InputPort logicalSignal, Deployment depl) { + PinNumber ias = getAnnotation(modelElement, PinNumber.class); + int pinNr = ias.getPinNumber(); + + return funcCall("read_Sensor", ExpressionModelElementFactory.createVar(pinNr + "")); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getNoValGuardAccessor(IExpressionTerm signal, IExpressionTerm buffer) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getTermination(IExpressionTerm signal) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getTermination(Deployment depl) { + // TODO Auto-generated method stub + return funcCall("term_Sensor"); + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(IExpressionTerm term) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(IExpressionTerm port, IExpressionTerm portName, + IExpressionTerm readOrWrite) { + // TODO Auto-generated method stub + return null; + } + + /** {@inheritDoc} */ + @Override + public IExpressionTerm getInitialization(Deployment depl) { + // TODO Auto-generated method stub + return funcCall("init_Sensor"); } } diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IReadExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IReadExecutable.java new file mode 100644 index 0000000000000000000000000000000000000000..4733385c9487874c14d0af29c35fe6f40a6ead1a --- /dev/null +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IReadExecutable.java @@ -0,0 +1,24 @@ +package org.fortiss.af3.platform.raspberry.generator.executable.interfaces; + +import org.fortiss.af3.component.model.InputPort; +import org.fortiss.af3.deployment.model.Deployment; +import org.fortiss.af3.expression.model.terms.IExpressionTerm; + +/** + * Interface for platform-specific executables, which support reading of a + * non-null value. + * + * @author zverlov + * @author $Author: zverlov $ + * @version $Rev: 3134 $ + * @ConQAT.Rating GREEN Hash: 9FCAD4E527DAF1B2A47B5FB0B252F468 + */ +public interface IReadExecutable { + + /** + * Returns a read access term to this executable for the given port's value. + */ + + IExpressionTerm getValueReadAccessor(InputPort logicalSignal, Deployment depl); + +} diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IReadExecutableWithNoValSupport.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IReadExecutableWithNoValSupport.java new file mode 100644 index 0000000000000000000000000000000000000000..f1f86e48382d5e4cc1287cb5659a836253714fc4 --- /dev/null +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IReadExecutableWithNoValSupport.java @@ -0,0 +1,28 @@ +package org.fortiss.af3.platform.raspberry.generator.executable.interfaces; + +import org.fortiss.af3.component.model.InputPort; +import org.fortiss.af3.expression.model.terms.IExpressionTerm; + +/** + * Interface for platform-specific executables, which also support reading of <code>null</code> + * values. + * + * @author zverlov + * @author $Author: zverlov $ + * @version $Rev: 5274 $ + * @ConQAT.Rating GREEN Hash: C508B83AB8E3F78306F62115213C7B5B + */ +public interface IReadExecutableWithNoValSupport extends IReadExecutable { + + /** + * Returns the read access term to the platform-specific executable's <code>null</code> value + * guard. + */ + IExpressionTerm getNoValGuardAccessor(IExpressionTerm signal, IExpressionTerm buffer); + + /** + * @param p + * @return + */ + IExpressionTerm getNoValGuardAccessor(InputPort p); +} diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/ITermExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/ITermExecutable.java new file mode 100644 index 0000000000000000000000000000000000000000..3a36ec75214fadc49f73db3a03979bfeffd27f5a --- /dev/null +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/ITermExecutable.java @@ -0,0 +1,33 @@ +package org.fortiss.af3.platform.raspberry.generator.executable.interfaces; + +import org.fortiss.af3.deployment.model.Deployment; +import org.fortiss.af3.expression.model.terms.IExpressionTerm; + +/** + * Interface implemented by platform-specific executables, which need + * termination when system goes down. + * + * @author zverlov + * @author $Author: zverlov $ + * @version $Rev: 4114 $ + * @ConQAT.Rating GREEN Hash: 9CD3B3AB64293053C6EE40AEED83A686 + */ +public interface ITermExecutable { + + /** + * Returns an termination term of the platform-specific executable. Usually + * a function call to the hardware abstraction layer is returned here. + */ + public abstract IExpressionTerm getTermination(IExpressionTerm signal); + + /** + * @param depl + * @return + */ + IExpressionTerm getTermination(Deployment depl); + + /** + * @return + */ + IExpressionTerm getTermination(); +} diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IWriteExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IWriteExecutable.java new file mode 100644 index 0000000000000000000000000000000000000000..42fbab381f9eb84e84f859fe394798b46edfc126 --- /dev/null +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IWriteExecutable.java @@ -0,0 +1,40 @@ +package org.fortiss.af3.platform.raspberry.generator.executable.interfaces; + +import org.fortiss.af3.component.model.OutputPort; +import org.fortiss.af3.deployment.model.Deployment; +import org.fortiss.af3.expression.model.terms.IExpressionTerm; + +/** + * Interface for platform-specific executables, which support writing of a + * non-null value. + * + * @author zverlov + * @author $Author: zverlov $ + * @version $Rev: 5274 $ + * @ConQAT.Rating YELLOW Hash: 5F918B896286A3F5A3B240C3917B2A45 + */ +public interface IWriteExecutable { + + /** + * Returns a write access term to this executable for the given value and + * output port. + */ + /* IExpressionTerm getValueWriteAccessor(IExpressionTerm signal, IExpressionTerm port); */ + + /** + * Returns a Write Accessor. + */ + /* + * IExpressionTerm getValueWriteAccessor(IExpressionTerm signal, IExpressionTerm port, + * IExpressionTerm pin, ActuatorType_t actuatorType); + */ + + /** + * @param logicalSignal + * @param value + * @param depl + * @return + */ + IExpressionTerm getValueWriteAccessor(OutputPort logicalSignal, IExpressionTerm value, + Deployment depl); +} diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IWriteExecutableWithNoValSupport.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IWriteExecutableWithNoValSupport.java new file mode 100644 index 0000000000000000000000000000000000000000..1afa2e0b7681bf1dd3f6a3469f54b1f456e8921f --- /dev/null +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/IWriteExecutableWithNoValSupport.java @@ -0,0 +1,21 @@ +package org.fortiss.af3.platform.raspberry.generator.executable.interfaces; + +import org.fortiss.af3.component.model.OutputPort; +import org.fortiss.af3.expression.model.terms.IExpressionTerm; + +/** + * Interface for platform-specific executables, which also support writing of <code>null</code> + * values. + * + * @author zverlov + * @author $Author: zverlov $ + * @version $Rev: 5274 $ + * @ConQAT.Rating GREEN Hash: EE592DF39E033B60DBBFC8EF071A43C3 + */ +public interface IWriteExecutableWithNoValSupport extends IWriteExecutable { + + /** + * Returns a write access term to this executable for the given output port. + */ + IExpressionTerm getNoValWriteAccessor(OutputPort p); +} diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/InitExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/InitExecutable.java new file mode 100644 index 0000000000000000000000000000000000000000..00f9d30012a7faa48905caffe458a41f5005391d --- /dev/null +++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/interfaces/InitExecutable.java @@ -0,0 +1,68 @@ +/*--------------------------------------------------------------------------+ +$Id: PikeosPartitionExecutable.java 10808 2014-05-27 09:00:26Z zverlov $ +| | +| Copyright 2014 ForTISS GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ + +package org.fortiss.af3.platform.raspberry.generator.executable.interfaces; + +import org.fortiss.af3.deployment.model.Deployment; +import org.fortiss.af3.expression.model.terms.IExpressionTerm; + +/** + * Interface implemented by platform-specific executables, which need + * initialization during system start-up. + * + * @author chaudhary + * @author $Author: chaudhary $ + * @version $Rev: 10810 $ + * @ConQAT.Rating GREEN Hash: E1C77D8E8AD1D2AA9F058E3034D6B88E + */ +public interface InitExecutable { + + /** + * Returns the expression term for ports initialization. + * + * @param term + * the expression term + * @return expression term for ports initialization + */ + public abstract IExpressionTerm getInitialization(IExpressionTerm term); + + /** + * Returns the expression term for ports initialization. + * + * @param port + * the port which needs to be initialized + * @param portName + * name of the port + * @param readOrWrite + * input or output port + * @return expression term for ports initialization + */ + public abstract IExpressionTerm getInitialization(IExpressionTerm port, + IExpressionTerm portName, IExpressionTerm readOrWrite); + + /** + * @param depl + * @return + */ + IExpressionTerm getInitialization(Deployment depl); + + /** + * @return + */ + IExpressionTerm getInitialization(); +}