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.autopilot.apm.solo.ArduSolo; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; 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 com.o3dr.services.android.lib.coordinate.LatLong; import com.o3dr.services.android.lib.coordinate.LatLongAlt; import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; /** * Created by Fredia Huya-Kouadio on 8/3/15. */ public class FollowSoloShot extends FollowAlgorithm { private final SoloComp soloComp; private final LatLongAlt locationCoord = new LatLongAlt(0, 0, 0); private final SoloMessageLocation locationSetter = new SoloMessageLocation(locationCoord); public FollowSoloShot(MavLinkDroneManager droneMgr, Handler handler) { super(droneMgr, handler); ArduSolo drone = (ArduSolo) droneMgr.getDrone(); this.soloComp = drone.getSoloComp(); } @Override public void enableFollow() { super.enableFollow(); soloComp.enableFollowDataConnection(); } @Override public void disableFollow() { super.disableFollow(); soloComp.disableFollowDataConnection(); } @Override protected void processNewLocation(Location location) { if (location != null) { LatLongAlt receivedCoord = location.getCoord(); locationCoord.set((LatLong)receivedCoord); locationSetter.setCoordinate(locationCoord); soloComp.updateFollowCenter(locationSetter); } } @Override public FollowModes getType() { return FollowModes.SOLO_SHOT; } @Override protected ROIEstimator initROIEstimator(MavLinkDrone drone, Handler handler) { return new SoloROIEstimator(drone, handler, ((ArduSolo)drone).getSoloComp()); } protected static class SoloROIEstimator extends ROIEstimator { private final LatLongAlt locationCoord = new LatLongAlt(0, 0, 0); private final SoloMessageLocation locationSetter = new SoloMessageLocation(locationCoord); private final SoloComp soloComp; public SoloROIEstimator(MavLinkDrone drone, Handler handler, SoloComp soloComp) { super(drone, handler); this.soloComp = soloComp; } @Override public void enableFollow(){ isFollowEnabled.set(true); } @Override public void disableFollow(){ if(isFollowEnabled.compareAndSet(true, false)){ realLocation = null; disableWatchdog(); } } @Override protected long getUpdatePeriod(){ return 40l; } @Override protected void sendUpdateROI(LatLong goCoord){ locationCoord.set(goCoord); locationSetter.setCoordinate(locationCoord); soloComp.updateFollowCenter(locationSetter); } } }