package org.droidplanner.services.android.impl.core.drone.variables.calibration; import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.ardupilotmega.msg_mag_cal_progress; import com.MAVLink.ardupilotmega.msg_mag_cal_report; import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCalibration; import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; import org.droidplanner.services.android.impl.core.drone.DroneVariable; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import java.util.HashMap; import java.util.concurrent.atomic.AtomicBoolean; /** * Created by Fredia Huya-Kouadio on 5/3/15. */ public class MagnetometerCalibrationImpl extends DroneVariable implements DroneInterfaces.OnDroneListener<MavLinkDrone> { public interface OnMagnetometerCalibrationListener { void onCalibrationCancelled(); void onCalibrationProgress(msg_mag_cal_progress progress); void onCalibrationCompleted(msg_mag_cal_report result); } private final HashMap<Short, Info> magCalibrationTracker = new HashMap<>(); private OnMagnetometerCalibrationListener listener; private AtomicBoolean cancelled = new AtomicBoolean(false); public MagnetometerCalibrationImpl(MavLinkDrone myDrone) { super(myDrone); myDrone.addDroneListener(this); } public void setListener(OnMagnetometerCalibrationListener listener) { this.listener = listener; } public void startCalibration(boolean retryOnFailure, boolean saveAutomatically, int startDelay) { magCalibrationTracker.clear(); cancelled.set(false); MavLinkCalibration.startMagnetometerCalibration(myDrone, retryOnFailure, saveAutomatically, startDelay, null); } public void cancelCalibration() { MavLinkCalibration.cancelMagnetometerCalibration(myDrone, null); cancelled.set(true); if (listener != null) listener.onCalibrationCancelled(); } public void acceptCalibration() { MavLinkCalibration.acceptMagnetometerCalibration(myDrone, null); } public void processCalibrationMessage(MAVLinkMessage message) { switch (message.msgid) { case msg_mag_cal_progress.MAVLINK_MSG_ID_MAG_CAL_PROGRESS: { msg_mag_cal_progress progress = (msg_mag_cal_progress) message; Info info = magCalibrationTracker.get(progress.compass_id); if (info == null) { info = new Info(); magCalibrationTracker.put(progress.compass_id, info); } info.calProgress = progress; if (listener != null) listener.onCalibrationProgress(progress); break; } case msg_mag_cal_report.MAVLINK_MSG_ID_MAG_CAL_REPORT: { msg_mag_cal_report report = (msg_mag_cal_report) message; Info info = magCalibrationTracker.get(report.compass_id); if (info == null) { info = new Info(); magCalibrationTracker.put(report.compass_id, info); } info.calReport = report; if (listener != null) listener.onCalibrationCompleted((msg_mag_cal_report) message); break; } } } public HashMap<Short, Info> getMagCalibrationTracker() { return magCalibrationTracker; } public boolean isCancelled() { return cancelled.get(); } public static class Info { msg_mag_cal_progress calProgress; msg_mag_cal_report calReport; public msg_mag_cal_progress getCalProgress() { return calProgress; } public msg_mag_cal_report getCalReport() { return calReport; } } @Override public void onDroneEvent(DroneInterfaces.DroneEventsType event, MavLinkDrone drone) { switch(event){ case HEARTBEAT_TIMEOUT: case DISCONNECTED: cancelCalibration(); break; } } }