package org.droidplanner.services.android.impl.core.gcs.follow; import android.os.Handler; import org.droidplanner.services.android.impl.core.MAVLink.command.doCmd.MavLinkDoCmds; 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.roi.ROIEstimator; import com.o3dr.services.android.lib.coordinate.LatLong; import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.HashMap; import java.util.Map; import timber.log.Timber; /** * Created by fhuya on 1/9/15. */ public class FollowGuidedScan extends FollowAbove { private static final long TIMEOUT = 1000; //ms public static final String EXTRA_FOLLOW_ROI_TARGET = "extra_follow_roi_target"; public static final double DEFAULT_FOLLOW_ROI_ALTITUDE = 10; //meters private static final double sDefaultRoiAltitude = (DEFAULT_FOLLOW_ROI_ALTITUDE); @Override public FollowModes getType() { return FollowModes.GUIDED_SCAN; } public FollowGuidedScan(MavLinkDroneManager droneMgr, Handler handler) { super(droneMgr, handler); } @Override public void updateAlgorithmParams(Map<String, ?> params) { super.updateAlgorithmParams(params); final LatLongAlt target; LatLong tempCoord = (LatLong) params.get(EXTRA_FOLLOW_ROI_TARGET); if (tempCoord == null || tempCoord instanceof LatLongAlt) { target = (LatLongAlt) tempCoord; } else { target = new LatLongAlt(tempCoord, sDefaultRoiAltitude); } getROIEstimator().updateROITarget(target); } @Override protected ROIEstimator initROIEstimator(MavLinkDrone drone, Handler handler) { return new GuidedROIEstimator(drone, handler); } @Override public Map<String, Object> getParams() { Map<String, Object> params = new HashMap<>(); params.put(EXTRA_FOLLOW_ROI_TARGET, getROIEstimator().roiTarget); return params; } @Override protected GuidedROIEstimator getROIEstimator() { return (GuidedROIEstimator) super.getROIEstimator(); } private static class GuidedROIEstimator extends ROIEstimator { private LatLongAlt roiTarget; public GuidedROIEstimator(MavLinkDrone drone, Handler handler) { super(drone, handler); } void updateROITarget(LatLongAlt roiTarget) { this.roiTarget = roiTarget; onLocationUpdate(null); } @Override protected void updateROI() { if (roiTarget == null) { System.out.println("Cancelling ROI lock."); //Fallback to the default behavior super.updateROI(); } else { Timber.d("ROI Target: " + roiTarget.toString()); //Track the target until told otherwise. MavLinkDoCmds.setROI(drone, roiTarget, null); watchdog.postDelayed(watchdogCallback, TIMEOUT); } } } }