/* * 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.Robot import robots.missions.taskDSL.StoppingExpression /** * 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 «printExpression(m.se)»; } }} «ENDFOR»)); return missions; } } ''' def CharSequence makeBehaviours(EList list)''' package nl.ru.des; import lejos.hardware.motor.EV3LargeRegulatedMotor; public class Behaviours{ «FOR b : list» public static class «b.name»Behaviour extends BasicBehaviour { public «b.name»Behaviour(SensorCollector sensors, EV3LargeRegulatedMotor rightMotor, EV3LargeRegulatedMotor leftMotor, ColorMemory colors){ super(sensors, rightMotor, leftMotor, colors); } «IF b.tc != null» @Override public boolean takeControl(){ return «printExpression(b.tc)»; } «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()»(); «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 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.op != null» sensors.distance() «e.scond.op.d.toString()» «e.scond.dist» «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» ''' 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»; }''' }