/* * generated by Xtext */ package robots.missions.generator import org.eclipse.emf.common.util.EList import org.eclipse.emf.ecore.resource.Resource import org.eclipse.xtext.generator.IFileSystemAccess import org.eclipse.xtext.generator.IGenerator import robots.missions.taskDSL.Behaviour import robots.missions.taskDSL.Mission import robots.missions.taskDSL.OperatorE import robots.missions.taskDSL.StoppingExpression import robots.missions.taskDSL.Robot /** * Generates code from your model files on save. * * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation */ class TaskDSLGenerator implements IGenerator { override void doGenerate(Resource resource, IFileSystemAccess fsa) { var root = resource.allContents.head as Robot; if(root != null){ fsa.generateFile("nl/ru/des/Constants.java", makeConstants(root)); for(Behaviour b : root.behaviour){ fsa.generateFile("nl/ru/des/" + b.name + "Behaviour.java", makeBehaviour(b)); } fsa.generateFile("nl/ru/des/Missions.java", makeMissions(root.mission)); } } def CharSequence makeMissions(EList mission)''' package nl.ru.des; import java.util.LinkedList; import lejos.robotics.subsumption.Behavior; import lejos.robotics.RegulatedMotor; import nl.ru.des.sensors.SensorCollector; public class Missions{ public static LinkedList getMissions(final SensorCollector sensors, RegulatedMotor rightMotor, RegulatedMotor leftMotor, RegulatedMotor measMotor){ LinkedList missions = new LinkedList(); «FOR m : mission» missions.add(new Mission("«m.name»", new Behavior[]{ «FOR b : m.behaviours SEPARATOR "," AFTER ","»new «b.name»Behaviour(sensors, rightMotor, leftMotor, measMotor) «ENDFOR» new ShutdownBehaviour(){ @Override public boolean takeControl(){ return «printExpression(m.se)»; } }} «ENDFOR»)); return missions; } } ''' def CharSequence makeBehaviour(Behaviour b)''' package nl.ru.des; import lejos.robotics.RegulatedMotor; import nl.ru.des.sensors.SensorCollector; public class «b.name»Behaviour extends BasicBehaviour { public «b.name»Behaviour(SensorCollector sensors, RegulatedMotor rightMotor, RegulatedMotor leftMotor, RegulatedMotor measMotor){ super(sensors, rightMotor, leftMotor, measMotor); } «IF b.tc != null» @Override public boolean takeControl(){ return getSuppressed() == SuppressedState.IN_ACTION || «printExpression(b.tc)»; } «ENDIF» @Override public void action(){ LCDPrinter.print("Start: «b.name»"); super.action(); «FOR a : b.actions» «IF a.whichMotor != null» «IF a.acc > 0» «a.whichMotor.d.toString()»Motor.setAcceleration(«a.acc»); «a.whichMotor.d.toString()»Motor.setSpeed(«a.spd»); «ENDIF» «a.whichMotor.d.toString()»Motor.«a.moveDir.d.toString()»(); «ELSEIF a.time != null» time = System.currentTimeMillis(); while(getSuppressed() != SuppressedState.SUPPRESSED«IF a.time.time > 0» && System.currentTimeMillis()-time>«a.time.time»«ENDIF»){ Thread.yield(); } «ELSEIF a.turnDir != null» «IF a.acc > 0» leftMotor.setAcceleration(«a.acc»); leftMotor.setSpeed(«a.spd»); rightMotor.setAcceleration(«a.acc»); rightMotor.setSpeed(«a.spd»); «ENDIF» «a.turnDir.d.toString()»Turn(«a.degrees»); «ELSE» measure(); «ENDIF» «ENDFOR» LCDPrinter.print("Stop: «b.name»"); reset(); } } ''' def CharSequence makeConstants(Robot robot)''' package nl.ru.des; public class Constants{ public final static int speed = «robot.spd»; public final static int acceleration = «robot.acc»; }''' def CharSequence printExpression(StoppingExpression e)''' «IF e.scond != null» «IF !e.scond.colors.nullOrEmpty» sensors.collected(new int[]{«FOR c : e.scond.colors SEPARATOR ","»«c.d.ordinal»«ENDFOR»}) «ELSEIF e.scond.touch != null» sensors.«e.scond.touch.d.toString()»Touch() «ELSEIF e.scond.light != null» sensors.«e.scond.light.d.toString()»Light() «ELSEIF e.scond.dist != null» sensors.«e.scond.dist.d.toString()»Distance() «ELSEIF e.scond.color != null» sensors.color() == «e.scond.color.d.ordinal» «ENDIF» «ELSE» «IF e.op.d.equals(OperatorE.AND)» «FOR ex : e.s BEFORE "(" SEPARATOR "&&" AFTER ")"»«printExpression(ex)»«ENDFOR» «ELSE» «FOR ex : e.s BEFORE "(" SEPARATOR "||" AFTER ")"»«printExpression(ex)»«ENDFOR» «ENDIF» «ENDIF»''' }