From 35d80d272e7446afcaff79936f42eba646f25e6f Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Thu, 23 Oct 2014 10:16:58 -0700 Subject: [PATCH 01/15] Android: Fix classpath so indexing works for the core project --- Android/.classpath | 2 ++ Android/project.properties | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Android/.classpath b/Android/.classpath index 695fcafa91..a36b91f54c 100644 --- a/Android/.classpath +++ b/Android/.classpath @@ -1,5 +1,7 @@ + + diff --git a/Android/project.properties b/Android/project.properties index c808d006df..44f4b4e00f 100644 --- a/Android/project.properties +++ b/Android/project.properties @@ -14,10 +14,10 @@ target=android-21 android.library.reference.1=../Libraries/usb-serial-for-android/UsbSerialLibrary android.library.reference.2=../Libraries/HorizontalVariableListView/HorizontalVariableListView -android.library.reference.3=../Libraries/google-play-services_lib -android.library.reference.4=../Libraries/PebbleKit -android.library.reference.5=../Libraries/mapbox-android-sdk/0.4.0 -android.library.reference.6=../Libraries/AndroidSlidingUpPanel-2.0.2/library -android.library.reference.7=../Libraries/EllipsoidFit/EllipsoidFit -android.library.reference.8=../Mavlink -android.library.reference.9=../Core +android.library.reference.3=../Mavlink +android.library.reference.4=../Core +android.library.reference.5=../Libraries/google-play-services_lib +android.library.reference.6=../Libraries/PebbleKit +android.library.reference.7=../Libraries/mapbox-android-sdk/0.4.0 +android.library.reference.8=../Libraries/AndroidSlidingUpPanel-2.0.2/library +android.library.reference.9=../Libraries/EllipsoidFit/EllipsoidFit From 65a9b353a17efae676b49fa4142ca06b02adebda Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Thu, 23 Oct 2014 10:28:15 -0700 Subject: [PATCH 02/15] Mission: Add the change speed mission item --- .../droidplanner/core/mission/Mission.java | 4 ++ .../core/mission/MissionItemType.java | 5 +- .../core/mission/commands/ChangeSpeed.java | 58 +++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 Core/src/org/droidplanner/core/mission/commands/ChangeSpeed.java diff --git a/Core/src/org/droidplanner/core/mission/Mission.java b/Core/src/org/droidplanner/core/mission/Mission.java index 320466fd97..ec1e51b75f 100644 --- a/Core/src/org/droidplanner/core/mission/Mission.java +++ b/Core/src/org/droidplanner/core/mission/Mission.java @@ -11,6 +11,7 @@ import org.droidplanner.core.helpers.geoTools.GeoTools; import org.droidplanner.core.helpers.units.Altitude; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.mission.commands.ChangeSpeed; import org.droidplanner.core.mission.commands.ReturnToHome; import org.droidplanner.core.mission.commands.Takeoff; import org.droidplanner.core.mission.waypoints.Circle; @@ -267,6 +268,9 @@ private List processMavLinkMessages(List msgs) { case MAV_CMD.MAV_CMD_NAV_TAKEOFF: received.add(new Takeoff(msg, this)); break; + case MAV_CMD.MAV_CMD_DO_CHANGE_SPEED: + received.add(new ChangeSpeed(msg, this)); + break; case MAV_CMD.MAV_CMD_DO_SET_ROI: received.add(new RegionOfInterest(msg, this)); break; diff --git a/Core/src/org/droidplanner/core/mission/MissionItemType.java b/Core/src/org/droidplanner/core/mission/MissionItemType.java index c756f4fffe..430db6aaa4 100644 --- a/Core/src/org/droidplanner/core/mission/MissionItemType.java +++ b/Core/src/org/droidplanner/core/mission/MissionItemType.java @@ -3,6 +3,7 @@ import java.util.Collections; import org.droidplanner.core.helpers.coordinates.Coord2D; +import org.droidplanner.core.mission.commands.ChangeSpeed; import org.droidplanner.core.mission.commands.ReturnToHome; import org.droidplanner.core.mission.commands.Takeoff; import org.droidplanner.core.mission.survey.CylindricalSurvey; @@ -16,7 +17,7 @@ public enum MissionItemType { WAYPOINT("Waypoint"), SPLINE_WAYPOINT("Spline Waypoint"), TAKEOFF("Takeoff"), RTL( "Return to Launch"), LAND("Land"), CIRCLE("Circle"), ROI("Region of Interest"), SURVEY( - "Survey"), CYLINDRICAL_SURVEY("Landmark Mapper"); + "Survey"), CYLINDRICAL_SURVEY("Landmark Mapper"), CHANGE_SPEED("Change Speed"); private final String name; @@ -36,6 +37,8 @@ public MissionItem getNewItem(MissionItem referenceItem) throws IllegalArgumentE return new SplineWaypoint(referenceItem); case TAKEOFF: return new Takeoff(referenceItem); + case CHANGE_SPEED: + return new ChangeSpeed(referenceItem); case RTL: return new ReturnToHome(referenceItem); case LAND: diff --git a/Core/src/org/droidplanner/core/mission/commands/ChangeSpeed.java b/Core/src/org/droidplanner/core/mission/commands/ChangeSpeed.java new file mode 100644 index 0000000000..2f599421a6 --- /dev/null +++ b/Core/src/org/droidplanner/core/mission/commands/ChangeSpeed.java @@ -0,0 +1,58 @@ +package org.droidplanner.core.mission.commands; + +import java.util.List; + +import org.droidplanner.core.helpers.units.Speed; +import org.droidplanner.core.mission.Mission; +import org.droidplanner.core.mission.MissionItem; +import org.droidplanner.core.mission.MissionItemType; + +import com.MAVLink.Messages.ardupilotmega.msg_mission_item; +import com.MAVLink.Messages.enums.MAV_CMD; +import com.MAVLink.Messages.enums.MAV_FRAME; + +public class ChangeSpeed extends MissionCMD { + private Speed speed = new Speed(5); + + public ChangeSpeed(MissionItem item) { + super(item); + } + + public ChangeSpeed(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public ChangeSpeed(Mission mission, Speed speed) { + super(mission); + this.speed = speed; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_CHANGE_SPEED; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT; + mavMsg.param2 = (float) speed.valueInMetersPerSecond(); + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + speed = new Speed(mavMsg.param2); + } + + @Override + public MissionItemType getType() { + return MissionItemType.CHANGE_SPEED; + } + + public Speed getSpeed() { + return speed; + } + + public void setSpeed(Speed speed) { + this.speed = speed; + } +} \ No newline at end of file From e6991f106083a5af77067cf4916d199d2b04bc71 Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Thu, 23 Oct 2014 10:28:32 -0700 Subject: [PATCH 03/15] Test: Added unit test for ChangeSpeed --- .../mission/waypoints/ChangeSpeedTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Core/test/org/droidplanner/core/mission/waypoints/ChangeSpeedTest.java diff --git a/Core/test/org/droidplanner/core/mission/waypoints/ChangeSpeedTest.java b/Core/test/org/droidplanner/core/mission/waypoints/ChangeSpeedTest.java new file mode 100644 index 0000000000..3441d1e0a8 --- /dev/null +++ b/Core/test/org/droidplanner/core/mission/waypoints/ChangeSpeedTest.java @@ -0,0 +1,35 @@ +package org.droidplanner.core.mission.waypoints; + +import java.util.List; + +import junit.framework.TestCase; + +import org.droidplanner.core.helpers.units.Speed; +import org.droidplanner.core.mission.Mission; +import org.droidplanner.core.mission.commands.ChangeSpeed; + +import com.MAVLink.Messages.ardupilotmega.msg_mission_item; +import com.MAVLink.Messages.enums.MAV_CMD; + +public class ChangeSpeedTest extends TestCase { + + public void testPackMissionItem() { + Mission mission = new Mission(null); + ChangeSpeed item = new ChangeSpeed(mission, new Speed(12.0)); + + List listOfMsg = item.packMissionItem(); + assertEquals(1, listOfMsg.size()); + + msg_mission_item msg = listOfMsg.get(0); + + assertEquals(MAV_CMD.MAV_CMD_DO_CHANGE_SPEED, msg.command); + assertEquals(0.0f, msg.x); + assertEquals(0.0f, msg.y); + assertEquals(0.0f, msg.z); + assertEquals(0.0f, msg.param1); + assertEquals(12.0f, msg.param2); + assertEquals(0.0f, msg.param3); + assertEquals(0.0f, msg.param3); + } + +} From 06ec744b4c060678f0226475136fcd7d01599018 Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Thu, 23 Oct 2014 10:30:03 -0700 Subject: [PATCH 04/15] Android: Fix orphan string --- Android/res/layout/fragment_editor_detail_takeoff.xml | 2 +- Android/res/values/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Android/res/layout/fragment_editor_detail_takeoff.xml b/Android/res/layout/fragment_editor_detail_takeoff.xml index 42fc1d161b..b53dc65831 100644 --- a/Android/res/layout/fragment_editor_detail_takeoff.xml +++ b/Android/res/layout/fragment_editor_detail_takeoff.xml @@ -52,7 +52,7 @@ android:layout_marginLeft="12dp" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/mission_item_title_takeoff"/> + android:text="@string/waypointType_TakeOff"/> Waypoint Spline Waypoint - Take-Off + Takeoff Return To Launch Land Circle @@ -476,7 +476,7 @@ How to plan and fly a mission - TAKEOFF + Advanced Number of Steps Altitude Step From 9f4968b12de81b53aff14b2cc6737f6ff08e061c Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Thu, 23 Oct 2014 10:30:35 -0700 Subject: [PATCH 05/15] Editor: Add the Change Speed item to the editor --- .../fragment_editor_detail_change_speed.xml | 98 +++++++++++++++++++ Android/res/values/strings.xml | 5 +- .../fragments/MissionChangeSpeedFragment.java | 50 ++++++++++ .../item/fragments/MissionDetailFragment.java | 3 + 4 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 Android/res/layout/fragment_editor_detail_change_speed.xml create mode 100644 Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java diff --git a/Android/res/layout/fragment_editor_detail_change_speed.xml b/Android/res/layout/fragment_editor_detail_change_speed.xml new file mode 100644 index 0000000000..b71be28c95 --- /dev/null +++ b/Android/res/layout/fragment_editor_detail_change_speed.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/res/values/strings.xml b/Android/res/values/strings.xml index 403136bd7e..87872946fa 100644 --- a/Android/res/values/strings.xml +++ b/Android/res/values/strings.xml @@ -180,6 +180,7 @@ Takeoff Return To Launch Land + Change Speed Circle Loiter Region of Interest @@ -199,7 +200,7 @@ Set condition to reach a certain target angle. Delay mission state machine until within desired distance of next NAV point Changes the home location either to the current location or a specified location. - Change speed and/or throttle set points.Set -1 for both Speed and Throttle if no changes is required + Change vehicle speed until the end of this mission. Sets a location and altitude to point copter towards and to aim an optional camera. Repeat waypoint @@ -337,6 +338,7 @@ Altitude m m/s + Speed Ground Speed Air Speed --° @@ -351,6 +353,7 @@ Auto Follow Dronie + Change Speed Telemetry Flight modes Info Bar diff --git a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java new file mode 100644 index 0000000000..e1982a11be --- /dev/null +++ b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java @@ -0,0 +1,50 @@ +package org.droidplanner.android.proxy.mission.item.fragments; + +import org.droidplanner.R; +import org.droidplanner.android.widgets.spinnerWheel.CardWheelHorizontalView; +import org.droidplanner.android.widgets.spinnerWheel.adapters.NumericWheelAdapter; +import org.droidplanner.core.helpers.units.Speed; +import org.droidplanner.core.mission.MissionItem; +import org.droidplanner.core.mission.MissionItemType; +import org.droidplanner.core.mission.commands.ChangeSpeed; + +import android.os.Bundle; +import android.view.View; + +public class MissionChangeSpeedFragment extends MissionDetailFragment implements + CardWheelHorizontalView.OnCardWheelChangedListener { + + @Override + protected int getResource() { + return R.layout.fragment_editor_detail_change_speed; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + typeSpinner.setSelection(commandAdapter.getPosition(MissionItemType.CHANGE_SPEED)); + + ChangeSpeed item = (ChangeSpeed) getMissionItems().get(0); + + final NumericWheelAdapter adapter = new NumericWheelAdapter(getActivity() + .getApplicationContext(), R.layout.wheel_text_centered, 1, + 20, "%d m"); + final CardWheelHorizontalView cardAltitudePicker = (CardWheelHorizontalView) view + .findViewById(R.id.picker1); + cardAltitudePicker.setViewAdapter(adapter); + cardAltitudePicker.addChangingListener(this); + cardAltitudePicker.setCurrentValue((int) item.getSpeed().valueInMetersPerSecond()); + } + + @Override + public void onChanged(CardWheelHorizontalView wheel, int oldValue, int newValue) { + switch (wheel.getId()) { + case R.id.picker1: + for(MissionItem missionItem : getMissionItems()) { + ChangeSpeed item = (ChangeSpeed) missionItem; + item.setSpeed(new Speed(newValue)); + } + break; + } + } +} diff --git a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java index 35129383ee..d979c4859a 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java +++ b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionDetailFragment.java @@ -77,6 +77,9 @@ public static MissionDetailFragment newInstance(MissionItemType itemType) { case CIRCLE: fragment = new MissionCircleFragment(); break; + case CHANGE_SPEED: + fragment = new MissionChangeSpeedFragment(); + break; case ROI: fragment = new MissionRegionOfInterestFragment(); break; From cadaf1fb46f9de615df75f17b03b951c9ee0102a Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Thu, 23 Oct 2014 11:15:30 -0700 Subject: [PATCH 06/15] Dronie: Slow down the drone as it reaches the final dronie mission --- Core/src/org/droidplanner/core/mission/Mission.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Core/src/org/droidplanner/core/mission/Mission.java b/Core/src/org/droidplanner/core/mission/Mission.java index ec1e51b75f..0b8d4188ec 100644 --- a/Core/src/org/droidplanner/core/mission/Mission.java +++ b/Core/src/org/droidplanner/core/mission/Mission.java @@ -11,6 +11,7 @@ import org.droidplanner.core.helpers.geoTools.GeoTools; import org.droidplanner.core.helpers.units.Altitude; import org.droidplanner.core.helpers.units.Length; +import org.droidplanner.core.helpers.units.Speed; import org.droidplanner.core.mission.commands.ChangeSpeed; import org.droidplanner.core.mission.commands.ReturnToHome; import org.droidplanner.core.mission.commands.Takeoff; @@ -317,11 +318,15 @@ public void makeAndUploadDronie() { public static List createDronie(Mission mMission,Coord2D start, Coord2D end) { final int startAltitude = 4; + final int roiDistance = -8; + Coord2D slowDownPoint = GeoTools.pointAlongTheLine(start, end, 10); List dronieItems = new ArrayList(); dronieItems.add(new Takeoff(mMission, new Altitude(startAltitude))); - dronieItems.add(new RegionOfInterest(mMission,new Coord3D(GeoTools.pointAlongTheLine(start, end, -8), new Altitude(1.0)))); + dronieItems.add(new RegionOfInterest(mMission,new Coord3D(GeoTools.pointAlongTheLine(start, end, roiDistance), new Altitude(1.0)))); dronieItems.add(new Waypoint(mMission, new Coord3D(end, new Altitude(startAltitude+GeoTools.getDistance(start, end).valueInMeters()/2.0)))); + dronieItems.add(new Waypoint(mMission, new Coord3D(slowDownPoint, new Altitude(startAltitude+GeoTools.getDistance(start, slowDownPoint).valueInMeters()/2.0)))); + dronieItems.add(new ChangeSpeed(mMission, new Speed(0.5))); dronieItems.add(new Waypoint(mMission, new Coord3D(start, new Altitude(startAltitude)))); dronieItems.add(new Land(mMission,start)); return dronieItems; From 18c4a9440653786f1b4ab88987dae6de2161981a Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Thu, 23 Oct 2014 11:43:15 -0700 Subject: [PATCH 07/15] Dronie: Update the map when the dronie is sent to the copter --- Core/src/org/droidplanner/core/mission/Mission.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/src/org/droidplanner/core/mission/Mission.java b/Core/src/org/droidplanner/core/mission/Mission.java index 0b8d4188ec..5851e38942 100644 --- a/Core/src/org/droidplanner/core/mission/Mission.java +++ b/Core/src/org/droidplanner/core/mission/Mission.java @@ -313,13 +313,14 @@ public void makeAndUploadDronie() { items.addAll(createDronie(this, currentPosition, GeoTools.newCoordFromBearingAndDistance( currentPosition, 180 + myDrone.getOrientation().getYaw(), 50.0))); sendMissionToAPM(); + myDrone.notifyDroneEvent(DroneEventsType.MISSION_RECEIVED); notifyMissionUpdate(); } public static List createDronie(Mission mMission,Coord2D start, Coord2D end) { final int startAltitude = 4; final int roiDistance = -8; - Coord2D slowDownPoint = GeoTools.pointAlongTheLine(start, end, 10); + Coord2D slowDownPoint = GeoTools.pointAlongTheLine(start, end, 3); List dronieItems = new ArrayList(); dronieItems.add(new Takeoff(mMission, new Altitude(startAltitude))); From 01af0f8449eb24d1a131f411549d5a453c74c7ed Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Thu, 23 Oct 2014 15:38:20 -0700 Subject: [PATCH 08/15] fixed unit for the change speed mission item. --- .../mission/item/fragments/MissionChangeSpeedFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java index e1982a11be..bf868c1c81 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java +++ b/Android/src/org/droidplanner/android/proxy/mission/item/fragments/MissionChangeSpeedFragment.java @@ -28,7 +28,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) { final NumericWheelAdapter adapter = new NumericWheelAdapter(getActivity() .getApplicationContext(), R.layout.wheel_text_centered, 1, - 20, "%d m"); + 20, "%d m/s"); final CardWheelHorizontalView cardAltitudePicker = (CardWheelHorizontalView) view .findViewById(R.id.picker1); cardAltitudePicker.setViewAdapter(adapter); From 80b045a1524de49b7841a761e837ded1f2c596d4 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Thu, 23 Oct 2014 16:25:23 -0700 Subject: [PATCH 09/15] Update MissionItemType.java --- Core/src/org/droidplanner/core/mission/MissionItemType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/droidplanner/core/mission/MissionItemType.java b/Core/src/org/droidplanner/core/mission/MissionItemType.java index 430db6aaa4..c54f3ece13 100644 --- a/Core/src/org/droidplanner/core/mission/MissionItemType.java +++ b/Core/src/org/droidplanner/core/mission/MissionItemType.java @@ -17,7 +17,7 @@ public enum MissionItemType { WAYPOINT("Waypoint"), SPLINE_WAYPOINT("Spline Waypoint"), TAKEOFF("Takeoff"), RTL( "Return to Launch"), LAND("Land"), CIRCLE("Circle"), ROI("Region of Interest"), SURVEY( - "Survey"), CYLINDRICAL_SURVEY("Landmark Mapper"), CHANGE_SPEED("Change Speed"); + "Survey"), CYLINDRICAL_SURVEY("Structure Scan"), CHANGE_SPEED("Change Speed"); private final String name; @@ -56,4 +56,4 @@ public MissionItem getNewItem(MissionItem referenceItem) throws IllegalArgumentE + "."); } } -} \ No newline at end of file +} From 250b1aa4cdb3b55bf5e54dba8d285010855ed052 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Thu, 23 Oct 2014 16:27:05 -0700 Subject: [PATCH 10/15] Default cross-hatch to false --- .../droidplanner/core/mission/survey/CylindricalSurvey.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/droidplanner/core/mission/survey/CylindricalSurvey.java b/Core/src/org/droidplanner/core/mission/survey/CylindricalSurvey.java index 233dd353f2..0f0ce9190a 100644 --- a/Core/src/org/droidplanner/core/mission/survey/CylindricalSurvey.java +++ b/Core/src/org/droidplanner/core/mission/survey/CylindricalSurvey.java @@ -35,7 +35,7 @@ private CylindricalSurvey(Mission mission) { startHeight = new Altitude(10); heightStep = new Altitude(5); numberOfSteps = 2; - crossHatch = true; + crossHatch = false; } public CylindricalSurvey(Mission mission, Coord2D center) { @@ -180,4 +180,4 @@ public void setNumberOfSteps(int newValue) { numberOfSteps = newValue; } -} \ No newline at end of file +} From 148aed04e744602449cbb450ae735860f526e0f7 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Thu, 23 Oct 2014 16:30:37 -0700 Subject: [PATCH 11/15] Update UI to change name of scan option to "Structure Scan --- Android/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Android/res/values/strings.xml b/Android/res/values/strings.xml index 87872946fa..0e4b83eeac 100644 --- a/Android/res/values/strings.xml +++ b/Android/res/values/strings.xml @@ -185,7 +185,7 @@ Loiter Region of Interest Survey Polygon - Landmark Mapper + Structure Scan Land vehicle at the current location. You must manually exit Auto mode to disarm motors. From 3a522f2a87a9a7c3b467c522fccd511c212b9141 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Thu, 23 Oct 2014 16:44:14 -0700 Subject: [PATCH 12/15] add dialog to confirm dronie creation, and tell the use where to stand. --- Android/res/values/preferences_keys.xml | 1 + Android/res/values/strings.xml | 2 ++ Android/res/xml/preferences.xml | 8 +++++ .../CopterFlightActionsFragment.java | 25 ++++++++++++++-- .../android/proxy/mission/MissionProxy.java | 16 ++++------ .../droidplanner/core/mission/Mission.java | 30 ++++++++++++------- 6 files changed, 59 insertions(+), 23 deletions(-) diff --git a/Android/res/values/preferences_keys.xml b/Android/res/values/preferences_keys.xml index b5a2efa056..5a960a6250 100644 --- a/Android/res/values/preferences_keys.xml +++ b/Android/res/values/preferences_keys.xml @@ -44,6 +44,7 @@ This file is used to store the preferences keys so that it's accessible and modi pref_warn_on_arm pref_auto_insert_mission_takeoff_rtl_land pref_warn_on_takeoff_in_auto + pref_warn_on_dronie_creation pref_enable_tts tts_periodic diff --git a/Android/res/values/strings.xml b/Android/res/values/strings.xml index 87872946fa..f1c5a9829a 100644 --- a/Android/res/values/strings.xml +++ b/Android/res/values/strings.xml @@ -512,5 +512,7 @@ User Interface -> Preference Dialogs]]> Take off in Auto? Warning! The drone will now take off and start the mission. + Create dronie? + Please stand back 5m before starting the dronie. diff --git a/Android/res/xml/preferences.xml b/Android/res/xml/preferences.xml index 2e7973d48a..e29987d007 100644 --- a/Android/res/xml/preferences.xml +++ b/Android/res/xml/preferences.xml @@ -168,6 +168,14 @@ android:defaultValue="@string/pref_dialog_entry_ask" android:entryValues="@array/preference_dialog_entry"/> + + diff --git a/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java b/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java index 7b85d6548f..3a72af1d81 100644 --- a/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java +++ b/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java @@ -17,6 +17,7 @@ import org.droidplanner.android.activities.helpers.SuperUI; import org.droidplanner.android.dialogs.YesNoDialog; import org.droidplanner.android.dialogs.YesNoWithPrefsDialog; +import org.droidplanner.android.proxy.mission.MissionProxy; import org.droidplanner.android.utils.analytics.GAUtils; import org.droidplanner.core.MAVLink.MavLinkArm; import org.droidplanner.core.drone.DroneInterfaces; @@ -35,7 +36,7 @@ public class CopterFlightActionsFragment extends Fragment implements View.OnClic private static final double TAKEOFF_ALTITUDE = 10.0; private Drone drone; - + private MissionProxy missionProxy; private Follow followMe; private View mDisconnectedButtons; @@ -56,6 +57,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa DroidPlannerApp droidPlannerApp = (DroidPlannerApp) getActivity().getApplication(); drone = droidPlannerApp.getDrone(); followMe = droidPlannerApp.getFollowMe(); + missionProxy = droidPlannerApp.getMissionProxy(); return view; } @@ -208,7 +210,7 @@ public void onClick(View v) { break; case R.id.mc_dronieBtn: - drone.getMission().makeAndUploadDronie(); + getDronieConfirmation(); eventBuilder.setAction(ACTION_FLIGHT_ACTION_BUTTON).setLabel("Dronie uploaded"); break; @@ -223,6 +225,25 @@ public void onClick(View v) { } + private void getDronieConfirmation() { + YesNoWithPrefsDialog ynd = YesNoWithPrefsDialog.newInstance(getActivity() + .getApplicationContext(), getString(R.string.pref_dronie_creation_title), + getString(R.string.pref_dronie_creation_message), new YesNoDialog.Listener() { + @Override + public void onYes() { + missionProxy.makeAndUploadDronie(); + } + + @Override + public void onNo() { + } + }, getString(R.string.pref_warn_on_dronie_creation_key)); + + if(ynd != null){ + ynd.show(getChildFragmentManager(), "Confirm dronie creation"); + } + } + private void getTakeOffInAutoConfirmation() { YesNoWithPrefsDialog ynd = YesNoWithPrefsDialog.newInstance(getActivity() .getApplicationContext(), getString(R.string.dialog_confirm_take_off_in_auto_title), diff --git a/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java b/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java index e87b48e343..ae2320e087 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java +++ b/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java @@ -25,6 +25,7 @@ import org.droidplanner.core.mission.waypoints.SpatialCoordItem; import org.droidplanner.core.mission.waypoints.SplineWaypoint; import org.droidplanner.core.mission.waypoints.Waypoint; +import org.droidplanner.core.model.Drone; import org.droidplanner.core.util.Pair; /** @@ -223,16 +224,6 @@ public void addTakeoff() { mMission.addMissionItem(takeoff); } - public void addDronie(Coord2D start, Coord2D end) { - clear(); - - List dronieItems = Mission.createDronie(mMission,start, end); - - addMissionItems(dronieItems); - } - - - public void addTakeOffAndRTL(){ if(!mMission.isFirstItemTakeoff()){ final Takeoff takeOff = new Takeoff(mMission, new Altitude(Takeoff.DEFAULT_TAKEOFF_ALTITUDE)); @@ -569,4 +560,9 @@ public Length getMissionLength() { return new Length(0); } } + + public void makeAndUploadDronie() { + mMission.makeAndUploadDronie(); + refresh(); + } } diff --git a/Core/src/org/droidplanner/core/mission/Mission.java b/Core/src/org/droidplanner/core/mission/Mission.java index 5851e38942..5a5442e381 100644 --- a/Core/src/org/droidplanner/core/mission/Mission.java +++ b/Core/src/org/droidplanner/core/mission/Mission.java @@ -310,26 +310,34 @@ public void makeAndUploadDronie() { return; } items.clear(); - items.addAll(createDronie(this, currentPosition, GeoTools.newCoordFromBearingAndDistance( - currentPosition, 180 + myDrone.getOrientation().getYaw(), 50.0))); + items.addAll(createDronie(currentPosition, GeoTools.newCoordFromBearingAndDistance( + currentPosition, 180 + myDrone.getOrientation().getYaw(), 50.0))); sendMissionToAPM(); - myDrone.notifyDroneEvent(DroneEventsType.MISSION_RECEIVED); notifyMissionUpdate(); } - public static List createDronie(Mission mMission,Coord2D start, Coord2D end) { + public List createDronie(Coord2D start, Coord2D end) { final int startAltitude = 4; final int roiDistance = -8; Coord2D slowDownPoint = GeoTools.pointAlongTheLine(start, end, 3); + + Speed defaultSpeed = myDrone.getSpeed().getSpeedParameter(); + if(defaultSpeed == null){ + defaultSpeed = new Speed(5); + } List dronieItems = new ArrayList(); - dronieItems.add(new Takeoff(mMission, new Altitude(startAltitude))); - dronieItems.add(new RegionOfInterest(mMission,new Coord3D(GeoTools.pointAlongTheLine(start, end, roiDistance), new Altitude(1.0)))); - dronieItems.add(new Waypoint(mMission, new Coord3D(end, new Altitude(startAltitude+GeoTools.getDistance(start, end).valueInMeters()/2.0)))); - dronieItems.add(new Waypoint(mMission, new Coord3D(slowDownPoint, new Altitude(startAltitude+GeoTools.getDistance(start, slowDownPoint).valueInMeters()/2.0)))); - dronieItems.add(new ChangeSpeed(mMission, new Speed(0.5))); - dronieItems.add(new Waypoint(mMission, new Coord3D(start, new Altitude(startAltitude)))); - dronieItems.add(new Land(mMission,start)); + dronieItems.add(new Takeoff(this, new Altitude(startAltitude))); + dronieItems.add(new RegionOfInterest(this, new Coord3D(GeoTools.pointAlongTheLine(start, + end, roiDistance), new Altitude(1.0)))); + dronieItems.add(new Waypoint(this, new Coord3D(end, new Altitude(startAltitude+GeoTools + .getDistance(start, end).valueInMeters()/2.0)))); + dronieItems.add(new Waypoint(this, new Coord3D(slowDownPoint, + new Altitude(startAltitude+GeoTools.getDistance(start, slowDownPoint).valueInMeters()/2.0)))); + dronieItems.add(new ChangeSpeed(this, new Speed(1.0))); + dronieItems.add(new Waypoint(this, new Coord3D(start, new Altitude(startAltitude)))); + dronieItems.add(new ChangeSpeed(this, defaultSpeed)); + dronieItems.add(new Land(this,start)); return dronieItems; } From 846f2e88515a881d9b4b5b994ec64d9fe341164e Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Thu, 23 Oct 2014 17:07:06 -0700 Subject: [PATCH 13/15] rotate the screen in the direction the dronie is headed. --- .../android/activities/FlightActivity.java | 9 ++++++--- .../CopterFlightActionsFragment.java | 19 ++++++++++++++++++- .../android/proxy/mission/MissionProxy.java | 5 +++-- .../droidplanner/core/mission/Mission.java | 14 +++++++++++--- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/Android/src/org/droidplanner/android/activities/FlightActivity.java b/Android/src/org/droidplanner/android/activities/FlightActivity.java index 0393973f99..d625497767 100644 --- a/Android/src/org/droidplanner/android/activities/FlightActivity.java +++ b/Android/src/org/droidplanner/android/activities/FlightActivity.java @@ -119,9 +119,7 @@ public void onDrawerOpened() { resetMapBearing.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if(mapFragment != null) { - mapFragment.updateMapBearing(0); - } + updateMapBearing(0); } }); @@ -237,6 +235,11 @@ private void updateMapLocationButtons(AutoPanMode mode) { } } + public void updateMapBearing(float bearing){ + if(mapFragment != null) + mapFragment.updateMapBearing(bearing); + } + /** * Ensures that the device has the correct version of the Google Play * Services. diff --git a/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java b/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java index 3a72af1d81..fb2f3ee4dc 100644 --- a/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java +++ b/Android/src/org/droidplanner/android/fragments/CopterFlightActionsFragment.java @@ -1,5 +1,6 @@ package org.droidplanner.android.fragments; +import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -14,6 +15,7 @@ import org.droidplanner.R; import org.droidplanner.android.DroidPlannerApp; +import org.droidplanner.android.activities.FlightActivity; import org.droidplanner.android.activities.helpers.SuperUI; import org.droidplanner.android.dialogs.YesNoDialog; import org.droidplanner.android.dialogs.YesNoWithPrefsDialog; @@ -50,6 +52,15 @@ public class CopterFlightActionsFragment extends Fragment implements View.OnClic private Button pauseBtn; private Button autoBtn; + @Override + public void onAttach(Activity activity){ + super.onAttach(activity); + if(!(activity instanceof FlightActivity)){ + throw new IllegalStateException("Parent activity must be an instance of " + + FlightActivity.class.getName()); + } + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_copter_mission_control, container, false); @@ -231,7 +242,13 @@ private void getDronieConfirmation() { getString(R.string.pref_dronie_creation_message), new YesNoDialog.Listener() { @Override public void onYes() { - missionProxy.makeAndUploadDronie(); + final float bearing = missionProxy.makeAndUploadDronie(); + if(bearing >= 0){ + final FlightActivity flightActivity = (FlightActivity) getActivity(); + if(flightActivity != null){ + flightActivity.updateMapBearing(bearing); + } + } } @Override diff --git a/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java b/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java index ae2320e087..b835fb106b 100644 --- a/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java +++ b/Android/src/org/droidplanner/android/proxy/mission/MissionProxy.java @@ -561,8 +561,9 @@ public Length getMissionLength() { } } - public void makeAndUploadDronie() { - mMission.makeAndUploadDronie(); + public float makeAndUploadDronie() { + final double bearing = mMission.makeAndUploadDronie(); refresh(); + return (float) bearing; } } diff --git a/Core/src/org/droidplanner/core/mission/Mission.java b/Core/src/org/droidplanner/core/mission/Mission.java index 5a5442e381..82ade41f90 100644 --- a/Core/src/org/droidplanner/core/mission/Mission.java +++ b/Core/src/org/droidplanner/core/mission/Mission.java @@ -303,17 +303,25 @@ public List getMsgMissionItems() { return data; } - public void makeAndUploadDronie() { + /** + * Create and upload a dronie mission to the drone + * @return the bearing in degrees the drone trajectory will take. + */ + public double makeAndUploadDronie() { Coord2D currentPosition = myDrone.getGps().getPosition(); if(currentPosition == null || myDrone.getGps().getSatCount()<=5){ myDrone.notifyDroneEvent(DroneEventsType.WARNING_NO_GPS); - return; + return -1; } + + final double bearing = 180 + myDrone.getOrientation().getYaw(); items.clear(); items.addAll(createDronie(currentPosition, GeoTools.newCoordFromBearingAndDistance( - currentPosition, 180 + myDrone.getOrientation().getYaw(), 50.0))); + currentPosition, bearing, 50.0))); sendMissionToAPM(); notifyMissionUpdate(); + + return bearing; } public List createDronie(Coord2D start, Coord2D end) { From 8f18b4aa9aae59ac7b3a526db1b397ad0fa95e86 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Thu, 23 Oct 2014 17:13:33 -0700 Subject: [PATCH 14/15] code cleanup. --- Android/res/values/strings.xml | 5 +- .../droidplanner/core/mission/Mission.java | 113 +++++++++--------- 2 files changed, 60 insertions(+), 58 deletions(-) diff --git a/Android/res/values/strings.xml b/Android/res/values/strings.xml index f1c5a9829a..6d10ab1460 100644 --- a/Android/res/values/strings.xml +++ b/Android/res/values/strings.xml @@ -498,7 +498,7 @@ Locator Open Log File - Waiting for GPS... + Waiting for GPS… Miscellaneous @@ -513,6 +513,7 @@ Take off in Auto? Warning! The drone will now take off and start the mission. Create dronie? - Please stand back 5m before starting the dronie. + Please stand back 8m before starting the + dronie. diff --git a/Core/src/org/droidplanner/core/mission/Mission.java b/Core/src/org/droidplanner/core/mission/Mission.java index 82ade41f90..1f91569659 100644 --- a/Core/src/org/droidplanner/core/mission/Mission.java +++ b/Core/src/org/droidplanner/core/mission/Mission.java @@ -1,8 +1,8 @@ package org.droidplanner.core.mission; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.MAVLink.Messages.ardupilotmega.msg_mission_ack; +import com.MAVLink.Messages.ardupilotmega.msg_mission_item; +import com.MAVLink.Messages.enums.MAV_CMD; import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.core.drone.DroneVariable; @@ -24,9 +24,9 @@ import org.droidplanner.core.model.Drone; import org.droidplanner.core.util.Pair; -import com.MAVLink.Messages.ardupilotmega.msg_mission_ack; -import com.MAVLink.Messages.ardupilotmega.msg_mission_item; -import com.MAVLink.Messages.enums.MAV_CMD; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * This implements a mavlink mission. A mavlink mission is a set of @@ -106,10 +106,10 @@ public void addMissionItem(MissionItem missionItem) { notifyMissionUpdate(); } - public void addMissionItem(int index, MissionItem missionItem){ - items.add(index, missionItem); - notifyMissionUpdate(); - } + public void addMissionItem(int index, MissionItem missionItem) { + items.add(index, missionItem); + notifyMissionUpdate(); + } /** * Signals that this mission object was updated. //TODO: maybe move outside @@ -143,39 +143,39 @@ public Altitude getLastAltitude() { */ public void replace(MissionItem oldItem, MissionItem newItem) { final int index = items.indexOf(oldItem); - if(index == -1){ - return; - } + if (index == -1) { + return; + } items.remove(index); items.add(index, newItem); notifyMissionUpdate(); } - public void replaceAll(List> updatesList){ - if(updatesList == null || updatesList.isEmpty()){ - return; - } + public void replaceAll(List> updatesList) { + if (updatesList == null || updatesList.isEmpty()) { + return; + } - boolean wasUpdated = false; - for(Pair updatePair : updatesList){ - final MissionItem oldItem = updatePair.first; - final int index = items.indexOf(oldItem); - if(index == -1){ - continue; - } + boolean wasUpdated = false; + for (Pair updatePair : updatesList) { + final MissionItem oldItem = updatePair.first; + final int index = items.indexOf(oldItem); + if (index == -1) { + continue; + } - final MissionItem newItem = updatePair.second; - items.remove(index); - items.add(index, newItem); + final MissionItem newItem = updatePair.second; + items.remove(index); + items.add(index, newItem); - wasUpdated = true; - } + wasUpdated = true; + } - if(wasUpdated) { - notifyMissionUpdate(); - } - } + if (wasUpdated) { + notifyMissionUpdate(); + } + } /** * Reverse the order of the mission items. @@ -303,49 +303,50 @@ public List getMsgMissionItems() { return data; } - /** - * Create and upload a dronie mission to the drone - * @return the bearing in degrees the drone trajectory will take. - */ + /** + * Create and upload a dronie mission to the drone + * + * @return the bearing in degrees the drone trajectory will take. + */ public double makeAndUploadDronie() { Coord2D currentPosition = myDrone.getGps().getPosition(); - if(currentPosition == null || myDrone.getGps().getSatCount()<=5){ + if (currentPosition == null || myDrone.getGps().getSatCount() <= 5) { myDrone.notifyDroneEvent(DroneEventsType.WARNING_NO_GPS); return -1; } - final double bearing = 180 + myDrone.getOrientation().getYaw(); + final double bearing = 180 + myDrone.getOrientation().getYaw(); items.clear(); - items.addAll(createDronie(currentPosition, GeoTools.newCoordFromBearingAndDistance( - currentPosition, bearing, 50.0))); + items.addAll(createDronie(currentPosition, + GeoTools.newCoordFromBearingAndDistance(currentPosition, bearing, 50.0))); sendMissionToAPM(); notifyMissionUpdate(); - return bearing; + return bearing; } public List createDronie(Coord2D start, Coord2D end) { final int startAltitude = 4; final int roiDistance = -8; - Coord2D slowDownPoint = GeoTools.pointAlongTheLine(start, end, 3); + Coord2D slowDownPoint = GeoTools.pointAlongTheLine(start, end, 5); + + Speed defaultSpeed = myDrone.getSpeed().getSpeedParameter(); + if (defaultSpeed == null) { + defaultSpeed = new Speed(5); + } - Speed defaultSpeed = myDrone.getSpeed().getSpeedParameter(); - if(defaultSpeed == null){ - defaultSpeed = new Speed(5); - } - List dronieItems = new ArrayList(); dronieItems.add(new Takeoff(this, new Altitude(startAltitude))); dronieItems.add(new RegionOfInterest(this, new Coord3D(GeoTools.pointAlongTheLine(start, - end, roiDistance), new Altitude(1.0)))); - dronieItems.add(new Waypoint(this, new Coord3D(end, new Altitude(startAltitude+GeoTools - .getDistance(start, end).valueInMeters()/2.0)))); - dronieItems.add(new Waypoint(this, new Coord3D(slowDownPoint, - new Altitude(startAltitude+GeoTools.getDistance(start, slowDownPoint).valueInMeters()/2.0)))); + end, roiDistance), new Altitude(1.0)))); + dronieItems.add(new Waypoint(this, new Coord3D(end, new Altitude(startAltitude + + GeoTools.getDistance(start, end).valueInMeters() / 2.0)))); + dronieItems.add(new Waypoint(this, new Coord3D(slowDownPoint, new Altitude(startAltitude + + GeoTools.getDistance(start, slowDownPoint).valueInMeters() / 2.0)))); dronieItems.add(new ChangeSpeed(this, new Speed(1.0))); dronieItems.add(new Waypoint(this, new Coord3D(start, new Altitude(startAltitude)))); - dronieItems.add(new ChangeSpeed(this, defaultSpeed)); - dronieItems.add(new Land(this,start)); + dronieItems.add(new ChangeSpeed(this, defaultSpeed)); + dronieItems.add(new Land(this, start)); return dronieItems; } @@ -363,7 +364,7 @@ public boolean isFirstItemTakeoff() { } public boolean isLastItemLandOrRTL() { - MissionItem last = items.get(items.size()-1); + MissionItem last = items.get(items.size() - 1); return (last instanceof ReturnToHome) || (last instanceof Land); } } From 75e63e2051ca4de65c263cd20b3ad9b965030f27 Mon Sep 17 00:00:00 2001 From: Arthur Benemann Date: Fri, 24 Oct 2014 09:08:07 -0700 Subject: [PATCH 15/15] Version: Releasing version 2.8.1 --- Android/AndroidManifest.xml | 2 +- ChangeLog.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Android/AndroidManifest.xml b/Android/AndroidManifest.xml index 2afa8591d0..22fbf676af 100644 --- a/Android/AndroidManifest.xml +++ b/Android/AndroidManifest.xml @@ -2,7 +2,7 @@