package org.droidplanner.services.android.impl.core.gcs.follow;
import android.os.Handler;
import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone;
import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager;
import org.droidplanner.services.android.impl.core.gcs.location.Location;
import org.droidplanner.services.android.impl.core.gcs.roi.ROIEstimator;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
public abstract class FollowAlgorithm {
protected final MavLinkDroneManager droneMgr;
private final ROIEstimator roiEstimator;
private final AtomicBoolean isFollowEnabled = new AtomicBoolean(false);
public FollowAlgorithm(MavLinkDroneManager droneMgr, Handler handler) {
this.droneMgr = droneMgr;
final MavLinkDrone drone = droneMgr.getDrone();
this.roiEstimator = initROIEstimator(drone, handler);
}
protected boolean isFollowEnabled() {
return isFollowEnabled.get();
}
public void enableFollow() {
isFollowEnabled.set(true);
if(roiEstimator != null)
roiEstimator.enableFollow();
}
public void disableFollow() {
if (isFollowEnabled.compareAndSet(true, false)) {
if (roiEstimator != null)
roiEstimator.disableFollow();
}
}
public void updateAlgorithmParams(Map<String, ?> paramsMap) {
}
protected ROIEstimator initROIEstimator(MavLinkDrone drone, Handler handler) {
return new ROIEstimator(drone, handler);
}
protected ROIEstimator getROIEstimator() {
return roiEstimator;
}
public final void onLocationReceived(Location location) {
if (isFollowEnabled.get()) {
if(roiEstimator != null)
roiEstimator.onLocationUpdate(location);
processNewLocation(location);
}
}
protected abstract void processNewLocation(Location location);
public abstract FollowModes getType();
public Map<String, Object> getParams() {
return Collections.emptyMap();
}
public enum FollowModes {
LEASH("Leash"),
LEAD("Lead"),
RIGHT("Right"),
LEFT("Left"),
CIRCLE("Orbit"),
ABOVE("Above"),
SPLINE_LEASH("Vector Leash"),
SPLINE_ABOVE("Vector Above"),
GUIDED_SCAN("Guided Scan"),
LOOK_AT_ME("Look At Me"),
SOLO_SHOT("Solo Follow Shot");
private String name;
FollowModes(String str) {
name = str;
}
@Override
public String toString() {
return name;
}
public FollowModes next() {
return values()[(ordinal() + 1) % values().length];
}
public FollowAlgorithm getAlgorithmType(MavLinkDroneManager droneMgr, Handler handler) {
switch (this) {
case LEASH:
default:
return new FollowLeash(droneMgr, handler, 8.0);
case LEAD:
return new FollowLead(droneMgr, handler, 15.0);
case RIGHT:
return new FollowRight(droneMgr, handler, 10.0);
case LEFT:
return new FollowLeft(droneMgr, handler, 10.0);
case CIRCLE:
return new FollowCircle(droneMgr, handler, 15.0, 10.0);
case ABOVE:
return new FollowAbove(droneMgr, handler);
case SPLINE_LEASH:
return new FollowSplineLeash(droneMgr, handler, 8.0);
case SPLINE_ABOVE:
return new FollowSplineAbove(droneMgr, handler);
case GUIDED_SCAN:
return new FollowGuidedScan(droneMgr, handler);
case LOOK_AT_ME:
return new FollowLookAtMe(droneMgr, handler);
case SOLO_SHOT:
return new FollowSoloShot(droneMgr, handler);
}
}
}
}