package org.myrobotlab.service; import org.myrobotlab.framework.Service; import org.myrobotlab.framework.ServiceType; import org.myrobotlab.logging.Level; import org.myrobotlab.logging.LoggerFactory; import org.myrobotlab.logging.Logging; import org.myrobotlab.logging.LoggingFactory; import org.myrobotlab.service.data.JoystickData; import org.myrobotlab.service.interfaces.JoystickListener; import org.myrobotlab.service.interfaces.MotorControl; import org.myrobotlab.service.interfaces.MotorController; import org.slf4j.Logger; public class Chassis extends Service implements JoystickListener { private static final long serialVersionUID = 1L; public final static Logger log = LoggerFactory.getLogger(Chassis.class); String joystickLeftAxisId; String joystickRightAxisId; MotorController controller; MotorControl left; MotorControl right; Joystick joystick; public Chassis(String n) { super(n); } public MotorControl getLeft() { left = (MotorControl) createPeer("left"); return left; } public MotorControl getRight() { right = (MotorControl) createPeer("right"); return right; } public Joystick getJoystick() { joystick = (Joystick) createPeer("joystick"); return joystick; } public MotorController getController() { controller = (MotorController) createPeer("controller"); return controller; } /** * This static method returns all the details of the class without it having * to be constructed. It has description, categories, dependencies, and peer * definitions. * * @return ServiceType - returns all the data * */ static public ServiceType getMetaData() { ServiceType meta = new ServiceType(Chassis.class.getCanonicalName()); meta.addDescription("control platform"); // add dependency if necessary // meta.addDependency("org.coolproject", "1.0.0"); meta.addCategory("general"); meta.addPeer("left", "Motor", "left drive motor"); meta.addPeer("right", "Motor", "right drive motor"); meta.addPeer("joystick", "Joystick", "joystick control"); meta.addPeer("controller", "Sabertooth", "serial controller"); return meta; } @Override public void onJoystickInput(JoystickData input) throws Exception { log.info(String.format("onJoystickInput %s", input.toString())); if (input.id.equals(joystickLeftAxisId)) { left.move(input.value); } else if (input.id.equals(joystickRightAxisId)) { right.move(input.value); } } public void attachJoystick(int index, String leftAxis, String rightAxis) { joystick = (Joystick) startPeer("joystick"); joystick.addInputListener(this); joystick.setController(index); this.joystickLeftAxisId = leftAxis; this.joystickRightAxisId = rightAxis; joystick.addInputListener(this); } public void stop() { left.stop(); right.stop(); } public void connect(String port) throws Exception { // if controller type - Aruduino 57600 if Sabertooh 9600 connect(port, Serial.BAUD_9600); } public void connect(String port, int rate) throws Exception { controller = getController(); // controller.connect(port, rate, 8, 1, 0); } public void startService() { super.startService(); left = (MotorControl) startPeer("left"); right = (MotorControl) startPeer("right"); joystick = (Joystick) startPeer("joystick"); controller = (MotorController) startPeer("controller"); } public void attachMotors(int leftPortNumber, int rightPortNumber) throws Exception { attachLeftMotor(leftPortNumber); attachRightMotor(rightPortNumber); } public void attachLeftMotor(int portNumber) throws Exception { MotorController mc = getController(); left.attach(mc); } public void attachRightMotor(int portNumber) throws Exception { MotorController mc = getController(); right.attach(mc); } public static void main(String[] args) { LoggingFactory.init(Level.INFO); try { Chassis chassis = (Chassis) Runtime.start("chassis", "Chassis"); chassis.connect("COM19");// , Serial.BAUD_9600); // TODO - when not set (error + info on what is wrong - possible // selections) chassis.attachMotors(2, 1); chassis.attachJoystick(5, "y", "rz"); // Runtime.start("webgui", "WebGui"); } catch (Exception e) { Logging.logError(e); } } }