package org.droidplanner.services.android.impl.core.drone.autopilot.apm;
import android.content.Context;
import android.os.Handler;
import com.MAVLink.Messages.MAVLinkMessage;
import com.MAVLink.common.msg_global_position_int;
import com.MAVLink.common.msg_vfr_hud;
import com.MAVLink.enums.MAV_TYPE;
import com.github.zafarkhaja.semver.Version;
import com.o3dr.android.client.apis.CapabilityApi;
import org.droidplanner.services.android.impl.communication.model.DataLink;
import org.droidplanner.services.android.impl.core.drone.LogMessageListener;
import org.droidplanner.services.android.impl.core.firmware.FirmwareType;
import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser;
/**
* Created by Fredia Huya-Kouadio on 7/27/15.
*/
public class ArduPlane extends ArduPilot {
private static final Version ARDU_PLANE_V3_3 = Version.forIntegers(3,3,0);
private static final Version ARDU_PLANE_V3_4 = Version.forIntegers(3,4,0);
private static final Version COMPASS_CALIBRATION_MIN_VERSION = ARDU_PLANE_V3_4;
public ArduPlane(String droneId, Context context, DataLink.DataLinkProvider<MAVLinkMessage> mavClient, Handler handler, AutopilotWarningParser warningParser, LogMessageListener logListener) {
super(droneId, context, mavClient, handler, warningParser, logListener);
}
@Override
public int getType(){
return MAV_TYPE.MAV_TYPE_FIXED_WING;
}
@Override
protected void setType(int type){}
@Override
public FirmwareType getFirmwareType() {
return FirmwareType.ARDU_PLANE;
}
@Override
protected void processVfrHud(msg_vfr_hud vfrHud){
//Nothing to do. Plane used GLOBAL_POSITION_INT to set altitude and speeds unlike copter
}
/**
* Used to update the vehicle location, and altitude.
* @param gpi
*/
@Override
protected void processGlobalPositionInt(msg_global_position_int gpi){
if(gpi == null)
return;
super.processGlobalPositionInt(gpi);
final double relativeAlt = gpi.relative_alt / 1000.0;
final double groundSpeedX = gpi.vx / 100.0;
final double groundSpeedY = gpi.vy / 100.0;
final double groundSpeed = Math.sqrt(Math.pow(groundSpeedX, 2) + Math.pow(groundSpeedY, 2));
final double climbRate = gpi.vz / 100.0;
setAltitudeGroundAndAirSpeeds(relativeAlt, groundSpeed, groundSpeed, climbRate);
}
@Override
protected boolean isFeatureSupported(String featureId){
switch(featureId){
case CapabilityApi.FeatureIds.COMPASS_CALIBRATION:
return getFirmwareVersionNumber().greaterThanOrEqualTo(COMPASS_CALIBRATION_MIN_VERSION);
default:
return super.isFeatureSupported(featureId);
}
}
}