diff --git a/ros2rag.base/.gitignore b/ragconnect.base/.gitignore similarity index 100% rename from ros2rag.base/.gitignore rename to ragconnect.base/.gitignore diff --git a/ros2rag.base/build.gradle b/ragconnect.base/build.gradle similarity index 55% rename from ros2rag.base/build.gradle rename to ragconnect.base/build.gradle index a6a7882eeee6db3cc34887d5b8cce3fe267905d5..7bfebcfe84f3d6f53a6ceb997eb0108610135e31 100644 --- a/ros2rag.base/build.gradle +++ b/ragconnect.base/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'application' sourceCompatibility = 1.8 -mainClassName = 'org.jastadd.ros2rag.compiler.Compiler' +mainClassName = 'org.jastadd.ragconnect.compiler.Compiler' repositories { jcenter() @@ -17,12 +17,32 @@ buildscript { } dependencies { + implementation project(':relast.preprocessor') implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.6' implementation group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.11.2' runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4' api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' } +def versionFile = 'src/main/resources/ragConnectVersion.properties' +def oldProps = new Properties() + +try { + file(versionFile).withInputStream { stream -> oldProps.load(stream) } + version = oldProps['version'] +} catch (e) { + // this happens, if either the properties file is not present, or cannot be read from + throw new GradleException("File ${versionFile} not found or unreadable. Aborting.", e) +} + +task newVersion() { + doFirst { + def props = new Properties() + props['version'] = value + props.store(file(versionFile).newWriter(), null) + } +} + sourceSets { main { java.srcDir "src/gen/java" @@ -37,7 +57,7 @@ test { jar { manifest { - attributes "Main-Class": 'org.jastadd.ros2rag.compiler.Compiler' + attributes "Main-Class": 'org.jastadd.ragconnect.compiler.Compiler' } from { @@ -51,47 +71,47 @@ task relast(type: JavaExec) { doFirst { delete "src/gen/jastadd/*.ast" - delete "src/gen/jastadd/Ros2Rag.jadd" - delete "src/gen/jastadd/Ros2RagRefResolver.jadd" - delete "src/gen/jastadd/Ros2RagResolverStubs.jrag" + delete "src/gen/jastadd/RagConnect.jadd" + delete "src/gen/jastadd/RagConnectRefResolver.jadd" + delete "src/gen/jastadd/RagConnectResolverStubs.jrag" mkdir "src/gen/jastadd/" } args = [ "../libs/relast.jar", "../relast.preprocessor/src/main/jastadd/RelAst.relast", - "./src/main/jastadd/Ros2Rag.relast", + "./src/main/jastadd/RagConnect.relast", "./src/main/jastadd/MustacheNodes.relast", "--listClass=java.util.ArrayList", "--jastAddList=JastAddList", "--useJastAddNames", "--file", "--resolverHelper", - "--grammarName=./src/gen/jastadd/Ros2Rag" + "--grammarName=./src/gen/jastadd/RagConnect" ] inputs.files file("../libs/relast.jar"), file("../relast.preprocessor/src/main/jastadd/RelAST.relast"), - file("./src/main/jastadd/Ros2Rag.relast") + file("./src/main/jastadd/RagConnect.relast") file("./src/main/jastadd/MustacheNodes.relast") - outputs.files file("./src/gen/jastadd/Ros2Rag.ast"), - file("./src/gen/jastadd/Ros2Rag.jadd"), - file("./src/gen/jastadd/Ros2RagRefResolver.jadd"), - file('./src/gen/jastadd/Ros2RagResolverStubs.jrag') + outputs.files file("./src/gen/jastadd/RagConnect.ast"), + file("./src/gen/jastadd/RagConnect.jadd"), + file("./src/gen/jastadd/RagConnectRefResolver.jadd"), + file('./src/gen/jastadd/RagConnectResolverStubs.jrag') } jastadd { configureModuleBuild() modules { //noinspection GroovyAssignabilityCheck - module("Ros2Rag") { + module("RagConnect") { java { basedir ".." include "relast.preprocessor/main/**/*.java" include "relast.preprocessor/gen/**/*.java" - include "ros2rag.base/src/main/**/*.java" - include "ros2rag.base/src/gen/**/*.java" + include "ragconnect.base/src/main/**/*.java" + include "ragconnect.base/src/gen/**/*.java" } jastadd { @@ -99,23 +119,23 @@ jastadd { include "relast.preprocessor/src/main/jastadd/**/*.ast" include "relast.preprocessor/src/main/jastadd/**/*.jadd" include "relast.preprocessor/src/main/jastadd/**/*.jrag" - include "ros2rag.base/src/main/jastadd/**/*.ast" - include "ros2rag.base/src/main/jastadd/**/*.jadd" - include "ros2rag.base/src/main/jastadd/**/*.jrag" - include "ros2rag.base/src/gen/jastadd/**/*.ast" - include "ros2rag.base/src/gen/jastadd/**/*.jadd" - include "ros2rag.base/src/gen/jastadd/**/*.jrag" + include "ragconnect.base/src/main/jastadd/**/*.ast" + include "ragconnect.base/src/main/jastadd/**/*.jadd" + include "ragconnect.base/src/main/jastadd/**/*.jrag" + include "ragconnect.base/src/gen/jastadd/**/*.ast" + include "ragconnect.base/src/gen/jastadd/**/*.jadd" + include "ragconnect.base/src/gen/jastadd/**/*.jrag" } scanner { basedir ".." - include "ros2rag.base/src/main/jastadd/scanner/Header.flex", [-5] + include "ragconnect.base/src/main/jastadd/scanner/Header.flex", [-5] include "relast.preprocessor/src/main/jastadd/scanner/Preamble.flex", [-4] include "relast.preprocessor/src/main/jastadd/scanner/Macros.flex", [-3] - include "ros2rag.base/src/main/jastadd/scanner/Macros.flex", [-3] + include "ragconnect.base/src/main/jastadd/scanner/Macros.flex", [-3] include "relast.preprocessor/src/main/jastadd/scanner/RulesPreamble.flex", [-2] - include "ros2rag.base/src/main/jastadd/scanner/MappingContent.flex", [-1] - include "ros2rag.base/src/main/jastadd/scanner/Keywords.flex" + include "ragconnect.base/src/main/jastadd/scanner/MappingContent.flex", [-1] + include "ragconnect.base/src/main/jastadd/scanner/Keywords.flex" include "relast.preprocessor/src/main/jastadd/scanner/Keywords.flex" include "relast.preprocessor/src/main/jastadd/scanner/Symbols.flex", [1] include "relast.preprocessor/src/main/jastadd/scanner/RulesPostamble.flex", [2] @@ -123,8 +143,8 @@ jastadd { parser { basedir ".." - include "ros2rag.base/src/main/jastadd/parser/Preamble.parser" - include "ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser" + include "ragconnect.base/src/main/jastadd/parser/Preamble.parser" + include "ragconnect.base/src/main/jastadd/parser/RagConnect.parser" include "relast.preprocessor/src/main/jastadd/parser/RelAst.parser" } } @@ -141,18 +161,18 @@ jastadd { } - module = "Ros2Rag" + module = "RagConnect" - astPackage = 'org.jastadd.ros2rag.ast' + astPackage = 'org.jastadd.ragconnect.ast' - parser.name = 'Ros2RagParser' + parser.name = 'RagConnectParser' genDir = 'src/gen/java' buildInfoDir = 'src/gen-res' - scanner.genDir = "src/gen/java/org/jastadd/ros2rag/scanner" - parser.genDir = "src/gen/java/org/jastadd/ros2rag/parser" + scanner.genDir = "src/gen/java/org/jastadd/ragconnect/scanner" + parser.genDir = "src/gen/java/org/jastadd/ragconnect/parser" jastaddOptions = ["--lineColumnNumbers", "--List=JastAddList", "--safeLazy", "--visitCheck=true", "--rewrite=cnta", "--cache=all"] } diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag new file mode 100644 index 0000000000000000000000000000000000000000..623a3f0ad8c0457d8d0606bf70dea0adfea89ea4 --- /dev/null +++ b/ragconnect.base/src/main/jastadd/Analysis.jrag @@ -0,0 +1,27 @@ +aspect Analysis { + // --- lookupTokenEndpointDefinition --- + inh TokenEndpointDefinition TokenEndpointDefinition.lookupTokenEndpointDefinition(TokenComponent token); + eq RagConnect.getEndpointDefinition().lookupTokenEndpointDefinition(TokenComponent token) { + for (EndpointDefinition def : getEndpointDefinitionList()) { + if (def.isTokenEndpointDefinition() && def.asTokenEndpointDefinition().getToken().equals(token)) { + return def.asTokenEndpointDefinition(); + } + } + return null; + } + + // --- lookupDependencyDefinition --- + inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id); + eq RagConnect.getDependencyDefinition().lookupDependencyDefinition(TypeDecl source, String id) { + for (DependencyDefinition def : getDependencyDefinitionList()) { + if (def.getID().equals(id) && def.getSource().containingTypeDecl().equals(source)) { + return def; + } + } + return null; + } + + // --- isAlreadyDefined --- + syn boolean TokenEndpointDefinition.isAlreadyDefined() = lookupTokenEndpointDefinition(getToken()) != this; + syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this; +} diff --git a/ros2rag.base/src/main/jastadd/Errors.jrag b/ragconnect.base/src/main/jastadd/Errors.jrag similarity index 69% rename from ros2rag.base/src/main/jastadd/Errors.jrag rename to ragconnect.base/src/main/jastadd/Errors.jrag index ef223a4081e169273555140a35a9f8b47876109d..bfee2545d4bee28223b04ce931ccd6a6429cf13f 100644 --- a/ros2rag.base/src/main/jastadd/Errors.jrag +++ b/ragconnect.base/src/main/jastadd/Errors.jrag @@ -3,50 +3,50 @@ import java.util.TreeSet; import java.util.LinkedList; aspect Errors { - coll Set<ErrorMessage> Ros2Rag.errors() + coll Set<ErrorMessage> RagConnect.errors() [new TreeSet<ErrorMessage>()] - root Ros2Rag; + root RagConnect; - ReadFromMqttDefinition contributes error("Read definition already defined for " + getToken().getName()) + ReceiveFromMqttDefinition contributes error("Receive definition already defined for " + getToken().getName()) when isAlreadyDefined() - to Ros2Rag.errors(); + to RagConnect.errors(); - ReadFromMqttDefinition contributes error("Reading target token must not be an NTA token!") + ReceiveFromMqttDefinition contributes error("Receiving target token must not be an NTA token!") when getToken().getNTA() - to Ros2Rag.errors(); + to RagConnect.errors(); // if first mapping is null, then suitableDefaultMapping() == null - ReadFromMqttDefinition contributes error("No suitable default mapping found for type " + + ReceiveFromMqttDefinition contributes error("No suitable default mapping found for type " + ((getMappingList().isEmpty()) ? getToken().getJavaTypeUse().prettyPrint() : getMappingList().get(0).getFromType().prettyPrint())) when effectiveMappings().get(0) == null - to Ros2Rag.errors(); + to RagConnect.errors(); - ReadFromMqttDefinition contributes error("to-type of last mapping must be type of the Token!") + ReceiveFromMqttDefinition contributes error("to-type of last mapping must be type of the Token!") when getToken().getJavaTypeUse().prettyPrint().equals( effectiveMappings().get(effectiveMappings().size() - 1)) - to Ros2Rag.errors(); + to RagConnect.errors(); - WriteToMqttDefinition contributes error("Writing target token must be an NTA token!") + SendToMqttDefinition contributes error("Sending target token must be an NTA token!") when !getToken().getNTA() - to Ros2Rag.errors(); + to RagConnect.errors(); - WriteToMqttDefinition contributes error("Write definition already defined for " + getToken().getName()) + SendToMqttDefinition contributes error("Send definition already defined for " + getToken().getName()) when isAlreadyDefined() - to Ros2Rag.errors(); + to RagConnect.errors(); DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID()) when isAlreadyDefined() - to Ros2Rag.errors(); + to RagConnect.errors(); DependencyDefinition contributes error("The name of a dependency definition must not be equal to a list-node on the source") when isAlreadyDefinedAsList() - to Ros2Rag.errors(); + to RagConnect.errors(); - DependencyDefinition contributes error("There must be a write update definition targeting " + getSource().parentTypeypeAndName() + " for dependency definition " + getID()) - when targetUpdateDefinition() == null - to Ros2Rag.errors(); + DependencyDefinition contributes error("There must be a send update definition targeting " + getSource().parentTypeypeAndName() + " for dependency definition " + getID()) + when targetEndpointDefinition() == null + to RagConnect.errors(); } aspect ErrorHelpers { diff --git a/ragconnect.base/src/main/jastadd/MustacheNodes.relast b/ragconnect.base/src/main/jastadd/MustacheNodes.relast new file mode 100644 index 0000000000000000000000000000000000000000..ce85caba554d1f582079b299f457d7675ab12dfa --- /dev/null +++ b/ragconnect.base/src/main/jastadd/MustacheNodes.relast @@ -0,0 +1,22 @@ +//TypeComponentMustache ; +//rel TypeComponentMustache.TypeComponent -> TypeComponent ; + +MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*; +abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*; +MReceiveDefinition : MEndpointDefinition; +MSendDefinition : MEndpointDefinition; +MMappingDefinition; +MInnerMappingDefinition; +MDependencyDefinition; +MTypeComponent; +MTokenComponent; + +rel MRagConnect.RagConnect -> RagConnect; +rel MInnerMappingDefinition.MappingDefinition -> MappingDefinition; +rel MReceiveDefinition.ReceiveFromMqttDefinition -> ReceiveFromMqttDefinition; +rel MSendDefinition.SendToMqttDefinition -> SendToMqttDefinition; +rel MMappingDefinition.MappingDefinition -> MappingDefinition; +rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition; +rel MTypeComponent.TypeComponent -> TypeComponent; +rel MTokenComponent.TokenComponent -> TokenComponent; +rel MTokenComponent.DependencyDefinition* -> MDependencyDefinition; diff --git a/ros2rag.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag similarity index 57% rename from ros2rag.base/src/main/jastadd/NameResolution.jrag rename to ragconnect.base/src/main/jastadd/NameResolution.jrag index fc4485858d199f352c18fcd188914020666ef619..f282ba55983feeae814e12823ff31f1d6480b6a8 100644 --- a/ros2rag.base/src/main/jastadd/NameResolution.jrag +++ b/ragconnect.base/src/main/jastadd/NameResolution.jrag @@ -1,8 +1,8 @@ aspect NameResolution { - refine RefResolverStubs eq UpdateDefinition.resolveMappingByToken(String id, int position) { + refine RefResolverStubs eq EndpointDefinition.resolveMappingByToken(String id, int position) { // return a MappingDefinition - for (MappingDefinition mappingDefinition : ros2rag().getMappingDefinitionList()) { + for (MappingDefinition mappingDefinition : ragconnect().getMappingDefinitionList()) { if (mappingDefinition.getID().equals(id)) { return mappingDefinition; } diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag new file mode 100644 index 0000000000000000000000000000000000000000..2314386eb9f74ecb5699d6fba91956e80f75fa63 --- /dev/null +++ b/ragconnect.base/src/main/jastadd/Navigation.jrag @@ -0,0 +1,54 @@ +aspect Navigation { + + // --- program --- + eq RagConnect.getChild().program() = getProgram(); + eq MRagConnect.getChild().program() = getRagConnect().program(); + + // --- ragconnect --- + inh RagConnect ASTNode.ragconnect(); + eq RagConnect.getChild().ragconnect() = this; + eq MRagConnect.getChild().ragconnect() = getRagConnect(); + + // --- containedFile + eq RagConnect.getChild().containedFile() = null; + + // --- containedFileName --- + eq RagConnect.getChild().containedFileName() = getFileName(); + eq MRagConnect.getChild().containedFileName() = null; + + // --- isTokenEndpointDefinition --- + syn boolean EndpointDefinition.isTokenEndpointDefinition() = false; + eq TokenEndpointDefinition.isTokenEndpointDefinition() = true; + + // --- asTokenEndpointDefinition --- + syn TokenEndpointDefinition EndpointDefinition.asTokenEndpointDefinition() = null; + eq TokenEndpointDefinition.asTokenEndpointDefinition() = this; + + // --- isSendToMqttDefinition --- + syn boolean EndpointDefinition.isSendToMqttDefinition() = false; + eq SendToMqttDefinition.isSendToMqttDefinition() = true; + + // --- asSendToMqttDefinition --- + syn SendToMqttDefinition EndpointDefinition.asSendToMqttDefinition() = null; + eq SendToMqttDefinition.asSendToMqttDefinition() = this; + + // --- asReceiveFromMqttDefinition --- + syn ReceiveFromMqttDefinition EndpointDefinition.asReceiveFromMqttDefinition() = null; + eq ReceiveFromMqttDefinition.asReceiveFromMqttDefinition() = this; + + // --- targetEndpointDefinition --- + syn SendToMqttDefinition DependencyDefinition.targetEndpointDefinition() { + // resolve definition in here, as we do not need resolveMethod in any other place (yet) + for (EndpointDefinition endpointDefinition : ragconnect().getEndpointDefinitionList()) { + if (endpointDefinition.isSendToMqttDefinition() && + endpointDefinition.asSendToMqttDefinition().getToken().equals(this.getTarget())) { + return endpointDefinition.asSendToMqttDefinition(); + } + } + return null; + } + + // --- isDefaultMappingDefinition --- + syn boolean MappingDefinition.isDefaultMappingDefinition() = false; + eq DefaultMappingDefinition.isDefaultMappingDefinition() = true; +} diff --git a/ros2rag.base/src/main/jastadd/Ros2Rag.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast similarity index 55% rename from ros2rag.base/src/main/jastadd/Ros2Rag.relast rename to ragconnect.base/src/main/jastadd/RagConnect.relast index e1a84e8beac44fcbc23d09fc56ed536586bde4e8..d30116efae1a6735e88922e31f42f99911c6532a 100644 --- a/ros2rag.base/src/main/jastadd/Ros2Rag.relast +++ b/ragconnect.base/src/main/jastadd/RagConnect.relast @@ -1,14 +1,14 @@ -Ros2Rag ::= UpdateDefinition* DependencyDefinition* MappingDefinition* Program <FileName> ; +RagConnect ::= EndpointDefinition* DependencyDefinition* MappingDefinition* Program <FileName> ; -abstract UpdateDefinition ::= <AlwaysApply:boolean> ; +abstract EndpointDefinition ::= <AlwaysApply:boolean> ; -rel UpdateDefinition.Mapping* -> MappingDefinition; +rel EndpointDefinition.Mapping* -> MappingDefinition; -abstract TokenUpdateDefinition : UpdateDefinition; -rel TokenUpdateDefinition.Token -> TokenComponent; +abstract TokenEndpointDefinition : EndpointDefinition; +rel TokenEndpointDefinition.Token -> TokenComponent; -ReadFromMqttDefinition : TokenUpdateDefinition; -WriteToMqttDefinition : TokenUpdateDefinition; +ReceiveFromMqttDefinition : TokenEndpointDefinition; +SendToMqttDefinition : TokenEndpointDefinition; DependencyDefinition ::= <ID>; rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*; diff --git a/ros2rag.base/src/main/jastadd/backend/Configuration.jadd b/ragconnect.base/src/main/jastadd/backend/Configuration.jadd similarity index 100% rename from ros2rag.base/src/main/jastadd/backend/Configuration.jadd rename to ragconnect.base/src/main/jastadd/backend/Configuration.jadd diff --git a/ros2rag.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd similarity index 59% rename from ros2rag.base/src/main/jastadd/backend/Generation.jadd rename to ragconnect.base/src/main/jastadd/backend/Generation.jadd index 9179b3d5ad520e4a3255a5b26c7ea86deaeef50b..067626ed42f12add896ca4eea7c65917309c0e2e 100644 --- a/ros2rag.base/src/main/jastadd/backend/Generation.jadd +++ b/ragconnect.base/src/main/jastadd/backend/Generation.jadd @@ -26,39 +26,40 @@ aspect GenerationUtils { */ aspect AttributesForMustache { - // --- MRos2Rag --- - eq MRos2Rag.getChild().mqttHandlerAttribute() = mqttHandlerAttribute(); - eq MRos2Rag.getChild().mqttHandlerField() = mqttHandlerField(); + // --- MRagConnect --- + eq MRagConnect.getChild().mqttHandlerAttribute() = mqttHandlerAttribute(); + eq MRagConnect.getChild().mqttHandlerField() = mqttHandlerField(); + eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0; - syn String MRos2Rag.mqttHandlerAttribute() = getRos2Rag().mqttHandlerAttribute(); - syn String MRos2Rag.mqttHandlerField() = getRos2Rag().mqttHandlerField(); - syn String MRos2Rag.mqttSetHostMethod() = getRos2Rag().mqttSetHostMethod(); - syn String MRos2Rag.mqttWaitUntilReadyMethod() = getRos2Rag().mqttWaitUntilReadyMethod(); - syn String MRos2Rag.mqttCloseMethod() = getRos2Rag().mqttCloseMethod(); + syn String MRagConnect.mqttHandlerAttribute() = getRagConnect().mqttHandlerAttribute(); + syn String MRagConnect.mqttHandlerField() = getRagConnect().mqttHandlerField(); + syn String MRagConnect.mqttSetHostMethod() = getRagConnect().mqttSetHostMethod(); + syn String MRagConnect.mqttWaitUntilReadyMethod() = getRagConnect().mqttWaitUntilReadyMethod(); + syn String MRagConnect.mqttCloseMethod() = getRagConnect().mqttCloseMethod(); - // --- MUpdateDefinition --- - syn String MUpdateDefinition.preemptiveExpectedValue(); - syn String MUpdateDefinition.preemptiveReturn(); - syn TokenUpdateDefinition MUpdateDefinition.updateDef(); - syn String MUpdateDefinition.firstInputVarName(); + // --- MEndpointDefinition --- + syn String MEndpointDefinition.preemptiveExpectedValue(); + syn String MEndpointDefinition.preemptiveReturn(); + syn TokenEndpointDefinition MEndpointDefinition.endpointDef(); + syn String MEndpointDefinition.firstInputVarName(); - eq MUpdateDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; - eq MUpdateDefinition.getInnerMappingDefinition().resultVarPrefix() = resultVarPrefix(); - eq MUpdateDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : resultVarPrefix() + getInnerMappingDefinition(i - 1).getMappingDefinition().methodName(); + eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; + eq MEndpointDefinition.getInnerMappingDefinition().resultVarPrefix() = resultVarPrefix(); + eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : resultVarPrefix() + getInnerMappingDefinition(i - 1).getMappingDefinition().methodName(); - inh String MUpdateDefinition.mqttHandlerAttribute(); + inh String MEndpointDefinition.mqttHandlerAttribute(); - syn String MUpdateDefinition.connectMethod() = updateDef().connectMethod(); - syn TokenComponent MUpdateDefinition.token() = updateDef().getToken(); - syn boolean MUpdateDefinition.alwaysApply() = updateDef().getAlwaysApply(); - syn String MUpdateDefinition.resultVarPrefix() = "result"; // we do not need "_" here, because methodName begins with one - syn String MUpdateDefinition.parentTypeName() = token().containingTypeDecl().getName(); - syn String MUpdateDefinition.tokenName() = token().getName(); - syn MInnerMappingDefinition MUpdateDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1); - syn String MUpdateDefinition.lastDefinitionToType() = lastDefinition().ToType(); - syn String MUpdateDefinition.lastDefinitionName() = lastDefinition().methodName(); - syn String MUpdateDefinition.lastResult() = resultVarPrefix() + lastDefinitionName(); - syn String MUpdateDefinition.condition() { + syn String MEndpointDefinition.connectMethod() = endpointDef().connectMethod(); + syn TokenComponent MEndpointDefinition.token() = endpointDef().getToken(); + syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply(); + syn String MEndpointDefinition.resultVarPrefix() = "result"; // we do not need "_" here, because methodName begins with one + syn String MEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName(); + syn String MEndpointDefinition.tokenName() = token().getName(); + syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1); + syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().ToType(); + syn String MEndpointDefinition.lastDefinitionName() = lastDefinition().methodName(); + syn String MEndpointDefinition.lastResult() = resultVarPrefix() + lastDefinitionName(); + syn String MEndpointDefinition.condition() { if (lastDefinition().getMappingDefinition().getToType().isArray()) { return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")"; } @@ -78,23 +79,23 @@ aspect AttributesForMustache { syn String MInnerMappingDefinition.methodName() = getMappingDefinition().methodName(); inh String MInnerMappingDefinition.inputVarName(); - // --- MReadDefinition --- - eq MReadDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()"; - eq MReadDefinition.preemptiveReturn() = "return;"; - eq MReadDefinition.updateDef() = getReadFromMqttDefinition(); - eq MReadDefinition.firstInputVarName() = "message"; + // --- MReceiveDefinition --- + eq MReceiveDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()"; + eq MReceiveDefinition.preemptiveReturn() = "return;"; + eq MReceiveDefinition.endpointDef() = getReceiveFromMqttDefinition(); + eq MReceiveDefinition.firstInputVarName() = "message"; - // --- MWriteDefinition --- - eq MWriteDefinition.preemptiveExpectedValue() = lastValue(); - eq MWriteDefinition.preemptiveReturn() = "return false;"; - eq MWriteDefinition.updateDef() = getWriteToMqttDefinition(); - eq MWriteDefinition.firstInputVarName() = "get" + tokenName() + "()"; + // --- MSendDefinition --- + eq MSendDefinition.preemptiveExpectedValue() = lastValue(); + eq MSendDefinition.preemptiveReturn() = "return false;"; + eq MSendDefinition.endpointDef() = getSendToMqttDefinition(); + eq MSendDefinition.firstInputVarName() = "get" + tokenName() + "()"; - syn String MWriteDefinition.writeTopic() = getWriteToMqttDefinition().writeTopic(); - syn String MWriteDefinition.lastValue() = getWriteToMqttDefinition().lastValue(); - syn String MWriteDefinition.updateMethod() = getWriteToMqttDefinition().updateMethod(); - syn String MWriteDefinition.writeMethod() = getWriteToMqttDefinition().writeMethod(); - syn String MWriteDefinition.tokenResetMethod() = getWriteToMqttDefinition().tokenResetMethod(); + syn String MSendDefinition.sendTopic() = getSendToMqttDefinition().sendTopic(); + syn String MSendDefinition.lastValue() = getSendToMqttDefinition().lastValue(); + syn String MSendDefinition.updateMethod() = getSendToMqttDefinition().updateMethod(); + syn String MSendDefinition.writeMethod() = getSendToMqttDefinition().writeMethod(); + syn String MSendDefinition.tokenResetMethod() = getSendToMqttDefinition().tokenResetMethod(); // --- MMappingDefinition --- syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint(); @@ -108,14 +109,15 @@ aspect AttributesForMustache { syn String MDependencyDefinition.dependencyMethod() = getDependencyDefinition().dependencyMethod(); syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName(); syn String MDependencyDefinition.internalRelationPrefix() = getDependencyDefinition().internalRelationPrefix(); - syn nta MUpdateDefinition MDependencyDefinition.targetUpdateDefinition() { - return getDependencyDefinition().targetUpdateDefinition().toMustache(); + syn nta MEndpointDefinition MDependencyDefinition.targetEndpointDefinition() { + return getDependencyDefinition().targetEndpointDefinition().toMustache(); } // --- MTypeComponent --- syn String MTypeComponent.name() = getTypeComponent().getName(); inh String MTypeComponent.mqttHandlerAttribute(); inh String MTypeComponent.mqttHandlerField(); + inh boolean MTypeComponent.isFirst(); // --- MTokenComponent --- syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName(); @@ -124,14 +126,14 @@ aspect AttributesForMustache { syn String MTokenComponent.internalName() = getTokenComponent().internalName(); // --- toMustache --- - syn lazy MRos2Rag Ros2Rag.toMustache() { - MRos2Rag result = new MRos2Rag(); - result.setRos2Rag(this); - for (UpdateDefinition def : getUpdateDefinitionList()) { - if (def.isWriteToMqttDefinition()) { - result.addWriteDefinition(def.asWriteToMqttDefinition().toMustache()); + syn lazy MRagConnect RagConnect.toMustache() { + MRagConnect result = new MRagConnect(); + result.setRagConnect(this); + for (EndpointDefinition def : getEndpointDefinitionList()) { + if (def.isSendToMqttDefinition()) { + result.addSendDefinition(def.asSendToMqttDefinition().toMustache()); } else { - result.addReadDefinition(def.asReadFromMqttDefinition().toMustache()); + result.addReceiveDefinition(def.asReceiveFromMqttDefinition().toMustache()); } } for (MappingDefinition def : allMappingDefinitions()) { @@ -154,22 +156,22 @@ aspect AttributesForMustache { } //MInnerMappingDefinition.MappingDefinition -> MappingDefinition; - protected void MUpdateDefinition.addInnerMappings() { - for (MappingDefinition def : updateDef().effectiveMappings()) { + protected void MEndpointDefinition.addInnerMappings() { + for (MappingDefinition def : endpointDef().effectiveMappings()) { MInnerMappingDefinition inner = new MInnerMappingDefinition(); inner.setMappingDefinition(def); addInnerMappingDefinition(inner); } } - syn lazy MReadDefinition ReadFromMqttDefinition.toMustache() { - MReadDefinition result = new MReadDefinition(); - result.setReadFromMqttDefinition(this); + syn lazy MReceiveDefinition ReceiveFromMqttDefinition.toMustache() { + MReceiveDefinition result = new MReceiveDefinition(); + result.setReceiveFromMqttDefinition(this); result.addInnerMappings(); return result; } - syn lazy MWriteDefinition WriteToMqttDefinition.toMustache() { - MWriteDefinition result = new MWriteDefinition(); - result.setWriteToMqttDefinition(this); + syn lazy MSendDefinition SendToMqttDefinition.toMustache() { + MSendDefinition result = new MSendDefinition(); + result.setSendToMqttDefinition(this); result.addInnerMappings(); return result; } @@ -203,12 +205,12 @@ aspect AspectGeneration { syn String TokenComponent.internalName() = getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + getName(); syn String TokenComponent.externalName() = getName(); - syn String TokenUpdateDefinition.connectMethod() = "connect" + getToken().getName(); - syn String WriteToMqttDefinition.writeTopic() = "_topic_" + getToken().getName(); - syn String WriteToMqttDefinition.lastValue() = "_lastValue" + getToken().getName(); - syn String WriteToMqttDefinition.updateMethod() = "_update_" + getToken().getName(); - syn String WriteToMqttDefinition.writeMethod() = "_writeLastValue_" + getToken().getName(); - syn String WriteToMqttDefinition.tokenResetMethod() = "get" + getToken().getName() + "_reset"; + syn String TokenEndpointDefinition.connectMethod() = "connect" + getToken().getName(); + syn String SendToMqttDefinition.sendTopic() = "_topic_" + getToken().getName(); + syn String SendToMqttDefinition.lastValue() = "_lastValue" + getToken().getName(); + syn String SendToMqttDefinition.updateMethod() = "_update_" + getToken().getName(); + syn String SendToMqttDefinition.writeMethod() = "_writeLastValue_" + getToken().getName(); + syn String SendToMqttDefinition.tokenResetMethod() = "get" + getToken().getName() + "_reset"; syn String MappingDefinition.methodName() = "_apply_" + getID(); syn String DependencyDefinition.dependencyMethod() = "add" + Character.toUpperCase(getID().charAt(0)) + @@ -216,29 +218,29 @@ aspect AspectGeneration { syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID(); syn String DependencyDefinition.internalTokenName() = getSource().internalName(); - syn String Ros2Rag.mqttHandlerAttribute() = "_mqttHandler"; - syn String Ros2Rag.mqttHandlerField() = "_mqttHandler"; + syn String RagConnect.mqttHandlerAttribute() = "_mqttHandler"; + syn String RagConnect.mqttHandlerField() = "_mqttHandler"; - syn String Ros2Rag.mqttSetHostMethod() = "MqttSetHost"; - syn String Ros2Rag.mqttWaitUntilReadyMethod() = "MqttWaitUntilReady"; - syn String Ros2Rag.mqttCloseMethod() = "MqttCloseConnections"; + syn String RagConnect.mqttSetHostMethod() = "MqttSetHost"; + syn String RagConnect.mqttWaitUntilReadyMethod() = "MqttWaitUntilReady"; + syn String RagConnect.mqttCloseMethod() = "MqttCloseConnections"; // naming copy attributes // --- mqttHandlerAttribute --- - inh String UpdateDefinition.mqttHandlerAttribute(); + inh String EndpointDefinition.mqttHandlerAttribute(); inh String MappingDefinition.mqttHandlerAttribute(); inh String DependencyDefinition.mqttHandlerAttribute(); - eq Ros2Rag.getChild().mqttHandlerAttribute() = mqttHandlerAttribute(); + eq RagConnect.getChild().mqttHandlerAttribute() = mqttHandlerAttribute(); // --- rootNodeName --- syn String ASTNode.rootNodeName() = rootNode.getName(); - public String Ros2Rag.generateAspect(String rootNodeName) { + public String RagConnect.generateAspect(String rootNodeName) { rootNode = getProgram().resolveTypeDecl(rootNodeName); return toMustache().generateAspect(); } - public String MRos2Rag.generateAspect() { + public String MRagConnect.generateAspect() { StringBuilder sb = new StringBuilder(); com.github.mustachejava.reflect.ReflectionObjectHandler roh = new com.github.mustachejava.reflect.ReflectionObjectHandler() { @Override @@ -257,14 +259,14 @@ aspect AspectGeneration { }; com.github.mustachejava.DefaultMustacheFactory mf = new com.github.mustachejava.DefaultMustacheFactory(); mf.setObjectHandler(roh); - com.github.mustachejava.Mustache m = mf.compile("ros2rag.mustache"); - m.execute(new java.io.PrintWriter(new org.jastadd.ros2rag.compiler.AppendableWriter(sb)), this); + com.github.mustachejava.Mustache m = mf.compile("ragconnect.mustache"); + m.execute(new java.io.PrintWriter(new org.jastadd.ragconnect.compiler.AppendableWriter(sb)), this); return sb.toString(); } } aspect RelationGeneration { - syn java.util.List<Relation> Ros2Rag.additionalRelations() { + syn java.util.List<Relation> RagConnect.additionalRelations() { java.util.List<Relation> result = new java.util.ArrayList<>(); for (DependencyDefinition dd : getDependencyDefinitionList()) { result.add(dd.getRelationToCreate()); @@ -280,6 +282,7 @@ aspect RelationGeneration { right.setType(getSource().containingTypeDecl()); result.setLeft(left); result.setRight(right); + result.addComment(new WhitespaceComment("\n")); return result; } } diff --git a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag b/ragconnect.base/src/main/jastadd/backend/Mappings.jrag similarity index 72% rename from ros2rag.base/src/main/jastadd/backend/Mappings.jrag rename to ragconnect.base/src/main/jastadd/backend/Mappings.jrag index 600ce92ee064f45fe0f41860dd3ab0bc5e334bd3..07cbf5b81a531638ac092635f915ed856a65df4c 100644 --- a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag +++ b/ragconnect.base/src/main/jastadd/backend/Mappings.jrag @@ -1,6 +1,6 @@ aspect DefaultMappings { - private DefaultMappingDefinition Ros2Rag.baseDefaultMappingDefinitionFromBytes(String typeName) { + private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinitionFromBytes(String typeName) { DefaultMappingDefinition result = new DefaultMappingDefinition(); result.setID("_DefaultBytesTo" + Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1) + "Mapping"); result.setFromType(new JavaArrayMappingDefinitionType(new SimpleJavaTypeUse("byte"))); @@ -9,7 +9,7 @@ aspect DefaultMappings { return result; } - private DefaultMappingDefinition Ros2Rag.baseDefaultMappingDefinitionToBytes(String typeName) { + private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinitionToBytes(String typeName) { DefaultMappingDefinition result = new DefaultMappingDefinition(); result.setID("_Default" + Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1) + "ToBytesMapping"); result.setFromType(new JavaMappingDefinitionType(new SimpleJavaTypeUse(typeName))); @@ -18,85 +18,85 @@ aspect DefaultMappings { return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToIntMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultBytesToIntMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("int"); result.setContent("return java.nio.ByteBuffer.wrap(bytes).getInt();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToShortMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultBytesToShortMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("short"); result.setContent("return java.nio.ByteBuffer.wrap(bytes).getShort();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToLongMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultBytesToLongMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("long"); result.setContent("return java.nio.ByteBuffer.wrap(bytes).getLong();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToFloatMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultBytesToFloatMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("float"); result.setContent("return java.nio.ByteBuffer.wrap(bytes).getFloat();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToDoubleMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultBytesToDoubleMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("double"); result.setContent("return java.nio.ByteBuffer.wrap(bytes).getDouble();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToCharMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultBytesToCharMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("char"); result.setContent("return java.nio.ByteBuffer.wrap(bytes).getChar();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToStringMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultBytesToStringMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("String"); result.setContent("return new String(bytes);"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultIntToBytesMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultIntToBytesMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("int"); result.setContent("return java.nio.ByteBuffer.allocate(4).putInt(input).array();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultShortToBytesMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultShortToBytesMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("short"); result.setContent("return java.nio.ByteBuffer.allocate(2).putShort(input).array();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultLongToBytesMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultLongToBytesMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("long"); result.setContent("return java.nio.ByteBuffer.allocate(8).putLong(input).array();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultFloatToBytesMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultFloatToBytesMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("float"); result.setContent("return java.nio.ByteBuffer.allocate(4).putFloat(input).array();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultDoubleToBytesMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultDoubleToBytesMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("double"); result.setContent("return java.nio.ByteBuffer.allocate(8).putDouble(input).array();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultCharToBytesMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultCharToBytesMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("char"); result.setContent("return java.nio.ByteBuffer.allocate(2).putChar(input).array();"); return result; } - syn nta DefaultMappingDefinition Ros2Rag.defaultStringToBytesMapping() { + syn nta DefaultMappingDefinition RagConnect.defaultStringToBytesMapping() { DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("String"); result.setContent("return input.getBytes();"); return result; @@ -105,8 +105,8 @@ aspect DefaultMappings { aspect Mappings { // --- effectiveMappings --- - syn java.util.List<MappingDefinition> UpdateDefinition.effectiveMappings(); - eq ReadFromMqttDefinition.effectiveMappings() { + syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings(); + eq ReceiveFromMqttDefinition.effectiveMappings() { // if there is a first mapping, check if its input type is byte[]. // or if no mappings are specified. // then prepend the suitable default mapping @@ -120,7 +120,7 @@ aspect Mappings { } return result; } - eq WriteToMqttDefinition.effectiveMappings() { + eq SendToMqttDefinition.effectiveMappings() { // if there is a mapping, check if the output type of the last mapping is byte[]. // or if no mappings are specified. // then append the suitable default mapping @@ -159,46 +159,46 @@ aspect Mappings { eq JavaArrayMappingDefinitionType.isArray() = true; // --- suitableDefaultMapping --- - syn DefaultMappingDefinition UpdateDefinition.suitableDefaultMapping(); - eq ReadFromMqttDefinition.suitableDefaultMapping() { + syn DefaultMappingDefinition EndpointDefinition.suitableDefaultMapping(); + eq ReceiveFromMqttDefinition.suitableDefaultMapping() { String typeName = getMappingList().isEmpty() ? getToken().getJavaTypeUse().getName() : getMappingList().get(0).getFromType().prettyPrint(); switch(typeName) { case "int": - case "Integer": return ros2rag().defaultBytesToIntMapping(); + case "Integer": return ragconnect().defaultBytesToIntMapping(); case "short": - case "Short": return ros2rag().defaultBytesToShortMapping(); + case "Short": return ragconnect().defaultBytesToShortMapping(); case "long": - case "Long": return ros2rag().defaultBytesToLongMapping(); + case "Long": return ragconnect().defaultBytesToLongMapping(); case "float": - case "Float": return ros2rag().defaultBytesToFloatMapping(); + case "Float": return ragconnect().defaultBytesToFloatMapping(); case "double": - case "Double": return ros2rag().defaultBytesToDoubleMapping(); + case "Double": return ragconnect().defaultBytesToDoubleMapping(); case "char": - case "Character": return ros2rag().defaultBytesToCharMapping(); - case "String": return ros2rag().defaultBytesToStringMapping(); + case "Character": return ragconnect().defaultBytesToCharMapping(); + case "String": return ragconnect().defaultBytesToStringMapping(); default: return null; } } - eq WriteToMqttDefinition.suitableDefaultMapping() { + eq SendToMqttDefinition.suitableDefaultMapping() { String typeName = getMappingList().isEmpty() ? getToken().getJavaTypeUse().getName() : getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint(); switch(typeName) { case "int": - case "Integer": return ros2rag().defaultIntToBytesMapping(); + case "Integer": return ragconnect().defaultIntToBytesMapping(); case "short": - case "Short": return ros2rag().defaultShortToBytesMapping(); + case "Short": return ragconnect().defaultShortToBytesMapping(); case "long": - case "Long": return ros2rag().defaultLongToBytesMapping(); + case "Long": return ragconnect().defaultLongToBytesMapping(); case "float": - case "Float": return ros2rag().defaultFloatToBytesMapping(); + case "Float": return ragconnect().defaultFloatToBytesMapping(); case "double": - case "Double": return ros2rag().defaultDoubleToBytesMapping(); + case "Double": return ragconnect().defaultDoubleToBytesMapping(); case "char": - case "Character": return ros2rag().defaultCharToBytesMapping(); - case "String": return ros2rag().defaultStringToBytesMapping(); + case "Character": return ragconnect().defaultCharToBytesMapping(); + case "String": return ragconnect().defaultStringToBytesMapping(); default: return null; } } @@ -208,7 +208,7 @@ aspect Mappings { eq JavaArrayMappingDefinitionType.isByteArray() = getType().getName().equals("byte"); // --- allMappingDefinitions --- - syn java.util.List<MappingDefinition> Ros2Rag.allMappingDefinitions() { + syn java.util.List<MappingDefinition> RagConnect.allMappingDefinitions() { java.util.List<MappingDefinition> result = new java.util.ArrayList<>(); getMappingDefinitionList().iterator().forEachRemaining(result::add); result.add(defaultBytesToIntMapping()); diff --git a/ragconnect.base/src/main/jastadd/parser/Preamble.parser b/ragconnect.base/src/main/jastadd/parser/Preamble.parser new file mode 100644 index 0000000000000000000000000000000000000000..d701db19d6edb6d6c616bc79fc0145ea59d2713d --- /dev/null +++ b/ragconnect.base/src/main/jastadd/parser/Preamble.parser @@ -0,0 +1,7 @@ +%header {: +package org.jastadd.ragconnect.parser; +import org.jastadd.ragconnect.ast.*; +:}; + +%goal goal; +%goal ragconnect; diff --git a/ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser similarity index 70% rename from ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser rename to ragconnect.base/src/main/jastadd/parser/RagConnect.parser index 015b4e664950fd9f49601dbea53fc67225c41169..e2685c15555056c64d4f5e8bebdc458ecea981a3 100644 --- a/ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser +++ b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser @@ -1,9 +1,9 @@ -Ros2Rag ros2rag - = update_definition.d ros2rag.r {: r.getUpdateDefinitionList().insertChild(d, 0); return r; :} - | dependency_definition.d ros2rag.r {: r.getDependencyDefinitionList().insertChild(d, 0); return r; :} - | mapping_definition.d ros2rag.r {: r.getMappingDefinitionList().insertChild(d, 0); return r; :} - | comment ros2rag.r {: return r; :} - | {: return new Ros2Rag(); :} +RagConnect ragconnect + = endpoint_definition.d ragconnect.r {: r.getEndpointDefinitionList().insertChild(d, 0); return r; :} + | dependency_definition.d ragconnect.r {: r.getDependencyDefinitionList().insertChild(d, 0); return r; :} + | mapping_definition.d ragconnect.r {: r.getMappingDefinitionList().insertChild(d, 0); return r; :} + | comment ragconnect.r {: return r; :} + | {: return new RagConnect(); :} ; %embed {: @@ -12,31 +12,31 @@ Ros2Rag ros2rag } :} ; -UpdateDefinition update_definition - = READ ID.type_name DOT ID.token_name SCOL +EndpointDefinition endpoint_definition + = RECEIVE ID.type_name DOT ID.token_name SCOL {: - ReadFromMqttDefinition result = new ReadFromMqttDefinition(); + ReceiveFromMqttDefinition result = new ReceiveFromMqttDefinition(); result.setToken(TokenComponent.createRef(type_name + "." + token_name)); return result; :} - | READ ID.type_name DOT ID.token_name USING string_list.mapping_defs SCOL + | RECEIVE ID.type_name DOT ID.token_name USING string_list.mapping_defs SCOL {: - ReadFromMqttDefinition result = new ReadFromMqttDefinition(); + ReceiveFromMqttDefinition result = new ReceiveFromMqttDefinition(); result.setToken(TokenComponent.createRef(type_name + "." + token_name)); for (String mapping_def : makeMappingDefs(mapping_defs)) { result.addMapping(MappingDefinition.createRef(mapping_def)); } return result; :} - | WRITE ID.type_name DOT ID.token_name SCOL + | SEND ID.type_name DOT ID.token_name SCOL {: - WriteToMqttDefinition result = new WriteToMqttDefinition(); + SendToMqttDefinition result = new SendToMqttDefinition(); result.setToken(TokenComponent.createRef(type_name + "." + token_name)); return result; :} - | WRITE ID.type_name DOT ID.token_name USING string_list.mapping_defs SCOL + | SEND ID.type_name DOT ID.token_name USING string_list.mapping_defs SCOL {: - WriteToMqttDefinition result = new WriteToMqttDefinition(); + SendToMqttDefinition result = new SendToMqttDefinition(); result.setToken(TokenComponent.createRef(type_name + "." + token_name)); for (String mapping_def : makeMappingDefs(mapping_defs)) { result.addMapping(MappingDefinition.createRef(mapping_def)); diff --git a/ragconnect.base/src/main/jastadd/scanner/Header.flex b/ragconnect.base/src/main/jastadd/scanner/Header.flex new file mode 100644 index 0000000000000000000000000000000000000000..f289a7e89438a572e3dd936548355cf600d3b8bd --- /dev/null +++ b/ragconnect.base/src/main/jastadd/scanner/Header.flex @@ -0,0 +1,20 @@ +package org.jastadd.ragconnect.scanner; + +import org.jastadd.ragconnect.parser.RagConnectParser.Terminals; +%% + +%public +%final +%class RagConnectScanner +%extends beaver.Scanner + +%type beaver.Symbol +%function nextToken +%yylexthrow beaver.Scanner.Exception +%scanerror RagConnectScanner.ScannerError + +%x COMMENT +%s DECLARATION + +%line +%column diff --git a/ros2rag.base/src/main/jastadd/scanner/Keywords.flex b/ragconnect.base/src/main/jastadd/scanner/Keywords.flex similarity index 62% rename from ros2rag.base/src/main/jastadd/scanner/Keywords.flex rename to ragconnect.base/src/main/jastadd/scanner/Keywords.flex index 3f546823fd8e034f821c8e867d8777ef697effdd..5773118d8fda8ffdc536b504aa7056b8784ddfb3 100644 --- a/ros2rag.base/src/main/jastadd/scanner/Keywords.flex +++ b/ragconnect.base/src/main/jastadd/scanner/Keywords.flex @@ -1,5 +1,5 @@ -"read" { return sym(Terminals.READ); } -"write" { return sym(Terminals.WRITE); } +"receive" { yybegin(DECLARATION); return sym(Terminals.RECEIVE); } +"send" { yybegin(DECLARATION); return sym(Terminals.SEND); } "using" { return sym(Terminals.USING); } "canDependOn" { return sym(Terminals.CAN_DEPEND_ON); } "maps" { return sym(Terminals.MAPS); } diff --git a/ros2rag.base/src/main/jastadd/scanner/Macros.flex b/ragconnect.base/src/main/jastadd/scanner/Macros.flex similarity index 100% rename from ros2rag.base/src/main/jastadd/scanner/Macros.flex rename to ragconnect.base/src/main/jastadd/scanner/Macros.flex diff --git a/ros2rag.base/src/main/jastadd/scanner/MappingContent.flex b/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex similarity index 100% rename from ros2rag.base/src/main/jastadd/scanner/MappingContent.flex rename to ragconnect.base/src/main/jastadd/scanner/MappingContent.flex diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/AppendableWriter.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java similarity index 93% rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/AppendableWriter.java rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java index 97680b18dc4fd1d8af3df75f35221e059355e19e..55818dcda1c89948726065c9d11640fcb6601130 100644 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/AppendableWriter.java +++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java @@ -1,4 +1,4 @@ -package org.jastadd.ros2rag.compiler; +package org.jastadd.ragconnect.compiler; import java.io.IOException; import java.io.Writer; diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java new file mode 100644 index 0000000000000000000000000000000000000000..8b33412c7994b5443088de6249273b9b83374414 --- /dev/null +++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java @@ -0,0 +1,235 @@ +package org.jastadd.ragconnect.compiler; + +import beaver.Parser; +import org.jastadd.option.BooleanOption; +import org.jastadd.option.ValueOption; +import org.jastadd.relast.compiler.AbstractCompiler; +import org.jastadd.relast.compiler.CompilerException; +import org.jastadd.ragconnect.ast.*; +import org.jastadd.ragconnect.parser.RagConnectParser; +import org.jastadd.ragconnect.scanner.RagConnectScanner; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.Collection; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Compiler extends AbstractCompiler { + +// private ValueOption optionOutputDir; + private ValueOption optionRootNode; + private BooleanOption optionVerbose; + private BooleanOption optionLogReads; + private BooleanOption optionLogWrites; + + public Compiler() { + super("ragconnect", true); + } + + @Override + protected int compile() throws CompilerException { + if (getConfiguration().shouldPrintVersion()) { + System.out.println(readVersion()); + return 0; + } + if (getConfiguration().shouldPrintHelp()) { + getConfiguration().printHelp(System.out); + return 0; + } + + printMessage("Running RagConnect " + readVersion()); + + if (!getConfiguration().outputDir().exists()) { + try { + Files.createDirectories(getConfiguration().outputDir().toPath()); + } catch (IOException e) { + throw new CompilerException("Error creating output dir " + getConfiguration().outputDir(), e); + } + } + + RagConnect ragConnect = parseProgram(getConfiguration().getFiles()); + + if (!ragConnect.errors().isEmpty()) { + System.err.println("Errors:"); + for (ErrorMessage e : ragConnect.errors()) { + System.err.println(e); + } + System.exit(1); + } + + printMessage("Writing output files"); + // copy MqttHandler into outputDir + final String mqttHandlerFileName = "MqttHandler.jadd"; + try { + InputStream inputStream = Compiler.class.getClassLoader().getResourceAsStream(mqttHandlerFileName); + if (inputStream == null) { + throw new CompilerException("Could not open " + mqttHandlerFileName); + } + Files.copy(inputStream, + getConfiguration().outputDir().toPath().resolve(mqttHandlerFileName), + StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + throw new CompilerException("Could not copy " + mqttHandlerFileName, e); + } + for (GrammarFile grammarFile : ragConnect.getProgram().getGrammarFileList()) { + Path outputFile = getConfiguration().outputDir().toPath().resolve(grammarFile.getFileName()); + sendToFile(outputFile, grammarFile.generateAbstractGrammar()); + } + sendToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.jadd"), ragConnect.generateAspect(optionRootNode.value())); + return 0; + } + + public static void main(String[] args) { + System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); + System.setProperty("mustache.debug", "true"); + try { + new Compiler().run(args); + } catch (CompilerException e) { + System.err.println(e.getMessage()); + System.exit(-1); + } + } + + /** + * Reads the version string. + * + * The version string is read from the property file + * src/main/resources/Version.properties. This + * file should be generated during the build process. If it is missing + * then there is some problem in the build script. + * + * @author Jesper Öqvist <jesper.oqvist@cs.lth.se> + * @return the read version string, or <code>version ?</code> + */ + private String readVersion() { + try { + ResourceBundle resources = ResourceBundle.getBundle("ragConnectVersion"); + return resources.getString("version"); + } catch (MissingResourceException e) { + return "version ?"; + } + } + + private void printMessage(String message) { + System.out.println(message); + } + + private void sendToFile(Path path, String str) throws CompilerException { + try (BufferedWriter writer = Files.newBufferedWriter(path)) { + writer.append(str); + } catch (Exception e) { + throw new CompilerException("Could not write to file " + path.toAbsolutePath(), e); + } + } + + protected void initOptions() { + super.initOptions(); + optionRootNode = addOption( + new ValueOption("rootNode", "root node in the base grammar.") + .acceptAnyValue() + .needsValue(true)); + optionVerbose = addOption( + new BooleanOption("verbose", "Print more messages while compiling.") + .defaultValue(false)); + optionLogReads = addOption( + new BooleanOption("logReads", "Enable logging for every read.") + .defaultValue(false)); + optionLogWrites = addOption( + new BooleanOption("logWrites", "Enable logging for every write.") + .defaultValue(false)); + } + + private RagConnect parseProgram(Collection<String> files) throws CompilerException { + Program program = new Program(); + + RagConnect ragConnect = new RagConnect(); + ragConnect.setProgram(program); + + GrammarFile ragConnectGrammarPart = new GrammarFile(); + ragConnectGrammarPart.setFileName("RagConnect.relast"); + program.addGrammarFile(ragConnectGrammarPart); + + for (String filename : files) { + String extension = filename.substring(filename.lastIndexOf('.') + 1); + switch (extension) { + case "ast": + case "relast": + // processGrammar + parseGrammar(program, filename); + break; + case "connect": + // process ragConnect + RagConnect parsedRagConnect = parseRagConnect(program, filename); + mergeRagConnectDefinitions(ragConnect, parsedRagConnect); + break; + default: + throw new CompilerException("Unknown file extension in " + filename); + } + } + ragConnect.treeResolveAll(); + ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration); + ASTNode.loggingEnabledForReads = optionLogReads.value(); + ASTNode.loggingEnabledForWrites = optionLogWrites.value(); + return ragConnect; + } + + private void parseGrammar(Program program, String filename) throws CompilerException { + try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) { + RagConnectScanner scanner = new RagConnectScanner(reader); + RagConnectParser parser = new RagConnectParser(); + GrammarFile grammarFile = (GrammarFile) parser.parse(scanner); + if (optionVerbose.value()) { + grammarFile.dumpTree(System.out); + } + program.addGrammarFile(grammarFile); + grammarFile.treeResolveAll(); + grammarFile.setFileName(toBaseName(filename)); + } catch (IOException | Parser.Exception e) { + throw new CompilerException("Could not parse grammar file " + filename, e); + } + } + + private RagConnect parseRagConnect(Program program, String filename) throws CompilerException { + try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) { + RagConnectScanner scanner = new RagConnectScanner(reader); + RagConnectParser parser = new RagConnectParser(); + RagConnect ragConnect = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect); + ragConnect.setProgram(program); + ragConnect.setFileName(toBaseName(filename)); + return ragConnect; + } catch (IOException | Parser.Exception e) { + throw new CompilerException("Could not parse connect file " + filename, e); + } + } + + /** + * Extracts the basename of the given file, with file extension + * @param filename the given filename + * @return the basename + */ + private String toBaseName(String filename) { + return new File(filename).getName(); + } + + private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) { + for (EndpointDefinition endpointDefinition : ragConnectToIntegrate.getEndpointDefinitionList()) { + ragConnect.addEndpointDefinition(endpointDefinition); + } + for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) { + ragConnect.addMappingDefinition(mappingDefinition); + } + for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) { + ragConnect.addDependencyDefinition(dependencyDefinition); + } + } + +// protected void printUsage() { +// System.out.println("Usage: java -jar ragconnect.jar [--option1] [--option2=value] ... <filename1> <filename2> ... "); +// System.out.println("Options:"); +// System.out.print(commandLine.printOptionHelp()); +// } +} diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/SimpleMain.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java similarity index 75% rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/SimpleMain.java rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java index 74406f87a166732efedafbc772d114185f24e227..ac1109fef423ed58ebbbdfcaeacbdca42745e341 100644 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/SimpleMain.java +++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java @@ -1,9 +1,9 @@ -package org.jastadd.ros2rag.compiler; +package org.jastadd.ragconnect.compiler; import beaver.Parser; -import org.jastadd.ros2rag.ast.*; -import org.jastadd.ros2rag.parser.Ros2RagParser; -import org.jastadd.ros2rag.scanner.Ros2RagScanner; +import org.jastadd.ragconnect.ast.*; +import org.jastadd.ragconnect.parser.RagConnectParser; +import org.jastadd.ragconnect.scanner.RagConnectScanner; import java.io.BufferedReader; import java.io.IOException; @@ -102,18 +102,18 @@ public class SimpleMain { } public static void main(String[] args) { - testing(); -// createManualAST(); +// testing(); + createManualAST(); } private static void createManualAST() { - Ros2Rag model = new Ros2Rag(); - Program program = parseProgram(Paths.get("src", "test", "resources", "Example.relast")); + RagConnect model = new RagConnect(); + Program program = parseProgram(Paths.get("ros2rag.starter","src", "main", "jastadd", "RobotModel.relast")); model.setProgram(program); MappingDefinition mappingDefinition = new MappingDefinition(); mappingDefinition.setID("PoseToPosition"); - mappingDefinition.setFromType(makeMappingDefinitionType("PBPose")); + mappingDefinition.setFromType(makeMappingDefinitionType("int")); mappingDefinition.setFromVariableName("x"); mappingDefinition.setToType(makeMappingDefinitionType("Position")); mappingDefinition.setContent(" pose.position.x += sqrt(.5 * size.x)\n" + @@ -123,13 +123,16 @@ public class SimpleMain { " ;"); model.addMappingDefinition(mappingDefinition); - ReadFromMqttDefinition readFromMqttDefinition = new ReadFromMqttDefinition(); - readFromMqttDefinition.setAlwaysApply(false); - readFromMqttDefinition.setToken(TokenComponent.createRef("Joint.CurrentPosition")); - readFromMqttDefinition.addMapping(mappingDefinition); - model.addUpdateDefinition(readFromMqttDefinition); + ReceiveFromMqttDefinition receiveFromMqttDefinition = new ReceiveFromMqttDefinition(); + receiveFromMqttDefinition.setAlwaysApply(false); + receiveFromMqttDefinition.setToken(TokenComponent.createRef("Link.CurrentPosition")); + receiveFromMqttDefinition.addMapping(mappingDefinition); + model.addEndpointDefinition(receiveFromMqttDefinition); model.treeResolveAll(); + for (ErrorMessage error : model.errors()) { + System.err.println(error); + } System.out.println(model.generateAspect("Model")); } @@ -142,9 +145,12 @@ public class SimpleMain { private static Program parseProgram(Path path) { try (BufferedReader reader = Files.newBufferedReader(path)) { - Ros2RagScanner scanner = new Ros2RagScanner(reader); - Ros2RagParser parser = new Ros2RagParser(); - return (Program) parser.parse(scanner); + RagConnectScanner scanner = new RagConnectScanner(reader); + RagConnectParser parser = new RagConnectParser(); + GrammarFile grammarFile = (GrammarFile) parser.parse(scanner); + Program program = new Program(); + program.addGrammarFile(grammarFile); + return program; } catch (IOException | Parser.Exception e) { e.printStackTrace(); } diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Utils.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java similarity index 90% rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Utils.java rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java index 6a229cd7e9a2551578a87f1c7b5fcccfebd31ff7..c083fe1d912fa74cb4461fce5fcb839f5b88a40f 100644 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Utils.java +++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java @@ -1,4 +1,4 @@ -package org.jastadd.ros2rag.compiler; +package org.jastadd.ragconnect.compiler; import java.util.*; import java.util.function.Predicate; diff --git a/ros2rag.base/src/main/resources/MqttHandler.jadd b/ragconnect.base/src/main/resources/MqttHandler.jadd similarity index 99% rename from ros2rag.base/src/main/resources/MqttHandler.jadd rename to ragconnect.base/src/main/resources/MqttHandler.jadd index c3e98dc89377e6217946fafa54a9eb7ab7594c61..493d8e4452e81c5dbfa45a522a6366345908cdcc 100644 --- a/ros2rag.base/src/main/resources/MqttHandler.jadd +++ b/ragconnect.base/src/main/resources/MqttHandler.jadd @@ -24,7 +24,7 @@ public class MqttHandler { private final java.util.Map<String, java.util.List<java.util.function.Consumer<byte[]>>> callbacks; public MqttHandler() { - this("Ros2Rag"); + this("RagConnect"); } public MqttHandler(String name) { diff --git a/ros2rag.base/src/main/resources/dependencyDefinition.mustache b/ragconnect.base/src/main/resources/dependencyDefinition.mustache similarity index 100% rename from ros2rag.base/src/main/resources/dependencyDefinition.mustache rename to ragconnect.base/src/main/resources/dependencyDefinition.mustache diff --git a/ros2rag.base/src/main/resources/log4j2.xml b/ragconnect.base/src/main/resources/log4j2.xml similarity index 100% rename from ros2rag.base/src/main/resources/log4j2.xml rename to ragconnect.base/src/main/resources/log4j2.xml diff --git a/ros2rag.base/src/main/resources/mappingApplication.mustache b/ragconnect.base/src/main/resources/mappingApplication.mustache similarity index 100% rename from ros2rag.base/src/main/resources/mappingApplication.mustache rename to ragconnect.base/src/main/resources/mappingApplication.mustache diff --git a/ros2rag.base/src/main/resources/mappingDefinition.mustache b/ragconnect.base/src/main/resources/mappingDefinition.mustache similarity index 100% rename from ros2rag.base/src/main/resources/mappingDefinition.mustache rename to ragconnect.base/src/main/resources/mappingDefinition.mustache diff --git a/ros2rag.base/src/main/resources/mqtt.mustache b/ragconnect.base/src/main/resources/mqtt.mustache similarity index 92% rename from ros2rag.base/src/main/resources/mqtt.mustache rename to ragconnect.base/src/main/resources/mqtt.mustache index d65ca944a9dc7e881ff75d89ea696d4bb1fe09fc..dbdb85e7954dbf50ae7e150ffc43dd4cbda0fd80 100644 --- a/ros2rag.base/src/main/resources/mqtt.mustache +++ b/ragconnect.base/src/main/resources/mqtt.mustache @@ -16,8 +16,8 @@ aspect MQTT { {{mqttHandlerField}}.close(); } - inh MqttHandler ASTNode.{{mqttHandlerAttribute}}(); {{#getRootTypeComponents}} + {{#first}}inh MqttHandler ASTNode.{{mqttHandlerAttribute}}();{{/first}} eq {{rootNodeName}}.get{{name}}().{{mqttHandlerAttribute}}() = {{mqttHandlerField}}; {{/getRootTypeComponents}} } diff --git a/ragconnect.base/src/main/resources/ragConnectVersion.properties b/ragconnect.base/src/main/resources/ragConnectVersion.properties new file mode 100644 index 0000000000000000000000000000000000000000..8ec441610d66cd3f793075302676eb132eea35c3 --- /dev/null +++ b/ragconnect.base/src/main/resources/ragConnectVersion.properties @@ -0,0 +1,2 @@ +#Wed Jul 29 16:29:05 CEST 2020 +version=0.2.0 diff --git a/ros2rag.base/src/main/resources/ros2rag.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache similarity index 64% rename from ros2rag.base/src/main/resources/ros2rag.mustache rename to ragconnect.base/src/main/resources/ragconnect.mustache index dd5e73cf554e35cc20da014b2d83f0db1b88521b..0b455283977cf812a47b5266ee593c6597e97cc9 100644 --- a/ros2rag.base/src/main/resources/ros2rag.mustache +++ b/ragconnect.base/src/main/resources/ragconnect.mustache @@ -1,12 +1,12 @@ {{> mqtt}} aspect ROS2RAG { - {{#ReadDefinitions}} - {{> readDefinition}} - {{/ReadDefinitions}} + {{#ReceiveDefinitions}} + {{> receiveDefinition}} + {{/ReceiveDefinitions}} - {{#WriteDefinitions}} - {{> writeDefinition}} - {{/WriteDefinitions}} + {{#SendDefinitions}} + {{> sendDefinition}} + {{/SendDefinitions}} {{#MappingDefinitions}} {{> mappingDefinition}} diff --git a/ros2rag.base/src/main/resources/readDefinition.mustache b/ragconnect.base/src/main/resources/receiveDefinition.mustache similarity index 68% rename from ros2rag.base/src/main/resources/readDefinition.mustache rename to ragconnect.base/src/main/resources/receiveDefinition.mustache index 77235a277f5acdfee6c07dedf62e6bfa4e090055..e2df0433fe82b37df2c016887da52a11cfd2692b 100644 --- a/ros2rag.base/src/main/resources/readDefinition.mustache +++ b/ragconnect.base/src/main/resources/receiveDefinition.mustache @@ -2,7 +2,7 @@ {{mqttHandlerAttribute}}().newConnection(topic, message -> { {{> mappingApplication}} {{#loggingEnabledForReads}} - System.out.println("[Read] " + topic + " -> {{tokenName}} = " + {{lastResult}});{{!lastResult has to be a new attribute}} + System.out.println("[Receive] " + topic + " -> {{tokenName}} = " + {{lastResult}});{{!lastResult has to be a new attribute}} {{/loggingEnabledForReads}} set{{tokenName}}({{lastResult}}); }); diff --git a/ros2rag.base/src/main/resources/writeDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache similarity index 67% rename from ros2rag.base/src/main/resources/writeDefinition.mustache rename to ragconnect.base/src/main/resources/sendDefinition.mustache index 6e2e18476424269bc10e9e03ccfdd6444ff55762..477dbc550132af842e53e8fed2cbbee0c8996296 100644 --- a/ros2rag.base/src/main/resources/writeDefinition.mustache +++ b/ragconnect.base/src/main/resources/sendDefinition.mustache @@ -1,8 +1,8 @@ - private String {{parentTypeName}}.{{writeTopic}} = null; + private String {{parentTypeName}}.{{sendTopic}} = null; private byte[] {{parentTypeName}}.{{lastValue}} = null; public void {{parentTypeName}}.{{connectMethod}}(String topic, boolean writeCurrentValue) { - {{writeTopic}} = topic; + {{sendTopic}} = topic; {{updateMethod}}(); if (writeCurrentValue) { {{writeMethod}}(); @@ -18,7 +18,7 @@ protected void {{parentTypeName}}.{{writeMethod}}() { {{#loggingEnabledForWrites}} - System.out.println("[Write] {{tokenName}} = " + get{{tokenName}}() + " -> " + {{writeTopic}}); + System.out.println("[Send] {{tokenName}} = " + get{{tokenName}}() + " -> " + {{sendTopic}}); {{/loggingEnabledForWrites}} - {{mqttHandlerAttribute}}().publish({{writeTopic}}, {{lastValue}}); + {{mqttHandlerAttribute}}().publish({{sendTopic}}, {{lastValue}}); } diff --git a/ros2rag.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache similarity index 86% rename from ros2rag.base/src/main/resources/tokenComponent.mustache rename to ragconnect.base/src/main/resources/tokenComponent.mustache index a3615c4526e5725bdd49121b16a87a011562f0cd..e6a136d1c8de08b6dce9104fd46fafa5d91b67b6 100644 --- a/ros2rag.base/src/main/resources/tokenComponent.mustache +++ b/ragconnect.base/src/main/resources/tokenComponent.mustache @@ -2,11 +2,11 @@ set{{internalName}}(value); {{#DependencyDefinitions}} for ({{targetParentTypeName}} target : get{{internalRelationPrefix}}TargetList()) { - {{#targetUpdateDefinition}} + {{#targetEndpointDefinition}} if (target.{{updateMethod}}()) { target.{{writeMethod}}(); } - {{/targetUpdateDefinition}} + {{/targetEndpointDefinition}} } {{/DependencyDefinitions}} return this; diff --git a/ros2rag.starter/.gitignore b/ragconnect.tests/.gitignore similarity index 100% rename from ros2rag.starter/.gitignore rename to ragconnect.tests/.gitignore diff --git a/ros2rag.tests/README.md b/ragconnect.tests/README.md similarity index 100% rename from ros2rag.tests/README.md rename to ragconnect.tests/README.md diff --git a/ros2rag.tests/build.gradle b/ragconnect.tests/build.gradle similarity index 51% rename from ros2rag.tests/build.gradle rename to ragconnect.tests/build.gradle index efff9a553b1da39904b80933df36e4e4d809f526..d0a6997e48aac4caa7b4c5c0c249210c7276271d 100644 --- a/ros2rag.tests/build.gradle +++ b/ragconnect.tests/build.gradle @@ -1,6 +1,7 @@ import org.jastadd.relast.plugin.RelastPlugin import org.jastadd.relast.plugin.RelastTest apply plugin: 'jastadd' +apply plugin: 'com.google.protobuf' apply plugin: RelastPlugin sourceCompatibility = 1.8 @@ -13,12 +14,12 @@ buildscript { repositories.jcenter() dependencies { classpath 'org.jastadd:jastaddgradle:1.13.3' + classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' } } dependencies { - implementation project(':ros2rag.base') - implementation project(':ros2rag.common') + implementation project(':ragconnect.base') runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4' testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.0' @@ -26,6 +27,7 @@ dependencies { testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.12.1' testImplementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' testImplementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' + api group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0' } test { @@ -36,6 +38,13 @@ test { maxHeapSize = '1G' } +protobuf { + protoc { + // The artifact spec for the Protobuf Compiler + artifact = 'com.google.protobuf:protoc:3.0.0' + } +} + task allTests(type: Test, dependsOn: testClasses) { description = 'Run every test' group = 'verification' @@ -58,16 +67,16 @@ sourceSets { // --- Test: Example --- task preprocessExampleTest(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ros2rag/example/Grammar.relast', - 'src/test/02-after-ros2rag/example/MqttHandler.java', - 'src/test/02-after-ros2rag/example/ROS2RAG.jadd' + delete 'src/test/02-after-ragconnect/example/Test.relast', + 'src/test/02-after-ragconnect/example/MqttHandler.java', + 'src/test/02-after-ragconnect/example/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ros2rag.compiler.Compiler' - args '--outputDir=src/test/02-after-ros2rag/example', - '--inputGrammar=src/test/01-input/example/Test.relast', - '--inputRos2Rag=src/test/01-input/example/Test.ros2rag', + main = 'org.jastadd.ragconnect.compiler.Compiler' + args '--o=src/test/02-after-ragconnect/example', + 'src/test/01-input/example/Test.relast', + 'src/test/01-input/example/Test.connect', '--rootNode=Model', '--logReads', '--logWrites' } @@ -75,12 +84,13 @@ task preprocessExampleTest(type: JavaExec, group: 'verification') { task compileExampleTest(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ros2rag/example/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/example/Test.relast', + 'src/test/02-after-ragconnect/example/RagConnect.relast' grammarName = 'src/test/03-after-relast/example/example' packageName = 'example.ast' moreInputFiles 'src/test/01-input/example/Test.jadd', - 'src/test/02-after-ros2rag/example/MqttHandler.jadd', - 'src/test/02-after-ros2rag/example/ROS2RAG.jadd' + 'src/test/02-after-ragconnect/example/MqttHandler.jadd', + 'src/test/02-after-ragconnect/example/RagConnect.jadd' } testClasses.dependsOn compileExampleTest @@ -89,16 +99,16 @@ compileExampleTest.dependsOn preprocessExampleTest // --- Test: default-only-read --- task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ros2rag/defaultOnlyRead/Grammar.relast', - 'src/test/02-after-ros2rag/defaultOnlyRead/MqttHandler.java', - 'src/test/02-after-ros2rag/defaultOnlyRead/ROS2RAG.jadd' + delete 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast', + 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.java', + 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ros2rag.compiler.Compiler' - args '--outputDir=src/test/02-after-ros2rag/defaultOnlyRead', - '--inputGrammar=src/test/01-input/defaultOnlyRead/Test.relast', - '--inputRos2Rag=src/test/01-input/defaultOnlyRead/Test.ros2rag', + main = 'org.jastadd.ragconnect.compiler.Compiler' + args '--o=src/test/02-after-ragconnect/defaultOnlyRead', + 'src/test/01-input/defaultOnlyRead/Test.relast', + 'src/test/01-input/defaultOnlyRead/Test.connect', '--rootNode=A', '--verbose' } @@ -106,11 +116,12 @@ task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') { task compileDefaultOnlyReadTest(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ros2rag/defaultOnlyRead/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast', + 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.relast' grammarName = 'src/test/03-after-relast/defaultOnlyRead/defaultOnlyRead' packageName = 'defaultOnlyRead.ast' - moreInputFiles 'src/test/02-after-ros2rag/defaultOnlyRead/MqttHandler.jadd', - 'src/test/02-after-ros2rag/defaultOnlyRead/ROS2RAG.jadd' + moreInputFiles 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.jadd', + 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd' } testClasses.dependsOn compileDefaultOnlyReadTest @@ -119,16 +130,16 @@ compileDefaultOnlyReadTest.dependsOn preprocessDefaultOnlyReadTest // --- Test: default-only-write --- task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ros2rag/defaultOnlyWrite/Grammar.relast', - 'src/test/02-after-ros2rag/defaultOnlyWrite/MqttHandler.java', - 'src/test/02-after-ros2rag/defaultOnlyWrite/ROS2RAG.jadd' + delete 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast', + 'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.java', + 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ros2rag.compiler.Compiler' - args '--outputDir=src/test/02-after-ros2rag/defaultOnlyWrite', - '--inputGrammar=src/test/01-input/defaultOnlyWrite/Test.relast', - '--inputRos2Rag=src/test/01-input/defaultOnlyWrite/Test.ros2rag', + main = 'org.jastadd.ragconnect.compiler.Compiler' + args '--o=src/test/02-after-ragconnect/defaultOnlyWrite', + 'src/test/01-input/defaultOnlyWrite/Test.relast', + 'src/test/01-input/defaultOnlyWrite/Test.connect', '--rootNode=A', '--verbose' } @@ -136,12 +147,13 @@ task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') { task compileDefaultOnlyWriteTest(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ros2rag/defaultOnlyWrite/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast', + 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.relast' grammarName = 'src/test/03-after-relast/defaultOnlyWrite/defaultOnlyWrite' packageName = 'defaultOnlyWrite.ast' moreInputFiles 'src/test/01-input/defaultOnlyWrite/Test.jadd', - 'src/test/02-after-ros2rag/defaultOnlyWrite/MqttHandler.jadd', - 'src/test/02-after-ros2rag/defaultOnlyWrite/ROS2RAG.jadd' + 'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.jadd', + 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd' } testClasses.dependsOn compileDefaultOnlyWriteTest @@ -150,16 +162,16 @@ compileDefaultOnlyWriteTest.dependsOn preprocessDefaultOnlyWriteTest // --- Test: read1write2 --- task preprocessRead1Write2Test(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ros2rag/read1write2/Grammar.relast', - 'src/test/02-after-ros2rag/read1write2/MqttHandler.java', - 'src/test/02-after-ros2rag/read1write2/ROS2RAG.jadd' + delete 'src/test/02-after-ragconnect/read1write2/Test.relast', + 'src/test/02-after-ragconnect/read1write2/MqttHandler.java', + 'src/test/02-after-ragconnect/read1write2/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ros2rag.compiler.Compiler' - args '--outputDir=src/test/02-after-ros2rag/read1write2', - '--inputGrammar=src/test/01-input/read1write2/Test.relast', - '--inputRos2Rag=src/test/01-input/read1write2/Test.ros2rag', + main = 'org.jastadd.ragconnect.compiler.Compiler' + args '--o=src/test/02-after-ragconnect/read1write2', + 'src/test/01-input/read1write2/Test.relast', + 'src/test/01-input/read1write2/Test.connect', '--rootNode=A', '--logReads', '--logWrites' } @@ -167,12 +179,13 @@ task preprocessRead1Write2Test(type: JavaExec, group: 'verification') { task compileRead1Write2Test(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ros2rag/read1write2/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/read1write2/Test.relast', + 'src/test/02-after-ragconnect/read1write2/RagConnect.relast' grammarName = 'src/test/03-after-relast/read1write2/read1write2' packageName = 'read1write2.ast' moreInputFiles 'src/test/01-input/read1write2/Test.jadd', - 'src/test/02-after-ros2rag/read1write2/MqttHandler.jadd', - 'src/test/02-after-ros2rag/read1write2/ROS2RAG.jadd' + 'src/test/02-after-ragconnect/read1write2/MqttHandler.jadd', + 'src/test/02-after-ragconnect/read1write2/RagConnect.jadd' } testClasses.dependsOn compileRead1Write2Test @@ -181,16 +194,16 @@ compileRead1Write2Test.dependsOn preprocessRead1Write2Test // --- Test: read2write1 --- task preprocessRead2Write1Test(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ros2rag/read2write1/Grammar.relast', - 'src/test/02-after-ros2rag/read2write1/MqttHandler.java', - 'src/test/02-after-ros2rag/read2write1/ROS2RAG.jadd' + delete 'src/test/02-after-ragconnect/read2write1/Test.relast', + 'src/test/02-after-ragconnect/read2write1/MqttHandler.java', + 'src/test/02-after-ragconnect/read2write1/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ros2rag.compiler.Compiler' - args '--outputDir=src/test/02-after-ros2rag/read2write1', - '--inputGrammar=src/test/01-input/read2write1/Test.relast', - '--inputRos2Rag=src/test/01-input/read2write1/Test.ros2rag', + main = 'org.jastadd.ragconnect.compiler.Compiler' + args '--o=src/test/02-after-ragconnect/read2write1', + 'src/test/01-input/read2write1/Test.relast', + 'src/test/01-input/read2write1/Test.connect', '--rootNode=A', '--verbose', '--logReads', '--logWrites' } @@ -198,17 +211,18 @@ task preprocessRead2Write1Test(type: JavaExec, group: 'verification') { task compileRead2Write1Test(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ros2rag/read2write1/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/read2write1/Test.relast', + 'src/test/02-after-ragconnect/read2write1/RagConnect.relast' grammarName = 'src/test/03-after-relast/read2write1/read2write1' packageName = 'read2write1.ast' moreInputFiles 'src/test/01-input/read2write1/Test.jadd', - 'src/test/02-after-ros2rag/read2write1/MqttHandler.jadd', - 'src/test/02-after-ros2rag/read2write1/ROS2RAG.jadd' + 'src/test/02-after-ragconnect/read2write1/MqttHandler.jadd', + 'src/test/02-after-ragconnect/read2write1/RagConnect.jadd' } testClasses.dependsOn compileRead2Write1Test compileRead2Write1Test.dependsOn preprocessRead2Write1Test clean { - delete 'src/test/02-after-ros2rag/*/', 'src/test/03-after-relast/*/', 'src/test/java-gen/*/' + delete 'src/test/02-after-ragconnect/*/', 'src/test/03-after-relast/*/', 'src/test/java-gen/*/' } diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyRead/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md similarity index 100% rename from ros2rag.tests/src/test/01-input/defaultOnlyRead/README.md rename to ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect new file mode 100644 index 0000000000000000000000000000000000000000..e274994175513ff743409068375f419b6e3141fc --- /dev/null +++ b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect @@ -0,0 +1,15 @@ +// --- update definitions --- +receive NativeTypes.IntValue; +receive NativeTypes.ShortValue; +receive NativeTypes.LongValue; +receive NativeTypes.FloatValue; +receive NativeTypes.DoubleValue; +receive NativeTypes.CharValue; +receive NativeTypes.StringValue; + +receive BoxedTypes.IntValue; +receive BoxedTypes.ShortValue; +receive BoxedTypes.LongValue; +receive BoxedTypes.FloatValue; +receive BoxedTypes.DoubleValue; +receive BoxedTypes.CharValue; diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast similarity index 100% rename from ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.relast rename to ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md similarity index 100% rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/README.md rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.ros2rag b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect similarity index 61% rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.ros2rag rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect index 924cbe1732be63b1c75c05c75a86cd531fc0525d..a48f49f60f66c3358ee513e79f2bbeb43df8d5e9 100644 --- a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.ros2rag +++ b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect @@ -1,20 +1,20 @@ // --- update definitions --- // native types, synthesized -write NativeTypesSyn.IntValue; -write NativeTypesSyn.ShortValue; -write NativeTypesSyn.LongValue; -write NativeTypesSyn.FloatValue; -write NativeTypesSyn.DoubleValue; -write NativeTypesSyn.CharValue; -write NativeTypesSyn.StringValue; +send NativeTypesSyn.IntValue; +send NativeTypesSyn.ShortValue; +send NativeTypesSyn.LongValue; +send NativeTypesSyn.FloatValue; +send NativeTypesSyn.DoubleValue; +send NativeTypesSyn.CharValue; +send NativeTypesSyn.StringValue; // boxed types, synthesized -write BoxedTypesSyn.IntValue; -write BoxedTypesSyn.ShortValue; -write BoxedTypesSyn.LongValue; -write BoxedTypesSyn.FloatValue; -write BoxedTypesSyn.DoubleValue; -write BoxedTypesSyn.CharValue; +send BoxedTypesSyn.IntValue; +send BoxedTypesSyn.ShortValue; +send BoxedTypesSyn.LongValue; +send BoxedTypesSyn.FloatValue; +send BoxedTypesSyn.DoubleValue; +send BoxedTypesSyn.CharValue; // --- dependency definitions --- NativeTypesSyn.IntValue canDependOn NativeTypesSyn.DriverSyn as nativeIntDependency; @@ -34,18 +34,18 @@ BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependen // --- inherited attributes not supported --- //// native types, inherited -//write NativeTypesInh.IntValue; -//write NativeTypesInh.ShortValue; -//write NativeTypesInh.LongValue; -//write NativeTypesInh.FloatValue; -//write NativeTypesInh.DoubleValue; -//write NativeTypesInh.CharValue; -//write NativeTypesInh.StringValue; +//send NativeTypesInh.IntValue; +//send NativeTypesInh.ShortValue; +//send NativeTypesInh.LongValue; +//send NativeTypesInh.FloatValue; +//send NativeTypesInh.DoubleValue; +//send NativeTypesInh.CharValue; +//send NativeTypesInh.StringValue; // //// boxed types, inherited -//write BoxedTypesInh.IntValue; -//write BoxedTypesInh.ShortValue; -//write BoxedTypesInh.LongValue; -//write BoxedTypesInh.FloatValue; -//write BoxedTypesInh.DoubleValue; -//write BoxedTypesInh.CharValue; +//send BoxedTypesInh.IntValue; +//send BoxedTypesInh.ShortValue; +//send BoxedTypesInh.LongValue; +//send BoxedTypesInh.FloatValue; +//send BoxedTypesInh.DoubleValue; +//send BoxedTypesInh.CharValue; diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.jadd b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd similarity index 100% rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.jadd rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast similarity index 100% rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.relast rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast diff --git a/ros2rag.tests/src/test/01-input/errors/Errors.ros2rag b/ragconnect.tests/src/test/01-input/errors/Errors.connect similarity index 65% rename from ros2rag.tests/src/test/01-input/errors/Errors.ros2rag rename to ragconnect.tests/src/test/01-input/errors/Errors.connect index f8c05f0abe2ebed89a98839949e6c8f2cf20f044..bd57822a6c70198cc36698f790fa90655ed4db73 100644 --- a/ros2rag.tests/src/test/01-input/errors/Errors.ros2rag +++ b/ragconnect.tests/src/test/01-input/errors/Errors.connect @@ -1,60 +1,60 @@ -// --- update read definitions --- -// Error: there must not be two read definitions for the same token -read B.DoubledValue ; -read B.DoubledValue using IntToInt ; +// --- update receive definitions --- +// Error: there must not be two receive definitions for the same token +receive B.DoubledValue ; +receive B.DoubledValue using IntToInt ; // NOT HANDLED \\ Error: the token must be resolvable within the parent type -// NOT HANDLED \\ read B.NonExisting ; +// NOT HANDLED \\ receive B.NonExisting ; // Error: the Token must not be a TokenNTA (i.e., check for !Token.getNTA()) -read B.ErrorNTA ; +receive B.ErrorNTA ; // Error: from-type of first mapping must be byte[] or a supported primitive type -read B.ErrorTypeOfFirstMapping using ListToList ; +receive B.ErrorTypeOfFirstMapping using ListToList ; // Error: to-type of last mapping must be type of the Token -read B.ErrorTypeOfLastMapping using StringToList ; +receive B.ErrorTypeOfLastMapping using StringToList ; // Error: types of mappings must match (modulo inheritance) -read B.ErrorTypeMismatch using StringToList, IntToInt ; +receive B.ErrorTypeMismatch using StringToList, IntToInt ; -// --- update write definitions --- +// --- update send definitions --- // NOT HANDLED \\ Error: the token must be resolvable within the parent type -// NOT HANDLED \\ read C.NonExisting ; +// NOT HANDLED \\ receive C.NonExisting ; // Error: Token must be a TokenNTA (i.e., check for Token.getNTA()) -write C.ErrorNotNTA ; +send C.ErrorNotNTA ; // Error: from-type of first mapping must be type of Token -write C.ErrorTypeOfFirstMapping using IntToInt ; +send C.ErrorTypeOfFirstMapping using IntToInt ; // Error: to-type of last mapping must be byte[] or a supported primitive type -write C.ErrorTypeOfLastMapping1 using StringToList ; -write C.ErrorTypeOfLastMapping2 ; +send C.ErrorTypeOfLastMapping1 using StringToList ; +send C.ErrorTypeOfLastMapping2 ; // Error: types of mappings must match (modulo inheritance) -write C.ErrorTypeMismatch using StringToList, IntToInt ; +send C.ErrorTypeMismatch using StringToList, IntToInt ; -// Error: no more than one write mapping for each TokenComponent -write C.DoubledValue ; -write C.DoubledValue using IntToInt ; +// Error: no more than one send mapping for each TokenComponent +send C.DoubledValue ; +send C.DoubledValue using IntToInt ; // --- dependency definitions --- // NOT HANDLED \\ Error: Both, source and target must be resolvable within the parent type // NOT HANDLED \\ D.SourceNonExistingTarget canDependOn D.NonExisting as NonExistingTarget ; // NOT HANDLED \\ D.NonExisting canDependOn D.TargetNonExistingSource as NonExistingSource ; -// Error: There must be a write update definition for the target token +// Error: There must be a send update definition for the target token D.SourceNoWriteDef canDependOn D.TargetNoWriteDef as NoWriteDef ; // Error: The name of a dependency definition must not be equal to a list-node on the source D.SourceSameAsListNode canDependOn D.TargetSameAsListNode as MyList ; -write D.TargetSameAsListNode; +send D.TargetSameAsListNode; // Error: There must not be two dependency definitions with the same name D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ; D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ; -write D.TargetDoubledValue; +send D.TargetDoubledValue; // --- mapping definitions --- ListToList maps java.util.List<String> list to java.util.List<String> {: diff --git a/ros2rag.tests/src/test/01-input/errors/Errors.expected b/ragconnect.tests/src/test/01-input/errors/Errors.expected similarity index 100% rename from ros2rag.tests/src/test/01-input/errors/Errors.expected rename to ragconnect.tests/src/test/01-input/errors/Errors.expected diff --git a/ros2rag.tests/src/test/01-input/errors/Errors.relast b/ragconnect.tests/src/test/01-input/errors/Errors.relast similarity index 100% rename from ros2rag.tests/src/test/01-input/errors/Errors.relast rename to ragconnect.tests/src/test/01-input/errors/Errors.relast diff --git a/ros2rag.tests/src/test/01-input/errors/README.md b/ragconnect.tests/src/test/01-input/errors/README.md similarity index 100% rename from ros2rag.tests/src/test/01-input/errors/README.md rename to ragconnect.tests/src/test/01-input/errors/README.md diff --git a/ros2rag.tests/src/test/01-input/example/README.md b/ragconnect.tests/src/test/01-input/example/README.md similarity index 100% rename from ros2rag.tests/src/test/01-input/example/README.md rename to ragconnect.tests/src/test/01-input/example/README.md diff --git a/ros2rag.tests/src/test/01-input/example/Test.ros2rag b/ragconnect.tests/src/test/01-input/example/Test.connect similarity index 87% rename from ros2rag.tests/src/test/01-input/example/Test.ros2rag rename to ragconnect.tests/src/test/01-input/example/Test.connect index c916bfdca59f605ed090fa1171dc5e068fe23a8f..2a26051b743145ad8af6ad7b8ea84ad58ce1348f 100644 --- a/ros2rag.tests/src/test/01-input/example/Test.ros2rag +++ b/ragconnect.tests/src/test/01-input/example/Test.connect @@ -1,7 +1,7 @@ /* Version 2020-07-15 */ // --- update definitions --- -read Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ; -write RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; +receive Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ; +send RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; // --- dependency definitions --- RobotArm.AppropriateSpeed canDependOn Link.CurrentPosition as dependency1 ; diff --git a/ros2rag.tests/src/test/01-input/example/Test.jadd b/ragconnect.tests/src/test/01-input/example/Test.jadd similarity index 100% rename from ros2rag.tests/src/test/01-input/example/Test.jadd rename to ragconnect.tests/src/test/01-input/example/Test.jadd diff --git a/ros2rag.tests/src/test/01-input/example/Test.relast b/ragconnect.tests/src/test/01-input/example/Test.relast similarity index 100% rename from ros2rag.tests/src/test/01-input/example/Test.relast rename to ragconnect.tests/src/test/01-input/example/Test.relast diff --git a/ragconnect.tests/src/test/01-input/example/config.json b/ragconnect.tests/src/test/01-input/example/config.json new file mode 100644 index 0000000000000000000000000000000000000000..02843152a51197a04bce4e8e54ad4ec0f703eca5 --- /dev/null +++ b/ragconnect.tests/src/test/01-input/example/config.json @@ -0,0 +1,9 @@ +{ + "joints": [ + {"name": "Joint1", "topic": "robot/arm/joint1"}, + {"name": "Joint2", "topic": "robot/arm/joint2"}, + {"name": "EndEffector", "topic": "-", "isEndEffector": true} + ], + "robotConfigTopic": "robot/config", + "dataConfigTopic": "-" +} diff --git a/ros2rag.tests/src/test/01-input/read1write2/README.md b/ragconnect.tests/src/test/01-input/read1write2/README.md similarity index 100% rename from ros2rag.tests/src/test/01-input/read1write2/README.md rename to ragconnect.tests/src/test/01-input/read1write2/README.md diff --git a/ros2rag.tests/src/test/01-input/read1write2/Test.ros2rag b/ragconnect.tests/src/test/01-input/read1write2/Test.connect similarity index 71% rename from ros2rag.tests/src/test/01-input/read1write2/Test.ros2rag rename to ragconnect.tests/src/test/01-input/read1write2/Test.connect index fbf9489f07114a3439e89e6a9f6654fe33392380..e826f1d040d1668ae5d5d56a83e5b4e5e96a7290 100644 --- a/ros2rag.tests/src/test/01-input/read1write2/Test.ros2rag +++ b/ragconnect.tests/src/test/01-input/read1write2/Test.connect @@ -1,13 +1,13 @@ // --- update definitions --- // OnSameNonterminal -read OnSameNonterminal.Input; -write OnSameNonterminal.OutInteger; -write OnSameNonterminal.OutString; +receive OnSameNonterminal.Input; +send OnSameNonterminal.OutInteger; +send OnSameNonterminal.OutString; // OnDifferentNonterminal -read OnDifferentNonterminal.Input; -write TheOther.OutInteger; -write TheOther.OutString; +receive OnDifferentNonterminal.Input; +send TheOther.OutInteger; +send TheOther.OutString; // --- dependency definitions --- // OnSameNonterminal diff --git a/ros2rag.tests/src/test/01-input/read1write2/Test.jadd b/ragconnect.tests/src/test/01-input/read1write2/Test.jadd similarity index 100% rename from ros2rag.tests/src/test/01-input/read1write2/Test.jadd rename to ragconnect.tests/src/test/01-input/read1write2/Test.jadd diff --git a/ros2rag.tests/src/test/01-input/read1write2/Test.relast b/ragconnect.tests/src/test/01-input/read1write2/Test.relast similarity index 100% rename from ros2rag.tests/src/test/01-input/read1write2/Test.relast rename to ragconnect.tests/src/test/01-input/read1write2/Test.relast diff --git a/ros2rag.tests/src/test/01-input/read2write1/Test.ros2rag b/ragconnect.tests/src/test/01-input/read2write1/Test.connect similarity index 70% rename from ros2rag.tests/src/test/01-input/read2write1/Test.ros2rag rename to ragconnect.tests/src/test/01-input/read2write1/Test.connect index 4575a5b547366d8c9737d5c8478e1a4fb821e9a6..4c2a9b237acb5b42f274a2f095fcb74b4132a49d 100644 --- a/ros2rag.tests/src/test/01-input/read2write1/Test.ros2rag +++ b/ragconnect.tests/src/test/01-input/read2write1/Test.connect @@ -1,13 +1,13 @@ // --- update definitions --- // OnSameNonterminal -read OnSameNonterminal.Input1; -read OnSameNonterminal.Input2; -write OnSameNonterminal.OutInteger; +receive OnSameNonterminal.Input1; +receive OnSameNonterminal.Input2; +send OnSameNonterminal.OutInteger; // OnDifferentNonterminal -read OnDifferentNonterminal.Input1; -read OnDifferentNonterminal.Input2; -write TheOther.OutInteger; +receive OnDifferentNonterminal.Input1; +receive OnDifferentNonterminal.Input2; +send TheOther.OutInteger; // --- dependency definitions --- // OnSameNonterminal diff --git a/ros2rag.tests/src/test/01-input/read2write1/Test.jadd b/ragconnect.tests/src/test/01-input/read2write1/Test.jadd similarity index 100% rename from ros2rag.tests/src/test/01-input/read2write1/Test.jadd rename to ragconnect.tests/src/test/01-input/read2write1/Test.jadd diff --git a/ros2rag.tests/src/test/01-input/read2write1/Test.relast b/ragconnect.tests/src/test/01-input/read2write1/Test.relast similarity index 100% rename from ros2rag.tests/src/test/01-input/read2write1/Test.relast rename to ragconnect.tests/src/test/01-input/read2write1/Test.relast diff --git a/ros2rag.tests/src/test/02-after-ros2rag/.gitignore b/ragconnect.tests/src/test/02-after-ragconnect/.gitignore similarity index 100% rename from ros2rag.tests/src/test/02-after-ros2rag/.gitignore rename to ragconnect.tests/src/test/02-after-ragconnect/.gitignore diff --git a/ros2rag.tests/src/test/03-after-relast/.gitignore b/ragconnect.tests/src/test/03-after-relast/.gitignore similarity index 100% rename from ros2rag.tests/src/test/03-after-relast/.gitignore rename to ragconnect.tests/src/test/03-after-relast/.gitignore diff --git a/ros2rag.tests/src/test/java-gen/.gitignore b/ragconnect.tests/src/test/java-gen/.gitignore similarity index 100% rename from ros2rag.tests/src/test/java-gen/.gitignore rename to ragconnect.tests/src/test/java-gen/.gitignore diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java similarity index 100% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java similarity index 100% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java similarity index 100% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java similarity index 98% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java index a0fd5e7682f1accef3333eaf72261a6593e1c4d6..be45a8080cc251191c62fcbc3b1793129a45dee3 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java +++ b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java @@ -2,7 +2,7 @@ package org.jastadd.ros2rag.tests; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.jastadd.ros2rag.compiler.Compiler; +import org.jastadd.ragconnect.compiler.Compiler; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java similarity index 100% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java similarity index 100% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java similarity index 100% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java similarity index 100% rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java diff --git a/ragconnect.tests/src/test/proto/config.proto b/ragconnect.tests/src/test/proto/config.proto new file mode 100644 index 0000000000000000000000000000000000000000..38cb5d0a25b02c96dcbdf30f685212ea972feee6 --- /dev/null +++ b/ragconnect.tests/src/test/proto/config.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package config; + +message RobotConfig { + double speed = 1; +} \ No newline at end of file diff --git a/ragconnect.tests/src/test/proto/robot_state.proto b/ragconnect.tests/src/test/proto/robot_state.proto new file mode 100644 index 0000000000000000000000000000000000000000..6630631f16e00493be3f50307c9092e56184e9c6 --- /dev/null +++ b/ragconnect.tests/src/test/proto/robot_state.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +package robot; + +message RobotState { + + message Position { + double x = 1; + double y = 2; + double z = 3; + } + + message Orientation { + double x = 1; + double y = 2; + double z = 3; + double w = 4; + } + + message LinearTwist { + double x = 1; + double y = 2; + double z = 3; + } + + message AngularTwist { + double x = 1; + double y = 2; + double z = 3; + } + + string name = 1; + Position position = 2; + Orientation orientation = 3; + LinearTwist linear_twist = 4; + AngularTwist angular_twist = 5; +} \ No newline at end of file diff --git a/ragconnect.tests/src/test/proto/trajectory.proto b/ragconnect.tests/src/test/proto/trajectory.proto new file mode 100644 index 0000000000000000000000000000000000000000..4a7f375e1ae37ba386f45e1149dc38990d0c7a0e --- /dev/null +++ b/ragconnect.tests/src/test/proto/trajectory.proto @@ -0,0 +1,33 @@ +syntax = "proto3"; + +package plan; + +message Trajectory { + + message Position { + double x = 1; + double y = 2; + double z = 3; + } + + message Orientation { + double x = 1; + double y = 2; + double z = 3; + double w = 4; + } + + enum PlanningMode { + FLUID = 0; + CARTESIAN = 1; + } + + message Pose { + Position position = 1; + Orientation orientation = 2; + PlanningMode mode = 3; + } + + repeated Pose pose = 1; + bool loop = 2; +} diff --git a/relast.preprocessor b/relast.preprocessor index 54af6737685fab0be452f446b70b9842aba89e42..79d237fda220364ffebf77dc7de0a7b29635e360 160000 --- a/relast.preprocessor +++ b/relast.preprocessor @@ -1 +1 @@ -Subproject commit 54af6737685fab0be452f446b70b9842aba89e42 +Subproject commit 79d237fda220364ffebf77dc7de0a7b29635e360 diff --git a/ros2rag.base/src/main/jastadd/Analysis.jrag b/ros2rag.base/src/main/jastadd/Analysis.jrag deleted file mode 100644 index 228a3479df5be9d24998479bc3b48bd1626775aa..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/jastadd/Analysis.jrag +++ /dev/null @@ -1,27 +0,0 @@ -aspect Analysis { - // --- lookupTokenUpdateDefinition --- - inh TokenUpdateDefinition TokenUpdateDefinition.lookupTokenUpdateDefinition(TokenComponent token); - eq Ros2Rag.getUpdateDefinition().lookupTokenUpdateDefinition(TokenComponent token) { - for (UpdateDefinition def : getUpdateDefinitionList()) { - if (def.isTokenUpdateDefinition() && def.asTokenUpdateDefinition().getToken().equals(token)) { - return def.asTokenUpdateDefinition(); - } - } - return null; - } - - // --- lookupDependencyDefinition --- - inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id); - eq Ros2Rag.getDependencyDefinition().lookupDependencyDefinition(TypeDecl source, String id) { - for (DependencyDefinition def : getDependencyDefinitionList()) { - if (def.getID().equals(id) && def.getSource().containingTypeDecl().equals(source)) { - return def; - } - } - return null; - } - - // --- isAlreadyDefined --- - syn boolean TokenUpdateDefinition.isAlreadyDefined() = lookupTokenUpdateDefinition(getToken()) != this; - syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this; -} diff --git a/ros2rag.base/src/main/jastadd/MustacheNodes.relast b/ros2rag.base/src/main/jastadd/MustacheNodes.relast deleted file mode 100644 index 69d4280f9d9038c838e83767c6e72be9a8d6d5d8..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/jastadd/MustacheNodes.relast +++ /dev/null @@ -1,22 +0,0 @@ -//TypeComponentMustache ; -//rel TypeComponentMustache.TypeComponent -> TypeComponent ; - -MRos2Rag ::= ReadDefinition:MReadDefinition* WriteDefinition:MWriteDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*; -abstract MUpdateDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*; -MReadDefinition : MUpdateDefinition; -MWriteDefinition : MUpdateDefinition; -MMappingDefinition; -MInnerMappingDefinition; -MDependencyDefinition; -MTypeComponent; -MTokenComponent; - -rel MRos2Rag.Ros2Rag -> Ros2Rag; -rel MInnerMappingDefinition.MappingDefinition -> MappingDefinition; -rel MReadDefinition.ReadFromMqttDefinition -> ReadFromMqttDefinition; -rel MWriteDefinition.WriteToMqttDefinition -> WriteToMqttDefinition; -rel MMappingDefinition.MappingDefinition -> MappingDefinition; -rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition; -rel MTypeComponent.TypeComponent -> TypeComponent; -rel MTokenComponent.TokenComponent -> TokenComponent; -rel MTokenComponent.DependencyDefinition* -> MDependencyDefinition; diff --git a/ros2rag.base/src/main/jastadd/Navigation.jrag b/ros2rag.base/src/main/jastadd/Navigation.jrag deleted file mode 100644 index a4f21e6e8d79c549a63d54474792382457bf74fd..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/jastadd/Navigation.jrag +++ /dev/null @@ -1,80 +0,0 @@ -aspect Navigation { - - // --- program --- - eq Ros2Rag.getChild().program() = getProgram(); - eq MRos2Rag.getChild().program() = getRos2Rag().program(); - - // --- ros2rag --- - inh Ros2Rag ASTNode.ros2rag(); - eq Ros2Rag.getChild().ros2rag() = this; - eq MRos2Rag.getChild().ros2rag() = getRos2Rag(); - - // --- containedFile (first equation should be in preprocessor) --- - eq Program.getChild().containedFile() = null; - eq Ros2Rag.getChild().containedFile() = null; - - // --- isTypeComponent (should be in preprocessor) --- - syn boolean Component.isTypeComponent() = false; - eq TypeComponent.isTypeComponent() = true; - - // --- asTypeComponent (should be in preprocessor) --- - syn TypeComponent Component.asTypeComponent() = null; - eq TypeComponent.asTypeComponent() = this; - - // --- isListComponent (should be in preprocessor) --- - syn boolean Component.isListComponent() = false; - eq ListComponent.isListComponent() = true; - - // --- asListComponent (should be in preprocessor) --- - syn ListComponent Component.asListComponent() = null; - eq ListComponent.asListComponent() = this; - - // --- containedFileName (should replace containedFile in preprocessor) --- - inh String ASTNode.containedFileName(); - eq GrammarFile.getChild().containedFileName() = getFileName(); - eq Ros2Rag.getChild().containedFileName() = getFileName(); - eq Program.getChild().containedFileName() = null; - eq MRos2Rag.getChild().containedFileName() = null; - - // --- isTokenUpdateDefinition --- - syn boolean UpdateDefinition.isTokenUpdateDefinition() = false; - eq TokenUpdateDefinition.isTokenUpdateDefinition() = true; - - // --- asTokenUpdateDefinition --- - syn TokenUpdateDefinition UpdateDefinition.asTokenUpdateDefinition() = null; - eq TokenUpdateDefinition.asTokenUpdateDefinition() = this; - - // --- isWriteToMqttDefinition --- - syn boolean UpdateDefinition.isWriteToMqttDefinition() = false; - eq WriteToMqttDefinition.isWriteToMqttDefinition() = true; - - // --- asWriteToMqttDefinition --- - syn WriteToMqttDefinition UpdateDefinition.asWriteToMqttDefinition() = null; - eq WriteToMqttDefinition.asWriteToMqttDefinition() = this; - - // --- asReadFromMqttDefinition --- - syn ReadFromMqttDefinition UpdateDefinition.asReadFromMqttDefinition() = null; - eq ReadFromMqttDefinition.asReadFromMqttDefinition() = this; - - // --- targetUpdateDefinition --- - syn WriteToMqttDefinition DependencyDefinition.targetUpdateDefinition() { - // resolve definition in here, as we do not need resolveMethod in any other place (yet) - for (UpdateDefinition updateDefinition : ros2rag().getUpdateDefinitionList()) { - if (updateDefinition.isWriteToMqttDefinition() && - updateDefinition.asWriteToMqttDefinition().getToken().equals(this.getTarget())) { - return updateDefinition.asWriteToMqttDefinition(); - } - } - return null; - } - - // --- isDefaultMappingDefinition --- - syn boolean MappingDefinition.isDefaultMappingDefinition() = false; - eq DefaultMappingDefinition.isDefaultMappingDefinition() = true; - - // --- allTokenComponents --- - coll java.util.Set<TokenComponent> Program.allTokenComponents() [new java.util.HashSet<>()] root Program; - TokenComponent contributes this - to Program.allTokenComponents() - for program(); -} diff --git a/ros2rag.base/src/main/jastadd/parser/Preamble.parser b/ros2rag.base/src/main/jastadd/parser/Preamble.parser deleted file mode 100644 index 43fa51e769eed054371cecae2cde354b44e115a3..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/jastadd/parser/Preamble.parser +++ /dev/null @@ -1,7 +0,0 @@ -%header {: -package org.jastadd.ros2rag.parser; -import org.jastadd.ros2rag.ast.*; -:}; - -%goal goal; -%goal ros2rag; diff --git a/ros2rag.base/src/main/jastadd/scanner/Header.flex b/ros2rag.base/src/main/jastadd/scanner/Header.flex deleted file mode 100644 index 974aa01fe70d15edbd4c80ac67169a18fe95f9e8..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/jastadd/scanner/Header.flex +++ /dev/null @@ -1,17 +0,0 @@ -package org.jastadd.ros2rag.scanner; - -import org.jastadd.ros2rag.parser.Ros2RagParser.Terminals; -%% - -%public -%final -%class Ros2RagScanner -%extends beaver.Scanner - -%type beaver.Symbol -%function nextToken -%yylexthrow beaver.Scanner.Exception -%scanerror Ros2RagScanner.ScannerError - -%line -%column diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java b/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java deleted file mode 100644 index b6331130a7b338ef1bf37f6ac372d612cb1754f1..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java +++ /dev/null @@ -1,217 +0,0 @@ -package org.jastadd.ros2rag.compiler; - -import beaver.Parser; -import org.jastadd.ros2rag.ast.*; -import org.jastadd.ros2rag.compiler.options.CommandLine; -import org.jastadd.ros2rag.compiler.options.CommandLine.CommandLineException; -import org.jastadd.ros2rag.compiler.options.FlagOption; -import org.jastadd.ros2rag.compiler.options.Option; -import org.jastadd.ros2rag.compiler.options.StringOption; -import org.jastadd.ros2rag.parser.Ros2RagParser; -import org.jastadd.ros2rag.scanner.Ros2RagScanner; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; - -public class Compiler { - - private StringOption optionOutputDir; - private StringOption optionInputGrammar; - private StringOption optionRootNode; - private StringOption optionInputRos2Rag; - private FlagOption optionHelp; - private FlagOption optionVerbose; - private FlagOption optionLogReads; - private FlagOption optionLogWrites; - - private ArrayList<Option<?>> options; - private CommandLine commandLine; - - public Compiler() { - options = new ArrayList<>(); - addOptions(); - } - - public void run(String[] args) throws CommandLineException, CompilerException { - System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); - System.setProperty("mustache.debug", "true"); - options = new ArrayList<>(); - addOptions(); - commandLine = new CommandLine(options); - commandLine.parse(args); - - if (optionHelp.isSet()) { - printUsage(); - return; - } - - if (optionVerbose.isSet()) { - try { - run(); - } catch (CompilerException e) { - e.printStackTrace(); - throw e; - } - } else { - run(); - } - } - - private void run() throws CompilerException { - String outputDir; - if (optionOutputDir.isSet()) { - outputDir = optionOutputDir.getValue(); - } else { - outputDir = "gen"; - System.out.println("No output output dir is set. Assuming '" + outputDir + "'."); - } - try { - Files.createDirectories(Paths.get(outputDir)); - } catch (IOException e) { - throw new CompilerException("Error creating output dir " + outputDir, e); - } - - printMessage("Running Ros2Rag Preprocessor"); - - if (anyRequiredOptionIsUnset()) { - throw new CompilerException("Aborting due to missing values for required options."); - } - - List<String> otherArgs = commandLine.getArguments(); - if (!otherArgs.isEmpty()) { - printMessage("Superfluous arguments will be ignored: " + otherArgs); - } - Ros2Rag ros2Rag = parseProgram(optionInputGrammar.getValue(), optionInputRos2Rag.getValue()); - - if (!ros2Rag.errors().isEmpty()) { - System.err.println("Errors:"); - for (ErrorMessage e : ros2Rag.errors()) { - System.err.println(e); - } - System.exit(1); - } - - printMessage("Writing output files"); - // copy MqttHandler into outputDir - final String mqttHandlerFileName = "MqttHandler.jadd"; - try { - InputStream inputStream = Compiler.class.getClassLoader().getResourceAsStream(mqttHandlerFileName); - if (inputStream == null) { - throw new CompilerException("Could not open " + mqttHandlerFileName); - } - Files.copy(inputStream, - Paths.get(outputDir, mqttHandlerFileName), - StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - throw new CompilerException("Could not copy " + mqttHandlerFileName, e); - } - writeToFile(outputDir + "/Grammar.relast", ros2Rag.getProgram().generateAbstractGrammar()); - writeToFile(outputDir + "/ROS2RAG.jadd", ros2Rag.generateAspect(optionRootNode.getValue())); - } - - private boolean anyRequiredOptionIsUnset() { - boolean foundError = false; - for (Option<?> option : options) { - if (option.hasArgument() == Option.HasArgument.YES && !option.isSet()) { - System.err.println("Option '" + option.getName() + - "' (" + option.getDescription() + ") is required but unset!"); - foundError = true; - } - } - return foundError; - } - - - public static void main(String[] args) { - try { - new Compiler().run(args); - } catch (CommandLineException | CompilerException e) { - System.err.println(e.getMessage()); - System.exit(-1); - } - } - - private void printMessage(String message) { - System.out.println(message); - } - - private void writeToFile(String filename, String str) throws CompilerException { - try { - PrintWriter writer = new PrintWriter(filename); - writer.print(str); - writer.close(); - } catch (Exception e) { - throw new CompilerException("Could not write to file " + filename, e); - } - } - - private void addOptions() { - optionOutputDir = addOption(new StringOption("outputDir", "target directory for the generated files.")); - optionInputGrammar = addOption(new StringOption("inputGrammar", "base grammar.")); - optionRootNode = addOption(new StringOption("rootNode", "root node in the base grammar.")); - optionInputRos2Rag = addOption(new StringOption("inputRos2Rag", "ros2rag definition file.")); - optionHelp = addOption(new FlagOption("help", "Print usage and exit.")); - optionVerbose = addOption(new FlagOption("verbose", "Print more messages while compiling.")); - optionLogReads = addOption(new FlagOption("logReads", "Enable logging for every read.")); - optionLogWrites = addOption(new FlagOption("logWrites", "Enable logging for every write.")); - } - - private <OptionType extends Option<?>> OptionType addOption(OptionType option) { - options.add(option); - return option; - } - - private Ros2Rag parseProgram(String inputGrammarFileName, String inputRos2RagFileName) throws CompilerException { - Program program = new Program(); - Ros2Rag ros2Rag; - GrammarFile inputGrammar; - - try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputGrammarFileName))) { - Ros2RagScanner scanner = new Ros2RagScanner(reader); - Ros2RagParser parser = new Ros2RagParser(); - inputGrammar = (GrammarFile) parser.parse(scanner); - if (optionVerbose.isSet()) { - inputGrammar.dumpTree(System.out); - } - program.addGrammarFile(inputGrammar); - inputGrammar.treeResolveAll(); - inputGrammar.setFileName(inputGrammarFileName); - } catch (IOException | Parser.Exception e) { - throw new CompilerException("Could not parse grammar file " + inputGrammarFileName, e); - } - - try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputRos2RagFileName))) { - Ros2RagScanner scanner = new Ros2RagScanner(reader); - Ros2RagParser parser = new Ros2RagParser(); - ros2Rag = (Ros2Rag) parser.parse(scanner, Ros2RagParser.AltGoals.ros2rag); - ros2Rag.setProgram(program); - ros2Rag.setFileName(inputRos2RagFileName); - } catch (IOException | Parser.Exception e) { - throw new CompilerException("Could not parse ros2rag file " + inputRos2RagFileName, e); - } - ros2Rag.treeResolveAll(); - ros2Rag.additionalRelations().forEach(inputGrammar::addDeclaration); - ASTNode.loggingEnabledForReads = optionLogReads.isSet(); - ASTNode.loggingEnabledForWrites = optionLogWrites.isSet(); - return ros2Rag; - } - - protected void printUsage() { - System.out.println("Usage: java -jar ros2rag.jar [--option1] [--option2=value] ... <filename1> <filename2> ... "); - System.out.println("Options:"); - System.out.print(commandLine.printOptionHelp()); - } - - public static class CompilerException extends Exception { - CompilerException(String message) { - super(message); - } - CompilerException(String message, Throwable cause) { - super(message, cause); - } - } -} diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/CommandLine.java b/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/CommandLine.java deleted file mode 100644 index 89a1335c5440cc88fc8ee7c0c22552fffd86c13b..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/CommandLine.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.jastadd.ros2rag.compiler.options; - -import java.util.*; - -public class CommandLine { - private final Collection<Option<?>> options; - private final Map<String, Option<?>> mapping; - private final List<String> arguments; - - public CommandLine(Collection<Option<?>> options) { - this.options = options; - this.mapping = new HashMap<>(); - for (Option<?> option : options) { - mapping.put(option.getName(), option); - } - this.arguments = new ArrayList<>(); - } - - public void parse(String[] args) throws CommandLineException { - int i = 0; - while (i < args.length) { - if (args[i].startsWith(Option.PREFIX)) { - int argumentIndex = args[i].indexOf("="); - String name; - String argument = null; - if (argumentIndex > 0) { - name = args[i].substring(2, argumentIndex); - argument = args[i].substring(argumentIndex + 1); - } else { - name = args[i].substring(2); - } - Option<?> option = mapping.get(name); - if (option == null) { - throw new CommandLineException("Option " + Option.PREFIX + name + " not found"); - } - match(option, argument); - } else { - arguments.add(args[i]); - } - i++; - } - } - - public void match(Option<?> option, String argument) throws CommandLineException { - try { - switch (option.hasArgument()) { - case NO: - if (argument == null) { - option.match(null); - } else { - throw new CommandLineException("Option " + option + " is not allowed to have an argument"); - } - break; - case OPTIONAL: - option.match(argument); - break; - case YES: - if (argument != null) { - option.match(argument); - } else { - throw new CommandLineException("Option " + option + " requires an argument"); - } - break; - } - } catch (Option.IllegalMatchException e) { - throw new CommandLineException("Invalid value for option " + option + ": " + e.getMessage()); - } - } - - public List<String> getArguments() { - return arguments; - } - - public String printOptionHelp() { - StringBuilder sb = new StringBuilder(); - int longestOption = 0; - for (Option<?> option : options) { - if (longestOption < option.getName().length()) { - longestOption = option.getName().length(); - } - } - for (Option<?> option : new TreeSet<>(options)) { - String s = String.format(" %s%-" + (longestOption + 6) + "s %s%n", - Option.PREFIX, option.getName(), option.getDescription()); - sb.append(s); - } - return sb.toString(); - } - - public static class CommandLineException extends Exception { - private static final long serialVersionUID = 1L; - - public CommandLineException(String message) { - super(message); - } - } -} diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/EnumOption.java b/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/EnumOption.java deleted file mode 100644 index 67ada98e8c2483b8d29ffeb73f99e4be8e6244c8..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/EnumOption.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.jastadd.ros2rag.compiler.options; - -import java.util.Collection; -import java.util.TreeSet; - -public class EnumOption extends Option<String> { - private final TreeSet<String> allowedValues; - private final String defaultValue; - private String value; - private boolean isSet; - - public EnumOption(String name, String description, Collection<String> allowedValues, String defaultValue) { - super(name, description); - this.allowedValues = new TreeSet<>(allowedValues); - this.defaultValue = defaultValue; - this.value = defaultValue; - this.isSet = false; - } - - public boolean addAllowedValue(String allowedValue) { - return allowedValues.add(allowedValue); - } - - @Override - public String getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.OPTIONAL; - } - - @Override - public void match(String argument) throws IllegalMatchException { - if (argument == null) { - isSet = true; - value = defaultValue; - } else if (allowedValues.contains(argument)) { - isSet = true; - value = argument; - } else { - throw new IllegalMatchException(argument - + " is not allowed, allowed values are " + allowedValues); - } - } - - @Override - public boolean isSet() { - return isSet; - } - - @Override - public String getDescription() { - String allowedValuesStr = allowedValues.toString(); - allowedValuesStr = allowedValuesStr.substring(1); - allowedValuesStr = allowedValuesStr.substring(0, allowedValuesStr.length() - 1); - return super.getDescription() + " (allowed values: " + allowedValuesStr + ")"; - } -} diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/FlagOption.java b/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/FlagOption.java deleted file mode 100644 index ad87ed19e91b03f05d163f0cc123af15a4a4e2e2..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/FlagOption.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.jastadd.ros2rag.compiler.options; - -public class FlagOption extends Option<Boolean> { - private boolean value; - - public FlagOption(String name, String description) { - super(name, description); - value = false; - } - - @Override - public Boolean getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.NO; - } - - @Override - public void match(String string) throws IllegalMatchException { - value = true; - } - - @Override - public boolean isSet() { - return getValue(); - } -} diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/Option.java b/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/Option.java deleted file mode 100644 index 0f57f9899ba5f28ee80ca6d37788a6e31123ac47..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/Option.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.jastadd.ros2rag.compiler.options; - -abstract public class Option<ValueType> implements Comparable<Option<?>> { - public final static String PREFIX = "--"; - private final String name; - private final String description; - - public Option(String name, String description) { - this.name = name; - this.description = description; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - @Override - public int compareTo(Option<?> o) { - return name.compareTo(o.name); - } - - @Override - public boolean equals(Object other) { - if (other instanceof Option) { - return compareTo((Option<?>) other) == 0; - } - return false; - } - - @Override - public String toString() { - return PREFIX + name; - } - - abstract public boolean isSet(); - - abstract public ValueType getValue(); - - abstract public HasArgument hasArgument(); - - abstract public void match(String input) throws IllegalMatchException; - - public enum HasArgument { - NO, - OPTIONAL, - YES - } - - public static class IllegalMatchException extends Exception { - private static final long serialVersionUID = 1L; - - public IllegalMatchException(String message) { - super(message); - } - } -} diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/StringOption.java b/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/StringOption.java deleted file mode 100644 index 19082b5ae6b9fa90145a73ff4ddc4b58b2f9b122..0000000000000000000000000000000000000000 --- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/StringOption.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.jastadd.ros2rag.compiler.options; - -public class StringOption extends Option<String> { - private String value; - private boolean isSet; - - public StringOption(String name, String description) { - this(name, description, ""); - } - - public StringOption(String name, String description, String defaultValue) { - super(name, description); - value = defaultValue; - isSet = false; - } - - @Override - public String getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.YES; - } - - @Override - public void match(String value) { - this.value = value; - isSet = true; - } - - @Override - public boolean isSet() { - return isSet; - } -} diff --git a/ros2rag.common/build.gradle b/ros2rag.common/build.gradle index 6d0657ba2384835d8ffd8cd8f283535753f96822..28d38267854756aed20a50250814e51ff090afa9 100644 --- a/ros2rag.common/build.gradle +++ b/ros2rag.common/build.gradle @@ -28,8 +28,6 @@ test { } protobuf { - // create strange directories, so use default here -// generatedFilesBaseDir = "$projectDir/src/gen/java" protoc { // The artifact spec for the Protobuf Compiler artifact = 'com.google.protobuf:protoc:3.0.0' diff --git a/ros2rag.goal/build.gradle b/ros2rag.goal/build.gradle index c124190b772948fa6bdcff959c4fdc68769d793a..0c537c2ba4f8d5a5f92fc572249ddcb0afa94896 100644 --- a/ros2rag.goal/build.gradle +++ b/ros2rag.goal/build.gradle @@ -21,30 +21,30 @@ configurations { sourceSets.main.java.srcDir "src/gen/java" dependencies { - implementation project (':ros2rag.base') + implementation project (':ragconnect.base') implementation project (':ros2rag.common') - baseRuntimeClasspath project (':ros2rag.base') + baseRuntimeClasspath project (':ragconnect.base') api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" } // Input files for relast -def relastFiles = ["src/gen/jastadd/Grammar.relast"] +def relastFiles = ["src/gen/jastadd/GoalModel.relast", "src/gen/jastadd/RagConnect.relast"] -// phases: Ros2Rag -> RelAst -> JastAdd -// phase: Ros2Rag -task ros2rag(type: JavaExec) { +// phases: ragConnect -> RelAst -> JastAdd +// phase: ragConnect +task ragConnect(type: JavaExec) { classpath = configurations.baseRuntimeClasspath group = 'Build' - main = 'org.jastadd.ros2rag.compiler.Compiler' + main = 'org.jastadd.ragconnect.compiler.Compiler' args([ '--verbose', - '--outputDir=src/gen/jastadd', - '--inputGrammar=src/main/jastadd/GoalModel.relast', - '--inputRos2Rag=src/main/jastadd/GoalModel.ros2rag', + '--o=src/gen/jastadd', + 'src/main/jastadd/GoalModel.relast', + 'src/main/jastadd/GoalModel.connect', '--rootNode=GoalModel' ]) } @@ -119,4 +119,4 @@ jastadd { // Workflow configuration for phases generateAst.dependsOn relastToJastAdd -relastToJastAdd.dependsOn ros2rag +relastToJastAdd.dependsOn ragConnect diff --git a/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag b/ros2rag.goal/src/main/jastadd/GoalModel.connect similarity index 84% rename from ros2rag.goal/src/main/jastadd/GoalModel.ros2rag rename to ros2rag.goal/src/main/jastadd/GoalModel.connect index 448e66a83e17b01f1039f3e36ca17e28a75f3816..d4e3bd6f6ddc7b74581ea74e561d3514793ff01b 100644 --- a/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag +++ b/ros2rag.goal/src/main/jastadd/GoalModel.connect @@ -2,14 +2,14 @@ * Version 2020-05-28 */ // --- update definitions --- -read RobotState.CurrentPosition using ParseRobotState, RobotStateToTrajectoryPosition ; -read RobotState.LastUpdate using TickWhenLinkState ; +receive RobotState.CurrentPosition using ParseRobotState, RobotStateToTrajectoryPosition ; +receive RobotState.LastUpdate using TickWhenLinkState ; -// Those two roles together encode an attribute-driven rewrite (via mqtt) -write Workflow.ReadyForThisStep ; -read Workflow.CurrentStep using ParseLastUpdatedInteger ; +// Those two roles together encode an attribute-driven resend (via mqtt) +send Workflow.ReadyForThisStep ; +receive Workflow.CurrentStep using ParseLastUpdatedInteger ; -write Workflow.NextTrajectory using SerializeTrajectory ; +send Workflow.NextTrajectory using SerializeTrajectory ; // --- dependency definitions --- Workflow.ReadyForThisStep canDependOn RobotState.LastUpdate as LastUpdateDependency ; diff --git a/ros2rag.receiverstub/build.gradle b/ros2rag.receiverstub/build.gradle index db37ca24aa4b861c2153967a3092f38f685a5dfa..02b49e36590bc01a544bcc9a7fc839109d32d817 100644 --- a/ros2rag.receiverstub/build.gradle +++ b/ros2rag.receiverstub/build.gradle @@ -1,3 +1,4 @@ +apply plugin: 'jastadd' apply plugin: 'application' mainClassName = 'de.tudresden.inf.st.ros2rag.receiverstub.ReceiverMain' @@ -8,11 +9,75 @@ repositories { buildscript { repositories.jcenter() + dependencies { + classpath 'org.jastadd:jastaddgradle:1.13.3' + } } sourceSets.main.java.srcDir "src/gen/java" +configurations { + baseRuntimeClasspath +} + dependencies { - implementation project(':ros2rag.starter') + implementation project(':ragconnect.base') implementation project(':ros2rag.common') + baseRuntimeClasspath project (':ragconnect.base') + api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' + + jastadd2 "org.jastadd:jastadd:2.3.4" +} + +task ragConnect(type: JavaExec) { + classpath = configurations.baseRuntimeClasspath + + group = 'Build' + main = 'org.jastadd.ragconnect.compiler.Compiler' + + args([ + '--o=src/gen/jastadd', + 'src/main/jastadd/Receiver.ast', + 'src/main/jastadd/Receiver.connect', + '--rootNode=Receiver' + ]) +} + +// phase: JastAdd +jastadd { + configureModuleBuild() + modules { + //noinspection GroovyAssignabilityCheck + module("receiver") { + + java { + basedir "src/" + include "main/**/*.java" + include "gen/**/*.java" + } + + jastadd { + basedir "src/" + include "main/jastadd/Receiver.ast" + include "gen/jastadd/**/*.jadd" + } + } + } + cleanGen.doFirst { + delete "src/gen/java/de" + delete "src/gen-res/BuildInfo.properties" + } + preprocessParser.doFirst { + args += ["--no-beaver-symbol"] + } + module = "receiver" + astPackage = 'de.tudresden.inf.st.ros2rag.receiverstub.ast' + genDir = 'src/gen/java' + buildInfoDir = 'src/gen-res' + // jastaddOptions = ["--lineColumnNumbers", "--visitCheck=true", "--rewrite=cnta", "--cache=all"] + // default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false' + extraJastAddOptions = ["--lineColumnNumbers", '--List=JastAddList'] } + +// Workflow configuration for phases +generateAst.dependsOn ragConnect diff --git a/ros2rag.receiverstub/src/main/jastadd/Receiver.ast b/ros2rag.receiverstub/src/main/jastadd/Receiver.ast new file mode 100644 index 0000000000000000000000000000000000000000..6990d9fd4828b80622d0b4e0767eac2a79481e18 --- /dev/null +++ b/ros2rag.receiverstub/src/main/jastadd/Receiver.ast @@ -0,0 +1 @@ +Receiver; diff --git a/ros2rag.receiverstub/src/main/jastadd/Receiver.connect b/ros2rag.receiverstub/src/main/jastadd/Receiver.connect new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java b/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java index 0ea8aa94ea831952b846cb99bd8451d64ebca12c..c56175a3c4401006c807343ce111236746805ebf 100644 --- a/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java +++ b/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java @@ -4,7 +4,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import config.Config.RobotConfig; import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration; import de.tudresden.inf.st.ros2rag.common.Util; -import de.tudresden.inf.st.ros2rag.starter.ast.MqttHandler; +import de.tudresden.inf.st.ros2rag.receiverstub.ast.MqttHandler; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/ros2rag.tests/.gitignore b/ros2rag.safety/.gitignore similarity index 100% rename from ros2rag.tests/.gitignore rename to ros2rag.safety/.gitignore diff --git a/ros2rag.starter/build.gradle b/ros2rag.safety/build.gradle similarity index 83% rename from ros2rag.starter/build.gradle rename to ros2rag.safety/build.gradle index 88f304aa3177f09de185f0bafe0e507e80a2d919..30d6296bdc98ad7a87f3dedbb0739fe6074120d2 100644 --- a/ros2rag.starter/build.gradle +++ b/ros2rag.safety/build.gradle @@ -21,30 +21,29 @@ configurations { sourceSets.main.java.srcDir "src/gen/java" dependencies { - implementation project (':ros2rag.base') + implementation project (':ragconnect.base') implementation project (':ros2rag.common') - baseRuntimeClasspath project (':ros2rag.base') + baseRuntimeClasspath project (':ragconnect.base') api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" } // Input files for relast -def relastFiles = ["src/gen/jastadd/Grammar.relast"] +def relastFiles = ["src/gen/jastadd/SafetyModel.relast", "src/gen/jastadd/RagConnect.relast"] -// phases: Ros2Rag -> RelAst -> JastAdd -// phase: Ros2Rag -task ros2rag(type: JavaExec) { +// phases: ragConnect -> RelAst -> JastAdd +// phase: ragConnect +task ragConnect(type: JavaExec) { classpath = configurations.baseRuntimeClasspath group = 'Build' - main = 'org.jastadd.ros2rag.compiler.Compiler' + main = 'org.jastadd.ragconnect.compiler.Compiler' args([ - '--verbose', - '--outputDir=src/gen/jastadd', - '--inputGrammar=src/main/jastadd/RobotModel.relast', - '--inputRos2Rag=src/main/jastadd/Definitions.ros2rag', + '--o=src/gen/jastadd', + 'src/main/jastadd/SafetyModel.relast', + 'src/main/jastadd/SafetyModel.connect', '--rootNode=Model' ]) } @@ -119,4 +118,4 @@ jastadd { // Workflow configuration for phases generateAst.dependsOn relastToJastAdd -relastToJastAdd.dependsOn ros2rag +relastToJastAdd.dependsOn ragConnect diff --git a/ros2rag.starter/src/main/jastadd/Computation.jrag b/ros2rag.safety/src/main/jastadd/Computation.jrag similarity index 100% rename from ros2rag.starter/src/main/jastadd/Computation.jrag rename to ros2rag.safety/src/main/jastadd/Computation.jrag diff --git a/ros2rag.starter/src/main/jastadd/Navigation.jrag b/ros2rag.safety/src/main/jastadd/Navigation.jrag similarity index 100% rename from ros2rag.starter/src/main/jastadd/Navigation.jrag rename to ros2rag.safety/src/main/jastadd/Navigation.jrag diff --git a/ros2rag.starter/src/main/jastadd/Definitions.ros2rag b/ros2rag.safety/src/main/jastadd/SafetyModel.connect similarity index 87% rename from ros2rag.starter/src/main/jastadd/Definitions.ros2rag rename to ros2rag.safety/src/main/jastadd/SafetyModel.connect index eff6850999375f3a57e8d74d614da8dd4059da24..bf2ce6f741cdb0fac98ab5cbf363712d25b58559 100644 --- a/ros2rag.starter/src/main/jastadd/Definitions.ros2rag +++ b/ros2rag.safety/src/main/jastadd/SafetyModel.connect @@ -1,7 +1,7 @@ /* Version 2020-07-15 */ // --- update definitions --- -read Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ; -write RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; +receive Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ; +send RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; // --- dependency definitions --- RobotArm.AppropriateSpeed canDependOn Link.CurrentPosition as dependency1 ; diff --git a/ros2rag.starter/src/main/jastadd/RobotModel.jadd b/ros2rag.safety/src/main/jastadd/SafetyModel.jadd similarity index 100% rename from ros2rag.starter/src/main/jastadd/RobotModel.jadd rename to ros2rag.safety/src/main/jastadd/SafetyModel.jadd diff --git a/ros2rag.starter/src/main/jastadd/RobotModel.relast b/ros2rag.safety/src/main/jastadd/SafetyModel.relast similarity index 100% rename from ros2rag.starter/src/main/jastadd/RobotModel.relast rename to ros2rag.safety/src/main/jastadd/SafetyModel.relast diff --git a/ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java b/ros2rag.safety/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java similarity index 100% rename from ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java rename to ros2rag.safety/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java diff --git a/ros2rag.starter/src/main/resources/log4j2.xml b/ros2rag.safety/src/main/resources/log4j2.xml similarity index 100% rename from ros2rag.starter/src/main/resources/log4j2.xml rename to ros2rag.safety/src/main/resources/log4j2.xml diff --git a/ros2rag.senderstub/build.gradle b/ros2rag.senderstub/build.gradle index 063f22ec23add73ccaaf1c50fbab95b2510c425c..1497d02abfcb5882708dd12497686c893976d772 100644 --- a/ros2rag.senderstub/build.gradle +++ b/ros2rag.senderstub/build.gradle @@ -1,3 +1,4 @@ +apply plugin: 'jastadd' apply plugin: 'application' mainClassName = 'de.tudresden.inf.st.ros2rag.senderstub.SenderMain' @@ -8,11 +9,75 @@ repositories { buildscript { repositories.jcenter() + dependencies { + classpath 'org.jastadd:jastaddgradle:1.13.3' + } } sourceSets.main.java.srcDir "src/gen/java" +configurations { + baseRuntimeClasspath +} + dependencies { - implementation project(':ros2rag.starter') + implementation project(':ragconnect.base') implementation project(':ros2rag.common') + baseRuntimeClasspath project (':ragconnect.base') + api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' + + jastadd2 "org.jastadd:jastadd:2.3.4" +} + +task ragConnect(type: JavaExec) { + classpath = configurations.baseRuntimeClasspath + + group = 'Build' + main = 'org.jastadd.ragconnect.compiler.Compiler' + + args([ + '--o=src/gen/jastadd', + 'src/main/jastadd/Sender.ast', + 'src/main/jastadd/Sender.connect', + '--rootNode=Sender' + ]) +} + +// phase: JastAdd +jastadd { + configureModuleBuild() + modules { + //noinspection GroovyAssignabilityCheck + module("receiver") { + + java { + basedir "src/" + include "main/**/*.java" + include "gen/**/*.java" + } + + jastadd { + basedir "src/" + include "main/jastadd/Sender.ast" + include "gen/jastadd/**/*.jadd" + } + } + } + cleanGen.doFirst { + delete "src/gen/java/de" + delete "src/gen-res/BuildInfo.properties" + } + preprocessParser.doFirst { + args += ["--no-beaver-symbol"] + } + module = "receiver" + astPackage = 'de.tudresden.inf.st.ros2rag.senderstub.ast' + genDir = 'src/gen/java' + buildInfoDir = 'src/gen-res' + // jastaddOptions = ["--lineColumnNumbers", "--visitCheck=true", "--rewrite=cnta", "--cache=all"] + // default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false' + extraJastAddOptions = ["--lineColumnNumbers", '--List=JastAddList'] } + +// Workflow configuration for phases +generateAst.dependsOn ragConnect diff --git a/ros2rag.senderstub/src/main/jastadd/Sender.ast b/ros2rag.senderstub/src/main/jastadd/Sender.ast new file mode 100644 index 0000000000000000000000000000000000000000..1510af62c83e12b04bafcf810209367a505b3d70 --- /dev/null +++ b/ros2rag.senderstub/src/main/jastadd/Sender.ast @@ -0,0 +1 @@ +Sender; diff --git a/ros2rag.senderstub/src/main/jastadd/Sender.connect b/ros2rag.senderstub/src/main/jastadd/Sender.connect new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java b/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java index e767cdd92c57d713597ddf69c414a0308f24f1e4..63e29964de2cb6ddaa8e44948a110af2474148b7 100644 --- a/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java +++ b/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java @@ -1,6 +1,6 @@ package de.tudresden.inf.st.ros2rag.senderstub; -import de.tudresden.inf.st.ros2rag.starter.ast.MqttHandler; +import de.tudresden.inf.st.ros2rag.senderstub.ast.MqttHandler; import robot.RobotStateOuterClass.RobotState; import java.nio.file.Files; diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.ros2rag b/ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.ros2rag deleted file mode 100644 index 90e2ccabb89b8d1f48ad1ba01fa9112e5c762a70..0000000000000000000000000000000000000000 --- a/ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.ros2rag +++ /dev/null @@ -1,15 +0,0 @@ -// --- update definitions --- -read NativeTypes.IntValue; -read NativeTypes.ShortValue; -read NativeTypes.LongValue; -read NativeTypes.FloatValue; -read NativeTypes.DoubleValue; -read NativeTypes.CharValue; -read NativeTypes.StringValue; - -read BoxedTypes.IntValue; -read BoxedTypes.ShortValue; -read BoxedTypes.LongValue; -read BoxedTypes.FloatValue; -read BoxedTypes.DoubleValue; -read BoxedTypes.CharValue; diff --git a/ros2rag.tests/src/test/proto b/ros2rag.tests/src/test/proto deleted file mode 120000 index bb7d2bae29902b994e92987325a878a0fe318c69..0000000000000000000000000000000000000000 --- a/ros2rag.tests/src/test/proto +++ /dev/null @@ -1 +0,0 @@ -../../../ros2rag.common/proto/ \ No newline at end of file diff --git a/safety.sh b/safety.sh new file mode 100755 index 0000000000000000000000000000000000000000..369bcfd4bd24301758961d656b6e4661151b0efd --- /dev/null +++ b/safety.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +./gradlew :ros2rag.safety:installDist && \ + ./ros2rag.safety/build/install/ros2rag.safety/bin/ros2rag.safety $@ diff --git a/settings.gradle b/settings.gradle index 9235870b25a07e39bdaed474d79643bc80928795..cc56321647f48ec49cd042b9a2ae609a13cf5398 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,9 +1,9 @@ rootProject.name = 'ros2rag' include 'relast.preprocessor' -include 'ros2rag.base' -include 'ros2rag.tests' -include 'ros2rag.starter' +include 'ragconnect.base' +include 'ragconnect.tests' +include 'ros2rag.safety' include 'ros2rag.senderstub' include 'ros2rag.receiverstub' include 'ros2rag.goal' diff --git a/starter.sh b/starter.sh deleted file mode 100755 index e3bb9b9e8e3bb6684b32edb0b5eec17c00529048..0000000000000000000000000000000000000000 --- a/starter.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash -./gradlew :ros2rag.starter:installDist && \ - ./ros2rag.starter/build/install/ros2rag.starter/bin/ros2rag.starter $@