added validation and document update
authorMart Lubbers <mart@martlubbers.net>
Thu, 7 Jan 2016 14:03:04 +0000 (15:03 +0100)
committerMart Lubbers <mart@martlubbers.net>
Thu, 7 Jan 2016 14:03:04 +0000 (15:03 +0100)
dsl/runtime/specs/wander.tdsl
dsl/xtend/src/robots/missions/validation/TaskDSLValidator.xtend
marsrover/document/robot.tex

index d592a25..04b78a0 100644 (file)
@@ -104,7 +104,7 @@ Behaviour AvoidHigh
 //Mission avoidHighRocks
 //     using Drive AvoidHigh BumpR BumpL StayInFieldB StayInFieldL StayInFieldR and stops when Never
 Mission measureLakes
-       using Drive MeasureRedLake MeasureGreenLake MeasureBlueLake and stops when (&& flag set GreenMeasured flag set BlueMeasured flag set RedMeasured)
+       using Drive Drive MeasureRedLake MeasureGreenLake MeasureBlueLake and stops when (&& flag set GreenMeasured flag set BlueMeasured flag set RedMeasured)
 //Mission findBlueLakeWhileAvoidingRocks
 //     using Wander BumpR BumpL StayInFieldB StayInFieldL StayInFieldR and stops when Color is Blue
 //Mission findAllLakesAndMeasureThem
index f3926b5..e9f20fb 100644 (file)
@@ -3,6 +3,14 @@
  */
 package robots.missions.validation
 
+import java.util.LinkedList
+import java.util.List
+import org.eclipse.xtext.validation.Check
+import robots.missions.taskDSL.Action
+import robots.missions.taskDSL.Behaviour
+import robots.missions.taskDSL.Mission
+import robots.missions.taskDSL.Robot
+
 //import org.eclipse.xtext.validation.Check
 /**
  * This class contains custom validation rules. 
@@ -10,23 +18,44 @@ package robots.missions.validation
  * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
  */
 class TaskDSLValidator extends AbstractTaskDSLValidator {
-//     @Check
-//     def checkOnlyOneBehaviourPerMissionEmptyTakeControl(Mission m) {
-//             var List<String> empty = new LinkedList<String>();
-//             var List<String> all = new LinkedList<String>();
-//             for(Behaviour b : m.behaviours){
-//                     if(b.tc == null){
-//                             empty.add(b.name);
-//                     }
-//                     all.add(b.name);
-//             }
-//             if(empty.size > 1){
-//                             warning("Multiple behaviours without takeControl predicate. You might want to remove some of: " + empty.toString(), m.eContainingFeature);
-//             }
-//             if(all.toSet().size() < all.size()){
-//                     warning("You have duplicate behaviours.", m, TaskDSLPackage.Literals::MISSION__BEHAVIOURS);
-//             }
-//     }
+       @Check
+       def checkRobot(Robot r){
+               if(r.acc == 0){
+                       warning("Acceleration set to zero, this could lead to non moving robot", null);
+               }
+               if(r.spd == 0){
+                       warning("Acceleration set to zero, this could lead to non moving robot", null);
+               }
+       }
+       
+       @Check
+       def checkBehavioursl(Mission m) {
+               var List<String> empty = new LinkedList<String>();
+               var List<String> all = new LinkedList<String>();
+               var List<String> warned = new LinkedList<String>();
+               for(Behaviour b : m.behaviours){
+                       if(b.tc == null){
+                               empty.add(b.name);
+                       }
+                       if(all.contains(b.name) && !warned.contains(b.name)){
+                               warning("Behaviour '" + b.name + "' multiple times in the behaviourlist.", null);
+                               warned.add(b.name);
+                       }
+                       all.add(b.name);
+               }
+               if(empty.size() > 1){
+                               warning("Multiple behaviours without takeControl predicate. You might want to remove some of: " + empty.toString(), null);
+               }
+       }
 
-//Validate if the random degrees are correct
+       @Check
+       def checkActions(Action a) {
+               if(a.turnType != null && a.turnType.turnDir == null){
+                       if(a.turnType.start == a.turnType.end){
+                               error("Start and end cannot be the same", null);
+                       } else if(a.turnType.start > a.turnType.end){
+                               error("Start should be smaller then end", null);
+                       }
+               }
+       }
 }
index 5873485..7a38c1d 100644 (file)
@@ -114,28 +114,14 @@ actuators when asked for.
        \caption{Subsumption architecture}\label{fig:sub}
 \end{figure}
 
-
 We use the pre-implemented architecture from the \emph{LeJOS} where with the
 use of a \texttt{suppressed} flag in every behaviour. The \texttt{suppressed}
-variable is a flag that is set when \texttt{suppress} is called and the
+flag that is set when the \texttt{suppress} function is called and the
 \texttt{action} function will monitor said variable to be able to stop when it
-is suppressed. To be able to let the robot finish some critical actions (eg.\
-turning a specific number of degrees) we need some changes to the standard
-architecture. More concretely we change the standard \texttt{suppressed}
-boolean to a three state variable.
-
-When such a task is started and said behaviour does not ask for control the
-behaviour can still finish if it is not interrupted. For example when the left
-light sensor detects that the robot is driving of the planet a right turn of
-$90$ degrees may be initiated. This right turn will be completed even when the
-left light sensor is not detecting a dangerous value.  The suppressed flag can
-take three states. \texttt{IDLE}, \texttt{IN\_ACTION} and \texttt{SUPPRESSED}.
-By default all behaviours have the \texttt{IDLE} state. When a behaviour is
-started the state will change to \texttt{IN\_ACTION} and when a behaviour
-finished the state will be reset to \texttt{IDLE}. When a behaviour needs to be
-interrupted the state is set to \texttt{SUPPRESSED} and since the behaviour is
-always monitoring the state it will shutdown as soon as possible and reset the
-state.
+is suppressed. The entire action will always finish, however when the flag is
+set all loops are terminated immediatly leaving only atomic actions which are
+executed almost always asychronously. Therefore the action will stop almost
+immediatly after suppress is called.
 
 Since the task of the robot is to perform certain missions in sequence we also
 added a special kind of behaviour to the standard architecture. This behaviour,
@@ -192,4 +178,4 @@ wait 250 ms
 
 \subsection{Code Structure}
 The DSL is able to generate the missions and behaviours's source code. The generated source code contains one java class for mission and one java class for each different behaviours. Moreover, the default source code is categorized by two packages. First package contains a class implementing bluetooth communication protocol between Producer-Consumer (BTController.java), a class to collect the sensor data from Producer (SensorCollector.java), and a class to collect the sensor data from Consumer (RemoteSensors.java).
-Second package mainly contains the arbitrator implementation of the MarsRover (Marster.java), LCD Print functionality (LCDPrinter.java), the default actions of the MarsRover (BasicBehaviour.java), the implementation of misssion (Mission.java), and a class to terminate the mission (ShutdownBehaviour.java).
\ No newline at end of file
+Second package mainly contains the arbitrator implementation of the MarsRover (Marster.java), LCD Print functionality (LCDPrinter.java), the default actions of the MarsRover (BasicBehaviour.java), the implementation of misssion (Mission.java), and a class to terminate the mission (ShutdownBehaviour.java).