package org.droidplanner.android.proxy.mission.item;
import com.o3dr.android.client.Drone;
import com.o3dr.services.android.lib.coordinate.LatLong;
import com.o3dr.services.android.lib.coordinate.LatLongAlt;
import com.o3dr.services.android.lib.drone.mission.item.MissionItem;
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.util.MathUtils;
import org.droidplanner.android.proxy.mission.MissionProxy;
import java.util.ArrayList;
import java.util.List;
/**
* This class is responsible for providing logic to access and interpret the
* {@link com.o3dr.services.android.lib.drone.mission.item.MissionItem} class on the Android layer,
* as well as providing methods for rendering it on the Android UI.
*/
public class MissionItemProxy {
/**
* This is the mission item object this class is built around.
*/
private final MissionItem mMissionItem;
/**
* This is the mission render to which this item belongs.
*/
private final MissionProxy mMission;
public MissionItemProxy(MissionProxy mission, MissionItem missionItem) {
mMission = mission;
mMissionItem = missionItem;
final Drone.OnMissionItemsBuiltCallback missionItemBuiltListener = new Drone.OnMissionItemsBuiltCallback() {
@Override
public void onMissionItemsBuilt(MissionItem.ComplexItem[] complexItems) {
mMission.notifyMissionUpdate(false);
}
};
if(mMissionItem instanceof SplineSurvey){
mMission.getDrone().buildMissionItemsAsync(new SplineSurvey[]{(SplineSurvey) mMissionItem}, missionItemBuiltListener);
}else if(mMissionItem instanceof Survey){
mMission.getDrone().buildMissionItemsAsync(new Survey[]{(Survey) mMissionItem}, missionItemBuiltListener);
}
else if(mMissionItem instanceof StructureScanner){
mMission.getDrone().buildMissionItemsAsync(new StructureScanner[]{(StructureScanner) mMissionItem}, missionItemBuiltListener);
}
}
/**
* Provides access to the owning mission render instance.
*
* @return
*/
public MissionProxy getMissionProxy() {
return mMission;
}
/**
* Provides access to the mission item instance.
*
* @return {@link com.o3dr.services.android.lib.drone.mission.item.MissionItem} object
*/
public MissionItem getMissionItem() {
return mMissionItem;
}
/**
* @param previousPoint
* Previous point on the path, null if there wasn't a previous
* point
* @return the set of points/coords making up this mission item.
*/
public List<LatLong> getPath(LatLong previousPoint) {
List<LatLong> pathPoints = new ArrayList<LatLong>();
switch (mMissionItem.getType()) {
case LAND:
case WAYPOINT:
case SPLINE_WAYPOINT:
pathPoints.add(((MissionItem.SpatialItem) mMissionItem).getCoordinate());
break;
case CIRCLE:
Circle circle = (Circle) mMissionItem;
LatLongAlt circleCenter = circle.getCoordinate();
double circleRadius = circle.getRadius();
double startHeading = previousPoint == null ? 0
: MathUtils.getHeadingFromCoordinates(circleCenter, previousPoint);
int circleTurnsAngle = 360 * circle.getTurns();
for (int i = 0; i <= circleTurnsAngle; i += 10) {
pathPoints.add(MathUtils.newCoordFromBearingAndDistance(circleCenter,
startHeading + i, circleRadius));
}
break;
case SPLINE_SURVEY:
case SURVEY:
List<LatLong> gridPoints = ((Survey) mMissionItem).getGridPoints();
if (gridPoints != null && !gridPoints.isEmpty()) {
pathPoints.addAll(gridPoints);
}
break;
case STRUCTURE_SCANNER:
StructureScanner survey = (StructureScanner) mMissionItem;
pathPoints.addAll(survey.getPath());
break;
default:
break;
}
return pathPoints;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof MissionItemProxy)) {
return false;
}
MissionItemProxy that = (MissionItemProxy) o;
if (mMissionItem != null ? !mMissionItem.equals(that.mMissionItem) : that.mMissionItem != null) {
return false;
}
if (mMission != null ? !mMission.equals(that.mMission) : that.mMission != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = mMissionItem != null ? mMissionItem.hashCode() : 0;
result = 31 * result + (mMission != null ? mMission.hashCode() : 0);
return result;
}
}