/* * 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.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)); fsa.generateFile("nl/ru/des/Behaviours.java", makeBehaviours(root.behaviour)); //fsa.generateFile("nl/ru/des/Missions.java", makeMissions(root.mission)); } } def CharSequence makeMissions(EList list)''' package nl.ru.des; import java.util.LinkedList; import lejos.hardware.motor.EV3LargeRegulatedMotor; import lejos.robotics.subsumption.Behavior; import nl.ru.des.Behaviours; public class Missions{ public static LinkedList getMissions(SensorCollector sensors, EV3LargeRegulatedMotor rightMotor, EV3LargeRegulatedMotor leftMotor, ColorMemory colors){ LinkedList missions = new LinkedList(); «FOR m : list» missions.add(new Mission("«m.name»", new Behavior[]{ «FOR b : m.behaviours SEPARATOR ","» new Behaviours.«b.name»Behaviour(sensors, rightMotor, leftMotor, colors) «ENDFOR», new ShutdownBehaviour(sensors, rightMotor, leftMotor, colors){ @Override public boolean takeControl(){ return »; } }} «ENDFOR»)); return missions; } } ''' def CharSequence makeBehaviours(EList list)''' package nl.ru.des; import lejos.hardware.motor.EV3LargeRegulatedMotor; import nl.ru.des.sensors.SensorCollector; public class Behaviours{ «FOR b : list» public static class «b.name»Behaviour extends BasicBehaviour { public «b.name»Behaviour(SensorCollector sensors, EV3LargeRegulatedMotor rightMotor, EV3LargeRegulatedMotor leftMotor, EV3LargeRegulatedMotor measMotor){ super(sensors, rightMotor, leftMotor, measMotor); } «IF b.tc != null» @Override public boolean takeControl(){ return ; } «ENDIF» @Override public void action(){ 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.dir.d.toString()»(); «ELSEIF a.measureWhat != null» «a.measureWhat.d.toString()»Measure(); «ELSE» time = System.currentTimeMillis(); while(!suppressed«IF a.time.time > 0» && System.currentTimeMillis()-time>«a.time.time»«ENDIF»){ Thread.yield(); } «ENDIF» «ENDFOR» reset(); } } «ENDFOR» } ''' 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»; }''' }