package com.dronecontrol.intelcontrol.entry;
import com.dronecontrol.droneapi.DroneController;
import com.dronecontrol.droneapi.data.Config;
import com.dronecontrol.droneapi.listeners.ErrorListener;
import com.dronecontrol.intelcontrol.control.DroneInputController;
import com.dronecontrol.intelcontrol.ui.FxController;
import com.dronecontrol.intelcontrol.ui.FxWindow;
import com.dronecontrol.intelcontrol.ui.SwingWindow;
import com.dronecontrol.intelcontrol.ui.data.UIAction;
import com.dronecontrol.intelcontrol.ui.listeners.UIActionListener;
import com.dronecontrol.perceptual.PerceptualController;
import com.dronecontrol.perceptual.data.DetectionType;
import com.dronecontrol.perceptual.helpers.CoordinateCalculator;
import com.google.inject.Inject;
import javafx.stage.Stage;
import org.apache.log4j.Logger;
public class Main implements ErrorListener, UIActionListener
{
private final Logger logger = Logger.getLogger(ErrorListener.class);
private final FxWindow fxWindow;
private final SwingWindow swingWindow;
private final DroneController droneController;
private final DroneInputController droneInputController;
private final PerceptualController perceptualController;
private FxController fxController;
private CoordinateCalculator coordinateCalculator;
@Inject
public Main(FxWindow fxWindow, SwingWindow swingWindow, DroneController droneController,
DroneInputController droneInputController, PerceptualController perceptualController,
CoordinateCalculator coordinateCalculator)
{
this.fxWindow = fxWindow;
this.swingWindow = swingWindow;
this.droneController = droneController;
this.droneInputController = droneInputController;
this.perceptualController = perceptualController;
this.coordinateCalculator = coordinateCalculator;
}
public void start(Stage primaryStage)
{
startWindow(primaryStage);
addEventListeners();
startComponents();
}
private void startWindow(Stage primaryStage)
{
fxController = fxWindow.start(primaryStage);
swingWindow.start();
}
private void addEventListeners()
{
droneController.addErrorListener(this);
fxController.addUIActionListener(this);
droneController.addVideoDataListener(fxController);
droneController.addNavDataListener(fxController);
droneController.addNavDataListener(droneInputController);
droneController.addReadyStateChangeListener(droneInputController);
perceptualController.addPictureListener(swingWindow);
perceptualController.addDetectionListener(DetectionType.HANDS, swingWindow);
perceptualController.addGestureListener(droneInputController);
perceptualController.addDetectionListener(DetectionType.HANDS, droneInputController);
perceptualController.addDetectionListener(DetectionType.HANDS, fxController);
fxController.addUIActionListener(droneInputController);
coordinateCalculator.addCoordinateListener(fxController);
}
private void startComponents()
{
droneController.startAsync(new Config("com.dronecontrol.leap-drone", "myProfile", 2));
perceptualController.connect();
}
public void stop()
{
droneController.stop();
perceptualController.disconnect();
System.exit(0);
}
@Override
public void onError(Throwable e)
{
logger.error("There was an error", e);
System.exit(1);
}
@Override
public void onAction(UIAction action)
{
if (action == UIAction.CLOSE_APPLICATION)
{
stop();
}
}
}