package com.o3dr.services.android.lib.drone.mission; import android.os.Bundle; import android.os.Parcelable; import android.os.Parcelable.Creator; import com.o3dr.services.android.lib.drone.mission.item.MissionItem; import com.o3dr.services.android.lib.drone.mission.item.command.CameraTrigger; import com.o3dr.services.android.lib.drone.mission.item.command.ChangeSpeed; import com.o3dr.services.android.lib.drone.mission.item.command.DoJump; import com.o3dr.services.android.lib.drone.mission.item.command.EpmGripper; import com.o3dr.services.android.lib.drone.mission.item.command.ResetROI; import com.o3dr.services.android.lib.drone.mission.item.command.ReturnToLaunch; import com.o3dr.services.android.lib.drone.mission.item.command.SetRelay; import com.o3dr.services.android.lib.drone.mission.item.command.SetServo; import com.o3dr.services.android.lib.drone.mission.item.command.Takeoff; import com.o3dr.services.android.lib.drone.mission.item.command.YawCondition; import com.o3dr.services.android.lib.drone.mission.item.complex.SplineSurvey; import com.o3dr.services.android.lib.drone.mission.item.complex.StructureScanner; import com.o3dr.services.android.lib.drone.mission.item.complex.Survey; import com.o3dr.services.android.lib.drone.mission.item.spatial.Circle; import com.o3dr.services.android.lib.drone.mission.item.spatial.DoLandStart; import com.o3dr.services.android.lib.drone.mission.item.spatial.Land; import com.o3dr.services.android.lib.drone.mission.item.spatial.RegionOfInterest; import com.o3dr.services.android.lib.drone.mission.item.spatial.SplineWaypoint; import com.o3dr.services.android.lib.drone.mission.item.spatial.Waypoint; import com.o3dr.services.android.lib.drone.property.Type; import com.o3dr.services.android.lib.util.ParcelableUtils; /** * /** * List of mission item types. */ public enum MissionItemType { WAYPOINT("Waypoint") { @Override public MissionItem getNewItem() { return new Waypoint(); } @Override protected Parcelable.Creator<Waypoint> getMissionItemCreator() { return Waypoint.CREATOR; } }, SPLINE_WAYPOINT("Spline Waypoint") { @Override public MissionItem getNewItem() { return new SplineWaypoint(); } @Override protected Parcelable.Creator<SplineWaypoint> getMissionItemCreator() { return SplineWaypoint.CREATOR; } }, TAKEOFF("Takeoff") { @Override public MissionItem getNewItem() { return new Takeoff(); } @Override protected Parcelable.Creator<Takeoff> getMissionItemCreator() { return Takeoff.CREATOR; } }, CHANGE_SPEED("Change Speed") { @Override public MissionItem getNewItem() { return new ChangeSpeed(); } @Override protected Parcelable.Creator<ChangeSpeed> getMissionItemCreator() { return ChangeSpeed.CREATOR; } }, CAMERA_TRIGGER("Camera Trigger") { @Override public MissionItem getNewItem() { return new CameraTrigger(); } @Override protected Creator<CameraTrigger> getMissionItemCreator() { return CameraTrigger.CREATOR; } }, EPM_GRIPPER("EPM Gripper") { @Override public MissionItem getNewItem() { return new EpmGripper(); } @Override protected Creator<EpmGripper> getMissionItemCreator() { return EpmGripper.CREATOR; } }, RETURN_TO_LAUNCH("Return to Launch") { @Override public MissionItem getNewItem() { return new ReturnToLaunch(); } @Override protected Creator<ReturnToLaunch> getMissionItemCreator() { return ReturnToLaunch.CREATOR; } }, LAND("Land") { @Override public MissionItem getNewItem() { return new Land(); } @Override protected Creator<Land> getMissionItemCreator() { return Land.CREATOR; } }, CIRCLE("Circle") { @Override public MissionItem getNewItem() { return new Circle(); } @Override protected Creator<Circle> getMissionItemCreator() { return Circle.CREATOR; } }, REGION_OF_INTEREST("Region of Interest") { @Override public MissionItem getNewItem() { return new RegionOfInterest(); } @Override protected Creator<RegionOfInterest> getMissionItemCreator() { return RegionOfInterest.CREATOR; } }, SURVEY("Survey") { @Override public MissionItem getNewItem() { return new Survey(); } @Override protected Creator<Survey> getMissionItemCreator() { return Survey.CREATOR; } }, STRUCTURE_SCANNER("Structure Scanner") { @Override public MissionItem getNewItem() { return new StructureScanner(); } @Override protected Creator<StructureScanner> getMissionItemCreator() { return StructureScanner.CREATOR; } }, SET_SERVO("Set Servo") { @Override public MissionItem getNewItem() { return new SetServo(); } @Override protected Creator<SetServo> getMissionItemCreator() { return SetServo.CREATOR; } }, YAW_CONDITION("Set Yaw") { @Override public MissionItem getNewItem() { return new YawCondition(); } @Override protected Creator<YawCondition> getMissionItemCreator() { return YawCondition.CREATOR; } }, SET_RELAY("Set Relay") { @Override public MissionItem getNewItem() { return new SetRelay(); } @Override protected Creator<SetRelay> getMissionItemCreator() { return SetRelay.CREATOR; } }, DO_LAND_START("Do Land start") { @Override public boolean isTypeSupported(Type vehicleType){ return super.isTypeSupported(vehicleType) && vehicleType.getDroneType() == Type.TYPE_PLANE; } @Override public MissionItem getNewItem() { return new DoLandStart(); } @Override protected Creator<DoLandStart> getMissionItemCreator() { return DoLandStart.CREATOR; } }, SPLINE_SURVEY("Spline Survey") { @Override public MissionItem getNewItem() { return new SplineSurvey(); } @Override protected Creator<SplineSurvey> getMissionItemCreator() { return SplineSurvey.CREATOR; } }, DO_JUMP("Do Jump") { @Override public MissionItem getNewItem() { return new DoJump(); } @Override protected Creator<DoJump> getMissionItemCreator() { return DoJump.CREATOR; } }, RESET_ROI("Reset ROI") { @Override public MissionItem getNewItem() { return new ResetROI(); } @Override protected Creator<ResetROI> getMissionItemCreator() { return ResetROI.CREATOR; } }; private final static String EXTRA_MISSION_ITEM_TYPE = "extra_mission_item_type"; private final static String EXTRA_MISSION_ITEM = "extra_mission_item"; private final String label; private MissionItemType(String label) { this.label = label; } public String getLabel() { return this.label; } @Override public String toString() { return getLabel(); } public abstract MissionItem getNewItem(); public final Bundle storeMissionItem(MissionItem item) { Bundle bundle = new Bundle(2); storeMissionItem(item, bundle); return bundle; } public void storeMissionItem(MissionItem missionItem, Bundle bundle) { bundle.putString(EXTRA_MISSION_ITEM_TYPE, name()); bundle.putByteArray(EXTRA_MISSION_ITEM, ParcelableUtils.marshall(missionItem)); } protected abstract <T extends MissionItem> Creator<T> getMissionItemCreator(); public static <T extends MissionItem> T restoreMissionItemFromBundle(Bundle bundle) { if (bundle == null) return null; String typeName = bundle.getString(EXTRA_MISSION_ITEM_TYPE); byte[] marshalledItem = bundle.getByteArray(EXTRA_MISSION_ITEM); if (typeName == null || marshalledItem == null) return null; MissionItemType type = MissionItemType.valueOf(typeName); if (type == null) return null; T missionItem = ParcelableUtils.unmarshall(marshalledItem, type.<T>getMissionItemCreator()); return missionItem; } /** * Indicates if the mission item is supported on the given vehicle type. * @param vehicleType Vehicle type to check against (i.e: plane, copter, rover...) * @return true the mission item is supported, false otherwise. */ public boolean isTypeSupported(Type vehicleType){ return vehicleType != null; } }