package com.dronecontrol.socketcontrol.control; import com.dronecontrol.droneapi.DroneController; import com.dronecontrol.droneapi.data.NavData; import com.dronecontrol.droneapi.data.enums.Camera; import com.dronecontrol.droneapi.data.enums.FlightAnimation; import com.dronecontrol.droneapi.data.enums.LedAnimation; import com.dronecontrol.droneapi.listeners.NavDataListener; import com.dronecontrol.droneapi.listeners.ReadyStateChangeListener; import com.dronecontrol.socketcontrol.helpers.RaceTimer; import com.dronecontrol.socketcontrol.input.data.MovementData; import com.dronecontrol.socketcontrol.input.data.PilotAction; import com.dronecontrol.socketcontrol.input.events.MovementDataListener; import com.dronecontrol.socketcontrol.input.events.PilotActionListener; import com.dronecontrol.socketcontrol.ui.data.UIAction; import com.dronecontrol.socketcontrol.ui.listeners.UIActionListener; import com.google.inject.Inject; public class DroneInputController implements ReadyStateChangeListener, NavDataListener, UIActionListener, MovementDataListener, PilotActionListener { private final DroneController droneController; private final RaceTimer raceTimer; private boolean flying = false; private boolean ready = false; @Inject public DroneInputController(DroneController droneController, RaceTimer raceTimer) { this.droneController = droneController; this.raceTimer = raceTimer; } @Override public void onAction(UIAction action) { switch (action) { case TAKE_OFF: takeOff(); break; case LAND: land(); break; case FLAT_TRIM: flatTrim(); break; case EMERGENCY: emergency(); break; case SWITCH_CAMERA: switchCamera(); break; case PLAY_LED_ANIMATION: playLedAnimation(); break; case PLAY_FLIGHT_ANIMATION: playFlightAnimation(); break; } } @Override public void onPilotAction(PilotAction pilotAction) { switch (pilotAction) { case TAKE_OFF_LAND: if (!flying) { takeOff(); } else { land(); } break; case TAKE_OFF: takeOff(); break; case LAND: land(); break; } } @Override public void onNavData(NavData navData) { flying = navData.getState().isFlying(); if (navData.getState().isEmergency()) { raceTimer.stop(); } } private void takeOff() { if (ready && !flying) { raceTimer.start(); droneController.takeOff(); } } private void land() { if (ready && flying) { raceTimer.stop(); droneController.land(); } } private void flatTrim() { if (ready) { droneController.flatTrim(); } } private void emergency() { if (ready) { droneController.emergency(); } } private void switchCamera() { if (ready) { droneController.switchCamera(Camera.NEXT); } } private void playLedAnimation() { if (ready) { droneController.playLedAnimation(LedAnimation.RED_SNAKE, 2.0f, 3); } } private void playFlightAnimation() { if (ready) { droneController.playFlightAnimation(FlightAnimation.FLIP_LEFT); } } @Override public void onMovementData(MovementData movementData) { if (movementData == null) { move(new MovementData(0, 0, 0, 0)); } else { move(movementData); } } private void move(MovementData movementData) { if (ready) { droneController.move(movementData.getRoll(), -movementData.getPitch(), movementData.getYaw(), movementData.getGaz()); } } @Override public void onReadyStateChange(ReadyState readyState) { if (readyState == ReadyState.READY) { ready = true; } else if (readyState == ReadyState.NOT_READY) { ready = false; } } }