From 21dd1f9b67d6bcfa273172b979ffb8b9571dd777 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Thu, 28 Apr 2016 08:33:22 -0700 Subject: [PATCH 001/113] Fix the build path for the generated mavlink jar file --- dependencyLibs/Mavlink/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencyLibs/Mavlink/build.gradle b/dependencyLibs/Mavlink/build.gradle index 57c9870f6e..be2042cef7 100644 --- a/dependencyLibs/Mavlink/build.gradle +++ b/dependencyLibs/Mavlink/build.gradle @@ -11,7 +11,7 @@ sourceSets { } jar { - destinationDir (new File("${rootDir}/../dronekit-android/ClientLib/libs")) + destinationDir (new File("${rootDir}/ClientLib/libs")) } dependencies { From 59fbd18e2d43023eac754f5f151056595e2aef98 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Thu, 28 Apr 2016 09:03:57 -0700 Subject: [PATCH 002/113] Update package for the Tower library --- ClientLib/build.gradle | 12 +-- .../android/client/ApplicationTest.java | 2 +- ClientLib/src/main/AndroidManifest.xml | 4 +- .../android/lib/coordinate/LatLong.aidl | 3 - .../android/lib/coordinate/LatLongAlt.aidl | 4 - .../MagnetometerCalibrationProgress.aidl | 3 - .../MagnetometerCalibrationResult.aidl | 3 - .../MagnetometerCalibrationStatus.aidl | 3 - .../solo/action/SoloShotsActions.java | 12 --- .../drone/connection/ConnectionParameter.aidl | 3 - .../drone/connection/ConnectionResult.aidl | 3 - .../lib/drone/connection/DroneSharePrefs.aidl | 3 - .../android/lib/drone/mission/Mission.aidl | 3 - .../lib/drone/mission/item/MissionItem.aidl | 3 - .../mission/item/complex/CameraDetail.aidl | 3 - .../item/complex/StructureScanner.aidl | 3 - .../drone/mission/item/complex/Survey.aidl | 3 - .../android/lib/drone/property/Altitude.aidl | 3 - .../android/lib/drone/property/Attitude.aidl | 3 - .../android/lib/drone/property/Battery.aidl | 3 - .../android/lib/drone/property/EkfStatus.aidl | 3 - .../android/lib/drone/property/FootPrint.aidl | 3 - .../android/lib/drone/property/Gps.aidl | 3 - .../lib/drone/property/GuidedState.aidl | 3 - .../android/lib/drone/property/Home.aidl | 3 - .../lib/drone/property/Parameters.aidl | 3 - .../android/lib/drone/property/Signal.aidl | 3 - .../android/lib/drone/property/Speed.aidl | 3 - .../android/lib/drone/property/State.aidl | 3 - .../android/lib/drone/property/Type.aidl | 3 - .../lib/drone/property/VehicleMode.aidl | 3 - .../android/lib/drone/property/Vibration.aidl | 3 - .../android/lib/gcs/follow/FollowState.aidl | 3 - .../android/lib/gcs/follow/FollowType.aidl | 3 - .../lib/gcs/returnToMe/ReturnToMeState.aidl | 3 - .../lib/mavlink/MavlinkMessageWrapper.aidl | 2 - .../android/lib/model/action/Action.aidl | 3 - .../o3dr/services/android/lib/util/Utils.java | 9 -- .../android/client/ControlTower.java | 10 +- .../droidplanner}/android/client/Drone.java | 90 ++++++++-------- .../android/client/DroneApiListener.java | 8 +- .../android/client/DroneObserver.java | 4 +- .../android/client/MavlinkObserver.java | 6 +- .../android/client/apis/Api.java | 6 +- .../android/client/apis/ApiAvailability.java | 8 +- .../android/client/apis/CalibrationApi.java | 26 ++--- .../android/client/apis/CameraApi.java | 26 ++--- .../android/client/apis/CapabilityApi.java | 10 +- .../android/client/apis/ControlApi.java | 52 ++++----- .../android/client/apis/ExperimentalApi.java | 44 ++++---- .../android/client/apis/FollowApi.java | 16 +-- .../android/client/apis/GimbalApi.java | 26 ++--- .../android/client/apis/MissionApi.java | 16 +-- .../android/client/apis/VehicleApi.java | 52 ++++----- .../android/client/apis/solo/SoloApi.java | 16 +-- .../client/apis/solo/SoloCameraApi.java | 20 ++-- .../client/apis/solo/SoloConfigApi.java | 46 ++++---- .../client/apis/solo/SoloMessageApi.java | 8 +- .../client/interfaces/DroneListener.java | 6 +- .../client/interfaces/LinkListener.java | 8 +- .../client/interfaces/TowerListener.java | 2 +- .../client/utils/InstallServiceDialog.java | 4 +- .../utils/TxPowerComplianceCountries.java | 2 +- .../connection/AbstractIpConnection.java | 4 +- .../connection/IpConnectionListener.java | 2 +- .../utils/connection/TcpConnection.java | 2 +- .../utils/connection/UdpConnection.java | 2 +- .../utils/data/tlog/TLogIteratorCallback.java | 2 +- .../utils/data/tlog/TLogIteratorFilter.java | 4 +- .../client/utils/data/tlog/TLogParser.java | 2 +- .../utils/data/tlog/TLogParserCallback.java | 4 +- .../utils/data/tlog/TLogParserFilter.java | 4 +- .../client/utils/data/tlog/TLogPicker.java | 4 +- .../FilterByTimestampGeoTagAlgorithm.java | 9 +- .../client/utils/geotag/GeoTagAsyncTask.java | 6 +- .../client/utils/geotag/GeoTagUtils.java | 7 +- .../utils/geotag/SimpleGeoTagAlgorithm.java | 4 +- .../client/utils/unit/MetricUnitProvider.java | 2 +- .../client/utils/unit/UnitProvider.java | 2 +- .../client/utils/video/DecoderListener.java | 2 +- .../client/utils/video/MediaCodecManager.java | 2 +- .../android/client/utils/video/NaluChunk.java | 2 +- .../utils/video/NaluChunkAssembler.java | 2 +- .../android/lib/coordinate/LatLong.aidl | 3 + .../android/lib/coordinate/LatLong.java | 2 +- .../android/lib/coordinate/LatLongAlt.aidl | 4 + .../android/lib/coordinate/LatLongAlt.java | 2 +- .../android/lib/data/ServiceDataContract.java | 4 +- .../lib/drone/action/CameraActions.java | 4 +- .../lib/drone/action/CapabilityActions.java | 4 +- .../lib/drone/action/ConnectionActions.java | 4 +- .../lib/drone/action/ControlActions.java | 6 +- .../lib/drone/action/ExperimentalActions.java | 4 +- .../lib/drone/action/GimbalActions.java | 4 +- .../lib/drone/action/GuidedActions.java | 4 +- .../lib/drone/action/ParameterActions.java | 4 +- .../lib/drone/action/StateActions.java | 6 +- .../lib/drone/attribute/AttributeEvent.java | 28 ++--- .../drone/attribute/AttributeEventExtra.java | 14 +-- .../lib/drone/attribute/AttributeType.java | 38 +++---- .../error/CommandExecutionError.java | 2 +- .../lib/drone/attribute/error/ErrorType.java | 4 +- .../MagnetometerCalibrationProgress.aidl | 3 + .../MagnetometerCalibrationProgress.java | 2 +- .../MagnetometerCalibrationResult.aidl | 3 + .../MagnetometerCalibrationResult.java | 2 +- .../MagnetometerCalibrationStatus.aidl | 3 + .../MagnetometerCalibrationStatus.java | 4 +- .../drone/companion/solo/SoloAttributes.java | 4 +- .../drone/companion/solo/SoloEventExtras.java | 10 +- .../lib/drone/companion/solo/SoloEvents.java | 8 +- .../lib/drone/companion/solo/SoloState.java | 16 +-- .../companion/solo/action/SoloActions.java | 8 +- .../solo/action/SoloConfigActions.java | 10 +- .../solo/action/SoloShotsActions.java | 12 +++ .../companion/solo/button/ButtonPacket.java | 2 +- .../companion/solo/button/ButtonTypes.java | 2 +- .../solo/controller/SoloControllerMode.java | 2 +- .../solo/controller/SoloControllerUnits.java | 2 +- .../tlv/ControllerMessageInputReport.java | 2 +- .../companion/solo/tlv/SoloButtonSetting.java | 2 +- .../solo/tlv/SoloButtonSettingGetter.java | 2 +- .../solo/tlv/SoloButtonSettingSetter.java | 2 +- .../solo/tlv/SoloCableCamOptions.java | 2 +- .../solo/tlv/SoloCableCamWaypoint.java | 4 +- .../companion/solo/tlv/SoloFollowOptions.java | 2 +- .../solo/tlv/SoloFollowOptionsV2.java | 2 +- .../solo/tlv/SoloGoproConstants.java | 4 +- .../companion/solo/tlv/SoloGoproRecord.java | 2 +- .../solo/tlv/SoloGoproRequestState.java | 2 +- .../solo/tlv/SoloGoproSetExtendedRequest.java | 2 +- .../solo/tlv/SoloGoproSetRequest.java | 2 +- .../companion/solo/tlv/SoloGoproState.java | 7 +- .../companion/solo/tlv/SoloGoproStateV2.java | 4 +- .../solo/tlv/SoloMessageLocation.java | 4 +- .../solo/tlv/SoloMessageRecordPosition.java | 2 +- .../companion/solo/tlv/SoloMessageShot.java | 6 +- .../solo/tlv/SoloMessageShotGetter.java | 2 +- .../solo/tlv/SoloMessageShotManagerError.java | 2 +- .../solo/tlv/SoloMessageShotSetter.java | 2 +- .../drone/companion/solo/tlv/SoloPause.java | 2 +- .../companion/solo/tlv/SoloShotError.java | 2 +- .../companion/solo/tlv/SoloShotOptions.java | 2 +- .../companion/solo/tlv/TLVMessageParser.java | 100 +++++++++--------- .../companion/solo/tlv/TLVMessageTypes.java | 2 +- .../drone/companion/solo/tlv/TLVPacket.java | 2 +- .../solo/tlv/mpcc/SoloSplineAttach.java | 6 +- .../solo/tlv/mpcc/SoloSplineDurations.java | 6 +- .../solo/tlv/mpcc/SoloSplinePathSettings.java | 6 +- .../solo/tlv/mpcc/SoloSplinePlay.java | 6 +- .../tlv/mpcc/SoloSplinePlaybackStatus.java | 6 +- .../solo/tlv/mpcc/SoloSplinePoint.java | 8 +- .../solo/tlv/mpcc/SoloSplineRecord.java | 6 +- .../solo/tlv/mpcc/SoloSplineSeek.java | 6 +- .../inspect/SoloInspectMoveGimbal.java | 6 +- .../inspect/SoloInspectMoveVehicle.java | 6 +- .../inspect/SoloInspectSetWaypoint.java | 6 +- .../sitescan/inspect/SoloInspectStart.java | 6 +- .../solo/tlv/sitescan/scan/SoloScanStart.java | 6 +- .../tlv/sitescan/survey/SoloSurveyStart.java | 6 +- .../drone/connection/ConnectionParameter.aidl | 3 + .../drone/connection/ConnectionParameter.java | 2 +- .../drone/connection/ConnectionResult.aidl | 3 + .../drone/connection/ConnectionResult.java | 4 +- .../lib/drone/connection/ConnectionType.java | 2 +- .../lib/drone/connection/DroneSharePrefs.aidl | 3 + .../lib/drone/connection/DroneSharePrefs.java | 2 +- .../android/lib/drone/mission/Mission.aidl | 3 + .../android/lib/drone/mission/Mission.java | 8 +- .../lib/drone/mission/MissionItemType.java | 46 ++++---- .../drone/mission/action/MissionActions.java | 4 +- .../lib/drone/mission/item/MissionItem.aidl | 3 + .../lib/drone/mission/item/MissionItem.java | 8 +- .../mission/item/command/CameraTrigger.java | 6 +- .../mission/item/command/ChangeSpeed.java | 6 +- .../drone/mission/item/command/DoJump.java | 6 +- .../mission/item/command/EpmGripper.java | 6 +- .../drone/mission/item/command/ResetROI.java | 6 +- .../mission/item/command/ReturnToLaunch.java | 6 +- .../drone/mission/item/command/SetRelay.java | 6 +- .../drone/mission/item/command/SetServo.java | 6 +- .../drone/mission/item/command/Takeoff.java | 6 +- .../mission/item/command/YawCondition.java | 6 +- .../mission/item/complex/CameraDetail.aidl | 3 + .../mission/item/complex/CameraDetail.java | 2 +- .../mission/item/complex/SplineSurvey.java | 6 +- .../item/complex/StructureScanner.aidl | 3 + .../item/complex/StructureScanner.java | 10 +- .../drone/mission/item/complex/Survey.aidl | 3 + .../drone/mission/item/complex/Survey.java | 10 +- .../mission/item/complex/SurveyDetail.java | 4 +- .../mission/item/spatial/BaseSpatialItem.java | 8 +- .../drone/mission/item/spatial/Circle.java | 7 +- .../mission/item/spatial/DoLandStart.java | 6 +- .../lib/drone/mission/item/spatial/Land.java | 8 +- .../item/spatial/RegionOfInterest.java | 7 +- .../mission/item/spatial/SplineWaypoint.java | 7 +- .../drone/mission/item/spatial/Waypoint.java | 7 +- .../android/lib/drone/property/Altitude.aidl | 3 + .../android/lib/drone/property/Altitude.java | 2 +- .../android/lib/drone/property/Attitude.aidl | 3 + .../android/lib/drone/property/Attitude.java | 2 +- .../android/lib/drone/property/Battery.aidl | 3 + .../android/lib/drone/property/Battery.java | 3 +- .../lib/drone/property/CameraProxy.java | 5 +- .../lib/drone/property/DroneAttribute.java | 2 +- .../android/lib/drone/property/EkfStatus.aidl | 3 + .../android/lib/drone/property/EkfStatus.java | 2 +- .../android/lib/drone/property/FootPrint.aidl | 3 + .../android/lib/drone/property/FootPrint.java | 7 +- .../android/lib/drone/property/Gps.aidl | 3 + .../android/lib/drone/property/Gps.java | 4 +- .../lib/drone/property/GuidedState.aidl | 3 + .../lib/drone/property/GuidedState.java | 4 +- .../android/lib/drone/property/Home.aidl | 3 + .../android/lib/drone/property/Home.java | 4 +- .../android/lib/drone/property/Parameter.java | 3 +- .../lib/drone/property/Parameters.aidl | 3 + .../lib/drone/property/Parameters.java | 2 +- .../android/lib/drone/property/Signal.aidl | 3 + .../android/lib/drone/property/Signal.java | 2 +- .../android/lib/drone/property/Speed.aidl | 3 + .../android/lib/drone/property/Speed.java | 2 +- .../android/lib/drone/property/State.aidl | 3 + .../android/lib/drone/property/State.java | 3 +- .../android/lib/drone/property/Type.aidl | 3 + .../android/lib/drone/property/Type.java | 3 +- .../lib/drone/property/VehicleMode.aidl | 3 + .../lib/drone/property/VehicleMode.java | 3 +- .../android/lib/drone/property/Vibration.aidl | 3 + .../android/lib/drone/property/Vibration.java | 2 +- .../lib/gcs/action/CalibrationActions.java | 4 +- .../lib/gcs/action/FollowMeActions.java | 4 +- .../android/lib/gcs/event/GCSEvent.java | 4 +- .../android/lib/gcs/follow/FollowState.aidl | 3 + .../android/lib/gcs/follow/FollowState.java | 4 +- .../android/lib/gcs/follow/FollowType.aidl | 3 + .../android/lib/gcs/follow/FollowType.java | 2 +- .../lib/gcs/link/LinkConnectionStatus.java | 8 +- .../android/lib/gcs/link/LinkEvent.java | 4 +- .../android/lib/gcs/link/LinkEventExtra.java | 6 +- .../lib/gcs/returnToMe/ReturnToMeState.aidl | 3 + .../lib/gcs/returnToMe/ReturnToMeState.java | 6 +- .../lib/mavlink/MavlinkMessageWrapper.aidl | 2 + .../lib/mavlink/MavlinkMessageWrapper.java | 2 +- .../lib/model/AbstractCommandListener.java | 2 +- .../android/lib/model/IApiListener.aidl | 4 +- .../android/lib/model/ICommandListener.aidl | 4 +- .../lib/model/IDroidPlannerServices.aidl | 6 +- .../services/android/lib/model/IDroneApi.aidl | 12 +-- .../android/lib/model/IMavlinkObserver.aidl | 4 +- .../services/android/lib/model/IObserver.aidl | 4 +- .../lib/model/SimpleCommandListener.java | 2 +- .../android/lib/model/action/Action.aidl | 3 + .../android/lib/model/action/Action.java | 2 +- .../services/android/lib/util/MathUtils.java | 6 +- .../android/lib/util/ParcelableUtils.java | 2 +- .../android/lib/util/SpannableUtils.java | 2 +- .../services/android/lib/util/Utils.java | 9 ++ .../googleApi/GoogleApiClientManager.java | 2 +- .../lib/util/version/VersionUtils.java | 5 +- ServiceApp/AndroidManifest.xml | 6 +- .../services/android/api/DPServices.java | 12 +-- .../android/api/DroidPlannerService.java | 9 +- .../services/android/api/DroneApi.java | 58 +++++----- .../connection/AndroidTcpConnection.java | 2 +- .../connection/AndroidUdpConnection.java | 2 +- .../connection/SoloConnection.java | 6 +- .../connection/usb/UsbCDCConnection.java | 2 +- .../connection/usb/UsbConnection.java | 2 +- .../android/communication/model/DataLink.java | 4 +- .../communication/service/MAVLinkClient.java | 8 +- .../core/MAVLink/MavLinkCalibration.java | 2 +- .../android/core/MAVLink/MavLinkCommands.java | 2 +- .../core/MAVLink/MavLinkParameters.java | 2 +- .../MAVLink/command/doCmd/MavLinkDoCmds.java | 4 +- .../MAVLink/connection/MavLinkConnection.java | 2 +- .../connection/MavLinkConnectionListener.java | 2 +- .../android/core/drone/DroneInterfaces.java | 2 +- .../android/core/drone/DroneManager.java | 20 ++-- .../android/core/drone/DroneVariable.java | 2 +- .../android/core/drone/autopilot/Drone.java | 6 +- .../core/drone/autopilot/apm/ArduCopter.java | 12 +-- .../core/drone/autopilot/apm/ArduPilot.java | 46 ++++---- .../apm/solo/AbstractLinkManager.java | 6 +- .../drone/autopilot/apm/solo/ArduSolo.java | 43 ++++---- .../drone/autopilot/apm/solo/SoloComp.java | 32 +++--- .../controller/ControllerLinkListener.java | 6 +- .../controller/ControllerLinkManager.java | 22 ++-- .../apm/solo/sololink/SoloLinkListener.java | 4 +- .../apm/solo/sololink/SoloLinkManager.java | 26 ++--- .../generic/GenericMavLinkDrone.java | 54 +++++----- .../drone/manager/DroneCommandTracker.java | 2 +- .../drone/manager/MavLinkDroneManager.java | 26 ++--- .../core/drone/profiles/ParameterManager.java | 2 +- .../android/core/drone/variables/Camera.java | 10 +- .../core/drone/variables/GuidedPoint.java | 14 +-- .../core/drone/variables/Magnetometer.java | 2 +- .../android/core/drone/variables/State.java | 6 +- .../calibration/AccelCalibration.java | 4 +- .../services/android/core/gcs/ReturnToMe.java | 20 ++-- .../android/core/gcs/follow/Follow.java | 6 +- .../android/core/gcs/follow/FollowAbove.java | 2 +- .../android/core/gcs/follow/FollowCircle.java | 4 +- .../core/gcs/follow/FollowGuidedScan.java | 4 +- .../core/gcs/follow/FollowHeadingAngle.java | 2 +- .../android/core/gcs/follow/FollowLeash.java | 6 +- .../core/gcs/follow/FollowSoloShot.java | 6 +- .../core/gcs/follow/FollowSplineAbove.java | 2 +- .../core/gcs/follow/FollowSplineLeash.java | 8 +- .../core/gcs/location/FusedLocation.java | 6 +- .../android/core/gcs/location/Location.java | 2 +- .../android/core/gcs/roi/ROIEstimator.java | 4 +- .../core/helpers/coordinates/CoordBounds.java | 2 +- .../core/helpers/geoTools/GeoTools.java | 6 +- .../core/helpers/geoTools/LineLatLong.java | 2 +- .../core/helpers/geoTools/LineSampler.java | 2 +- .../core/helpers/geoTools/LineTools.java | 2 +- .../core/helpers/geoTools/PointTools.java | 2 +- .../core/helpers/geoTools/PolylineTools.java | 2 +- .../core/helpers/geoTools/Simplify.java | 2 +- .../core/helpers/geoTools/spline/Spline.java | 2 +- .../helpers/geoTools/spline/SplinePath.java | 2 +- .../android/core/mission/Mission.java | 14 +-- .../android/core/mission/MissionItemType.java | 2 +- .../core/mission/survey/SplineSurveyImpl.java | 2 +- .../core/mission/survey/SurveyImpl.java | 2 +- .../core/mission/waypoints/CircleImpl.java | 2 +- .../mission/waypoints/DoLandStartImpl.java | 4 +- .../core/mission/waypoints/LandImpl.java | 4 +- .../waypoints/RegionOfInterestImpl.java | 2 +- .../mission/waypoints/SpatialCoordItem.java | 4 +- .../mission/waypoints/SplineWaypointImpl.java | 2 +- .../waypoints/StructureScannerImpl.java | 4 +- .../core/mission/waypoints/WaypointImpl.java | 2 +- .../android/core/polygon/Polygon.java | 2 +- .../android/core/survey/Footprint.java | 4 +- .../core/survey/grid/CircumscribedGrid.java | 2 +- .../core/survey/grid/EndpointSorter.java | 2 +- .../android/core/survey/grid/Grid.java | 2 +- .../android/core/survey/grid/GridBuilder.java | 2 +- .../android/core/survey/grid/Trimmer.java | 2 +- .../android/ui/activity/TLogFileSelector.java | 5 +- .../ui/adapter/AppConnectionAdapter.java | 4 +- .../android/utils/AndroidApWarningParser.java | 82 +++++++------- .../android/utils/CommonApiUtils.java | 58 +++++----- .../services/android/utils/ProxyUtils.java | 46 ++++---- .../services/android/utils/SoloApiUtils.java | 14 +-- .../android/utils/analytics/GAUtils.java | 2 +- .../connection/WifiConnectionHandler.java | 2 +- .../android/utils/video/StreamRecorder.java | 4 +- .../android/utils/video/VideoManager.java | 16 +-- .../android/client/apis/ControlApiTest.java | 14 +-- .../services/android/BasicTest.java | 4 +- .../core/helpers/coordinates/Coord2DTest.java | 2 +- .../core/helpers/coordinates/Coord3DTest.java | 4 +- .../helpers/coordinates/CoordBoundsTest.java | 2 +- .../core/helpers/geoTools/GeoToolsTest.java | 4 +- .../waypoints/SpatialCoordItemTest.java | 2 +- .../mission/waypoints/WaypointImplTest.java | 2 +- .../android/core/survey/FootprintTest.java | 2 +- .../solo/tlv/TLVMessageParserTest.java | 2 +- .../android/lib/util/MathUtilsTest.java | 6 +- .../services/android/mock/MockDrone.java | 8 +- .../android/mock/MockMAVLinkClient.java | 4 +- .../hellodrone/ApplicationTest.java | 2 +- .../StarterApp/src/main/AndroidManifest.xml | 4 +- .../sample/hellodrone/MainActivity.java | 60 +++++------ .../hellodrone/video/VideoStreamActivity.java | 4 +- 369 files changed, 1308 insertions(+), 1352 deletions(-) rename ClientLib/src/androidTest/java/{com/o3dr => org/droidplanner}/android/client/ApplicationTest.java (88%) delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloShotsActions.java delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.aidl delete mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/ControlTower.java (94%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/Drone.java (89%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/DroneApiListener.java (72%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/DroneObserver.java (81%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/MavlinkObserver.java (56%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/Api.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/ApiAvailability.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/CalibrationApi.java (71%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/CameraApi.java (73%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/CapabilityApi.java (94%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/ControlApi.java (76%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/ExperimentalApi.java (89%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/FollowApi.java (72%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/GimbalApi.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/MissionApi.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/VehicleApi.java (77%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/solo/SoloApi.java (55%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/solo/SoloCameraApi.java (94%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/solo/SoloConfigApi.java (66%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/apis/solo/SoloMessageApi.java (76%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/interfaces/DroneListener.java (66%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/interfaces/LinkListener.java (58%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/interfaces/TowerListener.java (72%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/InstallServiceDialog.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/TxPowerComplianceCountries.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/connection/AbstractIpConnection.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/connection/IpConnectionListener.java (80%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/connection/TcpConnection.java (96%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/connection/UdpConnection.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/data/tlog/TLogIteratorCallback.java (89%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/data/tlog/TLogIteratorFilter.java (73%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/data/tlog/TLogParser.java (99%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/data/tlog/TLogParserCallback.java (76%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/data/tlog/TLogParserFilter.java (80%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/data/tlog/TLogPicker.java (84%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java (94%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/geotag/GeoTagAsyncTask.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/geotag/GeoTagUtils.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/geotag/SimpleGeoTagAlgorithm.java (85%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/unit/MetricUnitProvider.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/unit/UnitProvider.java (87%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/video/DecoderListener.java (76%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/video/MediaCodecManager.java (99%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/video/NaluChunk.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/android/client/utils/video/NaluChunkAssembler.java (99%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/coordinate/LatLong.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/coordinate/LatLongAlt.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/data/ServiceDataContract.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/CameraActions.java (82%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/CapabilityActions.java (78%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/ConnectionActions.java (79%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/ControlActions.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/ExperimentalActions.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/GimbalActions.java (87%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/GuidedActions.java (60%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/ParameterActions.java (79%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/action/StateActions.java (84%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/attribute/AttributeEvent.java (84%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/attribute/AttributeEventExtra.java (84%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/attribute/AttributeType.java (60%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/attribute/error/CommandExecutionError.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/attribute/error/ErrorType.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java (96%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/SoloAttributes.java (78%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/SoloEventExtras.java (82%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/SoloEvents.java (88%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/SoloState.java (89%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/action/SoloActions.java (57%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/action/SoloConfigActions.java (78%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/button/ButtonPacket.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/button/ButtonTypes.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java (96%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java (95%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java (95%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java (95%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java (96%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java (95%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java (95%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloPause.java (92%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloShotError.java (94%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java (66%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/TLVPacket.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java (84%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java (94%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java (96%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java (79%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java (88%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java (74%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java (75%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/connection/ConnectionParameter.java (99%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/connection/ConnectionResult.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/connection/ConnectionType.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/connection/DroneSharePrefs.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/Mission.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/MissionItemType.java (80%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/action/MissionActions.java (92%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/MissionItem.java (86%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/CameraTrigger.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/ChangeSpeed.java (89%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/DoJump.java (90%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/EpmGripper.java (88%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/ResetROI.java (82%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/ReturnToLaunch.java (89%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/SetRelay.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/SetServo.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/Takeoff.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/command/YawCondition.java (92%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/complex/CameraDetail.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/complex/SplineSurvey.java (79%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/complex/StructureScanner.java (93%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/complex/Survey.java (95%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/complex/SurveyDetail.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java (85%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/spatial/Circle.java (89%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/spatial/DoLandStart.java (78%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/spatial/Land.java (73%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java (79%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java (88%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/mission/item/spatial/Waypoint.java (93%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Altitude.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Attitude.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Battery.java (96%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/CameraProxy.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/DroneAttribute.java (69%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/EkfStatus.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/FootPrint.java (90%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Gps.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/GuidedState.java (93%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Home.java (93%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Parameter.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Parameters.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Signal.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Speed.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/State.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Type.java (96%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/VehicleMode.java (97%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/property/Vibration.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/action/CalibrationActions.java (91%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/action/FollowMeActions.java (83%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/event/GCSEvent.java (86%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/follow/FollowState.java (93%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/follow/FollowType.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/link/LinkConnectionStatus.java (94%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/link/LinkEvent.java (68%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/link/LinkEventExtra.java (60%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/gcs/returnToMe/ReturnToMeState.java (93%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/mavlink/MavlinkMessageWrapper.java (96%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/AbstractCommandListener.java (85%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/IApiListener.aidl (79%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/ICommandListener.aidl (69%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/IDroidPlannerServices.aidl (86%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/IDroneApi.aidl (81%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/IMavlinkObserver.aidl (73%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/IObserver.aidl (75%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/SimpleCommandListener.java (88%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/model/action/Action.java (95%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/util/MathUtils.java (98%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/util/ParcelableUtils.java (97%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/util/SpannableUtils.java (98%) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/util/Utils.java rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/util/googleApi/GoogleApiClientManager.java (99%) rename ClientLib/src/main/java/{com/o3dr => org/droidplanner}/services/android/lib/util/version/VersionUtils.java (70%) rename ServiceApp/test/java/{com/o3dr => org/droidplanner}/android/client/apis/ControlApiTest.java (88%) rename ServiceApp/test/java/{com/o3dr => org/droidplanner}/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java (99%) rename ServiceApp/test/java/{com/o3dr => org/droidplanner}/services/android/lib/util/MathUtilsTest.java (96%) rename samples/StarterApp/src/androidTest/java/{com/o3dr => org/droidplanner}/hellodrone/ApplicationTest.java (87%) rename samples/StarterApp/src/main/java/{com/o3dr => org/droidplanner}/sample/hellodrone/MainActivity.java (92%) rename samples/StarterApp/src/main/java/{com/o3dr => org/droidplanner}/sample/hellodrone/video/VideoStreamActivity.java (79%) diff --git a/ClientLib/build.gradle b/ClientLib/build.gradle index 6f5664746b..00cc71f216 100644 --- a/ClientLib/build.gradle +++ b/ClientLib/build.gradle @@ -1,16 +1,16 @@ apply plugin: 'com.android.library' ext { - VERSION_MAJOR = 2 - VERSION_MINOR = 9 + VERSION_MAJOR = 0 + VERSION_MINOR = 0 VERSION_PATCH = 0 - VERSION_SUFFIX = "release" + VERSION_SUFFIX = "alpha1" - PUBLISH_ARTIFACT_ID = 'dronekit-android' + PUBLISH_ARTIFACT_ID = 'tower-lib' PUBLISH_VERSION = generateVersionName("", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_SUFFIX) PUBLISH_VERSION_CODE = computeVersionCode(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH) - PROJECT_DESCRIPTION = "Android DroneKit client library." - PROJECT_LABELS = ['3DR', '3DR Services', 'DroneAPI', 'Android', 'DroneKit'] + PROJECT_DESCRIPTION = "Tower Library." + PROJECT_LABELS = ['DroneCode', '3DR', 'Tower', 'DroneAPI', 'Android', 'DroneKit'] PROJECT_LICENSES = ['Apache-2.0'] } diff --git a/ClientLib/src/androidTest/java/com/o3dr/android/client/ApplicationTest.java b/ClientLib/src/androidTest/java/org/droidplanner/android/client/ApplicationTest.java similarity index 88% rename from ClientLib/src/androidTest/java/com/o3dr/android/client/ApplicationTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/android/client/ApplicationTest.java index 24aefeac26..b6e3c75194 100644 --- a/ClientLib/src/androidTest/java/com/o3dr/android/client/ApplicationTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/android/client/ApplicationTest.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client; +package org.droidplanner.android.client; import android.app.Application; import android.test.ApplicationTestCase; diff --git a/ClientLib/src/main/AndroidManifest.xml b/ClientLib/src/main/AndroidManifest.xml index df1ff90a7e..370bb1b492 100644 --- a/ClientLib/src/main/AndroidManifest.xml +++ b/ClientLib/src/main/AndroidManifest.xml @@ -1,11 +1,11 @@ + package="org.droidplanner.android.client"> events); diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserFilter.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserFilter.java similarity index 80% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserFilter.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserFilter.java index c6b1bcfc14..3128d852fe 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserFilter.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserFilter.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client.utils.data.tlog; +package org.droidplanner.android.client.utils.data.tlog; /** * Filter class for TLog parser to allow the caller to determine the criteria for the list @@ -9,7 +9,7 @@ public interface TLogParserFilter { * This method is called when an event is parsed to determine whether the caller wants this result * in the returned list. * - * @param event {@link com.o3dr.android.client.utils.data.tlog.TLogParser.Event} + * @param event {@link org.droidplanner.android.client.utils.data.tlog.TLogParser.Event} * @return whether this event should be accepted based off criteria */ boolean includeEvent(TLogParser.Event event); diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogPicker.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogPicker.java similarity index 84% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogPicker.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogPicker.java index 98cdd32c74..d7704b2bf4 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogPicker.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogPicker.java @@ -1,9 +1,9 @@ -package com.o3dr.android.client.utils.data.tlog; +package org.droidplanner.android.client.utils.data.tlog; import android.app.Activity; import android.content.Intent; -import com.o3dr.services.android.lib.data.ServiceDataContract; +import org.droidplanner.services.android.lib.data.ServiceDataContract; /** * Provides utility to select a tlog files. diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java similarity index 94% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java index 3327c70fbe..e7b37aa1ba 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java @@ -1,21 +1,18 @@ -package com.o3dr.android.client.utils.geotag; +package org.droidplanner.android.client.utils.geotag; import android.util.Log; import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.ardupilotmega.msg_camera_feedback; import com.MAVLink.common.msg_named_value_int; -import com.o3dr.android.client.utils.data.tlog.TLogParser; -import com.o3dr.android.client.utils.data.tlog.TLogParser.Event; +import org.droidplanner.android.client.utils.data.tlog.TLogParser; +import org.droidplanner.android.client.utils.data.tlog.TLogParser.Event; import java.io.File; import java.util.ArrayList; import java.util.Calendar; -import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.SortedMap; import java.util.TreeMap; diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagAsyncTask.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagAsyncTask.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagAsyncTask.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagAsyncTask.java index 933b5dfb47..c1d3a59a7c 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagAsyncTask.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagAsyncTask.java @@ -1,8 +1,8 @@ -package com.o3dr.android.client.utils.geotag; +package org.droidplanner.android.client.utils.geotag; import android.os.AsyncTask; -import com.o3dr.android.client.utils.data.tlog.TLogParser; +import org.droidplanner.android.client.utils.data.tlog.TLogParser; import java.io.File; import java.util.ArrayList; @@ -32,7 +32,7 @@ public void onProgress(int numProcessed, int numTotal) { * Warning: this copies data to external storage * * @param rootDir {@link File} - * @param events {@link List} list of events to geotag photos. + * @param events {@link List< org.droidplanner.android.client.utils.data.tlog.TLogParser.Event>} list of events to geotag photos. * @param photos {@link List} list of files of photos to geotag. */ public GeoTagAsyncTask(File rootDir, List events, ArrayList photos) { diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagUtils.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagUtils.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagUtils.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagUtils.java index e7bda97237..0af582351d 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagUtils.java @@ -1,9 +1,9 @@ -package com.o3dr.android.client.utils.geotag; +package org.droidplanner.android.client.utils.geotag; import android.media.ExifInterface; import com.MAVLink.ardupilotmega.msg_camera_feedback; -import com.o3dr.android.client.utils.data.tlog.TLogParser; +import org.droidplanner.android.client.utils.data.tlog.TLogParser; import java.io.File; import java.io.FileInputStream; @@ -11,13 +11,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; /** diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/SimpleGeoTagAlgorithm.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/SimpleGeoTagAlgorithm.java similarity index 85% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/SimpleGeoTagAlgorithm.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/SimpleGeoTagAlgorithm.java index a1b52f3326..fa530cda43 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/SimpleGeoTagAlgorithm.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/SimpleGeoTagAlgorithm.java @@ -1,6 +1,6 @@ -package com.o3dr.android.client.utils.geotag; +package org.droidplanner.android.client.utils.geotag; -import com.o3dr.android.client.utils.data.tlog.TLogParser; +import org.droidplanner.android.client.utils.data.tlog.TLogParser; import java.io.File; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/MetricUnitProvider.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/MetricUnitProvider.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/unit/MetricUnitProvider.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/MetricUnitProvider.java index e40be713ed..fecc71f248 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/MetricUnitProvider.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/MetricUnitProvider.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client.utils.unit; +package org.droidplanner.android.client.utils.unit; import java.util.Locale; diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/UnitProvider.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/UnitProvider.java similarity index 87% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/unit/UnitProvider.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/UnitProvider.java index 367d96c1bd..ea2a26318c 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/UnitProvider.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/UnitProvider.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client.utils.unit; +package org.droidplanner.android.client.utils.unit; /** * Created by fhuya on 1/11/15. diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/DecoderListener.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/DecoderListener.java similarity index 76% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/video/DecoderListener.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/video/DecoderListener.java index 9178ad7ffd..5d2f8d902a 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/DecoderListener.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/DecoderListener.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client.utils.video; +package org.droidplanner.android.client.utils.video; /** * Created by fhuya on 12/4/14. diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/MediaCodecManager.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/MediaCodecManager.java similarity index 99% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/video/MediaCodecManager.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/video/MediaCodecManager.java index 96b4eb0cf0..c3226d09f7 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/MediaCodecManager.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/MediaCodecManager.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client.utils.video; +package org.droidplanner.android.client.utils.video; import android.annotation.TargetApi; import android.media.MediaCodec; diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunk.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunk.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunk.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunk.java index d77f313545..9eefe64f2d 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunk.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunk.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client.utils.video; +package org.droidplanner.android.client.utils.video; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunkAssembler.java b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunkAssembler.java similarity index 99% rename from ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunkAssembler.java rename to ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunkAssembler.java index c5ee961cb1..d63e2c9cd6 100644 --- a/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunkAssembler.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunkAssembler.java @@ -1,4 +1,4 @@ -package com.o3dr.android.client.utils.video; +package org.droidplanner.android.client.utils.video; import android.annotation.TargetApi; import android.media.MediaCodec; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl new file mode 100644 index 0000000000..382127ad38 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.coordinate; + +parcelable LatLong; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.java index 261104da61..c1046bc048 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.coordinate; +package org.droidplanner.services.android.lib.coordinate; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl new file mode 100644 index 0000000000..a50343e3df --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl @@ -0,0 +1,4 @@ +package org.droidplanner.services.android.lib.coordinate; + +parcelable LatLongAlt; + diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.java index 68c8d5cefe..a9733ba2fa 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.coordinate; +package org.droidplanner.services.android.lib.coordinate; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/data/ServiceDataContract.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/data/ServiceDataContract.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/data/ServiceDataContract.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/data/ServiceDataContract.java index e68f937aaa..d005399119 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/data/ServiceDataContract.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/data/ServiceDataContract.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.data; +package org.droidplanner.services.android.lib.data; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * The contract between the 3DR Services data provider, and applications. Contains definitions for the supported URIs diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CameraActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CameraActions.java similarity index 82% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CameraActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CameraActions.java index 342dfd3662..46d909e31e 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CameraActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CameraActions.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; /** * Created by Fredia Huya-Kouadio on 7/31/15. @@ -9,7 +9,7 @@ public class CameraActions { private CameraActions() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.action.camera"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action.camera"; public static final String ACTION_START_VIDEO_STREAM = PACKAGE_NAME + ".START_VIDEO_STREAM"; public static final String EXTRA_VIDEO_DISPLAY = "extra_video_display"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CapabilityActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CapabilityActions.java similarity index 78% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CapabilityActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CapabilityActions.java index 159df0a055..d0885b2715 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CapabilityActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CapabilityActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 7/15/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ConnectionActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ConnectionActions.java similarity index 79% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ConnectionActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ConnectionActions.java index 99b265b5a8..5eedef866e 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ConnectionActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ConnectionActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Contains builder methods use to generate connect or disconnect actions. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ControlActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ControlActions.java similarity index 90% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ControlActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ControlActions.java index 2857822d36..4d99733d08 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ControlActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ControlActions.java @@ -1,13 +1,13 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 9/7/15. */ public class ControlActions { - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.action.control"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.action.control"; public static final String ACTION_DO_GUIDED_TAKEOFF = Utils.PACKAGE_NAME + ".action.DO_GUIDED_TAKEOFF"; public static final String EXTRA_ALTITUDE = "extra_altitude"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ExperimentalActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ExperimentalActions.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ExperimentalActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ExperimentalActions.java index f537e11462..6380c13f5e 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ExperimentalActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ExperimentalActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GimbalActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GimbalActions.java similarity index 87% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GimbalActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GimbalActions.java index 39fddd505d..164253025f 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GimbalActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GimbalActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; public class GimbalActions { diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GuidedActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GuidedActions.java similarity index 60% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GuidedActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GuidedActions.java index 3bf4b42530..82181c2841 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GuidedActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GuidedActions.java @@ -1,6 +1,4 @@ -package com.o3dr.services.android.lib.drone.action; - -import com.o3dr.services.android.lib.util.Utils; +package org.droidplanner.services.android.lib.drone.action; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ParameterActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ParameterActions.java similarity index 79% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ParameterActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ParameterActions.java index 310c534565..3c5201669d 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ParameterActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ParameterActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/StateActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/StateActions.java similarity index 84% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/StateActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/StateActions.java index 73442f6ac1..5a77dafec1 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/StateActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/StateActions.java @@ -1,13 +1,13 @@ -package com.o3dr.services.android.lib.drone.action; +package org.droidplanner.services.android.lib.drone.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. */ public class StateActions { - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.action.state"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.action.state"; public static final String ACTION_ARM = Utils.PACKAGE_NAME + ".action.ARM"; public static final String EXTRA_ARM = "extra_arm"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEvent.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEvent.java similarity index 84% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEvent.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEvent.java index 1c2e5e1892..7d44f5b504 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEvent.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEvent.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.attribute; +package org.droidplanner.services.android.lib.drone.attribute; /** * Stores all possible drone events. @@ -9,7 +9,7 @@ public class AttributeEvent { private AttributeEvent() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.attribute.event"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.attribute.event"; /** * Attitude attribute events. @@ -19,14 +19,14 @@ private AttributeEvent() { /** * Signals an autopilot error. * - * @see {@link com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_ERROR_ID} + * @see {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_ERROR_ID} */ public static final String AUTOPILOT_ERROR = PACKAGE_NAME + ".AUTOPILOT_ERROR"; /** * Event describing a message received from the autopilot. - * The message content can be retrieved using the {@link com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE} key. - * The message level can be retrieved using the {@link com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE_LEVEL} key. + * The message content can be retrieved using the {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE} key. + * The message level can be retrieved using the {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE_LEVEL} key. */ public static final String AUTOPILOT_MESSAGE = PACKAGE_NAME + ".AUTOPILOT_MESSAGE"; @@ -84,16 +84,16 @@ private AttributeEvent() { /** * Event to signal the start of parameters refresh from the vehicle. * - * @see {@link com.o3dr.services.android.lib.drone.property.Parameters} - * @see {@link com.o3dr.services.android.lib.drone.property.Parameter} + * @see {@link org.droidplanner.services.android.lib.drone.property.Parameters} + * @see {@link org.droidplanner.services.android.lib.drone.property.Parameter} */ public static final String PARAMETERS_REFRESH_STARTED = PACKAGE_NAME + ".PARAMETERS_REFRESH_STARTED"; /** * Event to signal the completion of the parameters refresh from the vehicle. * - * @see {@link com.o3dr.services.android.lib.drone.property.Parameters} - * @see {@link com.o3dr.services.android.lib.drone.property.Parameter} + * @see {@link org.droidplanner.services.android.lib.drone.property.Parameters} + * @see {@link org.droidplanner.services.android.lib.drone.property.Parameter} */ public static final String PARAMETERS_REFRESH_COMPLETED = PACKAGE_NAME + ".PARAMETERS_REFRESH_ENDED"; @@ -148,31 +148,31 @@ private AttributeEvent() { /** * Signals updates of the ekf status. - * @see {@link com.o3dr.services.android.lib.drone.property.State} + * @see {@link org.droidplanner.services.android.lib.drone.property.State} */ public static final String STATE_EKF_REPORT = PACKAGE_NAME + ".STATE_EKF_REPORT"; /** * Signals updates to the ekf position state. - * @see {@link com.o3dr.services.android.lib.drone.property.State} + * @see {@link org.droidplanner.services.android.lib.drone.property.State} */ public static final String STATE_EKF_POSITION = PACKAGE_NAME + ".STATE_EKF_POSITION"; /** * Signals update of the vehicle mode. - * @see {@link com.o3dr.services.android.lib.drone.property.State} + * @see {@link org.droidplanner.services.android.lib.drone.property.State} */ public static final String STATE_VEHICLE_MODE = PACKAGE_NAME + ".STATE_VEHICLE_MODE"; /** * Signals vehicle vibration updates. - * @see {@link com.o3dr.services.android.lib.drone.property.State} + * @see {@link org.droidplanner.services.android.lib.drone.property.State} */ public static final String STATE_VEHICLE_VIBRATION = PACKAGE_NAME + ".STATE_VEHICLE_VIBRATION"; /** * Signals vehicle UID updates. - * @see {@link com.o3dr.services.android.lib.drone.property.State} + * @see {@link org.droidplanner.services.android.lib.drone.property.State} */ public static final String STATE_VEHICLE_UID = PACKAGE_NAME + ".STATE_VEHICLE_UID"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEventExtra.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEventExtra.java similarity index 84% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEventExtra.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEventExtra.java index 58a29f5757..bab6f8e075 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEventExtra.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEventExtra.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.attribute; +package org.droidplanner.services.android.lib.drone.attribute; /** * Holds handles used to retrieve additional information broadcast along a drone event. @@ -9,7 +9,7 @@ public class AttributeEventExtra { private AttributeEventExtra() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.attribute.event.extra"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.attribute.event.extra"; /** * Used to access the vehicle id. @@ -19,15 +19,15 @@ private AttributeEventExtra() { /** * Used to access autopilot error type. * - * @see {@link com.o3dr.services.android.lib.drone.attribute.error.ErrorType} - * @see {@link com.o3dr.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_ERROR} + * @see {@link org.droidplanner.services.android.lib.drone.attribute.error.ErrorType} + * @see {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_ERROR} */ public static final String EXTRA_AUTOPILOT_ERROR_ID = PACKAGE_NAME + ".AUTOPILOT_ERROR_ID"; /** * Used to access autopilot messages. * - * @see {@link com.o3dr.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_MESSAGE} + * @see {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_MESSAGE} */ public static final String EXTRA_AUTOPILOT_MESSAGE = PACKAGE_NAME + ".AUTOPILOT_MESSAGE"; @@ -41,14 +41,14 @@ private AttributeEventExtra() { /** * Used to access the magnetometer calibration progress. * - * @see {@link com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress} + * @see {@link org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress} */ public static final String EXTRA_CALIBRATION_MAG_PROGRESS = PACKAGE_NAME + ".CALIBRATION_MAG_PROGRESS"; /** * Used to access the result from the magnetometer calibration. * - * @see {@link com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult} + * @see {@link org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult} */ public static final String EXTRA_CALIBRATION_MAG_RESULT = PACKAGE_NAME + ".CALIBRATION_MAG_RESULT"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeType.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeType.java similarity index 60% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeType.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeType.java index 36ffe91fcd..7d4a64d453 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeType.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeType.java @@ -1,109 +1,109 @@ -package com.o3dr.services.android.lib.drone.attribute; +package org.droidplanner.services.android.lib.drone.attribute; /** * Stores the set of attribute types. */ public class AttributeType { - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.attribute"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.attribute"; //Private to prevent instantiation private AttributeType(){} /** * Used to access the vehicle's altitude state. - * @see {@link com.o3dr.services.android.lib.drone.property.Altitude} + * @see {@link org.droidplanner.services.android.lib.drone.property.Altitude} */ public static final String ALTITUDE = PACKAGE_NAME + ".ALTITUDE"; /** * Used to access the vehicle's attitude state. - * @see {@link com.o3dr.services.android.lib.drone.property.Attitude} + * @see {@link org.droidplanner.services.android.lib.drone.property.Attitude} */ public static final String ATTITUDE = PACKAGE_NAME + ".ATTITUDE"; /** * Used to access the vehicle's battery state. - * @see {@link com.o3dr.services.android.lib.drone.property.Speed} + * @see {@link org.droidplanner.services.android.lib.drone.property.Speed} */ public static final String BATTERY = PACKAGE_NAME + ".BATTERY"; /** * Used to access the set of camera information available for the connected drone. - * @see {@link com.o3dr.services.android.lib.drone.property.CameraProxy} + * @see {@link org.droidplanner.services.android.lib.drone.property.CameraProxy} */ public static final String CAMERA = PACKAGE_NAME + ".CAMERA"; /** * Used to acces the vehicle's follow state. - * @see {@link com.o3dr.services.android.lib.gcs.follow.FollowState} + * @see {@link org.droidplanner.services.android.lib.gcs.follow.FollowState} */ public static final String FOLLOW_STATE = PACKAGE_NAME + ".FOLLOW_STATE"; /** * Used to access the vehicle's guided state. - * @see {@link com.o3dr.services.android.lib.drone.property.GuidedState} + * @see {@link org.droidplanner.services.android.lib.drone.property.GuidedState} */ public static final String GUIDED_STATE = PACKAGE_NAME + ".GUIDED_STATE"; /** * Used to access the vehicle's gps state. - * @see {@link com.o3dr.services.android.lib.drone.property.Gps} object. + * @see {@link org.droidplanner.services.android.lib.drone.property.Gps} object. */ public static final String GPS = PACKAGE_NAME + ".GPS"; /** * Used to access the vehicle's home state. - * @see {@link com.o3dr.services.android.lib.drone.property.Home} + * @see {@link org.droidplanner.services.android.lib.drone.property.Home} */ public static final String HOME = PACKAGE_NAME + ".HOME"; /** * Used to access the vehicle's mission state. - * @see {@link com.o3dr.services.android.lib.drone.mission.Mission} + * @see {@link org.droidplanner.services.android.lib.drone.mission.Mission} */ public static final String MISSION = PACKAGE_NAME + ".MISSION"; /** * Used to access the vehicle's parameters. - * @see {@link com.o3dr.services.android.lib.drone.property.Parameters} - * @see {@link com.o3dr.services.android.lib.drone.property.Parameter} + * @see {@link org.droidplanner.services.android.lib.drone.property.Parameters} + * @see {@link org.droidplanner.services.android.lib.drone.property.Parameter} */ public static final String PARAMETERS = PACKAGE_NAME + ".PARAMETERS"; /** * Used to access the vehicle's signal state. - * @see {@link com.o3dr.services.android.lib.drone.property.Signal} + * @see {@link org.droidplanner.services.android.lib.drone.property.Signal} */ public static final String SIGNAL = PACKAGE_NAME + ".SIGNAL"; /** * Used to access the vehicle's speed info. - * @see {@link com.o3dr.services.android.lib.drone.property.Speed} + * @see {@link org.droidplanner.services.android.lib.drone.property.Speed} */ public static final String SPEED = PACKAGE_NAME + ".SPEED"; /** * Used to access the vehicle state. - * @see {@link com.o3dr.services.android.lib.drone.property.State} object. + * @see {@link org.droidplanner.services.android.lib.drone.property.State} object. */ public static final String STATE = PACKAGE_NAME + ".STATE"; /** * Used to access the vehicle type. - * @see {@link com.o3dr.services.android.lib.drone.property.Type} + * @see {@link org.droidplanner.services.android.lib.drone.property.Type} */ public static final String TYPE = PACKAGE_NAME + ".TYPE"; /** * Used to retrieve the status of the currently or last running magnetometer calibration. - * @see {@link com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus} + * @see {@link org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus} */ public static final String MAGNETOMETER_CALIBRATION_STATUS = PACKAGE_NAME + ".MAGNETOMETER_CALIBRATION_STATUS"; /** * Used to retrieve the 'return to me' state. - * @see {@link com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState} + * @see {@link org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState} */ public static final String RETURN_TO_ME_STATE = PACKAGE_NAME + ".RETURN_TO_ME_STATE"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/CommandExecutionError.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/CommandExecutionError.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/CommandExecutionError.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/CommandExecutionError.java index 42b60f6e55..53ad940f10 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/CommandExecutionError.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/CommandExecutionError.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.attribute.error; +package org.droidplanner.services.android.lib.drone.attribute.error; /** * List the possible command execution errors. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/ErrorType.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/ErrorType.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/ErrorType.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/ErrorType.java index 32dcdc6353..65b4c4d96a 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/ErrorType.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/ErrorType.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.attribute.error; +package org.droidplanner.services.android.lib.drone.attribute.error; import android.content.Context; import android.os.Parcel; @@ -6,7 +6,7 @@ import android.support.annotation.StringRes; import android.text.TextUtils; -import com.o3dr.android.client.R; +import org.droidplanner.android.client.R; /** * List all the possible error types. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl new file mode 100644 index 0000000000..92e5e9f91a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.calibration.magnetometer; + +parcelable MagnetometerCalibrationProgress; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java index a86318fc7d..9657472b9b 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.calibration.magnetometer; +package org.droidplanner.services.android.lib.drone.calibration.magnetometer; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl new file mode 100644 index 0000000000..2195cee82a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.calibration.magnetometer; + +parcelable MagnetometerCalibrationResult; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java index c5ccbf675a..e2152ec484 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.calibration.magnetometer; +package org.droidplanner.services.android.lib.drone.calibration.magnetometer; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl new file mode 100644 index 0000000000..4f129fe9fa --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.calibration.magnetometer; + +parcelable MagnetometerCalibrationStatus; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java similarity index 96% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java index e684ee5e5f..5f4243c990 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.calibration.magnetometer; +package org.droidplanner.services.android.lib.drone.calibration.magnetometer; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; import java.util.ArrayList; import java.util.HashMap; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloAttributes.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloAttributes.java similarity index 78% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloAttributes.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloAttributes.java index 05e0dc29fd..8afbba9088 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloAttributes.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloAttributes.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo; +package org.droidplanner.services.android.lib.drone.companion.solo; /** * Stores the set of solo attribute types. @@ -9,7 +9,7 @@ public class SoloAttributes { //Private to prevent instantiation private SoloAttributes(){} - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.attribute"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.attribute"; /** * Used to access the sololink state. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEventExtras.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEventExtras.java similarity index 82% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEventExtras.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEventExtras.java index f5480e339d..ee75e076ac 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEventExtras.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEventExtras.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo; +package org.droidplanner.services.android.lib.drone.companion.solo; /** * Holds handles used to retrieve additional information broadcast along a drone event. @@ -9,10 +9,10 @@ public class SoloEventExtras { //Private to prevent instantiation private SoloEventExtras(){} - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.event.extra"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.event.extra"; /** - * Used to retrieve the {@link com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket} object describing the button event. + * Used to retrieve the {@link org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket} object describing the button event. */ public static final String EXTRA_SOLO_BUTTON_EVENT = PACKAGE_NAME + ".EXTRA_SOLO_BUTTON_EVENT"; /** @@ -63,14 +63,14 @@ private SoloEventExtras(){} /** * Used to retrieve the controller mode. - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} * @see {@link SoloEvents#SOLO_CONTROLLER_MODE_UPDATED} */ public static final String EXTRA_SOLO_CONTROLLER_MODE = PACKAGE_NAME + ".EXTRA_SOLO_CONTROLLER_MODE"; /** * Used to retrieve the controller unit system. - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} * @see {@link SoloEvents#SOLO_CONTROLLER_UNIT_UPDATED} */ public static final String EXTRA_SOLO_CONTROLLER_UNIT = PACKAGE_NAME + ".EXTRA_SOLO_CONTROLLER_UNIT"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEvents.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEvents.java similarity index 88% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEvents.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEvents.java index c7429e459e..9a4d8d45c6 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEvents.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEvents.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo; +package org.droidplanner.services.android.lib.drone.companion.solo; /** * Stores all possible drone events. @@ -10,18 +10,18 @@ public class SoloEvents { private SoloEvents() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.event"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.event"; /** * Broadcasts updates to the GoPro state. * - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproState} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproState} */ public static final String SOLO_GOPRO_STATE_UPDATED = PACKAGE_NAME + ".GOPRO_STATE_UPDATED"; /** * Broadcasts updates to the Gopro extended state. - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2} */ public static final String SOLO_GOPRO_STATE_V2_UPDATED = PACKAGE_NAME + ".GOPRO_STATE_V2_UPDATED"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloState.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloState.java similarity index 89% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloState.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloState.java index 1925e137e3..55080d6962 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloState.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloState.java @@ -1,15 +1,15 @@ -package com.o3dr.services.android.lib.drone.companion.solo; +package org.droidplanner.services.android.lib.drone.companion.solo; import android.os.Parcel; import android.util.SparseArray; -import com.o3dr.android.client.utils.TxPowerComplianceCountries; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.android.client.utils.TxPowerComplianceCountries; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; import java.nio.ByteBuffer; import java.util.List; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloActions.java similarity index 57% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloActions.java index c6b436665e..e55fe0a41b 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloActions.java @@ -1,6 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.action; - -import com.o3dr.services.android.lib.util.Utils; +package org.droidplanner.services.android.lib.drone.companion.solo.action; /** * Created by Fredia Huya-Kouadio on 7/10/15. @@ -11,14 +9,14 @@ public class SoloActions { private SoloActions() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.action"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action"; public static final String ACTION_SEND_MESSAGE = PACKAGE_NAME + ".SEND_MESSAGE"; /** * TLV message object to send to the sololink companion computer. * - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket} */ public static final String EXTRA_MESSAGE_DATA = "extra_message_data"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloConfigActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloConfigActions.java similarity index 78% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloConfigActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloConfigActions.java index 098202d159..36e8474f83 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloConfigActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloConfigActions.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.action; +package org.droidplanner.services.android.lib.drone.companion.solo.action; /** * Created by Fredia Huya-Kouadio on 7/31/15. @@ -9,7 +9,7 @@ public class SoloConfigActions { private SoloConfigActions() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.action.config"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action.config"; public static final String ACTION_UPDATE_WIFI_SETTINGS = PACKAGE_NAME + ".UPDATE_WIFI_SETTINGS"; public static final String EXTRA_WIFI_SSID = "extra_wifi_ssid"; @@ -20,7 +20,7 @@ private SoloConfigActions() { /** * Used to retrieve the button settings to push to the sololink companion computer. * - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter} */ public static final String EXTRA_BUTTON_SETTINGS = "extra_button_settings"; @@ -29,7 +29,7 @@ private SoloConfigActions() { /** * Controller mode to apply. * - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} */ public static final String EXTRA_CONTROLLER_MODE = "extra_controller_mode"; @@ -54,7 +54,7 @@ private SoloConfigActions() { /** * Controller unit system to apply. - * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} + * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} */ public static final String EXTRA_CONTROLLER_UNIT = "extra_controller_unit"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java new file mode 100644 index 0000000000..aedbb4d504 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java @@ -0,0 +1,12 @@ +package org.droidplanner.services.android.lib.drone.companion.solo.action; + +/** + * Created by Fredia Huya-Kouadio on 7/31/15. + */ +public class SoloShotsActions { + + //Private to prevent instantiation + private SoloShotsActions(){} + + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action.shots"; +} diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonPacket.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonPacket.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonPacket.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonPacket.java index 1db907e750..405d6a2a80 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonPacket.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonPacket.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.button; +package org.droidplanner.services.android.lib.drone.companion.solo.button; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonTypes.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonTypes.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonTypes.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonTypes.java index b53b415fd3..e7eb4d5e19 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonTypes.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonTypes.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.button; +package org.droidplanner.services.android.lib.drone.companion.solo.button; /** * Created by djmedina on 4/15/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java index 308621fe8d..af9a809dbe 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.controller; +package org.droidplanner.services.android.lib.drone.companion.solo.controller; import android.support.annotation.IntDef; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java similarity index 90% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java index 568a5a3444..f665fc9300 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.controller; +package org.droidplanner.services.android.lib.drone.companion.solo.controller; import android.support.annotation.StringDef; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java index d26e7e1005..b7b5f4909e 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java similarity index 96% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java index e1dc3ebae3..f3d8c5bce2 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java index 6b2a954a05..4b8f50ba06 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java index cf0e241c4b..c24261ff74 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java index 8d3a38ca42..4d69f78b8f 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java index 4fe5460b59..c95209b861 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java @@ -1,8 +1,8 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java index dcc6ae7cd3..401c7834df 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java index c8a953fc12..30fc494e52 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; import android.support.annotation.IntDef; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java similarity index 95% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java index 28f28c8271..772456debd 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java @@ -1,9 +1,7 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.support.annotation.IntDef; -import com.MAVLink.enums.GOPRO_CAPTURE_MODE; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java similarity index 95% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java index 3b7d680a98..02531b70e8 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java index 2f627ce557..ae8b0313dd 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java similarity index 95% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java index cc383cc758..db8ccb10e1 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java similarity index 96% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java index 700cc224fd..60e61a32d1 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java index 2a01affcbb..cce36dd39d 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java @@ -1,12 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import android.support.annotation.IntDef; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.nio.ByteBuffer; /** diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java index 98fb9b3ce9..bd65694ca2 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java @@ -1,8 +1,8 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java index 9b7cd7c33b..9542805fbc 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java @@ -1,8 +1,8 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java index 1fbbf7ba2b..b543569a4b 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java similarity index 95% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java index f5fec3a54d..a51a9538b8 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.content.Context; import android.os.Parcel; -import com.o3dr.android.client.R; -import com.o3dr.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.android.client.R; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java similarity index 90% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java index 64da99e4f8..7cc5048501 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java similarity index 95% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java index d8715de398..b4c74eab87 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java index 2b5fea6ed1..3f20c0e7be 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloPause.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloPause.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloPause.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloPause.java index 0a8ff3c778..a5edcb8483 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloPause.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloPause.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotError.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotError.java similarity index 94% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotError.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotError.java index 138fdc7679..346d5d3990 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotError.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotError.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java index c71b41f9aa..e02c5da9f9 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java similarity index 66% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java index 0be0641668..5d9a0f3ca3 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java @@ -1,21 +1,21 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.util.Log; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectStart; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectSetWaypoint; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveGimbal; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveVehicle; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineAttach; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineDurations; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePathSettings; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlay; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlaybackStatus; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePoint; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineRecord; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineSeek; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.scan.SoloScanStart; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.survey.SoloSurveyStart; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectStart; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectSetWaypoint; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveGimbal; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveVehicle; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineAttach; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineDurations; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePathSettings; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlay; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlaybackStatus; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePoint; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineRecord; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineSeek; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.scan.SoloScanStart; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.survey.SoloSurveyStart; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; @@ -23,41 +23,41 @@ import java.util.ArrayList; import java.util.List; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_ARTOO_INPUT_REPORT_MESSAGE; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_OPTIONS; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_WAYPOINT; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS_V2; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GET_BUTTON_SETTING; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_RECORD; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_REQUEST_STATE; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_EXTENDED_REQUEST; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_REQUEST; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE_V2; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_GIMBAL; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_VEHICLE; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_SET_WAYPOINT; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_START; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_GET_CURRENT_SHOT; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_LOCATION; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_RECORD_POSITION; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SET_CURRENT_SHOT; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SHOT_MANAGER_ERROR; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_PAUSE_BUTTON; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SCAN_START; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SET_BUTTON_SETTING; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_ERROR; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_OPTIONS; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_ATTACH; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PATH_SETTINGS; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_DURATIONS; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAY; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAYBACK_STATUS; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_POINT; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_RECORD; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_SEEK; -import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SURVEY_START; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_ARTOO_INPUT_REPORT_MESSAGE; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_OPTIONS; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_WAYPOINT; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS_V2; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GET_BUTTON_SETTING; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_RECORD; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_REQUEST_STATE; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_EXTENDED_REQUEST; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_REQUEST; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE_V2; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_GIMBAL; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_VEHICLE; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_SET_WAYPOINT; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_START; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_GET_CURRENT_SHOT; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_LOCATION; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_RECORD_POSITION; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SET_CURRENT_SHOT; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SHOT_MANAGER_ERROR; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_PAUSE_BUTTON; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SCAN_START; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SET_BUTTON_SETTING; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_ERROR; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_OPTIONS; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_ATTACH; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PATH_SETTINGS; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_DURATIONS; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAY; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAYBACK_STATUS; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_POINT; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_RECORD; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_SEEK; +import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SURVEY_START; /** * Utility class to generate tlv packet from received bytes. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java index 1ed03112b9..55ed7b0dca 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; /** * All sololink messages types. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVPacket.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVPacket.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVPacket.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVPacket.java index 6c9b7ef0a5..3a93a0846f 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVPacket.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVPacket.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java index 47e764c2ef..c758da3220 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java index 253891a564..a9aecac5c7 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java index 3517463d2a..af7c8be308 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; import android.support.annotation.IntDef; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java similarity index 84% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java index e20d76ecb3..aea4c12000 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java similarity index 94% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java index ef5eb786ec..843ceb9a49 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java similarity index 96% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java index d07817d407..9fd75854b8 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java similarity index 79% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java index c6f7912844..4a32dccdd0 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java index 0d4f473322..6671ff2bee 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java index d2211f4cae..d91dbc1b51 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java index 44b56546bb..a2a833822d 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java index c212ecdf6c..2702f8ec3d 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java similarity index 88% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java index 4ea4f4a90f..8941be0763 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java similarity index 74% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java index 46a1307f16..29e3dbd4ab 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.scan; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.scan; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java similarity index 75% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java index ff593c288e..2ef136d872 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.survey; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.survey; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl new file mode 100644 index 0000000000..e9e3a3c9a8 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.connection; + +parcelable ConnectionParameter; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.java similarity index 99% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.java index 68b62f0e06..98816876a3 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.connection; +package org.droidplanner.services.android.lib.drone.connection; import android.os.Bundle; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl new file mode 100644 index 0000000000..baa036fcbc --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.connection; + +parcelable ConnectionResult; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.java index c4d4a652fa..e974efef09 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.connection; +package org.droidplanner.services.android.lib.drone.connection; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; /** * @deprecated Use {@link LinkConnectionStatus} instead. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionType.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionType.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionType.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionType.java index ac2468ac48..72d3ed9097 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionType.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionType.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.connection; +package org.droidplanner.services.android.lib.drone.connection; /** * Contains constants used for the connection parameters. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl new file mode 100644 index 0000000000..07feec7882 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.connection; + +parcelable DroneSharePrefs; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.java index 34d2b600af..3e82c9d5a4 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.connection; +package org.droidplanner.services.android.lib.drone.connection; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl new file mode 100644 index 0000000000..69462fb922 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.mission; + +parcelable Mission; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.java index d7df4be27b..3316216997 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.java @@ -1,13 +1,11 @@ -package com.o3dr.services.android.lib.drone.mission; +package org.droidplanner.services.android.lib.drone.mission; import android.os.Bundle; import android.os.Parcel; -import android.os.Parcelable; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/MissionItemType.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/MissionItemType.java similarity index 80% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/MissionItemType.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/MissionItemType.java index 4329c1e969..057a01f918 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/MissionItemType.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/MissionItemType.java @@ -1,31 +1,31 @@ -package com.o3dr.services.android.lib.drone.mission; +package org.droidplanner.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; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.item.command.CameraTrigger; +import org.droidplanner.services.android.lib.drone.mission.item.command.ChangeSpeed; +import org.droidplanner.services.android.lib.drone.mission.item.command.DoJump; +import org.droidplanner.services.android.lib.drone.mission.item.command.EpmGripper; +import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; +import org.droidplanner.services.android.lib.drone.mission.item.command.ReturnToLaunch; +import org.droidplanner.services.android.lib.drone.mission.item.command.SetRelay; +import org.droidplanner.services.android.lib.drone.mission.item.command.SetServo; +import org.droidplanner.services.android.lib.drone.mission.item.command.Takeoff; +import org.droidplanner.services.android.lib.drone.mission.item.command.YawCondition; +import org.droidplanner.services.android.lib.drone.mission.item.complex.SplineSurvey; +import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; +import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Circle; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.DoLandStart; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Land; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.SplineWaypoint; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Waypoint; +import org.droidplanner.services.android.lib.drone.property.Type; +import org.droidplanner.services.android.lib.util.ParcelableUtils; /** * /** diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/action/MissionActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/action/MissionActions.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/action/MissionActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/action/MissionActions.java index e30a873550..da5eba3809 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/action/MissionActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/action/MissionActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.drone.mission.action; +package org.droidplanner.services.android.lib.drone.mission.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl new file mode 100644 index 0000000000..62f8947e2f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.mission.item; + +parcelable MissionItem; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.java similarity index 86% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.java index f4c2fb8b5d..86bc91fd31 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.java @@ -1,12 +1,10 @@ -package com.o3dr.services.android.lib.drone.mission.item; +package org.droidplanner.services.android.lib.drone.mission.item; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; - -import java.io.Serializable; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/5/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/CameraTrigger.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/CameraTrigger.java similarity index 90% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/CameraTrigger.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/CameraTrigger.java index bdb4c6eb0e..dcefdf68b4 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/CameraTrigger.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/CameraTrigger.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ChangeSpeed.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ChangeSpeed.java similarity index 89% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ChangeSpeed.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ChangeSpeed.java index f119571d85..b7f508baa5 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ChangeSpeed.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ChangeSpeed.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/DoJump.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/DoJump.java similarity index 90% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/DoJump.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/DoJump.java index fa0d8bea3a..cf359ffbc7 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/DoJump.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/DoJump.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Created by Toby on 7/31/2015. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/EpmGripper.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/EpmGripper.java similarity index 88% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/EpmGripper.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/EpmGripper.java index 9b7c68ce63..ac5136bcc2 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/EpmGripper.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/EpmGripper.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ResetROI.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ResetROI.java similarity index 82% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ResetROI.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ResetROI.java index 4ffe4b5274..99c3127182 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ResetROI.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ResetROI.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Reset the current region of interest lock. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ReturnToLaunch.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ReturnToLaunch.java similarity index 89% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ReturnToLaunch.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ReturnToLaunch.java index ce81de4825..b0141a20be 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ReturnToLaunch.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ReturnToLaunch.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetRelay.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetRelay.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetRelay.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetRelay.java index fd711d30c5..10b4449eeb 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetRelay.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetRelay.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Set a Relay pin’s voltage high or low. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetServo.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetServo.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetServo.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetServo.java index 8b0debe0d8..d513bb0524 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetServo.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetServo.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Mission command used to move a servo to a particular pwm value. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/Takeoff.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/Takeoff.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/Takeoff.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/Takeoff.java index 1d6d0ab60f..6d3a79e399 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/Takeoff.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/Takeoff.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * The vehicle will climb straight up from it’s current location to the altitude specified (in meters). diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/YawCondition.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/YawCondition.java similarity index 92% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/YawCondition.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/YawCondition.java index e73e865c83..a7a0a16f8e 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/YawCondition.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/YawCondition.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.command; +package org.droidplanner.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/10/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl new file mode 100644 index 0000000000..9b81c1bdf9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.mission.item.complex; + +parcelable CameraDetail; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.java index 9f4eb0ffdc..43a29a7834 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.mission.item.complex; +package org.droidplanner.services.android.lib.drone.mission.item.complex; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SplineSurvey.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SplineSurvey.java similarity index 79% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SplineSurvey.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SplineSurvey.java index 15c4a35653..d200411865 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SplineSurvey.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SplineSurvey.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.complex; +package org.droidplanner.services.android.lib.drone.mission.item.complex; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** */ diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl new file mode 100644 index 0000000000..5d3de94a90 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.mission.item.complex; + +parcelable StructureScanner; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.java index 1c8eba77db..639c80e0d2 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.java @@ -1,12 +1,12 @@ -package com.o3dr.services.android.lib.drone.mission.item.complex; +package org.droidplanner.services.android.lib.drone.mission.item.complex; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.spatial.BaseSpatialItem; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.BaseSpatialItem; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl new file mode 100644 index 0000000000..2d6bd998bd --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.mission.item.complex; + +parcelable Survey; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.java similarity index 95% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.java index f0ae8c7fd5..30e594ed53 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.java @@ -1,11 +1,11 @@ -package com.o3dr.services.android.lib.drone.mission.item.complex; +package org.droidplanner.services.android.lib.drone.mission.item.complex; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.util.MathUtils; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.util.MathUtils; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SurveyDetail.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SurveyDetail.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SurveyDetail.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SurveyDetail.java index e03f654f8b..dfe74d5f23 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SurveyDetail.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SurveyDetail.java @@ -1,10 +1,8 @@ -package com.o3dr.services.android.lib.drone.mission.item.complex; +package org.droidplanner.services.android.lib.drone.mission.item.complex; import android.os.Parcel; import android.os.Parcelable; -import java.io.Serializable; - /** * Created by fhuya on 11/7/14. */ diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java similarity index 85% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java index a26045f4fe..50d34d6043 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.drone.mission.item.spatial; +package org.droidplanner.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -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.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Circle.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Circle.java similarity index 89% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Circle.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Circle.java index 79c339153d..bb7d296ba0 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Circle.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Circle.java @@ -1,10 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.spatial; +package org.droidplanner.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/DoLandStart.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/DoLandStart.java similarity index 78% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/DoLandStart.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/DoLandStart.java index 72627318ef..4b8898dbf0 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/DoLandStart.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/DoLandStart.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.spatial; +package org.droidplanner.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; public class DoLandStart extends BaseSpatialItem implements android.os.Parcelable { diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Land.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Land.java similarity index 73% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Land.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Land.java index fbd83ff574..36602739cc 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Land.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Land.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.drone.mission.item.spatial; +package org.droidplanner.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java similarity index 79% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java index a6c0ee486f..0a32beaea7 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java @@ -1,10 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.spatial; +package org.droidplanner.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Points the nose of the vehicle and camera gimbal at the “region of interest”. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java similarity index 88% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java index 408e36208b..db66f4af02 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java @@ -1,10 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.spatial; +package org.droidplanner.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Waypoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Waypoint.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Waypoint.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Waypoint.java index f1df71ae71..1b154de2c0 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Waypoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Waypoint.java @@ -1,10 +1,9 @@ -package com.o3dr.services.android.lib.drone.mission.item.spatial; +package org.droidplanner.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl new file mode 100644 index 0000000000..5620f3fa99 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Altitude; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.java index 2f260b14b1..464ec350f5 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl new file mode 100644 index 0000000000..58b33ac277 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Attitude; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.java index 1dbe4e3734..e39e00d52d 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl new file mode 100644 index 0000000000..e8ffa81496 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Battery; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.java similarity index 96% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.java index b41870f507..68e8b4a79d 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.java @@ -1,7 +1,6 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; -import android.os.Parcelable; /** * Created by fhuya on 10/28/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/CameraProxy.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/CameraProxy.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/CameraProxy.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/CameraProxy.java index 4fef2a1f14..9e406a36ce 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/CameraProxy.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/CameraProxy.java @@ -1,9 +1,8 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; -import android.os.Parcelable; -import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; +import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/DroneAttribute.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/DroneAttribute.java similarity index 69% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/DroneAttribute.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/DroneAttribute.java index 155fb0e404..ed1c129bf7 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/DroneAttribute.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/DroneAttribute.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl new file mode 100644 index 0000000000..541e286302 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable EkfStatus; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.java index da511eea18..1db6ff5c2b 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl new file mode 100644 index 0000000000..dcbe232ed7 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable FootPrint; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.java similarity index 90% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.java index 97320f1541..df85f8d143 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.java @@ -1,10 +1,9 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; -import android.os.Parcelable; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.util.MathUtils; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.util.MathUtils; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl new file mode 100644 index 0000000000..9a0f3c8b22 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Gps; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.java index 44c7a52b87..bab8a03d44 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; /** * Stores GPS information. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl new file mode 100644 index 0000000000..2c354ea89b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable GuidedState; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.java index 5cd9e38f26..43e85a5fee 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; /** * Created by fhuya on 11/5/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl new file mode 100644 index 0000000000..e6c766dabf --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Home; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.java index 91a1ea2e3b..b7ea4085ff 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.java @@ -1,9 +1,9 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; /** * Location from which the drone took off. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameter.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameter.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameter.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameter.java index d93e78a7a9..3925375a58 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameter.java @@ -1,7 +1,6 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; -import android.os.Parcelable; import java.text.DecimalFormat; import java.text.ParseException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl new file mode 100644 index 0000000000..2b137a0424 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Parameters; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.java index 99627ec9f2..ed23d75b45 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.support.annotation.NonNull; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl new file mode 100644 index 0000000000..ddad34381c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Signal; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.java index 1d62fbe6e9..095109c2ef 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl new file mode 100644 index 0000000000..29bc4a100d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Speed; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.java index 3846928216..021cca3554 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl new file mode 100644 index 0000000000..efda6a7ec6 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable State; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.java index 53e3f0134b..dfe2e387db 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.java @@ -1,7 +1,6 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; -import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl new file mode 100644 index 0000000000..b0459c1ce9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Type; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.java similarity index 96% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.java index 814f244d36..c76290f265 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.java @@ -1,7 +1,6 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; -import android.os.Parcelable; /** * Stores information about the drone's type. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl new file mode 100644 index 0000000000..ff41df28c9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable VehicleMode; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.java index dd2b93232d..8c36bac70f 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.java @@ -1,7 +1,6 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; -import android.os.Parcelable; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl new file mode 100644 index 0000000000..4e67d0077c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.drone.property; + +parcelable Vibration; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.java index ad56090a40..005fb99afd 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.property; +package org.droidplanner.services.android.lib.drone.property; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/CalibrationActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/CalibrationActions.java similarity index 91% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/CalibrationActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/CalibrationActions.java index 5b730f71bf..a096a51ad9 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/CalibrationActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/CalibrationActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.gcs.action; +package org.droidplanner.services.android.lib.gcs.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/FollowMeActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/FollowMeActions.java similarity index 83% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/FollowMeActions.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/FollowMeActions.java index 26575c9963..6491b53679 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/FollowMeActions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/FollowMeActions.java @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.gcs.action; +package org.droidplanner.services.android.lib.gcs.action; -import com.o3dr.services.android.lib.util.Utils; +import org.droidplanner.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/event/GCSEvent.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/event/GCSEvent.java similarity index 86% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/event/GCSEvent.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/event/GCSEvent.java index f078c758ed..7169a89465 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/event/GCSEvent.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/event/GCSEvent.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.gcs.event; +package org.droidplanner.services.android.lib.gcs.event; /** * Stores the list of gcs events (as action), and their extra parameters. @@ -6,7 +6,7 @@ */ public class GCSEvent { - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.gcs.event"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.gcs.event"; /** * Key to retrieve the app id for the client that caused the event. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl new file mode 100644 index 0000000000..960c6472d9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.gcs.follow; + +parcelable FollowState; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.java index ad5df9aec4..4ab68f3fdf 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.gcs.follow; +package org.droidplanner.services.android.lib.gcs.follow; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; /** * Created by fhuya on 11/5/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl new file mode 100644 index 0000000000..fe9e41c7d4 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.gcs.follow; + +parcelable FollowType; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.java index 8903530c91..ab3b3c36ba 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.gcs.follow; +package org.droidplanner.services.android.lib.gcs.follow; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkConnectionStatus.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkConnectionStatus.java similarity index 94% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkConnectionStatus.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkConnectionStatus.java index e9f1c95980..bc1efba494 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkConnectionStatus.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkConnectionStatus.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.gcs.link; +package org.droidplanner.services.android.lib.gcs.link; import android.os.Bundle; import android.os.Parcel; @@ -10,9 +10,9 @@ /** * Conveys information about the link connection state. *

- * This value is returned in the {@link com.o3dr.android.client.Drone#notifyAttributeUpdated} as the - * extra value {@link com.o3dr.services.android.lib.gcs.link.LinkEventExtra#EXTRA_CONNECTION_STATUS} - * when the attribute event is {@link com.o3dr.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} + * This value is returned in the {@link org.droidplanner.android.client.Drone#notifyAttributeUpdated} as the + * extra value {@link org.droidplanner.services.android.lib.gcs.link.LinkEventExtra#EXTRA_CONNECTION_STATUS} + * when the attribute event is {@link org.droidplanner.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} */ public final class LinkConnectionStatus implements Parcelable { /** diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEvent.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEvent.java similarity index 68% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEvent.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEvent.java index 2758155a1e..c65e1b03a4 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEvent.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEvent.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.gcs.link; +package org.droidplanner.services.android.lib.gcs.link; /** * Stores all possible link events. @@ -8,7 +8,7 @@ public class LinkEvent { private LinkEvent() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.gcs.link.event"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.gcs.link.event"; /** * Notifies what the link connection status currently is. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEventExtra.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEventExtra.java similarity index 60% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEventExtra.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEventExtra.java index 03559f95a1..465f8321e1 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEventExtra.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEventExtra.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.gcs.link; +package org.droidplanner.services.android.lib.gcs.link; /** * Holds handles used to retrieve additional information broadcast along a link event. @@ -9,13 +9,13 @@ public class LinkEventExtra { private LinkEventExtra() { } - private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.gcs.link.event.extra"; + private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.gcs.link.event.extra"; /** * Used to access the link connection status. * * @see {@link LinkConnectionStatus} - * @see {@link com.o3dr.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} + * @see {@link org.droidplanner.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} */ public static final String EXTRA_CONNECTION_STATUS = PACKAGE_NAME + ".CONNECTION_STATUS"; } diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl new file mode 100644 index 0000000000..3442e6d0f4 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.gcs.returnToMe; + +parcelable ReturnToMeState; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.java similarity index 93% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.java index 51b52c6b08..fe016cc636 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.java @@ -1,10 +1,10 @@ -package com.o3dr.services.android.lib.gcs.returnToMe; +package org.droidplanner.services.android.lib.gcs.returnToMe; import android.os.Parcel; import android.support.annotation.IntDef; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl new file mode 100644 index 0000000000..f29776059f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl @@ -0,0 +1,2 @@ +package org.droidplanner.services.android.lib.mavlink; +parcelable MavlinkMessageWrapper; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.java similarity index 96% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.java index 1603e34351..cbe7d88a25 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.mavlink; +package org.droidplanner.services.android.lib.mavlink; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/AbstractCommandListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/AbstractCommandListener.java similarity index 85% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/AbstractCommandListener.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/AbstractCommandListener.java index d40d7e3555..ba5bbafa56 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/AbstractCommandListener.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/AbstractCommandListener.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; /** * Created by Fredia Huya-Kouadio on 7/5/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IApiListener.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IApiListener.aidl similarity index 79% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/IApiListener.aidl rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IApiListener.aidl index ef7a544a45..841aac7c92 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IApiListener.aidl +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IApiListener.aidl @@ -1,6 +1,6 @@ -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; -import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; /** * DroneAPI event listener. A valid instance must be provided at api registration. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/ICommandListener.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/ICommandListener.aidl similarity index 69% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/ICommandListener.aidl rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/ICommandListener.aidl index 42c758bf49..2f930226ac 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/ICommandListener.aidl +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/ICommandListener.aidl @@ -1,5 +1,5 @@ //ICommandListener.aidl -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; /** * Asynchronous notification of a command execution state. @@ -13,7 +13,7 @@ oneway interface ICommandListener { /** * Called when the command execution failed. - * @param executionError Defined by {@link com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError} + * @param executionError Defined by {@link org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError} */ void onError(int executionError); diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroidPlannerServices.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroidPlannerServices.aidl similarity index 86% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroidPlannerServices.aidl rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroidPlannerServices.aidl index b65beb8b10..a95e359ece 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroidPlannerServices.aidl +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroidPlannerServices.aidl @@ -1,8 +1,8 @@ // IDroidPlannerServices.aidl -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; -import com.o3dr.services.android.lib.model.IDroneApi; -import com.o3dr.services.android.lib.model.IApiListener; +import org.droidplanner.services.android.lib.model.IDroneApi; +import org.droidplanner.services.android.lib.model.IApiListener; /** * Used to establish connection with a drone. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroneApi.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroneApi.aidl similarity index 81% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroneApi.aidl rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroneApi.aidl index 30172c0304..fff0b7e467 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroneApi.aidl +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroneApi.aidl @@ -1,10 +1,10 @@ // IDroneApi.aidl -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; -import com.o3dr.services.android.lib.model.IObserver; -import com.o3dr.services.android.lib.model.IMavlinkObserver; -import com.o3dr.services.android.lib.model.action.Action; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.IObserver; +import org.droidplanner.services.android.lib.model.IMavlinkObserver; +import org.droidplanner.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.model.ICommandListener; /** * Interface used to access the drone properties. @@ -14,7 +14,7 @@ interface IDroneApi { /** * Retrieves the attribute whose type is specified by the parameter. * @param attributeType type of the attribute to retrieve. The list of supported - types is stored in {@link com.o3dr.services.android.lib.drone.attribute.AttributeType}. + types is stored in {@link org.droidplanner.services.android.lib.drone.attribute.AttributeType}. * @return Bundle object containing the requested attribute. */ Bundle getAttribute(String attributeType); diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IMavlinkObserver.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IMavlinkObserver.aidl similarity index 73% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/IMavlinkObserver.aidl rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IMavlinkObserver.aidl index 3730942f06..0e1ea7089f 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IMavlinkObserver.aidl +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IMavlinkObserver.aidl @@ -1,7 +1,7 @@ // IMavlinkObserver.aidl -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; -import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; /** * Asynchronous notification on receipt of new mavlink message. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IObserver.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IObserver.aidl similarity index 75% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/IObserver.aidl rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IObserver.aidl index dfc3067225..c4eb5a0d60 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IObserver.aidl +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IObserver.aidl @@ -1,5 +1,5 @@ // IObserver.aidl -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; /** * Asynchronous notification on change of vehicle state is available by registering observers for @@ -9,7 +9,7 @@ oneway interface IObserver { /** * Notify observer that the named attribute has changed. - * @param attributeEvent event describing the update. The supported events are listed in {@link com.o3dr.services.android.lib.drone.attribute.AttributeEvent} + * @param attributeEvent event describing the update. The supported events are listed in {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEvent} * @param attributeBundle bundle object from which additional event data can be retrieved. */ void onAttributeUpdated(String attributeEvent, in Bundle eventExtras); diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/SimpleCommandListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/SimpleCommandListener.java similarity index 88% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/SimpleCommandListener.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/SimpleCommandListener.java index 8f08a61877..4a5121de10 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/SimpleCommandListener.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/SimpleCommandListener.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.model; +package org.droidplanner.services.android.lib.model; /** * Basic command listener implementation. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl new file mode 100644 index 0000000000..4ff71deba2 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl @@ -0,0 +1,3 @@ +package org.droidplanner.services.android.lib.model.action; + +parcelable Action; \ No newline at end of file diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.java similarity index 95% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.java index 2b5833cd9d..7cd105778f 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.model.action; +package org.droidplanner.services.android.lib.model.action; import android.os.Bundle; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/MathUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/MathUtils.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/util/MathUtils.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/util/MathUtils.java index bb9dcbb192..ff90254289 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/MathUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/MathUtils.java @@ -1,7 +1,7 @@ -package com.o3dr.services.android.lib.util; +package org.droidplanner.services.android.lib.util; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/ParcelableUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/ParcelableUtils.java similarity index 97% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/util/ParcelableUtils.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/util/ParcelableUtils.java index 1f3de2ca8c..daa00d5af1 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/ParcelableUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/ParcelableUtils.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.util; +package org.droidplanner.services.android.lib.util; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/SpannableUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/SpannableUtils.java similarity index 98% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/util/SpannableUtils.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/util/SpannableUtils.java index 4d5224a43e..b589346cf6 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/SpannableUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/SpannableUtils.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.util; +package org.droidplanner.services.android.lib.util; import android.graphics.Typeface; import android.text.Spannable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/Utils.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/Utils.java new file mode 100644 index 0000000000..990c494398 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/Utils.java @@ -0,0 +1,9 @@ +package org.droidplanner.services.android.lib.util; + +/** + * Created by Fredia Huya-Kouadio on 1/19/15. + */ +public class Utils { + + public static final String PACKAGE_NAME = "org.droidplanner.services.android"; +} diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/googleApi/GoogleApiClientManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/googleApi/GoogleApiClientManager.java similarity index 99% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/util/googleApi/GoogleApiClientManager.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/util/googleApi/GoogleApiClientManager.java index 5a56c206a8..5655046b44 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/googleApi/GoogleApiClientManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/googleApi/GoogleApiClientManager.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.util.googleApi; +package org.droidplanner.services.android.lib.util.googleApi; import android.content.Context; import android.os.Bundle; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/version/VersionUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java similarity index 70% rename from ClientLib/src/main/java/com/o3dr/services/android/lib/util/version/VersionUtils.java rename to ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java index 74939b8a56..717bc447a0 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/version/VersionUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java @@ -1,9 +1,8 @@ -package com.o3dr.services.android.lib.util.version; +package org.droidplanner.services.android.lib.util.version; import android.content.Context; -import android.content.pm.PackageManager; -import com.o3dr.android.client.R; +import org.droidplanner.android.client.R; /** * Created by fhuya on 11/12/14. diff --git a/ServiceApp/AndroidManifest.xml b/ServiceApp/AndroidManifest.xml index fa07164a05..ad206dbaa4 100644 --- a/ServiceApp/AndroidManifest.xml +++ b/ServiceApp/AndroidManifest.xml @@ -88,7 +88,7 @@ @@ -112,7 +112,7 @@ diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java b/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java index 506008f8d9..c7702d730c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java @@ -4,12 +4,12 @@ import android.os.RemoteException; import android.util.Log; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.gcs.event.GCSEvent; -import com.o3dr.services.android.lib.model.IApiListener; -import com.o3dr.services.android.lib.model.IDroidPlannerServices; -import com.o3dr.services.android.lib.model.IDroneApi; -import com.o3dr.services.android.lib.util.version.VersionUtils; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.gcs.event.GCSEvent; +import org.droidplanner.services.android.lib.model.IApiListener; +import org.droidplanner.services.android.lib.model.IDroidPlannerServices; +import org.droidplanner.services.android.lib.model.IDroneApi; +import org.droidplanner.services.android.lib.util.version.VersionUtils; import org.droidplanner.services.android.BuildConfig; import org.droidplanner.services.android.core.drone.DroneManager; diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java index 0af1887125..9a8f8ec344 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java @@ -6,7 +6,6 @@ import android.app.Service; import android.content.Context; import android.content.Intent; -import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -14,10 +13,10 @@ import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; -import com.o3dr.services.android.lib.model.IApiListener; -import com.o3dr.services.android.lib.model.IDroidPlannerServices; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; +import org.droidplanner.services.android.lib.model.IApiListener; +import org.droidplanner.services.android.lib.model.IDroidPlannerServices; import org.droidplanner.services.android.DroidPlannerServicesApp; import org.droidplanner.services.android.R; diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java index c3b30e17bd..360d3f658b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java @@ -12,35 +12,35 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.ardupilotmega.msg_mag_cal_progress; import com.MAVLink.ardupilotmega.msg_mag_cal_report; -import com.o3dr.services.android.lib.drone.action.CameraActions; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.action.ConnectionActions; -import com.o3dr.services.android.lib.drone.action.ExperimentalActions; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.drone.connection.ConnectionResult; -import com.o3dr.services.android.lib.drone.mission.Mission; -import com.o3dr.services.android.lib.drone.mission.action.MissionActions; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.item.command.ResetROI; -import com.o3dr.services.android.lib.drone.mission.item.spatial.RegionOfInterest; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.drone.property.Parameter; -import com.o3dr.services.android.lib.drone.property.State; -import com.o3dr.services.android.lib.gcs.event.GCSEvent; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; -import com.o3dr.services.android.lib.gcs.link.LinkEvent; -import com.o3dr.services.android.lib.gcs.link.LinkEventExtra; -import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; -import com.o3dr.services.android.lib.model.IApiListener; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.IDroneApi; -import com.o3dr.services.android.lib.model.IMavlinkObserver; -import com.o3dr.services.android.lib.model.IObserver; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.drone.action.CameraActions; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.action.ConnectionActions; +import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; +import org.droidplanner.services.android.lib.drone.mission.Mission; +import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.State; +import org.droidplanner.services.android.lib.gcs.event.GCSEvent; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkEvent; +import org.droidplanner.services.android.lib.gcs.link.LinkEventExtra; +import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; +import org.droidplanner.services.android.lib.model.IApiListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.IDroneApi; +import org.droidplanner.services.android.lib.model.IMavlinkObserver; +import org.droidplanner.services.android.lib.model.IObserver; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.communication.connection.SoloConnection; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java index 54b37879e4..fdba99d243 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java @@ -2,7 +2,7 @@ import android.content.Context; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.core.MAVLink.connection.TcpConnection; import org.droidplanner.services.android.core.model.Logger; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java index 98103e94b3..a9b28eaac3 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java @@ -3,7 +3,7 @@ import android.content.Context; import android.util.Log; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.core.MAVLink.connection.UdpConnection; import org.droidplanner.services.android.core.model.Logger; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java index cee0bbdee6..efcc772b1b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java @@ -6,9 +6,9 @@ import android.os.Bundle; import android.text.TextUtils; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.drone.connection.ConnectionType; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionType; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java index ca48297c77..de872f61fe 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java @@ -11,7 +11,7 @@ import com.hoho.android.usbserial.driver.UsbSerialDriver; import com.hoho.android.usbserial.driver.UsbSerialProber; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import java.io.IOException; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java index 00e389ce69..fb77ef56e7 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java @@ -5,7 +5,7 @@ import android.hardware.usb.UsbManager; import android.util.Log; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java b/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java index 62ac365510..43123f499e 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.communication.model; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.model.ICommandListener; public class DataLink { diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java b/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java index a646e9b893..40b54fac7d 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java @@ -7,10 +7,10 @@ import com.MAVLink.MAVLinkPacket; import com.MAVLink.Messages.MAVLinkMessage; import com.google.android.gms.analytics.HitBuilders; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.drone.connection.ConnectionType; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionType; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; import org.droidplanner.services.android.communication.connection.AndroidTcpConnection; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java index 7d863bcad2..73b55bd3c8 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java @@ -4,7 +4,7 @@ import com.MAVLink.common.msg_command_long; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_CMD_ACK; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java index 4c17097660..45c572ba50 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java @@ -9,7 +9,7 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; import com.MAVLink.enums.MAV_GOTO; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.core.drone.variables.ApmModes; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java index 49be088377..d0dcbf6e66 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java @@ -5,7 +5,7 @@ import com.MAVLink.common.msg_param_request_list; import com.MAVLink.common.msg_param_request_read; import com.MAVLink.common.msg_param_set; -import com.o3dr.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameter; public class MavLinkParameters { public static void requestParametersList(MavLinkDrone drone) { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java index ed00aba64b..48bcc7cc2d 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java @@ -6,8 +6,8 @@ import com.MAVLink.common.msg_mission_set_current; import com.MAVLink.enums.GRIPPER_ACTIONS; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java index 857242c1e3..6e60b84ed9 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java @@ -5,7 +5,7 @@ import com.MAVLink.MAVLinkPacket; import com.MAVLink.Parser; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.core.model.Logger; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java index 75cb55e9d9..dd9ec185f4 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.MAVLink.connection; import com.MAVLink.MAVLinkPacket; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; /** * Provides updates about the mavlink connection. diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java index 32be8546e6..25e087a6d4 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java @@ -2,7 +2,7 @@ import android.os.Bundle; -import com.o3dr.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.core.MAVLink.WaypointManager; import org.droidplanner.services.android.core.drone.autopilot.Drone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java index 7eb4b88c75..74aa93e791 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java @@ -6,16 +6,16 @@ import android.text.TextUtils; import android.util.Log; -import com.o3dr.services.android.lib.drone.action.ControlActions; -import com.o3dr.services.android.lib.drone.action.GimbalActions; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.drone.connection.ConnectionType; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.drone.property.Parameter; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.action.GimbalActions; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionType; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.api.DroneApi; import org.droidplanner.services.android.communication.model.DataLink; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java index 4f107d983b..7e0485c0a7 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java @@ -3,7 +3,7 @@ import android.os.Handler; import android.os.RemoteException; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java index 75db51176e..dc6a2c7a99 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.drone.autopilot; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java index 08d05174d6..bf557f9210 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java @@ -6,11 +6,11 @@ import com.github.zafarkhaja.semver.Version; import com.MAVLink.Messages.MAVLinkMessage; -import com.o3dr.android.client.apis.CapabilityApi; -import com.o3dr.services.android.lib.drone.action.ControlActions; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.property.Parameter; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.android.client.apis.CapabilityApi; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; @@ -25,8 +25,6 @@ import org.droidplanner.services.android.utils.CommonApiUtils; import java.util.concurrent.ConcurrentHashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * Created by Fredia Huya-Kouadio on 7/27/15. diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java index 88b36c1a54..72b16d91f9 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java @@ -23,25 +23,25 @@ import com.MAVLink.enums.MAV_MOUNT_MODE; import com.MAVLink.enums.MAV_SYS_STATUS_SENSOR; import com.github.zafarkhaja.semver.Version; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.action.ControlActions; -import com.o3dr.services.android.lib.drone.action.ExperimentalActions; -import com.o3dr.services.android.lib.drone.action.GimbalActions; -import com.o3dr.services.android.lib.drone.action.ParameterActions; -import com.o3dr.services.android.lib.drone.action.StateActions; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.mission.action.MissionActions; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.drone.property.Parameter; -import com.o3dr.services.android.lib.drone.property.VehicleMode; -import com.o3dr.services.android.lib.gcs.action.CalibrationActions; -import com.o3dr.services.android.lib.model.AbstractCommandListener; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; +import org.droidplanner.services.android.lib.drone.action.GimbalActions; +import org.droidplanner.services.android.lib.drone.action.ParameterActions; +import org.droidplanner.services.android.lib.drone.action.StateActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.services.android.lib.gcs.action.CalibrationActions; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; @@ -190,8 +190,8 @@ public boolean executeAsyncAction(Action action, final ICommandListener listener return true; case MissionActions.ACTION_SET_MISSION: - data.setClassLoader(com.o3dr.services.android.lib.drone.mission.Mission.class.getClassLoader()); - com.o3dr.services.android.lib.drone.mission.Mission mission = data.getParcelable(MissionActions.EXTRA_MISSION); + data.setClassLoader(org.droidplanner.services.android.lib.drone.mission.Mission.class.getClassLoader()); + org.droidplanner.services.android.lib.drone.mission.Mission mission = data.getParcelable(MissionActions.EXTRA_MISSION); boolean pushToDrone = data.getBoolean(MissionActions.EXTRA_PUSH_TO_DRONE); CommonApiUtils.setMission(this, mission, pushToDrone); return true; @@ -257,8 +257,8 @@ public boolean executeAsyncAction(Action action, final ICommandListener listener return true; case ParameterActions.ACTION_WRITE_PARAMETERS: - data.setClassLoader(com.o3dr.services.android.lib.drone.property.Parameters.class.getClassLoader()); - com.o3dr.services.android.lib.drone.property.Parameters parameters = data.getParcelable(ParameterActions.EXTRA_PARAMETERS); + data.setClassLoader(org.droidplanner.services.android.lib.drone.property.Parameters.class.getClassLoader()); + org.droidplanner.services.android.lib.drone.property.Parameters parameters = data.getParcelable(ParameterActions.EXTRA_PARAMETERS); CommonApiUtils.writeParameters(this, parameters); return true; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java index 824e53bc25..58fc0b2f0a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java @@ -5,9 +5,9 @@ import android.os.RemoteException; import android.text.TextUtils; -import com.o3dr.android.client.utils.connection.AbstractIpConnection; -import com.o3dr.android.client.utils.connection.IpConnectionListener; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.android.client.utils.connection.AbstractIpConnection; +import org.droidplanner.android.client.utils.connection.IpConnectionListener; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.utils.connection.SshConnection; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java index 80a8c42200..5f3f114251 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java @@ -10,28 +10,27 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_statustext; import com.MAVLink.enums.MAV_TYPE; -import com.o3dr.android.client.apis.CapabilityApi; -import com.o3dr.android.client.utils.TxPowerComplianceCountries; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.companion.solo.SoloAttributes; -import com.o3dr.services.android.lib.drone.companion.solo.SoloEventExtras; -import com.o3dr.services.android.lib.drone.companion.solo.SoloEvents; -import com.o3dr.services.android.lib.drone.companion.solo.action.SoloActions; -import com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions; -import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.drone.property.State; -import com.o3dr.services.android.lib.model.AbstractCommandListener; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.android.client.apis.CapabilityApi; +import org.droidplanner.android.client.utils.TxPowerComplianceCountries; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloAttributes; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; +import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloActions; +import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.State; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java index 4017d32a62..c77894ba66 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java @@ -8,22 +8,22 @@ import android.util.Pair; import android.util.SparseArray; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.companion.solo.SoloEventExtras; -import com.o3dr.services.android.lib.drone.companion.solo.SoloEvents; -import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; -import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonTypes; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproState; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproState; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.BuildConfig; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkListener; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java index 5a22767982..27269ad42b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller; -import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java index d4c9a7c0c1..c46c5a46dd 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java @@ -6,16 +6,16 @@ import android.util.Pair; import com.github.zafarkhaja.semver.Version; -import com.o3dr.android.client.utils.TxPowerComplianceCountries; -import com.o3dr.android.client.utils.connection.IpConnectionListener; -import com.o3dr.android.client.utils.connection.TcpConnection; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.android.client.utils.TxPowerComplianceCountries; +import org.droidplanner.android.client.utils.connection.IpConnectionListener; +import org.droidplanner.android.client.utils.connection.TcpConnection; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; @@ -321,7 +321,7 @@ int getControllerMode() { /** * Return the current controller unit * - * @return @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} + * @return @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} */ public @SoloControllerUnits.ControllerUnit diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java index 1ad78a13cd..bdf15953de 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.drone.autopilot.apm.solo.sololink; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; /** * Created by Fredia Huya-Kouadio on 7/10/15. diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java index 53bd915e17..d5da0c4814 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java @@ -9,19 +9,19 @@ import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; -import com.o3dr.android.client.utils.connection.TcpConnection; -import com.o3dr.android.client.utils.connection.UdpConnection; -import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproRequestState; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageShotManagerError; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.SimpleCommandListener; +import org.droidplanner.android.client.utils.connection.TcpConnection; +import org.droidplanner.android.client.utils.connection.UdpConnection; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproRequestState; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageShotManagerError; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.SimpleCommandListener; import org.droidplanner.services.android.utils.connection.SshConnection; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java index 4295cd0395..c9cd8306e1 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java @@ -21,33 +21,33 @@ import com.MAVLink.common.msg_vibration; import com.MAVLink.enums.MAV_MODE_FLAG; import com.MAVLink.enums.MAV_STATE; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.action.CapabilityActions; -import com.o3dr.services.android.lib.drone.action.ControlActions; -import com.o3dr.services.android.lib.drone.action.ExperimentalActions; -import com.o3dr.services.android.lib.drone.action.StateActions; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.mission.action.MissionActions; -import com.o3dr.services.android.lib.drone.property.Altitude; -import com.o3dr.services.android.lib.drone.property.Attitude; -import com.o3dr.services.android.lib.drone.property.Battery; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.drone.property.Gps; -import com.o3dr.services.android.lib.drone.property.Home; -import com.o3dr.services.android.lib.drone.property.Parameter; -import com.o3dr.services.android.lib.drone.property.Parameters; -import com.o3dr.services.android.lib.drone.property.Signal; -import com.o3dr.services.android.lib.drone.property.Speed; -import com.o3dr.services.android.lib.drone.property.VehicleMode; -import com.o3dr.services.android.lib.drone.property.Vibration; -import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; -import com.o3dr.services.android.lib.util.MathUtils; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.action.CapabilityActions; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; +import org.droidplanner.services.android.lib.drone.action.StateActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; +import org.droidplanner.services.android.lib.drone.property.Altitude; +import org.droidplanner.services.android.lib.drone.property.Attitude; +import org.droidplanner.services.android.lib.drone.property.Battery; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.drone.property.Home; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameters; +import org.droidplanner.services.android.lib.drone.property.Signal; +import org.droidplanner.services.android.lib.drone.property.Speed; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.services.android.lib.drone.property.Vibration; +import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.util.MathUtils; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java index 1aa348b63c..9b9251eb9a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java @@ -7,7 +7,7 @@ import com.MAVLink.common.msg_command_ack; import com.MAVLink.common.msg_command_long; import com.MAVLink.common.msg_set_mode; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; import java.util.concurrent.ConcurrentHashMap; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java index ea56e7c642..9b5ee2247a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java @@ -10,19 +10,19 @@ import com.MAVLink.ardupilotmega.msg_mag_cal_report; import com.MAVLink.common.msg_command_ack; import com.google.android.gms.location.LocationRequest; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.drone.action.GimbalActions; -import com.o3dr.services.android.lib.drone.action.StateActions; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.gcs.action.FollowMeActions; -import com.o3dr.services.android.lib.gcs.follow.FollowType; -import com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.action.GimbalActions; +import org.droidplanner.services.android.lib.drone.action.StateActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.gcs.action.FollowMeActions; +import org.droidplanner.services.android.lib.gcs.follow.FollowType; +import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.api.DroneApi; import org.droidplanner.services.android.communication.service.MAVLinkClient; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java index 414fb7aeff..06f3dc981c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java @@ -7,7 +7,7 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_param_value; -import com.o3dr.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java index 8e6c2dabe5..552d56af5e 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java @@ -11,11 +11,11 @@ import com.MAVLink.ardupilotmega.msg_camera_feedback; import com.MAVLink.ardupilotmega.msg_mount_status; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.property.Altitude; -import com.o3dr.services.android.lib.drone.property.Attitude; -import com.o3dr.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Altitude; +import org.droidplanner.services.android.lib.drone.property.Attitude; +import org.droidplanner.services.android.lib.drone.property.Gps; public class Camera extends DroneVariable { private CameraInfo camera = new CameraInfo(); diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java index 6dc640e836..e3142c4cd6 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java @@ -3,13 +3,13 @@ import android.os.Handler; import android.os.RemoteException; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.property.Altitude; -import com.o3dr.services.android.lib.drone.property.Gps; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.SimpleCommandListener; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.property.Altitude; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.SimpleCommandListener; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java index 22f42e9e61..598f2fec26 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java @@ -5,7 +5,7 @@ import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import com.MAVLink.common.msg_raw_imu; -import com.o3dr.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameter; public class Magnetometer extends DroneVariable { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java index 1d9120757b..5e6d3bfd44 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java @@ -6,9 +6,9 @@ import com.MAVLink.ardupilotmega.msg_ekf_status_report; import com.MAVLink.enums.EKF_STATUS_FLAGS; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; import org.droidplanner.services.android.core.MAVLink.WaypointManager; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java index 11b40a376a..cc867f700c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java @@ -5,8 +5,8 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_statustext; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.SimpleCommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.SimpleCommandListener; import org.droidplanner.services.android.core.MAVLink.MavLinkCalibration; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java index c71e91545a..49caeb8853 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java @@ -2,16 +2,16 @@ import android.os.Bundle; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.drone.property.Home; -import com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState; -import com.o3dr.services.android.lib.model.AbstractCommandListener; -import com.o3dr.services.android.lib.model.ICommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Home; +import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java index e19a46f9a6..c41ce3f170 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java @@ -2,9 +2,9 @@ import android.os.Handler; -import com.o3dr.services.android.lib.drone.action.ControlActions; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java index abba4c9076..3df2daaed7 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java @@ -2,7 +2,7 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java index dff589bb38..cc0fc4fb58 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java @@ -2,8 +2,8 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.util.MathUtils; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.util.MathUtils; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java index c83292cdec..b16bda87ef 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java @@ -2,8 +2,8 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java index 5c71d0f93f..e809543cd5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java @@ -2,7 +2,7 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java index 86320669c6..76dd5dc1c5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java @@ -2,9 +2,9 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Gps; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java index d79a676e92..f9ff68be57 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java @@ -2,9 +2,9 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java index 7a504557be..a84e3c0d5d 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java @@ -2,7 +2,7 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java index 7f23b8bab5..6fe4be77cb 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java @@ -2,10 +2,10 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Gps; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java index 6f59f53e21..8dfe95b6ac 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java @@ -13,9 +13,9 @@ import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.util.googleApi.GoogleApiClientManager; -import com.o3dr.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager; +import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; import org.droidplanner.services.android.core.gcs.location.Location.LocationFinder; import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java index 2d8c3255dd..75f7b52e3c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.gcs.location; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; public class Location { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java index 7b8a8b8fb3..941574beca 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java @@ -2,8 +2,8 @@ import android.os.Handler; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java index c6d19f86e1..a6022eb891 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java index 487b54e967..596744dd2a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.util.MathUtils; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.util.MathUtils; import org.droidplanner.services.android.core.helpers.units.Area; import org.droidplanner.services.android.core.polygon.Polygon; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java index 9158204156..433f08295b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; public class LineLatLong { private final LatLong start; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java index 27fe9d0cf9..d4c945888b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java index 1c7e94bb6f..de0ec9c312 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java index 249e04983a..180e0b88f7 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java index 4d90a6ea52..2ea8f9b9a9 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java index 8fb8440764..4486d61107 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java index 202ebf756f..7d42f03422 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools.spline; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java index 6dc89c5c2d..a7ade0e875 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools.spline; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java index 73eb58aa3c..a626a6794d 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java @@ -6,13 +6,13 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.property.Attitude; -import com.o3dr.services.android.lib.drone.property.Gps; -import com.o3dr.services.android.lib.drone.property.Home; -import com.o3dr.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Attitude; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.drone.property.Home; +import org.droidplanner.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.services.android.core.drone.DroneVariable; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java index 74bee68cad..fef3558061 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.mission; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java index 9a22fdd852..0fe672f604 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java @@ -3,7 +3,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemType; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java index b118f7d6d9..a09732f291 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java @@ -3,7 +3,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java index 3588ddafd0..0df20d2bd2 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java @@ -3,7 +3,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java index 3742576772..2e81e85c46 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java index bdf7e55f24..8d1d1c0ceb 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java index 0ec6a2275c..8d31511d7f 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java @@ -8,7 +8,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; public class RegionOfInterestImpl extends SpatialCoordItem { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java index 1f3e5bbb51..f0bec31b48 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java index 289ab46cb0..7d4490a45b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java @@ -2,7 +2,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java index 219e5984a8..397f1a8f29 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.core.mission.Mission; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java index 17bcc4c9e5..444da332f4 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java @@ -8,7 +8,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; public class WaypointImpl extends SpatialCoordItem { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java b/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java index fd5ff4f6a5..925b803888 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.polygon; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.Collections; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java index 43f356453c..59b73c57da 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.survey; import com.MAVLink.ardupilotmega.msg_camera_feedback; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.util.MathUtils; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.util.MathUtils; import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java index 238e0aedcc..e1498ada79 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java index 453893acd0..62c0d44a88 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java index 22ee63c62e..d73e66a092 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.helpers.geoTools.PolylineTools; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java index 7a3f8e7d37..7e1b2e45fe 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java index 816a15d94e..1bd29da518 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java b/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java index 039b3f53bc..18850b9d88 100644 --- a/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java +++ b/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java @@ -13,19 +13,16 @@ import android.widget.ListView; import android.widget.TextView; -import com.o3dr.services.android.lib.data.ServiceDataContract; +import org.droidplanner.services.android.lib.data.ServiceDataContract; import org.droidplanner.services.android.R; import org.droidplanner.services.android.utils.file.FileUtils; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.TreeMap; -import java.util.TreeSet; /** * TLog file selector activity. diff --git a/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java b/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java index 06235c6b72..8f4372514a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java +++ b/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java @@ -14,11 +14,9 @@ import android.widget.ImageView; import android.widget.TextView; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; - import org.droidplanner.services.android.R; import org.droidplanner.services.android.api.DroneApi; -import com.o3dr.services.android.lib.util.SpannableUtils; +import org.droidplanner.services.android.lib.util.SpannableUtils; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java b/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java index 49bc607c39..29e86b91e5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java @@ -1,52 +1,52 @@ package org.droidplanner.services.android.utils; -import com.o3dr.services.android.lib.drone.attribute.error.ErrorType; +import org.droidplanner.services.android.lib.drone.attribute.error.ErrorType; import org.droidplanner.services.android.core.model.AutopilotWarningParser; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import java.util.Locale; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ALTITUDE_DISPARITY; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_COMPASS_CALIBRATION_RUNNING; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_GYRO_CALIBRATION_FAILED; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_LEANING; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_MODE_NOT_ARMABLE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_ROTOR_NOT_SPINNING; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_SAFETY_SWITCH; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_BELOW_FAILSAFE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_TOO_HIGH; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.AUTO_TUNE_FAILED; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.CRASH_DISARMING; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.EKF_VARIANCE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.LOW_BATTERY; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.NO_DATAFLASH_INSERTED; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.NO_ERROR; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PARACHUTE_TOO_LOW; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACRO_BAL_ROLL_PITCH; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_BAROMETER_NOT_HEALTHY; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_ANGLE_MAX; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_BOARD_VOLTAGE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FENCE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_MAGNETIC_FIELD; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_CALIBRATED; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_HEALTHY; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_EKF_HOME_VARIANCE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GPS_GLITCH; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GYROS_NOT_HEALTHY; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_HIGH_GPS_HDOP; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_ACCELEROMETERS; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_COMPASSES; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_GYROS; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INS_NOT_CALIBRATED; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_NEED_GPS_LOCK; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_RC_NOT_CALIBRATED; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.RC_FAILSAFE; -import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.WAITING_FOR_NAVIGATION_ALIGNMENT; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ALTITUDE_DISPARITY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_COMPASS_CALIBRATION_RUNNING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_GYRO_CALIBRATION_FAILED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_LEANING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_MODE_NOT_ARMABLE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_ROTOR_NOT_SPINNING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_SAFETY_SWITCH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_BELOW_FAILSAFE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_TOO_HIGH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.AUTO_TUNE_FAILED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.CRASH_DISARMING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.EKF_VARIANCE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.LOW_BATTERY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_DATAFLASH_INSERTED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_ERROR; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PARACHUTE_TOO_LOW; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACRO_BAL_ROLL_PITCH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_BAROMETER_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_ANGLE_MAX; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_BOARD_VOLTAGE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FENCE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_MAGNETIC_FIELD; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_CALIBRATED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_EKF_HOME_VARIANCE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GPS_GLITCH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GYROS_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_HIGH_GPS_HDOP; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_ACCELEROMETERS; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_COMPASSES; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_GYROS; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INS_NOT_CALIBRATED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_NEED_GPS_LOCK; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_RC_NOT_CALIBRATED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.RC_FAILSAFE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.WAITING_FOR_NAVIGATION_ALIGNMENT; /** * Autopilot error parser. diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java index b3de4522a0..2344f70372 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java @@ -11,35 +11,35 @@ import com.MAVLink.ardupilotmega.msg_mag_cal_report; import com.MAVLink.enums.MAG_CAL_STATUS; import com.MAVLink.enums.MAV_TYPE; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress; -import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult; -import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; -import com.o3dr.services.android.lib.drone.mission.Mission; -import com.o3dr.services.android.lib.drone.mission.MissionItemType; -import com.o3dr.services.android.lib.drone.mission.item.MissionItem; -import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; -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.property.CameraProxy; -import com.o3dr.services.android.lib.drone.property.EkfStatus; -import com.o3dr.services.android.lib.drone.property.FootPrint; -import com.o3dr.services.android.lib.drone.property.Gps; -import com.o3dr.services.android.lib.drone.property.GuidedState; -import com.o3dr.services.android.lib.drone.property.Parameter; -import com.o3dr.services.android.lib.drone.property.Parameters; -import com.o3dr.services.android.lib.drone.property.State; -import com.o3dr.services.android.lib.drone.property.Type; -import com.o3dr.services.android.lib.drone.property.VehicleMode; -import com.o3dr.services.android.lib.drone.property.Vibration; -import com.o3dr.services.android.lib.gcs.follow.FollowState; -import com.o3dr.services.android.lib.gcs.follow.FollowType; -import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; -import com.o3dr.services.android.lib.model.AbstractCommandListener; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress; +import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult; +import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; +import org.droidplanner.services.android.lib.drone.mission.Mission; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; +import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; +import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; +import org.droidplanner.services.android.lib.drone.property.CameraProxy; +import org.droidplanner.services.android.lib.drone.property.EkfStatus; +import org.droidplanner.services.android.lib.drone.property.FootPrint; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.drone.property.GuidedState; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameters; +import org.droidplanner.services.android.lib.drone.property.State; +import org.droidplanner.services.android.lib.drone.property.Type; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.services.android.lib.drone.property.Vibration; +import org.droidplanner.services.android.lib.gcs.follow.FollowState; +import org.droidplanner.services.android.lib.gcs.follow.FollowType; +import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java index d69eb63456..c8768962ba 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java @@ -2,29 +2,29 @@ import android.util.Log; -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.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.CameraDetail; -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.complex.SplineSurvey; -import com.o3dr.services.android.lib.drone.mission.item.complex.SurveyDetail; -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 org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.item.command.CameraTrigger; +import org.droidplanner.services.android.lib.drone.mission.item.command.ChangeSpeed; +import org.droidplanner.services.android.lib.drone.mission.item.command.DoJump; +import org.droidplanner.services.android.lib.drone.mission.item.command.EpmGripper; +import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; +import org.droidplanner.services.android.lib.drone.mission.item.command.ReturnToLaunch; +import org.droidplanner.services.android.lib.drone.mission.item.command.SetRelay; +import org.droidplanner.services.android.lib.drone.mission.item.command.SetServo; +import org.droidplanner.services.android.lib.drone.mission.item.command.Takeoff; +import org.droidplanner.services.android.lib.drone.mission.item.command.YawCondition; +import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; +import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; +import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; +import org.droidplanner.services.android.lib.drone.mission.item.complex.SplineSurvey; +import org.droidplanner.services.android.lib.drone.mission.item.complex.SurveyDetail; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Circle; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.DoLandStart; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Land; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.SplineWaypoint; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Waypoint; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java index cb057b248d..471a5a6bf0 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java @@ -3,13 +3,13 @@ import android.os.RemoteException; import android.util.Pair; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import com.o3dr.services.android.lib.drone.companion.solo.SoloState; -import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloState; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.Drone; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java index 93e761a069..6c49179a4a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java @@ -14,7 +14,7 @@ import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.Logger; import com.google.android.gms.analytics.Tracker; -import com.o3dr.services.android.lib.drone.connection.DroneSharePrefs; +import org.droidplanner.services.android.lib.drone.connection.DroneSharePrefs; /** * Components related to google analytics logic. diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java b/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java index c1488398a5..ec91e0ce01 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java @@ -21,7 +21,7 @@ import android.text.TextUtils; import android.widget.Toast; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.utils.NetworkUtils; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java b/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java index 08de14fe4e..57f64014c1 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java @@ -11,8 +11,8 @@ import com.googlecode.mp4parser.authoring.Movie; import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; import com.googlecode.mp4parser.authoring.tracks.h264.H264TrackImpl; -import com.o3dr.android.client.utils.video.MediaCodecManager; -import com.o3dr.android.client.utils.video.NaluChunk; +import org.droidplanner.android.client.utils.video.MediaCodecManager; +import org.droidplanner.android.client.utils.video.NaluChunk; import java.io.BufferedOutputStream; import java.io.File; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java b/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java index 7856e71329..1129ae9bf7 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java @@ -8,14 +8,14 @@ import android.util.Log; import android.view.Surface; -import com.o3dr.android.client.utils.connection.AbstractIpConnection; -import com.o3dr.android.client.utils.connection.IpConnectionListener; -import com.o3dr.android.client.utils.connection.UdpConnection; -import com.o3dr.android.client.utils.video.DecoderListener; -import com.o3dr.android.client.utils.video.MediaCodecManager; -import com.o3dr.services.android.lib.drone.action.CameraActions; -import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.android.client.utils.connection.AbstractIpConnection; +import org.droidplanner.android.client.utils.connection.IpConnectionListener; +import org.droidplanner.android.client.utils.connection.UdpConnection; +import org.droidplanner.android.client.utils.video.DecoderListener; +import org.droidplanner.android.client.utils.video.MediaCodecManager; +import org.droidplanner.services.android.lib.drone.action.CameraActions; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.model.ICommandListener; import java.io.IOException; import java.nio.ByteBuffer; diff --git a/ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java b/ServiceApp/test/java/org/droidplanner/android/client/apis/ControlApiTest.java similarity index 88% rename from ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java rename to ServiceApp/test/java/org/droidplanner/android/client/apis/ControlApiTest.java index c2cb9ada0f..16a2819975 100644 --- a/ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java +++ b/ServiceApp/test/java/org/droidplanner/android/client/apis/ControlApiTest.java @@ -1,11 +1,11 @@ -package com.o3dr.android.client.apis; +package org.droidplanner.android.client.apis; import android.content.Context; import android.os.Bundle; import android.util.SparseArray; -import com.o3dr.services.android.lib.model.AbstractCommandListener; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.mock.MockDrone; import org.junit.Assert; @@ -15,10 +15,10 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; -import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_SET_VELOCITY; -import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_X; -import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Y; -import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Z; +import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_SET_VELOCITY; +import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_X; +import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Y; +import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Z; /** * Created by Fredia Huya-Kouadio on 10/23/15. diff --git a/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java b/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java index cc6a50e20a..856f1f2cfb 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java @@ -8,8 +8,8 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_command_long; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java index 392967e3ab..4a2e3498e5 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java index d8c25059ac..6bcdd02841 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java index 5cde695c93..6891ffc64a 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java index 41cd080e82..8407fb5344 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java index dc2c54593e..6984be96e4 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java @@ -2,7 +2,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_FRAME; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java index 12c3e955be..d54a00e0e6 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java @@ -2,7 +2,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java index a5621dbb3a..e245e6e1d6 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.survey; import com.MAVLink.ardupilotmega.msg_camera_feedback; -import com.o3dr.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java b/ServiceApp/test/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java similarity index 99% rename from ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java rename to ServiceApp/test/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java index 9481db292c..91475c3ccf 100644 --- a/ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java @@ -1,4 +1,4 @@ -package com.o3dr.services.android.lib.drone.companion.solo.tlv; +package org.droidplanner.services.android.lib.drone.companion.solo.tlv; import com.MAVLink.enums.GOPRO_COMMAND; diff --git a/ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java b/ServiceApp/test/java/org/droidplanner/services/android/lib/util/MathUtilsTest.java similarity index 96% rename from ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java rename to ServiceApp/test/java/org/droidplanner/services/android/lib/util/MathUtilsTest.java index 162db05696..f7d1601e7b 100644 --- a/ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/lib/util/MathUtilsTest.java @@ -1,7 +1,7 @@ -package com.o3dr.services.android.lib.util; +package org.droidplanner.services.android.lib.util; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java index 7e03e2dd93..7d83771780 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java @@ -3,11 +3,9 @@ import android.content.Context; import android.os.Parcelable; -import com.o3dr.android.client.Drone; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.property.Attitude; -import com.o3dr.services.android.lib.drone.property.DroneAttribute; -import com.o3dr.services.android.lib.model.action.Action; +import org.droidplanner.android.client.Drone; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.model.action.Action; import java.util.HashMap; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java index 8373e3182b..351acdde12 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java @@ -4,8 +4,8 @@ import com.MAVLink.MAVLinkPacket; import com.MAVLink.Messages.MAVLinkMessage; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.communication.service.MAVLinkClient; diff --git a/samples/StarterApp/src/androidTest/java/com/o3dr/hellodrone/ApplicationTest.java b/samples/StarterApp/src/androidTest/java/org/droidplanner/hellodrone/ApplicationTest.java similarity index 87% rename from samples/StarterApp/src/androidTest/java/com/o3dr/hellodrone/ApplicationTest.java rename to samples/StarterApp/src/androidTest/java/org/droidplanner/hellodrone/ApplicationTest.java index c7f0b9e3c8..361f687a0e 100644 --- a/samples/StarterApp/src/androidTest/java/com/o3dr/hellodrone/ApplicationTest.java +++ b/samples/StarterApp/src/androidTest/java/org/droidplanner/hellodrone/ApplicationTest.java @@ -1,4 +1,4 @@ -package com.o3dr.sample.hellodrone; +package org.droidplanner.sample.hellodrone; import android.app.Application; import android.test.ApplicationTestCase; diff --git a/samples/StarterApp/src/main/AndroidManifest.xml b/samples/StarterApp/src/main/AndroidManifest.xml index f303613986..9c5448f7db 100644 --- a/samples/StarterApp/src/main/AndroidManifest.xml +++ b/samples/StarterApp/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="org.droidplanner.sample.hellodrone" > diff --git a/samples/StarterApp/src/main/java/com/o3dr/sample/hellodrone/MainActivity.java b/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/MainActivity.java similarity index 92% rename from samples/StarterApp/src/main/java/com/o3dr/sample/hellodrone/MainActivity.java rename to samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/MainActivity.java index 738506e70a..95f8241405 100644 --- a/samples/StarterApp/src/main/java/com/o3dr/sample/hellodrone/MainActivity.java +++ b/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/MainActivity.java @@ -1,4 +1,4 @@ -package com.o3dr.sample.hellodrone; +package org.droidplanner.sample.hellodrone; import android.content.Context; import android.graphics.SurfaceTexture; @@ -17,39 +17,39 @@ import android.widget.TextView; import android.widget.Toast; -import com.o3dr.android.client.ControlTower; -import com.o3dr.android.client.Drone; -import com.o3dr.android.client.apis.ControlApi; -import com.o3dr.android.client.apis.ExperimentalApi; -import com.o3dr.android.client.apis.solo.SoloCameraApi; -import com.o3dr.android.client.apis.VehicleApi; -import com.o3dr.android.client.interfaces.DroneListener; -import com.o3dr.android.client.interfaces.TowerListener; -import com.o3dr.android.client.utils.video.DecoderListener; -import com.o3dr.android.client.utils.video.MediaCodecManager; -import com.o3dr.services.android.lib.coordinate.LatLong; -import com.o3dr.services.android.lib.coordinate.LatLongAlt; -import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; -import com.o3dr.services.android.lib.drone.attribute.AttributeType; -import com.o3dr.services.android.lib.drone.companion.solo.SoloAttributes; -import com.o3dr.services.android.lib.drone.companion.solo.SoloState; -import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; -import com.o3dr.services.android.lib.drone.connection.ConnectionResult; -import com.o3dr.services.android.lib.drone.connection.ConnectionType; -import com.o3dr.services.android.lib.drone.property.Altitude; -import com.o3dr.services.android.lib.drone.property.Gps; -import com.o3dr.services.android.lib.drone.property.Home; -import com.o3dr.services.android.lib.drone.property.Speed; -import com.o3dr.services.android.lib.drone.property.State; -import com.o3dr.services.android.lib.drone.property.Type; -import com.o3dr.services.android.lib.drone.property.VehicleMode; -import com.o3dr.services.android.lib.model.AbstractCommandListener; -import com.o3dr.services.android.lib.model.SimpleCommandListener; +import org.droidplanner.android.client.ControlTower; +import org.droidplanner.android.client.Drone; +import org.droidplanner.android.client.apis.ControlApi; +import org.droidplanner.android.client.apis.ExperimentalApi; +import org.droidplanner.android.client.apis.solo.SoloCameraApi; +import org.droidplanner.android.client.apis.VehicleApi; +import org.droidplanner.android.client.interfaces.DroneListener; +import org.droidplanner.android.client.interfaces.TowerListener; +import org.droidplanner.android.client.utils.video.DecoderListener; +import org.droidplanner.android.client.utils.video.MediaCodecManager; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloAttributes; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloState; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; +import org.droidplanner.services.android.lib.drone.connection.ConnectionType; +import org.droidplanner.services.android.lib.drone.property.Altitude; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.drone.property.Home; +import org.droidplanner.services.android.lib.drone.property.Speed; +import org.droidplanner.services.android.lib.drone.property.State; +import org.droidplanner.services.android.lib.drone.property.Type; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.SimpleCommandListener; import java.io.IOException; import java.util.List; -import static com.o3dr.android.client.apis.ExperimentalApi.*; +import static org.droidplanner.android.client.apis.ExperimentalApi.*; public class MainActivity extends AppCompatActivity implements DroneListener, TowerListener { private static final String TAG = MainActivity.class.getSimpleName(); diff --git a/samples/StarterApp/src/main/java/com/o3dr/sample/hellodrone/video/VideoStreamActivity.java b/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/video/VideoStreamActivity.java similarity index 79% rename from samples/StarterApp/src/main/java/com/o3dr/sample/hellodrone/video/VideoStreamActivity.java rename to samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/video/VideoStreamActivity.java index 839557aed1..a848ad158c 100644 --- a/samples/StarterApp/src/main/java/com/o3dr/sample/hellodrone/video/VideoStreamActivity.java +++ b/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/video/VideoStreamActivity.java @@ -1,9 +1,9 @@ -package com.o3dr.sample.hellodrone.video; +package org.droidplanner.sample.hellodrone.video; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import com.o3dr.sample.hellodrone.R; +import org.droidplanner.sample.hellodrone.R; /** * Created by Fredia Huya-Kouadio on 10/10/15. From 6d95282d5c52e0e5280277c5703496a504f0c131 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 9 May 2016 13:30:44 -0700 Subject: [PATCH 003/113] Start fixing path issues --- ClientLib/build.gradle | 2 + ClientLib/src/main/AndroidManifest.xml | 31 + .../services/android/impl/api/DPServices.java | 82 ++ .../android/impl/api/DroidPlannerService.java | 288 +++++ .../android/impl/api/DroneAccess.java | 22 + .../services/android/impl/api/DroneApi.java | 759 +++++++++++++ .../connection/AndroidIpConnection.java | 45 + .../connection/AndroidMavLinkConnection.java | 21 + .../connection/AndroidTcpConnection.java | 86 ++ .../connection/AndroidUdpConnection.java | 161 +++ .../connection/BluetoothConnection.java | 154 +++ .../connection/SoloConnection.java | 206 ++++ .../connection/usb/UsbCDCConnection.java | 219 ++++ .../connection/usb/UsbConnection.java | 157 +++ .../connection/usb/UsbFTDIConnection.java | 132 +++ .../impl/communication/model/DataLink.java | 26 + .../communication/service/MAVLinkClient.java | 315 +++++ .../impl/core/MAVLink/MavLinkCalibration.java | 112 ++ .../impl/core/MAVLink/MavLinkCommands.java | 231 ++++ .../impl/core/MAVLink/MavLinkMsgHandler.java | 80 ++ .../impl/core/MAVLink/MavLinkParameters.java | 48 + .../android/impl/core/MAVLink/MavLinkRC.java | 22 + .../impl/core/MAVLink/MavLinkStreamRates.java | 41 + .../impl/core/MAVLink/MavLinkWaypoint.java | 54 + .../impl/core/MAVLink/WaypointManager.java | 340 ++++++ .../MAVLink/command/doCmd/MavLinkDoCmds.java | 160 +++ .../MAVLink/connection/MavLinkConnection.java | 506 +++++++++ .../connection/MavLinkConnectionListener.java | 25 + .../connection/MavLinkConnectionTypes.java | 50 + .../MAVLink/connection/TcpConnection.java | 72 ++ .../MAVLink/connection/UdpConnection.java | 107 ++ .../android/impl/core/drone/DroneEvents.java | 73 ++ .../impl/core/drone/DroneInterfaces.java | 224 ++++ .../android/impl/core/drone/DroneManager.java | 349 ++++++ .../impl/core/drone/DroneVariable.java | 78 ++ .../impl/core/drone/LogMessageListener.java | 9 + .../android/impl/core/drone/Preferences.java | 12 + .../impl/core/drone/autopilot/Drone.java | 35 + .../core/drone/autopilot/MavLinkDrone.java | 62 + .../drone/autopilot/apm/APMConstants.java | 27 + .../core/drone/autopilot/apm/ArduCopter.java | 162 +++ .../core/drone/autopilot/apm/ArduPilot.java | 603 ++++++++++ .../core/drone/autopilot/apm/ArduPlane.java | 65 ++ .../core/drone/autopilot/apm/ArduRover.java | 35 + .../apm/solo/AbstractLinkManager.java | 206 ++++ .../drone/autopilot/apm/solo/ArduSolo.java | 425 +++++++ .../drone/autopilot/apm/solo/SoloComp.java | 436 +++++++ .../controller/ControllerLinkListener.java | 24 + .../controller/ControllerLinkManager.java | 643 +++++++++++ .../apm/solo/sololink/SoloLinkListener.java | 15 + .../apm/solo/sololink/SoloLinkManager.java | 379 ++++++ .../autopilot/apm/variables/APMHeartBeat.java | 51 + .../generic/GenericMavLinkDrone.java | 885 +++++++++++++++ .../core/drone/autopilot/px4/Px4Native.java | 28 + .../drone/manager/DroneCommandTracker.java | 176 +++ .../drone/manager/MavLinkDroneManager.java | 362 ++++++ .../core/drone/profiles/ParameterManager.java | 268 +++++ .../drone/profiles/ParameterMetadata.java | 64 ++ .../core/drone/profiles/VehicleProfile.java | 43 + .../impl/core/drone/variables/ApmModes.java | 131 +++ .../impl/core/drone/variables/Camera.java | 65 ++ .../core/drone/variables/GuidedPoint.java | 372 ++++++ .../impl/core/drone/variables/HeartBeat.java | 141 +++ .../core/drone/variables/Magnetometer.java | 53 + .../core/drone/variables/MissionStats.java | 46 + .../android/impl/core/drone/variables/RC.java | 42 + .../impl/core/drone/variables/State.java | 228 ++++ .../core/drone/variables/StreamRates.java | 69 ++ .../impl/core/drone/variables/Type.java | 74 ++ .../calibration/AccelCalibration.java | 153 +++ .../MagnetometerCalibrationImpl.java | 126 ++ .../impl/core/firmware/FirmwareType.java | 48 + .../android/impl/core/gcs/GCSHeartbeat.java | 73 ++ .../android/impl/core/gcs/ReturnToMe.java | 210 ++++ .../android/impl/core/gcs/follow/Follow.java | 164 +++ .../impl/core/gcs/follow/FollowAbove.java | 30 + .../impl/core/gcs/follow/FollowAlgorithm.java | 128 +++ .../impl/core/gcs/follow/FollowCircle.java | 35 + .../core/gcs/follow/FollowGuidedScan.java | 99 ++ .../core/gcs/follow/FollowHeadingAngle.java | 32 + .../impl/core/gcs/follow/FollowLead.java | 18 + .../impl/core/gcs/follow/FollowLeash.java | 41 + .../impl/core/gcs/follow/FollowLeft.java | 18 + .../impl/core/gcs/follow/FollowLookAtMe.java | 24 + .../impl/core/gcs/follow/FollowRight.java | 18 + .../impl/core/gcs/follow/FollowSoloShot.java | 101 ++ .../core/gcs/follow/FollowSplineAbove.java | 39 + .../core/gcs/follow/FollowSplineLeash.java | 50 + .../gcs/follow/FollowWithRadiusAlgorithm.java | 42 + .../impl/core/gcs/location/FusedLocation.java | 226 ++++ .../impl/core/gcs/location/Location.java | 62 + .../android/impl/core/gcs/package-info.java | 4 + .../impl/core/gcs/roi/ROIEstimator.java | 105 ++ .../core/helpers/coordinates/CoordBounds.java | 54 + .../impl/core/helpers/geoTools/GeoTools.java | 220 ++++ .../core/helpers/geoTools/LineLatLong.java | 59 + .../core/helpers/geoTools/LineSampler.java | 58 + .../impl/core/helpers/geoTools/LineTools.java | 79 ++ .../core/helpers/geoTools/PointTools.java | 123 ++ .../core/helpers/geoTools/PolylineTools.java | 28 + .../impl/core/helpers/geoTools/Simplify.java | 47 + .../core/helpers/geoTools/spline/Spline.java | 47 + .../helpers/geoTools/spline/SplinePath.java | 55 + .../android/impl/core/helpers/units/Area.java | 35 + .../android/impl/core/mission/Mission.java | 434 +++++++ .../impl/core/mission/MissionItemImpl.java | 54 + .../impl/core/mission/MissionItemType.java | 97 ++ .../mission/commands/CameraTriggerImpl.java | 55 + .../mission/commands/ChangeSpeedImpl.java | 64 ++ .../mission/commands/ConditionYawImpl.java | 82 ++ .../core/mission/commands/DoJumpImpl.java | 74 ++ .../core/mission/commands/EpmGripperImpl.java | 61 + .../core/mission/commands/MissionCMD.java | 25 + .../mission/commands/ReturnToHomeImpl.java | 60 + .../core/mission/commands/SetRelayImpl.java | 64 ++ .../core/mission/commands/SetServoImpl.java | 71 ++ .../core/mission/commands/TakeoffImpl.java | 79 ++ .../core/mission/survey/SplineSurveyImpl.java | 40 + .../impl/core/mission/survey/SurveyImpl.java | 129 +++ .../core/mission/waypoints/CircleImpl.java | 81 ++ .../mission/waypoints/DoLandStartImpl.java | 53 + .../impl/core/mission/waypoints/LandImpl.java | 53 + .../waypoints/RegionOfInterestImpl.java | 53 + .../mission/waypoints/SpatialCoordItem.java | 61 + .../mission/waypoints/SplineWaypointImpl.java | 64 ++ .../waypoints/StructureScannerImpl.java | 166 +++ .../core/mission/waypoints/WaypointImpl.java | 101 ++ .../core/model/AutopilotWarningParser.java | 13 + .../android/impl/core/model/Logger.java | 25 + .../android/impl/core/polygon/Polygon.java | 76 ++ .../services/android/impl/core/srtm/Srtm.java | 48 + .../android/impl/core/srtm/SrtmData.java | 89 ++ .../impl/core/srtm/SrtmDownloader.java | 97 ++ .../android/impl/core/srtm/SrtmRegions.java | 76 ++ .../android/impl/core/srtm/UnZip.java | 32 + .../android/impl/core/survey/CameraInfo.java | 37 + .../android/impl/core/survey/Footprint.java | 74 ++ .../android/impl/core/survey/SurveyData.java | 96 ++ .../core/survey/grid/CircumscribedGrid.java | 60 + .../impl/core/survey/grid/EndpointSorter.java | 70 ++ .../android/impl/core/survey/grid/Grid.java | 33 + .../impl/core/survey/grid/GridBuilder.java | 53 + .../impl/core/survey/grid/Trimmer.java | 49 + .../android/impl/data/SessionContract.java | 49 + .../services/android/impl/data/SessionDB.java | 72 ++ .../impl/data/provider/FileProvider.java | 756 ++++++++++++ .../data/provider/ServiceDataProvider.java | 47 + .../impl/exception/ConnectionException.java | 10 + .../impl/ui/activity/TLogFileSelector.java | 120 ++ .../impl/ui/activity/UsbIntentReceiver.java | 30 + .../impl/utils/AndroidApWarningParser.java | 209 ++++ .../android/impl/utils/AndroidLogger.java | 84 ++ .../android/impl/utils/CommonApiUtils.java | 1011 +++++++++++++++++ .../android/impl/utils/LogToFileTree.java | 140 +++ .../android/impl/utils/NetworkUtils.java | 50 + .../android/impl/utils/ProxyUtils.java | 557 +++++++++ .../android/impl/utils/SoloApiUtils.java | 117 ++ .../android/impl/utils/TextUtils.java | 98 ++ .../services/android/impl/utils/Utils.java | 11 + .../android/impl/utils/analytics/GAUtils.java | 133 +++ .../impl/utils/apps/AppsUpdateReceiver.java | 20 + .../impl/utils/connection/SshConnection.java | 370 ++++++ .../connection/WifiConnectionHandler.java | 494 ++++++++ .../android/impl/utils/file/AssetUtil.java | 17 + .../impl/utils/file/DirectoryPath.java | 66 ++ .../android/impl/utils/file/FileUtils.java | 80 ++ .../impl/utils/file/IO/CameraInfoLoader.java | 92 ++ .../impl/utils/file/IO/CameraInfoReader.java | 117 ++ .../impl/utils/file/IO/ExceptionWriter.java | 28 + .../file/IO/ParameterMetadataLoader.java | 113 ++ .../utils/file/IO/VehicleProfileReader.java | 142 +++ .../impl/utils/prefs/DroidPlannerPrefs.java | 50 + .../impl/utils/video/StreamRecorder.java | 221 ++++ .../impl/utils/video/VideoManager.java | 514 +++++++++ .../utils/video/file/DecodeH264FromFile.java | 13 + 175 files changed, 22945 insertions(+) create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneAccess.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbFTDIConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionTypes.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/TcpConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/UdpConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/LogMessageListener.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/APMConstants.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterMetadata.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/VehicleProfile.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/ApmModes.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/firmware/FirmwareType.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/package-info.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/units/Area.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/Logger.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/Srtm.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/UnZip.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/CameraInfo.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionContract.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/FileProvider.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/ServiceDataProvider.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/exception/ConnectionException.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/TextUtils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/Utils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/SshConnection.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/AssetUtil.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/DirectoryPath.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/FileUtils.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java create mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/file/DecodeH264FromFile.java diff --git a/ClientLib/build.gradle b/ClientLib/build.gradle index 00cc71f216..1f08c24cbb 100644 --- a/ClientLib/build.gradle +++ b/ClientLib/build.gradle @@ -55,7 +55,9 @@ android { } dependencies { + compile 'com.jakewharton.timber:timber:3.1.0' compile "com.android.support:support-v4:${support_lib_version}" + compile "com.android.support:appcompat-v7:${support_lib_version}" compile "com.google.android.gms:play-services-base:${play_services_version}" debugCompile project(':Mavlink') diff --git a/ClientLib/src/main/AndroidManifest.xml b/ClientLib/src/main/AndroidManifest.xml index 370bb1b492..af959311c2 100644 --- a/ClientLib/src/main/AndroidManifest.xml +++ b/ClientLib/src/main/AndroidManifest.xml @@ -3,6 +3,37 @@ + + + + + + + + + + + + + + + + + + + + + appsInfo = new ArrayList<>(); + for(DroneApi droneApi : serviceRef.droneApiStore.values()){ + if(droneApi.isConnected()){ + DroneManager droneManager = droneApi.getDroneManager(); + if(droneManager != null) { + final ConnectionParameter droneParams = droneApi.getDroneManager().getConnectionParameter(); + final ConnectionParameter sanitizedParams = new ConnectionParameter(droneParams.getConnectionType(), + droneParams.getParamsBundle(), null); + + Bundle info = new Bundle(); + info.putString(GCSEvent.EXTRA_APP_ID, droneApi.getOwnerId()); + info.putParcelable(GCSEvent.EXTRA_VEHICLE_CONNECTION_PARAMETER, sanitizedParams); + + appsInfo.add(info); + } + } + } + + return appsInfo.toArray(new Bundle[appsInfo.size()]); + } + + @Override + public void releaseDroneApi(IDroneApi dpApi) throws RemoteException { + Log.d(TAG, "Releasing acquired drone api handle."); + if(dpApi instanceof DroneApi) { + serviceRef.releaseDroneApi(((DroneApi) dpApi).getOwnerId()); + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java new file mode 100644 index 0000000000..87c9a17d62 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java @@ -0,0 +1,288 @@ +package org.droidplanner.services.android.impl.api; + +import android.annotation.SuppressLint; +import android.app.Notification; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.support.v4.app.NotificationCompat; +import android.support.v4.content.LocalBroadcastManager; +import android.text.TextUtils; + +import org.droidplanner.android.client.R; +import org.droidplanner.services.android.impl.core.drone.DroneManager; +import org.droidplanner.services.android.impl.utils.Utils; +import org.droidplanner.services.android.impl.utils.file.IO.CameraInfoLoader; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; +import org.droidplanner.services.android.lib.model.IApiListener; +import org.droidplanner.services.android.lib.model.IDroidPlannerServices; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import timber.log.Timber; + +/** + * 3DR Services background service implementation. + */ +public class DroidPlannerService extends Service { + + private static final String TAG = DroidPlannerService.class.getName(); + + /** + * Status bar notification id + */ + private static final int FOREGROUND_ID = 101; + + /** + * Set of actions to notify the local app's components of the service events. + */ + public static final String ACTION_DRONE_CREATED = Utils.PACKAGE_NAME + ".ACTION_DRONE_CREATED"; + public static final String ACTION_DRONE_DESTROYED = Utils.PACKAGE_NAME + ".ACTION_DRONE_DESTROYED"; + public static final String ACTION_RELEASE_API_INSTANCE = Utils.PACKAGE_NAME + ".action.RELEASE_API_INSTANCE"; + public static final String EXTRA_API_INSTANCE_APP_ID = "extra_api_instance_app_id"; + + /** + * Used to broadcast service events. + */ + private LocalBroadcastManager lbm; + + /** + * Stores drone api instances per connected client. The client are denoted by their app id. + */ + final ConcurrentHashMap droneApiStore = new ConcurrentHashMap<>(); + + /** + * Caches drone managers per connection type. + */ + final ConcurrentHashMap droneManagers = new ConcurrentHashMap<>(); + + private DPServices dpServices; + private DroneAccess droneAccess; + + private CameraInfoLoader cameraInfoLoader; + private List cachedCameraDetails; + + /** + * Generate a drone api instance for the client denoted by the given app id. + * + * @param listener Used to retrieve api information. + * @param appId Application id of the connecting client. + * @return a IDroneApi instance + */ + DroneApi registerDroneApi(IApiListener listener, String appId) { + if (listener == null) + return null; + + DroneApi droneApi = new DroneApi(this, listener, appId); + droneApiStore.put(appId, droneApi); + lbm.sendBroadcast(new Intent(ACTION_DRONE_CREATED)); + updateForegroundNotification(); + return droneApi; + } + + /** + * Release the drone api instance attached to the given app id. + * + * @param appId Application id of the disconnecting client. + */ + void releaseDroneApi(String appId) { + if (appId == null) + return; + + DroneApi droneApi = droneApiStore.remove(appId); + if (droneApi != null) { + Timber.d("Releasing drone api instance for " + appId); + droneApi.destroy(); + lbm.sendBroadcast(new Intent(ACTION_DRONE_DESTROYED)); + updateForegroundNotification(); + } + } + + /** + * Establish a connection with a vehicle using the given connection parameter. + * + * @param connParams Parameters used to connect to the vehicle. + * @param appId Application id of the connecting client. + * @param listener Callback to receive drone events. + * @return A DroneManager instance which acts as router between the connected vehicle and the listeneing client(s). + */ + DroneManager connectDroneManager(ConnectionParameter connParams, String appId, DroneApi listener) { + if (connParams == null || TextUtils.isEmpty(appId) || listener == null) + return null; + + DroneManager droneMgr = droneManagers.get(connParams); + if (droneMgr == null) { + final DroneManager temp = DroneManager.generateDroneManager(getApplicationContext(), connParams, new Handler(Looper.getMainLooper())); + + droneMgr = droneManagers.putIfAbsent(connParams, temp); + if(droneMgr == null){ + Timber.d("Generating new drone manager."); + droneMgr = temp; + } + else{ + temp.destroy(); + } + } + + Timber.d("Drone manager connection for " + appId); + droneMgr.connect(appId, listener); + return droneMgr; + } + + /** + * Disconnect the given client from the vehicle managed by the given drone manager. + * + * @param droneMgr Handler for the connected vehicle. + * @param clientInfo Info of the disconnecting client. + */ + void disconnectDroneManager(DroneManager droneMgr, DroneApi.ClientInfo clientInfo) { + if (droneMgr == null || clientInfo == null || TextUtils.isEmpty(clientInfo.appId)) + return; + + String appId = clientInfo.appId; + Timber.d("Drone manager disconnection for " + appId); + droneMgr.disconnect(clientInfo); + if (droneMgr.getConnectedAppsCount() == 0) { + Timber.d("Destroying drone manager."); + droneMgr.destroy(); + droneManagers.remove(droneMgr.getConnectionParameter()); + } + } + + /** + * Retrieves the set of camera info provided by the app. + * + * @return a list of {@link CameraDetail} objects. + */ + synchronized List getCameraDetails() { + if (cachedCameraDetails == null) { + List cameraInfoNames = cameraInfoLoader.getCameraInfoList(); + + List cameraInfos = new ArrayList<>(cameraInfoNames.size()); + for (String infoName : cameraInfoNames) { + try { + cameraInfos.add(cameraInfoLoader.openFile(infoName)); + } catch (Exception e) { + Timber.e(e, e.getMessage()); + } + } + + List cameraDetails = new ArrayList<>(cameraInfos.size()); + for (CameraInfo camInfo : cameraInfos) { + cameraDetails.add(new CameraDetail(camInfo.name, camInfo.sensorWidth, + camInfo.sensorHeight, camInfo.sensorResolution, camInfo.focalLength, + camInfo.overlap, camInfo.sidelap, camInfo.isInLandscapeOrientation)); + } + + cachedCameraDetails = cameraDetails; + } + + return cachedCameraDetails; + } + + @Override + public IBinder onBind(Intent intent) { + Timber.d("Binding intent: " + intent); + final String action = intent.getAction(); + if (IDroidPlannerServices.class.getName().equals(action)) { + // Return binder to ipc client-server interaction. + return dpServices; + } else { + // Return binder to the service. + return droneAccess; + } + } + + @SuppressLint("NewApi") + @Override + public void onCreate() { + super.onCreate(); + + final DroidPlannerServicesApp dpApp = (DroidPlannerServicesApp) getApplication(); + dpApp.createFileStartLogging(); + + Timber.d("Creating 3DR Services."); + + final Context context = getApplicationContext(); + + droneAccess = new DroneAccess(this); + dpServices = new DPServices(this); + lbm = LocalBroadcastManager.getInstance(context); + this.cameraInfoLoader = new CameraInfoLoader(context); + + updateForegroundNotification(); + } + + @SuppressLint("NewApi") + private void updateForegroundNotification() { + final Context context = getApplicationContext(); + + //Put the service in the foreground + final NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(context) + .setContentTitle("3DR Services") + .setPriority(NotificationCompat.PRIORITY_MIN) + .setSmallIcon(R.drawable.ic_stat_notify) + .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, + MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0)); + + final int connectedCount = droneApiStore.size(); + if (connectedCount > 0) { + if (connectedCount == 1) { + notifBuilder.setContentText("1 connected app"); + } else { + notifBuilder.setContentText(connectedCount + " connected apps"); + } + } + + final Notification notification = notifBuilder.build(); + startForeground(FOREGROUND_ID, notification); + } + + @Override + public void onDestroy() { + super.onDestroy(); + Timber.d("Destroying 3DR Services."); + + for (DroneApi droneApi : droneApiStore.values()) { + droneApi.destroy(); + } + droneApiStore.clear(); + + for (DroneManager droneMgr : droneManagers.values()) { + droneMgr.destroy(); + } + droneManagers.clear(); + + dpServices.destroy(); + + stopForeground(true); + + final DroidPlannerServicesApp dpApp = (DroidPlannerServicesApp) getApplication(); + dpApp.closeLogFile(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null) { + final String action = intent.getAction(); + switch (action) { + + case ACTION_RELEASE_API_INSTANCE: + final String appId = intent.getStringExtra(EXTRA_API_INSTANCE_APP_ID); + releaseDroneApi(appId); + break; + } + } + + stopSelf(); + return START_NOT_STICKY; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneAccess.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneAccess.java new file mode 100644 index 0000000000..520b2390d5 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneAccess.java @@ -0,0 +1,22 @@ +package org.droidplanner.services.android.impl.api; + +import android.os.Binder; + +import java.util.ArrayList; +import java.util.List; + +/** +* Created by fhuya on 11/3/14. +*/ +public final class DroneAccess extends Binder { + + private final DroidPlannerService serviceRef; + + DroneAccess(DroidPlannerService service) { + serviceRef = service; + } + + public List getDroneApiList() { + return new ArrayList<>(serviceRef.droneApiStore.values()); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java new file mode 100644 index 0000000000..4aa56aee96 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java @@ -0,0 +1,759 @@ +package org.droidplanner.services.android.impl.api; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.text.TextUtils; +import android.util.Pair; +import android.view.Surface; + +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.communication.connection.SoloConnection; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.DroneManager; +import org.droidplanner.services.android.core.drone.autopilot.Drone; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.exception.ConnectionException; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.action.CameraActions; +import org.droidplanner.services.android.lib.drone.action.ConnectionActions; +import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; +import org.droidplanner.services.android.lib.drone.mission.Mission; +import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.State; +import org.droidplanner.services.android.lib.gcs.event.GCSEvent; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.link.LinkEvent; +import org.droidplanner.services.android.lib.gcs.link.LinkEventExtra; +import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; +import org.droidplanner.services.android.lib.model.IApiListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.IDroneApi; +import org.droidplanner.services.android.lib.model.IMavlinkObserver; +import org.droidplanner.services.android.lib.model.IObserver; +import org.droidplanner.services.android.lib.model.action.Action; +import org.droidplanner.services.android.utils.CommonApiUtils; +import org.droidplanner.services.android.utils.video.VideoManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.concurrent.ConcurrentLinkedQueue; + +import timber.log.Timber; + +/** + * Implementation for the IDroneApi interface. + */ +public final class DroneApi extends IDroneApi.Stub implements DroneInterfaces.OnDroneListener, DroneInterfaces.AttributeEventListener, + DroneInterfaces.OnParameterManagerListener, MagnetometerCalibrationImpl.OnMagnetometerCalibrationListener, IBinder.DeathRecipient { + + //The Reset ROI mission item was introduced in version 2.6.8. Any client library older than this do not support it. + private final static int RESET_ROI_LIB_VERSION = 206080; + + private final Context context; + + private final ConcurrentLinkedQueue observersList; + private final ConcurrentLinkedQueue mavlinkObserversList; + private DroneManager droneMgr; + private final IApiListener apiListener; + + private final String ownerId; + private final ClientInfo clientInfo; + + private final DroidPlannerService service; + + private ConnectionParameter connectionParams; + + DroneApi(DroidPlannerService dpService, IApiListener listener, String ownerId) { + + this.service = dpService; + this.context = dpService.getApplicationContext(); + + this.ownerId = ownerId; + + observersList = new ConcurrentLinkedQueue<>(); + mavlinkObserversList = new ConcurrentLinkedQueue<>(); + + this.apiListener = listener; + int apiVersionCode = -1; + int clientVersionCode = -1; + try { + this.apiListener.asBinder().linkToDeath(this, 0); + checkForSelfRelease(); + + apiVersionCode = apiListener.getApiVersionCode(); + clientVersionCode = apiListener.getClientVersionCode(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + dpService.releaseDroneApi(this.ownerId); + } + + this.clientInfo = new ClientInfo(this.ownerId, apiVersionCode, clientVersionCode); + } + + void destroy() { + Timber.d("Destroying drone api instance for %s", this.ownerId); + this.observersList.clear(); + this.mavlinkObserversList.clear(); + + try { + this.apiListener.asBinder().unlinkToDeath(this, 0); + } catch (NoSuchElementException e) { + Timber.e(e, e.getMessage()); + } + + this.service.disconnectDroneManager(this.droneMgr, this.clientInfo); + } + + public String getOwnerId() { + return ownerId; + } + + public DroneManager getDroneManager() { + return this.droneMgr; + } + + private Drone getDrone() { + if (this.droneMgr == null) { + return null; + } + + return this.droneMgr.getDrone(); + } + + @Override + public Bundle getAttribute(String type) throws RemoteException { + Bundle carrier = new Bundle(); + + switch (type) { + case AttributeType.CAMERA: + carrier.putParcelable(type, CommonApiUtils.getCameraProxy(getDrone(), service.getCameraDetails())); + break; + + default: + if (droneMgr != null) { + DroneAttribute attribute = droneMgr.getAttribute(clientInfo, type); + if (attribute != null) { + + //Check if the client supports the ResetROI mission item. + // Replace it with a RegionOfInterest with coordinate set to 0 if it doesn't. + if (clientInfo.clientVersionCode < RESET_ROI_LIB_VERSION && attribute instanceof Mission) { + Mission proxyMission = (Mission) attribute; + List missionItems = proxyMission.getMissionItems(); + int missionItemsCount = missionItems.size(); + for (int i = 0; i < missionItemsCount; i++) { + MissionItem missionItem = missionItems.get(i); + if (missionItem instanceof ResetROI) { + missionItems.remove(i); + + RegionOfInterest replacement = new RegionOfInterest(); + replacement.setCoordinate(new LatLongAlt(0, 0, 0)); + missionItems.add(i, replacement); + } + } + } + + carrier.putParcelable(type, attribute); + } + } + break; + } + return carrier; + } + + public boolean isConnected() { + return droneMgr != null && droneMgr.isConnected(); + } + + private ConnectionParameter checkConnectionParameter(ConnectionParameter connParams) throws ConnectionException { + if (connParams == null) { + throw new ConnectionException("Invalid connection parameters"); + } + + if (SoloConnection.isUdpSoloConnection(context, connParams)) { + ConnectionParameter update = SoloConnection.getSoloConnectionParameterFromUdp(context); + if (update != null) { + return update; + } + } + return connParams; + } + + public void connect(ConnectionParameter connParams) { + try { + //Validate the given connection parameter + connParams = checkConnectionParameter(connParams); + + //Validate the current connection parameter for the drone + ConnectionParameter currentConnParams = this.connectionParams == null + ? this.connectionParams + : checkConnectionParameter(this.connectionParams); + + if (!connParams.equals(currentConnParams)) { + if (this.droneMgr != null) { + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.ADDRESS_IN_USE, + "Connection already started with different connection parameters"); + onConnectionStatus(connectionStatus); + return; + } + + this.connectionParams = connParams; + this.droneMgr = service.connectDroneManager(this.connectionParams, ownerId, this); + } + } catch (ConnectionException e) { + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.INVALID_CREDENTIALS, e.getMessage()); + onConnectionStatus(connectionStatus); + disconnect(); + } + } + + public void disconnect() { + service.disconnectDroneManager(this.droneMgr, clientInfo); + this.connectionParams = null; + this.droneMgr = null; + + } + + private void checkForSelfRelease() { + //Check if the apiListener is still connected instead. + if (!apiListener.asBinder().pingBinder()) { + Timber.w("Client is not longer available."); + this.context.startService(new Intent(this.context, DroidPlannerService.class) + .setAction(DroidPlannerService.ACTION_RELEASE_API_INSTANCE) + .putExtra(DroidPlannerService.EXTRA_API_INSTANCE_APP_ID, this.ownerId)); + } + } + + @Override + public void addAttributesObserver(IObserver observer) throws RemoteException { + if (observer != null) { + Timber.d("Adding attributes observer."); + observersList.add(observer); + } + } + + @Override + public void removeAttributesObserver(IObserver observer) throws RemoteException { + if (observer != null) { + Timber.d("Removing attributes observer."); + observersList.remove(observer); + checkForSelfRelease(); + } + } + + @Override + public void addMavlinkObserver(IMavlinkObserver observer) throws RemoteException { + if (observer != null) { + mavlinkObserversList.add(observer); + } + } + + @Override + public void removeMavlinkObserver(IMavlinkObserver observer) throws RemoteException { + if (observer != null) { + mavlinkObserversList.remove(observer); + checkForSelfRelease(); + } + } + + @Override + public void executeAction(Action action, ICommandListener listener) throws RemoteException { + if (action == null) { + return; + } + + String type = action.getType(); + if (type == null) { + return; + } + + Bundle data = action.getData(); + if (data != null) { + data.setClassLoader(context.getClassLoader()); + } + + Drone drone = getDrone(); + switch (type) { + // CONNECTION ACTIONS + case ConnectionActions.ACTION_CONNECT: + ConnectionParameter parameter = data.getParcelable(ConnectionActions.EXTRA_CONNECT_PARAMETER); + connect(parameter); + break; + + case ConnectionActions.ACTION_DISCONNECT: + disconnect(); + break; + + // CAMERA ACTIONS + case CameraActions.ACTION_START_VIDEO_STREAM: { + Surface videoSurface = data.getParcelable(CameraActions.EXTRA_VIDEO_DISPLAY); + String videoTag = data.getString(CameraActions.EXTRA_VIDEO_TAG, ""); + + Bundle videoProps = data.getBundle(CameraActions.EXTRA_VIDEO_PROPERTIES); + if (videoProps == null) { + //Only case where it's null is when interacting with a deprecated client version. + //In this case, we assume that the client is attempting to start a solo stream, since that's + //the only api that was exposed. + videoProps = new Bundle(); + videoProps.putInt(CameraActions.EXTRA_VIDEO_PROPS_UDP_PORT, VideoManager.ARTOO_UDP_PORT); + } + + CommonApiUtils.startVideoStream(drone, videoProps, ownerId, videoTag, videoSurface, listener); + break; + } + + case ExperimentalActions.ACTION_START_VIDEO_STREAM_FOR_OBSERVER: { + String videoTag = data.getString(CameraActions.EXTRA_VIDEO_TAG, ""); + CommonApiUtils.startVideoStreamForObserver(drone, ownerId, videoTag, listener); + break; + } + + case CameraActions.ACTION_STOP_VIDEO_STREAM: { + String videoTag = data.getString(CameraActions.EXTRA_VIDEO_TAG, ""); + CommonApiUtils.stopVideoStream(drone, ownerId, videoTag, listener); + break; + } + + case ExperimentalActions.ACTION_STOP_VIDEO_STREAM_FOR_OBSERVER: { + String videoTag = data.getString(CameraActions.EXTRA_VIDEO_TAG, ""); + CommonApiUtils.stopVideoStreamForObserver(drone, ownerId, videoTag, listener); + break; + } + + // MISSION ACTIONS + case MissionActions.ACTION_BUILD_COMPLEX_MISSION_ITEM: + if (drone instanceof MavLinkDrone || drone == null) { + CommonApiUtils.buildComplexMissionItem((MavLinkDrone) drone, data); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + } + break; + + default: + if (droneMgr != null) { + droneMgr.executeAsyncAction(clientInfo, action, listener); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + break; + } + } + + @Override + public void executeAsyncAction(Action action, ICommandListener listener) throws RemoteException { + executeAction(action, listener); + } + + @Override + public void performAction(Action action) throws RemoteException { + executeAction(action, null); + } + + @Override + public void performAsyncAction(Action action) throws RemoteException { + performAction(action); + } + + private void notifyAttributeUpdate(List> attributesInfo) { + if (observersList.isEmpty() || attributesInfo == null || attributesInfo.isEmpty()) { + return; + } + + for (Pair info : attributesInfo) { + notifyAttributeUpdate(info.first, info.second); + } + } + + private void notifyAttributeUpdate(String attributeEvent, Bundle extrasBundle) { + if (observersList.isEmpty()) { + return; + } + + if (attributeEvent != null) { + for (IObserver observer : observersList) { + try { + observer.onAttributeUpdated(attributeEvent, extrasBundle); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + try { + removeAttributesObserver(observer); + } catch (RemoteException e1) { + Timber.e(e, e1.getMessage()); + } + } + } + } + } + + public void onReceivedMavLinkMessage(MAVLinkMessage msg) { + if (mavlinkObserversList.isEmpty()) { + return; + } + + if (msg != null) { + MavlinkMessageWrapper msgWrapper = new MavlinkMessageWrapper(msg); + for (IMavlinkObserver observer : mavlinkObserversList) { + try { + observer.onMavlinkMessageReceived(msgWrapper); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + try { + removeMavlinkObserver(observer); + } catch (RemoteException e1) { + Timber.e(e1, e1.getMessage()); + } + } + } + } + } + + public void onMessageLogged(int logLevel, String message) { + Bundle args = new Bundle(2); + args.putInt(AttributeEventExtra.EXTRA_AUTOPILOT_MESSAGE_LEVEL, logLevel); + args.putString(AttributeEventExtra.EXTRA_AUTOPILOT_MESSAGE, message); + notifyAttributeUpdate(AttributeEvent.AUTOPILOT_MESSAGE, args); + } + + public ClientInfo getClientInfo() { + return clientInfo; + } + + @Override + public void onAttributeEvent(String attributeEvent, Bundle eventInfo, boolean checkForSololinkApi) { + if (TextUtils.isEmpty(attributeEvent)) { + return; + } + + notifyAttributeUpdate(attributeEvent, eventInfo); + } + + @Override + public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { + final Bundle extrasBundle = new Bundle(); + String droneId = ""; + if (drone != null) { + droneId = drone.getId(); + } + + extrasBundle.putString(AttributeEventExtra.EXTRA_VEHICLE_ID, droneId); + + String droneEvent = null; + List> attributesInfo = new ArrayList<>(); + + switch (event) { + case DISCONNECTED: + //Broadcast the disconnection with the vehicle. + context.sendBroadcast(new Intent(GCSEvent.ACTION_VEHICLE_DISCONNECTION) + .putExtra(GCSEvent.EXTRA_APP_ID, ownerId)); + + droneEvent = AttributeEvent.STATE_DISCONNECTED; + break; + + case GUIDEDPOINT: + droneEvent = AttributeEvent.GUIDED_POINT_UPDATED; + break; + + case RADIO: + droneEvent = AttributeEvent.SIGNAL_UPDATED; + break; + + case RC_IN: + break; + case RC_OUT: + break; + + case ARMING_STARTED: + case ARMING: + droneEvent = AttributeEvent.STATE_ARMING; + break; + + case AUTOPILOT_WARNING: + State droneState = (State) drone.getAttribute(AttributeType.STATE); + if (droneState != null) { + extrasBundle.putString(AttributeEventExtra.EXTRA_AUTOPILOT_ERROR_ID, droneState.getAutopilotErrorId()); + } + droneEvent = AttributeEvent.AUTOPILOT_ERROR; + break; + + case MODE: + droneEvent = AttributeEvent.STATE_VEHICLE_MODE; + break; + + case ATTITUDE: + case ORIENTATION: + droneEvent = AttributeEvent.ATTITUDE_UPDATED; + break; + + case SPEED: + droneEvent = AttributeEvent.SPEED_UPDATED; + break; + + case BATTERY: + droneEvent = AttributeEvent.BATTERY_UPDATED; + break; + + case STATE: + droneEvent = AttributeEvent.STATE_UPDATED; + break; + + case MISSION_UPDATE: + droneEvent = AttributeEvent.MISSION_UPDATED; + break; + + case MISSION_RECEIVED: + droneEvent = AttributeEvent.MISSION_RECEIVED; + break; + + case FIRMWARE: + case TYPE: + droneEvent = AttributeEvent.TYPE_UPDATED; + break; + + case HOME: + droneEvent = AttributeEvent.HOME_UPDATED; + break; + + case CALIBRATION_IMU: + if (drone instanceof MavLinkDrone) { + String calIMUMessage = ((MavLinkDrone) drone).getCalibrationSetup().getMessage(); + extrasBundle.putString(AttributeEventExtra.EXTRA_CALIBRATION_IMU_MESSAGE, calIMUMessage); + droneEvent = AttributeEvent.CALIBRATION_IMU; + } + break; + + case CALIBRATION_TIMEOUT: + if (drone instanceof MavLinkDrone) { + /* + * here we will check if we are in calibration mode but if at + * the same time 'msg' is empty - then it is actually not doing + * calibration what we should do is to reset the calibration + * flag and re-trigger the HEARTBEAT_TIMEOUT this however should + * not be happening + */ + AccelCalibration accelCalibration = ((MavLinkDrone) drone).getCalibrationSetup(); + String message = accelCalibration.getMessage(); + if (accelCalibration.isCalibrating() && TextUtils.isEmpty(message)) { + accelCalibration.cancelCalibration(); + droneEvent = AttributeEvent.HEARTBEAT_TIMEOUT; + } else { + extrasBundle.putString(AttributeEventExtra.EXTRA_CALIBRATION_IMU_MESSAGE, message); + droneEvent = AttributeEvent.CALIBRATION_IMU_TIMEOUT; + } + } + break; + + case HEARTBEAT_TIMEOUT: + droneEvent = AttributeEvent.HEARTBEAT_TIMEOUT; + break; + + case CONNECTING: + droneEvent = AttributeEvent.STATE_CONNECTING; + break; + + case HEARTBEAT_FIRST: + Bundle heartBeatExtras = new Bundle(); + heartBeatExtras.putString(AttributeEventExtra.EXTRA_VEHICLE_ID, drone.getId()); + if (drone instanceof MavLinkDrone) { + heartBeatExtras.putInt(AttributeEventExtra.EXTRA_MAVLINK_VERSION, ((MavLinkDrone) drone).getMavlinkVersion()); + } + attributesInfo.add(Pair.create(AttributeEvent.HEARTBEAT_FIRST, heartBeatExtras)); + + case CONNECTED: + //Broadcast the vehicle connection. + ConnectionParameter sanitizedParameter = new ConnectionParameter(connectionParams + .getConnectionType(), connectionParams.getParamsBundle()); + + context.sendBroadcast(new Intent(GCSEvent.ACTION_VEHICLE_CONNECTION) + .putExtra(GCSEvent.EXTRA_APP_ID, ownerId) + .putExtra(GCSEvent.EXTRA_VEHICLE_CONNECTION_PARAMETER, sanitizedParameter)); + + attributesInfo.add(Pair.create(AttributeEvent.STATE_CONNECTED, extrasBundle)); + break; + + case HEARTBEAT_RESTORED: + if (drone instanceof MavLinkDrone) { + extrasBundle.putInt(AttributeEventExtra.EXTRA_MAVLINK_VERSION, ((MavLinkDrone) drone).getMavlinkVersion()); + } + droneEvent = AttributeEvent.HEARTBEAT_RESTORED; + break; + + case MISSION_SENT: + droneEvent = AttributeEvent.MISSION_SENT; + break; + + case INVALID_POLYGON: + break; + + case MISSION_WP_UPDATE: + if (drone instanceof MavLinkDrone) { + int currentWaypoint = ((MavLinkDrone) drone).getMissionStats().getCurrentWP(); + extrasBundle.putInt(AttributeEventExtra.EXTRA_MISSION_CURRENT_WAYPOINT, currentWaypoint); + droneEvent = AttributeEvent.MISSION_ITEM_UPDATED; + } + break; + + case MISSION_WP_REACHED: + if (drone instanceof MavLinkDrone) { + int lastReachedWaypoint = ((MavLinkDrone) drone).getMissionStats().getLastReachedWP(); + extrasBundle.putInt(AttributeEventExtra.EXTRA_MISSION_LAST_REACHED_WAYPOINT, lastReachedWaypoint); + droneEvent = AttributeEvent.MISSION_ITEM_REACHED; + } + break; + + case ALTITUDE: + droneEvent = AttributeEvent.ALTITUDE_UPDATED; + break; + + case WARNING_SIGNAL_WEAK: + droneEvent = AttributeEvent.SIGNAL_WEAK; + break; + + case WARNING_NO_GPS: + droneEvent = AttributeEvent.WARNING_NO_GPS; + break; + + case MAGNETOMETER: + break; + + case FOOTPRINT: + droneEvent = AttributeEvent.CAMERA_FOOTPRINTS_UPDATED; + break; + + case EKF_STATUS_UPDATE: + droneEvent = AttributeEvent.STATE_EKF_REPORT; + break; + + case EKF_POSITION_STATE_UPDATE: + droneEvent = AttributeEvent.STATE_EKF_POSITION; + break; + } + + if (droneEvent != null) { + notifyAttributeUpdate(droneEvent, extrasBundle); + } + + if (!attributesInfo.isEmpty()) { + notifyAttributeUpdate(attributesInfo); + } + } + + @Override + public void onBeginReceivingParameters() { + notifyAttributeUpdate(AttributeEvent.PARAMETERS_REFRESH_STARTED, null); + } + + @Override + public void onParameterReceived(Parameter parameter, int index, int count) { + Bundle paramsBundle = new Bundle(4); + paramsBundle.putInt(AttributeEventExtra.EXTRA_PARAMETER_INDEX, index); + paramsBundle.putInt(AttributeEventExtra.EXTRA_PARAMETERS_COUNT, count); + paramsBundle.putString(AttributeEventExtra.EXTRA_PARAMETER_NAME, parameter.getName()); + paramsBundle.putDouble(AttributeEventExtra.EXTRA_PARAMETER_VALUE, parameter.getValue()); + notifyAttributeUpdate(AttributeEvent.PARAMETER_RECEIVED, paramsBundle); + } + + @Override + public void onEndReceivingParameters() { + notifyAttributeUpdate(AttributeEvent.PARAMETERS_REFRESH_COMPLETED, null); + } + + public void onConnectionStatus(LinkConnectionStatus connectionStatus) { + switch (connectionStatus.getStatusCode()) { + case LinkConnectionStatus.FAILED: + disconnect(); + checkForSelfRelease(); + + //This is to ensure backwards compatibility + // TODO: remove this in version 3.0 + notifyConnectionFailed(connectionStatus); + break; + case LinkConnectionStatus.DISCONNECTED: + disconnect(); + checkForSelfRelease(); + break; + } + + Bundle extras = new Bundle(); + extras.putParcelable(LinkEventExtra.EXTRA_CONNECTION_STATUS, connectionStatus); + notifyAttributeUpdate(LinkEvent.LINK_STATE_UPDATED, extras); + + } + + private void notifyConnectionFailed(LinkConnectionStatus connectionStatus) { + Bundle extras = connectionStatus.getExtras(); + String msg = null; + if (extras != null) { + msg = extras.getString(LinkConnectionStatus.EXTRA_ERROR_MSG); + } + + ConnectionResult connectionResult = new ConnectionResult(0, msg); + try { + apiListener.onConnectionFailed(connectionResult); + } catch (RemoteException e) { + Timber.w(e, "Unable to forward connection fail to client."); + } + + } + + @Override + public void binderDied() { + checkForSelfRelease(); + } + + @Override + public void onCalibrationCancelled() { + notifyAttributeUpdate(AttributeEvent.CALIBRATION_MAG_CANCELLED, null); + } + + @Override + public void onCalibrationProgress(msg_mag_cal_progress progress) { + Bundle progressBundle = new Bundle(1); + progressBundle.putParcelable(AttributeEventExtra.EXTRA_CALIBRATION_MAG_PROGRESS, + CommonApiUtils.getMagnetometerCalibrationProgress(progress)); + + notifyAttributeUpdate(AttributeEvent.CALIBRATION_MAG_PROGRESS, progressBundle); + } + + @Override + public void onCalibrationCompleted(msg_mag_cal_report report) { + Bundle reportBundle = new Bundle(1); + reportBundle.putParcelable(AttributeEventExtra.EXTRA_CALIBRATION_MAG_RESULT, + CommonApiUtils.getMagnetometerCalibrationResult(report)); + + notifyAttributeUpdate(AttributeEvent.CALIBRATION_MAG_COMPLETED, reportBundle); + } + + public static class ClientInfo { + + public final String appId; + public final int apiVersionCode; + public final int clientVersionCode; + + public ClientInfo(String appId, int apiVersionCode, int clientVersionCode) { + this.apiVersionCode = apiVersionCode; + this.appId = appId; + this.clientVersionCode = clientVersionCode; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java new file mode 100644 index 0000000000..f2ab124a8c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java @@ -0,0 +1,45 @@ +package org.droidplanner.services.android.impl.communication.connection; + +import android.content.Context; + +import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; + +import java.io.IOException; + +/** + * Created by fredia on 3/28/16. + */ +public abstract class AndroidIpConnection extends AndroidMavLinkConnection { + + private final WifiConnectionHandler wifiHandler; + + public AndroidIpConnection(Context applicationContext) { + this(applicationContext, null); + } + + protected AndroidIpConnection(Context context, WifiConnectionHandler wifiHandler){ + super(context); + this.wifiHandler = wifiHandler; + } + + @Override + protected final void openConnection() throws IOException { + if(this.wifiHandler != null) { + this.wifiHandler.start(); + } + onOpenConnection(); + } + + protected abstract void onOpenConnection() throws IOException; + + @Override + protected final void closeConnection() throws IOException { + onCloseConnection(); + if(this.wifiHandler != null) { + this.wifiHandler.stop(); + } + } + + protected abstract void onCloseConnection() throws IOException; + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java new file mode 100644 index 0000000000..3b540084ea --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java @@ -0,0 +1,21 @@ +package org.droidplanner.services.android.impl.communication.connection; + +import android.content.Context; + +import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnection; +import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.utils.AndroidLogger; + +public abstract class AndroidMavLinkConnection extends MavLinkConnection { + + protected final Context mContext; + + public AndroidMavLinkConnection(Context applicationContext) { + this.mContext = applicationContext; + } + + @Override + protected final Logger initLogger() { + return AndroidLogger.getLogger(); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java new file mode 100644 index 0000000000..3399a4a9ca --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java @@ -0,0 +1,86 @@ +package org.droidplanner.services.android.impl.communication.connection; + +import android.content.Context; + +import org.droidplanner.services.android.core.MAVLink.connection.TcpConnection; +import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; + +import java.io.IOException; + +public class AndroidTcpConnection extends AndroidIpConnection { + + private final TcpConnection mConnectionImpl; + + private final String serverIp; + private final int serverPort; + + public AndroidTcpConnection(Context context, String tcpServerIp, int tcpServerPort, WifiConnectionHandler wifiHandler){ + super(context, wifiHandler); + + this.serverIp = tcpServerIp; + this.serverPort = tcpServerPort; + + mConnectionImpl = new TcpConnection() { + @Override + protected int loadServerPort() { + return serverPort; + } + + @Override + protected String loadServerIP() { + return serverIp; + } + + @Override + protected Logger initLogger() { + return AndroidTcpConnection.this.initLogger(); + } + + @Override + protected void onConnectionOpened() { + AndroidTcpConnection.this.onConnectionOpened(); + } + + @Override + protected void onConnectionStatus(LinkConnectionStatus connectionStatus) { + AndroidTcpConnection.this.onConnectionStatus(connectionStatus); + } + }; + } + + public AndroidTcpConnection(Context context, String tcpServerIp, int tcpServerPort) { + this(context, tcpServerIp, tcpServerPort, null); + } + + @Override + protected void onCloseConnection() throws IOException { + mConnectionImpl.closeConnection(); + } + + @Override + protected void loadPreferences() { + mConnectionImpl.loadPreferences(); + } + + @Override + protected void onOpenConnection() throws IOException { + mConnectionImpl.openConnection(); + } + + @Override + protected int readDataBlock(byte[] buffer) throws IOException { + return mConnectionImpl.readDataBlock(buffer); + } + + @Override + protected void sendBuffer(byte[] buffer) throws IOException { + mConnectionImpl.sendBuffer(buffer); + } + + @Override + public int getConnectionType() { + return mConnectionImpl.getConnectionType(); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java new file mode 100644 index 0000000000..7b35544811 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java @@ -0,0 +1,161 @@ +package org.droidplanner.services.android.impl.communication.connection; + +import android.content.Context; +import android.util.Log; + +import org.droidplanner.services.android.core.MAVLink.connection.UdpConnection; +import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.HashSet; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class AndroidUdpConnection extends AndroidIpConnection { + + private static final String TAG = AndroidUdpConnection.class.getSimpleName(); + + private final HashSet pingTasks = new HashSet<>(); + + private final UdpConnection mConnectionImpl; + private final int serverPort; + + private ScheduledExecutorService pingRunner; + + public AndroidUdpConnection(Context context, int udpServerPort, WifiConnectionHandler wifiHandler) { + super(context, wifiHandler); + this.serverPort = udpServerPort; + + mConnectionImpl = new UdpConnection() { + @Override + protected int loadServerPort() { + return serverPort; + } + + @Override + protected Logger initLogger() { + return AndroidUdpConnection.this.initLogger(); + } + + @Override + protected void onConnectionOpened() { + AndroidUdpConnection.this.onConnectionOpened(); + } + + @Override + protected void onConnectionStatus(LinkConnectionStatus connectionStatus) { + AndroidUdpConnection.this.onConnectionStatus(connectionStatus); + } + }; + } + + public AndroidUdpConnection(Context context, int udpServerPort) { + this(context, udpServerPort, null); + } + + public void addPingTarget(final InetAddress address, final int port, final long period, final byte[] payload) { + if (address == null || payload == null || period <= 0) + return; + + final PingTask pingTask = new PingTask(address, port, period, payload); + + pingTasks.add(pingTask); + + if (getConnectionStatus() == AndroidMavLinkConnection.MAVLINK_CONNECTED && pingRunner != null && !pingRunner.isShutdown()) + pingRunner.scheduleWithFixedDelay(pingTask, 0, period, TimeUnit.MILLISECONDS); + } + + @Override + protected void onCloseConnection() throws IOException { + Log.d(TAG, "Closing udp connection."); + if (pingRunner != null) { + Log.d(TAG, "Shutting down pinging tasks."); + pingRunner.shutdownNow(); + pingRunner = null; + } + + mConnectionImpl.closeConnection(); + } + + @Override + protected void loadPreferences() { + mConnectionImpl.loadPreferences(); + } + + @Override + protected void onOpenConnection() throws IOException { + Log.d(TAG, "Opening udp connection"); + mConnectionImpl.openConnection(); + + if (pingRunner == null || pingRunner.isShutdown()) + pingRunner = Executors.newSingleThreadScheduledExecutor(); + + for (PingTask pingTask : pingTasks) + pingRunner.scheduleWithFixedDelay(pingTask, 0, pingTask.period, TimeUnit.MILLISECONDS); + } + + @Override + protected int readDataBlock(byte[] buffer) throws IOException { + return mConnectionImpl.readDataBlock(buffer); + } + + @Override + protected void sendBuffer(byte[] buffer) throws IOException { + mConnectionImpl.sendBuffer(buffer); + } + + @Override + public int getConnectionType() { + return mConnectionImpl.getConnectionType(); + } + + private class PingTask implements Runnable { + + private final InetAddress address; + private final int port; + private final long period; + private final byte[] payload; + + private PingTask(InetAddress address, int port, long period, byte[] payload) { + this.address = address; + this.port = port; + this.period = period; + this.payload = payload; + } + + @Override + public boolean equals(Object other) { + if (this == other) + return true; + + if (!(other instanceof PingTask)) + return false; + + PingTask that = (PingTask) other; + return this.address.equals(that.address) && this.port == that.port && this.period == that.period; + } + + @Override + public int hashCode(){ + return toString().hashCode(); + } + + @Override + public void run() { + try { + mConnectionImpl.sendBuffer(address, port, payload); + } catch (IOException e) { + Log.e(TAG, "Error occurred while sending ping message.", e); + } + } + + @Override + public String toString(){ + return "[" + address.toString() + "; " + port + "; " + period + "]"; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java new file mode 100644 index 0000000000..250fdb94b3 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java @@ -0,0 +1,154 @@ +package org.droidplanner.services.android.impl.communication.connection; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothSocket; +import android.content.Context; +import android.os.ParcelUuid; +import android.util.Log; + +import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.UnknownHostException; +import java.util.Set; +import java.util.UUID; + +public class BluetoothConnection extends AndroidMavLinkConnection { + private static final String BLUE = "BLUETOOTH"; + private static final String UUID_SPP_DEVICE = "00001101-0000-1000-8000-00805F9B34FB"; + private BluetoothAdapter mBluetoothAdapter; + private OutputStream out; + private InputStream in; + private BluetoothSocket bluetoothSocket; + + private final String bluetoothAddress; + + public BluetoothConnection(Context parentContext, String btAddress) { + super(parentContext); + this.bluetoothAddress = btAddress; + + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (mBluetoothAdapter == null) { + Log.d(BLUE, "Null adapters"); + } + } + + @Override + protected void openConnection() throws IOException { + Log.d(BLUE, "Connect"); + + // Reset the bluetooth connection + resetConnection(); + + // Retrieve the stored device + BluetoothDevice device = null; + try { + device = mBluetoothAdapter.getRemoteDevice(bluetoothAddress); + } catch (IllegalArgumentException ex) { + // invalid configuration (device may have been removed) + // NOP fall through to 'no device' + } + + // no device + if (device == null) { + device = findSerialBluetoothBoard(); + } + + Log.d(BLUE, "Trying to connect to device with address " + device.getAddress()); + Log.d(BLUE, "BT Create Socket Call..."); + bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(UUID + .fromString(UUID_SPP_DEVICE)); + + Log.d(BLUE, "BT Cancel Discovery Call..."); + mBluetoothAdapter.cancelDiscovery(); + + Log.d(BLUE, "BT Connect Call..."); + bluetoothSocket.connect(); // Here the IOException will rise on BT + // protocol/handshake error. + + Log.d(BLUE, "## BT Connected ##"); + out = bluetoothSocket.getOutputStream(); + in = bluetoothSocket.getInputStream(); + + onConnectionOpened(); + } + + @SuppressLint("NewApi") + private BluetoothDevice findSerialBluetoothBoard() throws UnknownHostException { + Set pairedDevices = mBluetoothAdapter.getBondedDevices(); + // If there are paired devices + if (pairedDevices.size() > 0) { + // Loop through paired devices + for (BluetoothDevice device : pairedDevices) { + // Add the name and address to an array adapter to show in a ListView + Log.d(BLUE, device.getName() + " #" + device.getAddress() + "#"); + + final ParcelUuid[] deviceUuids = device.getUuids(); + if (deviceUuids != null && deviceUuids.length > 0) { + for (ParcelUuid id : device.getUuids()) { + // TODO maybe this will not work on newer devices + Log.d(BLUE, "id:" + id.toString()); + if (id.toString().equalsIgnoreCase(UUID_SPP_DEVICE)) { + Log.d(BLUE, + ">> Selected: " + device.getName() + " Using: " + id.toString()); + return device; + } + } + } + } + } + + throw new UnknownHostException("No Bluetooth Device found"); + } + + @Override + protected int readDataBlock(byte[] buffer) throws IOException { + return in.read(buffer); + + } + + @Override + protected void sendBuffer(byte[] buffer) throws IOException { + if (out != null) { + out.write(buffer); + } + } + + @Override + public int getConnectionType() { + return MavLinkConnectionTypes.MAVLINK_CONNECTION_BLUETOOTH; + } + + @Override + protected void closeConnection() throws IOException { + resetConnection(); + Log.d(BLUE, "## BT Closed ##"); + } + + private void resetConnection() throws IOException { + if (in != null) { + in.close(); + in = null; + } + + if (out != null) { + out.close(); + out = null; + } + + if (bluetoothSocket != null) { + bluetoothSocket.close(); + bluetoothSocket = null; + } + + } + + @Override + protected void loadPreferences() { + // TODO Auto-generated method stub + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java new file mode 100644 index 0000000000..3ad9e10ddb --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java @@ -0,0 +1,206 @@ +package org.droidplanner.services.android.impl.communication.connection; + +import android.content.Context; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.text.TextUtils; + +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionType; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; + +import java.io.IOException; +import java.util.List; + +import timber.log.Timber; + +/** + * Abstract the connection to a Solo vehicle. + * Created by Fredia Huya-Kouadio on 12/17/15. + */ +public class SoloConnection extends AndroidMavLinkConnection implements WifiConnectionHandler.WifiConnectionListener { + + private static final int SOLO_UDP_PORT = 14550; + + private final WifiConnectionHandler wifiHandler; + private final AndroidUdpConnection dataLink; + private final String soloLinkId; + private final String soloLinkPassword; + + public SoloConnection(Context applicationContext, String soloLinkId, String password) { + super(applicationContext); + this.wifiHandler = new WifiConnectionHandler(applicationContext); + wifiHandler.setListener(this); + + this.soloLinkId = soloLinkId; + this.soloLinkPassword = password; + this.dataLink = new AndroidUdpConnection(applicationContext, SOLO_UDP_PORT) { + @Override + protected void onConnectionOpened() { + SoloConnection.this.onConnectionOpened(); + } + + @Override + protected void onConnectionStatus(LinkConnectionStatus connectionStatus) { + SoloConnection.this.onConnectionStatus(connectionStatus); + } + }; + } + + @Override + protected void openConnection() throws IOException { + if (TextUtils.isEmpty(soloLinkId)) { + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.INVALID_CREDENTIALS, "Invalid connection credentials!"); + onConnectionStatus(connectionStatus); + } else { + wifiHandler.start(); + checkScanResults(wifiHandler.getScanResults()); + } + } + + private void refreshWifiAps() { + if (!wifiHandler.refreshWifiAPs()) { + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.SYSTEM_UNAVAILABLE, "Unable to refresh wifi access points"); + onConnectionStatus(connectionStatus); + } + } + + @Override + protected int readDataBlock(byte[] buffer) throws IOException { + return dataLink.readDataBlock(buffer); + } + + @Override + protected void sendBuffer(byte[] buffer) throws IOException { + dataLink.sendBuffer(buffer); + } + + @Override + protected void closeConnection() throws IOException { + wifiHandler.stop(); + dataLink.closeConnection(); + } + + @Override + protected void loadPreferences() { + dataLink.loadPreferences(); + } + + @Override + public int getConnectionType() { + return dataLink.getConnectionType(); + } + + @Override + public void onWifiConnected(String wifiSsid) { + if (isConnecting()) { + //Let's see if we're connected to our target wifi + if (wifiSsid.equalsIgnoreCase(soloLinkId)) { + //We're good to go + try { + dataLink.openConnection(); + } catch (IOException e) { + reportIOException(e); + Timber.e(e, e.getMessage()); + } + } + } + } + + @Override + public void onWifiConnecting() { + onConnectionStatus(new LinkConnectionStatus(LinkConnectionStatus.CONNECTING, null)); + } + + @Override + public void onWifiDisconnected(String prevSsid) { + if (prevSsid.equalsIgnoreCase(soloLinkId)) { + onConnectionStatus(new LinkConnectionStatus(LinkConnectionStatus.DISCONNECTED, null)); + } + } + + @Override + public void onWifiScanResultsAvailable(List results) { + checkScanResults(results); + } + + @Override + public void onWifiConnectionFailed(LinkConnectionStatus connectionStatus) { + onConnectionStatus(connectionStatus); + } + + private void checkScanResults(List results) { + if (!isConnecting()) + return; + + //We're in the connection process, let's see if the wifi we want is available + ScanResult targetResult = null; + for (ScanResult result : results) { + if (result.SSID.equalsIgnoreCase(this.soloLinkId)) { + //bingo + targetResult = result; + break; + } + } + + if (targetResult != null) { + //We're good to go + try { + int connectionResult = wifiHandler.connectToWifi(targetResult, soloLinkPassword); + if (connectionResult != 0) { + @LinkConnectionStatus.FailureCode int failureCode = connectionResult; + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(failureCode, "Unable to connect to the target wifi " + soloLinkId); + onConnectionStatus(connectionStatus); + } + } catch (IllegalArgumentException e) { + Timber.e(e, e.getMessage()); + LinkConnectionStatus connectionStatus = LinkConnectionStatus.newFailedConnectionStatus(LinkConnectionStatus.UNKNOWN, e.getMessage()); + onConnectionStatus(connectionStatus); + } + } else { + //Let's try again + refreshWifiAps(); + } + } + + private boolean isConnecting() { + return getConnectionStatus() == MAVLINK_CONNECTING; + } + + public static boolean isUdpSoloConnection(Context context, ConnectionParameter connParam){ + if(connParam == null) + return false; + + final int connectionType = connParam.getConnectionType(); + switch(connectionType){ + case ConnectionType.TYPE_UDP: + Bundle paramsBundle = connParam.getParamsBundle(); + if(paramsBundle == null) + return false; + + final int serverPort = paramsBundle.getInt(ConnectionType.EXTRA_UDP_SERVER_PORT, ConnectionType.DEFAULT_UDP_SERVER_PORT); + final String wifiSsid = WifiConnectionHandler.getCurrentWifiLink((WifiManager) context.getSystemService(Context.WIFI_SERVICE)); + return WifiConnectionHandler.isSoloWifi(wifiSsid) && serverPort == SOLO_UDP_PORT; + + default: + return false; + } + } + + public static ConnectionParameter getSoloConnectionParameterFromUdp(Context context){ + if(context == null) + return null; + + final String wifiSsid = WifiConnectionHandler.getCurrentWifiLink((WifiManager) context.getSystemService(Context.WIFI_SERVICE)); + if(WifiConnectionHandler.isSoloWifi(wifiSsid)){ + return ConnectionParameter.newSoloConnection(wifiSsid, null); + } + + return null; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java new file mode 100644 index 0000000000..69b1fd3bb4 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java @@ -0,0 +1,219 @@ +package org.droidplanner.services.android.impl.communication.connection.usb; + +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.util.Log; + +import com.hoho.android.usbserial.driver.UsbSerialDriver; +import com.hoho.android.usbserial.driver.UsbSerialProber; + +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +class UsbCDCConnection extends UsbConnection.UsbConnectionImpl { + private static final String TAG = UsbCDCConnection.class.getSimpleName(); + private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; + + private static final IntentFilter intentFilter = new IntentFilter(ACTION_USB_PERMISSION); + + private final AtomicReference serialDriverRef = new AtomicReference<>(); + + private final PendingIntent usbPermissionIntent; + + private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (ACTION_USB_PERMISSION.equals(action)) { + removeWatchdog(); + UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + + if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { + if (device != null) { + //call method to set up device communication + try { + openUsbDevice(device); + } catch (IOException e) { + Log.e(TAG, e.getMessage(), e); + } + } else { + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.LINK_UNAVAILABLE, "Unable to access usb device."); + onUsbConnectionStatus(connectionStatus); + } + } else { + Log.d(TAG, "permission denied for device " + device); + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.PERMISSION_DENIED, "USB Permission denied."); + onUsbConnectionStatus(connectionStatus); + } + } + } + }; + + private final Runnable permissionWatchdog = new Runnable() { + @Override + public void run() { + Log.d(TAG, "Permission request timeout."); + LinkConnectionStatus connectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.TIMEOUT, "Unable to get usb access."); + onUsbConnectionStatus(connectionStatus); + + removeWatchdog(); + } + }; + + private ScheduledExecutorService scheduler; + + protected UsbCDCConnection(Context context, UsbConnection parentConn, int baudRate) { + super(context, parentConn, baudRate); + this.usbPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0); + } + + private void registerUsbPermissionBroadcastReceiver() { + mContext.registerReceiver(broadcastReceiver, intentFilter); + } + + private void unregisterUsbPermissionBroadcastReceiver() { + try { + mContext.unregisterReceiver(broadcastReceiver); + }catch(IllegalArgumentException e){ + Timber.e(e, "Receiver was not registered."); + } + } + + private void removeWatchdog() { + if (scheduler != null) { + scheduler.shutdown(); + scheduler = null; + } + } + + @Override + protected void openUsbConnection() throws IOException { + registerUsbPermissionBroadcastReceiver(); + + // Get UsbManager from Android. + UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); + + //Get the list of available devices + List availableDevices = UsbSerialProber.getAvailableSupportedDevices(manager); + if (availableDevices.isEmpty()) { + Log.d(TAG, "No Devices found"); + throw new IOException("No Devices found"); + } + + //Pick the first device + UsbDevice device = availableDevices.get(0); + if (manager.hasPermission(device)) { + openUsbDevice(device); + } else { + removeWatchdog(); + + scheduler = Executors.newSingleThreadScheduledExecutor(); + scheduler.schedule(permissionWatchdog, 15, TimeUnit.SECONDS); + Log.d(TAG, "Requesting permission to access usb device " + device.getDeviceName()); + manager.requestPermission(device, usbPermissionIntent); + } + } + + private void openUsbDevice(UsbDevice device) throws IOException { + // Get UsbManager from Android. + UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); + + // Find the first available driver. + final UsbSerialDriver serialDriver = UsbSerialProber.openUsbDevice(manager, device); + + if (serialDriver == null) { + Log.d(TAG, "No Devices found"); + throw new IOException("No Devices found"); + } else { + Log.d(TAG, "Opening using Baud rate " + mBaudRate); + try { + serialDriver.open(); + serialDriver.setParameters(mBaudRate, 8, UsbSerialDriver.STOPBITS_1, UsbSerialDriver.PARITY_NONE); + + serialDriverRef.set(serialDriver); + + onUsbConnectionOpened(); + } catch (IOException e) { + Log.e(TAG, "Error setting up device: " + e.getMessage(), e); + try { + serialDriver.close(); + } catch (IOException e2) { + // Ignore. + } + } + } + } + + @Override + protected int readDataBlock(byte[] readData) throws IOException { + // Read data from driver. This call will return up to readData.length bytes. + // If no data is received it will timeout after 200ms (as set by parameter 2) + final UsbSerialDriver serialDriver = serialDriverRef.get(); + if(serialDriver == null) + throw new IOException("Device is unavailable."); + + int iavailable = 0; + try { + iavailable = serialDriver.read(readData, 200); + } catch (NullPointerException e) { + final String errorMsg = "Error Reading: " + e.getMessage() + + "\nAssuming inaccessible USB device. Closing connection."; + Log.e(TAG, errorMsg, e); + throw new IOException(errorMsg, e); + } + + if (iavailable == 0) + iavailable = -1; + return iavailable; + } + + @Override + protected void sendBuffer(byte[] buffer) { + // Write data to driver. This call should write buffer.length bytes + // if data cant be sent , then it will timeout in 500ms (as set by + // parameter 2) + final UsbSerialDriver serialDriver = serialDriverRef.get(); + if (serialDriver != null) { + try { + serialDriver.write(buffer, 500); + } catch (IOException e) { + Log.e(TAG, "Error Sending: " + e.getMessage(), e); + } + } + } + + @Override + protected void closeUsbConnection() throws IOException { + unregisterUsbPermissionBroadcastReceiver(); + + final UsbSerialDriver serialDriver = serialDriverRef.getAndSet(null); + if (serialDriver != null) { + try { + serialDriver.close(); + } catch (IOException e) { + Log.e(TAG, e.getMessage(), e); + } + } + } + + @Override + public String toString() { + return TAG; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java new file mode 100644 index 0000000000..8cd8f4ffd4 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java @@ -0,0 +1,157 @@ +package org.droidplanner.services.android.impl.communication.connection.usb; + +import android.content.Context; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.util.Log; + +import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; +import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; +import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.utils.AndroidLogger; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map.Entry; + +public class UsbConnection extends AndroidMavLinkConnection { + + private static final String TAG = UsbConnection.class.getSimpleName(); + + private static final int FTDI_DEVICE_VENDOR_ID = 0x0403; + + protected final int mBaudRate; + + private UsbConnectionImpl mUsbConnection; + + public UsbConnection(Context parentContext, int baudRate) { + super(parentContext); + mBaudRate = baudRate; + } + + @Override + protected void closeConnection() throws IOException { + if (mUsbConnection != null) { + mUsbConnection.closeUsbConnection(); + } + } + + @Override + protected void loadPreferences() { + } + + @Override + protected void openConnection() throws IOException { + if (mUsbConnection != null) { + try { + mUsbConnection.openUsbConnection(); + Log.d(TAG, "Reusing previous usb connection."); + return; + } catch (IOException e) { + Log.e(TAG, "Previous usb connection is not usable.", e); + mUsbConnection = null; + } + } + + if (isFTDIdevice(mContext)) { + final UsbConnectionImpl tmp = new UsbFTDIConnection(mContext, this, mBaudRate); + try { + tmp.openUsbConnection(); + + // If the call above is successful, 'mUsbConnection' will be set. + mUsbConnection = tmp; + Log.d(TAG, "Using FTDI usb connection."); + } catch (IOException e) { + Log.d(TAG, "Unable to open a ftdi usb connection. Falling back to the open " + + "usb-library.", e); + } + } + + // Fallback + if (mUsbConnection == null) { + final UsbConnectionImpl tmp = new UsbCDCConnection(mContext, this, mBaudRate); + + // If an error happens here, let it propagate up the call chain since this is the fallback. + tmp.openUsbConnection(); + mUsbConnection = tmp; + Log.d(TAG, "Using open-source usb connection."); + } + } + + private static boolean isFTDIdevice(Context context) { + UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE); + final HashMap deviceList = manager.getDeviceList(); + if (deviceList == null || deviceList.isEmpty()) { + return false; + } + + for (Entry device : deviceList.entrySet()) { + if (device.getValue().getVendorId() == FTDI_DEVICE_VENDOR_ID) { + return true; + } + } + return false; + } + + @Override + protected int readDataBlock(byte[] buffer) throws IOException { + if (mUsbConnection == null) { + throw new IOException("Uninitialized usb connection."); + } + + return mUsbConnection.readDataBlock(buffer); + } + + @Override + protected void sendBuffer(byte[] buffer) throws IOException { + if (mUsbConnection == null) { + throw new IOException("Uninitialized usb connection."); + } + + mUsbConnection.sendBuffer(buffer); + } + + @Override + public int getConnectionType() { + return MavLinkConnectionTypes.MAVLINK_CONNECTION_USB; + } + + @Override + public String toString() { + if (mUsbConnection == null) { + return TAG; + } + + return mUsbConnection.toString(); + } + + static abstract class UsbConnectionImpl { + protected final int mBaudRate; + protected final Context mContext; + private final UsbConnection parentConnection; + protected final Logger mLogger = AndroidLogger.getLogger(); + + protected UsbConnectionImpl(Context context, UsbConnection parentConn, int baudRate) { + mContext = context; + this.parentConnection = parentConn; + mBaudRate = baudRate; + } + + protected void onUsbConnectionOpened() { + parentConnection.onConnectionOpened(); + } + + protected void onUsbConnectionStatus(LinkConnectionStatus connectionStatus) { + parentConnection.onConnectionStatus(connectionStatus); + } + + protected abstract void closeUsbConnection() throws IOException; + + protected abstract void openUsbConnection() throws IOException; + + protected abstract int readDataBlock(byte[] readData) throws IOException; + + protected abstract void sendBuffer(byte[] buffer); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbFTDIConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbFTDIConnection.java new file mode 100644 index 0000000000..485f90abee --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbFTDIConnection.java @@ -0,0 +1,132 @@ +package org.droidplanner.services.android.impl.communication.connection.usb; + +import android.content.Context; +import android.util.Log; + +import com.ftdi.j2xx.D2xxManager; +import com.ftdi.j2xx.FT_Device; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicReference; + +class UsbFTDIConnection extends UsbConnection.UsbConnectionImpl { + + private static final String TAG = UsbFTDIConnection.class.getSimpleName(); + + private static final byte LATENCY_TIMER = 32; + + private final AtomicReference ftDevRef = new AtomicReference<>(); + + protected UsbFTDIConnection(Context context, UsbConnection parentConn, int baudRate) { + super(context, parentConn, baudRate); + } + + @Override + protected void openUsbConnection() throws IOException { + D2xxManager ftD2xx = null; + try { + ftD2xx = D2xxManager.getInstance(mContext); + } catch (D2xxManager.D2xxException ex) { + mLogger.logErr(TAG, ex); + } + + if (ftD2xx == null) { + throw new IOException("Unable to retrieve D2xxManager instance."); + } + + int DevCount = ftD2xx.createDeviceInfoList(mContext); + Log.d(TAG, "Found " + DevCount + " ftdi devices."); + if (DevCount < 1) { + throw new IOException("No Devices found"); + } + + FT_Device ftDev = null; + try { + // FIXME: The NPE is coming from the library. Investigate if it's + // possible to fix there. + ftDev = ftD2xx.openByIndex(mContext, 0); + } catch (NullPointerException e) { + Log.e(TAG, e.getMessage(), e); + } finally { + if (ftDev == null) { + throw new IOException("No Devices found"); + } + } + + Log.d(TAG, "Opening using Baud rate " + mBaudRate); + ftDev.setBitMode((byte) 0, D2xxManager.FT_BITMODE_RESET); + ftDev.setBaudRate(mBaudRate); + ftDev.setDataCharacteristics(D2xxManager.FT_DATA_BITS_8, D2xxManager.FT_STOP_BITS_1, + D2xxManager.FT_PARITY_NONE); + ftDev.setFlowControl(D2xxManager.FT_FLOW_NONE, (byte) 0x00, (byte) 0x00); + ftDev.setLatencyTimer(LATENCY_TIMER); + ftDev.purge((byte) (D2xxManager.FT_PURGE_TX | D2xxManager.FT_PURGE_RX)); + + if (!ftDev.isOpen()) { + throw new IOException("Unable to open usb device connection."); + } else { + Log.d(TAG, "COM open"); + } + + ftDevRef.set(ftDev); + + onUsbConnectionOpened(); + } + + @Override + protected int readDataBlock(byte[] readData) throws IOException { + final FT_Device ftDev = ftDevRef.get(); + if (ftDev == null || !ftDev.isOpen()) { + throw new IOException("Device is unavailable."); + } + + int iavailable = ftDev.getQueueStatus(); + if (iavailable > 0) { + if (iavailable > 4096) + iavailable = 4096; + try { + ftDev.read(readData, iavailable); + + } catch (NullPointerException e) { + final String errorMsg = "Error Reading: " + e.getMessage() + + "\nAssuming inaccessible USB device. Closing connection."; + Log.e(TAG, errorMsg, e); + throw new IOException(errorMsg, e); + } + } + + if (iavailable == 0) { + iavailable = -1; + } + return iavailable; + } + + @Override + protected void sendBuffer(byte[] buffer) { + final FT_Device ftDev = ftDevRef.get(); + if (ftDev != null && ftDev.isOpen()) { + try { + ftDev.write(buffer); + } catch (Exception e) { + Log.e(TAG, "Error Sending: " + e.getMessage(), e); + } + } + } + + @Override + protected void closeUsbConnection() throws IOException { + final FT_Device ftDev = ftDevRef.getAndSet(null); + if (ftDev != null) { + try { + ftDev.close(); + } catch (Exception e) { + Log.e(TAG, e.getMessage(), e); + } + } + } + + @Override + public String toString() { + return TAG; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java new file mode 100644 index 0000000000..d45fc31697 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java @@ -0,0 +1,26 @@ +package org.droidplanner.services.android.impl.communication.model; + +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.model.ICommandListener; + +public class DataLink { + + public interface DataLinkProvider { + + void sendMessage(T message, ICommandListener listener); + + boolean isConnected(); + + void openConnection(); + + void closeConnection(); + + } + + public interface DataLinkListener { + + void notifyReceivedData(T packet); + + void onConnectionStatus(LinkConnectionStatus connectionStatus); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java new file mode 100644 index 0000000000..c98152ad07 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java @@ -0,0 +1,315 @@ +package org.droidplanner.services.android.impl.communication.service; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; + +import com.MAVLink.MAVLinkPacket; +import com.MAVLink.Messages.MAVLinkMessage; +import com.google.android.gms.analytics.HitBuilders; + +import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; +import org.droidplanner.services.android.communication.connection.AndroidTcpConnection; +import org.droidplanner.services.android.communication.connection.AndroidUdpConnection; +import org.droidplanner.services.android.communication.connection.BluetoothConnection; +import org.droidplanner.services.android.communication.connection.SoloConnection; +import org.droidplanner.services.android.communication.connection.usb.UsbConnection; +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnection; +import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionListener; +import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; +import org.droidplanner.services.android.core.drone.manager.DroneCommandTracker; +import org.droidplanner.services.android.data.SessionDB; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionType; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.utils.analytics.GAUtils; +import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; +import org.droidplanner.services.android.utils.file.DirectoryPath; +import org.droidplanner.services.android.utils.file.FileUtils; + +import java.io.File; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Date; + +import timber.log.Timber; + +/** + * Provide a common class for some ease of use functionality + */ +public class MAVLinkClient implements DataLink.DataLinkProvider { + + private static final int DEFAULT_SYS_ID = 255; + private static final int DEFAULT_COMP_ID = 190; + + private static final String TLOG_PREFIX = "log"; + + /** + * Maximum possible sequence number for a packet. + */ + private static final int MAX_PACKET_SEQUENCE = 255; + + private final MavLinkConnectionListener mConnectionListener = new MavLinkConnectionListener() { + + @Override + public void onReceivePacket(final MAVLinkPacket packet) { + listener.notifyReceivedData(packet); + } + + @Override + public void onConnectionStatus(final LinkConnectionStatus connectionStatus) { + listener.onConnectionStatus(connectionStatus); + + switch (connectionStatus.getStatusCode()) { + case LinkConnectionStatus.DISCONNECTED: + closeConnection(); + break; + + case LinkConnectionStatus.CONNECTED: + Bundle extras = connectionStatus.getExtras(); + if (extras != null) { + long connectionTime = extras.getLong(LinkConnectionStatus.EXTRA_CONNECTION_TIME); + if (connectionTime != 0) { + startLoggingThread(connectionTime); + } + } + break; + } + } + }; + + private AndroidMavLinkConnection mavlinkConn; + + private final DataLink.DataLinkListener listener; + private final SessionDB sessionDB; + private final Context context; + + private int packetSeqNumber = 0; + private final ConnectionParameter connParams; + + private DroneCommandTracker commandTracker; + + public MAVLinkClient(Context context, DataLink.DataLinkListener listener, + ConnectionParameter connParams, DroneCommandTracker commandTracker) { + this.context = context; + this.listener = listener; + + if(connParams == null){ + throw new NullPointerException("Invalid connection parameter argument."); + } + + this.connParams = connParams; + this.sessionDB = new SessionDB(context); + + this.commandTracker = commandTracker; + } + + private int getConnectionStatus(){ + return mavlinkConn == null + ? MavLinkConnection.MAVLINK_DISCONNECTED + : mavlinkConn.getConnectionStatus(); + } + + /** + * Setup a MAVLink connection based on the connection parameters. + */ + @Override + public synchronized void openConnection() { + if(isConnected() || isConnecting()) + return; + + final String tag = toString(); + + //Create the mavlink connection + final int connectionType = connParams.getConnectionType(); + final Bundle paramsBundle = connParams.getParamsBundle(); + + if(mavlinkConn == null) { + switch (connectionType) { + case ConnectionType.TYPE_USB: + final int baudRate = paramsBundle.getInt(ConnectionType.EXTRA_USB_BAUD_RATE, + ConnectionType.DEFAULT_USB_BAUD_RATE); + mavlinkConn = new UsbConnection(context, baudRate); + Timber.i("Connecting over usb."); + break; + + case ConnectionType.TYPE_BLUETOOTH: + //Retrieve the bluetooth address to connect to + final String bluetoothAddress = paramsBundle.getString(ConnectionType.EXTRA_BLUETOOTH_ADDRESS); + mavlinkConn = new BluetoothConnection(context, bluetoothAddress); + Timber.i("Connecting over bluetooth."); + break; + + case ConnectionType.TYPE_TCP: + //Retrieve the server ip and port + final String tcpServerIp = paramsBundle.getString(ConnectionType.EXTRA_TCP_SERVER_IP); + final int tcpServerPort = paramsBundle.getInt(ConnectionType + .EXTRA_TCP_SERVER_PORT, ConnectionType.DEFAULT_TCP_SERVER_PORT); + mavlinkConn = new AndroidTcpConnection(context, tcpServerIp, tcpServerPort, new WifiConnectionHandler(context)); + Timber.i("Connecting over tcp."); + break; + + case ConnectionType.TYPE_UDP: + final int udpServerPort = paramsBundle + .getInt(ConnectionType.EXTRA_UDP_SERVER_PORT, ConnectionType.DEFAULT_UDP_SERVER_PORT); + mavlinkConn = new AndroidUdpConnection(context, udpServerPort, new WifiConnectionHandler(context)); + Timber.i("Connecting over udp."); + break; + + case ConnectionType.TYPE_SOLO: { + Timber.i("Creating solo connection"); + final String soloLinkId = paramsBundle.getString(ConnectionType.EXTRA_SOLO_LINK_ID, null); + final String linkPassword = paramsBundle.getString(ConnectionType.EXTRA_SOLO_LINK_PASSWORD, null); + mavlinkConn = new SoloConnection(context, soloLinkId, linkPassword); + break; + } + + default: + Timber.e("Unrecognized connection type: %s", connectionType); + return; + } + } + + mavlinkConn.addMavLinkConnectionListener(tag, mConnectionListener); + + //Check if we need to ping a server to receive UDP data stream. + if (connectionType == ConnectionType.TYPE_UDP) { + final String pingIpAddress = paramsBundle.getString(ConnectionType.EXTRA_UDP_PING_RECEIVER_IP); + if (!TextUtils.isEmpty(pingIpAddress)) { + try { + final InetAddress resolvedAddress = InetAddress.getByName(pingIpAddress); + + final int pingPort = paramsBundle.getInt(ConnectionType.EXTRA_UDP_PING_RECEIVER_PORT); + final long pingPeriod = paramsBundle.getLong(ConnectionType.EXTRA_UDP_PING_PERIOD, + ConnectionType.DEFAULT_UDP_PING_PERIOD); + final byte[] pingPayload = paramsBundle.getByteArray(ConnectionType.EXTRA_UDP_PING_PAYLOAD); + + ((AndroidUdpConnection) mavlinkConn).addPingTarget(resolvedAddress, pingPort, pingPeriod, pingPayload); + + } catch (UnknownHostException e) { + Timber.e(e, "Unable to resolve UDP ping server ip address."); + } + } + } + + if (mavlinkConn.getConnectionStatus() == MavLinkConnection.MAVLINK_DISCONNECTED) { + mavlinkConn.connect(); + + // Record which connection type is used. + GAUtils.sendEvent(new HitBuilders.EventBuilder() + .setCategory(GAUtils.Category.MAVLINK_CONNECTION) + .setAction("MavLink connect") + .setLabel(connParams.toString())); + } + } + + /** + * Disconnect the MAVLink connection for the given listener. + */ + @Override + public synchronized void closeConnection() { + if (isDisconnected()) + return; + + mavlinkConn.removeMavLinkConnectionListener(toString()); + if(mavlinkConn.getMavLinkConnectionListenersCount() == 0){ + Timber.i("Disconnecting..."); + mavlinkConn.disconnect(); + GAUtils.sendEvent(new HitBuilders.EventBuilder() + .setCategory(GAUtils.Category.MAVLINK_CONNECTION) + .setAction("MavLink disconnect") + .setLabel(connParams.toString())); + } + + stopLoggingThread(System.currentTimeMillis()); + + listener.onConnectionStatus(new LinkConnectionStatus(LinkConnectionStatus.DISCONNECTED, null)); + } + + @Override + public synchronized void sendMessage(MAVLinkMessage message, ICommandListener listener) { + sendMavMessage(message, DEFAULT_SYS_ID, DEFAULT_COMP_ID, listener); + } + + protected void sendMavMessage(MAVLinkMessage message, int sysId, int compId, ICommandListener listener){ + if (isDisconnected() || message == null) { + return; + } + + final MAVLinkPacket packet = message.pack(); + packet.sysid = sysId; + packet.compid = compId; + packet.seq = packetSeqNumber; + + mavlinkConn.sendMavPacket(packet); + + packetSeqNumber = (packetSeqNumber + 1) % (MAX_PACKET_SEQUENCE + 1); + + if (commandTracker != null && listener != null) { + commandTracker.onCommandSubmitted(message, listener); + } + } + + public synchronized boolean isDisconnected(){ + return getConnectionStatus() == MavLinkConnection.MAVLINK_DISCONNECTED; + } + + @Override + public synchronized boolean isConnected() { + return getConnectionStatus() == MavLinkConnection.MAVLINK_CONNECTED; + } + + private boolean isConnecting(){ + return getConnectionStatus() == MavLinkConnection.MAVLINK_CONNECTING; + } + + private File getTLogDir(String appId) { + return DirectoryPath.getTLogPath(this.context, appId); + } + + private File getTempTLogFile(String appId, long connectionTimestamp) { + return new File(getTLogDir(appId), getTLogFilename(connectionTimestamp)); + } + + private String getTLogFilename(long connectionTimestamp) { + return TLOG_PREFIX + "_" + MavLinkConnectionTypes.getConnectionTypeLabel(this.connParams.getConnectionType()) + + "_" + FileUtils.getTimeStamp(connectionTimestamp) + FileUtils.TLOG_FILENAME_EXT; + } + + /** + * Register a log listener. + * + * @param appId Tag for the listener. + */ + public synchronized void addLoggingFile(String appId){ + if(isConnecting() || isConnected()) { + final File logFile = getTempTLogFile(appId, System.currentTimeMillis()); + mavlinkConn.addLoggingPath(appId, logFile.getAbsolutePath()); + } + } + + /** + * Unregister a log listener. + * + * @param appId Tag for the listener. + */ + public synchronized void removeLoggingFile(String appId){ + if(isConnecting() || isConnected()){ + mavlinkConn.removeLoggingPath(appId); + } + } + + private void startLoggingThread(long startTime) { + //log into the database the connection time. + final String connectionType = MavLinkConnectionTypes.getConnectionTypeLabel(connParams.getConnectionType()); + this.sessionDB.startSession(new Date(startTime), connectionType); + } + + private void stopLoggingThread(long stopTime) { + //log into the database the disconnection time. + final String connectionType = MavLinkConnectionTypes.getConnectionTypeLabel(connParams.getConnectionType()); + this.sessionDB.endSession(new Date(stopTime), connectionType, new Date()); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java new file mode 100644 index 0000000000..2b9a7111fe --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java @@ -0,0 +1,112 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import com.MAVLink.common.msg_command_ack; +import com.MAVLink.common.msg_command_long; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_CMD_ACK; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.model.ICommandListener; + +public class MavLinkCalibration { + + public static void sendCalibrationAckMessage(MavLinkDrone drone, int count) { + msg_command_ack msg = new msg_command_ack(); + msg.command = count; + msg.result = MAV_CMD_ACK.MAV_CMD_ACK_OK; + drone.getMavClient().sendMessage(msg, null); + } + + public static void startAccelerometerCalibration(MavLinkDrone drone, ICommandListener listener) { + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_PREFLIGHT_CALIBRATION; + msg.param1 = 0; + msg.param2 = 0; + msg.param3 = 0; + msg.param4 = 0; + msg.param5 = 1; + msg.param6 = 0; + msg.param7 = 0; + msg.confirmation = 0; + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * Initiate a magnetometer calibration + * @param drone + */ + public static void startMagnetometerCalibration(MavLinkDrone drone, ICommandListener listener){ + startMagnetometerCalibration(drone, false, false, 0, listener); + } + + /** + * Initiate a magnetometer calibration + * @param drone vehicle to calibrate + * @param retryOnFailure if true, automatically retry the magnetometer calibration if it fails + * @param saveAutomatically if true, save the calibration automatically without user input. + * @param startDelay positive delay in seconds before starting the calibration + */ + public static void startMagnetometerCalibration(MavLinkDrone drone, boolean retryOnFailure, boolean saveAutomatically, + int startDelay, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_DO_START_MAG_CAL; + msg.param1 = 0; + msg.param2 = retryOnFailure ? 1 : 0; + msg.param3 = saveAutomatically ? 1 : 0; + msg.param4 = startDelay > 0 ? startDelay : 0; + msg.param5 = 0; + msg.param6 = 0; + msg.param7 = 0; + + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * Cancel the running magnetometer calibration.˛ + * @param drone + */ + public static void cancelMagnetometerCalibration(MavLinkDrone drone, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_DO_CANCEL_MAG_CAL; + msg.param1 = 0; + msg.param2 = 0; + msg.param3 = 0; + msg.param4 = 0; + msg.param5 = 0; + msg.param6 = 0; + msg.param7 = 0; + + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * Accept the magnetometer calibration result. + * @param drone + */ + public static void acceptMagnetometerCalibration(MavLinkDrone drone, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_DO_ACCEPT_MAG_CAL; + msg.param1 = 0; + msg.param2 = 0; + msg.param3 = 0; + msg.param4 = 0; + msg.param5 = 0; + msg.param6 = 0; + msg.param7 = 0; + + drone.getMavClient().sendMessage(msg, listener); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java new file mode 100644 index 0000000000..0ab2ee886b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java @@ -0,0 +1,231 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import com.MAVLink.common.msg_command_long; +import com.MAVLink.common.msg_manual_control; +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.common.msg_set_mode; +import com.MAVLink.common.msg_set_position_target_global_int; +import com.MAVLink.common.msg_set_position_target_local_ned; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; +import com.MAVLink.enums.MAV_GOTO; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.variables.ApmModes; +import org.droidplanner.services.android.lib.model.ICommandListener; + +public class MavLinkCommands { + + public static final int EMERGENCY_DISARM_MAGIC_NUMBER = 21196; + + private static final int MAVLINK_SET_POS_TYPE_MASK_POS_IGNORE = ((1 << 0) | (1 << 1) | (1 << 2)); + private static final int MAVLINK_SET_POS_TYPE_MASK_VEL_IGNORE = ((1 << 3) | (1 << 4) | (1 << 5)); + private static final int MAVLINK_SET_POS_TYPE_MASK_ACC_IGNORE = ((1 << 6) | (1 << 7) | (1 << 8)); + + public static void changeMissionSpeed(MavLinkDrone drone, float speed, ICommandListener listener) { + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_DO_CHANGE_SPEED; + msg.param1 = 0; // TODO use correct parameter + msg.param2 = speed; + msg.param3 = 0; // TODO use correct parameter + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void setGuidedMode(MavLinkDrone drone, double latitude, double longitude, double d) { + msg_mission_item msg = new msg_mission_item(); + msg.seq = 0; + msg.current = 2; // TODO use guided mode enum + msg.frame = MAV_FRAME.MAV_FRAME_GLOBAL; + msg.command = MAV_CMD.MAV_CMD_NAV_WAYPOINT; // + msg.param1 = 0; // TODO use correct parameter + msg.param2 = 0; // TODO use correct parameter + msg.param3 = 0; // TODO use correct parameter + msg.param4 = 0; // TODO use correct parameter + msg.x = (float) latitude; + msg.y = (float) longitude; + msg.z = (float) d; + msg.autocontinue = 1; // TODO use correct parameter + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, null); + } + + public static void sendGuidedPosition(MavLinkDrone drone, double latitude, double longitude, double altitude){ + msg_set_position_target_global_int msg = new msg_set_position_target_global_int(); + msg.type_mask = MAVLINK_SET_POS_TYPE_MASK_ACC_IGNORE | MAVLINK_SET_POS_TYPE_MASK_VEL_IGNORE; + msg.coordinate_frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT; + msg.lat_int = (int) (latitude * 1E7); + msg.lon_int = (int) (longitude * 1E7); + msg.alt = (float) altitude; + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, null); + } + + public static void sendGuidedVelocity(MavLinkDrone drone, double xVel, double yVel, double zVel){ + msg_set_position_target_global_int msg = new msg_set_position_target_global_int(); + msg.type_mask = MAVLINK_SET_POS_TYPE_MASK_ACC_IGNORE | MAVLINK_SET_POS_TYPE_MASK_POS_IGNORE; + msg.coordinate_frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT; + msg.vx = (float) xVel; + msg.vy = (float) yVel; + msg.vz = (float) zVel; + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, null); + } + + public static void setVelocityInLocalFrame(MavLinkDrone drone, float xVel, float yVel, float zVel, ICommandListener listener){ + msg_set_position_target_local_ned msg = new msg_set_position_target_local_ned(); + msg.type_mask = MAVLINK_SET_POS_TYPE_MASK_ACC_IGNORE | MAVLINK_SET_POS_TYPE_MASK_POS_IGNORE; + msg.vx = xVel; + msg.vy = yVel; + msg.vz = zVel; + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, listener); + } + + public static void sendGuidedPositionAndVelocity(MavLinkDrone drone, double latitude, double longitude, double altitude, + double xVel, double yVel, double zVel){ + msg_set_position_target_global_int msg = new msg_set_position_target_global_int(); + msg.type_mask = MAVLINK_SET_POS_TYPE_MASK_ACC_IGNORE; + msg.coordinate_frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT; + msg.lat_int = (int) (latitude * 1E7); + msg.lon_int = (int) (longitude * 1E7); + msg.alt = (float) altitude; + msg.vx = (float) xVel; + msg.vy = (float) yVel; + msg.vz = (float) zVel; + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, null); + } + + public static void changeFlightMode(MavLinkDrone drone, ApmModes mode, ICommandListener listener) { + msg_set_mode msg = new msg_set_mode(); + msg.target_system = drone.getSysid(); + msg.base_mode = 1; // TODO use meaningful constant + msg.custom_mode = mode.getNumber(); + drone.getMavClient().sendMessage(msg, listener); + } + + public static void setConditionYaw(MavLinkDrone drone, float targetAngle, float yawRate, boolean isClockwise, + boolean isRelative, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_CONDITION_YAW; + msg.param1 = targetAngle; + msg.param2 = yawRate; + msg.param3 = isClockwise ? 1 : -1; + msg.param4 = isRelative ? 1 : 0; + + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * API for sending manually control to the vehicle using standard joystick axes nomenclature, along with a joystick-like input device. + * Unused axes can be disabled and buttons are also transmit as boolean values. + * @see https://pixhawk.ethz.ch/mavlink/#MANUAL_CONTROL + * + * @param drone + * @param x X-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to forward(1000)-backward(-1000) movement on a joystick and the pitch of a vehicle. + * @param y Y-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to left(-1000)-right(1000) movement on a joystick and the roll of a vehicle. + * @param z Z-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to a separate slider movement with maximum being 1000 and minimum being -1000 on a joystick and the thrust of a vehicle. + * @param r R-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to a twisting of the joystick, with counter-clockwise being 1000 and clockwise being -1000, and the yaw of a vehicle. + * @param buttons A bitfield corresponding to the joystick buttons' current state, 1 for pressed, 0 for released. The lowest bit corresponds to Button 1. + * @param listener + */ + public static void sendManualControl(MavLinkDrone drone, short x, short y, short z, short r, int buttons, ICommandListener listener){ + msg_manual_control msg = new msg_manual_control(); + msg.target = drone.getSysid(); + msg.x = x; + msg.y = y; + msg.z = z; + msg.r = r; + msg.buttons = buttons; + drone.getMavClient().sendMessage(msg, listener); + } + + public static void sendTakeoff(MavLinkDrone drone, double alt, ICommandListener listener) { + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_NAV_TAKEOFF; + + msg.param7 = (float) alt; + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void sendNavLand(MavLinkDrone drone, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_NAV_LAND; + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void sendNavRTL(MavLinkDrone drone, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_NAV_RETURN_TO_LAUNCH; + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void sendPause(MavLinkDrone drone, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_OVERRIDE_GOTO; + msg.param1 = MAV_GOTO.MAV_GOTO_DO_HOLD; + msg.param2 = MAV_GOTO.MAV_GOTO_HOLD_AT_CURRENT_POSITION; + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void startMission(MavLinkDrone drone, ICommandListener listener){ + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_MISSION_START; + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void sendArmMessage(MavLinkDrone drone, boolean arm, boolean emergencyDisarm, ICommandListener listener) { + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_COMPONENT_ARM_DISARM; + msg.param1 = arm ? 1 : 0; + msg.param2 = emergencyDisarm ? EMERGENCY_DISARM_MAGIC_NUMBER : 0; + msg.param3 = 0; + msg.param4 = 0; + msg.param5 = 0; + msg.param6 = 0; + msg.param7 = 0; + msg.confirmation = 0; + drone.getMavClient().sendMessage(msg, listener); + } + + public static void sendFlightTermination(MavLinkDrone drone, ICommandListener listener) { + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + + msg.command = MAV_CMD.MAV_CMD_DO_FLIGHTTERMINATION; + msg.param1 = 1; + + drone.getMavClient().sendMessage(msg, listener); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java new file mode 100644 index 0000000000..c8adf1bf56 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java @@ -0,0 +1,80 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_heartbeat; +import com.MAVLink.enums.MAV_AUTOPILOT; +import com.MAVLink.enums.MAV_TYPE; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.firmware.FirmwareType; + +/** + * Parse the received mavlink messages, and update the drone state appropriately. + */ +public class MavLinkMsgHandler { + + public static final int AUTOPILOT_COMPONENT_ID = 1; + + private final MavLinkDroneManager droneMgr; + + public MavLinkMsgHandler(MavLinkDroneManager droneMgr) { + this.droneMgr = droneMgr; + } + + public void receiveData(MAVLinkMessage msg) { + if (msg.compid != AUTOPILOT_COMPONENT_ID) { + return; + } + + switch (msg.msgid) { + case msg_heartbeat.MAVLINK_MSG_ID_HEARTBEAT: + msg_heartbeat msg_heart = (msg_heartbeat) msg; + handleHeartbeat(msg_heart); + break; + + default: + break; + } + } + + private void handleHeartbeat(msg_heartbeat heartbeat) { + switch (heartbeat.autopilot) { + case MAV_AUTOPILOT.MAV_AUTOPILOT_ARDUPILOTMEGA: + switch (heartbeat.type) { + + case MAV_TYPE.MAV_TYPE_FIXED_WING: + droneMgr.onVehicleTypeReceived(FirmwareType.ARDU_PLANE); + break; + + case MAV_TYPE.MAV_TYPE_GENERIC: + case MAV_TYPE.MAV_TYPE_QUADROTOR: + case MAV_TYPE.MAV_TYPE_COAXIAL: + case MAV_TYPE.MAV_TYPE_HELICOPTER: + case MAV_TYPE.MAV_TYPE_HEXAROTOR: + case MAV_TYPE.MAV_TYPE_OCTOROTOR: + case MAV_TYPE.MAV_TYPE_TRICOPTER: + droneMgr.onVehicleTypeReceived(FirmwareType.ARDU_COPTER); + break; + + case MAV_TYPE.MAV_TYPE_GROUND_ROVER: + case MAV_TYPE.MAV_TYPE_SURFACE_BOAT: + droneMgr.onVehicleTypeReceived(FirmwareType.ARDU_ROVER); + break; + } + break; + + case MAV_AUTOPILOT.MAV_AUTOPILOT_PX4: + droneMgr.onVehicleTypeReceived(FirmwareType.PX4_NATIVE); + break; + + case MAV_AUTOPILOT.MAV_AUTOPILOT_GENERIC: + case MAV_AUTOPILOT.MAV_AUTOPILOT_GENERIC_MISSION_FULL: + case MAV_AUTOPILOT.MAV_AUTOPILOT_GENERIC_WAYPOINTS_ONLY: + case MAV_AUTOPILOT.MAV_AUTOPILOT_GENERIC_WAYPOINTS_AND_SIMPLE_NAVIGATION_ONLY: + default: + droneMgr.onVehicleTypeReceived(FirmwareType.GENERIC); + break; + } + + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java new file mode 100644 index 0000000000..393a5ebb43 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java @@ -0,0 +1,48 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import com.MAVLink.common.msg_param_request_list; +import com.MAVLink.common.msg_param_request_read; +import com.MAVLink.common.msg_param_set; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.drone.property.Parameter; + +public class MavLinkParameters { + public static void requestParametersList(MavLinkDrone drone) { + msg_param_request_list msg = new msg_param_request_list(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, null); + } + + public static void readParameter(MavLinkDrone drone, String name) { + msg_param_request_read msg = new msg_param_request_read(); + msg.param_index = -1; + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.setParam_Id(name); + drone.getMavClient().sendMessage(msg, null); + } + + public static void readParameter(MavLinkDrone drone, int index) { + msg_param_request_read msg = new msg_param_request_read(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.param_index = (short) index; + drone.getMavClient().sendMessage(msg, null); + } + + public static void sendParameter(MavLinkDrone drone, Parameter parameter) { + sendParameter(drone, parameter.getName(), parameter.getType(), (float) parameter.getValue()); + } + + public static void sendParameter(MavLinkDrone drone, String name, int type, float value) { + msg_param_set msg = new msg_param_set(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.setParam_Id(name); + msg.param_type = (byte) type; + msg.param_value = value; + drone.getMavClient().sendMessage(msg, null); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java new file mode 100644 index 0000000000..a3353d968f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java @@ -0,0 +1,22 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import com.MAVLink.common.msg_rc_channels_override; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +public class MavLinkRC { + public static void sendRcOverrideMsg(MavLinkDrone drone, int[] rcOutputs) { + msg_rc_channels_override msg = new msg_rc_channels_override(); + msg.chan1_raw = (short) rcOutputs[0]; + msg.chan2_raw = (short) rcOutputs[1]; + msg.chan3_raw = (short) rcOutputs[2]; + msg.chan4_raw = (short) rcOutputs[3]; + msg.chan5_raw = (short) rcOutputs[4]; + msg.chan6_raw = (short) rcOutputs[5]; + msg.chan7_raw = (short) rcOutputs[6]; + msg.chan8_raw = (short) rcOutputs[7]; + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, null); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java new file mode 100644 index 0000000000..eb03ef4097 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java @@ -0,0 +1,41 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import com.MAVLink.common.msg_request_data_stream; +import com.MAVLink.enums.MAV_DATA_STREAM; + +import org.droidplanner.services.android.communication.model.DataLink.DataLinkProvider; + +public class MavLinkStreamRates { + + public static void setupStreamRates(DataLinkProvider MAVClient, byte sysid, byte compid, + int extendedStatus, int extra1, int extra2, int extra3, int position, int rcChannels, + int rawSensors, int rawControler) { + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_EXTENDED_STATUS, + extendedStatus); + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_EXTRA1, extra1); + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_EXTRA2, extra2); + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_EXTRA3, extra3); + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_POSITION, position); + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_RAW_SENSORS, rawSensors); + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_RAW_CONTROLLER, + rawControler); + requestMavlinkDataStream(MAVClient, sysid, compid, MAV_DATA_STREAM.MAV_DATA_STREAM_RC_CHANNELS, rcChannels); + } + + private static void requestMavlinkDataStream(DataLinkProvider mAVClient, byte sysid, + byte compid, int stream_id, int rate) { + msg_request_data_stream msg = new msg_request_data_stream(); + msg.target_system = sysid; + msg.target_component = compid; + + msg.req_message_rate = rate; + msg.req_stream_id = (short) stream_id; + + if (rate > 0) { + msg.start_stop = 1; + } else { + msg.start_stop = 0; + } + mAVClient.sendMessage(msg, null); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java new file mode 100644 index 0000000000..100042c1da --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java @@ -0,0 +1,54 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import com.MAVLink.common.msg_mission_ack; +import com.MAVLink.common.msg_mission_count; +import com.MAVLink.common.msg_mission_request; +import com.MAVLink.common.msg_mission_request_list; +import com.MAVLink.common.msg_mission_set_current; +import com.MAVLink.enums.MAV_MISSION_RESULT; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +public class MavLinkWaypoint { + + public static void sendAck(MavLinkDrone drone) { + msg_mission_ack msg = new msg_mission_ack(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.type = MAV_MISSION_RESULT.MAV_MISSION_ACCEPTED; + drone.getMavClient().sendMessage(msg, null); + + } + + public static void requestWayPoint(MavLinkDrone drone, int index) { + msg_mission_request msg = new msg_mission_request(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.seq = index; + drone.getMavClient().sendMessage(msg, null); + } + + public static void requestWaypointsList(MavLinkDrone drone) { + msg_mission_request_list msg = new msg_mission_request_list(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + drone.getMavClient().sendMessage(msg, null); + } + + public static void sendWaypointCount(MavLinkDrone drone, int count) { + msg_mission_count msg = new msg_mission_count(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.count = count; + drone.getMavClient().sendMessage(msg, null); + } + + public static void sendSetCurrentWaypoint(MavLinkDrone drone, short i) { + msg_mission_set_current msg = new msg_mission_set_current(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.seq = i; + drone.getMavClient().sendMessage(msg, null); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java new file mode 100644 index 0000000000..800c6a0a35 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java @@ -0,0 +1,340 @@ +package org.droidplanner.services.android.impl.core.MAVLink; + +import android.os.Handler; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_mission_ack; +import com.MAVLink.common.msg_mission_count; +import com.MAVLink.common.msg_mission_current; +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.common.msg_mission_item_reached; +import com.MAVLink.common.msg_mission_request; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.OnWaypointManagerListener; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +import java.util.ArrayList; +import java.util.List; + +/** + * Class to manage the communication of waypoints to the MAV. + *

+ * Should be initialized with a MAVLink Object, so the manager can send messages + * via the MAV link. The function processMessage must be called with every new + * MAV Message. + */ +public class WaypointManager extends DroneVariable { + enum WaypointStates { + IDLE, READ_REQUEST, READING_WP, WRITING_WP_COUNT, WRITING_WP, WAITING_WRITE_ACK + } + + public enum WaypointEvent_Type { + WP_UPLOAD, WP_DOWNLOAD, WP_RETRY, WP_CONTINUE, WP_TIMED_OUT + } + + private static final long TIMEOUT = 15000; //ms + private static final int RETRY_LIMIT = 3; + + private int retryTracker = 0; + + private int readIndex; + private int writeIndex; + private int retryIndex; + private OnWaypointManagerListener wpEventListener; + + WaypointStates state = WaypointStates.IDLE; + + /** + * waypoint witch is currently being written + */ + + private final Handler watchdog; + + private final Runnable watchdogCallback = new Runnable() { + @Override + public void run() { + if (processTimeOut(++retryTracker)) + watchdog.postDelayed(this, TIMEOUT); + } + }; + + public WaypointManager(MavLinkDrone drone, Handler handler) { + super(drone); + this.watchdog = handler; + } + + public void setWaypointManagerListener(OnWaypointManagerListener wpEventListener) { + this.wpEventListener = wpEventListener; + } + + private void startWatchdog() { + stopWatchdog(); + + retryTracker = 0; + this.watchdog.postDelayed(watchdogCallback, TIMEOUT); + } + + private void stopWatchdog() { + this.watchdog.removeCallbacks(watchdogCallback); + } + + /** + * Try to receive all waypoints from the MAV. + *

+ * If all runs well the callback will return the list of waypoints. + */ + public void getWaypoints() { + // ensure that WPManager is not doing anything else + if (state != WaypointStates.IDLE) + return; + + doBeginWaypointEvent(WaypointEvent_Type.WP_DOWNLOAD); + readIndex = -1; + state = WaypointStates.READ_REQUEST; + MavLinkWaypoint.requestWaypointsList(myDrone); + + startWatchdog(); + } + + /** + * Write a list of waypoints to the MAV. + *

+ * The callback will return the status of this operation + * + * @param data waypoints to be written + */ + + public void writeWaypoints(List data) { + // ensure that WPManager is not doing anything else + if (state != WaypointStates.IDLE) + return; + + if ((mission != null)) { + doBeginWaypointEvent(WaypointEvent_Type.WP_UPLOAD); + mission.clear(); + mission.addAll(data); + writeIndex = 0; + state = WaypointStates.WRITING_WP_COUNT; + MavLinkWaypoint.sendWaypointCount(myDrone, mission.size()); + + startWatchdog(); + } + } + + /** + * Sets the current waypoint in the MAV + *

+ * The callback will return the status of this operation + */ + public void setCurrentWaypoint(int i) { + if ((mission != null)) { + MavLinkWaypoint.sendSetCurrentWaypoint(myDrone, (short) i); + } + } + + /** + * Callback for when a waypoint has been reached + * + * @param wpNumber number of the completed waypoint + */ + public void onWaypointReached(int wpNumber) { + } + + /** + * Callback for a change in the current waypoint the MAV is heading for + * + * @param seq number of the updated waypoint + */ + private void onCurrentWaypointUpdate(int seq) { + } + + /** + * number of waypoints to be received, used when reading waypoints + */ + private int waypointCount; + /** + * list of waypoints used when writing or receiving + */ + private List mission = new ArrayList(); + + /** + * Try to process a Mavlink message if it is a mission related message + * + * @param msg Mavlink message to process + * @return Returns true if the message has been processed + */ + public boolean processMessage(MAVLinkMessage msg) { + switch (state) { + default: + case IDLE: + break; + + case READ_REQUEST: + if (msg.msgid == msg_mission_count.MAVLINK_MSG_ID_MISSION_COUNT) { + waypointCount = ((msg_mission_count) msg).count; + mission.clear(); + startWatchdog(); + MavLinkWaypoint.requestWayPoint(myDrone, mission.size()); + state = WaypointStates.READING_WP; + return true; + } + break; + + case READING_WP: + if (msg.msgid == msg_mission_item.MAVLINK_MSG_ID_MISSION_ITEM) { + startWatchdog(); + processReceivedWaypoint((msg_mission_item) msg); + doWaypointEvent(WaypointEvent_Type.WP_DOWNLOAD, readIndex + 1, waypointCount); + if (mission.size() < waypointCount) { + MavLinkWaypoint.requestWayPoint(myDrone, mission.size()); + } else { + stopWatchdog(); + state = WaypointStates.IDLE; + MavLinkWaypoint.sendAck(myDrone); + myDrone.getMission().onMissionReceived(mission); + doEndWaypointEvent(WaypointEvent_Type.WP_DOWNLOAD); + } + return true; + } + break; + + case WRITING_WP_COUNT: + state = WaypointStates.WRITING_WP; + case WRITING_WP: + if (msg.msgid == msg_mission_request.MAVLINK_MSG_ID_MISSION_REQUEST) { + startWatchdog(); + processWaypointToSend((msg_mission_request) msg); + doWaypointEvent(WaypointEvent_Type.WP_UPLOAD, writeIndex + 1, mission.size()); + return true; + } + break; + + case WAITING_WRITE_ACK: + if (msg.msgid == msg_mission_ack.MAVLINK_MSG_ID_MISSION_ACK) { + stopWatchdog(); + myDrone.getMission().onWriteWaypoints((msg_mission_ack) msg); + state = WaypointStates.IDLE; + doEndWaypointEvent(WaypointEvent_Type.WP_UPLOAD); + return true; + } + break; + } + + if (msg.msgid == msg_mission_item_reached.MAVLINK_MSG_ID_MISSION_ITEM_REACHED) { + onWaypointReached(((msg_mission_item_reached) msg).seq); + return true; + } + if (msg.msgid == msg_mission_current.MAVLINK_MSG_ID_MISSION_CURRENT) { + onCurrentWaypointUpdate(((msg_mission_current) msg).seq); + return true; + } + return false; + } + + public boolean processTimeOut(int mTimeOutCount) { + + // If max retry is reached, set state to IDLE. No more retry. + if (mTimeOutCount >= RETRY_LIMIT) { + state = WaypointStates.IDLE; + doWaypointEvent(WaypointEvent_Type.WP_TIMED_OUT, retryIndex, RETRY_LIMIT); + return false; + } + + retryIndex++; + doWaypointEvent(WaypointEvent_Type.WP_RETRY, retryIndex, RETRY_LIMIT); + + switch (state) { + default: + case IDLE: + break; + + case READ_REQUEST: + MavLinkWaypoint.requestWaypointsList(myDrone); + break; + + case READING_WP: + if (mission.size() < waypointCount) { // request last lost WP + MavLinkWaypoint.requestWayPoint(myDrone, mission.size()); + } + break; + + case WRITING_WP_COUNT: + MavLinkWaypoint.sendWaypointCount(myDrone, mission.size()); + break; + + case WRITING_WP: + // Log.d("TIMEOUT", "re Write Msg: " + String.valueOf(writeIndex)); + if (writeIndex < mission.size()) { + myDrone.getMavClient().sendMessage(mission.get(writeIndex), null); + } + break; + + case WAITING_WRITE_ACK: + myDrone.getMavClient().sendMessage(mission.get(mission.size() - 1), null); + break; + } + + return true; + } + + private void processWaypointToSend(msg_mission_request msg) { + /* + * Log.d("TIMEOUT", "Write Msg: " + String.valueOf(msg.seq)); + */ + writeIndex = msg.seq; + msg_mission_item item = mission.get(writeIndex); + item.target_system = myDrone.getSysid(); + item.target_component = myDrone.getCompid(); + myDrone.getMavClient().sendMessage(item, null); + + if (writeIndex + 1 >= mission.size()) { + state = WaypointStates.WAITING_WRITE_ACK; + } + } + + private void processReceivedWaypoint(msg_mission_item msg) { + /* + * Log.d("TIMEOUT", "Read Last/Curr: " + String.valueOf(readIndex) + "/" + * + String.valueOf(msg.seq)); + */ + // in case of we receive the same WP again after retry + if (msg.seq <= readIndex) + return; + + readIndex = msg.seq; + + mission.add(msg); + } + + private void doBeginWaypointEvent(WaypointEvent_Type wpEvent) { + retryIndex = 0; + + if (wpEventListener == null) + return; + + wpEventListener.onBeginWaypointEvent(wpEvent); + } + + private void doEndWaypointEvent(WaypointEvent_Type wpEvent) { + if (retryIndex > 0)// if retry successful, notify that we now continue + doWaypointEvent(WaypointEvent_Type.WP_CONTINUE, retryIndex, RETRY_LIMIT); + + retryIndex = 0; + + if (wpEventListener == null) + return; + + wpEventListener.onEndWaypointEvent(wpEvent); + } + + private void doWaypointEvent(WaypointEvent_Type wpEvent, int index, int count) { + retryIndex = 0; + + if (wpEventListener == null) + return; + + wpEventListener.onWaypointEvent(wpEvent, index, count); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java new file mode 100644 index 0000000000..ea0b27f5b8 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java @@ -0,0 +1,160 @@ +package org.droidplanner.services.android.impl.core.MAVLink.command.doCmd; + +import com.MAVLink.ardupilotmega.msg_digicam_control; +import com.MAVLink.ardupilotmega.msg_mount_control; +import com.MAVLink.common.msg_command_long; +import com.MAVLink.common.msg_mission_set_current; +import com.MAVLink.enums.GRIPPER_ACTIONS; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.model.ICommandListener; + +public class MavLinkDoCmds { + + public static void setVehicleHome(MavLinkDrone drone, LatLongAlt location, ICommandListener listener){ + if(drone == null || location == null) + return; + + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_DO_SET_HOME; + + msg.param5 = (float) location.getLatitude(); + msg.param6 = (float) location.getLongitude(); + msg.param7 = (float) location.getAltitude(); + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void setROI(MavLinkDrone drone, LatLongAlt coord, ICommandListener listener) { + if (drone == null) + return; + + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_DO_SET_ROI; + + msg.param5 = (float) coord.getLatitude(); + msg.param6 = (float) coord.getLongitude(); + msg.param7 = (float) coord.getAltitude(); + + drone.getMavClient().sendMessage(msg, listener); + } + + public static void resetROI(MavLinkDrone drone, ICommandListener listener) { + if (drone == null) + return; + + setROI(drone, new LatLongAlt(0, 0, 0), listener); + } + + public static void triggerCamera(MavLinkDrone drone) { + if (drone == null) + return; + + msg_digicam_control msg = new msg_digicam_control(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.shot = 1; + drone.getMavClient().sendMessage(msg, null); + } + + public static void empCommand(MavLinkDrone drone, boolean release, ICommandListener listener) { + if (drone == null) + return; + + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_DO_GRIPPER; + msg.param2 = release ? GRIPPER_ACTIONS.GRIPPER_ACTION_RELEASE : GRIPPER_ACTIONS.GRIPPER_ACTION_GRAB; + + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * Set a Relay pin’s voltage high or low + * + * @param drone target vehicle + * @param relayNumber + * @param enabled true for relay to be on, false for relay to be off. + */ + public static void setRelay(MavLinkDrone drone, int relayNumber, boolean enabled, ICommandListener listener) { + if (drone == null) + return; + + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_DO_SET_RELAY; + msg.param1 = relayNumber; + msg.param2 = enabled ? 1 : 0; + + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * Move a servo to a particular pwm value + * + * @param drone target vehicle + * @param channel he output channel the servo is attached to + * @param pwm PWM value to output to the servo. Servo’s generally accept pwm values between 1000 and 2000 + */ + public static void setServo(MavLinkDrone drone, int channel, int pwm, ICommandListener listener) { + if (drone == null) + return; + + msg_command_long msg = new msg_command_long(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.command = MAV_CMD.MAV_CMD_DO_SET_SERVO; + msg.param1 = channel; + msg.param2 = pwm; + + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * Set the orientation of a gimbal + * + * @param drone target vehicle + * @param pitch the desired gimbal pitch in degrees + * @param roll the desired gimbal roll in degrees + * @param yaw the desired gimbal yaw in degrees + * @param listener Register a callback to receive update of the command execution state. + */ + public static void setGimbalOrientation(MavLinkDrone drone, float pitch, float roll, float yaw, ICommandListener + listener) { + if (drone == null) + return; + + msg_mount_control msg = new msg_mount_control(); + msg.target_system = drone.getSysid(); + msg.target_component = drone.getCompid(); + msg.input_a = (int) (pitch * 100); + msg.input_b = (int) (roll * 100); + msg.input_c = (int) (yaw * 100); + + drone.getMavClient().sendMessage(msg, listener); + } + + /** + * Jump to the desired command in the mission list. Repeat this action only the specified number of times + * + * @param drone target vehicle + * @param waypoint command + * @param listener Register a callback to receive update of the command execution state. + */ + public static void gotoWaypoint(MavLinkDrone drone, int waypoint, ICommandListener listener) { + if (drone == null) + return; + msg_mission_set_current msg = new msg_mission_set_current(); + msg.seq = waypoint; + drone.getMavClient().sendMessage(msg, listener); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java new file mode 100644 index 0000000000..2a11f82a85 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java @@ -0,0 +1,506 @@ +package org.droidplanner.services.android.impl.core.MAVLink.connection; + +import android.os.Bundle; +import android.support.v4.util.Pair; + +import com.MAVLink.MAVLinkPacket; +import com.MAVLink.Parser; + +import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; + +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.BindException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Base for mavlink connection implementations. + */ +public abstract class MavLinkConnection { + + private static final String TAG = MavLinkConnection.class.getSimpleName(); + + /* + * MavLink connection states + */ + public static final int MAVLINK_DISCONNECTED = 0; + public static final int MAVLINK_CONNECTING = 1; + public static final int MAVLINK_CONNECTED = 2; + + /** + * Size of the buffer used to read messages from the mavlink connection. + */ + private static final int READ_BUFFER_SIZE = 4096; + + /** + * Set of listeners subscribed to this mavlink connection. We're using a + * ConcurrentSkipListSet because the object will be accessed from multiple + * threads concurrently. + */ + private final ConcurrentHashMap mListeners = new ConcurrentHashMap<>(); + + /** + * Stores the list of log files to be written to. + */ + private final ConcurrentHashMap> loggingOutStreams = new + ConcurrentHashMap<>(); + + /** + * Queue the set of packets to send via the mavlink connection. A thread + * will be blocking on it until there's element(s) available to send. + */ + private final LinkedBlockingQueue mPacketsToSend = new LinkedBlockingQueue<>(); + + /** + * Queue the set of packets to log. A thread will be blocking on it until + * there's element(s) available for logging. + */ + private final LinkedBlockingQueue mPacketsToLog = new LinkedBlockingQueue<>(); + + private final AtomicInteger mConnectionStatus = new AtomicInteger(MAVLINK_DISCONNECTED); + private final AtomicLong mConnectionTime = new AtomicLong(-1); + + /** + * Start the connection process. + */ + private final Runnable mConnectingTask = new Runnable() { + @Override + public void run() { + // Load the connection specific preferences + loadPreferences(); + // Open the connection + try { + openConnection(); + } catch (IOException e) { + // Ignore errors while shutting down + if (mConnectionStatus.get() != MAVLINK_DISCONNECTED) { + reportIOException(e); + + mLogger.logErr(TAG, e); + } + + disconnect(); + } + + mLogger.logInfo(TAG, "Exiting connecting thread."); + } + }; + + @LinkConnectionStatus.FailureCode + private int getErrorCode(IOException e) { + if (e instanceof BindException) { + return LinkConnectionStatus.ADDRESS_IN_USE; + } else { + return LinkConnectionStatus.UNKNOWN; + } + } + + /** + * Manages the receiving and sending of messages. + */ + private final Runnable mManagerTask = new Runnable() { + + @Override + public void run() { + Thread sendingThread = null; + Thread loggingThread = null; + + try { + final long connectionTime = System.currentTimeMillis(); + mConnectionTime.set(connectionTime); + reportConnect(connectionTime); + + // Launch the 'Sending' thread + mLogger.logInfo(TAG, "Starting sender thread."); + sendingThread = new Thread(mSendingTask, "MavLinkConnection-Sending Thread"); + sendingThread.start(); + + //Launch the 'Logging' thread + mLogger.logInfo(TAG, "Starting logging thread."); + loggingThread = new Thread(mLoggingTask, "MavLinkConnection-Logging Thread"); + loggingThread.start(); + + final Parser parser = new Parser(); + parser.stats.mavlinkResetStats(); + + final byte[] readBuffer = new byte[READ_BUFFER_SIZE]; + + while (mConnectionStatus.get() == MAVLINK_CONNECTED) { + int bufferSize = readDataBlock(readBuffer); + handleData(parser, bufferSize, readBuffer); + } + } catch (IOException e) { + // Ignore errors while shutting down + if (mConnectionStatus.get() != MAVLINK_DISCONNECTED) { + reportIOException(e); + mLogger.logErr(TAG, e); + } + } finally { + if (sendingThread != null && sendingThread.isAlive()) { + sendingThread.interrupt(); + } + + if (loggingThread != null && loggingThread.isAlive()) { + loggingThread.interrupt(); + } + + disconnect(); + mLogger.logInfo(TAG, "Exiting manager thread."); + } + } + + private void handleData(Parser parser, int bufferSize, byte[] buffer) { + if (bufferSize < 1) { + return; + } + + for (int i = 0; i < bufferSize; i++) { + MAVLinkPacket receivedPacket = parser.mavlink_parse_char(buffer[i] & 0x00ff); + if (receivedPacket != null) { + queueToLog(receivedPacket); + reportReceivedPacket(receivedPacket); + } + } + } + }; + + /** + * Blocks until there's packet(s) to send, then dispatch them. + */ + private final Runnable mSendingTask = new Runnable() { + @Override + public void run() { + try { + while (mConnectionStatus.get() == MAVLINK_CONNECTED) { + byte[] buffer = mPacketsToSend.take(); + + try { + sendBuffer(buffer); + queueToLog(buffer); + } catch (IOException e) { + reportIOException(e); + mLogger.logErr(TAG, e); + } + } + } catch (InterruptedException e) { + mLogger.logVerbose(TAG, e.getMessage()); + } finally { + disconnect(); + } + } + }; + + /** + * Blocks until there's packets to log, then dispatch them. + */ + private final Runnable mLoggingTask = new Runnable() { + + @Override + public void run() { + final ByteBuffer logBuffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE); + logBuffer.order(ByteOrder.BIG_ENDIAN); + + try { + while (mConnectionStatus.get() == MAVLINK_CONNECTED) { + + final byte[] packetData = mPacketsToLog.take(); + + logBuffer.clear(); + logBuffer.putLong(System.currentTimeMillis() * 1000); + + for (Map.Entry> entry : loggingOutStreams + .entrySet()) { + final Pair logInfo = entry.getValue(); + final String loggingFilePath = logInfo.first; + try { + BufferedOutputStream logWriter = logInfo.second; + if (logWriter == null) { + logWriter = new BufferedOutputStream(new FileOutputStream(loggingFilePath)); + loggingOutStreams.put(entry.getKey(), Pair.create(loggingFilePath, logWriter)); + } + + logWriter.write(logBuffer.array()); + logWriter.write(packetData); + } catch (IOException e) { + mLogger.logErr(TAG, "IO Exception while writing to " + loggingFilePath, e); + } + } + } + } catch (InterruptedException e) { + final String errorMessage = e.getMessage(); + if (errorMessage != null) { + mLogger.logVerbose(TAG, errorMessage); + } + } finally { + for (Pair entry : loggingOutStreams.values()) { + final String loggingFilePath = entry.first; + try { + if (entry.second != null) { + entry.second.close(); + } + } catch (IOException e) { + mLogger.logErr(TAG, "IO Exception while closing " + loggingFilePath, e); + } + } + + loggingOutStreams.clear(); + } + } + }; + + protected final Logger mLogger = initLogger(); + + private Thread mConnectThread; + private Thread mTaskThread; + + /** + * Establish a mavlink connection. If the connection is successful, it will + * be reported through the MavLinkConnectionListener interface. + */ + public void connect() { + if (mConnectionStatus.compareAndSet(MAVLINK_DISCONNECTED, MAVLINK_CONNECTING)) { + mLogger.logInfo(TAG, "Starting connection thread."); + mConnectThread = new Thread(mConnectingTask, "MavLinkConnection-Connecting Thread"); + mConnectThread.start(); + reportConnecting(); + } + } + + protected void onConnectionOpened() { + if (mConnectionStatus.compareAndSet(MAVLINK_CONNECTING, MAVLINK_CONNECTED)) { + mLogger.logInfo(TAG, "Starting manager thread."); + mTaskThread = new Thread(mManagerTask, "MavLinkConnection-Manager Thread"); + mTaskThread.start(); + } + } + + protected void onConnectionStatus(LinkConnectionStatus connectionStatus) { + reportConnectionStatus(connectionStatus); + + switch (connectionStatus.getStatusCode()) { + case LinkConnectionStatus.FAILED: + mLogger.logInfo(TAG, "Unable to establish connection: " + connectionStatus.getStatusCode()); + disconnect(); + break; + } + } + + /** + * Disconnect a mavlink connection. If the operation is successful, it will + * be reported through the MavLinkConnectionListener interface. + */ + public void disconnect() { + if (mConnectionStatus.get() == MAVLINK_DISCONNECTED || (mConnectThread == null && mTaskThread == null)) { + return; + } + + try { + final long disconnectTime = System.currentTimeMillis(); + + mConnectionStatus.set(MAVLINK_DISCONNECTED); + mConnectionTime.set(-1); + + if (mConnectThread != null && mConnectThread.isAlive() && !mConnectThread.isInterrupted()) { + mConnectThread.interrupt(); + } + + if (mTaskThread != null && mTaskThread.isAlive() && !mTaskThread.isInterrupted()) { + mTaskThread.interrupt(); + } + + closeConnection(); + reportDisconnect(); + } catch (IOException e) { + mLogger.logErr(TAG, e); + reportIOException(e); + } + } + + public int getConnectionStatus() { + return mConnectionStatus.get(); + } + + public void sendMavPacket(MAVLinkPacket packet) { + final byte[] packetData = packet.encodePacket(); + if (!mPacketsToSend.offer(packetData)) { + mLogger.logErr(TAG, "Unable to send mavlink packet. Packet queue is full!"); + } + } + + private void queueToLog(MAVLinkPacket packet) { + if (packet != null) { + queueToLog(packet.encodePacket()); + } + } + + private void queueToLog(byte[] packetData) { + if (packetData != null) { + if (!mPacketsToLog.offer(packetData)) { + mLogger.logErr(TAG, "Unable to log mavlink packet. Queue is full!"); + } + } + } + + public void addLoggingPath(String tag, String loggingPath) { + if (tag == null || tag.length() == 0 || loggingPath == null || loggingPath.length() == 0) { + return; + } + + if (!loggingOutStreams.contains(tag)) { + loggingOutStreams.put(tag, Pair.create(loggingPath, null)); + } + } + + public void removeLoggingPath(String tag) { + if (tag == null || tag.length() == 0) { + return; + } + + Pair logInfo = loggingOutStreams.remove(tag); + if (logInfo != null) { + BufferedOutputStream outStream = logInfo.second; + if (outStream != null) { + try { + outStream.close(); + } catch (IOException e) { + mLogger.logErr(TAG, "IO Exception while closing " + logInfo.first, e); + } + } + } + } + + /** + * Adds a listener to the mavlink connection. + * + * @param listener + * @param tag Listener tag + */ + public void addMavLinkConnectionListener(String tag, MavLinkConnectionListener listener) { + mListeners.put(tag, listener); + + if (getConnectionStatus() == MAVLINK_CONNECTED) { + Bundle extras = new Bundle(); + extras.putLong(LinkConnectionStatus.EXTRA_CONNECTION_TIME, mConnectionTime.get()); + listener.onConnectionStatus(new LinkConnectionStatus(LinkConnectionStatus.CONNECTED, extras)); + } + } + + /** + * @return the count of connection listeners. + */ + public int getMavLinkConnectionListenersCount() { + return mListeners.size(); + } + + /** + * Used to query the presence of a connection listener. + * + * @param tag connection listener tag + * @return true if the tag is present in the listeners list. + */ + public boolean hasMavLinkConnectionListener(String tag) { + return mListeners.containsKey(tag); + } + + /** + * Removes the specified listener. + * + * @param tag Listener tag + */ + public void removeMavLinkConnectionListener(String tag) { + mListeners.remove(tag); + } + + /** + * Removes all the connection listeners. + */ + public void removeAllMavLinkConnectionListeners() { + mListeners.clear(); + } + + protected abstract Logger initLogger(); + + protected abstract void openConnection() throws IOException; + + protected abstract int readDataBlock(byte[] buffer) throws IOException; + + protected abstract void sendBuffer(byte[] buffer) throws IOException; + + protected abstract void closeConnection() throws IOException; + + protected abstract void loadPreferences(); + + /** + * @return The type of this mavlink connection. + */ + public abstract int getConnectionType(); + + protected Logger getLogger() { + return mLogger; + } + + /** + * Utility method to notify the mavlink listeners about communication + * errors. + * + * @param connectionStatus + */ + protected void reportConnectionStatus(LinkConnectionStatus connectionStatus) { + if (mListeners.isEmpty()) { + return; + } + + for (MavLinkConnectionListener listener : mListeners.values()) { + listener.onConnectionStatus(connectionStatus); + } + } + + protected void reportConnecting() { + reportConnectionStatus(new LinkConnectionStatus(LinkConnectionStatus.CONNECTING, null)); + } + + /** + * Utility method to notify the mavlink listeners about a successful + * connection. + */ + protected void reportConnect(long connectionTime) { + Bundle extras = new Bundle(); + extras.putLong(LinkConnectionStatus.EXTRA_CONNECTION_TIME, connectionTime); + reportConnectionStatus(new LinkConnectionStatus(LinkConnectionStatus.CONNECTED, extras)); + } + + /** + * Utility method to notify the mavlink listeners about a connection + * disconnect. + */ + protected void reportDisconnect() { + reportConnectionStatus(new LinkConnectionStatus(LinkConnectionStatus.DISCONNECTED, null)); + } + + /** + * Utility method to notify the mavlink listeners about received messages. + * + * @param packet received mavlink packet + */ + private void reportReceivedPacket(MAVLinkPacket packet) { + if (mListeners.isEmpty()) { + return; + } + + for (MavLinkConnectionListener listener : mListeners.values()) { + listener.onReceivePacket(packet); + } + } + + protected void reportIOException(IOException e) { + reportConnectionStatus(LinkConnectionStatus.newFailedConnectionStatus(getErrorCode(e), e.getMessage())); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java new file mode 100644 index 0000000000..e85567e52e --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java @@ -0,0 +1,25 @@ +package org.droidplanner.services.android.impl.core.MAVLink.connection; + +import com.MAVLink.MAVLinkPacket; + +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; + +/** + * Provides updates about the mavlink connection. + */ +public interface MavLinkConnectionListener { + /** + * Called when data is received via the mavlink connection. + * + * @param packet received data + */ + void onReceivePacket(MAVLinkPacket packet); + + /** + * Provides information about communication error. + * + * @param connectionStatus error information + */ + void onConnectionStatus(LinkConnectionStatus connectionStatus); + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionTypes.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionTypes.java new file mode 100644 index 0000000000..da8d62f91a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionTypes.java @@ -0,0 +1,50 @@ +package org.droidplanner.services.android.impl.core.MAVLink.connection; + +/** + * List the supported mavlink connection types. + */ +public class MavLinkConnectionTypes { + + /** + * Bluetooth mavlink connection. + */ + public static final int MAVLINK_CONNECTION_BLUETOOTH = 3; + + /** + * USP mavlink connection. + */ + public static final int MAVLINK_CONNECTION_USB = 0; + + /** + * UDP mavlink connection. + */ + public static final int MAVLINK_CONNECTION_UDP = 1; + + /** + * TCP mavlink connection. + */ + public static final int MAVLINK_CONNECTION_TCP = 2; + + public static String getConnectionTypeLabel(int connectionType){ + switch(connectionType){ + case MavLinkConnectionTypes.MAVLINK_CONNECTION_BLUETOOTH: + return "bluetooth"; + + case MavLinkConnectionTypes.MAVLINK_CONNECTION_TCP: + return "tcp"; + + case MavLinkConnectionTypes.MAVLINK_CONNECTION_UDP: + return "udp"; + + case MavLinkConnectionTypes.MAVLINK_CONNECTION_USB: + return "usb"; + + default: + return null; + } + } + + // Not instantiable + private MavLinkConnectionTypes() { + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/TcpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/TcpConnection.java new file mode 100644 index 0000000000..c3c4d5357a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/TcpConnection.java @@ -0,0 +1,72 @@ +package org.droidplanner.services.android.impl.core.MAVLink.connection; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; + +/** + * Provides support for mavlink connection via TCP. + */ +public abstract class TcpConnection extends MavLinkConnection { + + private static final int CONNECTION_TIMEOUT = 20 * 1000; // 20 secs in ms + + private Socket socket; + private BufferedOutputStream mavOut; + private BufferedInputStream mavIn; + + private String serverIP; + private int serverPort; + + @Override + public final void openConnection() throws IOException { + getTCPStream(); + onConnectionOpened(); + } + + @Override + public final int readDataBlock(byte[] buffer) throws IOException { + return mavIn.read(buffer); + } + + @Override + public final void sendBuffer(byte[] buffer) throws IOException { + if (mavOut != null) { + mavOut.write(buffer); + mavOut.flush(); + } + } + + @Override + public final void loadPreferences() { + serverIP = loadServerIP(); + serverPort = loadServerPort(); + } + + protected abstract int loadServerPort(); + + protected abstract String loadServerIP(); + + @Override + public final void closeConnection() throws IOException { + if (socket != null) { + socket.close(); + } + } + + private void getTCPStream() throws IOException { + InetAddress serverAddr = InetAddress.getByName(serverIP); + socket = new Socket(); + socket.connect(new InetSocketAddress(serverAddr, serverPort), CONNECTION_TIMEOUT); + mavOut = new BufferedOutputStream((socket.getOutputStream())); + mavIn = new BufferedInputStream(socket.getInputStream()); + } + + @Override + public final int getConnectionType() { + return MavLinkConnectionTypes.MAVLINK_CONNECTION_TCP; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/UdpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/UdpConnection.java new file mode 100644 index 0000000000..d0e4573d9f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/UdpConnection.java @@ -0,0 +1,107 @@ +package org.droidplanner.services.android.impl.core.MAVLink.connection; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Provides support for mavlink connection via udp. + */ +public abstract class UdpConnection extends MavLinkConnection { + + private AtomicReference socketRef = new AtomicReference<>(); + private int serverPort; + + private int hostPort; + private InetAddress hostAdd; + private DatagramPacket sendPacket; + private DatagramPacket receivePacket; + + private void getUdpStream() throws IOException { + final DatagramSocket socket = new DatagramSocket(serverPort); + socket.setBroadcast(true); + socket.setReuseAddress(true); + socketRef.set(socket); + } + + @Override + public final void closeConnection() throws IOException { + final DatagramSocket socket = socketRef.get(); + if (socket != null) { + socket.close(); + } + } + + @Override + public final void openConnection() throws IOException { + getUdpStream(); + onConnectionOpened(); + } + + @Override + public final void sendBuffer(byte[] buffer) throws IOException { + final DatagramSocket socket = socketRef.get(); + if (socket == null) { + return; + } + + try { + if (hostAdd != null) { // We can't send to our sister until they + // have connected to us + if (sendPacket == null) { + sendPacket = new DatagramPacket(buffer, buffer.length, hostAdd, hostPort); + } else { + sendPacket.setData(buffer, 0, buffer.length); + sendPacket.setAddress(hostAdd); + sendPacket.setPort(hostPort); + } + socket.send(sendPacket); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void sendBuffer(InetAddress targetAddr, int targetPort, byte[] buffer) throws IOException { + final DatagramSocket socket = socketRef.get(); + if (socket == null || targetAddr == null || buffer == null) { + return; + } + + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, targetAddr, targetPort); + socket.send(packet); + } + + @Override + public final int readDataBlock(byte[] readData) throws IOException { + final DatagramSocket socket = socketRef.get(); + if (socket == null) { + return 0; + } + + if (receivePacket == null) { + receivePacket = new DatagramPacket(readData, readData.length); + } else { + receivePacket.setData(readData); + } + + socket.receive(receivePacket); + hostAdd = receivePacket.getAddress(); + hostPort = receivePacket.getPort(); + return receivePacket.getLength(); + } + + @Override + public final void loadPreferences() { + serverPort = loadServerPort(); + } + + @Override + public final int getConnectionType() { + return MavLinkConnectionTypes.MAVLINK_CONNECTION_UDP; + } + + protected abstract int loadServerPort(); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java new file mode 100644 index 0000000000..68d26e6a2a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java @@ -0,0 +1,73 @@ +package org.droidplanner.services.android.impl.core.drone; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; + +public class DroneEvents extends DroneVariable { + + private static final long EVENT_DISPATCHING_DELAY = 33l; //milliseconds + + private final AtomicBoolean isDispatcherRunning = new AtomicBoolean(false); + + private final Runnable eventDispatcher = new Runnable() { + + @Override + public void run() { + handler.removeCallbacks(this); + + final DroneEventsType event = eventQueue.poll(); + if (event == null) { + isDispatcherRunning.set(false); + return; + } + + for (OnDroneListener listener : droneListeners) { + listener.onDroneEvent(event, myDrone); + } + + handler.removeCallbacks(this); + handler.postDelayed(this, EVENT_DISPATCHING_DELAY); + + isDispatcherRunning.set(true); + } + }; + + private final Handler handler; + + public DroneEvents(MavLinkDrone myDrone, Handler handler) { + super(myDrone); + this.handler = handler; + } + + private final ConcurrentLinkedQueue droneListeners = new ConcurrentLinkedQueue(); + private final ConcurrentLinkedQueue eventQueue = new ConcurrentLinkedQueue<>(); + + public void addDroneListener(OnDroneListener listener) { + if (listener != null & !droneListeners.contains(listener)) + droneListeners.add(listener); + } + + public void removeDroneListener(OnDroneListener listener) { + if (listener != null && droneListeners.contains(listener)) + droneListeners.remove(listener); + } + + public void removeAllDroneListeners(){ + droneListeners.clear(); + } + + public void notifyDroneEvent(DroneEventsType event) { + if (event == null || droneListeners.isEmpty() || eventQueue.contains(event)) + return; + + eventQueue.add(event); + if (isDispatcherRunning.compareAndSet(false, true)) + handler.postDelayed(eventDispatcher, EVENT_DISPATCHING_DELAY); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java new file mode 100644 index 0000000000..937d260e20 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java @@ -0,0 +1,224 @@ +package org.droidplanner.services.android.impl.core.drone; + +import android.os.Bundle; + +import org.droidplanner.services.android.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.core.drone.autopilot.Drone; +import org.droidplanner.services.android.lib.drone.property.Parameter; + +public class DroneInterfaces { + + /** + * Sets of drone events used for broadcast throughout the app. + */ + public enum DroneEventsType { + /** + * Denotes vehicle altitude change event. + */ + ALTITUDE, + + /** + * + */ + ORIENTATION, + + /** + * Denotes vehicle speed change event. + */ + SPEED, + + /** + * + */ + BATTERY, + + /** + * + */ + GUIDEDPOINT, + + /** + * Denotes vehicle attitude change event. + */ + ATTITUDE, + + /** + * + */ + RADIO, + + /** + * + */ + RC_IN, + + /** + * + */ + RC_OUT, + + /** + * + */ + ARMING, + + /** + * + */ + AUTOPILOT_WARNING, + + /** + * + */ + MODE, + + /** + * + */ + STATE, + + /** + * + */ + MISSION_UPDATE, + + /** + * + */ + MISSION_RECEIVED, + + /** + * + */ + TYPE, + + /** + * + */ + HOME, + + /** + * + */ + CALIBRATION_IMU, + + /** + * + */ + CALIBRATION_TIMEOUT, + + /** + * + */ + HEARTBEAT_TIMEOUT, + + /** + * + */ + HEARTBEAT_FIRST, + + /** + * + */ + HEARTBEAT_RESTORED, + + /** + * + */ + DISCONNECTED, + + /** + * Successful connection event. + */ + CONNECTED, + + /** + * Connection initiated event. + */ + CONNECTING, + + /** + * + */ + MISSION_SENT, + + /** + * + */ + ARMING_STARTED, + + /** + * + */ + INVALID_POLYGON, + + /** + * + */ + MISSION_WP_UPDATE, + + /** + * + */ + WARNING_SIGNAL_WEAK, + /** + * Announces that a new version for the firmware has been received + */ + FIRMWARE, + + /** + * Warn that the drone has no gps signal + */ + WARNING_NO_GPS, + + /** + * New magnetometer data has been received + */ + MAGNETOMETER, + + /** + * The drone camera footprints has been updated + */ + FOOTPRINT, + + /** + * The ekf status was updated. + */ + EKF_STATUS_UPDATE, + + /** + * The horizontal position is ok, and the home position is available. + */ + EKF_POSITION_STATE_UPDATE, + + /** + * A mission item has been reached. + */ + MISSION_WP_REACHED, + } + + public interface OnDroneListener { + public void onDroneEvent(DroneEventsType event, T drone); + } + + public interface AttributeEventListener { + void onAttributeEvent(String attributeEvent, Bundle eventInfo, boolean checkForSololinkApi); + } + + public interface OnParameterManagerListener { + public void onBeginReceivingParameters(); + + public void onParameterReceived(Parameter parameter, int index, int count); + + public void onEndReceivingParameters(); + } + + public interface OnWaypointManagerListener { + public void onBeginWaypointEvent(WaypointManager.WaypointEvent_Type wpEvent); + + public void onWaypointEvent(WaypointManager.WaypointEvent_Type wpEvent, int index, int count); + + public void onEndWaypointEvent(WaypointManager.WaypointEvent_Type wpEvent); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java new file mode 100644 index 0000000000..058a2f79e2 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java @@ -0,0 +1,349 @@ +package org.droidplanner.services.android.impl.core.drone; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; + +import org.droidplanner.services.android.impl.api.DroneApi; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.ArduSolo; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.utils.CommonApiUtils; +import org.droidplanner.services.android.impl.utils.analytics.GAUtils; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.action.GimbalActions; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.connection.ConnectionType; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * Bridge between the communication channel, the drone instance(s), and the connected client(s). + */ +public class DroneManager implements DataLink.DataLinkListener, DroneInterfaces.OnDroneListener, + DroneInterfaces.OnParameterManagerListener, LogMessageListener, DroneInterfaces.AttributeEventListener { + + private static final String TAG = DroneManager.class.getSimpleName(); + + public static final String EXTRA_CLIENT_APP_ID = "extra_client_app_id"; + + private static final int SOLOLINK_API_MIN_VERSION = 20412; + + protected final ConcurrentHashMap connectedApps = new ConcurrentHashMap<>(); + + protected final Context context; + protected final Handler handler; + + protected T drone; + protected final ConnectionParameter connectionParameter; + + public static DroneManager generateDroneManager(Context context, ConnectionParameter connParams, Handler handler) { + switch (connParams.getConnectionType()) { + default: + return new MavLinkDroneManager(context, connParams, handler); + } + } + + protected DroneManager(Context context, ConnectionParameter connParams, Handler handler) { + this.context = context; + this.handler = handler; + this.connectionParameter = connParams; + } + + private void destroyAutopilot() { + if (drone == null) { + return; + } + + drone.destroy(); + drone = null; + } + + public void destroy() { + Log.d(TAG, "Destroying drone manager."); + + disconnect(); + destroyAutopilot(); + + connectedApps.clear(); + + } + + public synchronized void connect(String appId, DroneApi listener) { + if (listener == null || TextUtils.isEmpty(appId)) { + return; + } + + connectedApps.put(appId, listener); + doConnect(appId, listener); + } + + protected void doConnect(String appId, DroneApi listener) { + + } + + private void disconnect() { + if (!connectedApps.isEmpty()) { + for (DroneApi client : connectedApps.values()) { + disconnect(client.getClientInfo()); + } + } + } + + /** + * @return True if we can expect to find a companion computer on the connected channel. + */ + protected boolean isCompanionComputerEnabled() { + final int connectionType = connectionParameter.getConnectionType(); + + return drone instanceof ArduSolo + || + (connectionType == ConnectionType.TYPE_UDP && SoloComp.isAvailable(context) && doAnyListenersSupportSoloLinkApi()) + || + connectionType == ConnectionType.TYPE_SOLO; + + } + + public int getConnectedAppsCount() { + return connectedApps.size(); + } + + public void disconnect(DroneApi.ClientInfo clientInfo) { + String appId = clientInfo.appId; + if (TextUtils.isEmpty(appId)) { + return; + } + + Log.d(TAG, "Disconnecting client " + appId); + DroneApi listener = connectedApps.remove(appId); + + doDisconnect(appId, listener); + } + + protected void doDisconnect(String appId, DroneApi listener) { + if (isConnected() && listener != null) { + listener.onDroneEvent(DroneInterfaces.DroneEventsType.DISCONNECTED, drone); + } + + if (connectedApps.isEmpty()) { + //Reset the gimbal mount mode + executeAsyncAction(null, new Action(GimbalActions.ACTION_RESET_GIMBAL_MOUNT_MODE), null); + } + } + + protected void notifyDroneEvent(DroneInterfaces.DroneEventsType event) { + if (drone != null) { + drone.notifyDroneEvent(event); + } + } + + @Override + public void notifyReceivedData(D data) { + + } + + @Override + public void onConnectionStatus(LinkConnectionStatus connectionStatus) { + switch (connectionStatus.getStatusCode()) { + case LinkConnectionStatus.DISCONNECTED: + notifyDroneEvent(DroneInterfaces.DroneEventsType.DISCONNECTED); + break; + case LinkConnectionStatus.CONNECTED: + // Start a new ga analytics session. The new session will be tagged + // with the mavlink connection mechanism, as well as whether the user has an active droneshare account. + GAUtils.startNewSession(null); + break; + case LinkConnectionStatus.CONNECTING: + notifyDroneEvent(DroneInterfaces.DroneEventsType.CONNECTING); + break; + } + + if (connectedApps.isEmpty()) { + return; + } + + for (DroneApi droneEventsListener : connectedApps.values()) { + droneEventsListener.onConnectionStatus(connectionStatus); + } + } + + public T getDrone() { + return this.drone; + } + + public boolean isConnected() { + return drone != null && drone.isConnected(); + } + + public DroneAttribute getAttribute(DroneApi.ClientInfo clientInfo, String attributeType) { + switch (attributeType) { + default: + return drone == null ? null : drone.getAttribute(attributeType); + } + } + + protected boolean executeAsyncAction(Action action, ICommandListener listener) { + String type = action.getType(); + + switch (type) { + + //***************** CONTROL ACTIONS *****************// + case ControlActions.ACTION_ENABLE_MANUAL_CONTROL: + if (drone != null) { + drone.executeAsyncAction(action, listener); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + return true; + + default: + if (drone != null) { + return drone.executeAsyncAction(action, listener); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + return true; + } + } + } + + public boolean executeAsyncAction(DroneApi.ClientInfo clientInfo, Action action, ICommandListener listener) { + String type = action.getType(); + Bundle data = action.getData(); + + switch (type) { + case ControlActions.ACTION_ENABLE_MANUAL_CONTROL: + data.putString(EXTRA_CLIENT_APP_ID, clientInfo.appId); + break; + } + return executeAsyncAction(action, listener); + } + + protected void notifyDroneAttributeEvent(String attributeEvent, Bundle eventInfo) { + notifyDroneAttributeEvent(attributeEvent, eventInfo, false); + } + + /** + * Temporary delegate to prevent sending of newly defined payload to older version of the api + * #FIXME: remove when old version of the api is phased out. + * + * @param attributeEvent + * @param eventInfo + * @param checkForSoloLinkApi + */ + private void notifyDroneAttributeEvent(String attributeEvent, Bundle eventInfo, boolean checkForSoloLinkApi) { + if (TextUtils.isEmpty(attributeEvent) || connectedApps.isEmpty()) { + return; + } + + for (DroneApi listener : connectedApps.values()) { + if (checkForSoloLinkApi && !supportSoloLinkApi(listener)) { + continue; + } + listener.onAttributeEvent(attributeEvent, eventInfo, checkForSoloLinkApi); + } + } + + private boolean supportSoloLinkApi(DroneApi listener) { + return listener != null && listener.getClientInfo().apiVersionCode >= SOLOLINK_API_MIN_VERSION; + } + + /** + * FIXME: remove when android solo v2 is released. + * + * @return + */ + private boolean doAnyListenersSupportSoloLinkApi() { + if (connectedApps.isEmpty()) { + return false; + } + + for (DroneApi listener : connectedApps.values()) { + if (supportSoloLinkApi(listener)) { + return true; + } + } + + return false; + } + + @Override + public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { + switch (event) { + case HEARTBEAT_FIRST: + case CONNECTED: + event = DroneInterfaces.DroneEventsType.CONNECTED; + break; + } + + if (connectedApps.isEmpty()) { + return; + } + + for (DroneApi droneEventsListener : connectedApps.values()) { + droneEventsListener.onDroneEvent(event, drone); + } + } + + @Override + public void onBeginReceivingParameters() { + if (connectedApps.isEmpty()) { + return; + } + + for (DroneApi droneEventsListener : connectedApps.values()) { + droneEventsListener.onBeginReceivingParameters(); + } + } + + @Override + public void onParameterReceived(Parameter parameter, int index, int count) { + if (connectedApps.isEmpty()) { + return; + } + + for (DroneApi droneEventsListener : connectedApps.values()) { + droneEventsListener.onParameterReceived(parameter, index, count); + } + } + + @Override + public void onEndReceivingParameters() { + if (connectedApps.isEmpty()) { + return; + } + + for (DroneApi droneEventsListener : connectedApps.values()) { + droneEventsListener.onEndReceivingParameters(); + } + } + + public ConnectionParameter getConnectionParameter() { + return connectionParameter; + } + + @Override + public void onMessageLogged(int logLevel, String message) { + if (connectedApps.isEmpty()) { + return; + } + + for (DroneApi listener : connectedApps.values()) { + listener.onMessageLogged(logLevel, message); + } + } + + @Override + public void onAttributeEvent(String attributeEvent, Bundle eventInfo, boolean checkForSololinkApi) { + notifyDroneAttributeEvent(attributeEvent, eventInfo, checkForSololinkApi); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java new file mode 100644 index 0000000000..4adb396a20 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java @@ -0,0 +1,78 @@ +package org.droidplanner.services.android.impl.core.drone; + +import android.os.Handler; +import android.os.RemoteException; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.model.ICommandListener; + +import timber.log.Timber; + +public class DroneVariable { + protected T myDrone; + + public DroneVariable(T myDrone) { + this.myDrone = myDrone; + } + + /** + * Convenience method to post a success event to the listener. + * @param handler Use to dispatch the event + * @param listener To whom the event is dispatched. + */ + protected void postSuccessEvent(Handler handler, final ICommandListener listener){ + if(handler != null && listener != null){ + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + /** + * Convenience method to post an error event to the listener. + * @param handler Use to dispatch the event + * @param listener To whom the event is dispatched. + * @param error Execution error. + */ + protected void postErrorEvent(Handler handler, final ICommandListener listener, final int error){ + if(handler != null && listener != null){ + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onError(error); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + /** + * Convenience method to post a timeout event to the listener. + * @param handler Use to dispatch the event + * @param listener To whom the event is dispatched. + */ + protected void postTimeoutEvent(Handler handler, final ICommandListener listener){ + if(handler != null && listener != null){ + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/LogMessageListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/LogMessageListener.java new file mode 100644 index 0000000000..09e2fa69c1 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/LogMessageListener.java @@ -0,0 +1,9 @@ +package org.droidplanner.services.android.impl.core.drone; + +/** + * Created by Fredia Huya-Kouadio on 3/23/15. + */ +public interface LogMessageListener { + + void onMessageLogged(int logLevel, String message); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java new file mode 100644 index 0000000000..3854c7d486 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java @@ -0,0 +1,12 @@ +package org.droidplanner.services.android.impl.core.drone; + +import org.droidplanner.services.android.core.drone.profiles.VehicleProfile; +import org.droidplanner.services.android.core.drone.variables.StreamRates; +import org.droidplanner.services.android.core.firmware.FirmwareType; + +public interface Preferences { + + public abstract VehicleProfile loadVehicleProfile(FirmwareType firmwareType); + + public StreamRates.Rates getRates(); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java new file mode 100644 index 0000000000..3d28f74a3c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java @@ -0,0 +1,35 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot; + +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; + +/** + * Created by Fredia Huya-Kouadio on 7/27/15. + */ +public interface Drone { + + /** + * Gets the vehicle id. + * The format used for the vehicle id is autopilot specific. + * @return Vehicle id + */ + String getId(); + + boolean isConnected(); + + DroneAttribute getAttribute(String attributeType); + + boolean executeAsyncAction(Action action, ICommandListener listener); + + void setAttributeListener(DroneInterfaces.AttributeEventListener listener); + + void destroy(); + + void addDroneListener(DroneInterfaces.OnDroneListener listener); + + void removeDroneListener(DroneInterfaces.OnDroneListener listener); + + void notifyDroneEvent(DroneInterfaces.DroneEventsType event); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java new file mode 100644 index 0000000000..ad99a90b75 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java @@ -0,0 +1,62 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot; + +import com.MAVLink.Messages.MAVLinkMessage; + +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.core.drone.variables.Camera; +import org.droidplanner.services.android.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.core.drone.variables.MissionStats; +import org.droidplanner.services.android.core.drone.variables.State; +import org.droidplanner.services.android.core.drone.variables.StreamRates; +import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.mission.Mission; + +public interface MavLinkDrone extends Drone { + + String PACKAGE_NAME = "org.droidplanner.services.android.core.drone.autopilot"; + + String ACTION_REQUEST_HOME_UPDATE = PACKAGE_NAME + ".action.REQUEST_HOME_UPDATE"; + + boolean isConnectionAlive(); + + int getMavlinkVersion(); + + void onMavLinkMessageReceived(MAVLinkMessage message); + + public byte getSysid(); + + public byte getCompid(); + + public State getState(); + + public ParameterManager getParameterManager(); + + public int getType(); + + public FirmwareType getFirmwareType(); + + public DataLink.DataLinkProvider getMavClient(); + + public WaypointManager getWaypointManager(); + + public Mission getMission(); + + public StreamRates getStreamRates(); + + public MissionStats getMissionStats(); + + public GuidedPoint getGuidedPoint(); + + public AccelCalibration getCalibrationSetup(); + + public MagnetometerCalibrationImpl getMagnetometerCalibration(); + + public String getFirmwareVersion(); + + public Camera getCamera(); + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/APMConstants.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/APMConstants.java new file mode 100644 index 0000000000..7c1bdeda2d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/APMConstants.java @@ -0,0 +1,27 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm; + +/** + * Set of APM autopilots related constants. + * Created by Fredia Huya-Kouadio on 7/28/15. + */ +public class APMConstants { + + /** + * Index of the home waypoint within a mission items list. + */ + public static final int HOME_WAYPOINT_INDEX = 0; + + //Private to prevent instantiation + private APMConstants(){} + + /** + * Severity levels used in STATUSTEXT messages + */ + public static class Severity { + public static final int SEVERITY_LOW= 1; + public static final int SEVERITY_MEDIUM = 2; + public static final int SEVERITY_HIGH = 3; + public static final int SEVERITY_CRITICAL = 4; + public static final int SEVERITY_USER_RESPONSE = 5; + }; +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java new file mode 100644 index 0000000000..231ab8c526 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java @@ -0,0 +1,162 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.github.zafarkhaja.semver.Version; + +import org.droidplanner.android.client.apis.CapabilityApi; +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.DroneManager; +import org.droidplanner.services.android.core.drone.LogMessageListener; +import org.droidplanner.services.android.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.core.drone.variables.ApmModes; +import org.droidplanner.services.android.core.drone.variables.State; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.utils.CommonApiUtils; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * Created by Fredia Huya-Kouadio on 7/27/15. + */ +public class ArduCopter extends ArduPilot { + private static final Version BRAKE_FEATURE_FIRMWARE_VERSION = Version.forIntegers(3, 3, 0); + + private final ConcurrentHashMap manualControlStateListeners = new ConcurrentHashMap<>(); + + public ArduCopter(String droneId, Context context, DataLink.DataLinkProvider mavClient, Handler handler, AutopilotWarningParser warningParser, LogMessageListener logListener) { + super(droneId, context, mavClient, handler, warningParser, logListener); + } + + @Override + public FirmwareType getFirmwareType() { + return FirmwareType.ARDU_COPTER; + } + + @Override + protected boolean setVelocity(Bundle data, ICommandListener listener){ + //Retrieve the normalized values + float normalizedXVel = data.getFloat(ControlActions.EXTRA_VELOCITY_X); + float normalizedYVel = data.getFloat(ControlActions.EXTRA_VELOCITY_Y); + float normalizedZVel = data.getFloat(ControlActions.EXTRA_VELOCITY_Z); + + double attitudeInRad = Math.toRadians(attitude.getYaw()); + + final double cosAttitude = Math.cos(attitudeInRad); + final double sinAttitude = Math.sin(attitudeInRad); + + float projectedX = (float) (normalizedXVel * cosAttitude) - (float) (normalizedYVel * sinAttitude); + float projectedY = (float) (normalizedXVel * sinAttitude) + (float) (normalizedYVel * cosAttitude); + + //Retrieve the speed parameters. + float defaultSpeed = 5; //m/s + + ParameterManager parameterManager = getParameterManager(); + + //Retrieve the horizontal speed value + Parameter horizSpeedParam = parameterManager.getParameter("WPNAV_SPEED"); + double horizontalSpeed = horizSpeedParam == null ? defaultSpeed : horizSpeedParam.getValue() / 100; + + //Retrieve the vertical speed value. + String vertSpeedParamName = normalizedZVel >= 0 ? "WPNAV_SPEED_UP" : "WPNAV_SPEED_DN"; + Parameter vertSpeedParam = parameterManager.getParameter(vertSpeedParamName); + double verticalSpeed = vertSpeedParam == null ? defaultSpeed : vertSpeedParam.getValue() / 100; + + MavLinkCommands.setVelocityInLocalFrame(this, (float) (projectedX * horizontalSpeed), + (float) (projectedY * horizontalSpeed), + (float) (normalizedZVel * verticalSpeed), + listener); + return true; + } + + @Override + public void destroy(){ + super.destroy(); + manualControlStateListeners.clear(); + } + + @Override + protected boolean enableManualControl(Bundle data, ICommandListener listener){ + boolean enable = data.getBoolean(ControlActions.EXTRA_DO_ENABLE); + String appId = data.getString(DroneManager.EXTRA_CLIENT_APP_ID); + + State state = getState(); + ApmModes vehicleMode = state.getMode(); + if(enable){ + if(vehicleMode == ApmModes.ROTOR_GUIDED){ + CommonApiUtils.postSuccessEvent(listener); + } + else{ + state.changeFlightMode(ApmModes.ROTOR_GUIDED, listener); + } + + if(listener != null) { + manualControlStateListeners.put(appId, listener); + } + } + else{ + manualControlStateListeners.remove(appId); + + if(vehicleMode != ApmModes.ROTOR_GUIDED){ + CommonApiUtils.postSuccessEvent(listener); + } + else{ + state.changeFlightMode(ApmModes.ROTOR_LOITER, listener); + } + } + + return true; + } + + @Override + public void notifyDroneEvent(DroneInterfaces.DroneEventsType event){ + switch(event){ + case MODE: + //Listen for vehicle mode updates, and update the manual control state listeners appropriately + ApmModes currentMode = getState().getMode(); + for(ICommandListener listener: manualControlStateListeners.values()) { + if (currentMode == ApmModes.ROTOR_GUIDED) { + CommonApiUtils.postSuccessEvent(listener); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + } + break; + } + + super.notifyDroneEvent(event); + } + + @Override + protected boolean isFeatureSupported(String featureId){ + switch(featureId){ + + case CapabilityApi.FeatureIds.KILL_SWITCH: + return CommonApiUtils.isKillSwitchSupported(this); + + default: + return super.isFeatureSupported(featureId); + } + } + + @Override + protected boolean brakeVehicle(ICommandListener listener) { + if (getFirmwareVersionNumber().greaterThanOrEqualTo(BRAKE_FEATURE_FIRMWARE_VERSION)) { + getState().changeFlightMode(ApmModes.ROTOR_BRAKE, listener); + } else { + super.brakeVehicle(listener); + } + + return true; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java new file mode 100644 index 0000000000..118d12c439 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java @@ -0,0 +1,603 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.ardupilotmega.msg_camera_feedback; +import com.MAVLink.ardupilotmega.msg_mag_cal_progress; +import com.MAVLink.ardupilotmega.msg_mag_cal_report; +import com.MAVLink.ardupilotmega.msg_mount_configure; +import com.MAVLink.ardupilotmega.msg_mount_status; +import com.MAVLink.ardupilotmega.msg_radio; +import com.MAVLink.common.msg_named_value_int; +import com.MAVLink.common.msg_raw_imu; +import com.MAVLink.common.msg_rc_channels_raw; +import com.MAVLink.common.msg_servo_output_raw; +import com.MAVLink.common.msg_statustext; +import com.MAVLink.common.msg_sys_status; +import com.MAVLink.common.msg_vfr_hud; +import com.MAVLink.enums.MAV_MOUNT_MODE; +import com.MAVLink.enums.MAV_SYS_STATUS_SENSOR; +import com.github.zafarkhaja.semver.Version; + +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; +import org.droidplanner.services.android.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.LogMessageListener; +import org.droidplanner.services.android.core.drone.autopilot.apm.variables.APMHeartBeat; +import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.core.drone.variables.ApmModes; +import org.droidplanner.services.android.core.drone.variables.Camera; +import org.droidplanner.services.android.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.core.drone.variables.HeartBeat; +import org.droidplanner.services.android.core.drone.variables.Magnetometer; +import org.droidplanner.services.android.core.drone.variables.RC; +import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; +import org.droidplanner.services.android.lib.drone.action.GimbalActions; +import org.droidplanner.services.android.lib.drone.action.ParameterActions; +import org.droidplanner.services.android.lib.drone.action.StateActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.services.android.lib.gcs.action.CalibrationActions; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; +import org.droidplanner.services.android.utils.CommonApiUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import timber.log.Timber; + +/** + * Base class for the ArduPilot autopilots + */ +public abstract class ArduPilot extends GenericMavLinkDrone { + public static final int AUTOPILOT_COMPONENT_ID = 1; + public static final int ARTOO_COMPONENT_ID = 0; + public static final int TELEMETRY_RADIO_COMPONENT_ID = 68; + + public static final String FIRMWARE_VERSION_NUMBER_REGEX = "\\d+(\\.\\d{1,2})?"; + + private final org.droidplanner.services.android.core.drone.variables.RC rc; + private final Mission mission; + private final GuidedPoint guidedPoint; + private final AccelCalibration accelCalibrationSetup; + private final WaypointManager waypointManager; + private final Magnetometer mag; + private final Camera footprints; + + private final MagnetometerCalibrationImpl magCalibration; + + protected Version firmwareVersionNumber = Version.forIntegers(0, 0, 0); + + public ArduPilot(String droneId, Context context, DataLink.DataLinkProvider mavClient, + Handler handler, AutopilotWarningParser warningParser, + LogMessageListener logListener) { + + super(droneId, context, handler, mavClient, warningParser, logListener); + + this.waypointManager = new WaypointManager(this, handler); + + rc = new RC(this); + this.mission = new Mission(this); + this.guidedPoint = new GuidedPoint(this, handler); + this.accelCalibrationSetup = new AccelCalibration(this, handler); + this.magCalibration = new MagnetometerCalibrationImpl(this); + this.mag = new Magnetometer(this); + this.footprints = new Camera(this); + } + + @Override + protected HeartBeat initHeartBeat(Handler handler) { + return new APMHeartBeat(this, handler); + } + + protected void setAltitudeGroundAndAirSpeeds(double altitude, double groundSpeed, double airSpeed, double climb) { + if (this.altitude.getAltitude() != altitude) { + this.altitude.setAltitude(altitude); + notifyDroneEvent(DroneInterfaces.DroneEventsType.ALTITUDE); + } + + if (speed.getGroundSpeed() != groundSpeed || speed.getAirSpeed() != airSpeed || speed.getVerticalSpeed() != climb) { + speed.setGroundSpeed(groundSpeed); + speed.setAirSpeed(airSpeed); + speed.setVerticalSpeed(climb); + + notifyDroneEvent(DroneInterfaces.DroneEventsType.SPEED); + } + } + + @Override + public WaypointManager getWaypointManager() { + return waypointManager; + } + + @Override + public Mission getMission() { + return mission; + } + + @Override + public GuidedPoint getGuidedPoint() { + return guidedPoint; + } + + @Override + public AccelCalibration getCalibrationSetup() { + return accelCalibrationSetup; + } + + @Override + public MagnetometerCalibrationImpl getMagnetometerCalibration() { + return magCalibration; + } + + public Camera getCamera() { + return footprints; + } + + @Override + public DroneAttribute getAttribute(String attributeType) { + if (!TextUtils.isEmpty(attributeType)) { + switch (attributeType) { + + case AttributeType.MISSION: + return CommonApiUtils.getMission(this); + + case AttributeType.GUIDED_STATE: + return CommonApiUtils.getGuidedState(this); + + case AttributeType.MAGNETOMETER_CALIBRATION_STATUS: + return CommonApiUtils.getMagnetometerCalibrationStatus(this); + } + } + + return super.getAttribute(attributeType); + } + + @Override + public boolean executeAsyncAction(Action action, final ICommandListener listener) { + String type = action.getType(); + Bundle data = action.getData(); + if (data == null) { + data = new Bundle(); + } + + switch (type) { + // MISSION ACTIONS + case MissionActions.ACTION_LOAD_WAYPOINTS: + CommonApiUtils.loadWaypoints(this); + return true; + + case MissionActions.ACTION_SET_MISSION: + data.setClassLoader(org.droidplanner.services.android.lib.drone.mission.Mission.class.getClassLoader()); + org.droidplanner.services.android.lib.drone.mission.Mission mission = data.getParcelable(MissionActions.EXTRA_MISSION); + boolean pushToDrone = data.getBoolean(MissionActions.EXTRA_PUSH_TO_DRONE); + CommonApiUtils.setMission(this, mission, pushToDrone); + return true; + + case MissionActions.ACTION_START_MISSION: + boolean forceModeChange = data.getBoolean(MissionActions.EXTRA_FORCE_MODE_CHANGE); + boolean forceArm = data.getBoolean(MissionActions.EXTRA_FORCE_ARM); + CommonApiUtils.startMission(this, forceModeChange, forceArm, listener); + return true; + + // EXPERIMENTAL ACTIONS + case ExperimentalActions.ACTION_EPM_COMMAND: + boolean release = data.getBoolean(ExperimentalActions.EXTRA_EPM_RELEASE); + CommonApiUtils.epmCommand(this, release, listener); + return true; + + case ExperimentalActions.ACTION_TRIGGER_CAMERA: + CommonApiUtils.triggerCamera(this); + return true; + + case ExperimentalActions.ACTION_SET_ROI: + LatLongAlt roi = data.getParcelable(ExperimentalActions.EXTRA_SET_ROI_LAT_LONG_ALT); + if (roi != null) { + MavLinkDoCmds.setROI(this, roi, listener); + } + return true; + + case ExperimentalActions.ACTION_SET_RELAY: + int relayNumber = data.getInt(ExperimentalActions.EXTRA_RELAY_NUMBER); + boolean isOn = data.getBoolean(ExperimentalActions.EXTRA_IS_RELAY_ON); + MavLinkDoCmds.setRelay(this, relayNumber, isOn, listener); + return true; + + case ExperimentalActions.ACTION_SET_SERVO: + int channel = data.getInt(ExperimentalActions.EXTRA_SERVO_CHANNEL); + int pwm = data.getInt(ExperimentalActions.EXTRA_SERVO_PWM); + MavLinkDoCmds.setServo(this, channel, pwm, listener); + return true; + + // CONTROL ACTIONS + case ControlActions.ACTION_SEND_GUIDED_POINT: { + data.setClassLoader(LatLong.class.getClassLoader()); + boolean force = data.getBoolean(ControlActions.EXTRA_FORCE_GUIDED_POINT); + LatLong guidedPoint = data.getParcelable(ControlActions.EXTRA_GUIDED_POINT); + CommonApiUtils.sendGuidedPoint(this, guidedPoint, force, listener); + return true; + } + + case ControlActions.ACTION_LOOK_AT_TARGET: + boolean force = data.getBoolean(ControlActions.EXTRA_FORCE_GUIDED_POINT); + LatLongAlt lookAtTarget = data.getParcelable(ControlActions.EXTRA_LOOK_AT_TARGET); + CommonApiUtils.sendLookAtTarget(this, lookAtTarget, force, listener); + return true; + + case ControlActions.ACTION_SET_GUIDED_ALTITUDE: + double guidedAltitude = data.getDouble(ControlActions.EXTRA_ALTITUDE); + CommonApiUtils.setGuidedAltitude(this, guidedAltitude); + return true; + + // PARAMETER ACTIONS + case ParameterActions.ACTION_REFRESH_PARAMETERS: + CommonApiUtils.refreshParameters(this); + return true; + + case ParameterActions.ACTION_WRITE_PARAMETERS: + data.setClassLoader(org.droidplanner.services.android.lib.drone.property.Parameters.class.getClassLoader()); + org.droidplanner.services.android.lib.drone.property.Parameters parameters = data.getParcelable(ParameterActions.EXTRA_PARAMETERS); + CommonApiUtils.writeParameters(this, parameters); + return true; + + // DRONE STATE ACTIONS + case StateActions.ACTION_SET_VEHICLE_HOME: + LatLongAlt homeLoc = data.getParcelable(StateActions.EXTRA_VEHICLE_HOME_LOCATION); + if (homeLoc != null) { + MavLinkDoCmds.setVehicleHome(this, homeLoc, new AbstractCommandListener() { + @Override + public void onSuccess() { + CommonApiUtils.postSuccessEvent(listener); + requestHomeUpdate(); + } + + @Override + public void onError(int executionError) { + CommonApiUtils.postErrorEvent(executionError, listener); + requestHomeUpdate(); + } + + @Override + public void onTimeout() { + CommonApiUtils.postTimeoutEvent(listener); + requestHomeUpdate(); + } + }); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + return true; + + //CALIBRATION ACTIONS + case CalibrationActions.ACTION_START_IMU_CALIBRATION: + CommonApiUtils.startIMUCalibration(this, listener); + return true; + + case CalibrationActions.ACTION_SEND_IMU_CALIBRATION_ACK: + int imuAck = data.getInt(CalibrationActions.EXTRA_IMU_STEP); + CommonApiUtils.sendIMUCalibrationAck(this, imuAck); + return true; + + case CalibrationActions.ACTION_START_MAGNETOMETER_CALIBRATION: + boolean retryOnFailure = data.getBoolean(CalibrationActions.EXTRA_RETRY_ON_FAILURE, false); + boolean saveAutomatically = data.getBoolean(CalibrationActions.EXTRA_SAVE_AUTOMATICALLY, true); + int startDelay = data.getInt(CalibrationActions.EXTRA_START_DELAY, 0); + CommonApiUtils.startMagnetometerCalibration(this, retryOnFailure, saveAutomatically, startDelay); + return true; + + case CalibrationActions.ACTION_CANCEL_MAGNETOMETER_CALIBRATION: + CommonApiUtils.cancelMagnetometerCalibration(this); + return true; + + case CalibrationActions.ACTION_ACCEPT_MAGNETOMETER_CALIBRATION: + CommonApiUtils.acceptMagnetometerCalibration(this); + return true; + + //************ Gimbal ACTIONS *************// + case GimbalActions.ACTION_SET_GIMBAL_ORIENTATION: + float pitch = data.getFloat(GimbalActions.GIMBAL_PITCH); + float roll = data.getFloat(GimbalActions.GIMBAL_ROLL); + float yaw = data.getFloat(GimbalActions.GIMBAL_YAW); + MavLinkDoCmds.setGimbalOrientation(this, pitch, roll, yaw, listener); + return true; + + case GimbalActions.ACTION_RESET_GIMBAL_MOUNT_MODE: + case GimbalActions.ACTION_SET_GIMBAL_MOUNT_MODE: + int mountMode = data.getInt(GimbalActions.GIMBAL_MOUNT_MODE, MAV_MOUNT_MODE.MAV_MOUNT_MODE_RC_TARGETING); + Timber.i("Setting gimbal mount mode: %d", mountMode); + + Parameter mountParam = getParameterManager().getParameter("MNT_MODE"); + if (mountParam == null) { + msg_mount_configure msg = new msg_mount_configure(); + msg.target_system = getSysid(); + msg.target_component = getCompid(); + msg.mount_mode = (byte) mountMode; + msg.stab_pitch = 0; + msg.stab_roll = 0; + msg.stab_yaw = 0; + getMavClient().sendMessage(msg, listener); + } else { + MavLinkParameters.sendParameter(this, "MNT_MODE", 1, mountMode); + } + return true; + + default: + return super.executeAsyncAction(action, listener); + } + } + + @Override + protected boolean enableManualControl(Bundle data, ICommandListener listener) { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return true; + } + + @Override + protected boolean performArming(Bundle data, ICommandListener listener) { + boolean doArm = data.getBoolean(StateActions.EXTRA_ARM); + boolean emergencyDisarm = data.getBoolean(StateActions.EXTRA_EMERGENCY_DISARM); + CommonApiUtils.arm(this, doArm, emergencyDisarm, listener); + return true; + } + + @Override + protected boolean setVehicleMode(Bundle data, ICommandListener listener) { + data.setClassLoader(VehicleMode.class.getClassLoader()); + VehicleMode newMode = data.getParcelable(StateActions.EXTRA_VEHICLE_MODE); + CommonApiUtils.changeVehicleMode(this, newMode, listener); + return true; + } + + @Override + protected boolean setVelocity(Bundle data, ICommandListener listener) { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return true; + } + + @Override + protected boolean performTakeoff(Bundle data, ICommandListener listener) { + double takeoffAltitude = data.getDouble(ControlActions.EXTRA_ALTITUDE); + CommonApiUtils.doGuidedTakeoff(this, takeoffAltitude, listener); + return true; + } + + @Override + public void onMavLinkMessageReceived(MAVLinkMessage message) { + int compId = message.compid; + if (compId != AUTOPILOT_COMPONENT_ID + && compId != ARTOO_COMPONENT_ID + && compId != TELEMETRY_RADIO_COMPONENT_ID) { + return; + } + + if (!getParameterManager().processMessage(message)) { + + getWaypointManager().processMessage(message); + getCalibrationSetup().processMessage(message); + + switch (message.msgid) { + + case msg_statustext.MAVLINK_MSG_ID_STATUSTEXT: + // These are any warnings sent from APM:Copter with + // gcs_send_text_P() + // This includes important thing like arm fails, prearm fails, low + // battery, etc. + // also less important things like "erasing logs" and + // "calibrating barometer" + msg_statustext msg_statustext = (msg_statustext) message; + processStatusText(msg_statustext); + break; + + case msg_vfr_hud.MAVLINK_MSG_ID_VFR_HUD: + processVfrHud((msg_vfr_hud) message); + break; + + case msg_raw_imu.MAVLINK_MSG_ID_RAW_IMU: + msg_raw_imu msg_imu = (msg_raw_imu) message; + mag.newData(msg_imu); + break; + + case msg_radio.MAVLINK_MSG_ID_RADIO: + msg_radio m_radio = (msg_radio) message; + processSignalUpdate(m_radio.rxerrors, m_radio.fixed, m_radio.rssi, + m_radio.remrssi, m_radio.txbuf, m_radio.noise, m_radio.remnoise); + break; + + case msg_rc_channels_raw.MAVLINK_MSG_ID_RC_CHANNELS_RAW: + rc.setRcInputValues((msg_rc_channels_raw) message); + break; + + case msg_servo_output_raw.MAVLINK_MSG_ID_SERVO_OUTPUT_RAW: + rc.setRcOutputValues((msg_servo_output_raw) message); + break; + + case msg_camera_feedback.MAVLINK_MSG_ID_CAMERA_FEEDBACK: + getCamera().newImageLocation((msg_camera_feedback) message); + break; + + case msg_mount_status.MAVLINK_MSG_ID_MOUNT_STATUS: + processMountStatus((msg_mount_status) message); + break; + + case msg_named_value_int.MAVLINK_MSG_ID_NAMED_VALUE_INT: + processNamedValueInt((msg_named_value_int) message); + break; + + //*************** Magnetometer calibration messages handling *************// + case msg_mag_cal_progress.MAVLINK_MSG_ID_MAG_CAL_PROGRESS: + case msg_mag_cal_report.MAVLINK_MSG_ID_MAG_CAL_REPORT: + getMagnetometerCalibration().processCalibrationMessage(message); + break; + + default: + break; + } + } + + super.onMavLinkMessageReceived(message); + } + + @Override + protected void processSysStatus(msg_sys_status m_sys) { + super.processSysStatus(m_sys); + checkControlSensorsHealth(m_sys); + } + + @Override + protected final void setFirmwareVersion(String message) { + super.setFirmwareVersion(message); + setFirmwareVersionNumber(message); + } + + protected Version getFirmwareVersionNumber() { + return firmwareVersionNumber; + } + + private void setFirmwareVersionNumber(String message) { + firmwareVersionNumber = extractVersionNumber(message); + } + + protected static Version extractVersionNumber(String firmwareVersion) { + Version version = Version.forIntegers(0, 0, 0); + + Pattern pattern = Pattern.compile(FIRMWARE_VERSION_NUMBER_REGEX); + Matcher matcher = pattern.matcher(firmwareVersion); + if (matcher.find()) { + String versionNumber = matcher.group(0) + ".0"; // Adding a default patch version number for successful parsing. + + try { + version = Version.valueOf(versionNumber); + } catch (Exception e){ + Timber.e(e, "Firmware version invalid"); + } + } + + return version; + } + + private void checkControlSensorsHealth(msg_sys_status sysStatus) { + boolean isRCFailsafe = (sysStatus.onboard_control_sensors_health & MAV_SYS_STATUS_SENSOR + .MAV_SYS_STATUS_SENSOR_RC_RECEIVER) == 0; + if (isRCFailsafe) { + getState().parseAutopilotError("RC FAILSAFE"); + } + } + + protected void processVfrHud(msg_vfr_hud vfrHud) { + if (vfrHud == null) + return; + + setAltitudeGroundAndAirSpeeds(vfrHud.alt, vfrHud.groundspeed, vfrHud.airspeed, vfrHud.climb); + } + + protected void processMountStatus(msg_mount_status mountStatus) { + footprints.updateMountOrientation(mountStatus); + + Bundle eventInfo = new Bundle(3); + eventInfo.putFloat(AttributeEventExtra.EXTRA_GIMBAL_ORIENTATION_PITCH, mountStatus.pointing_a / 100f); + eventInfo.putFloat(AttributeEventExtra.EXTRA_GIMBAL_ORIENTATION_ROLL, mountStatus.pointing_b / 100f); + eventInfo.putFloat(AttributeEventExtra.EXTRA_GIMBAL_ORIENTATION_YAW, mountStatus.pointing_c / 100f); + notifyAttributeListener(AttributeEvent.GIMBAL_ORIENTATION_UPDATED, eventInfo); + } + + private void processNamedValueInt(msg_named_value_int message) { + if (message == null) + return; + + switch (message.getName()) { + case "ARMMASK": + //Give information about the vehicle's ability to arm successfully. + ApmModes vehicleMode = getState().getMode(); + if (ApmModes.isCopter(vehicleMode.getType())) { + int value = message.value; + boolean isReadyToArm = (value & (1 << vehicleMode.getNumber())) != 0; + String armReadinessMsg = isReadyToArm ? "READY TO ARM" : "UNREADY FOR ARMING"; + logMessage(Log.INFO, armReadinessMsg); + } + break; + } + } + + protected void processStatusText(msg_statustext statusText) { + String message = statusText.getText(); + if (TextUtils.isEmpty(message)) + return; + + if (message.startsWith("ArduCopter") || message.startsWith("ArduPlane") + || message.startsWith("ArduRover") || message.startsWith("Solo") + || message.startsWith("APM:Copter") || message.startsWith("APM:Plane") + || message.startsWith("APM:Rover")) { + setFirmwareVersion(message); + } else { + + //Try parsing as an error. + if (!getState().parseAutopilotError(message)) { + + //Relay to the connected client. + int logLevel; + switch (statusText.severity) { + case APMConstants.Severity.SEVERITY_CRITICAL: + logLevel = Log.ERROR; + break; + + case APMConstants.Severity.SEVERITY_HIGH: + logLevel = Log.WARN; + break; + + case APMConstants.Severity.SEVERITY_MEDIUM: + logLevel = Log.INFO; + break; + + default: + case APMConstants.Severity.SEVERITY_LOW: + logLevel = Log.VERBOSE; + break; + + case APMConstants.Severity.SEVERITY_USER_RESPONSE: + logLevel = Log.DEBUG; + break; + } + + logMessage(logLevel, message); + } + } + } + + public Double getBattDischarge(double battRemain) { + Parameter battCap = getParameterManager().getParameter("BATT_CAPACITY"); + if (battCap == null || battRemain == -1) { + return null; + } + return (1 - battRemain / 100.0) * battCap.getValue(); + } + + @Override + protected void processBatteryUpdate(double voltage, double remain, double current) { + if (battery.getBatteryRemain() != remain) { + battery.setBatteryDischarge(getBattDischarge(remain)); + } + super.processBatteryUpdate(voltage, remain, current); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java new file mode 100644 index 0000000000..812f577a24 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java @@ -0,0 +1,65 @@ +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 org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.drone.LogMessageListener; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; + +/** + * Created by Fredia Huya-Kouadio on 7/27/15. + */ +public class ArduPlane extends ArduPilot { + + public ArduPlane(String droneId, Context context, DataLink.DataLinkProvider 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); + } + + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java new file mode 100644 index 0000000000..24c76f0c6e --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java @@ -0,0 +1,35 @@ +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.enums.MAV_TYPE; + +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.drone.LogMessageListener; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; + +/** + * Created by Fredia Huya-Kouadio on 7/27/15. + */ +public class ArduRover extends ArduPilot { + + public ArduRover(String droneId, Context context, DataLink.DataLinkProvider mavClient, Handler handler, AutopilotWarningParser warningParser, LogMessageListener logListener) { + super(droneId, context, mavClient, handler, warningParser, logListener); + } + + @Override + public int getType(){ + return MAV_TYPE.MAV_TYPE_GROUND_ROVER; + } + + @Override + public void setType(int type){} + + @Override + public FirmwareType getFirmwareType() { + return FirmwareType.ARDU_ROVER; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java new file mode 100644 index 0000000000..f0542dfebe --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java @@ -0,0 +1,206 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo; + +import android.content.Context; +import android.os.Handler; +import android.os.RemoteException; +import android.text.TextUtils; + +import org.droidplanner.android.client.utils.connection.AbstractIpConnection; +import org.droidplanner.android.client.utils.connection.IpConnectionListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.utils.connection.SshConnection; + +import java.io.IOException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +/** + * Created by Fredia Huya-Kouadio on 2/20/15. + */ +public abstract class AbstractLinkManager implements IpConnectionListener { + + protected static final String SOLO_MAC_ADDRESS_COMMAND = "/sbin/ifconfig wlan0 | awk '/HWaddr/ {print $NF}'"; + + protected static final long RECONNECT_COUNTDOWN = 1000l; //ms + + public abstract void refreshState(); + + public interface LinkListener { + void onLinkConnected(); + + void onLinkDisconnected(); + + void onVersionsUpdated(); + + void onMacAddressUpdated(); + } + + private final Runnable reconnectTask = new Runnable() { + @Override + public void run() { + handler.removeCallbacks(reconnectTask); + linkConn.connect(); + } + }; + + private final Runnable macAddressRetriever = new Runnable() { + @Override + public void run() { + try{ + final String response = getSshLink().execute(SOLO_MAC_ADDRESS_COMMAND); + final String trimmedResponse = TextUtils.isEmpty(response) ? "" : response.trim(); + + setMacAddress(trimmedResponse); + } catch (IOException e) { + Timber.e(e, "Error occurred while retrieving sololink mac address"); + } + } + }; + + private final AtomicReference macAddress = new AtomicReference<>(""); + + private final ExecutorService asyncExecutor; + protected final Handler handler; + private final AtomicBoolean isStarted = new AtomicBoolean(false); + private final AtomicBoolean wasConnected = new AtomicBoolean(false); + + protected final Context context; + protected final AbstractIpConnection linkConn; + + private T linkListener; + + public AbstractLinkManager(Context context, AbstractIpConnection ipConn, Handler handler, ExecutorService asyncExecutor) { + this.context = context; + this.linkConn = ipConn; + this.linkConn.setIpConnectionListener(this); + + this.handler = handler; + this.asyncExecutor = asyncExecutor; + } + + protected void postAsyncTask(Runnable task){ + if(asyncExecutor != null && !asyncExecutor.isShutdown()){ + asyncExecutor.execute(task); + } + } + + protected void postSuccessEvent(final ICommandListener listener){ + if(handler != null && listener != null){ + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + protected void postTimeoutEvent(final ICommandListener listener){ + if(handler != null && listener != null){ + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + protected void postErrorEvent(final int error, final ICommandListener listener){ + if(handler != null && listener != null){ + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onError(error); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + protected abstract SshConnection getSshLink(); + + public boolean isLinkConnected() { + return this.linkConn.getConnectionStatus() == AbstractIpConnection.STATE_CONNECTED; + } + + public void start(T listener) { + handler.removeCallbacks(reconnectTask); + + isStarted.set(true); + this.linkConn.connect(); + + this.linkListener = listener; + } + + public void stop() { + handler.removeCallbacks(reconnectTask); + + isStarted.set(false); + + //Break the link + this.linkConn.disconnect(); + } + + @Override + public void onIpConnected() { + handler.removeCallbacks(reconnectTask); + wasConnected.set(true); + + refreshState(); + + if (linkListener != null) + linkListener.onLinkConnected(); + } + + protected boolean isStarted(){ + return isStarted.get(); + } + + @Override + public void onIpDisconnected() { + if (isStarted.get()) { + if(shouldReconnect()) { + //Try to reconnect + handler.postDelayed(reconnectTask, RECONNECT_COUNTDOWN); + } + } + + if (linkListener != null && wasConnected.compareAndSet(true, false)) + linkListener.onLinkDisconnected(); + } + + protected boolean shouldReconnect(){ + return true; + } + + protected void loadMacAddress(){ + postAsyncTask(macAddressRetriever); + } + + private void setMacAddress(String trimmedResponse) { + Timber.i("Retrieved mac address: %s", trimmedResponse); + macAddress.set(trimmedResponse); + if(linkListener != null){ + linkListener.onMacAddressUpdated(); + } + } + + public String getMacAddress(){ + return macAddress.get(); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java new file mode 100644 index 0000000000..8070352716 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java @@ -0,0 +1,425 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.RemoteException; +import android.text.TextUtils; +import android.view.Surface; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_statustext; +import com.MAVLink.enums.MAV_TYPE; + +import org.droidplanner.android.client.apis.CapabilityApi; +import org.droidplanner.android.client.utils.TxPowerComplianceCountries; +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.LogMessageListener; +import org.droidplanner.services.android.core.drone.autopilot.apm.ArduCopter; +import org.droidplanner.services.android.core.drone.variables.ApmModes; +import org.droidplanner.services.android.core.drone.variables.HeartBeat; +import org.droidplanner.services.android.core.drone.variables.StreamRates; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloAttributes; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; +import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloActions; +import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.State; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; +import org.droidplanner.services.android.utils.SoloApiUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import timber.log.Timber; + +/** + * Created by Fredia Huya-Kouadio on 7/27/15. + */ +public class ArduSolo extends ArduCopter { + + private static final String PIXHAWK_SERIAL_NUMBER_REGEX = ".*PX4v2 (([0-9A-F]{8}) ([0-9A-F]{8}) ([0-9A-F]{8}))"; + private static final Pattern PIXHAWK_SERIAL_NUMBER_PATTERN = Pattern.compile(PIXHAWK_SERIAL_NUMBER_REGEX); + + private static final String SERIAL_NUMBER_LABEL = "serial_number"; + + private final Runnable disconnectSoloCompTask = new Runnable() { + @Override + public void run() { + if (soloComp != null && soloComp.isConnected()) { + soloComp.stop(); + } + + handler.removeCallbacks(disconnectSoloCompTask); + } + }; + + private String pixhawkSerialNumber; + + private final SoloComp soloComp; + + public ArduSolo(String droneId, Context context, DataLink.DataLinkProvider mavClient, Handler handler, + AutopilotWarningParser warningParser, LogMessageListener logListener) { + super(droneId, context, mavClient, handler, warningParser, logListener); + this.soloComp = new SoloComp(context, handler); + this.soloComp.setListener(new SoloComp.SoloCompListener() { + @Override + public void onConnected() { + if (isConnected()) { + notifyDroneEvent(DroneInterfaces.DroneEventsType.CONNECTED); + } + } + + @Override + public void onDisconnected() { + notifyDroneEvent(DroneInterfaces.DroneEventsType.DISCONNECTED); + } + + @Override + public void onTlvPacketReceived(TLVPacket packet) { + //TODO: filter the message that are broadcast. + switch (packet.getMessageType()) { + case TLVMessageTypes.TYPE_ARTOO_INPUT_REPORT_MESSAGE: + //Drop this message as only the battery info is enabled, and that info is already + //available from the autopilot. + break; + + case TLVMessageTypes.TYPE_SOLO_GET_BUTTON_SETTING: + case TLVMessageTypes.TYPE_SOLO_SET_BUTTON_SETTING: + //Drop these messages as they are already being handled by the 'onPresetButtonLoaded(...)' method. + break; + + case TLVMessageTypes.TYPE_SOLO_GOPRO_STATE: + notifyAttributeListener(SoloEvents.SOLO_GOPRO_STATE_UPDATED); + break; + + case TLVMessageTypes.TYPE_SOLO_GOPRO_STATE_V2: + notifyAttributeListener(SoloEvents.SOLO_GOPRO_STATE_V2_UPDATED); + break; + + default: + final Bundle messageInfo = new Bundle(); + messageInfo.putParcelable(SoloEventExtras.EXTRA_SOLO_MESSAGE_DATA, packet); + + notifyAttributeListener(SoloEvents.SOLO_MESSAGE_RECEIVED, messageInfo, true); + break; + } + } + + @Override + public void onPresetButtonLoaded(int buttonType, SoloButtonSetting buttonSettings) { + notifyAttributeListener(SoloEvents.SOLO_BUTTON_SETTINGS_UPDATED, null, true); + } + + @Override + public void onWifiInfoUpdated(String wifiName, String wifiPassword) { + notifyAttributeListener(SoloEvents.SOLO_WIFI_SETTINGS_UPDATED, null, true); + } + + @Override + public void onButtonPacketReceived(ButtonPacket packet) { + final Bundle eventInfo = new Bundle(); + eventInfo.putParcelable(SoloEventExtras.EXTRA_SOLO_BUTTON_EVENT, packet); + notifyAttributeListener(SoloEvents.SOLO_BUTTON_EVENT_RECEIVED, eventInfo, true); + } + + @Override + public void onTxPowerComplianceCountryUpdated(String compliantCountry) { + final Bundle eventInfo = new Bundle(1); + eventInfo.putString(SoloEventExtras.EXTRA_SOLO_TX_POWER_COMPLIANT_COUNTRY, compliantCountry); + notifyAttributeListener(SoloEvents.SOLO_TX_POWER_COMPLIANCE_COUNTRY_UPDATED, eventInfo, true); + } + + @Override + public void onVersionsUpdated() { + final Bundle eventInfo = new Bundle(); + eventInfo.putString(SoloEventExtras.EXTRA_SOLO_VEHICLE_VERSION, soloComp.getVehicleVersion()); + eventInfo.putString(SoloEventExtras.EXTRA_SOLO_AUTOPILOT_VERSION, soloComp.getAutopilotVersion()); + eventInfo.putString(SoloEventExtras.EXTRA_SOLO_GIMBAL_VERSION, soloComp.getGimbalVersion()); + eventInfo.putString(SoloEventExtras.EXTRA_SOLO_CONTROLLER_VERSION, soloComp.getControllerVersion()); + eventInfo.putString(SoloEventExtras.EXTRA_SOLO_CONTROLLER_FIRMWARE_VERSION, soloComp.getControllerFirmwareVersion()); + + notifyAttributeListener(SoloEvents.SOLO_VERSIONS_UPDATED, eventInfo, true); + } + + @Override + public void onControllerEvent(String event, Bundle eventInfo) { + notifyAttributeListener(event, eventInfo, true); + } + }); + } + + @Override + public void destroy() { + super.destroy(); + soloComp.destroy(); + } + + public SoloComp getSoloComp() { + return soloComp; + } + + /** + * No need to update the stream rates for Solo as it's being set by the companion computer + * @return + */ + @Override + public StreamRates getStreamRates() { + return null; + } + + @Override + public int getType() { + return MAV_TYPE.MAV_TYPE_QUADROTOR; + } + + @Override + public void setType(int type) { + } + + @Override + public FirmwareType getFirmwareType() { + return FirmwareType.ARDU_SOLO; + } + + @Override + public boolean isConnected() { + return soloComp.isConnected() && super.isConnected(); + } + + @Override + public DroneAttribute getAttribute(String attributeType) { + switch (attributeType) { + case SoloAttributes.SOLO_STATE: + return SoloApiUtils.getSoloLinkState(this); + + case SoloAttributes.SOLO_GOPRO_STATE: + return soloComp.getGoproState(); + + case SoloAttributes.SOLO_GOPRO_STATE_V2: + return soloComp.getGoproStateV2(); + + case AttributeType.STATE: + final State stateAttr = (State) super.getAttribute(attributeType); + stateAttr.addToVehicleUid(SERIAL_NUMBER_LABEL, pixhawkSerialNumber); + stateAttr.addToVehicleUid("solo_mac_address", soloComp.getSoloMacAddress()); + stateAttr.addToVehicleUid("controller_mac_address", soloComp.getControllerMacAddress()); + return stateAttr; + + default: + return super.getAttribute(attributeType); + } + } + + protected void resetVideoManager() { + videoMgr.reset(); + } + + @Override + public void startVideoStream(Bundle videoProps, String appId, String newVideoTag, Surface videoSurface, + final ICommandListener listener) { + if (!soloComp.hasStreamingPermission()) { + postErrorEvent(CommandExecutionError.COMMAND_DENIED, listener); + return; + } + + super.startVideoStream(videoProps, appId, newVideoTag, videoSurface, listener); + } + + protected void postErrorEvent(final int error, final ICommandListener listener) { + if (handler != null && listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onError(error); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + @Override + public void notifyDroneEvent(final DroneInterfaces.DroneEventsType event) { + switch (event) { + case HEARTBEAT_FIRST: + case CONNECTED: + Timber.i("Vehicle " + event.name().toLowerCase()); + //Try connecting the companion computer + if (!soloComp.isConnected()) { + resetVideoManager(); + soloComp.start(); + return; + } + break; + + case DISCONNECTED: + Timber.i("Vehicle disconnected."); + if (soloComp.isConnected()) { + soloComp.stop(); + resetVideoManager(); + return; + } + break; + + case HEARTBEAT_TIMEOUT: + Timber.i("Vehicle heartbeat timed out."); + if (soloComp.isConnected()) { + //Start a countdown at the conclusion of which, disconnect the solo companion computer. + handler.postDelayed(disconnectSoloCompTask, HeartBeat.HEARTBEAT_NORMAL_TIMEOUT); + } + break; + + case HEARTBEAT_RESTORED: + Timber.i("Vehicle heartbeat restored."); + //Dismiss the countdown to disconnect the solo companion computer. + handler.removeCallbacks(disconnectSoloCompTask); + if (!soloComp.isConnected()) { + soloComp.start(); + } else { + soloComp.refreshState(); + } + break; + } + + super.notifyDroneEvent(event); + } + + @Override + public boolean executeAsyncAction(Action action, final ICommandListener listener) { + final String type = action.getType(); + Bundle data = action.getData(); + + switch (type) { + //************ SOLOLINK ACTIONS *************// + case SoloActions.ACTION_SEND_MESSAGE: + final TLVPacket messageData = data.getParcelable(SoloActions.EXTRA_MESSAGE_DATA); + if (messageData != null) { + SoloApiUtils.sendSoloLinkMessage(this, messageData, listener); + } + return true; + + case SoloConfigActions.ACTION_UPDATE_WIFI_SETTINGS: + final String wifiSsid = data.getString(SoloConfigActions.EXTRA_WIFI_SSID); + final String wifiPassword = data.getString(SoloConfigActions.EXTRA_WIFI_PASSWORD); + SoloApiUtils.updateSoloLinkWifiSettings(this, wifiSsid, wifiPassword, listener); + return true; + + case SoloConfigActions.ACTION_UPDATE_BUTTON_SETTINGS: + final SoloButtonSettingSetter buttonSettings = data.getParcelable(SoloConfigActions.EXTRA_BUTTON_SETTINGS); + if (buttonSettings != null) { + SoloApiUtils.updateSoloLinkButtonSettings(this, buttonSettings, listener); + } + return true; + + case SoloConfigActions.ACTION_UPDATE_CONTROLLER_MODE: + final @SoloControllerMode.ControllerMode int mode = data.getInt(SoloConfigActions.EXTRA_CONTROLLER_MODE); + SoloApiUtils.updateSoloLinkControllerMode(this, mode, listener); + return true; + + //TODO remove this when deprecated methods are deleted in 3.0 + case SoloConfigActions.ACTION_UPDATE_EU_TX_POWER_COMPLIANCE: + final boolean isCompliant = data.getBoolean(SoloConfigActions.EXTRA_EU_TX_POWER_COMPLIANT); + String compliantCountryCode = isCompliant ? TxPowerComplianceCountries.getDefaultEUCountry().name() : + TxPowerComplianceCountries.getDefaultCountry().name(); + SoloApiUtils.updateSoloLinkTxPowerComplianceCountry(this, compliantCountryCode, listener); + return true; + + case SoloConfigActions.ACTION_UPDATE_TX_POWER_COMPLIANCE_COUNTRY: + final String compliantCountry = data.getString(SoloConfigActions.EXTRA_TX_POWER_COMPLIANT_COUNTRY_CODE); + SoloApiUtils.updateSoloLinkTxPowerComplianceCountry(this, compliantCountry, listener); + return true; + + case SoloConfigActions.ACTION_REFRESH_SOLO_VERSIONS: + soloComp.refreshSoloVersions(); + return true; + + case SoloConfigActions.ACTION_UPDATE_CONTROLLER_UNIT: + final @SoloControllerUnits.ControllerUnit String unit = data.getString(SoloConfigActions.EXTRA_CONTROLLER_UNIT); + SoloApiUtils.updateSoloControllerUnit(this, unit, listener); + return true; + + default: + return super.executeAsyncAction(action, listener); + } + } + + @Override + protected boolean isFeatureSupported(String featureId) { + switch (featureId) { + + case CapabilityApi.FeatureIds.SOLO_VIDEO_STREAMING: + case CapabilityApi.FeatureIds.COMPASS_CALIBRATION: + case CapabilityApi.FeatureIds.KILL_SWITCH: + return true; + + default: + return super.isFeatureSupported(featureId); + } + } + + @Override + protected void processSignalUpdate(int rxerrors, int fixed, short rssi, short remrssi, short txbuf, + short noise, short remnoise) { + final double unsignedRemRssi = remrssi & 0xFF; + + signal.setValid(true); + signal.setRxerrors(rxerrors & 0xFFFF); + signal.setFixed(fixed & 0xFFFF); + signal.setRssi(rssi & 0xFF); + signal.setRemrssi(unsignedRemRssi); + signal.setNoise(noise & 0xFF); + signal.setRemnoise(remnoise & 0xFF); + signal.setTxbuf(txbuf & 0xFF); + + final double signalStrength = unsignedRemRssi <= 127 ? unsignedRemRssi : unsignedRemRssi - 256; + signal.setSignalStrength(signalStrength); + + notifyDroneEvent(DroneInterfaces.DroneEventsType.RADIO); + } + + @Override + protected void processStatusText(msg_statustext statusText) { + super.processStatusText(statusText); + + final String message = statusText.getText(); + if (!TextUtils.isEmpty(message)) { + + //Parse pixhawk serial number. + final Matcher matcher = PIXHAWK_SERIAL_NUMBER_PATTERN.matcher(message); + if (matcher.matches()) { + Timber.i("Received serial number: %s", message); + + final String serialNumber = matcher.group(2) + matcher.group(3) + matcher.group(4); + if (!serialNumber.equalsIgnoreCase(pixhawkSerialNumber)) { + pixhawkSerialNumber = serialNumber; + + notifyAttributeListener(AttributeEvent.STATE_VEHICLE_UID); + } + } + } + } + + @Override + protected boolean brakeVehicle(ICommandListener listener) { + getState().changeFlightMode(ApmModes.ROTOR_BRAKE, listener); + return true; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java new file mode 100644 index 0000000000..4c79de830f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java @@ -0,0 +1,436 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.RemoteException; +import android.text.TextUtils; +import android.util.Pair; +import android.util.SparseArray; + +import org.droidplanner.services.android.BuildConfig; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkListener; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.sololink.SoloLinkListener; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.sololink.SoloLinkManager; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproState; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.utils.NetworkUtils; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import timber.log.Timber; + +/** + * Sololink companion computer implementation + * Created by Fredia Huya-Kouadio on 7/9/15. + */ +public class SoloComp implements SoloLinkListener, ControllerLinkListener { + + public interface SoloCompListener { + void onConnected(); + + void onDisconnected(); + + void onTlvPacketReceived(TLVPacket packet); + + void onPresetButtonLoaded(int buttonType, SoloButtonSetting buttonSettings); + + void onWifiInfoUpdated(String wifiName, String wifiPassword); + + void onButtonPacketReceived(ButtonPacket packet); + + void onTxPowerComplianceCountryUpdated(String compliantCountry); + + void onVersionsUpdated(); + + void onControllerEvent(String event, Bundle eventInfo); + } + + public static final String SOLO_LINK_WIFI_PREFIX = "SoloLink_"; + + public static final String SSH_USERNAME = "root"; + public static final String SSH_PASSWORD = "TjSDBkAu"; + + private final ControllerLinkManager controllerLinkManager; + private final SoloLinkManager soloLinkMgr; + + private final Context context; + private final Handler handler; + private final ExecutorService asyncExecutor; + + private SoloCompListener compListener; + + private SoloGoproState goproState; + private SoloGoproStateV2 goproStateV2; + + /** + * Solo companion computer implementation + * + * @param context Application context + */ + public SoloComp(Context context, Handler handler) { + this.context = context; + + this.handler = handler; + asyncExecutor = Executors.newCachedThreadPool(); + + this.controllerLinkManager = new ControllerLinkManager(context, handler, asyncExecutor); + this.soloLinkMgr = new SoloLinkManager(context, handler, asyncExecutor); + } + + public SoloGoproState getGoproState() { + return goproState; + } + + public SoloGoproStateV2 getGoproStateV2(){ + return goproStateV2; + } + + public boolean hasStreamingPermission(){ + if(BuildConfig.SITL_DEBUG) + return true; + + return controllerLinkManager.hasStreamingPermission(); + } + + public void setListener(SoloCompListener listener) { + this.compListener = listener; + } + + public static boolean isAvailable(Context context) { + //TODO: complement the logic. + return NetworkUtils.isOnSololinkNetwork(context); + } + + public void start() { + if (!isAvailable(context)) { + return; + } + + if(!BuildConfig.SITL_DEBUG) { + controllerLinkManager.start(this); + } + + soloLinkMgr.start(this); + } + + public void stop() { + soloLinkMgr.stop(); + + if(!BuildConfig.SITL_DEBUG) { + controllerLinkManager.stop(); + } + } + + public void refreshState() { + soloLinkMgr.refreshState(); + + if(!BuildConfig.SITL_DEBUG) + controllerLinkManager.refreshState(); + } + + /** + * Terminates and releases resources used by this companion computer instance. The instance should no longer be used after calling this method. + */ + public void destroy() { + stop(); + asyncExecutor.shutdownNow(); + } + + @Override + public void onTlvPacketReceived(TLVPacket packet) { + if (packet == null) + return; + + switch (packet.getMessageType()) { + case TLVMessageTypes.TYPE_SOLO_GOPRO_STATE: + goproState = (SoloGoproState) packet; + Timber.d("Updated gopro state."); + break; + + case TLVMessageTypes.TYPE_SOLO_GOPRO_STATE_V2: + goproStateV2 = (SoloGoproStateV2) packet; + Timber.i("Updated gopro state."); + break; + } + + if (compListener != null) + compListener.onTlvPacketReceived(packet); + } + + @Override + public void onWifiInfoUpdated(String wifiName, String wifiPassword) { + if (compListener != null) + compListener.onWifiInfoUpdated(wifiName, wifiPassword); + } + + @Override + public void onButtonPacketReceived(ButtonPacket packet) { + if (compListener != null) + compListener.onButtonPacketReceived(packet); + } + + @Override + public void onTxPowerComplianceCountryUpdated(String compliantCountry) { + if (compListener != null) + compListener.onTxPowerComplianceCountryUpdated(compliantCountry); + } + + @Override + public void onControllerModeUpdated() { + if (compListener != null) { + final Bundle eventInfo = new Bundle(); + eventInfo.putInt(SoloEventExtras.EXTRA_SOLO_CONTROLLER_MODE, getControllerMode()); + compListener.onControllerEvent(SoloEvents.SOLO_CONTROLLER_MODE_UPDATED, eventInfo); + } + } + + @Override + public void onControllerUnitUpdated(String trimmedResponse) { + if (compListener != null) { + final Bundle eventInfo = new Bundle(); + eventInfo.putString(SoloEventExtras.EXTRA_SOLO_CONTROLLER_UNIT, trimmedResponse); + compListener.onControllerEvent(SoloEvents.SOLO_CONTROLLER_UNIT_UPDATED, eventInfo); + } + } + + @Override + public void onPresetButtonLoaded(int buttonType, SoloButtonSetting buttonSettings) { + if (compListener != null) + compListener.onPresetButtonLoaded(buttonType, buttonSettings); + } + + @Override + public void onLinkConnected() { + if (isConnected()) { + if (compListener != null) + compListener.onConnected(); + } else { + if (!controllerLinkManager.isLinkConnected() && !BuildConfig.SITL_DEBUG) + controllerLinkManager.start(this); + + if (!soloLinkMgr.isLinkConnected()) + soloLinkMgr.start(this); + } + } + + @Override + public void onLinkDisconnected() { + if (compListener != null) + compListener.onDisconnected(); + + soloLinkMgr.stop(); + + if(!BuildConfig.SITL_DEBUG) { + controllerLinkManager.stop(); + } + } + + @Override + public void onVersionsUpdated() { + if (compListener != null) + compListener.onVersionsUpdated(); + } + + @Override + public void onMacAddressUpdated() { + final String soloMacAddress = soloLinkMgr.getMacAddress(); + final String artooMacAddress = controllerLinkManager.getMacAddress(); + if (!TextUtils.isEmpty(soloMacAddress) && !TextUtils.isEmpty(artooMacAddress) && compListener != null) { + compListener.onControllerEvent(AttributeEvent.STATE_VEHICLE_UID, null); + } + } + + public boolean isConnected() { + if(BuildConfig.SITL_DEBUG) + return soloLinkMgr.isLinkConnected(); + + return controllerLinkManager.isLinkConnected() && soloLinkMgr.isLinkConnected(); + } + + public Pair getWifiSettings() { + return controllerLinkManager.getSoloLinkWifiInfo(); + } + + public String getTxPowerCompliantCountry() { + return controllerLinkManager.getTxPowerCompliantCountry(); + } + + public void refreshSoloVersions() { + soloLinkMgr.refreshSoloLinkVersions(); + + if(!BuildConfig.SITL_DEBUG) + controllerLinkManager.refreshControllerVersions(); + } + + public String getControllerVersion() { + return controllerLinkManager.getArtooVersion(); + } + + public String getControllerFirmwareVersion() { + return controllerLinkManager.getStm32Version(); + } + + public String getVehicleVersion() { + return soloLinkMgr.getVehicleVersion(); + } + + @SoloControllerMode.ControllerMode + public int getControllerMode() { + return controllerLinkManager.getControllerMode(); + } + + @SoloControllerUnits.ControllerUnit + public String getControllerUnit() { + return controllerLinkManager.getControllerUnit(); + } + + public String getSoloMacAddress() { + return soloLinkMgr.getMacAddress(); + } + + public String getControllerMacAddress() { + return controllerLinkManager.getMacAddress(); + } + + public String getAutopilotVersion() { + return soloLinkMgr.getPixhawkVersion(); + } + + public String getGimbalVersion() { + return soloLinkMgr.getGimbalVersion(); + } + + public SoloButtonSetting getButtonSetting(int buttonType) { + return soloLinkMgr.getLoadedPresetButton(buttonType); + } + + public SparseArray getButtonSettings() { + final SparseArray buttonSettings = new SparseArray<>(2); + buttonSettings.append(ButtonTypes.BUTTON_A, soloLinkMgr.getLoadedPresetButton(ButtonTypes.BUTTON_A)); + buttonSettings.append(ButtonTypes.BUTTON_B, soloLinkMgr.getLoadedPresetButton(ButtonTypes.BUTTON_B)); + return buttonSettings; + } + + public void sendSoloLinkMessage(TLVPacket message, ICommandListener listener) { + soloLinkMgr.sendTLVPacket(message, listener); + } + + public void updateWifiSettings(final String wifiSsid, final String wifiPassword, + final ICommandListener listener) { + postAsyncTask(new Runnable() { + @Override + public void run() { + if (soloLinkMgr.updateSololinkWifi(wifiSsid, wifiPassword) + && controllerLinkManager.updateSololinkWifi(wifiSsid, wifiPassword)) { + Timber.d("Sololink wifi update successful."); + + if (listener != null) { + postSuccessEvent(listener); + } + } else { + Timber.d("Sololink wifi update failed."); + if (listener != null) { + postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + } + } + }); + } + + public void pushButtonSettings(SoloButtonSettingSetter buttonSettings, ICommandListener listener) { + soloLinkMgr.pushPresetButtonSettings(buttonSettings, listener); + } + + public void updateControllerMode(@SoloControllerMode.ControllerMode final int selectedMode, ICommandListener listener) { + controllerLinkManager.updateControllerMode(selectedMode, listener); + } + + public void updateControllerUnit(@SoloControllerUnits.ControllerUnit final String selectedUnit, ICommandListener listener) { + controllerLinkManager.updateControllerUnit(selectedUnit, listener); + } + + public void updateTxPowerComplianceCountry(String compliantCountry, ICommandListener listener) { + controllerLinkManager.setTxPowerComplianceCountry(compliantCountry, listener); + } + + protected void postAsyncTask(Runnable task) { + if (asyncExecutor != null && !asyncExecutor.isShutdown()) { + asyncExecutor.execute(task); + } + } + + protected void postSuccessEvent(final ICommandListener listener) { + if (handler != null && listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + protected void postTimeoutEvent(final ICommandListener listener) { + if (handler != null && listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + protected void postErrorEvent(final int error, final ICommandListener listener) { + if (handler != null && listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onError(error); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + + public void enableFollowDataConnection() { + soloLinkMgr.enableFollowDataConnection(); + } + + public void disableFollowDataConnection() { + soloLinkMgr.disableFollowDataConnection(); + } + + public void updateFollowCenter(SoloMessageLocation location) { + soloLinkMgr.sendTLVPacket(location, true, null); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java new file mode 100644 index 0000000000..f45b65a55f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java @@ -0,0 +1,24 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller; + +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; + +/** + * Created by Fredia Huya-Kouadio on 7/10/15. + */ +public interface ControllerLinkListener extends AbstractLinkManager.LinkListener { + + void onTlvPacketReceived(TLVPacket packet); + + void onWifiInfoUpdated(String wifiName, String wifiPassword); + + void onButtonPacketReceived(ButtonPacket packet); + + void onTxPowerComplianceCountryUpdated(String compliantCountry); + + void onControllerModeUpdated(); + + void onControllerUnitUpdated(@SoloControllerUnits.ControllerUnit String trimmedResponse); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java new file mode 100644 index 0000000000..c1891b0b06 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java @@ -0,0 +1,643 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller; + +import android.content.Context; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Pair; + +import com.github.zafarkhaja.semver.Version; + +import org.droidplanner.android.client.utils.TxPowerComplianceCountries; +import org.droidplanner.android.client.utils.connection.IpConnectionListener; +import org.droidplanner.android.client.utils.connection.TcpConnection; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.utils.NetworkUtils; +import org.droidplanner.services.android.utils.connection.SshConnection; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +/** + * Handles artoo link related logic. + */ +public class ControllerLinkManager extends AbstractLinkManager { + + /** + * This is the minimum version that provides an api for the controller mode update. + */ + private static final Version CONTROLLER_MODE_MIN_VERSION = Version.forIntegers(1, 1, 13); + + public static final String SOLOLINK_SSID_CONFIG_PATH = "/usr/bin/sololink_config"; + + private static final String ARTOO_VERSION_FILENAME = "/VERSION"; + private static final String STM32_VERSION_FILENAME = "/STM_VERSION"; + + /** + * Artoo link ip address + */ + public static final String ARTOO_IP = "10.1.1.1"; + + private static final int ARTOO_VIDEO_HANDSHAKE_PORT = 5502; + private static final int ARTOO_BUTTON_PORT = 5016; + private static final int ARTOO_BATTERY_PORT = 5021; + + public static final int ARTOO_UDP_PORT = 5600; + + private final AtomicReference controllerVersion = new AtomicReference<>(""); + private final AtomicReference stm32Version = new AtomicReference<>(""); + + private final AtomicReference txPowerCompliantCountry = + new AtomicReference<>(TxPowerComplianceCountries.getDefaultCountry().name()); + private final AtomicInteger controllerMode = new AtomicInteger(SoloControllerMode.UNKNOWN_MODE); + + private final AtomicReference controllerUnits = new AtomicReference<>(""); + + private final AtomicReference> sololinkWifiInfo = new AtomicReference<>(Pair.create("", "")); + + private final Runnable reconnectBatteryTask = new Runnable() { + @Override + public void run() { + handler.removeCallbacks(this); + batteryConnection.connect(); + } + }; + + private final Runnable reconnectVideoHandshake = new Runnable() { + @Override + public void run() { + handler.removeCallbacks(this); + videoHandshake.connect(); + } + }; + + + private final AtomicBoolean isVideoHandshakeStarted = new AtomicBoolean(false); + private final AtomicBoolean isBatteryStarted = new AtomicBoolean(false); + + private final TcpConnection videoHandshake; + private final TcpConnection batteryConnection; + + protected static final SshConnection sshLink = new SshConnection(ARTOO_IP, SoloComp.SSH_USERNAME, + SoloComp.SSH_PASSWORD); + + private final Runnable artooVersionRetriever = new Runnable() { + @Override + public void run() { + final String version = retrieveVersion(ARTOO_VERSION_FILENAME); + if (version != null) + controllerVersion.set(version); + + updateControllerModeIfPossible(); + updateControllerUnitIfPossible(); + + onVersionsUpdated(); + } + }; + + private final Runnable stm32VersionRetriever = new Runnable() { + @Override + public void run() { + final String version = retrieveVersion(STM32_VERSION_FILENAME); + if (version != null) + stm32Version.set(version); + + onVersionsUpdated(); + } + }; + + private final Runnable loadWifiInfo = new Runnable() { + @Override + public void run() { + try { + String wifiName = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --get-wifi-ssid"); + String wifiPassword = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --get-wifi-password"); + + if (!TextUtils.isEmpty(wifiName) && !TextUtils.isEmpty(wifiPassword)) { + Pair wifiInfo = Pair.create(wifiName.trim(), wifiPassword.trim()); + sololinkWifiInfo.set(wifiInfo); + + if (linkListener != null) + linkListener.onWifiInfoUpdated(wifiInfo.first, wifiInfo.second); + } + + } catch (IOException e) { + Timber.e(e, "Unable to retrieve sololink wifi info."); + } + } + }; + + private final Runnable checkEUTxPowerCompliance = new Runnable() { + @Override + public void run() { + String compliantCountry; + try { + compliantCountry = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --get-wifi-country").trim(); + if (linkListener != null) + linkListener.onTxPowerComplianceCountryUpdated(compliantCountry); + } catch (IOException e) { + Timber.e(e, "Error occurred while querying wifi country."); + compliantCountry = TxPowerComplianceCountries.getDefaultCountry().name(); + } + + txPowerCompliantCountry.set(compliantCountry); + } + }; + + private final Runnable artooModeRetriever = new Runnable() { + @Override + public void run() { + Timber.i("Retrieving controller mode"); + try { + final String response = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --get-ui-mode"); + final String trimmedResponse = TextUtils.isEmpty(response) ? "" : response.trim(); + switch (trimmedResponse) { + case "1": + setControllerMode(SoloControllerMode.MODE_1); + break; + + case "2": + setControllerMode(SoloControllerMode.MODE_2); + break; + + default: + Timber.w("Unable to parse received controller mode."); + setControllerMode(SoloControllerMode.UNKNOWN_MODE); + break; + } + + } catch (IOException e) { + Timber.e(e, "Error occurred while getting controller mode."); + } + } + }; + + private final Runnable unitsRetriever = new Runnable() { + @Override + public void run() { + Timber.d("Retrieving controller units."); + try { + final String response = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --get-ui-units"); + @SoloControllerUnits.ControllerUnit final String trimmedResponse = TextUtils.isEmpty(response) ? SoloControllerUnits.UNKNOWN : response.trim(); + switch (trimmedResponse) { + case SoloControllerUnits.METRIC: + case SoloControllerUnits.IMPERIAL: + case SoloControllerUnits.UNKNOWN: + setControllerUnit(trimmedResponse); + break; + + default: + Timber.w("Received unknown value for controller unit: %s", trimmedResponse); + break; + } + } catch (IOException e) { + Timber.e(e, "Error occurred while retrieving the controller units."); + } + } + }; + + private ControllerLinkListener linkListener; + private final AtomicBoolean streamingPermission = new AtomicBoolean(false); + + public ControllerLinkManager(Context context, final Handler handler, ExecutorService asyncExecutor) { + super(context, new TcpConnection(handler, ARTOO_IP, ARTOO_BUTTON_PORT), handler, asyncExecutor); + + videoHandshake = new TcpConnection(handler, ARTOO_IP, ARTOO_VIDEO_HANDSHAKE_PORT); + videoHandshake.setIpConnectionListener(new IpConnectionListener() { + + @Override + public void onIpConnected() { + handler.removeCallbacks(reconnectVideoHandshake); + Timber.d("Artoo link connected. Starting video stream..."); + + streamingPermission.set(true); + } + + @Override + public void onIpDisconnected() { + streamingPermission.set(false); + + if (isVideoHandshakeStarted.get()) + handler.postDelayed(reconnectVideoHandshake, RECONNECT_COUNTDOWN); + } + + @Override + public void onPacketReceived(ByteBuffer packetBuffer) { + } + }); + + batteryConnection = new TcpConnection(handler, ARTOO_IP, ARTOO_BATTERY_PORT); + batteryConnection.setIpConnectionListener(new IpConnectionListener() { + + @Override + public void onIpConnected() { + handler.removeCallbacks(reconnectBatteryTask); + } + + @Override + public void onIpDisconnected() { + //Try to connect + if (isBatteryStarted.get()) { + handler.postDelayed(reconnectBatteryTask, RECONNECT_COUNTDOWN); + + } + } + + @Override + public void onPacketReceived(ByteBuffer packetBuffer) { + + List tlvMsgs = TLVMessageParser.parseTLVPacket(packetBuffer); + if (tlvMsgs.isEmpty()) + return; + + for (TLVPacket tlvMsg : tlvMsgs) { + final int messageType = tlvMsg.getMessageType(); + Timber.d("Received tlv message: " + messageType); + + if (linkListener != null) + linkListener.onTlvPacketReceived(tlvMsg); + } + } + }); + + } + + public boolean hasStreamingPermission(){ + return streamingPermission.get(); + } + + public boolean areVersionsSet() { + return !TextUtils.isEmpty(controllerVersion.get()) && !TextUtils.isEmpty(stm32Version.get()); + } + + /** + * @return the controller version. + */ + public String getArtooVersion() { + return controllerVersion.get(); + } + + /** + * @return the stm32 version + */ + public String getStm32Version() { + return stm32Version.get(); + } + + /** + * @return the country the controller is compliant with tx power levels. + */ + public String getTxPowerCompliantCountry() { + return txPowerCompliantCountry.get(); + } + + /** + * Return the current controller mode + * + * @return MODE_1 or MODE_2 + */ + public + @SoloControllerMode.ControllerMode + int getControllerMode() { + final @SoloControllerMode.ControllerMode int mode = controllerMode.get(); + return mode; + } + + /** + * Return the current controller unit + * + * @return @see {@link SoloControllerUnits.ControllerUnit} + */ + public + @SoloControllerUnits.ControllerUnit + String getControllerUnit() { + final @SoloControllerUnits.ControllerUnit String unit = controllerUnits.get(); + return unit; + } + + private void startVideoManager() { + handler.removeCallbacks(reconnectVideoHandshake); + isVideoHandshakeStarted.set(true); + videoHandshake.connect(); + } + + private void stopVideoManager() { + handler.removeCallbacks(reconnectVideoHandshake); + isVideoHandshakeStarted.set(false); + videoHandshake.disconnect(); + } + + private void loadSololinkWifiInfo() { + postAsyncTask(loadWifiInfo); + } + + public boolean updateSololinkWifi(CharSequence wifiSsid, CharSequence password) { + Timber.d(String.format(Locale.US, "Updating artoo wifi ssid to %s with password %s", wifiSsid, password)); + try { + String ssidUpdateResult = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --set-wifi-ssid " + wifiSsid); + String passwordUpdateResult = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --set-wifi-password " + + password); + restartController(); + return true; + } catch (IOException e) { + Timber.e(e, "Error occurred while updating the sololink wifi ssid."); + return false; + } + } + + public Pair getSoloLinkWifiInfo() { + return sololinkWifiInfo.get(); + } + + @Override + public void start(ControllerLinkListener listener) { + this.linkListener = listener; + + if(!isStarted()) { + Timber.i("Starting artoo link manager"); + } + + super.start(listener); + + //TODO: update when battery info is available +// handler.removeCallbacks(reconnectBatteryTask); + //isBatteryStarted.set(true); + //batteryConnection.connect(); + + } + + public void stop() { + if(isStarted()) { + Timber.i("Stopping artoo link manager"); + } + + //TODO: update when battery info is available + /*handler.removeCallbacks(reconnectBatteryTask); + isBatteryStarted.set(false); + batteryConnection.disconnect();*/ + + super.stop(); + } + + @Override + public boolean isLinkConnected() { + return NetworkUtils.isOnSololinkNetwork(context); + } + + @Override + public void refreshState() { + Timber.d("Artoo link connected."); + + //Load the mac address for the vehicle. + loadMacAddress(); + + startVideoManager(); + + //Update sololink wifi + loadSololinkWifiInfo(); + + refreshControllerVersions(); + + //Update the tx power compliance + loadCurrentEUTxPowerComplianceMode(); + } + + @Override + protected SshConnection getSshLink() { + return sshLink; + } + + private void onVersionsUpdated() { + if (linkListener != null && areVersionsSet()) + linkListener.onVersionsUpdated(); + } + + private void updateControllerUnitIfPossible() { + if (doesSupportControllerMode()) { + Timber.d("Updating current controller unit."); + loadControllerUnit(); + } else { + Timber.w("This controller version doesn't support controller unit retrieval."); + } + } + + private void updateControllerModeIfPossible() { + if (doesSupportControllerMode()) { + //load current controller mode + Timber.d("Updating current controller mode."); + loadCurrentControllerMode(); + } else { + Timber.w("This controller version doesn't support controller mode retrieval."); + } + } + + private boolean doesSupportControllerMode() { + final String version = controllerVersion.get(); + if (TextUtils.isEmpty(version)) + return false; + + try { + final Version currentVersion = Version.valueOf(version); + return CONTROLLER_MODE_MIN_VERSION.lessThanOrEqualTo(currentVersion); + } catch (Exception e) { + Timber.e(e, "Unable to parse controller version."); + return false; + } + } + + @Override + public void onIpDisconnected() { + Timber.d("Artoo link disconnected."); + stopVideoManager(); + super.onIpDisconnected(); + } + + @Override + public void onPacketReceived(ByteBuffer packetBuffer) { + ButtonPacket buttonPacket = ButtonPacket.parseButtonPacket(packetBuffer); + if (buttonPacket == null) + return; + + final int buttonId = buttonPacket.getButtonId(); + Timber.d("Button pressed: " + buttonId); + + if (linkListener != null) + linkListener.onButtonPacketReceived(buttonPacket); + } + + private void updateArtooVersion() { + postAsyncTask(artooVersionRetriever); + } + + private void updateStm32Version() { + postAsyncTask(stm32VersionRetriever); + } + + private String retrieveVersion(String versionFile) { + try { + String version = sshLink.execute("cat " + versionFile); + if (TextUtils.isEmpty(version)) { + Timber.d("No version file was found"); + return ""; + } else { + return version.split("\n")[0]; + } + } catch (IOException e) { + Timber.e("Unable to retrieve the current version.", e); + } + + return null; + } + + public void updateControllerUnit(@SoloControllerUnits.ControllerUnit final String unit, final ICommandListener listener) { + postAsyncTask(new Runnable() { + @Override + public void run() { + final boolean supportControllerMode = doesSupportControllerMode(); + if (!supportControllerMode) { + postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return; + } + + Timber.d("Switching controller unit to %s", unit); + try { + final String command = SOLOLINK_SSID_CONFIG_PATH + " --set-ui-units %s"; + final String response = sshLink.execute(String.format(Locale.US, command, unit)); + Timber.d("Response from unit change was: %s", response); + postSuccessEvent(listener); + + setControllerUnit(unit); + } catch (IOException e) { + Timber.e(e, "Error occurred while changing controller unit."); + postTimeoutEvent(listener); + } + } + }); + } + + private void setControllerUnit(@SoloControllerUnits.ControllerUnit String unit) { + controllerUnits.set(unit); + if (linkListener != null) + linkListener.onControllerUnitUpdated(unit); + } + + public void updateControllerMode(@SoloControllerMode.ControllerMode final int mode, final ICommandListener listener) { + postAsyncTask(new Runnable() { + @Override + public void run() { + Timber.d("Switching controller to mode %d", mode); + try { + final boolean supportControllerMode = doesSupportControllerMode(); + final String command = supportControllerMode + ? SOLOLINK_SSID_CONFIG_PATH + " --set-ui-mode %d" + : "runStickMapperMode%d.sh"; + final String response; + switch (mode) { + case SoloControllerMode.MODE_1: + response = sshLink.execute(String.format(Locale.US, command, mode)); + postSuccessEvent(listener); + break; + + case SoloControllerMode.MODE_2: + response = sshLink.execute(String.format(Locale.US, command, mode)); + postSuccessEvent(listener); + break; + + default: + response = "No response."; + postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + break; + } + Timber.d("Response from switch mode command was: %s", response); + + if (supportControllerMode) { + setControllerMode(mode); + } + } catch (IOException e) { + Timber.e(e, "Error occurred while changing controller modes."); + postTimeoutEvent(listener); + } + + } + }); + } + + private void setControllerMode(@SoloControllerMode.ControllerMode int mode) { + controllerMode.set(mode); + if (linkListener != null) + linkListener.onControllerModeUpdated(); + } + + public void setTxPowerComplianceCountry(final String compliantCountry, final ICommandListener listener) { + postAsyncTask(new Runnable() { + @Override + public void run() { + Timber.d("Enabling %s Tx power compliance mode", compliantCountry); + try { + final String currentCompliance = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --get-wifi-country").trim(); + if (!currentCompliance.equals(compliantCountry)) { + final String response; + response = sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --set-wifi-country " + compliantCountry + "; echo $?"); + if (response.trim().equals("0")) { + restartController(); + Timber.d("wifi country successfully set, rebooting artoo"); + + txPowerCompliantCountry.set(compliantCountry); + postSuccessEvent(listener); + + } else { + Timber.d("wifi country set failed: %s", response); + postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + } + } catch (IOException e) { + Timber.e(e, "Error occurred while changing wifi country."); + postTimeoutEvent(listener); + } + } + }); + } + + private void loadCurrentEUTxPowerComplianceMode() { + postAsyncTask(checkEUTxPowerCompliance); + } + + private void loadCurrentControllerMode() { + postAsyncTask(artooModeRetriever); + } + + private void loadControllerUnit() { + postAsyncTask(unitsRetriever); + } + + private void restartController() { + try { + sshLink.execute(SOLOLINK_SSID_CONFIG_PATH + " --reboot"); + } catch (IOException e) { + Timber.e(e, "Error occurred while restarting hostpad service on Artoo."); + } + } + + /** + * Refresh the vehicle's components versions + */ + public void refreshControllerVersions() { + updateArtooVersion(); + updateStm32Version(); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java new file mode 100644 index 0000000000..60d48b728b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java @@ -0,0 +1,15 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink; + +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; + +/** + * Created by Fredia Huya-Kouadio on 7/10/15. + */ +public interface SoloLinkListener extends AbstractLinkManager.LinkListener { + + void onTlvPacketReceived(TLVPacket packet); + + void onPresetButtonLoaded(int buttonType, SoloButtonSetting buttonSettings); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java new file mode 100644 index 0000000000..fde36b87d8 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java @@ -0,0 +1,379 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink; + +import android.content.Context; +import android.os.Handler; +import android.text.TextUtils; + +import org.droidplanner.android.client.utils.connection.TcpConnection; +import org.droidplanner.android.client.utils.connection.UdpConnection; +import org.droidplanner.services.android.BuildConfig; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; +import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproRequestState; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageShotManagerError; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import org.droidplanner.services.android.utils.connection.SshConnection; + +import java.io.IOException; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +/** + * Handles solo link related logic. + */ +public class SoloLinkManager extends AbstractLinkManager { + + public static final String SOLO_LINK_IP = "10.1.1.10"; + public static final int SOLO_LINK_TCP_PORT = 5507; + + private static final int SHOT_FOLLOW_UDP_PORT = 14558; + + private static final String SOLO_VERSION_FILENAME = "/VERSION"; + private static final String PIXHAWK_VERSION_FILENAME = "/PIX_VERSION"; + private static final String GIMBAL_VERSION_FILENAME = "/AXON_VERSION"; + + private final UdpConnection followDataConn; + + private static final SshConnection sshLink = new SshConnection(getSoloLinkIp(), SoloComp.SSH_USERNAME, SoloComp.SSH_PASSWORD); + + private final SoloButtonSettingGetter presetButtonAGetter = new SoloButtonSettingGetter(ButtonTypes.BUTTON_A, + ButtonTypes.BUTTON_EVENT_PRESS); + + private final SoloButtonSettingGetter presetButtonBGetter = new SoloButtonSettingGetter(ButtonTypes.BUTTON_B, + ButtonTypes.BUTTON_EVENT_PRESS); + + private final SoloGoproRequestState goproStateGetter = new SoloGoproRequestState(); + + private final AtomicReference loadedPresetButtonA = new AtomicReference<>(); + private final AtomicReference loadedPresetButtonB = new AtomicReference<>(); + + private final AtomicReference vehicleVersion = new AtomicReference<>(""); + private final AtomicReference pixhawkVersion = new AtomicReference<>(""); + private final AtomicReference gimbalVersion = new AtomicReference<>(""); + + private final Runnable soloLinkVersionRetriever = new Runnable() { + @Override + public void run() { + final String version = retrieveVersion(SOLO_VERSION_FILENAME); + if (version != null) { + vehicleVersion.set(version); + } + + if(linkListener != null && areVersionsSet()) + linkListener.onVersionsUpdated(); + } + }; + + private final Runnable pixhawkVersionRetriever = new Runnable() { + @Override + public void run() { + final String version = retrieveVersion(PIXHAWK_VERSION_FILENAME); + if (version != null) { + pixhawkVersion.set(version); + } + + if(linkListener != null && areVersionsSet()) + linkListener.onVersionsUpdated(); + } + }; + + private final Runnable gimbalVersionRetriever = new Runnable() { + @Override + public void run() { + final String version = retrieveVersion(GIMBAL_VERSION_FILENAME); + if(version != null) + gimbalVersion.set(version); + + if(linkListener != null && areVersionsSet()) + linkListener.onVersionsUpdated(); + } + }; + + private SoloLinkListener linkListener; + + public SoloLinkManager(Context context, Handler handler, ExecutorService asyncExecutor) { + super(context, new TcpConnection(handler, getSoloLinkIp(), SOLO_LINK_TCP_PORT), handler, asyncExecutor); + + UdpConnection dataConn = null; + try { + dataConn = new UdpConnection(handler, getSoloLinkIp(), SHOT_FOLLOW_UDP_PORT, 14557); + } catch (UnknownHostException e) { + Timber.e(e, "Error while creating follow udp connection."); + } + + followDataConn = dataConn; + + } + + public static String getSoloLinkIp() { + if (!BuildConfig.SITL_DEBUG) { + return SOLO_LINK_IP; + } else { + return BuildConfig.SOLO_LINK_IP; + } + } + + public String getVehicleVersion() { + return vehicleVersion.get(); + } + + public String getPixhawkVersion() { + return pixhawkVersion.get(); + } + + public String getGimbalVersion(){ + return gimbalVersion.get(); + } + + public boolean areVersionsSet(){ + return !TextUtils.isEmpty(vehicleVersion.get()) && !TextUtils.isEmpty(pixhawkVersion.get()); + } + + @Override + public void start(SoloLinkListener listener) { + if(!isStarted()) { + Timber.i("Starting solo link manager"); + } + + super.start(listener); + this.linkListener = listener; + } + + @Override + public void stop() { + if(isStarted()) { + Timber.i("Stopping solo link manager"); + } + + super.stop(); + } + + @Override + public void refreshState(){ + Timber.d("Connected to sololink."); + + //Load the mac address for the vehicle. + loadMacAddress(); + + loadPresetButtonSettings(); + loadGoproState(); + + refreshSoloLinkVersions(); + } + + @Override + protected SshConnection getSshLink() { + return sshLink; + } + + @Override + public void onIpDisconnected() { + Timber.d("Disconnected from sololink."); + super.onIpDisconnected(); + } + + @Override + public void onPacketReceived(ByteBuffer packetBuffer) { + final List tlvMsgs = TLVMessageParser.parseTLVPacket(packetBuffer); + if (tlvMsgs.isEmpty()) { + return; + } + + for(TLVPacket tlvMsg : tlvMsgs) { + final int messageType = tlvMsg.getMessageType(); + Timber.d("Received tlv message: " + messageType); + + //Have shot manager examine the received message first. + switch (messageType) { + case TLVMessageTypes.TYPE_SOLO_MESSAGE_SHOT_MANAGER_ERROR: + Timber.w(((SoloMessageShotManagerError) tlvMsg).getExceptionInfo()); + break; + + case TLVMessageTypes.TYPE_SOLO_GET_BUTTON_SETTING: + final SoloButtonSettingGetter receivedPresetButton = (SoloButtonSettingGetter) tlvMsg; + handleReceivedPresetButton(receivedPresetButton); + break; + } + + if (linkListener != null) { + linkListener.onTlvPacketReceived(tlvMsg); + } + } + } + + private void sendPacket(byte[] payload, int payloadSize, ICommandListener listener) { + linkConn.sendPacket(payload, payloadSize, listener); + } + + private void sendFollowPacket(byte[] payload, int payloadSize, ICommandListener listener) { + if (followDataConn == null) { + throw new IllegalStateException("Unable to send follow data."); + } + + followDataConn.sendPacket(payload, payloadSize, listener); + } + + public void sendTLVPacket(TLVPacket packet, ICommandListener listener) { + sendTLVPacket(packet, false, listener); + } + + public void sendTLVPacket(TLVPacket packet, boolean useFollowLink, ICommandListener listener) { + if (packet == null) { + return; + } + + final byte[] messagePayload = packet.toBytes(); + if (useFollowLink) { + sendFollowPacket(messagePayload, messagePayload.length, listener); + } else { + sendPacket(messagePayload, messagePayload.length, listener); + } + } + + public void loadPresetButtonSettings() { + sendTLVPacket(presetButtonAGetter, new SimpleCommandListener() { + @Override + public void onSuccess() { + sendTLVPacket(presetButtonBGetter, null); + } + }); + } + + private void loadGoproState() { + sendTLVPacket(goproStateGetter, null); + } + + private void handleReceivedPresetButton(SoloButtonSetting presetButton) { + final int buttonType = presetButton.getButton(); + switch (buttonType) { + case ButtonTypes.BUTTON_A: + loadedPresetButtonA.set(presetButton); + if (linkListener != null) { + linkListener.onPresetButtonLoaded(buttonType, presetButton); + } + break; + + case ButtonTypes.BUTTON_B: + loadedPresetButtonB.set(presetButton); + if (linkListener != null) { + linkListener.onPresetButtonLoaded(buttonType, presetButton); + } + break; + } + } + + public SoloButtonSetting getLoadedPresetButton(int buttonType) { + switch (buttonType) { + case ButtonTypes.BUTTON_A: + return loadedPresetButtonA.get(); + + case ButtonTypes.BUTTON_B: + return loadedPresetButtonB.get(); + + default: + return null; + } + } + + /** + * Update the vehicle preset button settings + */ + public void pushPresetButtonSettings(final SoloButtonSettingSetter buttonSetter, final ICommandListener listener) { + if (!isLinkConnected() || buttonSetter == null) { + return; + } + + sendTLVPacket(buttonSetter, new SimpleCommandListener() { + @Override + public void onSuccess() { + postSuccessEvent(listener); + handleReceivedPresetButton(buttonSetter); + } + + @Override + public void onTimeout() { + postTimeoutEvent(listener); + } + }); + } + + public void disableFollowDataConnection() { + if (followDataConn != null) { + followDataConn.disconnect(); + } + } + + public void enableFollowDataConnection() { + if (followDataConn != null) { + followDataConn.connect(); + } + } + + public boolean updateSololinkWifi(CharSequence wifiSsid, CharSequence password) { + Timber.d(String.format(Locale.US, "Updating solo wifi ssid to %s with password %s", wifiSsid, password)); + try { + String ssidUpdateResult = sshLink.execute(ControllerLinkManager.SOLOLINK_SSID_CONFIG_PATH + " --set-wifi-ssid " + + wifiSsid); + String passwordUpdateResult = sshLink.execute(ControllerLinkManager.SOLOLINK_SSID_CONFIG_PATH + " --set-wifi-password " + + password); + String restartResult = sshLink.execute(ControllerLinkManager.SOLOLINK_SSID_CONFIG_PATH + " --reboot"); + return true; + } catch (IOException e) { + Timber.e(e, "Error occurred while updating the sololink wifi ssid."); + return false; + } + } + + private void updateSoloLinkVersion() { + postAsyncTask(soloLinkVersionRetriever); + } + + private void updatePixhawkVersion() { + postAsyncTask(pixhawkVersionRetriever); + } + + private void updateGimbalVersion(){ + postAsyncTask(gimbalVersionRetriever); + } + + private String retrieveVersion(String versionFile) { + try { + String version = sshLink.execute("cat " + versionFile); + if (TextUtils.isEmpty(version)) { + Timber.d("No version file was found"); + return ""; + } else { + return version.split("\n")[0]; + } + } catch (IOException e) { + Timber.e("Unable to retrieve the current version.", e); + } + + return null; + } + + /** + * Refresh the vehicle's components versions + */ + public void refreshSoloLinkVersions() { + updateSoloLinkVersion(); + updatePixhawkVersion(); + updateGimbalVersion(); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java new file mode 100644 index 0000000000..0a14cf704c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java @@ -0,0 +1,51 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.apm.variables; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.autopilot.apm.ArduPilot; +import org.droidplanner.services.android.core.drone.variables.HeartBeat; + +/** + * Created by Fredia Huya-Kouadio on 10/24/15. + */ +public class APMHeartBeat extends HeartBeat { + + private static final long HEARTBEAT_IMU_CALIBRATION_TIMEOUT = 35000l; //ms + + protected static final int IMU_CALIBRATION = 3; + + public APMHeartBeat(ArduPilot myDrone, Handler handler) { + super(myDrone, handler); + } + + @Override + public void onDroneEvent(DroneInterfaces.DroneEventsType event, MavLinkDrone drone){ + switch(event){ + case CALIBRATION_IMU: + //Set the heartbeat in imu calibration mode. + heartbeatState = IMU_CALIBRATION; + restartWatchdog(HEARTBEAT_IMU_CALIBRATION_TIMEOUT); + break; + + default: + super.onDroneEvent(event, drone); + break; + } + } + + @Override + protected void onHeartbeatTimeout(){ + switch(heartbeatState){ + case IMU_CALIBRATION: + restartWatchdog(HEARTBEAT_IMU_CALIBRATION_TIMEOUT); + myDrone.notifyDroneEvent(DroneInterfaces.DroneEventsType.CALIBRATION_TIMEOUT); + break; + + default: + super.onHeartbeatTimeout(); + break; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java new file mode 100644 index 0000000000..6cfdc1d5b6 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java @@ -0,0 +1,885 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.generic; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.Surface; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.ardupilotmega.msg_ekf_status_report; +import com.MAVLink.common.msg_attitude; +import com.MAVLink.common.msg_global_position_int; +import com.MAVLink.common.msg_gps_raw_int; +import com.MAVLink.common.msg_heartbeat; +import com.MAVLink.common.msg_mission_current; +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.common.msg_mission_item_reached; +import com.MAVLink.common.msg_nav_controller_output; +import com.MAVLink.common.msg_radio_status; +import com.MAVLink.common.msg_sys_status; +import com.MAVLink.common.msg_vibration; +import com.MAVLink.enums.MAV_MODE_FLAG; +import com.MAVLink.enums.MAV_STATE; + +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.core.MAVLink.MavLinkWaypoint; +import org.droidplanner.services.android.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.core.drone.DroneEvents; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.LogMessageListener; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.autopilot.apm.APMConstants; +import org.droidplanner.services.android.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.core.drone.variables.ApmModes; +import org.droidplanner.services.android.core.drone.variables.Camera; +import org.droidplanner.services.android.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.core.drone.variables.HeartBeat; +import org.droidplanner.services.android.core.drone.variables.MissionStats; +import org.droidplanner.services.android.core.drone.variables.State; +import org.droidplanner.services.android.core.drone.variables.StreamRates; +import org.droidplanner.services.android.core.drone.variables.Type; +import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.action.CapabilityActions; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; +import org.droidplanner.services.android.lib.drone.action.StateActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; +import org.droidplanner.services.android.lib.drone.property.Altitude; +import org.droidplanner.services.android.lib.drone.property.Attitude; +import org.droidplanner.services.android.lib.drone.property.Battery; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.drone.property.Home; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameters; +import org.droidplanner.services.android.lib.drone.property.Signal; +import org.droidplanner.services.android.lib.drone.property.Speed; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.services.android.lib.drone.property.Vibration; +import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; +import org.droidplanner.services.android.lib.util.MathUtils; +import org.droidplanner.services.android.utils.CommonApiUtils; +import org.droidplanner.services.android.utils.prefs.DroidPlannerPrefs; +import org.droidplanner.services.android.utils.video.VideoManager; + +/** + * Base drone implementation. + * Supports mavlink messages belonging to the common set: https://pixhawk.ethz.ch/mavlink/ + *

+ * Created by Fredia Huya-Kouadio on 9/10/15. + */ +public class GenericMavLinkDrone implements MavLinkDrone { + + private final DataLink.DataLinkProvider mavClient; + + protected final VideoManager videoMgr; + + private final DroneEvents events; + protected final Type type; + private final State state; + private final HeartBeat heartbeat; + private final StreamRates streamRates; + private final ParameterManager parameterManager; + private final LogMessageListener logListener; + private final MissionStats missionStats; + + private DroneInterfaces.AttributeEventListener attributeListener; + + private final Home vehicleHome = new Home(); + private final Gps vehicleGps = new Gps(); + private final Parameters parameters = new Parameters(); + protected final Altitude altitude = new Altitude(); + protected final Speed speed = new Speed(); + protected final Battery battery = new Battery(); + protected final Signal signal = new Signal(); + protected final Attitude attitude = new Attitude(); + protected final Vibration vibration = new Vibration(); + + protected final Handler handler; + + private final String droneId; + + public GenericMavLinkDrone(String droneId, Context context, Handler handler, DataLink.DataLinkProvider mavClient, + AutopilotWarningParser warningParser, LogMessageListener logListener) { + this.droneId = droneId; + this.handler = handler; + this.mavClient = mavClient; + + this.logListener = logListener; + + events = new DroneEvents(this, handler); + heartbeat = initHeartBeat(handler); + this.type = new Type(this); + this.missionStats = new MissionStats(this); + this.streamRates = new StreamRates(this); + this.state = new State(this, handler, warningParser); + parameterManager = new ParameterManager(this, context, handler); + + this.videoMgr = new VideoManager(context, handler); + } + + @Override + public String getId(){ + return droneId; + } + + @Override + public void setAttributeListener(DroneInterfaces.AttributeEventListener attributeListener) { + this.attributeListener = attributeListener; + } + + @Override + public MissionStats getMissionStats() { + return missionStats; + } + + @Override + public Mission getMission() { + //TODO: complete implementation + return null; + } + + @Override + public Camera getCamera() { + //TODO: complete implementation + return null; + } + + @Override + public GuidedPoint getGuidedPoint() { + //TODO: complete implementation + return null; + } + + @Override + public AccelCalibration getCalibrationSetup() { + //TODO: complete implementation + return null; + } + + @Override + public WaypointManager getWaypointManager() { + //TODO: complete implementation + return null; + } + + @Override + public MagnetometerCalibrationImpl getMagnetometerCalibration() { + //TODO: complete implementation + return null; + } + + @Override + public void destroy(){ + ParameterManager parameterManager = getParameterManager(); + if (parameterManager != null) + parameterManager.setParameterListener(null); + + MagnetometerCalibrationImpl magnetometer = getMagnetometerCalibration(); + if (magnetometer != null) + magnetometer.setListener(null); + } + + protected HeartBeat initHeartBeat(Handler handler) { + return new HeartBeat(this, handler); + } + + @Override + public FirmwareType getFirmwareType() { + return FirmwareType.GENERIC; + } + + @Override + public String getFirmwareVersion() { + return type.getFirmwareVersion(); + } + + protected void setFirmwareVersion(String message) { + type.setFirmwareVersion(message); + } + + @Override + public ParameterManager getParameterManager() { + return parameterManager; + } + + protected void logMessage(int logLevel, String message) { + if (logListener != null) + logListener.onMessageLogged(logLevel, message); + } + + @Override + public State getState() { + return state; + } + + @Override + public boolean isConnected() { + return mavClient.isConnected() && heartbeat.hasHeartbeat(); + } + + @Override + public boolean isConnectionAlive() { + return heartbeat.isConnectionAlive(); + } + + @Override + public byte getSysid() { + return heartbeat.getSysid(); + } + + @Override + public byte getCompid() { + return heartbeat.getCompid(); + } + + @Override + public int getMavlinkVersion() { + return heartbeat.getMavlinkVersion(); + } + + @Override + public void addDroneListener(DroneInterfaces.OnDroneListener listener) { + events.addDroneListener(listener); + } + + @Override + public StreamRates getStreamRates() { + return streamRates; + } + + @Override + public void removeDroneListener(DroneInterfaces.OnDroneListener listener) { + events.removeDroneListener(listener); + } + + public void startVideoStream(Bundle videoProps, String appId, String newVideoTag, Surface videoSurface, + ICommandListener listener) { + videoMgr.startVideoStream(videoProps, appId, newVideoTag, videoSurface, listener); + } + + public void stopVideoStream(String appId, String currentVideoTag, ICommandListener listener) { + videoMgr.stopVideoStream(appId, currentVideoTag, listener); + } + + public void startVideoStreamForObserver(String appId, String newVideoTag, ICommandListener listener) { + videoMgr.startVideoStreamForObserver(appId, newVideoTag, listener); + } + + public void stopVideoStreamForObserver(String appId, String currentVideoTag, ICommandListener listener) { + videoMgr.stopVideoStreamForObserver(appId, currentVideoTag, listener); + } + + /** + * Stops the video stream if the current owner is the passed argument. + * + * @param appId + */ + public void tryStoppingVideoStream(String appId) { + videoMgr.tryStoppingVideoStream(appId); + } + + protected void notifyAttributeListener(String attributeEvent) { + notifyAttributeListener(attributeEvent, null); + } + + protected void notifyAttributeListener(String attributeEvent, Bundle eventInfo) { + notifyAttributeListener(attributeEvent, eventInfo, false); + } + + protected void notifyAttributeListener(String attributeEvent, Bundle eventInfo, boolean checkForSololinkApi) { + if (attributeListener != null) { + if(eventInfo == null){ + eventInfo = new Bundle(); + } + eventInfo.putString(AttributeEventExtra.EXTRA_VEHICLE_ID, getId()); + + attributeListener.onAttributeEvent(attributeEvent, eventInfo, checkForSololinkApi); + } + } + + @Override + public void notifyDroneEvent(DroneInterfaces.DroneEventsType event) { + switch (event) { + case DISCONNECTED: + signal.setValid(false); + break; + } + + events.notifyDroneEvent(event); + } + + @Override + public DataLink.DataLinkProvider getMavClient() { + return mavClient; + } + + @Override + public boolean executeAsyncAction(Action action, ICommandListener listener) { + String type = action.getType(); + Bundle data = action.getData(); + + switch (type) { + //MISSION ACTIONS + case MissionActions.ACTION_GENERATE_DRONIE: + float bearing = CommonApiUtils.generateDronie(this); + if (bearing != -1) { + Bundle bundle = new Bundle(1); + bundle.putFloat(AttributeEventExtra.EXTRA_MISSION_DRONIE_BEARING, bearing); + notifyAttributeListener(AttributeEvent.MISSION_DRONIE_CREATED, bundle); + } + return true; + + case MissionActions.ACTION_GOTO_WAYPOINT: + int missionItemIndex = data.getInt(MissionActions.EXTRA_MISSION_ITEM_INDEX); + CommonApiUtils.gotoWaypoint(this, missionItemIndex, listener); + return true; + + case MissionActions.ACTION_CHANGE_MISSION_SPEED: + float missionSpeed = data.getFloat(MissionActions.EXTRA_MISSION_SPEED); + MavLinkCommands.changeMissionSpeed(this, missionSpeed, listener); + return true; + + // STATE ACTIONS + case StateActions.ACTION_ARM: + return performArming(data, listener); + + case StateActions.ACTION_SET_VEHICLE_MODE: + return setVehicleMode(data, listener); + + case StateActions.ACTION_UPDATE_VEHICLE_DATA_STREAM_RATE: + return updateVehicleDataStreamRate(data, listener); + + // CONTROL ACTIONS + case ControlActions.ACTION_DO_GUIDED_TAKEOFF: + return performTakeoff(data, listener); + + case ControlActions.ACTION_SEND_BRAKE_VEHICLE: + return brakeVehicle(listener); + + case ControlActions.ACTION_SET_CONDITION_YAW: + // Retrieve the yaw turn speed. + float turnSpeed = 2; // Default turn speed. + + ParameterManager parameterManager = getParameterManager(); + if (parameterManager != null) { + Parameter turnSpeedParam = parameterManager.getParameter("ACRO_YAW_P"); + if (turnSpeedParam != null) { + turnSpeed = (float) turnSpeedParam.getValue(); + } + } + + float targetAngle = data.getFloat(ControlActions.EXTRA_YAW_TARGET_ANGLE); + float yawRate = data.getFloat(ControlActions.EXTRA_YAW_CHANGE_RATE); + boolean isClockwise = yawRate >= 0; + boolean isRelative = data.getBoolean(ControlActions.EXTRA_YAW_IS_RELATIVE); + + MavLinkCommands.setConditionYaw(this, targetAngle, Math.abs(yawRate) * turnSpeed, isClockwise, isRelative, listener); + return true; + + case ControlActions.ACTION_SET_VELOCITY: + return setVelocity(data, listener); + + case ControlActions.ACTION_ENABLE_MANUAL_CONTROL: + return enableManualControl(data, listener); + + // EXPERIMENTAL ACTIONS + case ExperimentalActions.ACTION_SEND_MAVLINK_MESSAGE: + data.setClassLoader(MavlinkMessageWrapper.class.getClassLoader()); + MavlinkMessageWrapper messageWrapper = data.getParcelable(ExperimentalActions.EXTRA_MAVLINK_MESSAGE); + CommonApiUtils.sendMavlinkMessage(this, messageWrapper); + return true; + + // INTERNAL DRONE ACTIONS + case ACTION_REQUEST_HOME_UPDATE: + requestHomeUpdate(); + return true; + + //**************** CAPABILITY ACTIONS **************// + case CapabilityActions.ACTION_CHECK_FEATURE_SUPPORT: + return checkFeatureSupport(data, listener); + + default: + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return true; + } + } + + private boolean updateVehicleDataStreamRate(Bundle data, ICommandListener listener) { + StreamRates streamRates = getStreamRates(); + if(streamRates != null){ + int rate = data.getInt(StateActions.EXTRA_VEHICLE_DATA_STREAM_RATE, DroidPlannerPrefs.DEFAULT_STREAM_RATE); + StreamRates.Rates rates = new StreamRates.Rates(rate); + streamRates.setRates(rates); + + streamRates.setupStreamRatesFromPref(); + CommonApiUtils.postSuccessEvent(listener); + return true; + } + + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return false; + } + + private boolean checkFeatureSupport(Bundle data, ICommandListener listener) { + String featureId = data.getString(CapabilityActions.EXTRA_FEATURE_ID); + if (!TextUtils.isEmpty(featureId)) { + if(isFeatureSupported(featureId)){ + CommonApiUtils.postSuccessEvent(listener); + }else{ + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + } + } + else{ + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + + return true; + } + + protected boolean isFeatureSupported(String featureId){ + return false; + } + + protected boolean enableManualControl(Bundle data, ICommandListener listener) { + boolean enable = data.getBoolean(ControlActions.EXTRA_DO_ENABLE); + if (enable) { + CommonApiUtils.postSuccessEvent(listener); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + } + return true; + } + + protected boolean performArming(Bundle data, ICommandListener listener) { + boolean doArm = data.getBoolean(StateActions.EXTRA_ARM); + boolean emergencyDisarm = data.getBoolean(StateActions.EXTRA_EMERGENCY_DISARM); + + if (!doArm && emergencyDisarm) { + MavLinkCommands.sendFlightTermination(this, listener); + } else { + MavLinkCommands.sendArmMessage(this, doArm, false, listener); + } + return true; + } + + protected boolean setVehicleMode(Bundle data, ICommandListener listener) { + data.setClassLoader(VehicleMode.class.getClassLoader()); + VehicleMode newMode = data.getParcelable(StateActions.EXTRA_VEHICLE_MODE); + if (newMode != null) { + switch (newMode) { + case COPTER_LAND: + MavLinkCommands.sendNavLand(this, listener); + break; + + case COPTER_RTL: + MavLinkCommands.sendNavRTL(this, listener); + break; + + case COPTER_GUIDED: + MavLinkCommands.sendPause(this, listener); + break; + + case COPTER_AUTO: + MavLinkCommands.startMission(this, listener); + break; + } + } + return true; + } + + protected boolean setVelocity(Bundle data, ICommandListener listener) { + float xAxis = data.getFloat(ControlActions.EXTRA_VELOCITY_X); + short x = (short) (xAxis * 1000); + + float yAxis = data.getFloat(ControlActions.EXTRA_VELOCITY_Y); + short y = (short) (yAxis * 1000); + + float zAxis = data.getFloat(ControlActions.EXTRA_VELOCITY_Z); + short z = (short) (zAxis * 1000); + + MavLinkCommands.sendManualControl(this, x, y, z, (short) 0, 0, listener); + return true; + } + + protected boolean performTakeoff(Bundle data, ICommandListener listener) { + double takeoffAltitude = data.getDouble(ControlActions.EXTRA_ALTITUDE); + MavLinkCommands.sendTakeoff(this, takeoffAltitude, listener); + return true; + } + + protected boolean brakeVehicle(ICommandListener listener) { + getGuidedPoint().pauseAtCurrentLocation(listener); + return true; + } + + @Override + public DroneAttribute getAttribute(String attributeType) { + if (TextUtils.isEmpty(attributeType)) + return null; + + switch (attributeType) { + case AttributeType.SPEED: + return speed; + + case AttributeType.BATTERY: + return battery; + + case AttributeType.SIGNAL: + return signal; + + case AttributeType.ATTITUDE: + return attitude; + + case AttributeType.ALTITUDE: + return altitude; + + case AttributeType.STATE: + return CommonApiUtils.getState(this, isConnected(), vibration); + + case AttributeType.GPS: + return vehicleGps; + + case AttributeType.HOME: + return vehicleHome; + + case AttributeType.PARAMETERS: + ParameterManager paramMgr = getParameterManager(); + if (paramMgr != null) { + parameters.setParametersList(paramMgr.getParameters().values()); + } + + return parameters; + + case AttributeType.TYPE: + return CommonApiUtils.getType(this); + } + + return null; + } + + private void onHeartbeat(MAVLinkMessage msg) { + heartbeat.onHeartbeat(msg); + } + + @Override + public void onMavLinkMessageReceived(MAVLinkMessage message) { + + onHeartbeat(message); + + switch (message.msgid) { + case msg_radio_status.MAVLINK_MSG_ID_RADIO_STATUS: + msg_radio_status m_radio_status = (msg_radio_status) message; + processSignalUpdate(m_radio_status.rxerrors, m_radio_status.fixed, m_radio_status.rssi, + m_radio_status.remrssi, m_radio_status.txbuf, m_radio_status.noise, m_radio_status.remnoise); + break; + + case msg_attitude.MAVLINK_MSG_ID_ATTITUDE: + msg_attitude m_att = (msg_attitude) message; + processAttitude(m_att); + break; + + case msg_heartbeat.MAVLINK_MSG_ID_HEARTBEAT: + msg_heartbeat msg_heart = (msg_heartbeat) message; + processHeartbeat(msg_heart); + break; + + case msg_vibration.MAVLINK_MSG_ID_VIBRATION: + msg_vibration vibrationMsg = (msg_vibration) message; + processVibrationMessage(vibrationMsg); + break; + + //*************** EKF State handling ******************// + case msg_ekf_status_report.MAVLINK_MSG_ID_EKF_STATUS_REPORT: + processEfkStatus((msg_ekf_status_report) message); + break; + + case msg_sys_status.MAVLINK_MSG_ID_SYS_STATUS: + msg_sys_status m_sys = (msg_sys_status) message; + processSysStatus(m_sys); + break; + + case msg_global_position_int.MAVLINK_MSG_ID_GLOBAL_POSITION_INT: + processGlobalPositionInt((msg_global_position_int) message); + break; + + case msg_gps_raw_int.MAVLINK_MSG_ID_GPS_RAW_INT: + processGpsState((msg_gps_raw_int) message); + break; + + case msg_mission_item.MAVLINK_MSG_ID_MISSION_ITEM: + processHomeUpdate((msg_mission_item) message); + break; + + case msg_mission_current.MAVLINK_MSG_ID_MISSION_CURRENT: + missionStats.setWpno(((msg_mission_current) message).seq); + break; + + case msg_mission_item_reached.MAVLINK_MSG_ID_MISSION_ITEM_REACHED: + missionStats.setLastReachedWaypointNumber(((msg_mission_item_reached) message).seq); + break; + + case msg_nav_controller_output.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT: + msg_nav_controller_output m_nav = (msg_nav_controller_output) message; + setDisttowpAndSpeedAltErrors(m_nav.wp_dist, m_nav.alt_error, m_nav.aspd_error); + break; + } + } + + protected void processSysStatus(msg_sys_status m_sys) { + processBatteryUpdate(m_sys.voltage_battery / 1000.0, m_sys.battery_remaining, + m_sys.current_battery / 100.0); + } + + private void processHeartbeat(msg_heartbeat msg_heart) { + setType(msg_heart.type); + checkIfFlying(msg_heart); + processState(msg_heart); + processVehicleMode(msg_heart); + } + + private void processVehicleMode(msg_heartbeat msg_heart) { + ApmModes newMode = ApmModes.getMode(msg_heart.custom_mode, getType()); + state.setMode(newMode); + } + + private void processState(msg_heartbeat msg_heart) { + checkArmState(msg_heart); + checkFailsafe(msg_heart); + } + + private void checkFailsafe(msg_heartbeat msg_heart) { + boolean failsafe2 = msg_heart.system_status == MAV_STATE.MAV_STATE_CRITICAL + || msg_heart.system_status == MAV_STATE.MAV_STATE_EMERGENCY; + + if (failsafe2) { + state.repeatWarning(); + } + } + + private void checkArmState(msg_heartbeat msg_heart) { + state.setArmed( + (msg_heart.base_mode & MAV_MODE_FLAG.MAV_MODE_FLAG_SAFETY_ARMED) == MAV_MODE_FLAG.MAV_MODE_FLAG_SAFETY_ARMED); + } + + private void checkIfFlying(msg_heartbeat msg_heart) { + short systemStatus = msg_heart.system_status; + boolean wasFlying = state.isFlying(); + + boolean isFlying = systemStatus == MAV_STATE.MAV_STATE_ACTIVE + || (wasFlying + && (systemStatus == MAV_STATE.MAV_STATE_CRITICAL || systemStatus == MAV_STATE.MAV_STATE_EMERGENCY)); + + state.setIsFlying(isFlying); + } + + private void setDisttowpAndSpeedAltErrors(double disttowp, double alt_error, double aspd_error) { + missionStats.setDistanceToWp(disttowp); + + this.altitude.setTargetAltitude(this.altitude.getAltitude() + alt_error); + notifyDroneEvent(DroneInterfaces.DroneEventsType.ORIENTATION); + } + + public void processHomeUpdate(msg_mission_item missionItem) { + if (missionItem.seq != APMConstants.HOME_WAYPOINT_INDEX) { + return; + } + + float latitude = missionItem.x; + float longitude = missionItem.y; + float altitude = missionItem.z; + boolean homeUpdated = false; + + LatLongAlt homeCoord = vehicleHome.getCoordinate(); + if (homeCoord == null) { + vehicleHome.setCoordinate(new LatLongAlt(latitude, longitude, altitude)); + homeUpdated = true; + } else { + if (homeCoord.getLatitude() != latitude + || homeCoord.getLongitude() != longitude + || homeCoord.getAltitude() != altitude) { + homeCoord.setLatitude(latitude); + homeCoord.setLongitude(longitude); + homeCoord.setAltitude(altitude); + homeUpdated = true; + } + } + + if (homeUpdated) { + notifyDroneEvent(DroneInterfaces.DroneEventsType.HOME); + } + } + + protected void processBatteryUpdate(double voltage, double remain, double current) { + if (battery.getBatteryVoltage() != voltage || battery.getBatteryRemain() != remain || battery.getBatteryCurrent() != current) { + battery.setBatteryVoltage(voltage); + battery.setBatteryRemain(remain); + battery.setBatteryCurrent(current); + + notifyDroneEvent(DroneInterfaces.DroneEventsType.BATTERY); + } + } + + private void processVibrationMessage(msg_vibration vibrationMsg) { + boolean wasUpdated = false; + + if (vibration.getVibrationX() != vibrationMsg.vibration_x) { + vibration.setVibrationX(vibrationMsg.vibration_x); + wasUpdated = true; + } + + if (vibration.getVibrationY() != vibrationMsg.vibration_y) { + vibration.setVibrationY(vibrationMsg.vibration_y); + wasUpdated = true; + } + + if (vibration.getVibrationZ() != vibrationMsg.vibration_z) { + vibration.setVibrationZ(vibrationMsg.vibration_z); + wasUpdated = true; + } + + if (vibration.getFirstAccelClipping() != vibrationMsg.clipping_0) { + vibration.setFirstAccelClipping(vibrationMsg.clipping_0); + wasUpdated = true; + } + + if (vibration.getSecondAccelClipping() != vibrationMsg.clipping_1) { + vibration.setSecondAccelClipping(vibrationMsg.clipping_1); + wasUpdated = true; + } + + if (vibration.getThirdAccelClipping() != vibrationMsg.clipping_2) { + vibration.setThirdAccelClipping(vibrationMsg.clipping_2); + wasUpdated = true; + } + + if (wasUpdated) { + notifyAttributeListener(AttributeEvent.STATE_VEHICLE_VIBRATION); + } + } + + protected void setType(int type) { + this.type.setType(type); + } + + @Override + public int getType() { + return type.getType(); + } + + private void processAttitude(msg_attitude m_att) { + attitude.setRoll(Math.toDegrees(m_att.roll)); + attitude.setRollSpeed((float) Math.toDegrees(m_att.rollspeed)); + + attitude.setPitch(Math.toDegrees(m_att.pitch)); + attitude.setPitchSpeed((float) Math.toDegrees(m_att.pitchspeed)); + + attitude.setYaw(Math.toDegrees(m_att.yaw)); + attitude.setYawSpeed((float) Math.toDegrees(m_att.yawspeed)); + + notifyDroneEvent(DroneInterfaces.DroneEventsType.ATTITUDE); + } + + protected void processSignalUpdate(int rxerrors, int fixed, short rssi, short remrssi, short txbuf, + short noise, short remnoise) { + signal.setValid(true); + signal.setRxerrors(rxerrors & 0xFFFF); + signal.setFixed(fixed & 0xFFFF); + signal.setRssi(SikValueToDB(rssi & 0xFF)); + signal.setRemrssi(SikValueToDB(remrssi & 0xFF)); + signal.setNoise(SikValueToDB(noise & 0xFF)); + signal.setRemnoise(SikValueToDB(remnoise & 0xFF)); + signal.setTxbuf(txbuf & 0xFF); + + signal.setSignalStrength(MathUtils.getSignalStrength(signal.getFadeMargin(), signal.getRemFadeMargin())); + + notifyDroneEvent(DroneInterfaces.DroneEventsType.RADIO); + } + + /** + * Scalling done at the Si1000 radio More info can be found at: + * http://copter.ardupilot.com/wiki/common-using-the-3dr-radio-for-telemetry-with-apm-and-px4/#Power_levels + */ + protected double SikValueToDB(int value) { + return (value / 1.9) - 127; + } + + /** + * Used to update the vehicle location. + * + * @param gpi + */ + protected void processGlobalPositionInt(msg_global_position_int gpi) { + if (gpi == null) + return; + + double newLat = gpi.lat / 1E7; + double newLong = gpi.lon / 1E7; + + boolean positionUpdated = false; + LatLong gpsPosition = vehicleGps.getPosition(); + if (gpsPosition == null) { + gpsPosition = new LatLong(newLat, newLong); + vehicleGps.setPosition(gpsPosition); + positionUpdated = true; + } else if (gpsPosition.getLatitude() != newLat || gpsPosition.getLongitude() != newLong) { + gpsPosition.setLatitude(newLat); + gpsPosition.setLongitude(newLong); + positionUpdated = true; + } + + if (positionUpdated) { + notifyAttributeListener(AttributeEvent.GPS_POSITION); + } + } + + private void processEfkStatus(msg_ekf_status_report ekf_status_report) { + state.setEkfStatus(ekf_status_report); + + vehicleGps.setVehicleArmed(state.isArmed()); + vehicleGps.setEkfStatus(CommonApiUtils.generateEkfStatus(ekf_status_report)); + + notifyAttributeListener(AttributeEvent.GPS_POSITION); + } + + private void processGpsState(msg_gps_raw_int gpsState) { + if (gpsState == null) + return; + + double newEph = gpsState.eph / 100.0; // convert from eph(cm) to gps_eph(m) + if (vehicleGps.getSatellitesCount() != gpsState.satellites_visible + || vehicleGps.getGpsEph() != newEph) { + vehicleGps.setSatCount(gpsState.satellites_visible); + vehicleGps.setGpsEph(newEph); + notifyAttributeListener(AttributeEvent.GPS_COUNT); + } + + if (vehicleGps.getFixType() != gpsState.fix_type) { + vehicleGps.setFixType(gpsState.fix_type); + notifyAttributeListener(AttributeEvent.GPS_FIX); + } + } + + protected void requestHomeUpdate() { + requestHomeUpdate(this); + } + + private static void requestHomeUpdate(MavLinkDrone drone) { + MavLinkWaypoint.requestWayPoint(drone, APMConstants.HOME_WAYPOINT_INDEX); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java new file mode 100644 index 0000000000..43a9d5f5db --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java @@ -0,0 +1,28 @@ +package org.droidplanner.services.android.impl.core.drone.autopilot.px4; + +import android.content.Context; +import android.os.Handler; + +import com.MAVLink.Messages.MAVLinkMessage; + +import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.core.drone.LogMessageListener; +import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; + +/** + * Created by Fredia Huya-Kouadio on 9/10/15. + */ +public class Px4Native extends GenericMavLinkDrone { + + public Px4Native(String droneId, Context context, Handler handler, DataLink.DataLinkProvider mavClient, AutopilotWarningParser warningParser, LogMessageListener logListener) { + super(droneId, context, handler, mavClient, warningParser, logListener); + } + + @Override + public FirmwareType getFirmwareType() { + return FirmwareType.PX4_NATIVE; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java new file mode 100644 index 0000000000..5c2b25ba6e --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java @@ -0,0 +1,176 @@ +package org.droidplanner.services.android.impl.core.drone.manager; + +import android.os.Handler; +import android.os.RemoteException; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_command_ack; +import com.MAVLink.common.msg_command_long; +import com.MAVLink.common.msg_set_mode; + +import org.droidplanner.services.android.lib.model.ICommandListener; + +import java.util.concurrent.ConcurrentHashMap; + +import timber.log.Timber; + +/** + * Handles tracking and dispatching of the command listener events. + * Created by Fredia Huya-Kouadio on 6/24/15. + */ +public class DroneCommandTracker { + + private static final long COMMAND_TIMEOUT_PERIOD = 2000l; //2 seconds + + private final Handler handler; + + private final ConcurrentHashMap keyStore = new ConcurrentHashMap<>(); + private final ConcurrentHashMap callbackStore = new ConcurrentHashMap<>(); + + DroneCommandTracker(Handler handler) { + this.handler = handler; + } + + public void onCommandSubmitted(MAVLinkMessage command, ICommandListener listener) { + if (command == null || listener == null) + return; + + if (command instanceof msg_command_long) { + onCommandSubmittedImpl((msg_command_long) command, listener); + } else if (command instanceof msg_set_mode) { + onCommandSubmittedImpl((msg_set_mode) command, listener); + } + } + + private void onCommandSubmittedImpl(msg_command_long command, ICommandListener listener) { + final int commandId = command.command; + final CallbackKey key = new CallbackKey(commandId) { + + @Override + public int checkAckResult(msg_command_ack result) { + return result.result; + } + }; + final AckCallback callback = new AckCallback(listener, commandId); + + keyStore.put(commandId, key); + callbackStore.put(key, callback); + + handler.postDelayed(callback, COMMAND_TIMEOUT_PERIOD); + } + + private void onCommandSubmittedImpl(final msg_set_mode command, ICommandListener listener) { + final int commandId = command.msgid; + + final CallbackKey key = new CallbackKey(commandId) { + @Override + public int checkAckResult(msg_command_ack result) { + return result.result; + } + }; + final AckCallback callback = new AckCallback(listener, commandId); + + keyStore.put(commandId, key); + callbackStore.put(key, callback); + + handler.postDelayed(callback, COMMAND_TIMEOUT_PERIOD); + } + + public void onCommandAck(int commandId, Object ack) { + switch (commandId) { + case msg_command_ack.MAVLINK_MSG_ID_COMMAND_ACK: + onCommandAckImpl((msg_command_ack) ack); + break; + } + } + + private void onCommandAckImpl(msg_command_ack ack) { + final CallbackKey key = keyStore.get(ack.command); + if (key == null) + return; + + final AckCallback callback = callbackStore.remove(key); + if (callback != null) { + handler.removeCallbacks(callback); + callback.setAckResult(key.checkAckResult(ack)); + handler.post(callback); + } + } + + private static abstract class CallbackKey { + private final int commandId; + + CallbackKey(int commandId) { + this.commandId = commandId; + } + + public abstract int checkAckResult(T result); + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + + if (!(o instanceof CallbackKey)) + return false; + + CallbackKey that = (CallbackKey) o; + return this.commandId == that.commandId; + } + + @Override + public int hashCode() { + return this.commandId; + } + } + + private class AckCallback implements Runnable { + + private static final int COMMAND_TIMED_OUT = -1; + private static final int COMMAND_SUCCEED = 0; + + private int ackResult = COMMAND_TIMED_OUT; + + private final ICommandListener listener; + private final int ackId; + + AckCallback(ICommandListener listener, int ackId) { + this.listener = listener; + this.ackId = ackId; + } + + void setAckResult(int result) { + this.ackResult = result; + } + + @Override + public void run() { + if (listener == null) + return; + + final CallbackKey key = keyStore.remove(ackId); + if (key != null) + callbackStore.remove(key); + + Timber.d("Callback with ack result %d", ackResult); + + try { + switch (ackResult) { + case COMMAND_TIMED_OUT: + listener.onTimeout(); + break; + + case COMMAND_SUCCEED: + listener.onSuccess(); + break; + + default: + listener.onError(ackResult); + break; + } + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java new file mode 100644 index 0000000000..a2851e7193 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java @@ -0,0 +1,362 @@ +package org.droidplanner.services.android.impl.core.drone.manager; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; + +import com.MAVLink.MAVLinkPacket; +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.ardupilotmega.msg_mag_cal_progress; +import com.MAVLink.ardupilotmega.msg_mag_cal_report; +import com.MAVLink.common.msg_command_ack; +import com.google.android.gms.location.LocationRequest; + +import org.droidplanner.services.android.impl.api.DroneApi; +import org.droidplanner.services.android.impl.communication.service.MAVLinkClient; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkMsgHandler; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.DroneManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.ArduCopter; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.ArduPlane; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.ArduRover; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.ArduSolo; +import org.droidplanner.services.android.impl.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.px4.Px4Native; +import org.droidplanner.services.android.impl.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.impl.core.drone.variables.StreamRates; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.gcs.GCSHeartbeat; +import org.droidplanner.services.android.impl.core.gcs.ReturnToMe; +import org.droidplanner.services.android.impl.core.gcs.follow.Follow; +import org.droidplanner.services.android.impl.core.gcs.follow.FollowAlgorithm; +import org.droidplanner.services.android.impl.core.gcs.location.FusedLocation; +import org.droidplanner.services.android.impl.utils.AndroidApWarningParser; +import org.droidplanner.services.android.impl.utils.CommonApiUtils; +import org.droidplanner.services.android.impl.utils.SoloApiUtils; +import org.droidplanner.services.android.impl.utils.prefs.DroidPlannerPrefs; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.action.GimbalActions; +import org.droidplanner.services.android.lib.drone.action.StateActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.gcs.action.FollowMeActions; +import org.droidplanner.services.android.lib.gcs.follow.FollowType; +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import timber.log.Timber; + +/** + * Created by Fredia Huya-Kouadio on 12/17/15. + */ +public class MavLinkDroneManager extends DroneManager implements MagnetometerCalibrationImpl.OnMagnetometerCalibrationListener { + + private Follow followMe; + private ReturnToMe returnToMe; + + private final MAVLinkClient mavClient; + private final MavLinkMsgHandler mavLinkMsgHandler; + private final DroneCommandTracker commandTracker; + + private final GCSHeartbeat gcsHeartbeat; + + public MavLinkDroneManager(Context context, ConnectionParameter connParams, Handler handler) { + super(context, connParams, handler); + + commandTracker = new DroneCommandTracker(handler); + + mavClient = new MAVLinkClient(context, this, connParams, commandTracker); + + this.gcsHeartbeat = new GCSHeartbeat(mavClient, 1); + + this.mavLinkMsgHandler = new MavLinkMsgHandler(this); + } + + public void onVehicleTypeReceived(FirmwareType type) { + if (drone != null) { + return; + } + + final String droneId = connectionParameter.getUniqueId() + ":" + type.getType(); + + switch (type) { + case ARDU_COPTER: + if (isCompanionComputerEnabled()) { + onVehicleTypeReceived(FirmwareType.ARDU_SOLO); + return; + } + + Timber.i("Instantiating ArduCopter autopilot."); + this.drone = new ArduCopter(droneId, context, mavClient, handler, new AndroidApWarningParser(), this); + break; + + case ARDU_SOLO: + Timber.i("Instantiating ArduSolo autopilot."); + this.drone = new ArduSolo(droneId, context, mavClient, handler, new AndroidApWarningParser(), this); + break; + + case ARDU_PLANE: + Timber.i("Instantiating ArduPlane autopilot."); + this.drone = new ArduPlane(droneId, context, mavClient, handler, new AndroidApWarningParser(), this); + break; + + case ARDU_ROVER: + Timber.i("Instantiating ArduPlane autopilot."); + this.drone = new ArduRover(droneId, context, mavClient, handler, new AndroidApWarningParser(), this); + break; + + case PX4_NATIVE: + Timber.i("Instantiating PX4 Native autopilot."); + this.drone = new Px4Native(droneId, context, handler, mavClient, new AndroidApWarningParser(), this); + break; + + case GENERIC: + Timber.i("Instantiating Generic mavlink autopilot."); + this.drone = new GenericMavLinkDrone(droneId, context, handler, mavClient, new AndroidApWarningParser(), this); + break; + } + + this.followMe = new Follow(this, handler, new FusedLocation(context, handler)); + this.returnToMe = new ReturnToMe(this, new FusedLocation(context, handler, + LocationRequest.PRIORITY_HIGH_ACCURACY, 1000L, 1000L, ReturnToMe.UPDATE_MINIMAL_DISPLACEMENT), this); + + StreamRates streamRates = drone.getStreamRates(); + if (streamRates != null) { + DroidPlannerPrefs dpPrefs = new DroidPlannerPrefs(context); + streamRates.setRates(dpPrefs.getRates()); + } + + drone.addDroneListener(this); + drone.setAttributeListener(this); + + ParameterManager parameterManager = drone.getParameterManager(); + if (parameterManager != null) { + parameterManager.setParameterListener(this); + } + + MagnetometerCalibrationImpl magnetometer = drone.getMagnetometerCalibration(); + if (magnetometer != null) { + magnetometer.setListener(this); + } + } + + @Override + public void destroy() { + super.destroy(); + if (followMe != null && followMe.isEnabled()) + followMe.toggleFollowMeState(); + + if (returnToMe != null) + returnToMe.disable(); + } + + @Override + protected void doConnect(String appId, DroneApi listener) { + if (mavClient.isDisconnected()) { + Timber.i("Opening connection for %s", appId); + mavClient.openConnection(); + } else { + if (isConnected()) { + listener.onDroneEvent(DroneInterfaces.DroneEventsType.CONNECTED, drone); + if (!drone.isConnectionAlive()) + listener.onDroneEvent(DroneInterfaces.DroneEventsType.HEARTBEAT_TIMEOUT, drone); + } + } + + mavClient.addLoggingFile(appId); + } + + @Override + protected void doDisconnect(String appId, DroneApi listener) { + if (drone instanceof GenericMavLinkDrone) { + ((GenericMavLinkDrone) drone).tryStoppingVideoStream(appId); + } + + if (listener != null) { + mavClient.removeLoggingFile(appId); + if (isConnected()) { + listener.onDroneEvent(DroneInterfaces.DroneEventsType.DISCONNECTED, drone); + } + } + + if (mavClient.isConnected() && connectedApps.isEmpty()) { + //Reset the gimbal mount mode + executeAsyncAction(new Action(GimbalActions.ACTION_RESET_GIMBAL_MOUNT_MODE), null); + + mavClient.closeConnection(); + } + } + + + private void handleCommandAck(msg_command_ack ack) { + if (ack != null) { + commandTracker.onCommandAck(msg_command_ack.MAVLINK_MSG_ID_COMMAND_ACK, ack); + } + } + + @Override + public void notifyReceivedData(MAVLinkPacket packet) { + MAVLinkMessage receivedMsg = packet.unpack(); + if (receivedMsg == null) + return; + + if (receivedMsg.msgid == msg_command_ack.MAVLINK_MSG_ID_COMMAND_ACK) { + msg_command_ack commandAck = (msg_command_ack) receivedMsg; + handleCommandAck(commandAck); + } else { + this.mavLinkMsgHandler.receiveData(receivedMsg); + if (this.drone != null) { + this.drone.onMavLinkMessageReceived(receivedMsg); + } + } + + if (!connectedApps.isEmpty()) { + for (DroneApi droneEventsListener : connectedApps.values()) { + droneEventsListener.onReceivedMavLinkMessage(receivedMsg); + } + } + } + + @Override + public void onConnectionStatus(LinkConnectionStatus connectionStatus) { + super.onConnectionStatus(connectionStatus); + + switch (connectionStatus.getStatusCode()) { + case LinkConnectionStatus.DISCONNECTED: + this.gcsHeartbeat.setActive(false); + break; + + case LinkConnectionStatus.CONNECTED: + this.gcsHeartbeat.setActive(true); + break; + } + } + + @Override + public DroneAttribute getAttribute(DroneApi.ClientInfo clientInfo, String attributeType) { + switch (attributeType) { + case AttributeType.FOLLOW_STATE: + return CommonApiUtils.getFollowState(followMe); + + case AttributeType.RETURN_TO_ME_STATE: + return returnToMe == null ? new ReturnToMeState() : returnToMe.getState(); + + default: + return super.getAttribute(clientInfo, attributeType); + } + } + + @Override + protected boolean executeAsyncAction(Action action, ICommandListener listener) { + String type = action.getType(); + Bundle data = action.getData(); + + switch (type) { + //FOLLOW-ME ACTIONS + case FollowMeActions.ACTION_ENABLE_FOLLOW_ME: + data.setClassLoader(FollowType.class.getClassLoader()); + FollowType followType = data.getParcelable(FollowMeActions.EXTRA_FOLLOW_TYPE); + enableFollowMe(followType, listener); + return true; + + case FollowMeActions.ACTION_UPDATE_FOLLOW_PARAMS: + if (followMe != null) { + data.setClassLoader(LatLong.class.getClassLoader()); + + FollowAlgorithm followAlgorithm = followMe.getFollowAlgorithm(); + if (followAlgorithm != null) { + Map paramsMap = new HashMap<>(); + Set dataKeys = data.keySet(); + + for (String key : dataKeys) { + paramsMap.put(key, data.get(key)); + } + + followAlgorithm.updateAlgorithmParams(paramsMap); + } + } + return true; + + case FollowMeActions.ACTION_DISABLE_FOLLOW_ME: + CommonApiUtils.disableFollowMe(followMe); + return true; + + //************ RETURN TO ME ACTIONS *********// + case StateActions.ACTION_ENABLE_RETURN_TO_ME: + boolean isEnabled = data.getBoolean(StateActions.EXTRA_IS_RETURN_TO_ME_ENABLED, false); + if (returnToMe != null) { + if (isEnabled) { + returnToMe.enable(listener); + } else { + returnToMe.disable(); + } + CommonApiUtils.postSuccessEvent(listener); + } else { + CommonApiUtils.postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + return true; + + default: + return super.executeAsyncAction(action, listener); + } + } + + private void enableFollowMe(FollowType followType, ICommandListener listener) { + FollowAlgorithm.FollowModes selectedMode = CommonApiUtils.followTypeToMode(drone, followType); + + if (selectedMode != null) { + if (followMe == null) + return; + + if (!followMe.isEnabled()) + followMe.toggleFollowMeState(); + + FollowAlgorithm currentAlg = followMe.getFollowAlgorithm(); + if (currentAlg.getType() != selectedMode) { + if (selectedMode == FollowAlgorithm.FollowModes.SOLO_SHOT && + !SoloApiUtils.isSoloLinkFeatureAvailable(drone, listener)) + return; + + followMe.setAlgorithm(selectedMode.getAlgorithmType(this, handler)); + CommonApiUtils.postSuccessEvent(listener); + } + } + } + + @Override + public void onCalibrationCancelled() { + if (connectedApps.isEmpty()) + return; + + for (DroneApi listener : connectedApps.values()) + listener.onCalibrationCancelled(); + } + + @Override + public void onCalibrationProgress(msg_mag_cal_progress progress) { + if (connectedApps.isEmpty()) + return; + + for (DroneApi listener : connectedApps.values()) + listener.onCalibrationProgress(progress); + } + + @Override + public void onCalibrationCompleted(msg_mag_cal_report report) { + if (connectedApps.isEmpty()) + return; + + for (DroneApi listener : connectedApps.values()) + listener.onCalibrationCompleted(report); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java new file mode 100644 index 0000000000..a13e3e53a6 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java @@ -0,0 +1,268 @@ +package org.droidplanner.services.android.impl.core.drone.profiles; + +import android.content.Context; +import android.os.Handler; +import android.text.TextUtils; +import android.util.SparseBooleanArray; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_param_value; + +import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.utils.file.IO.ParameterMetadataLoader; + +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +import timber.log.Timber; + +/** + * Class to manage the communication of parameters to the MAV. + *

+ * Should be initialized with a MAVLink Object, so the manager can send messages + * via the MAV link. The function processMessage must be called with every new + * MAV Message. + */ +public class ParameterManager extends DroneVariable implements OnDroneListener { + + private static final long TIMEOUT = 1000l; //milliseconds + + private final Runnable parametersReceiptStartNotification = new Runnable() { + @Override + public void run() { + if (parameterListener != null) + parameterListener.onBeginReceivingParameters(); + } + }; + + public final Runnable watchdogCallback = new Runnable() { + @Override + public void run() { + onParameterStreamStopped(); + } + }; + private final Runnable parametersReceiptEndNotification = new Runnable() { + @Override + public void run() { + if (parameterListener != null) + parameterListener.onEndReceivingParameters(); + } + }; + + private final AtomicBoolean isRefreshing = new AtomicBoolean(false); + + private int expectedParams; + + private final SparseBooleanArray paramsRollCall = new SparseBooleanArray(); + private final ConcurrentHashMap parameters = new ConcurrentHashMap<>(); + private final ConcurrentHashMap parametersMetadata = new ConcurrentHashMap<>(); + + private DroneInterfaces.OnParameterManagerListener parameterListener; + + private final Handler watchdog; + private final Context context; + + public ParameterManager(MavLinkDrone myDrone, Context context, Handler handler) { + super(myDrone); + this.context = context; + this.watchdog = handler; + myDrone.addDroneListener(this); + refreshParametersMetadata(); + } + + public void refreshParameters() { + if (isRefreshing.compareAndSet(false, true)) { + expectedParams = 0; + parameters.clear(); + paramsRollCall.clear(); + + notifyParametersReceiptStart(); + + MavLinkParameters.requestParametersList(myDrone); + resetWatchdog(); + } + } + + public Map getParameters() { + //Update the cache if it's stale. Parameters download is expensive, but we assume the caller knows what it's + // doing. + if (parameters.isEmpty()) + refreshParameters(); + + return parameters; + } + + /** + * Try to process a Mavlink message if it is a parameter related message + * + * @param msg Mavlink message to process + * @return Returns true if the message has been processed + */ + public boolean processMessage(MAVLinkMessage msg) { + if (msg.msgid == msg_param_value.MAVLINK_MSG_ID_PARAM_VALUE) { + processReceivedParam((msg_param_value) msg); + return true; + } + return false; + } + + protected void processReceivedParam(msg_param_value m_value) { + // collect params in parameter list + Parameter param = new Parameter(m_value.getParam_Id(), m_value.param_value, m_value.param_type); + loadParameterMetadata(param); + + parameters.put(param.getName().toLowerCase(Locale.US), param); + int paramIndex = m_value.param_index; + if (paramIndex == -1) { + // update listener + notifyParameterReceipt(param, 0, 1); + + notifyParametersReceiptEnd(); + return; + } + + paramsRollCall.append(paramIndex, true); + expectedParams = m_value.param_count; + + // update listener + notifyParameterReceipt(param, paramIndex, m_value.param_count); + + // Are all parameters here? Notify the listener with the parameters + if (parameters.size() >= m_value.param_count) { + killWatchdog(); + isRefreshing.set(false); + + notifyParametersReceiptEnd(); + } else { + resetWatchdog(); + } + } + + private void reRequestMissingParams(int howManyParams) { + for (int i = 0; i < howManyParams; i++) { + if (!paramsRollCall.get(i)) { + MavLinkParameters.readParameter(myDrone, i); + } + } + } + + public void sendParameter(Parameter parameter) { + MavLinkParameters.sendParameter(myDrone, parameter); + } + + public void readParameter(String name) { + MavLinkParameters.readParameter(myDrone, name); + } + + public Parameter getParameter(String name) { + if (TextUtils.isEmpty(name)) + return null; + + return parameters.get(name.toLowerCase(Locale.US)); + } + + private void onParameterStreamStopped() { + if (expectedParams > 0) { + reRequestMissingParams(expectedParams); + resetWatchdog(); + } else { + isRefreshing.set(false); + } + } + + private void resetWatchdog() { + watchdog.removeCallbacks(watchdogCallback); + watchdog.postDelayed(watchdogCallback, TIMEOUT); + } + + private void killWatchdog() { + watchdog.removeCallbacks(watchdogCallback); + isRefreshing.set(false); + } + + @Override + public void onDroneEvent(DroneEventsType event, MavLinkDrone drone) { + switch (event) { + case HEARTBEAT_FIRST: + refreshParameters(); + break; + + case DISCONNECTED: + case HEARTBEAT_TIMEOUT: + killWatchdog(); + break; + + case TYPE: + refreshParametersMetadata(); + break; + + default: + break; + + } + } + + private void refreshParametersMetadata() { + //Reload the vehicle parameters metadata + String metadataType = myDrone.getFirmwareType().getParameterMetadataGroup(); + if (!TextUtils.isEmpty(metadataType)) { + try { + ParameterMetadataLoader.load(context, metadataType, this.parametersMetadata); + } catch (Exception e) { + Timber.e(e, e.getMessage()); + } + } + + if (parametersMetadata.isEmpty() || parameters.isEmpty()) + return; + + for (Parameter parameter : parameters.values()) { + loadParameterMetadata(parameter); + } + } + + private void loadParameterMetadata(Parameter parameter){ + ParameterMetadata metadata = parametersMetadata.get(parameter.getName()); + if (metadata != null) { + parameter.setDisplayName(metadata.getDisplayName()); + parameter.setDescription(metadata.getDescription()); + parameter.setUnits(metadata.getUnits()); + parameter.setRange(metadata.getRange()); + parameter.setValues(metadata.getValues()); + } + } + + public void setParameterListener(DroneInterfaces.OnParameterManagerListener parameterListener) { + this.parameterListener = parameterListener; + } + + private void notifyParametersReceiptStart() { + if (parameterListener != null) + watchdog.post(parametersReceiptStartNotification); + } + + private void notifyParametersReceiptEnd() { + if (parameterListener != null) + watchdog.post(parametersReceiptEndNotification); + } + + private void notifyParameterReceipt(final Parameter parameter, final int index, final int count) { + if (parameterListener != null) { + watchdog.post(new Runnable() { + @Override + public void run() { + if (parameterListener != null) + parameterListener.onParameterReceived(parameter, index, count); + } + }); + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterMetadata.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterMetadata.java new file mode 100644 index 0000000000..fcadb911fe --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterMetadata.java @@ -0,0 +1,64 @@ +package org.droidplanner.services.android.impl.core.drone.profiles; + +import java.io.Serializable; + +public class ParameterMetadata implements Serializable { + + private String name; + private String displayName; + private String description; + + private String units; + private String range; + private String values; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getUnits() { + return units; + } + + public void setUnits(String units) { + this.units = units; + } + + public String getRange() { + return range; + } + + public void setRange(String range) { + this.range = range; + } + + public String getValues() { + return values; + } + + public void setValues(String values) { + this.values = values; + } + + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/VehicleProfile.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/VehicleProfile.java new file mode 100644 index 0000000000..99169bc869 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/VehicleProfile.java @@ -0,0 +1,43 @@ +package org.droidplanner.services.android.impl.core.drone.profiles; + +public class VehicleProfile { + private String parameterMetadataType; + private Default default_ = new Default(); + + public String getParameterMetadataType() { + return parameterMetadataType; + } + + public Default getDefault() { + return default_; + } + + public void setDefault(Default default_) { + this.default_ = default_; + } + + public void setParameterMetadataType(String parameterMetadataType) { + this.parameterMetadataType = parameterMetadataType; + } + + public static class Default { + private int wpNavSpeed; + private int maxAltitude; + + public int getWpNavSpeed() { + return wpNavSpeed; + } + + public void setWpNavSpeed(int wpNavSpeed) { + this.wpNavSpeed = wpNavSpeed; + } + + public int getMaxAltitude() { + return maxAltitude; + } + + public void setMaxAltitude(int maxAltitude) { + this.maxAltitude = maxAltitude; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/ApmModes.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/ApmModes.java new file mode 100644 index 0000000000..5246e570ea --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/ApmModes.java @@ -0,0 +1,131 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import com.MAVLink.enums.MAV_TYPE; + +import java.util.ArrayList; +import java.util.List; + +public enum ApmModes { + FIXED_WING_MANUAL (0,"Manual",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_CIRCLE (1,"Circle",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_STABILIZE (2,"Stabilize",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_TRAINING (3,"Training",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_ACRO(4, "Acro", MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_FLY_BY_WIRE_A (5,"FBW A",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_FLY_BY_WIRE_B (6,"FBW B",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_CRUISE(7, "Cruise", MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_AUTOTUNE(8, "AutoTune", MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_AUTO (10,"Auto",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_RTL (11,"RTL",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_LOITER (12,"Loiter",MAV_TYPE.MAV_TYPE_FIXED_WING), + FIXED_WING_GUIDED (15,"Guided",MAV_TYPE.MAV_TYPE_FIXED_WING), + + ROTOR_STABILIZE(0, "Stabilize", MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_ACRO(1,"Acro", MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_ALT_HOLD(2, "Alt Hold",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_AUTO(3, "Auto",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_GUIDED(4, "Guided",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_LOITER(5, "Loiter",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_RTL(6, "RTL",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_CIRCLE(7, "Circle",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_LAND(9, "Land",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_TOY(11, "Drift",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_SPORT(13, "Sport",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_AUTOTUNE(15, "Autotune",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_POSHOLD(16, "PosHold",MAV_TYPE.MAV_TYPE_QUADROTOR), + ROTOR_BRAKE(17,"Brake",MAV_TYPE.MAV_TYPE_QUADROTOR), + + ROVER_MANUAL(0, "MANUAL", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + ROVER_LEARNING(2, "LEARNING", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + ROVER_STEERING(3, "STEERING", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + ROVER_HOLD(4, "HOLD", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + ROVER_AUTO(10, "AUTO", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + ROVER_RTL(11, "RTL", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + ROVER_GUIDED(15, "GUIDED", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + ROVER_INITIALIZING(16, "INITIALIZING", MAV_TYPE.MAV_TYPE_GROUND_ROVER), + + UNKNOWN(-1, "Unknown", MAV_TYPE.MAV_TYPE_GENERIC); + + private final long number; + private final String name; + private final int type; + + ApmModes(long number,String name, int type){ + this.number = number; + this.name = name; + this.type = type; + } + + public long getNumber() { + return number; + } + + public String getName() { + return name; + } + + public int getType() { + return type; + } + + public static ApmModes getMode(long i, int type) { + if (isCopter(type)) { + type = MAV_TYPE.MAV_TYPE_QUADROTOR; + } + + for (ApmModes mode : ApmModes.values()) { + if (i == mode.getNumber() && type == mode.getType()) { + return mode; + } + } + return UNKNOWN; + } + + public static ApmModes getMode(String str, int type) { + if (isCopter(type)) { + type = MAV_TYPE.MAV_TYPE_QUADROTOR; + } + + for (ApmModes mode : ApmModes.values()) { + if (str.equals(mode.getName()) && type == mode.getType()) { + return mode; + } + } + return UNKNOWN; + } + + public static List getModeList(int type) { + List modeList = new ArrayList(); + + if (isCopter(type)) { + type = MAV_TYPE.MAV_TYPE_QUADROTOR; + } + + for (ApmModes mode : ApmModes.values()) { + if (mode.getType() == type) { + modeList.add(mode); + } + } + return modeList; + } + + public static boolean isValid(ApmModes mode) { + return mode!=ApmModes.UNKNOWN; + } + + + public static boolean isCopter(int type){ + switch (type) { + case MAV_TYPE.MAV_TYPE_TRICOPTER: + case MAV_TYPE.MAV_TYPE_QUADROTOR: + case MAV_TYPE.MAV_TYPE_HEXAROTOR: + case MAV_TYPE.MAV_TYPE_OCTOROTOR: + case MAV_TYPE.MAV_TYPE_HELICOPTER: + return true; + + default: + return false; + } + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java new file mode 100644 index 0000000000..feb6253b39 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java @@ -0,0 +1,65 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import com.MAVLink.ardupilotmega.msg_camera_feedback; +import com.MAVLink.ardupilotmega.msg_mount_status; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.survey.CameraInfo; +import org.droidplanner.services.android.core.survey.Footprint; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Altitude; +import org.droidplanner.services.android.lib.drone.property.Attitude; +import org.droidplanner.services.android.lib.drone.property.Gps; + +import java.util.ArrayList; +import java.util.List; + +public class Camera extends DroneVariable { + private CameraInfo camera = new CameraInfo(); + private List footprints = new ArrayList(); + private double gimbal_pitch; + + public Camera(MavLinkDrone myDrone) { + super(myDrone); + } + + public void newImageLocation(msg_camera_feedback msg) { + footprints.add(new Footprint(camera, msg)); + myDrone.notifyDroneEvent(DroneEventsType.FOOTPRINT); + } + + public List getFootprints(){ + return footprints; + } + + public Footprint getLastFootprint() { + return footprints.get(footprints.size() - 1); + } + + public CameraInfo getCamera() { + return camera; + } + + public Footprint getCurrentFieldOfView() { + final Altitude droneAltitude = (Altitude) myDrone.getAttribute(AttributeType.ALTITUDE); + double altitude = droneAltitude.getAltitude(); + + final Gps droneGps = (Gps) myDrone.getAttribute(AttributeType.GPS); + LatLong position = droneGps.getPosition(); + //double pitch = myDrone.getOrientation().getPitch() - gimbal_pitch; + + final Attitude attitude = (Attitude) myDrone.getAttribute(AttributeType.ATTITUDE); + double pitch = attitude.getPitch(); + double roll = attitude.getRoll(); + double yaw = attitude.getYaw(); + return new Footprint(camera, position, altitude, pitch, roll, yaw); + } + + public void updateMountOrientation(msg_mount_status msg_mount_status) { + gimbal_pitch = 90 - msg_mount_status.pointing_a / 100; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java new file mode 100644 index 0000000000..6294d1591d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java @@ -0,0 +1,372 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import android.os.Handler; +import android.os.RemoteException; + +import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.Drone; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.property.Altitude; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.SimpleCommandListener; + +import timber.log.Timber; + +public class GuidedPoint extends DroneVariable implements OnDroneListener { + + private GuidedStates state = GuidedStates.UNINITIALIZED; + private LatLong coord = new LatLong(0, 0); + private double altitude = 0.0; //altitude in meters + + private Runnable mPostInitializationTask; + + private final Handler handler; + + public enum GuidedStates { + UNINITIALIZED, IDLE, ACTIVE + } + + public GuidedPoint(MavLinkDrone myDrone, Handler handler) { + super(myDrone); + this.handler = handler; + myDrone.addDroneListener(this); + } + + @Override + public void onDroneEvent(DroneEventsType event, MavLinkDrone drone) { + switch (event) { + case HEARTBEAT_FIRST: + case HEARTBEAT_RESTORED: + case MODE: + if (isGuidedMode(myDrone)) { + initialize(); + } else { + disable(); + } + break; + + case DISCONNECTED: + case HEARTBEAT_TIMEOUT: + disable(); + + default: + break; + } + } + + public static boolean isGuidedMode(MavLinkDrone drone) { + if (drone == null) + return false; + + final int droneType = drone.getType(); + final ApmModes droneMode = drone.getState().getMode(); + + if (Type.isCopter(droneType)) { + return droneMode == ApmModes.ROTOR_GUIDED; + } + + if (Type.isPlane(droneType)) { + return droneMode == ApmModes.FIXED_WING_GUIDED; + } + + if (Type.isRover(droneType)) { + return droneMode == ApmModes.ROVER_GUIDED || droneMode == ApmModes.ROVER_HOLD; + } + + return false; + } + + public void pauseAtCurrentLocation(ICommandListener listener) { + if (state == GuidedStates.UNINITIALIZED) { + changeToGuidedMode(myDrone, listener); + } else { + newGuidedCoord(getGpsPosition()); + state = GuidedStates.IDLE; + } + } + + private LatLong getGpsPosition() { + return getGpsPosition(myDrone); + } + + private static LatLong getGpsPosition(Drone drone) { + final Gps droneGps = (Gps) drone.getAttribute(AttributeType.GPS); + return droneGps == null ? null : droneGps.getPosition(); + } + + public static void changeToGuidedMode(MavLinkDrone drone, ICommandListener listener) { + final State droneState = drone.getState(); + final int droneType = drone.getType(); + + if (Type.isCopter(droneType)) { + droneState.changeFlightMode(ApmModes.ROTOR_GUIDED, listener); + } else if (Type.isPlane(droneType)) { + //You have to send a guided point to the plane in order to trigger guided mode. + forceSendGuidedPoint(drone, getGpsPosition(drone), getDroneAltConstrained(drone)); + } else if (Type.isRover(droneType)) { + droneState.changeFlightMode(ApmModes.ROVER_GUIDED, listener); + } + } + + public void doGuidedTakeoff(final double alt, final ICommandListener listener) { + if (Type.isCopter(myDrone.getType())) { + coord = getGpsPosition(); + altitude = alt; + state = GuidedStates.IDLE; + + changeToGuidedMode(myDrone, new SimpleCommandListener() { + @Override + public void onSuccess() { + MavLinkCommands.sendTakeoff(myDrone, alt, listener); + myDrone.notifyDroneEvent(DroneEventsType.GUIDEDPOINT); + } + + @Override + public void onError(int executionError) { + if (listener != null) { + try { + listener.onError(executionError); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + + @Override + public void onTimeout() { + if (listener != null) { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + }); + } else { + if (listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onError(CommandExecutionError.COMMAND_UNSUPPORTED); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + } + + public void newGuidedCoord(LatLong coord) { + changeCoord(coord); + } + + public void newGuidedPosition(double latitude, double longitude, double altitude) { + MavLinkCommands.sendGuidedPosition(myDrone, latitude, longitude, altitude); + } + + public void newGuidedVelocity(double xVel, double yVel, double zVel) { + MavLinkCommands.sendGuidedVelocity(myDrone, xVel, yVel, zVel); + } + + public void newGuidedCoordAndVelocity(LatLong coord, double xVel, double yVel, double zVel) { + changeCoordAndVelocity(coord, xVel, yVel, zVel); + } + + public void changeGuidedAltitude(double alt) { + changeAlt(alt); + } + + public void forcedGuidedCoordinate(final LatLong coord, final ICommandListener listener) { + final Gps droneGps = (Gps) myDrone.getAttribute(AttributeType.GPS); + if (!droneGps.has3DLock()) { + postErrorEvent(handler, listener, CommandExecutionError.COMMAND_FAILED); + return; + } + + if (isInitialized()) { + changeCoord(coord); + postSuccessEvent(handler, listener); + } else { + mPostInitializationTask = new Runnable() { + @Override + public void run() { + changeCoord(coord); + } + }; + + changeToGuidedMode(myDrone, listener); + } + } + + public void forcedGuidedCoordinate(final LatLong coord, final double alt, final ICommandListener listener) { + final Gps droneGps = (Gps) myDrone.getAttribute(AttributeType.GPS); + if (!droneGps.has3DLock()) { + postErrorEvent(handler, listener, CommandExecutionError.COMMAND_FAILED); + return; + } + + if (isInitialized()) { + changeCoord(coord); + changeAlt(alt); + postSuccessEvent(handler, listener); + } else { + mPostInitializationTask = new Runnable() { + @Override + public void run() { + changeCoord(coord); + changeAlt(alt); + } + }; + + changeToGuidedMode(myDrone, listener); + } + } + + private void initialize() { + if (state == GuidedStates.UNINITIALIZED) { + coord = getGpsPosition(); + altitude = getDroneAltConstrained(myDrone); + state = GuidedStates.IDLE; + myDrone.notifyDroneEvent(DroneEventsType.GUIDEDPOINT); + } + + if (mPostInitializationTask != null) { + mPostInitializationTask.run(); + mPostInitializationTask = null; + } + } + + private void disable() { + if (state == GuidedStates.UNINITIALIZED) + return; + + state = GuidedStates.UNINITIALIZED; + myDrone.notifyDroneEvent(DroneEventsType.GUIDEDPOINT); + } + + private void changeAlt(double alt) { + switch (state) { + case UNINITIALIZED: + break; + + case IDLE: + state = GuidedStates.ACTIVE; + /** FALL THROUGH **/ + + case ACTIVE: + altitude = alt; + sendGuidedPoint(); + break; + } + } + + private void changeCoord(LatLong coord) { + switch (state) { + case UNINITIALIZED: + break; + + case IDLE: + state = GuidedStates.ACTIVE; + /** FALL THROUGH **/ + case ACTIVE: + this.coord = coord; + sendGuidedPoint(); + break; + } + } + + private void changeCoordAndVelocity(LatLong coord, double xVel, double yVel, double zVel) { + switch (state) { + case UNINITIALIZED: + break; + + case IDLE: + state = GuidedStates.ACTIVE; + /** FALL THROUGH **/ + case ACTIVE: + this.coord = coord; + sendGuidedPointAndVelocity(xVel, yVel, zVel); + break; + } + } + + private void sendGuidedPointAndVelocity(double xVel, double yVel, double zVel) { + if (state == GuidedStates.ACTIVE) { + forceSendGuidedPointAndVelocity(myDrone, coord, altitude, xVel, yVel, zVel); + } + } + + private void sendGuidedPoint() { + if (state == GuidedStates.ACTIVE) { + forceSendGuidedPoint(myDrone, coord, altitude); + } + } + + public static void forceSendGuidedPoint(MavLinkDrone drone, LatLong coord, double altitudeInMeters) { + drone.notifyDroneEvent(DroneEventsType.GUIDEDPOINT); + if (coord != null) { + MavLinkCommands.setGuidedMode(drone, coord.getLatitude(), coord.getLongitude(), altitudeInMeters); + } + } + + public static void forceSendGuidedPointAndVelocity(MavLinkDrone drone, LatLong coord, double altitudeInMeters, + double xVel, double yVel, double zVel) { + drone.notifyDroneEvent(DroneEventsType.GUIDEDPOINT); + if (coord != null) { + MavLinkCommands.sendGuidedPositionAndVelocity(drone, coord.getLatitude(), coord.getLongitude(), altitudeInMeters, xVel, + yVel, zVel); + } + } + + private static double getDroneAltConstrained(MavLinkDrone drone) { + final Altitude droneAltitude = (Altitude) drone.getAttribute(AttributeType.ALTITUDE); + double alt = Math.floor(droneAltitude.getAltitude()); + return Math.max(alt, getDefaultMinAltitude(drone)); + } + + public LatLong getCoord() { + return coord; + } + + public double getAltitude() { + return this.altitude; + } + + public boolean isActive() { + return (state == GuidedStates.ACTIVE); + } + + public boolean isIdle() { + return (state == GuidedStates.IDLE); + } + + public boolean isInitialized() { + return !(state == GuidedStates.UNINITIALIZED); + } + + public GuidedStates getState() { + return state; + } + + public static float getDefaultMinAltitude(MavLinkDrone drone) { + final int droneType = drone.getType(); + if (Type.isCopter(droneType)) { + return 2f; + } else if (Type.isPlane(droneType)) { + return 15f; + } else { + return 0f; + } + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java new file mode 100644 index 0000000000..b236247460 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java @@ -0,0 +1,141 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import android.os.Handler; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_heartbeat; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +import timber.log.Timber; + +public class HeartBeat extends DroneVariable implements OnDroneListener { + + public static final long HEARTBEAT_NORMAL_TIMEOUT = 5000l; //ms + private static final long HEARTBEAT_LOST_TIMEOUT = 15000l; //ms + + public static final int INVALID_MAVLINK_VERSION = -1; + + protected static final int FIRST_HEARTBEAT = 0; + protected static final int LOST_HEARTBEAT = 1; + protected static final int NORMAL_HEARTBEAT = 2; + + protected int heartbeatState = FIRST_HEARTBEAT; + private byte sysid = 1; + private byte compid = 1; + + /** + * Stores the version of the mavlink protocol. + */ + private short mMavlinkVersion = INVALID_MAVLINK_VERSION; + + public final Handler watchdog; + public final Runnable watchdogCallback = new Runnable() { + @Override + public void run() { + onHeartbeatTimeout(); + } + }; + + public HeartBeat(MavLinkDrone myDrone, Handler handler) { + super(myDrone); + this.watchdog = handler; + myDrone.addDroneListener(this); + } + + public byte getSysid() { + return sysid; + } + + public byte getCompid() { + return compid; + } + + /** + * @return the version of the mavlink protocol. + */ + public short getMavlinkVersion() { + return mMavlinkVersion; + } + + public void onHeartbeat(MAVLinkMessage msg) { + msg_heartbeat heartBeatMsg = msg instanceof msg_heartbeat ? (msg_heartbeat) msg : null; + if(heartBeatMsg != null){ + sysid = (byte) msg.sysid; + compid = (byte) msg.compid; + mMavlinkVersion = heartBeatMsg.mavlink_version; + } + + switch (heartbeatState) { + case FIRST_HEARTBEAT: + if(heartBeatMsg != null) { + Timber.i("Received first heartbeat."); + + heartbeatState = NORMAL_HEARTBEAT; + restartWatchdog(HEARTBEAT_NORMAL_TIMEOUT); + + myDrone.notifyDroneEvent(DroneEventsType.HEARTBEAT_FIRST); + } + break; + + case LOST_HEARTBEAT: + myDrone.notifyDroneEvent(DroneEventsType.HEARTBEAT_RESTORED); + // FALL THROUGH + + default: + heartbeatState = NORMAL_HEARTBEAT; + restartWatchdog(HEARTBEAT_NORMAL_TIMEOUT); + break; + } + } + + public boolean hasHeartbeat() { + return heartbeatState != FIRST_HEARTBEAT; + } + + public boolean isConnectionAlive() { + return heartbeatState != LOST_HEARTBEAT; + } + + @Override + public void onDroneEvent(DroneEventsType event, MavLinkDrone drone) { + switch (event) { + case DISCONNECTED: + notifyDisconnected(); + break; + + default: + break; + } + } + + private void notifyDisconnected() { + watchdog.removeCallbacks(watchdogCallback); + heartbeatState = FIRST_HEARTBEAT; + mMavlinkVersion = INVALID_MAVLINK_VERSION; + } + + protected void onHeartbeatTimeout() { + switch (heartbeatState) { + case FIRST_HEARTBEAT: + Timber.i("First heartbeat timeout."); + myDrone.notifyDroneEvent(DroneEventsType.HEARTBEAT_TIMEOUT); + break; + + default: + heartbeatState = LOST_HEARTBEAT; + restartWatchdog(HEARTBEAT_LOST_TIMEOUT); + myDrone.notifyDroneEvent(DroneEventsType.HEARTBEAT_TIMEOUT); + break; + } + } + + protected void restartWatchdog(long timeout) { + // re-start watchdog + watchdog.removeCallbacks(watchdogCallback); + watchdog.postDelayed(watchdogCallback, timeout); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java new file mode 100644 index 0000000000..6e08581a2c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java @@ -0,0 +1,53 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import com.MAVLink.common.msg_raw_imu; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.drone.property.Parameter; + +public class Magnetometer extends DroneVariable { + + private int x; + private int y; + private int z; + + public Magnetometer(MavLinkDrone myDrone) { + super(myDrone); + } + + public void newData(msg_raw_imu msg_imu) { + x = msg_imu.xmag; + y = msg_imu.ymag; + z = msg_imu.zmag; + myDrone.notifyDroneEvent(DroneEventsType.MAGNETOMETER); + } + + public int[] getVector() { + return new int[] { x, y, z }; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getZ() { + return z; + } + + public int[] getOffsets() { + Parameter paramX = myDrone.getParameterManager().getParameter("COMPASS_OFS_X"); + Parameter paramY = myDrone.getParameterManager().getParameter("COMPASS_OFS_Y"); + Parameter paramZ = myDrone.getParameterManager().getParameter("COMPASS_OFS_Z"); + if (paramX == null || paramY == null || paramZ == null) { + return null; + } + return new int[]{(int) paramX.getValue(),(int) paramY.getValue(),(int) paramZ.getValue()}; + + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java new file mode 100644 index 0000000000..29329714fd --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java @@ -0,0 +1,46 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +public class MissionStats extends DroneVariable { + private double distanceToWp = 0; + private int currentWP = -1; + private int lastReachedWP = -1; + + public MissionStats(MavLinkDrone myDrone) { + super(myDrone); + } + + public void setDistanceToWp(double disttowp) { + this.distanceToWp = disttowp; + } + + public void setWpno(int seq) { + if (seq != currentWP) { + this.currentWP = seq; + myDrone.notifyDroneEvent(DroneEventsType.MISSION_WP_UPDATE); + } + } + + public void setLastReachedWaypointNumber(int seq) { + if (seq != lastReachedWP) { + this.lastReachedWP = seq; + myDrone.notifyDroneEvent(DroneEventsType.MISSION_WP_REACHED); + } + } + + public int getCurrentWP() { + return currentWP; + } + + public int getLastReachedWP(){ + return lastReachedWP; + } + + public double getDistanceToWP() { + return distanceToWp; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java new file mode 100644 index 0000000000..5823f467c0 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java @@ -0,0 +1,42 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import com.MAVLink.common.msg_rc_channels_raw; +import com.MAVLink.common.msg_servo_output_raw; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +public class RC extends DroneVariable { + public int in[] = new int[8]; + public int out[] = new int[8]; + + public RC(MavLinkDrone myDrone) { + super(myDrone); + } + + public void setRcInputValues(msg_rc_channels_raw msg) { + in[0] = msg.chan1_raw; + in[1] = msg.chan2_raw; + in[2] = msg.chan3_raw; + in[3] = msg.chan4_raw; + in[4] = msg.chan5_raw; + in[5] = msg.chan6_raw; + in[6] = msg.chan7_raw; + in[7] = msg.chan8_raw; + myDrone.notifyDroneEvent(DroneEventsType.RC_IN); + } + + public void setRcOutputValues(msg_servo_output_raw msg) { + out[0] = msg.servo1_raw; + out[1] = msg.servo2_raw; + out[2] = msg.servo3_raw; + out[3] = msg.servo4_raw; + out[4] = msg.servo5_raw; + out[5] = msg.servo6_raw; + out[6] = msg.servo7_raw; + out[7] = msg.servo8_raw; + myDrone.notifyDroneEvent(DroneEventsType.RC_OUT); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java new file mode 100644 index 0000000000..d1da21f869 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java @@ -0,0 +1,228 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import android.os.Handler; +import android.os.RemoteException; +import android.os.SystemClock; + +import com.MAVLink.ardupilotmega.msg_ekf_status_report; +import com.MAVLink.enums.EKF_STATUS_FLAGS; + +import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; + +import timber.log.Timber; + +public class State extends DroneVariable { + private static final long ERROR_TIMEOUT = 5000l; + + private final static Action requestHomeUpdateAction = new Action(MavLinkDrone.ACTION_REQUEST_HOME_UPDATE); + + private final AutopilotWarningParser warningParser; + + private msg_ekf_status_report ekfStatus; + private boolean isEkfPositionOk; + + private String errorId; + private boolean armed = false; + private boolean isFlying = false; + private ApmModes mode = ApmModes.UNKNOWN; + + // flightTimer + // ---------------- + private long startTime = 0; + + private final Handler handler; + private final Runnable watchdogCallback = new Runnable() { + @Override + public void run() { + resetWarning(); + } + }; + + public State(GenericMavLinkDrone myDrone, Handler handler, AutopilotWarningParser warningParser) { + super(myDrone); + this.handler = handler; + this.warningParser = warningParser; + this.errorId = warningParser.getDefaultWarning(); + resetFlightStartTime(); + } + + public boolean isArmed() { + return armed; + } + + public boolean isFlying() { + return isFlying; + } + + public ApmModes getMode() { + return mode; + } + + public String getErrorId() { + return errorId; + } + + public void setIsFlying(boolean newState) { + if (newState != isFlying) { + isFlying = newState; + myDrone.notifyDroneEvent(DroneEventsType.STATE); + + if (isFlying) { + resetFlightStartTime(); + } + } + } + + public boolean parseAutopilotError(String errorMsg) { + String parsedError = warningParser.parseWarning(myDrone, errorMsg); + if (parsedError == null || parsedError.trim().isEmpty()) + return false; + + if (!parsedError.equals(this.errorId)) { + this.errorId = parsedError; + myDrone.notifyDroneEvent(DroneEventsType.AUTOPILOT_WARNING); + } + + handler.removeCallbacks(watchdogCallback); + this.handler.postDelayed(watchdogCallback, ERROR_TIMEOUT); + return true; + } + + public void repeatWarning() { + if (errorId == null || errorId.length() == 0 || errorId.equals(warningParser.getDefaultWarning())) + return; + + handler.removeCallbacks(watchdogCallback); + this.handler.postDelayed(watchdogCallback, ERROR_TIMEOUT); + } + + public void setArmed(boolean newState) { + if (this.armed != newState) { + this.armed = newState; + myDrone.notifyDroneEvent(DroneEventsType.ARMING); + + if (newState) { + WaypointManager waypointManager = myDrone.getWaypointManager(); + if(waypointManager != null) { + waypointManager.getWaypoints(); + } + } + } + + checkEkfPositionState(this.ekfStatus); + } + + public void setMode(ApmModes mode) { + if (this.mode != mode) { + this.mode = mode; + myDrone.notifyDroneEvent(DroneEventsType.MODE); + } + } + + public void changeFlightMode(ApmModes mode, final ICommandListener listener) { + if (this.mode == mode) { + if (listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + return; + } + + if (ApmModes.isValid(mode)) { + MavLinkCommands.changeFlightMode(myDrone, mode, listener); + } else { + if (listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onError(CommandExecutionError.COMMAND_FAILED); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } + } + } + + private void resetWarning() { + String defaultWarning = warningParser.getDefaultWarning(); + if (defaultWarning == null) + defaultWarning = ""; + + if (!defaultWarning.equals(this.errorId)) { + this.errorId = defaultWarning; + myDrone.notifyDroneEvent(DroneEventsType.AUTOPILOT_WARNING); + } + } + + // flightTimer + // ---------------- + + private void resetFlightStartTime() { + startTime = SystemClock.elapsedRealtime(); + } + + public long getFlightStartTime() { + return startTime; + } + + public msg_ekf_status_report getEkfStatus() { + return ekfStatus; + } + + public void setEkfStatus(msg_ekf_status_report ekfState) { + if (this.ekfStatus == null || !areEkfStatusEquals(this.ekfStatus, ekfState)) { + this.ekfStatus = ekfState; + myDrone.notifyDroneEvent(DroneEventsType.EKF_STATUS_UPDATE); + } + } + + private void checkEkfPositionState(msg_ekf_status_report ekfStatus) { + if (ekfStatus == null) + return; + + int flags = ekfStatus.flags; + + boolean isOk = this.armed + ? (flags & EKF_STATUS_FLAGS.EKF_POS_HORIZ_ABS) != 0 + && (flags & EKF_STATUS_FLAGS.EKF_CONST_POS_MODE) == 0 + : (flags & EKF_STATUS_FLAGS.EKF_POS_HORIZ_ABS) != 0 + || (flags & EKF_STATUS_FLAGS.EKF_PRED_POS_HORIZ_ABS) != 0; + + if (isEkfPositionOk != isOk) { + isEkfPositionOk = isOk; + myDrone.notifyDroneEvent(DroneEventsType.EKF_POSITION_STATE_UPDATE); + + if(isEkfPositionOk){ + myDrone.executeAsyncAction(requestHomeUpdateAction, null); + } + } + } + + private static boolean areEkfStatusEquals(msg_ekf_status_report one, msg_ekf_status_report two) { + return one == two || !(one == null || two == null) && one.toString().equals(two.toString()); + } + + public boolean isEkfPositionOk() { + return isEkfPositionOk; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java new file mode 100644 index 0000000000..6658f281b5 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java @@ -0,0 +1,69 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import org.droidplanner.services.android.core.MAVLink.MavLinkStreamRates; +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +public class StreamRates extends DroneVariable implements OnDroneListener { + + private Rates rates; + + public StreamRates(MavLinkDrone myDrone) { + super(myDrone); + myDrone.addDroneListener(this); + } + + public void setRates(Rates rates) { + this.rates = rates; + } + + @Override + public void onDroneEvent(DroneEventsType event, MavLinkDrone drone) { + switch (event) { + case CONNECTED: + case HEARTBEAT_FIRST: + case HEARTBEAT_RESTORED: + setupStreamRatesFromPref(); + break; + default: + break; + } + } + + public void setupStreamRatesFromPref() { + if(rates == null) + return; + + MavLinkStreamRates.setupStreamRates(myDrone.getMavClient(), myDrone.getSysid(), + myDrone.getCompid(), rates.extendedStatus, rates.extra1, rates.extra2, + rates.extra3, rates.position, rates.rcChannels, rates.rawSensors, + rates.rawController); + } + + public static class Rates { + public int extendedStatus; + public int extra1; + public int extra2; + public int extra3; + public int position; + public int rcChannels; + public int rawSensors; + public int rawController; + + public Rates(){} + + public Rates(int rate){ + this.extendedStatus = rate; + this.extra1 = rate; + this.extra2 = rate; + this.extra3 = rate; + this.position = rate; + this.rcChannels = rate; + this.rawSensors = rate; + this.rawController = rate; + } + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java new file mode 100644 index 0000000000..62b9079b14 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java @@ -0,0 +1,74 @@ +package org.droidplanner.services.android.impl.core.drone.variables; + +import com.MAVLink.enums.MAV_TYPE; + +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +public class Type extends DroneVariable implements DroneInterfaces.OnDroneListener{ + + private static final int DEFAULT_TYPE = MAV_TYPE.MAV_TYPE_GENERIC; + + private int type = DEFAULT_TYPE; + private String firmwareVersion = null; + + public Type(MavLinkDrone myDrone) { + super(myDrone); + myDrone.addDroneListener(this); + } + + public void setType(int type) { + if (this.type != type) { + this.type = type; + myDrone.notifyDroneEvent(DroneEventsType.TYPE); + } + } + + public int getType() { + return type; + } + + public String getFirmwareVersion() { + return firmwareVersion; + } + + public void setFirmwareVersion(String message) { + if(firmwareVersion == null || !firmwareVersion.equals(message)) { + firmwareVersion = message; + myDrone.notifyDroneEvent(DroneEventsType.FIRMWARE); + } + } + + public static boolean isCopter(int type){ + switch (type) { + case MAV_TYPE.MAV_TYPE_TRICOPTER: + case MAV_TYPE.MAV_TYPE_QUADROTOR: + case MAV_TYPE.MAV_TYPE_HEXAROTOR: + case MAV_TYPE.MAV_TYPE_OCTOROTOR: + case MAV_TYPE.MAV_TYPE_HELICOPTER: + return true; + + default: + return false; + } + } + + public static boolean isPlane(int type){ + return type == MAV_TYPE.MAV_TYPE_FIXED_WING; + } + + public static boolean isRover(int type){ + return type == MAV_TYPE.MAV_TYPE_GROUND_ROVER; + } + + @Override + public void onDroneEvent(DroneEventsType event, MavLinkDrone drone) { + switch(event){ + case DISCONNECTED: + setType(DEFAULT_TYPE); + break; + } + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java new file mode 100644 index 0000000000..982b703c3b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java @@ -0,0 +1,153 @@ +package org.droidplanner.services.android.impl.core.drone.variables.calibration; + +import android.os.Handler; +import android.os.RemoteException; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_statustext; + +import org.droidplanner.services.android.core.MAVLink.MavLinkCalibration; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.SimpleCommandListener; + +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +public class AccelCalibration extends DroneVariable implements DroneInterfaces.OnDroneListener { + + private final Runnable onCalibrationStart = new Runnable() { + @Override + public void run() { + final ICommandListener listener = listenerRef.getAndSet(null); + if (listener != null) { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + }; + + private String mavMsg; + private boolean calibrating; + + private final Handler handler; + private final AtomicReference listenerRef = new AtomicReference<>(null); + + public AccelCalibration(MavLinkDrone drone, Handler handler) { + super(drone); + this.handler = handler; + drone.addDroneListener(this); + } + + public void startCalibration(ICommandListener listener) { + if (calibrating) { + if (listener != null) { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + return; + } + + if (myDrone.getState().isFlying()) { + calibrating = false; + } else { + calibrating = true; + mavMsg = ""; + + listenerRef.set(listener); + MavLinkCalibration.startAccelerometerCalibration(myDrone, new SimpleCommandListener() { + @Override + public void onSuccess() { + final ICommandListener listener = listenerRef.getAndSet(null); + if (listener != null) { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + + @Override + public void onError(int executionError) { + final ICommandListener listener = listenerRef.getAndSet(null); + if (listener != null) { + try { + listener.onError(executionError); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + + @Override + public void onTimeout() { + final ICommandListener listener = listenerRef.getAndSet(null); + if (listener != null) { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + }); + } + } + + public void sendAck(int step) { + if (calibrating) + MavLinkCalibration.sendCalibrationAckMessage(myDrone, step); + } + + public void processMessage(MAVLinkMessage msg) { + if (calibrating && msg.msgid == msg_statustext.MAVLINK_MSG_ID_STATUSTEXT) { + msg_statustext statusMsg = (msg_statustext) msg; + final String message = statusMsg.getText(); + + if (message != null && (message.startsWith("Place vehicle") || message.startsWith("Calibration"))) { + handler.post(onCalibrationStart); + + mavMsg = message; + if (message.startsWith("Calibration")) + calibrating = false; + + myDrone.notifyDroneEvent(DroneEventsType.CALIBRATION_IMU); + } + } + } + + public String getMessage() { + return mavMsg; + } + + public boolean isCalibrating() { + return calibrating; + } + + @Override + public void onDroneEvent(DroneEventsType event, MavLinkDrone drone) { + switch (event) { + case HEARTBEAT_TIMEOUT: + case DISCONNECTED: + if (calibrating) + cancelCalibration(); + break; + } + } + + public void cancelCalibration() { + mavMsg = ""; + calibrating = false; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java new file mode 100644 index 0000000000..7b449d9f95 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java @@ -0,0 +1,126 @@ +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.core.MAVLink.MavLinkCalibration; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.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 { + + public interface OnMagnetometerCalibrationListener { + void onCalibrationCancelled(); + + void onCalibrationProgress(msg_mag_cal_progress progress); + + void onCalibrationCompleted(msg_mag_cal_report result); + } + + private final HashMap 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 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; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/firmware/FirmwareType.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/firmware/FirmwareType.java new file mode 100644 index 0000000000..9863d0aa5e --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/firmware/FirmwareType.java @@ -0,0 +1,48 @@ +package org.droidplanner.services.android.impl.core.firmware; + +import com.MAVLink.enums.MAV_AUTOPILOT; + +public enum FirmwareType { + /* APM firmware types */ + ARDU_PLANE(MAV_AUTOPILOT.MAV_AUTOPILOT_ARDUPILOTMEGA, "ArduPlane", "ArduPlane"), + ARDU_COPTER(MAV_AUTOPILOT.MAV_AUTOPILOT_ARDUPILOTMEGA, "ArduCopter2", "ArduCopter"), + ARDU_ROVER(MAV_AUTOPILOT.MAV_AUTOPILOT_ARDUPILOTMEGA, "ArduRover", "ArduRover"), + ARDU_SOLO(MAV_AUTOPILOT.MAV_AUTOPILOT_ARDUPILOTMEGA, "ArduCopter2", "ArduSolo"), + + /** + * PX4 firmware type + */ + PX4_NATIVE(MAV_AUTOPILOT.MAV_AUTOPILOT_PX4, "", "PX4 Native"), + + /** + * Generic firmware type + */ + GENERIC(MAV_AUTOPILOT.MAV_AUTOPILOT_GENERIC, "", "Generic"); + + private final String type; + private final int family; + private final String parameterMetadataGroup; + + FirmwareType(int family, String group, String type) { + this.family = family; + this.type = type; + this.parameterMetadataGroup = group; + } + + public String getType() { + return type; + } + + public int getFamily() { + return family; + } + + public String getParameterMetadataGroup() { + return parameterMetadataGroup; + } + + @Override + public String toString() { + return type; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java new file mode 100644 index 0000000000..8817eb4e95 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java @@ -0,0 +1,73 @@ +package org.droidplanner.services.android.impl.core.gcs; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.common.msg_heartbeat; +import com.MAVLink.enums.MAV_AUTOPILOT; +import com.MAVLink.enums.MAV_TYPE; + +import org.droidplanner.services.android.communication.model.DataLink; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * This class is used to send periodic heartbeat messages to the drone. + */ +public class GCSHeartbeat { + + /** + * This is the msg heartbeat used to check the drone is present, and + * responding. + */ + private static final msg_heartbeat sMsg = new msg_heartbeat(); + + static { + sMsg.type = MAV_TYPE.MAV_TYPE_GCS; + sMsg.autopilot = MAV_AUTOPILOT.MAV_AUTOPILOT_GENERIC; + } + + /** + * This is the heartbeat period in seconds. + */ + private final int period; + + /** + * ScheduledExecutorService used to periodically schedule the heartbeat. + */ + private ScheduledExecutorService heartbeatExecutor; + + /** + * Runnable used to send the heartbeat. + */ + private final Runnable heartbeatRunnable = new Runnable() { + @Override + public void run() { + dataLink.sendMessage(sMsg, null); + } + }; + + private final DataLink.DataLinkProvider dataLink; + + public GCSHeartbeat(DataLink.DataLinkProvider dataLink, int freqHz) { + this.dataLink = dataLink; + this.period = freqHz; + } + + /** + * Set the state of the heartbeat. + * + * @param active true to activate the heartbeat, false to deactivate it + */ + public synchronized void setActive(boolean active) { + if (active) { + if (heartbeatExecutor == null || heartbeatExecutor.isShutdown()) { + heartbeatExecutor = Executors.newSingleThreadScheduledExecutor(); + heartbeatExecutor.scheduleWithFixedDelay(heartbeatRunnable, 0, period, TimeUnit.SECONDS); + } + } else if (heartbeatExecutor != null && !heartbeatExecutor.isShutdown()) { + heartbeatExecutor.shutdownNow(); + heartbeatExecutor = null; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java new file mode 100644 index 0000000000..e92c3f8d3b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java @@ -0,0 +1,210 @@ +package org.droidplanner.services.android.impl.core.gcs; + +import android.os.Bundle; + +import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.core.drone.DroneInterfaces.AttributeEventListener; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import org.droidplanner.services.android.lib.drone.property.Home; +import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; +import org.droidplanner.services.android.lib.model.action.Action; +import org.droidplanner.services.android.utils.CommonApiUtils; + +import java.util.concurrent.atomic.AtomicBoolean; + +import timber.log.Timber; + +/** + * Return to me implementation. + * If enabled, listen for user's gps location updates, and accordingly updates the vehicle RTL location. + * Created by Fredia Huya-Kouadio on 9/21/15. + */ +public class ReturnToMe implements DroneInterfaces.OnDroneListener, Location.LocationReceiver { + + public static final int UPDATE_MINIMAL_DISPLACEMENT = 5; //meters + + private static final String TAG = ReturnToMe.class.getSimpleName(); + + private final static Action requestHomeUpdateAction = new Action(MavLinkDrone.ACTION_REQUEST_HOME_UPDATE); + + private final AtomicBoolean isEnabled = new AtomicBoolean(false); + private final ReturnToMeState currentState; + + private final MavLinkDroneManager droneMgr; + private final Location.LocationFinder locationFinder; + private final AttributeEventListener attributeListener; + + private ICommandListener commandListener; + + public ReturnToMe(MavLinkDroneManager droneMgr, Location.LocationFinder locationFinder, AttributeEventListener listener) { + this.droneMgr = droneMgr; + this.locationFinder = locationFinder; + locationFinder.addLocationListener(TAG, this); + + this.attributeListener = listener; + this.currentState = new ReturnToMeState(); + + final MavLinkDrone drone = droneMgr.getDrone(); + drone.addDroneListener(this); + } + + public void enable(ICommandListener listener) { + if (isEnabled.compareAndSet(false, true)) { + this.commandListener = listener; + + final Home droneHome = getHome(); + if (droneHome.isValid()) { + currentState.setOriginalHomeLocation(droneHome.getCoordinate()); + } + + //Enable return to me + Timber.i("Enabling return to me."); + locationFinder.enableLocationUpdates(); + updateCurrentState(ReturnToMeState.STATE_WAITING_FOR_VEHICLE_GPS); + } + } + + public void disable() { + if (isEnabled.compareAndSet(true, false)) { + //Disable return to me + Timber.i("Disabling return to me."); + locationFinder.disableLocationUpdates(); + + currentState.setCurrentHomeLocation(null); + + //Reset the original home location + final LatLongAlt originalHomeLocation = currentState.getOriginalHomeLocation(); + if(originalHomeLocation != null){ + MavLinkDoCmds.setVehicleHome(droneMgr.getDrone(), originalHomeLocation, new AbstractCommandListener(){ + + @Override + public void onSuccess() { + Timber.i("Updated vehicle home location to %s", originalHomeLocation.toString()); + droneMgr.getDrone().executeAsyncAction(requestHomeUpdateAction, null); + } + + @Override + public void onError(int executionError) { + Timber.e("Unable to update vehicle home location: %d", executionError); + } + + @Override + public void onTimeout() { + Timber.w("Vehicle home update timed out!"); + } + }); + } + + updateCurrentState(ReturnToMeState.STATE_IDLE); + + this.commandListener = null; + } + } + + @Override + public void onLocationUpdate(Location location) { + if (location.isAccurate()) { + final Home home = getHome(); + if (!home.isValid()) { + updateCurrentState(ReturnToMeState.STATE_WAITING_FOR_VEHICLE_GPS); + return; + } + + final LatLongAlt homePosition = home.getCoordinate(); + + //Calculate the displacement between the home location and the user location. + final LatLongAlt locationCoord = location.getCoord(); + + final float[] results = new float[3]; + android.location.Location.distanceBetween(homePosition.getLatitude(), homePosition.getLongitude(), + locationCoord.getLatitude(), locationCoord.getLongitude(), results); + final float displacement = results[0]; + + if (displacement >= UPDATE_MINIMAL_DISPLACEMENT) { + MavLinkDoCmds.setVehicleHome(droneMgr.getDrone(), + new LatLongAlt(locationCoord.getLatitude(), locationCoord.getLongitude(), homePosition.getAltitude()), + new AbstractCommandListener() { + @Override + public void onSuccess() { + Timber.i("Updated vehicle home location to %s", locationCoord.toString()); + droneMgr.getDrone().executeAsyncAction(requestHomeUpdateAction, null); + CommonApiUtils.postSuccessEvent(commandListener); + updateCurrentState(ReturnToMeState.STATE_UPDATING_HOME); + } + + @Override + public void onError(int executionError) { + Timber.e("Unable to update vehicle home location: %d", executionError); + CommonApiUtils.postErrorEvent(executionError, commandListener); + updateCurrentState(ReturnToMeState.STATE_ERROR_UPDATING_HOME); + } + + @Override + public void onTimeout() { + Timber.w("Vehicle home update timed out!"); + CommonApiUtils.postTimeoutEvent(commandListener); + updateCurrentState(ReturnToMeState.STATE_ERROR_UPDATING_HOME); + } + }); + } + } else { + updateCurrentState(ReturnToMeState.STATE_USER_LOCATION_INACCURATE); + } + } + + private Home getHome() { + return (Home) droneMgr.getDrone().getAttribute(AttributeType.HOME); + } + + @Override + public void onLocationUnavailable() { + if (isEnabled.get()) { + updateCurrentState(ReturnToMeState.STATE_USER_LOCATION_UNAVAILABLE); + disable(); + } + } + + @Override + public void onDroneEvent(DroneInterfaces.DroneEventsType event, MavLinkDrone drone) { + switch (event) { + case DISCONNECTED: + //Stops updating the vehicle RTL location + disable(); + break; + + case HOME: + if (isEnabled.get()) { + final LatLongAlt homeCoord = getHome().getCoordinate(); + if (currentState.getOriginalHomeLocation() == null) + currentState.setOriginalHomeLocation(homeCoord); + else { + currentState.setCurrentHomeLocation(homeCoord); + } + } + break; + } + } + + private void updateCurrentState(@ReturnToMeState.ReturnToMeStates int state) { + this.currentState.setState(state); + if (attributeListener != null) { + final Bundle eventInfo = new Bundle(); + eventInfo.putInt(AttributeEventExtra.EXTRA_RETURN_TO_ME_STATE, state); + attributeListener.onAttributeEvent(AttributeEvent.RETURN_TO_ME_STATE_UPDATE, eventInfo, false); + } + } + + public DroneAttribute getState() { + return currentState; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java new file mode 100644 index 0000000000..c14d8f3020 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java @@ -0,0 +1,164 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.core.drone.variables.State; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.gcs.location.Location.LocationFinder; +import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; +import org.droidplanner.services.android.lib.drone.action.ControlActions; +import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; +import org.droidplanner.services.android.lib.model.action.Action; + +public class Follow implements OnDroneListener, LocationReceiver { + + private static final String TAG = Follow.class.getSimpleName(); + private Location lastLocation; + + /** + * Set of return value for the 'toggleFollowMeState' method. + */ + public enum FollowStates { + FOLLOW_INVALID_STATE, FOLLOW_DRONE_NOT_ARMED, FOLLOW_DRONE_DISCONNECTED, FOLLOW_START, FOLLOW_RUNNING, FOLLOW_END + } + + private FollowStates state = FollowStates.FOLLOW_INVALID_STATE; + private final MavLinkDroneManager droneMgr; + + private final LocationFinder locationFinder; + private FollowAlgorithm followAlgorithm; + + public Follow(MavLinkDroneManager droneMgr, Handler handler, LocationFinder locationFinder) { + this.droneMgr = droneMgr; + final MavLinkDrone drone = droneMgr.getDrone(); + if(drone != null) + drone.addDroneListener(this); + + followAlgorithm = FollowAlgorithm.FollowModes.LEASH.getAlgorithmType(droneMgr, handler); + + this.locationFinder = locationFinder; + locationFinder.addLocationListener(TAG, this); + } + + public void toggleFollowMeState() { + final MavLinkDrone drone = droneMgr.getDrone(); + final State droneState = drone == null ? null : drone.getState(); + if (droneState == null) { + state = FollowStates.FOLLOW_INVALID_STATE; + return; + } + + if (isEnabled()) { + disableFollowMe(); + } else { + if (droneMgr.isConnected()) { + if (droneState.isArmed()) { + enableFollowMe(); + } else { + state = FollowStates.FOLLOW_DRONE_NOT_ARMED; + } + } else { + state = FollowStates.FOLLOW_DRONE_DISCONNECTED; + } + } + } + + private void enableFollowMe() { + GuidedPoint.changeToGuidedMode(droneMgr.getDrone(), null); + + state = FollowStates.FOLLOW_START; + + locationFinder.enableLocationUpdates(); + followAlgorithm.enableFollow(); + + droneMgr.onAttributeEvent(AttributeEvent.FOLLOW_START, null, false); + } + + private void disableFollowMe() { + followAlgorithm.disableFollow(); + locationFinder.disableLocationUpdates(); + + lastLocation = null; + + if (isEnabled()) { + state = FollowStates.FOLLOW_END; + droneMgr.onAttributeEvent(AttributeEvent.FOLLOW_STOP, null, false); + } + + final MavLinkDrone drone = droneMgr.getDrone(); + // Send a brake command only on APM Follow, Solo Shot follow braking is handled by its Shot Manager onboard + if (GuidedPoint.isGuidedMode(drone) + && followAlgorithm.getType() != FollowAlgorithm.FollowModes.SOLO_SHOT) { + droneMgr.getDrone().executeAsyncAction(new Action(ControlActions.ACTION_SEND_BRAKE_VEHICLE), null); + } + } + + public boolean isEnabled() { + return state == FollowStates.FOLLOW_RUNNING || state == FollowStates.FOLLOW_START; + } + + @Override + public void onDroneEvent(DroneEventsType event, MavLinkDrone drone) { + switch (event) { + case MODE: + if (isEnabled() && !GuidedPoint.isGuidedMode(drone)) { + disableFollowMe(); + } + break; + + case HEARTBEAT_TIMEOUT: + case DISCONNECTED: + if(isEnabled()) { + disableFollowMe(); + } + break; + } + } + + @Override + public void onLocationUpdate(Location location) { + if (location.isAccurate()) { + state = FollowStates.FOLLOW_RUNNING; + lastLocation = location; + followAlgorithm.onLocationReceived(location); + } else { + state = FollowStates.FOLLOW_START; + } + + droneMgr.onAttributeEvent(AttributeEvent.FOLLOW_UPDATE, null, false); + } + + @Override + public void onLocationUnavailable() { + disableFollowMe(); + } + + public void setAlgorithm(FollowAlgorithm algorithm) { + if(followAlgorithm != null && followAlgorithm != algorithm){ + followAlgorithm.disableFollow(); + } + + followAlgorithm = algorithm; + if(isEnabled()){ + followAlgorithm.enableFollow(); + + if(lastLocation != null) + followAlgorithm.onLocationReceived(lastLocation); + } + + droneMgr.onAttributeEvent(AttributeEvent.FOLLOW_UPDATE, null, false); + } + + public FollowAlgorithm getFollowAlgorithm() { + return followAlgorithm; + } + + public FollowStates getState() { + return state; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java new file mode 100644 index 0000000000..7349ee76b8 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java @@ -0,0 +1,30 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +public class FollowAbove extends FollowAlgorithm { + + protected final MavLinkDrone drone; + + public FollowAbove(MavLinkDroneManager droneMgr, Handler handler) { + super(droneMgr, handler); + this.drone = droneMgr.getDrone(); + } + + @Override + public FollowModes getType() { + return FollowModes.ABOVE; + } + + @Override + protected void processNewLocation(Location location) { + final LatLong gcsCoord = new LatLong(location.getCoord()); + drone.getGuidedPoint().newGuidedCoord(gcsCoord); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java new file mode 100644 index 0000000000..bb44356f55 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java @@ -0,0 +1,128 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.gcs.roi.ROIEstimator; + +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +public abstract class FollowAlgorithm { + + protected final MavLinkDroneManager droneMgr; + private final ROIEstimator roiEstimator; + private final AtomicBoolean isFollowEnabled = new AtomicBoolean(false); + + public FollowAlgorithm(MavLinkDroneManager droneMgr, Handler handler) { + this.droneMgr = droneMgr; + + final MavLinkDrone drone = droneMgr.getDrone(); + this.roiEstimator = initROIEstimator(drone, handler); + } + + protected boolean isFollowEnabled() { + return isFollowEnabled.get(); + } + + public void enableFollow() { + isFollowEnabled.set(true); + if(roiEstimator != null) + roiEstimator.enableFollow(); + } + + public void disableFollow() { + if (isFollowEnabled.compareAndSet(true, false)) { + if (roiEstimator != null) + roiEstimator.disableFollow(); + } + } + + public void updateAlgorithmParams(Map paramsMap) { + } + + protected ROIEstimator initROIEstimator(MavLinkDrone drone, Handler handler) { + return new ROIEstimator(drone, handler); + } + + protected ROIEstimator getROIEstimator() { + return roiEstimator; + } + + public final void onLocationReceived(Location location) { + if (isFollowEnabled.get()) { + if(roiEstimator != null) + roiEstimator.onLocationUpdate(location); + processNewLocation(location); + } + } + + protected abstract void processNewLocation(Location location); + + public abstract FollowModes getType(); + + public Map getParams() { + return Collections.emptyMap(); + } + + public enum FollowModes { + LEASH("Leash"), + LEAD("Lead"), + RIGHT("Right"), + LEFT("Left"), + CIRCLE("Orbit"), + ABOVE("Above"), + SPLINE_LEASH("Vector Leash"), + SPLINE_ABOVE("Vector Above"), + GUIDED_SCAN("Guided Scan"), + LOOK_AT_ME("Look At Me"), + SOLO_SHOT("Solo Follow Shot"); + + private String name; + + FollowModes(String str) { + name = str; + } + + @Override + public String toString() { + return name; + } + + public FollowModes next() { + return values()[(ordinal() + 1) % values().length]; + } + + public FollowAlgorithm getAlgorithmType(MavLinkDroneManager droneMgr, Handler handler) { + switch (this) { + case LEASH: + default: + return new FollowLeash(droneMgr, handler, 8.0); + case LEAD: + return new FollowLead(droneMgr, handler, 15.0); + case RIGHT: + return new FollowRight(droneMgr, handler, 10.0); + case LEFT: + return new FollowLeft(droneMgr, handler, 10.0); + case CIRCLE: + return new FollowCircle(droneMgr, handler, 15.0, 10.0); + case ABOVE: + return new FollowAbove(droneMgr, handler); + case SPLINE_LEASH: + return new FollowSplineLeash(droneMgr, handler, 8.0); + case SPLINE_ABOVE: + return new FollowSplineAbove(droneMgr, handler); + case GUIDED_SCAN: + return new FollowGuidedScan(droneMgr, handler); + case LOOK_AT_ME: + return new FollowLookAtMe(droneMgr, handler); + case SOLO_SHOT: + return new FollowSoloShot(droneMgr, handler); + } + } + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java new file mode 100644 index 0000000000..e6035af9e4 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java @@ -0,0 +1,35 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.util.MathUtils; + +public class FollowCircle extends FollowWithRadiusAlgorithm { + /** + * °/s + */ + private double circleStep = 2; + private double circleAngle = 0.0; + + public FollowCircle(MavLinkDroneManager droneMgr, Handler handler, double radius, double rate) { + super(droneMgr, handler, radius); + circleStep = rate; + } + + @Override + public FollowModes getType() { + return FollowModes.CIRCLE; + } + + @Override + public void processNewLocation(Location location) { + LatLong gcsCoord = new LatLong(location.getCoord()); + LatLong goCoord = GeoTools.newCoordFromBearingAndDistance(gcsCoord, circleAngle, radius); + circleAngle = MathUtils.constrainAngle(circleAngle + circleStep); + drone.getGuidedPoint().newGuidedCoord(goCoord); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java new file mode 100644 index 0000000000..017a2c3266 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java @@ -0,0 +1,99 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.roi.ROIEstimator; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.HashMap; +import java.util.Map; + +import timber.log.Timber; + +/** + * Created by fhuya on 1/9/15. + */ +public class FollowGuidedScan extends FollowAbove { + + private static final long TIMEOUT = 1000; //ms + + public static final String EXTRA_FOLLOW_ROI_TARGET = "extra_follow_roi_target"; + + public static final double DEFAULT_FOLLOW_ROI_ALTITUDE = 10; //meters + private static final double sDefaultRoiAltitude = (DEFAULT_FOLLOW_ROI_ALTITUDE); + + @Override + public FollowModes getType() { + return FollowModes.GUIDED_SCAN; + } + + public FollowGuidedScan(MavLinkDroneManager droneMgr, Handler handler) { + super(droneMgr, handler); + } + + @Override + public void updateAlgorithmParams(Map params) { + super.updateAlgorithmParams(params); + + final LatLongAlt target; + + LatLong tempCoord = (LatLong) params.get(EXTRA_FOLLOW_ROI_TARGET); + if (tempCoord == null || tempCoord instanceof LatLongAlt) { + target = (LatLongAlt) tempCoord; + } else { + target = new LatLongAlt(tempCoord, sDefaultRoiAltitude); + } + + getROIEstimator().updateROITarget(target); + } + + @Override + protected ROIEstimator initROIEstimator(MavLinkDrone drone, Handler handler) { + return new GuidedROIEstimator(drone, handler); + } + + @Override + public Map getParams() { + Map params = new HashMap<>(); + params.put(EXTRA_FOLLOW_ROI_TARGET, getROIEstimator().roiTarget); + return params; + } + + @Override + protected GuidedROIEstimator getROIEstimator() { + return (GuidedROIEstimator) super.getROIEstimator(); + } + + private static class GuidedROIEstimator extends ROIEstimator { + + private LatLongAlt roiTarget; + + public GuidedROIEstimator(MavLinkDrone drone, Handler handler) { + super(drone, handler); + } + + void updateROITarget(LatLongAlt roiTarget) { + this.roiTarget = roiTarget; + onLocationUpdate(null); + } + + @Override + protected void updateROI() { + if (roiTarget == null) { + System.out.println("Cancelling ROI lock."); + //Fallback to the default behavior + super.updateROI(); + } else { + Timber.d("ROI Target: " + roiTarget.toString()); + + //Track the target until told otherwise. + MavLinkDoCmds.setROI(drone, roiTarget, null); + watchdog.postDelayed(watchdogCallback, TIMEOUT); + } + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java new file mode 100644 index 0000000000..171448be98 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java @@ -0,0 +1,32 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +public abstract class FollowHeadingAngle extends FollowWithRadiusAlgorithm { + + protected double angleOffset; + protected final MavLinkDrone drone; + + protected FollowHeadingAngle(MavLinkDroneManager droneMgr, Handler handler, double radius, double angleOffset) { + super(droneMgr, handler, radius); + this.angleOffset = angleOffset; + + this.drone = droneMgr.getDrone(); + } + + @Override + public void processNewLocation(Location location) { + LatLong gcsCoord = new LatLong(location.getCoord()); + double bearing = location.getBearing(); + + LatLong goCoord = GeoTools.newCoordFromBearingAndDistance(gcsCoord, bearing + angleOffset, radius); + drone.getGuidedPoint().newGuidedCoord(goCoord); + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java new file mode 100644 index 0000000000..48001714ca --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java @@ -0,0 +1,18 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; + +public class FollowLead extends FollowHeadingAngle { + + public FollowLead(MavLinkDroneManager droneMgr, Handler handler, double radius) { + super(droneMgr, handler, radius, 0.0); + } + + @Override + public FollowModes getType() { + return FollowModes.LEAD; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java new file mode 100644 index 0000000000..f1d26f5704 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java @@ -0,0 +1,41 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Gps; + +public class FollowLeash extends FollowWithRadiusAlgorithm { + + public FollowLeash(MavLinkDroneManager droneMgr, Handler handler, double radius) { + super(droneMgr, handler, radius); + } + + @Override + public FollowModes getType() { + return FollowModes.LEASH; + } + + @Override + protected void processNewLocation(Location location) { + final LatLong locationCoord = location.getCoord(); + + final Gps droneGps = (Gps) drone.getAttribute(AttributeType.GPS); + final LatLong dronePosition = droneGps.getPosition(); + + if (locationCoord == null || dronePosition == null) { + return; + } + + if (GeoTools.getDistance(locationCoord, dronePosition) > radius) { + double headingGCStoDrone = GeoTools.getHeadingFromCoordinates(locationCoord, dronePosition); + LatLong goCoord = GeoTools.newCoordFromBearingAndDistance(locationCoord, headingGCStoDrone, radius); + drone.getGuidedPoint().newGuidedCoord(goCoord); + } + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java new file mode 100644 index 0000000000..32b158888c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java @@ -0,0 +1,18 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; + +public class FollowLeft extends FollowHeadingAngle { + + public FollowLeft(MavLinkDroneManager droneMgr, Handler handler, double radius) { + super(droneMgr, handler, radius, -90.0); + } + + @Override + public FollowModes getType() { + return FollowModes.LEFT; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java new file mode 100644 index 0000000000..86bac7e239 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java @@ -0,0 +1,24 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; + +/** + * Created by Fredia Huya-Kouadio on 3/23/15. + */ +public class FollowLookAtMe extends FollowAlgorithm { + + public FollowLookAtMe(MavLinkDroneManager droneMgr, Handler handler) { + super(droneMgr, handler); + } + + @Override + protected void processNewLocation(Location location) {} + + @Override + public FollowModes getType() { + return FollowModes.LOOK_AT_ME; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java new file mode 100644 index 0000000000..5bec2abf4c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java @@ -0,0 +1,18 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; + +public class FollowRight extends FollowHeadingAngle { + + public FollowRight(MavLinkDroneManager droneMgr, Handler handler, double radius) { + super(droneMgr, handler, radius, 90.0); + } + + @Override + public FollowModes getType() { + return FollowModes.RIGHT; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java new file mode 100644 index 0000000000..2d969306df --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java @@ -0,0 +1,101 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.gcs.roi.ROIEstimator; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; + +/** + * Created by Fredia Huya-Kouadio on 8/3/15. + */ +public class FollowSoloShot extends FollowAlgorithm { + + private final SoloComp soloComp; + + private final LatLongAlt locationCoord = new LatLongAlt(0, 0, 0); + private final SoloMessageLocation locationSetter = new SoloMessageLocation(locationCoord); + + public FollowSoloShot(MavLinkDroneManager droneMgr, Handler handler) { + super(droneMgr, handler); + ArduSolo drone = (ArduSolo) droneMgr.getDrone(); + this.soloComp = drone.getSoloComp(); + } + + @Override + public void enableFollow() { + super.enableFollow(); + soloComp.enableFollowDataConnection(); + } + + @Override + public void disableFollow() { + super.disableFollow(); + soloComp.disableFollowDataConnection(); + } + + @Override + protected void processNewLocation(Location location) { + if (location != null) { + LatLongAlt receivedCoord = location.getCoord(); + + locationCoord.set((LatLong)receivedCoord); + locationSetter.setCoordinate(locationCoord); + + soloComp.updateFollowCenter(locationSetter); + } + } + + @Override + public FollowModes getType() { + return FollowModes.SOLO_SHOT; + } + + @Override + protected ROIEstimator initROIEstimator(MavLinkDrone drone, Handler handler) { + return new SoloROIEstimator(drone, handler, ((ArduSolo)drone).getSoloComp()); + } + + protected static class SoloROIEstimator extends ROIEstimator { + + private final LatLongAlt locationCoord = new LatLongAlt(0, 0, 0); + private final SoloMessageLocation locationSetter = new SoloMessageLocation(locationCoord); + private final SoloComp soloComp; + + public SoloROIEstimator(MavLinkDrone drone, Handler handler, SoloComp soloComp) { + super(drone, handler); + this.soloComp = soloComp; + } + + @Override + public void enableFollow(){ + isFollowEnabled.set(true); + } + + @Override + public void disableFollow(){ + if(isFollowEnabled.compareAndSet(true, false)){ + realLocation = null; + disableWatchdog(); + } + } + + @Override + protected long getUpdatePeriod(){ + return 40l; + } + + @Override + protected void sendUpdateROI(LatLong goCoord){ + locationCoord.set(goCoord); + locationSetter.setCoordinate(locationCoord); + soloComp.updateFollowCenter(locationSetter); + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java new file mode 100644 index 0000000000..3fb5bf53ea --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java @@ -0,0 +1,39 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +/** + * Created by fhuya on 1/5/15. + */ +public class FollowSplineAbove extends FollowAlgorithm { + + private final MavLinkDrone drone; + + @Override + public void processNewLocation(Location location) { + LatLong gcsLoc = new LatLong(location.getCoord()); + + //TODO: some device (nexus 6) do not report the speed (always 0).. figure out workaround. + double speed = location.getSpeed(); + double bearing = location.getBearing(); + double bearingInRad = Math.toRadians(bearing); + double xVel = speed * Math.cos(bearingInRad); + double yVel = speed * Math.sin(bearingInRad); + drone.getGuidedPoint().newGuidedCoordAndVelocity(gcsLoc, xVel, yVel, 0); + } + + @Override + public FollowModes getType() { + return FollowModes.SPLINE_ABOVE; + } + + public FollowSplineAbove(MavLinkDroneManager droneManager, Handler handler) { + super(droneManager, handler); + drone = droneManager.getDrone(); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java new file mode 100644 index 0000000000..95b838b4c0 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java @@ -0,0 +1,50 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Gps; + +/** + * Created by fhuya on 1/5/15. + */ +public class FollowSplineLeash extends FollowWithRadiusAlgorithm { + @Override + public void processNewLocation(Location location) { + final LatLongAlt userLoc = location.getCoord(); + + final Gps droneGps = (Gps) drone.getAttribute(AttributeType.GPS); + final LatLong droneLoc = droneGps.getPosition(); + + if (userLoc == null || droneLoc == null) + return; + + if (GeoTools.getDistance(userLoc, droneLoc) > radius) { + double headingGCSToDrone = GeoTools.getHeadingFromCoordinates(userLoc, droneLoc); + LatLong goCoord = GeoTools.newCoordFromBearingAndDistance(userLoc, headingGCSToDrone, radius); + + //TODO: some device (nexus 6) do not report the speed (always 0).. figure out workaround. + double speed = location.getSpeed(); + double bearing = location.getBearing(); + double bearingInRad = Math.toRadians(bearing); + double xVel = speed * Math.cos(bearingInRad); + double yVel = speed * Math.sin(bearingInRad); + drone.getGuidedPoint().newGuidedCoordAndVelocity(goCoord, xVel, yVel, 0); + } + + } + + @Override + public FollowModes getType() { + return FollowModes.SPLINE_LEASH; + } + + public FollowSplineLeash(MavLinkDroneManager droneMgr, Handler handler, double length) { + super(droneMgr, handler, length); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java new file mode 100644 index 0000000000..08171b6c94 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java @@ -0,0 +1,42 @@ +package org.droidplanner.services.android.impl.core.gcs.follow; + +import android.os.Handler; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Fredia Huya-Kouadio on 1/27/15. + */ +public abstract class FollowWithRadiusAlgorithm extends FollowAlgorithm { + + public static final String EXTRA_FOLLOW_RADIUS = "extra_follow_radius"; + + protected final MavLinkDrone drone; + protected double radius; + + public FollowWithRadiusAlgorithm(MavLinkDroneManager droneMgr, Handler handler, double radius) { + super(droneMgr, handler); + this.radius = radius; + this.drone = droneMgr.getDrone(); + } + + @Override + public Map getParams(){ + Map params = new HashMap<>(); + params.put(EXTRA_FOLLOW_RADIUS, radius); + return params; + } + + @Override + public void updateAlgorithmParams(Map params) { + super.updateAlgorithmParams(params); + + Double updatedRadius = (Double) params.get(EXTRA_FOLLOW_RADIUS); + if(updatedRadius != null) + this.radius = Math.max(0, updatedRadius); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java new file mode 100644 index 0000000000..29f7c58979 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java @@ -0,0 +1,226 @@ +package org.droidplanner.services.android.impl.core.gcs.location; + +import android.content.Context; +import android.location.Location; +import android.os.Handler; +import android.util.Log; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GooglePlayServicesUtil; +import com.google.android.gms.common.api.Api; +import com.google.android.gms.location.LocationAvailability; +import com.google.android.gms.location.LocationCallback; +import com.google.android.gms.location.LocationRequest; +import com.google.android.gms.location.LocationResult; +import com.google.android.gms.location.LocationServices; + +import org.droidplanner.services.android.core.gcs.location.Location.LocationFinder; +import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager; +import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import timber.log.Timber; + +/** + * Feeds Location Data from Android's FusedLocation LocationProvider + */ +public class FusedLocation extends LocationCallback implements LocationFinder, GoogleApiClientManager.ManagerListener { + + private static final String TAG = FusedLocation.class.getSimpleName(); + + private static final long MIN_TIME_MS = 16; + private static final float MIN_DISTANCE_M = 0.0f; + private static final float LOCATION_ACCURACY_THRESHOLD = 20.0f; + private static final float JUMP_FACTOR = 4.0f; + + private final static Api[] apisList = new Api[]{LocationServices.API}; + + private final GoogleApiClientManager gApiMgr; + private final GoogleApiClientTask requestLocationUpdate; + + private final GoogleApiClientTask removeLocationUpdate = new GoogleApiClientTask() { + @Override + protected void doRun() { + LocationServices.FusedLocationApi.removeLocationUpdates(getGoogleApiClient(), + FusedLocation.this); + } + }; + + private final Map receivers = new ConcurrentHashMap<>(); + + private Location mLastLocation; + + private float mTotalSpeed; + private long mSpeedReadings; + + private final Context context; + + public FusedLocation(Context context, final Handler handler) { + this(context, handler, LocationRequest.PRIORITY_HIGH_ACCURACY, MIN_TIME_MS, MIN_TIME_MS, MIN_DISTANCE_M); + } + + public FusedLocation(Context context, final Handler handler, final int locationRequestPriority, + final long interval, final long fastestInterval, final float smallestDisplacement) { + this.context = context; + + requestLocationUpdate = new GoogleApiClientTask() { + @Override + protected void doRun() { + final LocationRequest locationRequest = LocationRequest.create(); + locationRequest.setPriority(locationRequestPriority); + locationRequest.setInterval(interval); + locationRequest.setFastestInterval(fastestInterval); + locationRequest.setSmallestDisplacement(smallestDisplacement); + LocationServices.FusedLocationApi.requestLocationUpdates(getGoogleApiClient(), + locationRequest, FusedLocation.this, handler.getLooper()); + } + }; + + gApiMgr = new GoogleApiClientManager(context, handler, apisList); + gApiMgr.setManagerListener(this); + } + + @Override + public void enableLocationUpdates() { + gApiMgr.start(); + mSpeedReadings = 0; + mTotalSpeed = 0f; + mLastLocation = null; + } + + @Override + public void disableLocationUpdates() { + gApiMgr.addTask(removeLocationUpdate); + gApiMgr.stopSafely(); + } + + @Override + public void onLocationAvailability(LocationAvailability locationAvailability) { + super.onLocationAvailability(locationAvailability); + + //TODO: notify the location listener. + } + + @Override + public void onLocationResult(LocationResult result) { + final Location androidLocation = result.getLastLocation(); + if (androidLocation == null) + return; + + float distanceToLast = -1.0f; + long timeSinceLast = -1L; + + final long androidLocationTime = androidLocation.getTime(); + if (mLastLocation != null) { + distanceToLast = androidLocation.distanceTo(mLastLocation); + timeSinceLast = (androidLocationTime - mLastLocation.getTime()) / 1000; + } + + final float currentSpeed = distanceToLast > 0f && timeSinceLast > 0 + ? (distanceToLast / timeSinceLast) + : 0f; + final boolean isLocationAccurate = isLocationAccurate(androidLocation.getAccuracy(), + currentSpeed); + + org.droidplanner.services.android.core.gcs.location.Location location = + new org.droidplanner.services.android.core.gcs.location.Location( + new LatLongAlt( + androidLocation.getLatitude(), + androidLocation.getLongitude(), + androidLocation.getAltitude()), + androidLocation.getBearing(), + androidLocation.hasSpeed() ? androidLocation.getSpeed() : currentSpeed, + isLocationAccurate, + androidLocationTime); + + mLastLocation = androidLocation; + + Timber.d("Location Lat/Long: " + getLatLongFromLocation(androidLocation)); + + notifyLocationUpdate(location); + } + + private void notifyLocationUpdate(org.droidplanner.services.android.core.gcs.location.Location location) { + if (receivers.isEmpty()) + return; + + for (LocationReceiver receiver : receivers.values()) { + receiver.onLocationUpdate(location); + } + } + + private boolean isLocationAccurate(float accuracy, float currentSpeed) { + if (accuracy >= LOCATION_ACCURACY_THRESHOLD) { + Log.d(TAG, "High accuracy: " + accuracy); + return false; + } + + mTotalSpeed += currentSpeed; + float avg = (mTotalSpeed / ++mSpeedReadings); + + //If moving: + if (currentSpeed > 0) { + //if average indicates some movement + if (avg >= 1.0) { + //Reject unreasonable updates. + if (currentSpeed >= (avg * JUMP_FACTOR)) { + Log.d(TAG, "High current speed: " + currentSpeed); + return false; + } + } + } + + return true; + } + + public String getLatLongFromLocation(final Location location) { + return Location.convert(location.getLatitude(), Location.FORMAT_DEGREES) + " " + + Location.convert(location.getLongitude(), Location.FORMAT_DEGREES); + } + + @Override + public void addLocationListener(String tag, LocationReceiver receiver) { + receivers.put(tag, receiver); + } + + @Override + public void removeLocationListener(String tag) { + receivers.remove(tag); + } + + @Override + public void onGoogleApiConnectionError(ConnectionResult result) { + notifyLocationUnavailable(); + + GooglePlayServicesUtil.showErrorNotification(result.getErrorCode(), this.context); + } + + @Override + public void onUnavailableGooglePlayServices(int status) { + notifyLocationUnavailable(); + + GooglePlayServicesUtil.showErrorNotification(status, this.context); + } + + private void notifyLocationUnavailable() { + if (receivers.isEmpty()) + return; + + for (LocationReceiver listener : receivers.values()) { + listener.onLocationUnavailable(); + } + } + + @Override + public void onManagerStarted() { + gApiMgr.addTask(requestLocationUpdate); + } + + @Override + public void onManagerStopped() { + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java new file mode 100644 index 0000000000..65624661c9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java @@ -0,0 +1,62 @@ +package org.droidplanner.services.android.impl.core.gcs.location; + +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +public class Location { + + public interface LocationReceiver { + void onLocationUpdate(Location location); + + void onLocationUnavailable(); + } + + public interface LocationFinder { + void enableLocationUpdates(); + + void disableLocationUpdates(); + + void addLocationListener(String tag, LocationReceiver receiver); + + void removeLocationListener(String tag); + } + + private LatLongAlt coordinate; + private double heading = 0.0; + private double speed = 0.0; + private boolean isAccurate; + private long fixTime; + + public Location(LatLongAlt coord3d, float heading, float speed, boolean isAccurate, long fixTime) { + coordinate = coord3d; + this.heading = heading; + this.speed = speed; + this.isAccurate = isAccurate; + this.fixTime = fixTime; + } + + public LatLongAlt getCoord() { + return coordinate; + } + + public boolean isAccurate() { + return !isInvalid() && this.isAccurate; + } + + private boolean isInvalid(){ + return this.coordinate == null || (this.coordinate.getLatitude() == 0 + && this.coordinate.getLongitude() == 0); + } + + public double getBearing() { + return heading; + } + + public double getSpeed() { + return speed; + } + + public long getFixTime() { + return fixTime; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/package-info.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/package-info.java new file mode 100644 index 0000000000..34d13ef5b1 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/package-info.java @@ -0,0 +1,4 @@ +/** + * This package contains code and logic related to the ground control station functionality. + */ +package org.droidplanner.services.android.impl.core.gcs; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java new file mode 100644 index 0000000000..040be3b87d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java @@ -0,0 +1,105 @@ +package org.droidplanner.services.android.impl.core.gcs.roi; + +import android.os.Handler; + +import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Uses location data from Android's FusedLocation LocationManager at 1Hz and + * calculates new points at 10Hz based on Last Location and Last Velocity. + */ +public class ROIEstimator implements LocationReceiver { + + private static final int TIMEOUT = 100; + protected Location realLocation; + protected long timeOfLastLocation; + + protected final MavLinkDrone drone; + protected Handler watchdog; + protected Runnable watchdogCallback = new Runnable() { + @Override + public void run() { + updateROI(); + } + + }; + + protected final AtomicBoolean isFollowEnabled = new AtomicBoolean(false); + + public ROIEstimator(MavLinkDrone drone, Handler handler) { + this.watchdog = handler; + this.drone = drone; + } + + public void enableFollow() { + MavLinkDoCmds.resetROI(drone, null); + isFollowEnabled.set(true); + } + + public void disableFollow() { + if (isFollowEnabled.compareAndSet(true, false)) { + realLocation = null; + MavLinkDoCmds.resetROI(drone, null); + disableWatchdog(); + } + } + + @Override + public final void onLocationUpdate(Location location) { + if (!isFollowEnabled.get()) + return; + + realLocation = location; + timeOfLastLocation = System.currentTimeMillis(); + + disableWatchdog(); + updateROI(); + } + + @Override + public void onLocationUnavailable() { + disableWatchdog(); + } + + protected void disableWatchdog() { + watchdog.removeCallbacks(watchdogCallback); + } + + protected void updateROI() { + if (realLocation == null) { + return; + } + + LatLong gcsCoord = realLocation.getCoord(); + + double bearing = realLocation.getBearing(); + double distanceTraveledSinceLastPoint = realLocation.getSpeed() + * (System.currentTimeMillis() - timeOfLastLocation) / 1000f; + LatLong goCoord = GeoTools.newCoordFromBearingAndDistance(gcsCoord, bearing, distanceTraveledSinceLastPoint); + + sendUpdateROI(goCoord); + + if (realLocation.getSpeed() > 0) + watchdog.postDelayed(watchdogCallback, getUpdatePeriod()); + } + + protected void sendUpdateROI(LatLong goCoord) { + MavLinkDoCmds.setROI(drone, new LatLongAlt(goCoord.getLatitude(), goCoord.getLongitude(), (0.0)), null); + } + + public boolean isFollowEnabled() { + return isFollowEnabled.get(); + } + + protected long getUpdatePeriod(){ + return TIMEOUT; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java new file mode 100644 index 0000000000..60ca3001c7 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java @@ -0,0 +1,54 @@ +package org.droidplanner.services.android.impl.core.helpers.coordinates; + +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.List; + +/** + * Calculate a rectangle that bounds all inserted points + */ +public class CoordBounds { + public LatLong sw_3quadrant; + public LatLong ne_1quadrant; + + public CoordBounds(LatLong point) { + include(point); + } + + public CoordBounds(List points) { + for (LatLong point : points) { + include(point); + } + } + + public void include(LatLong point) { + if ((sw_3quadrant == null) || (ne_1quadrant == null)) { + ne_1quadrant = new LatLong(point); + sw_3quadrant = new LatLong(point); + } else { + if (point.getLongitude() > ne_1quadrant.getLongitude()) { + ne_1quadrant.setLongitude(point.getLongitude()); + } + if (point.getLatitude() > ne_1quadrant.getLatitude()) { + ne_1quadrant.setLatitude(point.getLatitude()); + } + if (point.getLongitude() < sw_3quadrant.getLongitude()) { + sw_3quadrant.setLongitude(point.getLongitude()); + } + if (point.getLatitude() < sw_3quadrant.getLatitude()) { + sw_3quadrant.setLatitude(point.getLatitude()); + } + } + } + + public double getDiag() { + return GeoTools.latToMeters(GeoTools.getAproximatedDistance(ne_1quadrant, sw_3quadrant)); + } + + public LatLong getMiddle() { + return (new LatLong((ne_1quadrant.getLatitude() + sw_3quadrant.getLatitude()) / 2, + (ne_1quadrant.getLongitude() + sw_3quadrant.getLongitude()) / 2)); + + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java new file mode 100644 index 0000000000..771771e373 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java @@ -0,0 +1,220 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools; + +import org.droidplanner.services.android.core.helpers.units.Area; +import org.droidplanner.services.android.core.polygon.Polygon; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.util.MathUtils; + +import java.util.List; + +import static java.lang.Math.PI; +import static java.lang.Math.abs; +import static java.lang.Math.atan2; +import static java.lang.Math.cos; +import static java.lang.Math.sin; +import static java.lang.Math.tan; +import static java.lang.Math.toRadians; + +public class GeoTools { + private static final double RADIUS_OF_EARTH = 6378137.0;// In meters. + // Source: WGS84 + public List waypoints; + + public GeoTools() { + } + + /** + * Returns the distance between two points + * + * @return distance between the points in degrees + */ + public static Double getAproximatedDistance(LatLong p1, LatLong p2) { + return (Math.hypot((p1.getLatitude() - p2.getLatitude()), (p1.getLongitude() - p2.getLongitude()))); + } + + private static Double metersTolat(double meters) { + return Math.toDegrees(meters / RADIUS_OF_EARTH); + } + + public static Double latToMeters(double lat) { + return Math.toRadians(lat) * RADIUS_OF_EARTH; + } + + /** + * Extrapolate latitude/longitude given a heading and distance thanks to + * http://www.movable-type.co.uk/scripts/latlong.html + * + * @param origin Point of origin + * @param bearing bearing to navigate + * @param distance distance to be added + * @return New point with the added distance + */ + public static LatLong newCoordFromBearingAndDistance(LatLong origin, double bearing, double distance) { + return newCoordFromBearingAndDistance(origin.getLatitude(), origin.getLongitude(), bearing, distance); + } + + /** + * Extrapolate latitude/longitude given a heading and distance thanks to + * http://www.movable-type.co.uk/scripts/latlong.html + * + * @param lat latitude + * @param lon longitude + * @param bearing bearing to navigate + * @param distance distance to be added + * @return New point with the added distance + */ + private static LatLong newCoordFromBearingAndDistance(double lat, double lon, double bearing, double distance) { + + double lat1 = Math.toRadians(lat); + double lon1 = Math.toRadians(lon); + double brng = Math.toRadians(bearing); + double dr = distance / RADIUS_OF_EARTH; + + double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dr) + Math.cos(lat1) * Math.sin(dr) + * Math.cos(brng)); + double lon2 = lon1 + + Math.atan2(Math.sin(brng) * Math.sin(dr) * Math.cos(lat1), + Math.cos(dr) - Math.sin(lat1) * Math.sin(lat2)); + + return (new LatLong(Math.toDegrees(lat2), Math.toDegrees(lon2))); + } + + /** + * Offset a coordinate by a local distance + * + * @param origin location in WGS84 + * @param xMeters Offset distance in the east direction + * @param yMeters Offset distance in the north direction + * @return new coordinate with the offset + */ + public static LatLong moveCoordinate(LatLong origin, double xMeters, double yMeters) { + double lon = origin.getLongitude(); + double lat = origin.getLatitude(); + double lon1 = Math.toRadians(lon); + double lat1 = Math.toRadians(lat); + + double lon2 = lon1 + Math.toRadians(metersTolat(xMeters)); + double lat2 = lat1 + Math.toRadians(metersTolat(yMeters)); + return (new LatLong(Math.toDegrees(lat2), Math.toDegrees(lon2))); + } + + /** + * Calculates the arc between two points + * http://en.wikipedia.org/wiki/Haversine_formula + * + * @return the arc in degrees + */ + static double getArcInRadians(LatLong from, LatLong to) { + + double latitudeArc = Math.toRadians(from.getLatitude() - to.getLatitude()); + double longitudeArc = Math.toRadians(from.getLongitude() - to.getLongitude()); + + double latitudeH = Math.sin(latitudeArc * 0.5); + latitudeH *= latitudeH; + double lontitudeH = Math.sin(longitudeArc * 0.5); + lontitudeH *= lontitudeH; + + double tmp = Math.cos(Math.toRadians(from.getLatitude())) + * Math.cos(Math.toRadians(to.getLatitude())); + return Math.toDegrees(2.0 * Math.asin(Math.sqrt(latitudeH + tmp * lontitudeH))); + } + + /** + * Computes the distance between two coordinates + * + * @return distance in meters + */ + public static double getDistance(LatLong from, LatLong to) { + return RADIUS_OF_EARTH * Math.toRadians(getArcInRadians(from, to)); + } + + /** + * Computes the distance between two coordinates taking in account the + * height difference + * + * @return distance in meters + */ + public static double get3DDistance(LatLongAlt end, LatLongAlt start) { + double horizontalDistance = getDistance(end, start); + double altitudeDiff = Math.abs((end.getAltitude() - start.getAltitude())); + return MathUtils.hypot(horizontalDistance, altitudeDiff); + } + + /** + * Computes the heading between two coordinates + * + * @return heading in degrees + */ + public static double getHeadingFromCoordinates(LatLong fromLoc, LatLong toLoc) { + double fLat = Math.toRadians(fromLoc.getLatitude()); + double fLng = Math.toRadians(fromLoc.getLongitude()); + double tLat = Math.toRadians(toLoc.getLatitude()); + double tLng = Math.toRadians(toLoc.getLongitude()); + + double degree = Math.toDegrees(Math.atan2( + Math.sin(tLng - fLng) * Math.cos(tLat), + Math.cos(fLat) * Math.sin(tLat) - Math.sin(fLat) * Math.cos(tLat) + * Math.cos(tLng - fLng))); + + return warpToPositiveAngle(degree); + } + + public static double warpToPositiveAngle(double degree) { + if (degree >= 0) { + return degree; + } else { + return 360 + degree; + } + } + + /** + * Copied from android-map-utils (licensed under Apache v2) + * com.google.maps.android.SphericalUtil.java + * + * @return area in m� + */ + public static Area getArea(Polygon poly) { + List path = poly.getPoints(); + int size = path.size(); + if (size < 3) { + return new Area(0); + } + double total = 0; + LatLong prev = path.get(size - 1); + double prevTanLat = tan((PI / 2 - toRadians(prev.getLatitude())) / 2); + double prevLng = toRadians(prev.getLongitude()); + // For each edge, accumulate the signed area of the triangle formed by + // the North Pole + // and that edge ("polar triangle"). + for (LatLong point : path) { + double tanLat = tan((PI / 2 - toRadians(point.getLatitude())) / 2); + double lng = toRadians(point.getLongitude()); + total += polarTriangleArea(tanLat, lng, prevTanLat, prevLng); + prevTanLat = tanLat; + prevLng = lng; + } + return new Area(abs(total * (RADIUS_OF_EARTH * RADIUS_OF_EARTH))); + } + + /** + * Copied from android-map-utils (licensed under Apache v2) + * com.google.maps.android.SphericalUtil.java + *

+ * Returns the signed area of a triangle which has North Pole as a vertex. + * Formula derived from + * "Area of a spherical triangle given two edges and the included angle" as + * per "Spherical Trigonometry" by Todhunter, page 71, section 103, point 2. + * See http://books.google.com/books?id=3uBHAAAAIAAJ&pg=PA71 The arguments + * named "tan" are tan((pi/2 - latitude)/2). + */ + private static double polarTriangleArea(double tan1, double lng1, double tan2, double lng2) { + double deltaLng = lng1 - lng2; + double t = tan1 * tan2; + return 2 * atan2(t * sin(deltaLng), 1 + t * cos(deltaLng)); + } + + public static LatLong pointAlongTheLine(LatLong start, LatLong end, int distance) { + return newCoordFromBearingAndDistance(start, getHeadingFromCoordinates(start, end), distance); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java new file mode 100644 index 0000000000..03153cc803 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java @@ -0,0 +1,59 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools; + +import org.droidplanner.services.android.lib.coordinate.LatLong; + +public class LineLatLong { + private final LatLong start; + private final LatLong end; + + public LineLatLong(LatLong start, LatLong end) { + this.start = start; + this.end = end; + } + + public LineLatLong(LineLatLong line) { + this(line.start, line.end); + } + + public LatLong getStart() { + return start; + } + + public LatLong getEnd() { + return end; + } + + public double getHeading() { + return GeoTools.getHeadingFromCoordinates(this.start, this.end); + } + + public LatLong getFarthestEndpointTo(LatLong point) { + if (getClosestEndpointTo(point).equals(start)) { + return end; + } else { + return start; + } + } + + public LatLong getClosestEndpointTo(LatLong point) { + if (getDistanceToStart(point) < getDistanceToEnd(point)) { + return start; + } else { + return end; + } + } + + private Double getDistanceToEnd(LatLong point) { + return GeoTools.getAproximatedDistance(end, point); + } + + private Double getDistanceToStart(LatLong point) { + return GeoTools.getAproximatedDistance(start, point); + } + + @Override + public String toString() { + return "from:" + start.toString() + "to:" + end.toString(); + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java new file mode 100644 index 0000000000..b541090f7a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java @@ -0,0 +1,58 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools; + +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class LineSampler { + + private List points; + private List sampledPoints = new ArrayList<>(); + + public LineSampler(List points) { + this.points = points; + } + + public LineSampler(LatLong p1, LatLong p2) { + points = new ArrayList<>(); + points.add(p1); + points.add(p2); + } + + public List sample(double sampleDistance) { + for (int i = 1; i < points.size(); i++) { + LatLong from = points.get(i - 1); + if (from == null) { + continue; + } + + LatLong to = points.get(i); + sampledPoints.addAll(sampleLine(from, to, sampleDistance)); + } + + final LatLong lastPoint = getLast(points); + if (lastPoint != null) { + sampledPoints.add(lastPoint); + } + return sampledPoints; + } + + private List sampleLine(LatLong from, LatLong to, double samplingDistance) { + List result = new ArrayList(); + double heading = GeoTools.getHeadingFromCoordinates(from, to); + double totalLength = GeoTools.getDistance(from, to); + double distance = 0; + + while (distance < totalLength) { + result.add(GeoTools.newCoordFromBearingAndDistance(from, heading, distance)); + distance += samplingDistance; + } + return result; + } + + private LatLong getLast(List list) { + return list.get(list.size() - 1); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java new file mode 100644 index 0000000000..582c499abb --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java @@ -0,0 +1,79 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools; + +import org.droidplanner.services.android.core.helpers.coordinates.CoordBounds; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class LineTools { + + public static LineLatLong findExternalPoints(ArrayList crosses) { + LatLong meanCoord = new CoordBounds(crosses).getMiddle(); + LatLong start = PointTools.findFarthestPoint(crosses, meanCoord); + LatLong end = PointTools.findFarthestPoint(crosses, start); + return new LineLatLong(start, end); + } + + /** + * Finds the intersection of two lines http://stackoverflow.com/questions/ + * 1119451/how-to-tell-if-a-line-intersects -a-polygon-in-c + */ + public static LatLong FindLineIntersection(LineLatLong first, LineLatLong second) { + double denom = ((first.getEnd().getLatitude() - first.getStart().getLatitude()) * (second.getEnd().getLongitude() - second + .getStart().getLongitude())) + - ((first.getEnd().getLongitude() - first.getStart().getLongitude()) * (second.getEnd().getLatitude() - second + .getStart().getLatitude())); + if (denom == 0){ + //Parallel lines + return null; + } + double numer = ((first.getStart().getLongitude() - second.getStart().getLongitude()) * (second.getEnd() + .getLatitude() - second.getStart().getLatitude())) + - ((first.getStart().getLatitude() - second.getStart().getLatitude()) * (second.getEnd().getLongitude() - second + .getStart().getLongitude())); + double r = numer / denom; + double numer2 = ((first.getStart().getLongitude() - second.getStart().getLongitude()) * (first.getEnd() + .getLatitude() - first.getStart().getLatitude())) + - ((first.getStart().getLatitude() - second.getStart().getLatitude()) * (first.getEnd().getLongitude() - first + .getStart().getLongitude())); + double s = numer2 / denom; + if ((r < 0 || r > 1) || (s < 0 || s > 1)){ + //No intersection + return null; + } + // Find intersection point + double x = first.getStart().getLatitude() + + (r * (first.getEnd().getLatitude() - first.getStart().getLatitude())); + double y = first.getStart().getLongitude() + + (r * (first.getEnd().getLongitude() - first.getStart().getLongitude())); + return (new LatLong(x, y)); + } + + /** + * Finds the line that has the start or tip closest to a point. + * + * @param point + * Point to the distance will be minimized + * @param list + * A list of lines to search + * @return The closest Line + */ + public static LineLatLong findClosestLineToPoint(LatLong point, List list) { + LineLatLong answer = list.get(0); + double shortest = Double.MAX_VALUE; + + for (LineLatLong line : list) { + double ans1 = GeoTools.getAproximatedDistance(point, line.getStart()); + double ans2 = GeoTools.getAproximatedDistance(point, line.getEnd()); + LatLong shorterpnt = ans1 < ans2 ? line.getStart() : line.getEnd(); + + if (shortest > GeoTools.getAproximatedDistance(point, shorterpnt)) { + answer = line; + shortest = GeoTools.getAproximatedDistance(point, shorterpnt); + } + } + return answer; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java new file mode 100644 index 0000000000..5655ffba91 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java @@ -0,0 +1,123 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools; + +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class PointTools { + + public static LatLong findFarthestPoint(ArrayList crosses, LatLong middle) { + double farthestDistance = Double.NEGATIVE_INFINITY; + LatLong farthestPoint = null; + for (LatLong cross : crosses) { + double distance = GeoTools.getAproximatedDistance(cross, middle); + if (distance > farthestDistance) { + farthestPoint = cross; + farthestDistance = distance; + } + } + return farthestPoint; + } + + /** + * Finds the closest point in a list to another point + * + * @param point + * point that will be used as reference + * @param list + * List of points to be searched + * @return The closest point + */ + @SuppressWarnings("unused") + private static LatLong findClosestPoint(LatLong point, List list) { + LatLong answer = null; + double currentbest = Double.MAX_VALUE; + + for (LatLong pnt : list) { + double dist1 = GeoTools.getAproximatedDistance(point, pnt); + + if (dist1 < currentbest) { + answer = pnt; + currentbest = dist1; + } + } + return answer; + } + + /** + * Finds the pair of adjacent points that minimize the distance to a + * reference point + * + * @param point + * point that will be used as reference + * @param waypoints2 + * List of points to be searched + * @return Position of the second point in the pair that minimizes the + * distance + */ + static int findClosestPair(LatLong point, List waypoints2) { + int answer = 0; + double currentbest = Double.MAX_VALUE; + double dist; + LatLong p1, p2; + + for (int i = 0; i < waypoints2.size(); i++) { + if (i == waypoints2.size() - 1) { + p1 = waypoints2.get(i); + p2 = waypoints2.get(0); + } else { + p1 = waypoints2.get(i); + p2 = waypoints2.get(i + 1); + } + + dist = PointTools.pointToLineDistance(p1, p2, point); + if (dist < currentbest) { + answer = i + 1; + currentbest = dist; + } + } + return answer; + } + + /** + * Provides the distance from a point P to the line segment that passes + * through A-B. If the point is not on the side of the line, returns the + * distance to the closest point + * + * @param L1 + * First point of the line + * @param L2 + * Second point of the line + * @param P + * Point to measure the distance + */ + public static double pointToLineDistance(LatLong L1, LatLong L2, LatLong P) { + double A = P.getLatitude() - L1.getLatitude(); + double B = P.getLongitude() - L1.getLongitude(); + double C = L2.getLatitude() - L1.getLatitude(); + double D = L2.getLongitude() - L1.getLongitude(); + + double dot = A * C + B * D; + double len_sq = C * C + D * D; + double param = dot / len_sq; + + double xx, yy; + + if (param < 0) // point behind the segment + { + xx = L1.getLatitude(); + yy = L1.getLongitude(); + } else if (param > 1) // point after the segment + { + xx = L2.getLatitude(); + yy = L2.getLongitude(); + } else { // point on the side of the segment + xx = L1.getLatitude() + param * C; + yy = L1.getLongitude() + param * D; + } + + return Math.hypot(xx - P.getLatitude(), yy - P.getLongitude()); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java new file mode 100644 index 0000000000..9a74e6f584 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java @@ -0,0 +1,28 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools; + +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.List; + +public class PolylineTools { + + /** + * Total length of the polyline in meters + * + * @param gridPoints + * @return + */ + public static double getPolylineLength(List gridPoints) { + double length = 0; + for (int i = 1; i < gridPoints.size(); i++) { + final LatLong to = gridPoints.get(i - 1); + if (to == null) { + continue; + } + + length += GeoTools.getDistance(gridPoints.get(i), to); + } + return length; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java new file mode 100644 index 0000000000..de60458bca --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java @@ -0,0 +1,47 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools; + +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +/** + * Based on the Ramer–Douglas–Peucker algorithm algorithm + * http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm + */ +public class Simplify { + public static List simplify(List list, double tolerance) { + int index = 0; + double dmax = 0; + int lastIndex = list.size() - 1; + + // Find the point with the maximum distance + for (int i = 1; i < lastIndex; i++) { + double d = PointTools + .pointToLineDistance(list.get(0), list.get(lastIndex), list.get(i)); + if (d > dmax) { + index = i; + dmax = d; + } + } + + // If max distance is greater than epsilon, recursively simplify + List ResultList = new ArrayList(); + if (dmax > tolerance) { + // Recursive call + List recResults1 = simplify(list.subList(0, index + 1), tolerance); + List recResults2 = simplify(list.subList(index, lastIndex + 1), tolerance); + + // Build the result list + recResults1.remove(recResults1.size() - 1); + ResultList.addAll(recResults1); + ResultList.addAll(recResults2); + } else { + ResultList.add(list.get(0)); + ResultList.add(list.get(lastIndex)); + } + + // Return the result + return ResultList; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java new file mode 100644 index 0000000000..4e0f128417 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java @@ -0,0 +1,47 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools.spline; + +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class Spline { + + private static final double SPLINE_TENSION = 1.6; + + private LatLong p0; + private LatLong p0_prime; + private LatLong a; + private LatLong b; + + public Spline(LatLong pMinus1, LatLong p0, LatLong p1, LatLong p2) { + this.p0 = p0; + + // derivative at a point is based on difference of previous and next + // points + p0_prime = p1.subtract(pMinus1).dot(1 / SPLINE_TENSION); + LatLong p1_prime = p2.subtract(this.p0).dot(1 / SPLINE_TENSION); + + // compute a and b coords used in spline formula + a = LatLong.sum(this.p0.dot(2), p1.dot(-2), p0_prime, p1_prime); + b = LatLong.sum(this.p0.dot(-3), p1.dot(3), p0_prime.dot(-2), p1_prime.negate()); + } + + public List generateCoordinates(int decimation) { + ArrayList result = new ArrayList(); + float step = 1f / decimation; + for (float i = 0; i < 1; i += step) { + result.add(evaluate(i)); + } + + return result; + } + + private LatLong evaluate(double t) { + double tSquared = t * t; + double tCubed = tSquared * t; + + return LatLong.sum(a.dot(tCubed), b.dot(tSquared), p0_prime.dot(t), p0); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java new file mode 100644 index 0000000000..a7e8e9459f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java @@ -0,0 +1,55 @@ +package org.droidplanner.services.android.impl.core.helpers.geoTools.spline; + +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class contains functions used to generate a spline path. + */ +public class SplinePath { + + /** + * Used as tag for logging. + */ + private static final String TAG = SplinePath.class.getSimpleName(); + + private final static int SPLINE_DECIMATION = 20; + + /** + * Process the given map coordinates, and return a set of coordinates + * describing the spline path. + * + * @param points + * map coordinates decimation factor + * @return set of coordinates describing the spline path + */ + public static List process(List points) { + final int pointsCount = points.size(); + if (pointsCount < 4) { + System.err.println("Not enough points!"); + return points; + } + + final List results = processPath(points); + results.add(0, points.get(0)); + results.add(points.get(pointsCount - 1)); + return results; + } + + private static List processPath(List points) { + final List results = new ArrayList(); + for (int i = 3; i < points.size(); i++) { + results.addAll(processPathSegment(points.get(i - 3), points.get(i - 2), + points.get(i - 1), points.get(i))); + } + return results; + } + + private static List processPathSegment(LatLong l1, LatLong l2, LatLong l3, LatLong l4) { + Spline spline = new Spline(l1, l2, l3, l4); + return spline.generateCoordinates(SPLINE_DECIMATION); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/units/Area.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/units/Area.java new file mode 100644 index 0000000000..da86121aa0 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/units/Area.java @@ -0,0 +1,35 @@ +package org.droidplanner.services.android.impl.core.helpers.units; + +import java.util.Locale; + +public class Area { + public final static String SQUARE_SYMBOL = "\u00B2"; + private double areaInSqMeters; + + public Area(double areaInSqMeters) { + this.areaInSqMeters = areaInSqMeters; + } + + public double valueInSqMeters() { + return areaInSqMeters; + } + + public void set(double areaInSqMeters) { + this.areaInSqMeters = areaInSqMeters; + } + + @Override + public String toString() { + if (areaInSqMeters >= 100000) { + return String.format(Locale.US, "%2.1f km" + SQUARE_SYMBOL, areaInSqMeters / 1000000); + } else if (areaInSqMeters >= 1) { + return String.format(Locale.US, "%2.1f m" + SQUARE_SYMBOL, areaInSqMeters); + } else if (areaInSqMeters >= 0.00001) { + return String.format(Locale.US, "%2.2f cm" + SQUARE_SYMBOL, areaInSqMeters * 10000); + } else { + return areaInSqMeters + " m" + SQUARE_SYMBOL; + } + + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java new file mode 100644 index 0000000000..7275e83084 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java @@ -0,0 +1,434 @@ +package org.droidplanner.services.android.impl.core.mission; + +import android.util.Pair; + +import com.MAVLink.common.msg_mission_ack; +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; + +import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.core.drone.DroneVariable; +import org.droidplanner.services.android.core.drone.autopilot.apm.APMConstants; +import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; +import org.droidplanner.services.android.core.mission.commands.ConditionYawImpl; +import org.droidplanner.services.android.core.mission.commands.DoJumpImpl; +import org.droidplanner.services.android.core.mission.commands.EpmGripperImpl; +import org.droidplanner.services.android.core.mission.commands.ReturnToHomeImpl; +import org.droidplanner.services.android.core.mission.commands.SetRelayImpl; +import org.droidplanner.services.android.core.mission.commands.SetServoImpl; +import org.droidplanner.services.android.core.mission.commands.TakeoffImpl; +import org.droidplanner.services.android.core.mission.waypoints.CircleImpl; +import org.droidplanner.services.android.core.mission.waypoints.DoLandStartImpl; +import org.droidplanner.services.android.core.mission.waypoints.LandImpl; +import org.droidplanner.services.android.core.mission.waypoints.RegionOfInterestImpl; +import org.droidplanner.services.android.core.mission.waypoints.SpatialCoordItem; +import org.droidplanner.services.android.core.mission.waypoints.SplineWaypointImpl; +import org.droidplanner.services.android.core.mission.waypoints.WaypointImpl; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.property.Attitude; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.drone.property.Home; +import org.droidplanner.services.android.lib.drone.property.Parameter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * This implements a mavlink mission. A mavlink mission is a set of + * commands/mission items to be carried out by the drone. + */ +public class Mission extends DroneVariable { + + /** + * Stores the set of mission items belonging to this mission. + */ + private List items = new ArrayList(); + private final List componentItems = new ArrayList<>(); + + public Mission(GenericMavLinkDrone myDrone) { + super(myDrone); + } + + /** + * Removes a waypoint from the mission's set of mission items. + * + * @param item waypoint to remove + */ + public void removeWaypoint(MissionItemImpl item) { + items.remove(item); + notifyMissionUpdate(); + } + + /** + * Removes a list of waypoints from the mission's set of mission items. + * + * @param toRemove list of waypoints to remove + */ + public void removeWaypoints(List toRemove) { + items.removeAll(toRemove); + notifyMissionUpdate(); + } + + /** + * Add a list of waypoints to the mission's set of mission items. + * + * @param missionItemImpls list of waypoints to add + */ + public void addMissionItems(List missionItemImpls) { + items.addAll(missionItemImpls); + notifyMissionUpdate(); + } + + public void clearMissionItems() { + items.clear(); + notifyMissionUpdate(); + } + + /** + * Add a waypoint to the mission's set of mission item. + * + * @param missionItemImpl waypoint to add + */ + public void addMissionItem(MissionItemImpl missionItemImpl) { + items.add(missionItemImpl); + notifyMissionUpdate(); + } + + public void addMissionItem(int index, MissionItemImpl missionItemImpl) { + items.add(index, missionItemImpl); + notifyMissionUpdate(); + } + + /** + * Signals that this mission object was updated. //TODO: maybe move outside + * of this class + */ + public void notifyMissionUpdate() { + updateComponentItems(); + myDrone.notifyDroneEvent(DroneEventsType.MISSION_UPDATE); + } + + /** + * Updates a mission item + * + * @param oldItem mission item to update + * @param newItem new mission item + */ + public void replace(MissionItemImpl oldItem, MissionItemImpl newItem) { + final int index = items.indexOf(oldItem); + if (index == -1) { + return; + } + + items.remove(index); + items.add(index, newItem); + notifyMissionUpdate(); + } + + public void replaceAll(List> updatesList) { + if (updatesList == null || updatesList.isEmpty()) { + return; + } + + boolean wasUpdated = false; + for (Pair updatePair : updatesList) { + final MissionItemImpl oldItem = updatePair.first; + final int index = items.indexOf(oldItem); + if (index == -1) { + continue; + } + + final MissionItemImpl newItem = updatePair.second; + items.remove(index); + items.add(index, newItem); + + wasUpdated = true; + } + + if (wasUpdated) { + notifyMissionUpdate(); + } + } + + /** + * Reverse the order of the mission items. + */ + public void reverse() { + Collections.reverse(items); + notifyMissionUpdate(); + } + + public void onWriteWaypoints(msg_mission_ack msg) { + myDrone.notifyDroneEvent(DroneEventsType.MISSION_SENT); + } + + public List getItems() { + return items; + } + public List getComponentItems(){ + return componentItems; + } + + public int getOrder(MissionItemImpl waypoint) { + return items.indexOf(waypoint) + 1; // plus one to account for the fact + // that this is an index + } + + public double getAltitudeDiffFromPreviousItem(SpatialCoordItem waypoint) throws IllegalArgumentException { + int i = items.indexOf(waypoint); + if (i > 0) { + MissionItemImpl previous = items.get(i - 1); + if (previous instanceof SpatialCoordItem) { + return waypoint.getCoordinate().getAltitude() - ((SpatialCoordItem) previous).getCoordinate() + .getAltitude(); + } + } + throw new IllegalArgumentException("Last waypoint doesn't have an altitude"); + } + + public double getDistanceFromLastWaypoint(SpatialCoordItem waypoint) + throws IllegalArgumentException { + int i = items.indexOf(waypoint); + if (i > 0) { + MissionItemImpl previous = items.get(i - 1); + if (previous instanceof SpatialCoordItem) { + return GeoTools.getDistance(waypoint.getCoordinate(), + ((SpatialCoordItem) previous).getCoordinate()); + } + } + throw new IllegalArgumentException("Last waypoint doesn't have a coordinate"); + } + + public boolean hasItem(MissionItemImpl item) { + return items.contains(item); + } + + public void onMissionReceived(List msgs) { + if (msgs != null) { + myDrone.processHomeUpdate(msgs.get(0)); + msgs.remove(0); // Remove Home waypoint + items.clear(); + items.addAll(processMavLinkMessages(msgs)); + myDrone.notifyDroneEvent(DroneEventsType.MISSION_RECEIVED); + notifyMissionUpdate(); + } + } + + public void onMissionLoaded(List msgs) { + if (msgs != null) { + myDrone.processHomeUpdate(msgs.get(0)); + msgs.remove(0); // Remove Home waypoint + items.clear(); + items.addAll(processMavLinkMessages(msgs)); + myDrone.notifyDroneEvent(DroneEventsType.MISSION_RECEIVED); + notifyMissionUpdate(); + } + } + + private List processMavLinkMessages(List msgs) { + List received = new ArrayList(); + for (msg_mission_item msg : msgs) { + switch (msg.command) { + case MAV_CMD.MAV_CMD_DO_SET_SERVO: + received.add(new SetServoImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_NAV_WAYPOINT: + received.add(new WaypointImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_NAV_SPLINE_WAYPOINT: + received.add(new SplineWaypointImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_NAV_LAND: + received.add(new LandImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_DO_LAND_START: + received.add(new DoLandStartImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_NAV_TAKEOFF: + received.add(new TakeoffImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_DO_CHANGE_SPEED: + received.add(new ChangeSpeedImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_DO_SET_CAM_TRIGG_DIST: + received.add(new CameraTriggerImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_DO_GRIPPER: + received.add(new EpmGripperImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_DO_SET_ROI: + received.add(new RegionOfInterestImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_NAV_LOITER_TURNS: + received.add(new CircleImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_NAV_RETURN_TO_LAUNCH: + received.add(new ReturnToHomeImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_CONDITION_YAW: + received.add(new ConditionYawImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_DO_SET_RELAY: + received.add(new SetRelayImpl(msg, this)); + break; + case MAV_CMD.MAV_CMD_DO_JUMP: + received.add(new DoJumpImpl(msg, this)); + break; + + default: + break; + } + } + return received; + } + + /** + * Sends the mission to the drone using the mavlink protocol. + */ + public void sendMissionToAPM() { + List msgMissionItems = getMsgMissionItems(); + myDrone.getWaypointManager().writeWaypoints(msgMissionItems); + updateComponentItems(msgMissionItems); + } + + private void updateComponentItems(){ + List msgMissionItems = getMsgMissionItems(); + updateComponentItems(msgMissionItems); + } + + private void updateComponentItems(List msgMissionItems) { + componentItems.clear(); + if(msgMissionItems == null || msgMissionItems.isEmpty()) { + return; + } + msg_mission_item firstItem = msgMissionItems.get(0); + if(firstItem.seq == APMConstants.HOME_WAYPOINT_INDEX) { + msgMissionItems.remove(0); // Remove Home waypoint + } + componentItems.addAll(processMavLinkMessages(msgMissionItems)); + } + + public msg_mission_item packHomeMavlink() { + Home home = (Home) myDrone.getAttribute(AttributeType.HOME); + LatLongAlt coordinate = home.getCoordinate(); + + msg_mission_item mavMsg = new msg_mission_item(); + mavMsg.autocontinue = 1; + mavMsg.command = MAV_CMD.MAV_CMD_NAV_WAYPOINT; + mavMsg.current = 0; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL; + mavMsg.target_system = myDrone.getSysid(); + mavMsg.target_component = myDrone.getCompid(); + if (home.isValid()) { + mavMsg.x = (float) coordinate.getLatitude(); + mavMsg.y = (float) coordinate.getLongitude(); + mavMsg.z = (float) coordinate.getAltitude(); + } + + return mavMsg; + } + + public List getMsgMissionItems() { + List data = new ArrayList(); + int waypointCount = 0; + msg_mission_item home = packHomeMavlink(); + home.seq = waypointCount++; + data.add(home); + + int size = items.size(); + for (int i = 0; i < size; i++) { + MissionItemImpl item = items.get(i); + for(msg_mission_item msg_item: item.packMissionItem()){ + msg_item.seq = waypointCount++; + data.add(msg_item); + } + } + return data; + } + + /** + * Create and upload a dronie mission to the drone + * + * @return the bearing in degrees the drone trajectory will take. + */ + public double makeAndUploadDronie() { + final Gps droneGps = (Gps) myDrone.getAttribute(AttributeType.GPS); + LatLong currentPosition = droneGps.getPosition(); + if (currentPosition == null || droneGps.getSatellitesCount() <= 5) { + myDrone.notifyDroneEvent(DroneEventsType.WARNING_NO_GPS); + return -1; + } + + final Attitude attitude = (Attitude) myDrone.getAttribute(AttributeType.ATTITUDE); + final double bearing = 180 + attitude.getYaw(); + items.clear(); + items.addAll(createDronie(currentPosition, + GeoTools.newCoordFromBearingAndDistance(currentPosition, bearing, 50.0))); + sendMissionToAPM(); + notifyMissionUpdate(); + + return bearing; + } + + private double getSpeedParameter(){ + Parameter param = myDrone.getParameterManager().getParameter("WPNAV_SPEED"); + if (param == null ) { + return -1; + }else{ + return (param.getValue()/100); + } + + } + + public List createDronie(LatLong start, LatLong end) { + final int startAltitude = 4; + final int roiDistance = -8; + LatLong slowDownPoint = GeoTools.pointAlongTheLine(start, end, 5); + + double defaultSpeed = getSpeedParameter(); + if (defaultSpeed == -1) { + defaultSpeed = 5; + } + + List dronieItems = new ArrayList(); + dronieItems.add(new TakeoffImpl(this, startAltitude)); + dronieItems.add(new RegionOfInterestImpl(this, + new LatLongAlt(GeoTools.pointAlongTheLine(start, end, roiDistance), (1.0)))); + dronieItems.add(new WaypointImpl(this, new LatLongAlt(end, (startAltitude + GeoTools.getDistance(start, end) / 2.0)))); + dronieItems.add(new WaypointImpl(this, + new LatLongAlt(slowDownPoint, (startAltitude + GeoTools.getDistance(start, slowDownPoint) / 2.0)))); + dronieItems.add(new ChangeSpeedImpl(this, 1.0)); + dronieItems.add(new WaypointImpl(this, new LatLongAlt(start, startAltitude))); + dronieItems.add(new ChangeSpeedImpl(this, defaultSpeed)); + dronieItems.add(new LandImpl(this, start)); + return dronieItems; + } + + public boolean hasTakeoffAndLandOrRTL() { + if (items.size() >= 2) { + if (isFirstItemTakeoff() && isLastItemLandOrRTL()) { + return true; + } + } + return false; + } + + public boolean isFirstItemTakeoff() { + return !items.isEmpty() && items.get(0) instanceof TakeoffImpl; + } + + public boolean isLastItemLandOrRTL() { + if (items.isEmpty()) + return false; + + MissionItemImpl last = items.get(items.size() - 1); + return (last instanceof ReturnToHomeImpl) || (last instanceof LandImpl); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemImpl.java new file mode 100644 index 0000000000..4161dcc0ff --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemImpl.java @@ -0,0 +1,54 @@ +package org.droidplanner.services.android.impl.core.mission; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_FRAME; + +import java.util.ArrayList; +import java.util.List; + +public abstract class MissionItemImpl implements Comparable { + + protected Mission mission; + + public MissionItemImpl(Mission mission) { + this.mission = mission; + } + + public MissionItemImpl(MissionItemImpl item) { + this(item.mission); + } + + /** + * Return a new list (one or more) of MAVLinkMessage msg_mission_item that + * represent this MissionItem + * + * @return + */ + public List packMissionItem() { + List list = new ArrayList(); + msg_mission_item mavMsg = new msg_mission_item(); + list.add(mavMsg); + mavMsg.autocontinue = 1; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT; + return list; + } + + /** + * Gets data from MAVLinkMessage msg_mission_item for this MissionItem + * + * @return + */ + public abstract void unpackMAVMessage(msg_mission_item mavMsg); + + public abstract MissionItemType getType(); + + public Mission getMission() { + return mission; + } + + @Override + public int compareTo(MissionItemImpl another) { + return mission.getOrder(this) - mission.getOrder(another); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java new file mode 100644 index 0000000000..bfb53b2a97 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java @@ -0,0 +1,97 @@ +package org.droidplanner.services.android.impl.core.mission; + +import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; +import org.droidplanner.services.android.core.mission.commands.ConditionYawImpl; +import org.droidplanner.services.android.core.mission.commands.DoJumpImpl; +import org.droidplanner.services.android.core.mission.commands.EpmGripperImpl; +import org.droidplanner.services.android.core.mission.commands.ReturnToHomeImpl; +import org.droidplanner.services.android.core.mission.commands.SetRelayImpl; +import org.droidplanner.services.android.core.mission.commands.SetServoImpl; +import org.droidplanner.services.android.core.mission.commands.TakeoffImpl; +import org.droidplanner.services.android.core.mission.survey.SplineSurveyImpl; +import org.droidplanner.services.android.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.core.mission.waypoints.CircleImpl; +import org.droidplanner.services.android.core.mission.waypoints.DoLandStartImpl; +import org.droidplanner.services.android.core.mission.waypoints.LandImpl; +import org.droidplanner.services.android.core.mission.waypoints.RegionOfInterestImpl; +import org.droidplanner.services.android.core.mission.waypoints.SplineWaypointImpl; +import org.droidplanner.services.android.core.mission.waypoints.StructureScannerImpl; +import org.droidplanner.services.android.core.mission.waypoints.WaypointImpl; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.Collections; + +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"), + SPLINE_SURVEY("Spline Survey"), + CYLINDRICAL_SURVEY("Structure Scan"), + CHANGE_SPEED("Change Speed"), + CAMERA_TRIGGER("Camera Trigger"), + EPM_GRIPPER("EPM"), + SET_SERVO("Set Servo"), + CONDITION_YAW("Set Yaw"), + SET_RELAY("Set Relay"), + DO_LAND_START("Do Land Start"), + DO_JUMP("Do Jump"); + + private final String name; + + private MissionItemType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public MissionItemImpl getNewItem(MissionItemImpl referenceItem) throws IllegalArgumentException { + switch (this) { + case WAYPOINT: + return new WaypointImpl(referenceItem); + case SPLINE_WAYPOINT: + return new SplineWaypointImpl(referenceItem); + case TAKEOFF: + return new TakeoffImpl(referenceItem); + case CHANGE_SPEED: + return new ChangeSpeedImpl(referenceItem); + case CAMERA_TRIGGER: + return new CameraTriggerImpl(referenceItem); + case EPM_GRIPPER: + return new EpmGripperImpl(referenceItem); + case RTL: + return new ReturnToHomeImpl(referenceItem); + case LAND: + return new LandImpl(referenceItem); + case CIRCLE: + return new CircleImpl(referenceItem); + case ROI: + return new RegionOfInterestImpl(referenceItem); + case SURVEY: + return new SurveyImpl(referenceItem.getMission(), Collections.emptyList()); + case SPLINE_SURVEY: + return new SplineSurveyImpl(referenceItem.getMission(), Collections.emptyList()); + case CYLINDRICAL_SURVEY: + return new StructureScannerImpl(referenceItem); + case SET_SERVO: + return new SetServoImpl(referenceItem); + case CONDITION_YAW: + return new ConditionYawImpl(referenceItem); + case SET_RELAY: + return new SetRelayImpl(referenceItem); + case DO_LAND_START: + return new DoLandStartImpl(referenceItem); + case DO_JUMP: + return new DoJumpImpl(referenceItem); + default: + throw new IllegalArgumentException("Unrecognized mission item type (" + name + ")" + ""); + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java new file mode 100644 index 0000000000..a0b4cc7378 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java @@ -0,0 +1,55 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +public class CameraTriggerImpl extends MissionCMD { + private double distance = (0); + + public CameraTriggerImpl(MissionItemImpl item) { + super(item); + } + + public CameraTriggerImpl(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public CameraTriggerImpl(Mission mission, double triggerDistance) { + super(mission); + this.distance = triggerDistance; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_SET_CAM_TRIGG_DIST; + mavMsg.param1 = (float) distance; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + distance = (mavMsg.param1); + } + + @Override + public MissionItemType getType() { + return MissionItemType.CAMERA_TRIGGER; + } + + public double getTriggerDistance() { + return distance; + } + + public void setTriggerDistance(double triggerDistance) { + this.distance = triggerDistance; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java new file mode 100644 index 0000000000..d0e315b01b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java @@ -0,0 +1,64 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +public class ChangeSpeedImpl extends MissionCMD { + private double speed = 5; //meters per second + + public ChangeSpeedImpl(MissionItemImpl item) { + super(item); + } + + public ChangeSpeedImpl(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public ChangeSpeedImpl(Mission mission, double 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; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + speed = mavMsg.param2; + } + + @Override + public MissionItemType getType() { + return MissionItemType.CHANGE_SPEED; + } + + /** + * @return the set speed in meters per second. + */ + public double getSpeed() { + return speed; + } + + /** + * Set the speed + * @param speed speed in meters per second. + */ + public void setSpeed(double speed) { + this.speed = speed; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java new file mode 100644 index 0000000000..7f52ca8382 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java @@ -0,0 +1,82 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +public class ConditionYawImpl extends MissionCMD { + private boolean isRelative = false; + private double angle = 0; + private double angularSpeed = 0; + + public ConditionYawImpl(MissionItemImpl item) { + super(item); + } + + public ConditionYawImpl(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public ConditionYawImpl(Mission mission, double angle, boolean isRelative) { + super(mission); + setAngle(angle); + setRelative(isRelative); + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_CONDITION_YAW; + mavMsg.param1 = (float) GeoTools.warpToPositiveAngle(angle); + mavMsg.param2 = (float) Math.abs(angularSpeed); + mavMsg.param3 = (angularSpeed < 0) ? 1 : -1; + mavMsg.param4 = isRelative ? 1: 0; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + isRelative = mavMsg.param4 != 0; + angle = mavMsg.param1; + angularSpeed = mavMsg.param2 * (mavMsg.param3>0 ? -1: +1); + } + + @Override + public MissionItemType getType() { + return MissionItemType.CONDITION_YAW; + } + + public void setAngle(double angle) { + this.angle = angle; + } + + public void setRelative(boolean isRelative){ + this.isRelative = isRelative; + } + + public void setAngularSpeed(double angularSpeed) { + this.angularSpeed = angularSpeed; + } + + public double getAngle() { + return angle; + } + + public double getAngularSpeed() { + return angularSpeed; + } + + public boolean isRelative(){ + return isRelative; + } + + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java new file mode 100644 index 0000000000..679141928f --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java @@ -0,0 +1,74 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +/** + * Created by Toby on 7/31/2015. + */ +public class DoJumpImpl extends MissionCMD{ + private int waypoint; + private int repeatCount; + + public DoJumpImpl(MissionItemImpl item){ + super(item); + } + + public DoJumpImpl(Mission mission) { + super(mission); + } + + public DoJumpImpl(msg_mission_item mavMsg, Mission mission){ + super(mission); + unpackMAVMessage(mavMsg); + } + + public DoJumpImpl(Mission mission, int waypoint, int repeatCount){ + super(mission); + this.waypoint = waypoint; + this.repeatCount = repeatCount; + } + + public int getWaypoint() { + return waypoint; + } + + public void setWaypoint(int waypoint) { + this.waypoint = waypoint; + } + + public int getRepeatCount() { + return repeatCount; + } + + public void setRepeatCount(int repeatCount) { + this.repeatCount = repeatCount; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + waypoint = (int)mavMsg.param1; + repeatCount = (int)mavMsg.param2; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_JUMP; + mavMsg.param1 = waypoint; + mavMsg.param2 = repeatCount; + return list; + } + + @Override + public MissionItemType getType() { + return MissionItemType.DO_JUMP; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java new file mode 100644 index 0000000000..eda9de68a6 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java @@ -0,0 +1,61 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.GRIPPER_ACTIONS; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +public class EpmGripperImpl extends MissionCMD { + + private boolean release = true; + + public EpmGripperImpl(MissionItemImpl item) { + super(item); + } + + public EpmGripperImpl(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public EpmGripperImpl(Mission mission, boolean release) { + super(mission); + this.release = release; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_GRIPPER; + mavMsg.param2 = release ? GRIPPER_ACTIONS.GRIPPER_ACTION_RELEASE : GRIPPER_ACTIONS.GRIPPER_ACTION_GRAB; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + if (mavMsg.param2 == GRIPPER_ACTIONS.GRIPPER_ACTION_GRAB) { + release = false; + } else if (mavMsg.param2 == GRIPPER_ACTIONS.GRIPPER_ACTION_RELEASE) { + release = true; + } + } + + @Override + public MissionItemType getType() { + return MissionItemType.EPM_GRIPPER; + } + + public boolean isRelease() { + return release; + } + + public void setAsRelease(boolean release) { + this.release = release; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java new file mode 100644 index 0000000000..e0092761b0 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java @@ -0,0 +1,25 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; + +import java.util.List; + +public abstract class MissionCMD extends MissionItemImpl { + + public MissionCMD(Mission mission) { + super(mission); + } + + public MissionCMD(MissionItemImpl item) { + super(item); + } + + @Override + public List packMissionItem() { + return super.packMissionItem(); + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java new file mode 100644 index 0000000000..b85f3aca0a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java @@ -0,0 +1,60 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +public class ReturnToHomeImpl extends MissionCMD { + + private double returnAltitude; + + public ReturnToHomeImpl(MissionItemImpl item) { + super(item); + returnAltitude = (0); + } + + public ReturnToHomeImpl(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public ReturnToHomeImpl(Mission mission) { + super(mission); + returnAltitude = (0.0); + } + + public double getHeight() { + return returnAltitude; + } + + public void setHeight(double altitude) { + returnAltitude = altitude; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_NAV_RETURN_TO_LAUNCH; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT; + mavMsg.z = (float) returnAltitude; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMessageItem) { + returnAltitude = (mavMessageItem.z); + } + + @Override + public MissionItemType getType() { + return MissionItemType.RTL; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java new file mode 100644 index 0000000000..13acbf4eca --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java @@ -0,0 +1,64 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +/** + * Mavlink message builder for the 'SetRelay' mission item. + * Set a Relay pin’s voltage high or low. + */ +public class SetRelayImpl extends MissionCMD { + + private int relayNumber; + private boolean enabled; + + public SetRelayImpl(MissionItemImpl item){ + super(item); + } + + public SetRelayImpl(msg_mission_item msg, Mission mission){ + super(mission); + unpackMAVMessage(msg); + } + + public SetRelayImpl(Mission mission, int relayNumber, boolean enabled){ + super(mission); + this.relayNumber = relayNumber; + this.enabled = enabled; + } + + @Override + public MissionItemType getType(){ + return MissionItemType.SET_RELAY; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg){ + relayNumber = (int) mavMsg.param1; + enabled = mavMsg.param2 != 0; + } + + @Override + public List packMissionItem(){ + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_SET_RELAY; + mavMsg.param1 = relayNumber; + mavMsg.param2 = enabled ? 1 : 0; + return list; + } + + public int getRelayNumber() { + return relayNumber; + } + + public boolean isEnabled() { + return enabled; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java new file mode 100644 index 0000000000..8fa36f9210 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java @@ -0,0 +1,71 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +public class SetServoImpl extends MissionCMD { + + private int pwm; + private int channel; + + public SetServoImpl(MissionItemImpl item) { + super(item); + } + + public SetServoImpl(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public SetServoImpl(Mission mission, int channel, int pwm) { + super(mission); + this.channel = channel; + this.pwm = pwm; + } + + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + channel = (int) mavMsg.param1; + pwm = (int) mavMsg.param2; + + } + + @Override + public MissionItemType getType() { + return MissionItemType.SET_SERVO; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_SET_SERVO; + mavMsg.param1 = channel; + mavMsg.param2 = pwm; + return list; + } + + public int getPwm() { + return pwm; + } + + public int getChannel() { + return channel; + } + + public void setPwm(int pwm) { + this.pwm = pwm; + } + + public void setChannel(int channel) { + this.channel = channel; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java new file mode 100644 index 0000000000..0f5405a7ed --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java @@ -0,0 +1,79 @@ +package org.droidplanner.services.android.impl.core.mission.commands; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; + +import java.util.List; + +public class TakeoffImpl extends MissionCMD { + + public static final double DEFAULT_TAKEOFF_ALTITUDE = 10.0; + + private double finishedAlt = 10; + private double pitch = 0; + + public TakeoffImpl(MissionItemImpl item) { + super(item); + } + + public TakeoffImpl(msg_mission_item msg, Mission mission) { + super(mission); + unpackMAVMessage(msg); + } + + public TakeoffImpl(Mission mission, double altitude) { + super(mission); + this.finishedAlt = altitude; + this.pitch = 0; + } + + public TakeoffImpl(Mission mission, double altitude, double pitch) { + super(mission); + this.finishedAlt = altitude; + this.pitch = pitch; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_NAV_TAKEOFF; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT; + mavMsg.z = (float) finishedAlt; + if (pitch > 0) + mavMsg.param1 = (float) pitch; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + finishedAlt = mavMsg.z; + pitch = mavMsg.param1; + } + + @Override + public MissionItemType getType() { + return MissionItemType.TAKEOFF; + } + + public double getFinishedAlt() { + return finishedAlt; + } + + public void setFinishedAlt(double finishedAlt) { + this.finishedAlt = finishedAlt; + } + + public double getPitch() { + return pitch; + } + + public void setPitch(double pitch) { + this.pitch = pitch; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java new file mode 100644 index 0000000000..ee9546b9f7 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java @@ -0,0 +1,40 @@ +package org.droidplanner.services.android.impl.core.mission.survey; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.List; + +public class SplineSurveyImpl extends SurveyImpl { + + public SplineSurveyImpl(Mission mission, List points) { + super(mission, points); + } + + @Override + protected msg_mission_item getSurveyPoint(LatLong point, double altitude) { + msg_mission_item mavMsg = new msg_mission_item(); + mavMsg.autocontinue = 1; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT; + mavMsg.command = MAV_CMD.MAV_CMD_NAV_SPLINE_WAYPOINT; + mavMsg.x = (float) point.getLatitude(); + mavMsg.y = (float) point.getLongitude(); + mavMsg.z = (float) altitude; + mavMsg.param1 = 0f; + mavMsg.param2 = 0f; + mavMsg.param3 = 0f; + mavMsg.param4 = 0f; + return mavMsg; + } + + @Override + public MissionItemType getType() { + return MissionItemType.SPLINE_SURVEY; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java new file mode 100644 index 0000000000..9cd3601e36 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java @@ -0,0 +1,129 @@ +package org.droidplanner.services.android.impl.core.mission.survey; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.core.polygon.Polygon; +import org.droidplanner.services.android.core.survey.CameraInfo; +import org.droidplanner.services.android.core.survey.SurveyData; +import org.droidplanner.services.android.core.survey.grid.Grid; +import org.droidplanner.services.android.core.survey.grid.GridBuilder; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class SurveyImpl extends MissionItemImpl { + + public Polygon polygon = new Polygon(); + public SurveyData surveyData = new SurveyData(); + public Grid grid; + + private boolean startCameraBeforeFirstWaypoint; + + public SurveyImpl(Mission mission, List points) { + super(mission); + polygon.addPoints(points); + } + + public void update(double angle, double altitude, double overlap, double sidelap) { + surveyData.update(angle, altitude, overlap, sidelap); + } + + public boolean isStartCameraBeforeFirstWaypoint() { + return startCameraBeforeFirstWaypoint; + } + + public void setStartCameraBeforeFirstWaypoint(boolean startCameraBeforeFirstWaypoint) { + this.startCameraBeforeFirstWaypoint = startCameraBeforeFirstWaypoint; + } + + public void setCameraInfo(CameraInfo camera) { + surveyData.setCameraInfo(camera); + } + + public void build() throws Exception { + // TODO find better point than (0,0) to reference the grid + grid = null; + GridBuilder gridBuilder = new GridBuilder(polygon, surveyData, new LatLong(0, 0)); + polygon.checkIfValid(); + grid = gridBuilder.generate(true); + } + + @Override + public List packMissionItem() { + try { + List list = new ArrayList(); + build(); + + packSurveyPoints(list); + + return list; + } catch (Exception e) { + return new ArrayList(); + } + } + + private void packSurveyPoints(List list) { + //Generate the camera trigger + CameraTriggerImpl camTrigger = new CameraTriggerImpl(mission, surveyData.getLongitudinalPictureDistance()); + + //Add it if the user wants it to start before the first waypoint. + if(startCameraBeforeFirstWaypoint){ + list.addAll(camTrigger.packMissionItem()); + } + + final double altitude = surveyData.getAltitude(); + + //Add the camera trigger after the first waypoint if it wasn't added before. + boolean addToFirst = !startCameraBeforeFirstWaypoint; + + for (LatLong point : grid.gridPoints) { + msg_mission_item mavMsg = getSurveyPoint(point, altitude); + list.add(mavMsg); + + if(addToFirst){ + list.addAll(camTrigger.packMissionItem()); + addToFirst = false; + } + } + + list.addAll((new CameraTriggerImpl(mission, (0.0)).packMissionItem())); + } + + protected msg_mission_item getSurveyPoint(LatLong point, double altitude){ + return packSurveyPoint(point, altitude); + } + + public static msg_mission_item packSurveyPoint(LatLong point, double altitude) { + msg_mission_item mavMsg = new msg_mission_item(); + mavMsg.autocontinue = 1; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT; + mavMsg.command = MAV_CMD.MAV_CMD_NAV_WAYPOINT; + mavMsg.x = (float) point.getLatitude(); + mavMsg.y = (float) point.getLongitude(); + mavMsg.z = (float) altitude; + mavMsg.param1 = 0f; + mavMsg.param2 = 0f; + mavMsg.param3 = 0f; + mavMsg.param4 = 0f; + return mavMsg; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + // TODO Auto-generated method stub + + } + + @Override + public MissionItemType getType() { + return MissionItemType.SURVEY; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java new file mode 100644 index 0000000000..1e4fe9aca9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java @@ -0,0 +1,81 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; +import com.MAVLink.enums.MAV_FRAME; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.ArrayList; +import java.util.List; + +public class CircleImpl extends SpatialCoordItem { + + private double radius = 10.0; + private int turns = 1; + + public CircleImpl(MissionItemImpl item) { + super(item); + } + + public CircleImpl(Mission mission, LatLongAlt coord) { + super(mission, coord); + } + + public CircleImpl(msg_mission_item msg, Mission mission) { + super(mission, null); + unpackMAVMessage(msg); + } + + public void setTurns(int turns) { + this.turns = Math.abs(turns); + } + + public void setRadius(double radius) { + this.radius = radius; + } + + public int getNumberOfTurns() { + return turns; + } + + public double getRadius() { + return radius; + } + + @Override + public List packMissionItem() { + List list = new ArrayList(); + packSingleCircle(list); + return list; + } + + private void packSingleCircle(List list) { + msg_mission_item mavMsg = new msg_mission_item(); + list.add(mavMsg); + mavMsg.autocontinue = 1; + mavMsg.frame = MAV_FRAME.MAV_FRAME_GLOBAL_RELATIVE_ALT; + mavMsg.x = (float) coordinate.getLatitude(); + mavMsg.y = (float) coordinate.getLongitude(); + mavMsg.z = (float) (coordinate.getAltitude()); + mavMsg.command = MAV_CMD.MAV_CMD_NAV_LOITER_TURNS; + mavMsg.param1 = Math.abs(turns); + mavMsg.param3 = (float) radius; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + super.unpackMAVMessage(mavMsg); + setTurns((int) mavMsg.param1); + setRadius(mavMsg.param3); + } + + @Override + public MissionItemType getType() { + return MissionItemType.CIRCLE; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java new file mode 100644 index 0000000000..d56998756a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java @@ -0,0 +1,53 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.List; + +public class DoLandStartImpl extends SpatialCoordItem { + + public DoLandStartImpl(MissionItemImpl item) { + super(item); + setAltitude((0.0)); + } + + public DoLandStartImpl(Mission mission) { + this(mission, new LatLong(0, 0)); + } + + public DoLandStartImpl(Mission mMission, LatLong coord) { + super(mMission, new LatLongAlt(coord, (0))); + } + + public DoLandStartImpl(msg_mission_item msg, Mission mission) { + super(mission, null); + unpackMAVMessage(msg); + } + + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_LAND_START; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + super.unpackMAVMessage(mavMsg); + } + + @Override + public MissionItemType getType() { + return MissionItemType.DO_LAND_START; + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java new file mode 100644 index 0000000000..899b97112b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java @@ -0,0 +1,53 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.List; + +public class LandImpl extends SpatialCoordItem { + + public LandImpl(MissionItemImpl item) { + super(item); + setAltitude((0.0)); + } + + public LandImpl(Mission mission) { + this(mission, new LatLong(0, 0)); + } + + public LandImpl(Mission mMission, LatLong coord) { + super(mMission, new LatLongAlt(coord, 0)); + } + + public LandImpl(msg_mission_item msg, Mission mission) { + super(mission, null); + unpackMAVMessage(msg); + } + + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_NAV_LAND; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + super.unpackMAVMessage(mavMsg); + } + + @Override + public MissionItemType getType() { + return MissionItemType.LAND; + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java new file mode 100644 index 0000000000..ff418828ad --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java @@ -0,0 +1,53 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.List; + +public class RegionOfInterestImpl extends SpatialCoordItem { + + public RegionOfInterestImpl(MissionItemImpl item) { + super(item); + } + + public RegionOfInterestImpl(Mission mission, LatLongAlt coord) { + super(mission,coord); + } + + public RegionOfInterestImpl(msg_mission_item msg, Mission mission) { + super(mission, null); + unpackMAVMessage(msg); + } + + /** + * @return True if this roi cancels a previously set roi. + */ + public boolean isReset(){ + return coordinate.getLatitude() == 0 && coordinate.getLongitude() == 0 && coordinate.getAltitude() == 0; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_DO_SET_ROI; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + super.unpackMAVMessage(mavMsg); + } + + @Override + public MissionItemType getType() { + return MissionItemType.ROI; + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java new file mode 100644 index 0000000000..d32e702fae --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java @@ -0,0 +1,61 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.List; + +public abstract class SpatialCoordItem extends MissionItemImpl { + + protected LatLongAlt coordinate; + + public SpatialCoordItem(Mission mission, LatLongAlt coord) { + super(mission); + this.coordinate = coord; + } + + public SpatialCoordItem(MissionItemImpl item) { + super(item); + if (item instanceof SpatialCoordItem) { + coordinate = ((SpatialCoordItem) item).getCoordinate(); + } else { + coordinate = new LatLongAlt(0, 0, 0); + } + } + + public void setCoordinate(LatLongAlt coordNew) { + coordinate = coordNew; + } + + public LatLongAlt getCoordinate() { + return coordinate; + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.x = (float) coordinate.getLatitude(); + mavMsg.y = (float) coordinate.getLongitude(); + mavMsg.z = (float) coordinate.getAltitude(); + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + setCoordinate(new LatLongAlt(mavMsg.x, mavMsg.y, mavMsg.z)); + } + + public void setAltitude(double altitude) { + coordinate.setAltitude(altitude); + } + + public void setPosition(LatLong position) { + coordinate.set(position); + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java new file mode 100644 index 0000000000..445557ef9c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java @@ -0,0 +1,64 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.List; + +/** + * Handle spline waypoint mavlink packet generation. + */ +public class SplineWaypointImpl extends SpatialCoordItem { + + /** + * Hold time in decimal seconds. (ignored by fixed wing, time to stay at + * MISSION for rotary wing) + */ + private double delay; + + public SplineWaypointImpl(MissionItemImpl item) { + super(item); + } + + public SplineWaypointImpl(Mission mission, LatLongAlt coord) { + super(mission, coord); + } + + public SplineWaypointImpl(msg_mission_item msg, Mission mission) { + super(mission, null); + unpackMAVMessage(msg); + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_NAV_SPLINE_WAYPOINT; + mavMsg.param1 = (float) delay; + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + super.unpackMAVMessage(mavMsg); + setDelay(mavMsg.param1); + } + + @Override + public MissionItemType getType() { + return MissionItemType.SPLINE_WAYPOINT; + } + + public double getDelay() { + return delay; + } + + public void setDelay(double delay) { + this.delay = delay; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java new file mode 100644 index 0000000000..5d438a5dd4 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java @@ -0,0 +1,166 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.core.polygon.Polygon; +import org.droidplanner.services.android.core.survey.CameraInfo; +import org.droidplanner.services.android.core.survey.SurveyData; +import org.droidplanner.services.android.core.survey.grid.GridBuilder; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.ArrayList; +import java.util.List; + +public class StructureScannerImpl extends SpatialCoordItem { + private double radius = (10.0); + private double heightStep = (5); + private int numberOfSteps = 2; + private boolean crossHatch = false; + SurveyData survey = new SurveyData(); + + public StructureScannerImpl(Mission mission, LatLongAlt coord) { + super(mission, coord); + } + + public StructureScannerImpl(MissionItemImpl item) { + super(item); + } + + @Override + public List packMissionItem() { + List list = new ArrayList(); + packROI(list); + packCircles(list); + if (crossHatch) { + packHatch(list); + } + return list; + } + + private void packROI(List list) { + RegionOfInterestImpl roi = new RegionOfInterestImpl(mission, new LatLongAlt(coordinate, (0.0))); + list.addAll(roi.packMissionItem()); + } + + private void packCircles(List list) { + for (double altitude = coordinate.getAltitude(); altitude <= getTopHeight(); altitude += heightStep) { + CircleImpl circleImpl = new CircleImpl(mission, new LatLongAlt(coordinate, (altitude))); + circleImpl.setRadius(radius); + list.addAll(circleImpl.packMissionItem()); + } + } + + private void packHatch(List list) { + Polygon polygon = new Polygon(); + for (double angle = 0; angle <= 360; angle += 10) { + polygon.addPoint(GeoTools.newCoordFromBearingAndDistance(coordinate, angle, radius)); + } + + LatLong corner = GeoTools.newCoordFromBearingAndDistance(coordinate, -45, radius * 2); + + survey.setAltitude(getTopHeight()); + + try { + survey.update(0.0, survey.getAltitude(), survey.getOverlap(), survey.getSidelap()); + GridBuilder grid = new GridBuilder(polygon, survey, corner); + for (LatLong point : grid.generate(false).gridPoints) { + list.add(SurveyImpl.packSurveyPoint(point, getTopHeight())); + } + + survey.update(90.0, survey.getAltitude(), survey.getOverlap(), survey.getSidelap()); + GridBuilder grid2 = new GridBuilder(polygon, survey, corner); + for (LatLong point : grid2.generate(false).gridPoints) { + list.add(SurveyImpl.packSurveyPoint(point, getTopHeight())); + } + } catch (Exception e) { // Should never fail, since it has good polygons + } + + } + + public List getPath() { + List path = new ArrayList(); + for (msg_mission_item msg_mission_item : packMissionItem()) { + if (msg_mission_item.command == MAV_CMD.MAV_CMD_NAV_WAYPOINT) { + path.add(new LatLong(msg_mission_item.x, msg_mission_item.y)); + } + if (msg_mission_item.command == MAV_CMD.MAV_CMD_NAV_LOITER_TURNS) { + for (double angle = 0; angle <= 360; angle += 12) { + path.add(GeoTools.newCoordFromBearingAndDistance(coordinate, angle, radius)); + } + } + + } + return path; + + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + } + + @Override + public MissionItemType getType() { + return MissionItemType.CYLINDRICAL_SURVEY; + } + + + private double getTopHeight() { + return (coordinate.getAltitude() + (numberOfSteps - 1) * heightStep); + } + + public double getEndAltitude() { + return heightStep; + } + + public int getNumberOfSteps() { + return numberOfSteps; + } + + public double getRadius() { + return radius; + } + + public LatLong getCenter() { + return coordinate; + } + + public void setRadius(int newValue) { + radius = newValue; + } + + public void enableCrossHatch(boolean isEnabled) { + crossHatch = isEnabled; + } + + public boolean isCrossHatchEnabled() { + return crossHatch; + } + + public void setAltitudeStep(int newValue) { + heightStep = (newValue); + } + + public void setNumberOfSteps(int newValue) { + numberOfSteps = newValue; + } + + public void setCamera(CameraInfo cameraInfo) { + survey.setCameraInfo(cameraInfo); + } + + public String getCamera() { + return survey.getCameraName(); + } + + public SurveyData getSurveyData() { + return survey; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java new file mode 100644 index 0000000000..f6ea3ef6a9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java @@ -0,0 +1,101 @@ +package org.droidplanner.services.android.impl.core.mission.waypoints; + +import com.MAVLink.common.msg_mission_item; +import com.MAVLink.enums.MAV_CMD; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; + +import java.util.List; + +public class WaypointImpl extends SpatialCoordItem { + + private double delay; + private double acceptanceRadius; + private double yawAngle; + private double orbitalRadius; + private boolean orbitCCW; + + public WaypointImpl(MissionItemImpl item) { + super(item); + } + + public WaypointImpl(Mission mission, LatLongAlt coord) { + super(mission, coord); + } + + public WaypointImpl(msg_mission_item msg, Mission mission) { + super(mission, null); + unpackMAVMessage(msg); + } + + @Override + public List packMissionItem() { + List list = super.packMissionItem(); + msg_mission_item mavMsg = list.get(0); + mavMsg.command = MAV_CMD.MAV_CMD_NAV_WAYPOINT; + mavMsg.param1 = (float) getDelay(); + mavMsg.param2 = (float) getAcceptanceRadius(); + mavMsg.param3 = (float) (isOrbitCCW() ? getOrbitalRadius() * -1.0 : getOrbitalRadius()); + mavMsg.param4 = (float) getYawAngle(); + return list; + } + + @Override + public void unpackMAVMessage(msg_mission_item mavMsg) { + super.unpackMAVMessage(mavMsg); + setDelay(mavMsg.param1); + setAcceptanceRadius(mavMsg.param2); + setOrbitCCW(mavMsg.param3 < 0); + setOrbitalRadius(Math.abs(mavMsg.param3)); + setYawAngle(mavMsg.param4); + } + + @Override + public MissionItemType getType() { + return MissionItemType.WAYPOINT; + } + + public double getDelay() { + return delay; + } + + public void setDelay(double delay) { + this.delay = delay; + } + + public double getAcceptanceRadius() { + return acceptanceRadius; + } + + public void setAcceptanceRadius(double acceptanceRadius) { + this.acceptanceRadius = acceptanceRadius; + } + + public double getYawAngle() { + return yawAngle; + } + + public void setYawAngle(double yawAngle) { + this.yawAngle = yawAngle; + } + + public double getOrbitalRadius() { + return orbitalRadius; + } + + public void setOrbitalRadius(double orbitalRadius) { + this.orbitalRadius = orbitalRadius; + } + + public boolean isOrbitCCW() { + return orbitCCW; + } + + public void setOrbitCCW(boolean orbitCCW) { + this.orbitCCW = orbitCCW; + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java new file mode 100644 index 0000000000..85417f54dc --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java @@ -0,0 +1,13 @@ +package org.droidplanner.services.android.impl.core.model; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; + +/** + * Parse received autopilot warning messages. + */ +public interface AutopilotWarningParser { + + String getDefaultWarning(); + + String parseWarning(MavLinkDrone drone, String warning); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/Logger.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/Logger.java new file mode 100644 index 0000000000..4d582ef4f7 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/Logger.java @@ -0,0 +1,25 @@ +package org.droidplanner.services.android.impl.core.model; + +/** + * Defines a set of essential logging utilities. + */ +public interface Logger { + + public void logVerbose(String logTag, String verbose); + + public void logDebug(String logTag, String debug); + + public void logInfo(String logTag, String info); + + public void logWarning(String logTag, String warning); + + public void logWarning(String logTag, Exception exception); + + public void logWarning(String logTag, String warning, Exception exception); + + public void logErr(String logTag, String err); + + public void logErr(String logTag, Exception exception); + + public void logErr(String logTag, String err, Exception exception); +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java new file mode 100644 index 0000000000..276023ce54 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java @@ -0,0 +1,76 @@ +package org.droidplanner.services.android.impl.core.polygon; + +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.core.helpers.units.Area; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Polygon { + + private List points = new ArrayList(); + + public void addPoints(List pointList) { + for (LatLong point : pointList) { + addPoint(point); + } + } + + public void addPoint(LatLong coord) { + points.add(coord); + } + + public void clearPolygon() { + points.clear(); + } + + public List getPoints() { + return points; + } + + public List getLines() { + List list = new ArrayList(); + for (int i = 0; i < points.size(); i++) { + int endIndex = (i == 0) ? points.size() - 1 : i - 1; + list.add(new LineLatLong(points.get(i), points.get(endIndex))); + } + return list; + } + + public void movePoint(LatLong coord, int number) { + points.get(number).set(coord); + } + + public Area getArea() { + return GeoTools.getArea(this); + } + + /* + * @Override public List getPathPoints() { List path = + * getLatLngList(); if (getLatLngList().size() > 2) { path.add(path.get(0)); + * } return path; } + */ + + public void checkIfValid() throws Exception { + if (points.size() < 3) { + throw new InvalidPolygon(points.size()); + } + } + + public class InvalidPolygon extends Exception { + private static final long serialVersionUID = 1L; + public int size; + + public InvalidPolygon(int size) { + this.size = size; + } + } + + public void reversePoints() { + Collections.reverse(points); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/Srtm.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/Srtm.java new file mode 100644 index 0000000000..f5e177e8bb --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/Srtm.java @@ -0,0 +1,48 @@ +package org.droidplanner.services.android.impl.core.srtm; + +public class Srtm { + private static final int SRTM_NaN = -32768; + + /** + * Callback for progress reports + */ + public interface OnProgressListner { + public void onProgress(String filename, int percentage); + } + + private SrtmData srtmData; + private OnProgressListner listner; + + /** + * @param directory + * Cache directory + */ + public Srtm(String directory) { + srtmData = new SrtmData(directory); + } + + /** + * Get SRTM elevation for geographic coordinate (WGS-84) + * + * Stores a cache of uncompressed SRTM data files at the default directory. + * It need a Internet connection to fetch SRTM files if they are not in the + * disk + * + * @return Above Sea Level (ASL) altitude in meters + */ + public int getData(double longitude, double latitude) { + try { + return srtmData.load(longitude, latitude, listner); + } catch (Exception e) { + e.printStackTrace(); + return SRTM_NaN; // SRTM NaN + } + } + + /** + * If a file needs to be download this listener will be called periodically + */ + public void setListner(OnProgressListner listner) { + this.listner = listner; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java new file mode 100644 index 0000000000..7292123169 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java @@ -0,0 +1,89 @@ +package org.droidplanner.services.android.impl.core.srtm; + +import org.droidplanner.services.android.core.srtm.Srtm.OnProgressListner; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class SrtmData { + private String path; + private File srtmFile; + private BufferedInputStream s; + + public SrtmData(String dir) { + path = dir; + } + + public int load(double lon, double lat, OnProgressListner listner) throws Exception { + int altitude; + + String fname = SrtmData.getName(lon, lat); + setupFilePaths(fname); + downloadSrtmFileIfNeeded(fname, listner); + + s = new BufferedInputStream(new FileInputStream(srtmFile)); + altitude = readHtgFile(s, lon, lat); + s.close(); + return altitude; + } + + private void downloadSrtmFileIfNeeded(String fname, OnProgressListner listner) throws Exception { + if (!srtmFile.exists()) { + new SrtmDownloader(listner).downloadSrtmFile(fname, path); + } + } + + private void setupFilePaths(String fname) { + srtmFile = new File(path + "/" + fname); + } + + private int readHtgFile(BufferedInputStream s, double lon, double lat) throws Exception { + byte[] buffer = new byte[2]; + int index = calculateFileIndex(lon, lat); + skipToDataPositionInFile(index); + s.read(buffer); + return ByteBuffer.wrap(buffer).order(ByteOrder.BIG_ENDIAN).getShort(); + } + + private void skipToDataPositionInFile(int index) throws Exception { + if (s.skip(index) != index) { + throw new Exception("error when skipping"); + } + } + + private int calculateFileIndex(double lon, double lat) { + int ai = (int) Math.round(1200d * (lat - Math.floor(lat))); + int aj = (int) Math.round(1200d * (lon - Math.floor(lon))); + int index = (aj + (1200 - ai) * 1201) * 2; + return index; + } + + static String getName(double Dlon, double Dlat) { + + int lon = (int) Math.floor(Dlon); + int lat = (int) Math.floor(Dlat); + + String dirlat = "N"; + if (lat < 0) { + dirlat = "S"; + } + String dirlon = "E"; + if (lon < 0) { + dirlon = "W"; + } + String st = String.valueOf(Math.abs(lat)); + while (st.length() < 2) { + st = "0" + st; + } + String fname = dirlat + st; + st = String.valueOf(Math.abs(lon)); + while (st.length() < 3) { + st = "0" + st; + } + fname = fname + dirlon + st + ".hgt"; + return fname; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java new file mode 100644 index 0000000000..32d61ea974 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java @@ -0,0 +1,97 @@ +package org.droidplanner.services.android.impl.core.srtm; + +import org.droidplanner.services.android.core.srtm.Srtm.OnProgressListner; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; + +public class SrtmDownloader { + static final String url = "http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/"; + private OnProgressListner listner; + + public SrtmDownloader(OnProgressListner listner) { + this.listner = listner; + } + + public void downloadRegionIndex(int region, String srtmPath) throws IOException { + String regionIndex = SrtmRegions.REGIONS[region] + ".index.html"; + regionIndex = getIndexPath(srtmPath) + regionIndex; + File regionIndexFile = new File(regionIndex); + downloadFile(url + SrtmRegions.REGIONS[region] + "/", regionIndexFile); + } + + public void downloadSrtmFile(String fname, String path) throws Exception { + File output; + String region = new SrtmRegions(path).findRegion(fname, listner); + output = new File(path + "/" + fname + ".zip"); + downloadSrtmFile(fname, output, region); + UnZip.unZipIt(fname, output); + output.delete(); + } + + private void downloadSrtmFile(String fname, File output, String region) throws IOException { + try { + downloadFile(SrtmDownloader.url + region + "/" + fname + ".zip", output); + } catch (IOException e) { + downloadAlternativeSrtmFile(fname, output, region, e); + } + } + + private void downloadAlternativeSrtmFile(String fname, File output, String region, IOException e) + throws IOException { + // fix SRTM 2.1 naming problem in North America + if (fname.startsWith("N5") && region.equalsIgnoreCase("North_America")) { + downloadFile(SrtmDownloader.url + region + "/" + fname.replace(".hgt", "hgt") + ".zip", + output); + } else { + throw e; + } + } + + private void downloadFile(String urlAddress, File file) throws IOException { + URL url = new URL(urlAddress); + URLConnection connection = url.openConnection(); + connection.connect(); + // this will be useful so that you can show a typical 0-100% progress + // bar + long fileLength = connection.getContentLength(); + + // download the file + InputStream input = new BufferedInputStream(url.openStream()); + BufferedOutputStream outputs = new BufferedOutputStream(new FileOutputStream(file)); + + byte data[] = new byte[2048]; + long total = 0; + int count; + while ((count = input.read(data)) != -1) { + total += count; + outputs.write(data, 0, count); + callListner(file.getName(), (int) (total * 100 / fileLength)); + } + + outputs.flush(); + outputs.close(); + input.close(); + } + + private void callListner(String filename, int i) { + if (listner != null) { + if (i >= 0) { + listner.onProgress(filename, i); + } else { + listner.onProgress(filename, -1); + } + } + } + + public static String getIndexPath(String srtmPath) { + return srtmPath + "/Index/"; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java new file mode 100644 index 0000000000..84eb0e322d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java @@ -0,0 +1,76 @@ +package org.droidplanner.services.android.impl.core.srtm; + +import org.droidplanner.services.android.core.srtm.Srtm.OnProgressListner; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +public class SrtmRegions { + static final String[] REGIONS = { "Eurasia", "Africa", "Australia", "Islands", "North_America", + "South_America" }; + private Map regionMap = new HashMap(); + private String path; + + public SrtmRegions(String path) { + this.path = path; + } + + /* + * Returns region name for a file + */ + public String findRegion(String fname, OnProgressListner listner) throws Exception { + if (regionMap.isEmpty()) { + fillRegionData(listner); + } + String name = fname.replace(".hgt", ""); + if (regionMap.containsKey(name)) { + return REGIONS[regionMap.get(name)]; + } + throw new Exception("Null Region"); + } + + private void fillRegionData(OnProgressListner listner) throws Exception { + String region; + for (int i = 0; i < SrtmRegions.REGIONS.length; i++) { + region = SrtmRegions.REGIONS[i]; + String indexPath = region; + indexPath = SrtmDownloader.getIndexPath(path) + indexPath; + File indexDir = new File(indexPath); + if (!indexDir.exists()) { + indexDir.mkdirs(); + } + indexPath += ".index.html"; + File indexFile = new File(indexPath); + if (!indexFile.exists()) { + try { + new SrtmDownloader(listner).downloadRegionIndex(i, path); + } catch (IOException e) { + // download error, try again with the next attempt + regionMap.clear(); + throw new Exception("Null Region"); + } + } + Scanner scanner = new Scanner(indexFile); + while (scanner.hasNext()) { + String line = scanner.next(); + if (line.contains("href=\"")) { + int index = line.indexOf(".hgt.zip") - 7; + if (index >= 0) { + String srtm = line.substring(index, index + 7); + regionMap.put(srtm, i); + } else { + index = line.indexOf("hgt.zip") - 7; + if (index >= 0) { + String srtm = line.substring(index, index + 7); + regionMap.put(srtm, i); + } + } + } + } + scanner.close(); + } + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/UnZip.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/UnZip.java new file mode 100644 index 0000000000..bf96582e72 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/UnZip.java @@ -0,0 +1,32 @@ +package org.droidplanner.services.android.impl.core.srtm; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +public class UnZip { + public static void unZipIt(String fname, File output) throws IOException { + + byte[] buffer = new byte[1024]; + + ZipFile zip = new ZipFile(output); + ZipEntry ze = zip.getEntry(fname); + InputStream zis = zip.getInputStream(ze); + + File newFile = new File(output.getParent() + "/" + fname); + + FileOutputStream fos = new FileOutputStream(newFile); + + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + + fos.close(); + zis.close(); + zip.close(); + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/CameraInfo.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/CameraInfo.java new file mode 100644 index 0000000000..897d875062 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/CameraInfo.java @@ -0,0 +1,37 @@ +package org.droidplanner.services.android.impl.core.survey; + +public class CameraInfo { + public String name = "Canon SX260"; + public Double sensorWidth = 6.12; + public Double sensorHeight = 4.22; + public Double sensorResolution = 12.1; + public Double focalLength = 5.0; + public Double overlap = 50.0; + public Double sidelap = 60.0; + public boolean isInLandscapeOrientation = true; + + public Double getSensorLateralSize() { + if (isInLandscapeOrientation) { + return sensorWidth; + } else { + return sensorHeight; + } + } + + public Double getSensorLongitudinalSize() { + if (isInLandscapeOrientation) { + return sensorHeight; + } else { + return sensorWidth; + } + } + + @Override + public String toString() { + return "Camera:"+name+" ImageWidth:" + sensorWidth + " ImageHeight:" + sensorHeight + " FocalLength:" + + focalLength + " Overlap:" + overlap + " Sidelap:" + sidelap + + " isInLandscapeOrientation:" + isInLandscapeOrientation; + + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java new file mode 100644 index 0000000000..f2c224a8fe --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java @@ -0,0 +1,74 @@ +package org.droidplanner.services.android.impl.core.survey; + +import com.MAVLink.ardupilotmega.msg_camera_feedback; + +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.util.MathUtils; + +import java.util.ArrayList; +import java.util.List; + +public class Footprint { + /** + * Vertex of the footprint in local frame index 0 is top right, where top is + * direction of longitudinal travel. Index increases CCW + */ + private final List vertex = new ArrayList<>(); + private double meanGSD; + + public Footprint(CameraInfo camera, double altitude) { + this(camera, new LatLong(0, 0), (float) altitude, 0, 0, 0); + } + + public Footprint(CameraInfo camera, msg_camera_feedback msg) { + this(camera, new LatLong(msg.lat / 1E7, msg.lng / 1E7), msg.alt_rel, msg.pitch, msg.roll, msg.yaw); + } + + public Footprint(CameraInfo camera, LatLong center, double alt, double pitch, double roll, double yaw) { + double sx = camera.getSensorLateralSize() / 2; + double sy = camera.getSensorLongitudinalSize() / 2; + double f = camera.focalLength; + double[][] dcm = MathUtils.dcmFromEuler(Math.toRadians(pitch), Math.toRadians(-roll + 180), Math.toRadians(-yaw)); + vertex.add(cameraFrameToLocalFrame(new LatLong(-sx, -sy), dcm, alt, f, center)); + vertex.add(cameraFrameToLocalFrame(new LatLong(+sx, -sy), dcm, alt, f, center)); + vertex.add(cameraFrameToLocalFrame(new LatLong(+sx, +sy), dcm, alt, f, center)); + vertex.add(cameraFrameToLocalFrame(new LatLong(-sx, +sy), dcm, alt, f, center)); + + meanGSD = 0.001 * getLateralSize() * (sy / sx) + / Math.sqrt(camera.sensorResolution); + } + + /** + * based on http://www.asprs.org/a/publications/pers/2005journal/july/2005_july_863-871.pdf + */ + static private LatLong cameraFrameToLocalFrame(LatLong img, double[][] dcm, double alt, + double focalLength, LatLong center) { + double x = alt + * (dcm[0][0] * img.getLatitude() + dcm[1][0] * img.getLongitude() + dcm[2][0] * (-focalLength)) + / (dcm[0][2] * img.getLatitude() + dcm[1][2] * img.getLongitude() + dcm[2][2] * (-focalLength)); + double y = alt + * (dcm[0][1] * img.getLatitude() + dcm[1][1] * img.getLongitude() + dcm[2][1] * (-focalLength)) + / (dcm[0][2] * img.getLatitude() + dcm[1][2] * img.getLongitude() + dcm[2][2] * (-focalLength)); + + return GeoTools.moveCoordinate(center, x, y); + } + + public double getLateralSize() { + return (GeoTools.getDistance(vertex.get(0), vertex.get(1)) + GeoTools + .getDistance(vertex.get(2), vertex.get(3))) / 2; + } + + public double getLongitudinalSize() { + return (GeoTools.getDistance(vertex.get(0), vertex.get(3)) + GeoTools + .getDistance(vertex.get(1), vertex.get(2))) / 2; + } + + public List getVertexInGlobalFrame() { + return vertex; + } + + public double getGSD() { + return meanGSD; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java new file mode 100644 index 0000000000..ce01a7c51c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java @@ -0,0 +1,96 @@ +package org.droidplanner.services.android.impl.core.survey; + +import org.droidplanner.services.android.core.helpers.units.Area; + +import java.util.Locale; + +public class SurveyData { + private CameraInfo camera = new CameraInfo(); + private double altitude; + private Double angle; + private Double overlap; + private Double sidelap; + private Footprint footprint; + + public SurveyData() { + update(0, (50.0), 50, 60); + } + + public void update(double angle, double altitude, double overlap, double sidelap) { + this.angle = angle; + this.overlap = overlap; + this.sidelap = sidelap; + setAltitude(altitude); + } + + public void setAltitude(double altitude) { + this.altitude = altitude; + this.footprint = new Footprint(camera, this.altitude); + } + + public void setCameraInfo(CameraInfo info) { + this.camera = info; + this.footprint = new Footprint(this.camera, this.altitude); + tryToLoadOverlapFromCamera(); + } + + public CameraInfo getCameraInfo() { + return this.camera; + } + + private void tryToLoadOverlapFromCamera() { + if (camera.overlap != null) { + this.overlap = camera.overlap; + } + if (camera.sidelap != null) { + this.sidelap = camera.sidelap; + } + } + + public double getLongitudinalPictureDistance() { + return getLongitudinalFootPrint() * (1 - overlap * .01); + } + + public double getLateralPictureDistance() { + return getLateralFootPrint() * (1 - sidelap * .01); + } + + public double getAltitude() { + return altitude; + } + + public Double getAngle() { + return angle; + } + + public double getSidelap() { + return sidelap; + } + + public double getOverlap() { + return overlap; + } + + public double getLateralFootPrint() { + return footprint.getLateralSize(); + } + + public double getLongitudinalFootPrint() { + return footprint.getLongitudinalSize(); + } + + public Area getGroundResolution() { + return new Area(footprint.getGSD() * 0.01); + } + + public String getCameraName() { + return camera.name; + } + + @Override + public String toString() { + return String.format(Locale.US, "Altitude: %f Angle %f Overlap: %f Sidelap: %f", altitude, + angle, overlap, sidelap); + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java new file mode 100644 index 0000000000..fb0961b968 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java @@ -0,0 +1,60 @@ +package org.droidplanner.services.android.impl.core.survey.grid; + +import org.droidplanner.services.android.core.helpers.coordinates.CoordBounds; +import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class CircumscribedGrid { + private static final int MAX_NUMBER_OF_LINES = 300; + List grid = new ArrayList(); + private LatLong gridLowerLeft; + private double extrapolatedDiag; + private Double angle; + + public CircumscribedGrid(List polygonPoints, Double angle, Double lineDist) + throws Exception { + this.angle = angle; + + findPolygonBounds(polygonPoints); + drawGrid(lineDist); + } + + private void drawGrid(Double lineDist) throws GridWithTooManyLines { + int lines = 0; + LatLong startPoint = gridLowerLeft; + while (lines * lineDist < extrapolatedDiag) { + LatLong endPoint = GeoTools.newCoordFromBearingAndDistance(startPoint, angle, + extrapolatedDiag); + + LineLatLong line = new LineLatLong(startPoint, endPoint); + grid.add(line); + + startPoint = GeoTools.newCoordFromBearingAndDistance(startPoint, angle + 90, lineDist); + lines++; + if (lines > MAX_NUMBER_OF_LINES) { + throw new GridWithTooManyLines(); + } + } + } + + private void findPolygonBounds(List polygonPoints) { + CoordBounds bounds = new CoordBounds(polygonPoints); + LatLong middlePoint = bounds.getMiddle(); + gridLowerLeft = GeoTools.newCoordFromBearingAndDistance(middlePoint, angle - 135, + bounds.getDiag()); + extrapolatedDiag = bounds.getDiag() * 1.5; + } + + public List getGrid() { + return grid; + } + + public class GridWithTooManyLines extends Exception { + private static final long serialVersionUID = 1L; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java new file mode 100644 index 0000000000..672720ef74 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java @@ -0,0 +1,70 @@ +package org.droidplanner.services.android.impl.core.survey.grid; + +import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.core.helpers.geoTools.LineSampler; +import org.droidplanner.services.android.core.helpers.geoTools.LineTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class EndpointSorter { + private static final int MAX_NUMBER_OF_CAMERAS = 2000; + + private List gridPoints = new ArrayList(); + private List grid; + private Double sampleDistance; + private List cameraLocations = new ArrayList(); + + public EndpointSorter(List grid, Double sampleDistance) { + this.grid = grid; + this.sampleDistance = sampleDistance; + } + + public void sortGrid(LatLong lastpnt, boolean sort) throws Exception { + while (grid.size() > 0) { + if (sort) { + LineLatLong closestLine = LineTools.findClosestLineToPoint(lastpnt, grid); + LatLong secondWp = processOneGridLine(closestLine, lastpnt, sort); + lastpnt = secondWp; + }else{ + LineLatLong closestLine = grid.get(0); + LatLong secondWp = processOneGridLine(closestLine, lastpnt, sort); + lastpnt = secondWp; + } + } + } + + private LatLong processOneGridLine(LineLatLong closestLine, LatLong lastpnt, boolean sort) + throws Exception { + LatLong firstWP, secondWp; + firstWP = closestLine.getClosestEndpointTo(lastpnt); + secondWp = closestLine.getFarthestEndpointTo(lastpnt); + + grid.remove(closestLine); + + updateCameraLocations(firstWP, secondWp); + gridPoints.add(firstWP); + gridPoints.add(secondWp); + + if (cameraLocations.size() > MAX_NUMBER_OF_CAMERAS) { + throw new Exception("Too many camera positions"); + } + return secondWp; + } + + private void updateCameraLocations(LatLong firstWP, LatLong secondWp) { + List cameraLocationsOnThisStrip = new LineSampler(firstWP, secondWp) + .sample(sampleDistance); + cameraLocations.addAll(cameraLocationsOnThisStrip); + } + + public List getSortedGrid() { + return gridPoints; + } + + public List getCameraLocations() { + return cameraLocations; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java new file mode 100644 index 0000000000..bc70572ce9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java @@ -0,0 +1,33 @@ +package org.droidplanner.services.android.impl.core.survey.grid; + +import org.droidplanner.services.android.core.helpers.geoTools.PolylineTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.List; + +public class Grid { + public List gridPoints; + private List cameraLocations; + + public Grid(List list, List cameraLocations) { + this.gridPoints = list; + this.cameraLocations = cameraLocations; + } + + public double getLength() { + return PolylineTools.getPolylineLength(gridPoints); + } + + public int getNumberOfLines() { + return gridPoints.size() / 2; + } + + public List getCameraLocations() { + return cameraLocations; + } + + public int getCameraCount() { + return cameraLocations.size(); + } + +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java new file mode 100644 index 0000000000..e7acca03d7 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java @@ -0,0 +1,53 @@ +package org.droidplanner.services.android.impl.core.survey.grid; + +import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.core.polygon.Polygon; +import org.droidplanner.services.android.core.survey.SurveyData; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.List; + +public class GridBuilder { + + private Polygon poly; + private Double angle; + private Double lineDist; + private LatLong origin; + private Double wpDistance; + + private Grid grid; + + public GridBuilder(Polygon polygon, SurveyData surveyData, LatLong originPoint) { + this.poly = polygon; + this.origin = originPoint; + this.angle = surveyData.getAngle(); + this.lineDist = surveyData.getLateralPictureDistance(); + this.wpDistance = surveyData.getLongitudinalPictureDistance(); + } + + public GridBuilder(Polygon polygon, double angle, double distance, LatLong originPoint) { + this.poly = polygon; + this.origin = originPoint; + this.angle = angle; + this.lineDist = distance; + this.wpDistance = distance; + } + + public void setAngle(double newAngle){ + angle = newAngle; + } + + public Grid generate(boolean sort) throws Exception { + List polygonPoints = poly.getPoints(); + + List circumscribedGrid = new CircumscribedGrid(polygonPoints, angle, lineDist) + .getGrid(); + List trimedGrid = new Trimmer(circumscribedGrid, poly.getLines()) + .getTrimmedGrid(); + EndpointSorter gridSorter = new EndpointSorter(trimedGrid, wpDistance); + gridSorter.sortGrid(origin, sort); + grid = new Grid(gridSorter.getSortedGrid(), gridSorter.getCameraLocations()); + return grid; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java new file mode 100644 index 0000000000..e0d5d0d1f5 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java @@ -0,0 +1,49 @@ +package org.droidplanner.services.android.impl.core.survey.grid; + +import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.core.helpers.geoTools.LineTools; +import org.droidplanner.services.android.lib.coordinate.LatLong; + +import java.util.ArrayList; +import java.util.List; + +public class Trimmer { + List trimedGrid = new ArrayList(); + + public Trimmer(List grid, List polygon) { + for (LineLatLong gridLine : grid) { + ArrayList crosses = findCrossings(polygon, gridLine); + processCrossings(crosses, gridLine); + } + } + + private ArrayList findCrossings(List polygon, LineLatLong gridLine) { + + ArrayList crossings = new ArrayList(); + for (LineLatLong polyLine : polygon) { + LatLong intersection = LineTools.FindLineIntersection(polyLine, gridLine); + if(intersection != null) + crossings.add(intersection); + } + + return crossings; + } + + private void processCrossings(ArrayList crosses, LineLatLong gridLine) { + switch (crosses.size()) { + case 0: + case 1: + break; + case 2: + trimedGrid.add(new LineLatLong(crosses.get(0), crosses.get(1))); + break; + default: // TODO handle multiple crossings in a better way + trimedGrid.add(LineTools.findExternalPoints(crosses)); + } + } + + public List getTrimmedGrid() { + return trimedGrid; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionContract.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionContract.java new file mode 100644 index 0000000000..503b89d72d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionContract.java @@ -0,0 +1,49 @@ +package org.droidplanner.services.android.impl.data; + +import android.provider.BaseColumns; + +/** + * Defines the schema for the Session database. + */ +public final class SessionContract { + + public static final String DB_NAME = "session"; + public static final int DB_VERSION = 2; + + //Private constructor to prevent instantiation. + private SessionContract(){} + + public static String getSqlCreateEntries(){ + return SessionData.SQL_CREATE_ENTRIES; + } + + public static String getSqlDeleteEntries(){ + return SessionData.SQL_DELETE_ENTRIES; + } + + /** + * Defines the schema for the SessionData table. + */ + public static final class SessionData implements BaseColumns { + public static final String TABLE_NAME = "session_data"; + + public static final String COLUMN_NAME_APP_ID = "app_id"; + public static final String COLUMN_NAME_START_TIME ="start_time"; + public static final String COLUMN_NAME_END_TIME = "end_time"; + public static final String COLUMN_NAME_CONNECTION_TYPE = "connection_type"; + public static final String COLUMN_NAME_DSHARE_UPLOAD_TIME = "dshare_upload_time"; + + public static final String SQL_CREATE_ENTRIES = + "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + + _ID + " INTEGER PRIMARY KEY," + + COLUMN_NAME_APP_ID + " TEXT," + + COLUMN_NAME_START_TIME + " INTEGER NOT NULL," + + COLUMN_NAME_END_TIME + " INTEGER," + + COLUMN_NAME_CONNECTION_TYPE + " TEXT," + + COLUMN_NAME_DSHARE_UPLOAD_TIME + " INTEGER" + + " )"; + + public static final String SQL_DELETE_ENTRIES = + "DROP TABLE IF EXISTS " + TABLE_NAME; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java new file mode 100644 index 0000000000..5b65b0d83b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java @@ -0,0 +1,72 @@ +package org.droidplanner.services.android.impl.data; + +import android.content.ContentValues; +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import org.droidplanner.services.android.data.SessionContract.SessionData; + +import java.util.Date; + +/** + * Created by fhuya on 12/30/14. + */ +public class SessionDB extends SQLiteOpenHelper { + + private static final String TAG = SessionDB.class.getSimpleName(); + + public SessionDB(Context context) { + super(context, SessionContract.DB_NAME, null, SessionContract.DB_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + Log.d(TAG, "Creating session database."); + db.execSQL(SessionContract.getSqlCreateEntries()); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL(SessionContract.getSqlDeleteEntries()); + onCreate(db); + } + + public void startSession(Date startDate, String connectionType){ + //Get the data repository in write mode. + SQLiteDatabase db = getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(SessionData.COLUMN_NAME_START_TIME, startDate.getTime()); + values.put(SessionData.COLUMN_NAME_CONNECTION_TYPE, connectionType); + + db.insert(SessionData.TABLE_NAME, null, values); + } + + public void endSession(Date startDate, String connectionType, Date endDate){ + SQLiteDatabase db = getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(SessionData.COLUMN_NAME_END_TIME, endDate.getTime()); + + String selection = SessionData.COLUMN_NAME_START_TIME + " LIKE ? AND " + SessionData + .COLUMN_NAME_CONNECTION_TYPE + " LIKE ?"; + String[] selectionArgs = {String.valueOf(startDate.getTime()), connectionType}; + + db.update(SessionData.TABLE_NAME, values, selection, selectionArgs); + } + + public void updateDroneShareUploadTime(Date startDate, String connectionType, Date uploadDate){ + SQLiteDatabase db = getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(SessionData.COLUMN_NAME_DSHARE_UPLOAD_TIME, uploadDate.getTime()); + + String selection = SessionData.COLUMN_NAME_START_TIME + " LIKE ? AND " + SessionData + .COLUMN_NAME_CONNECTION_TYPE + " LIKE ?"; + String[] selectionArgs = {String.valueOf(startDate.getTime()), connectionType}; + + db.update(SessionData.TABLE_NAME, values, selection, selectionArgs); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/FileProvider.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/FileProvider.java new file mode 100644 index 0000000000..b4307b07dd --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/FileProvider.java @@ -0,0 +1,756 @@ +package org.droidplanner.services.android.impl.data.provider; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ProviderInfo; +import android.content.res.XmlResourceParser; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.provider.OpenableColumns; +import android.text.TextUtils; +import android.webkit.MimeTypeMap; + +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; +import static org.xmlpull.v1.XmlPullParser.START_TAG; + +/** + * FileProvider is a special subclass of {@link ContentProvider} that facilitates secure sharing + * of files associated with an app by creating a content:// {@link Uri} for a file + * instead of a file:/// {@link Uri}. + *

+ * A content URI allows you to grant read and write access using + * temporary access permissions. When you create an {@link Intent} containing + * a content URI, in order to send the content URI + * to a client app, you can also call {@link Intent#setFlags(int) Intent.setFlags()} to add + * permissions. These permissions are available to the client app for as long as the stack for + * a receiving {@link android.app.Activity} is active. For an {@link Intent} going to a + * {@link android.app.Service}, the permissions are available as long as the + * {@link android.app.Service} is running. + *

+ * In comparison, to control access to a file:/// {@link Uri} you have to modify the + * file system permissions of the underlying file. The permissions you provide become available to + * any app, and remain in effect until you change them. This level of access is + * fundamentally insecure. + *

+ * The increased level of file access security offered by a content URI + * makes FileProvider a key part of Android's security infrastructure. + *

+ * This overview of FileProvider includes the following topics: + *

+ *
    + *
  1. Defining a FileProvider
  2. + *
  3. Specifying Available Files
  4. + *
  5. Retrieving the Content URI for a File
  6. + *
  7. Granting Temporary Permissions to a URI
  8. + *
  9. Serving a Content URI to Another App
  10. + *
+ *

Defining a FileProvider

+ *

+ * Since the default functionality of FileProvider includes content URI generation for files, you + * don't need to define a subclass in code. Instead, you can include a FileProvider in your app + * by specifying it entirely in XML. To specify the FileProvider component itself, add a + * <provider> + * element to your app manifest. Set the android:name attribute to + * android.support.v4.content.FileProvider. Set the android:authorities + * attribute to a URI authority based on a domain you control; for example, if you control the + * domain mydomain.com you should use the authority + * com.mydomain.fileprovider. Set the android:exported attribute to + * false; the FileProvider does not need to be public. Set the + * android:grantUriPermissions attribute to true, to allow you + * to grant temporary access to files. For example: + *

+ *<manifest>
+ *    ...
+ *    <application>
+ *        ...
+ *        <provider
+ *            android:name="android.support.v4.content.FileProvider"
+ *            android:authorities="com.mydomain.fileprovider"
+ *            android:exported="false"
+ *            android:grantUriPermissions="true">
+ *            ...
+ *        </provider>
+ *        ...
+ *    </application>
+ *</manifest>
+ *

+ * If you want to override any of the default behavior of FileProvider methods, extend + * the FileProvider class and use the fully-qualified class name in the android:name + * attribute of the <provider> element. + *

Specifying Available Files

+ * A FileProvider can only generate a content URI for files in directories that you specify + * beforehand. To specify a directory, specify the its storage area and path in XML, using child + * elements of the <paths> element. + * For example, the following paths element tells FileProvider that you intend to + * request content URIs for the images/ subdirectory of your private file area. + *
+ *<paths xmlns:android="http://schemas.android.com/apk/res/android">
+ *    <files-path name="my_images" path="images/"/>
+ *    ...
+ *</paths>
+ *
+ *

+ * The <paths> element must contain one or more of the following child elements: + *

+ *
+ *
+ *
+ *<files-path name="name" path="path" />
+ *
+ *
+ *
+ * Represents files in the files/ subdirectory of your app's internal storage + * area. This subdirectory is the same as the value returned by {@link Context#getFilesDir() + * Context.getFilesDir()}. + *
+ *
+ *<external-path name="name" path="path" />
+ *
+ *
+ *
+ * Represents files in the root of your app's external storage area. The path + * {@link Context#getExternalFilesDir(String) Context.getExternalFilesDir()} returns the + * files/ subdirectory of this this root. + *
+ *
+ *
+ *<cache-path name="name" path="path" />
+ *
+ *
+ *
+ * Represents files in the cache subdirectory of your app's internal storage area. The root path + * of this subdirectory is the same as the value returned by {@link Context#getCacheDir() + * getCacheDir()}. + *
+ *
+ *

+ * These child elements all use the same attributes: + *

+ *
+ *
+ * name="name" + *
+ *
+ * A URI path segment. To enforce security, this value hides the name of the subdirectory + * you're sharing. The subdirectory name for this value is contained in the + * path attribute. + *
+ *
+ * path="path" + *
+ *
+ * The subdirectory you're sharing. While the name attribute is a URI path + * segment, the path value is an actual subdirectory name. Notice that the + * value refers to a subdirectory, not an individual file or files. You can't + * share a single file by its file name, nor can you specify a subset of files using + * wildcards. + *
+ *
+ *

+ * You must specify a child element of <paths> for each directory that contains + * files for which you want content URIs. For example, these XML elements specify two directories: + *

+ *<paths xmlns:android="http://schemas.android.com/apk/res/android">
+ *    <files-path name="my_images" path="images/"/>
+ *    <files-path name="my_docs" path="docs/"/>
+ *</paths>
+ *
+ *

+ * Put the <paths> element and its children in an XML file in your project. + * For example, you can add them to a new file called res/xml/file_paths.xml. + * To link this file to the FileProvider, add a + * <meta-data> element + * as a child of the <provider> element that defines the FileProvider. Set the + * <meta-data> element's "android:name" attribute to + * android.support.FILE_PROVIDER_PATHS. Set the element's "android:resource" attribute + * to @xml/file_paths (notice that you don't specify the .xml + * extension). For example: + *

+ *<provider
+ *    android:name="android.support.v4.content.FileProvider"
+ *    android:authorities="com.mydomain.fileprovider"
+ *    android:exported="false"
+ *    android:grantUriPermissions="true">
+ *    <meta-data
+ *        android:name="android.support.FILE_PROVIDER_PATHS"
+ *        android:resource="@xml/file_paths" />
+ *</provider>
+ *
+ *

Generating the Content URI for a File

+ *

+ * To share a file with another app using a content URI, your app has to generate the content URI. + * To generate the content URI, create a new {@link File} for the file, then pass the {@link File} + * to {@link #getUriForFile(Context, String, File) getUriForFile()}. You can send the content URI + * returned by {@link #getUriForFile(Context, String, File) getUriForFile()} to another app in an + * {@link Intent}. The client app that receives the content URI can open the file + * and access its contents by calling + * {@link android.content.ContentResolver#openFileDescriptor(Uri, String) + * ContentResolver.openFileDescriptor} to get a {@link ParcelFileDescriptor}. + *

+ * For example, suppose your app is offering files to other apps with a FileProvider that has the + * authority com.mydomain.fileprovider. To get a content URI for the file + * default_image.jpg in the images/ subdirectory of your internal storage + * add the following code: + *

+ *File imagePath = new File(Context.getFilesDir(), "images");
+ *File newFile = new File(imagePath, "default_image.jpg");
+ *Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
+ *
+ * As a result of the previous snippet, + * {@link #getUriForFile(Context, String, File) getUriForFile()} returns the content URI + * content://com.mydomain.fileprovider/my_images/default_image.jpg. + *

Granting Temporary Permissions to a URI

+ * To grant an access permission to a content URI returned from + * {@link #getUriForFile(Context, String, File) getUriForFile()}, do one of the following: + *
    + *
  • + * Call the method + * {@link Context#grantUriPermission(String, Uri, int) + * Context.grantUriPermission(package, Uri, mode_flags)} for the content:// + * {@link Uri}, using the desired mode flags. This grants temporary access permission for the + * content URI to the specified package, according to the value of the + * the mode_flags parameter, which you can set to + * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}, {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION} + * or both. The permission remains in effect until you revoke it by calling + * {@link Context#revokeUriPermission(Uri, int) revokeUriPermission()} or until the device + * reboots. + *
  • + *
  • + * Put the content URI in an {@link Intent} by calling {@link Intent#setData(Uri) setData()}. + *
  • + *
  • + * Next, call the method {@link Intent#setFlags(int) Intent.setFlags()} with either + * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} or + * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION} or both. + *
  • + *
  • + * Finally, send the {@link Intent} to + * another app. Most often, you do this by calling + * {@link android.app.Activity#setResult(int, Intent) setResult()}. + *

    + * Permissions granted in an {@link Intent} remain in effect while the stack of the receiving + * {@link android.app.Activity} is active. When the stack finishes, the permissions are + * automatically removed. Permissions granted to one {@link android.app.Activity} in a client + * app are automatically extended to other components of that app. + *

    + *
  • + *
+ *

Serving a Content URI to Another App

+ *

+ * There are a variety of ways to serve the content URI for a file to a client app. One common way + * is for the client app to start your app by calling + * {@link android.app.Activity#startActivityForResult(Intent, int, Bundle) startActivityResult()}, + * which sends an {@link Intent} to your app to start an {@link android.app.Activity} in your app. + * In response, your app can immediately return a content URI to the client app or present a user + * interface that allows the user to pick a file. In the latter case, once the user picks the file + * your app can return its content URI. In both cases, your app returns the content URI in an + * {@link Intent} sent via {@link android.app.Activity#setResult(int, Intent) setResult()}. + *

+ *

+ * You can also put the content URI in a {@link android.content.ClipData} object and then add the + * object to an {@link Intent} you send to a client app. To do this, call + * {@link Intent#setClipData(ClipData) Intent.setClipData()}. When you use this approach, you can + * add multiple {@link android.content.ClipData} objects to the {@link Intent}, each with its own + * content URI. When you call {@link Intent#setFlags(int) Intent.setFlags()} on the {@link Intent} + * to set temporary access permissions, the same permissions are applied to all of the content + * URIs. + *

+ *

+ * Note: The {@link Intent#setClipData(ClipData) Intent.setClipData()} method is + * only available in platform version 16 (Android 4.1) and later. If you want to maintain + * compatibility with previous versions, you should send one content URI at a time in the + * {@link Intent}. Set the action to {@link Intent#ACTION_SEND} and put the URI in data by calling + * {@link Intent#setData setData()}. + *

+ *

More Information

+ *

+ * To learn more about FileProvider, see the Android training class + * Sharing Files Securely with URIs. + *

+ */ +public class FileProvider extends ContentProvider { + private static final String[] COLUMNS = { + OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE }; + + private static final String + META_DATA_FILE_PROVIDER_PATHS = "android.support.FILE_PROVIDER_PATHS"; + + private static final String TAG_ROOT_PATH = "root-path"; + private static final String TAG_FILES_PATH = "files-path"; + private static final String TAG_CACHE_PATH = "cache-path"; + private static final String TAG_EXTERNAL = "external-path"; + + private static final String ATTR_NAME = "name"; + private static final String ATTR_PATH = "path"; + + private static final File DEVICE_ROOT = new File("/"); + + // @GuardedBy("sCache") + private static HashMap sCache = new HashMap(); + + private PathStrategy mStrategy; + + /** + * The default FileProvider implementation does not need to be initialized. If you want to + * override this method, you must provide your own subclass of FileProvider. + */ + @Override + public boolean onCreate() { + return true; + } + + /** + * After the FileProvider is instantiated, this method is called to provide the system with + * information about the provider. + * + * @param context A {@link Context} for the current component. + * @param info A {@link ProviderInfo} for the new provider. + */ + @Override + public void attachInfo(Context context, ProviderInfo info) { + super.attachInfo(context, info); + + // Sanity check our security + if (info.exported) { + throw new SecurityException("Provider must not be exported"); + } + if (!info.grantUriPermissions) { + throw new SecurityException("Provider must grant uri permissions"); + } + + mStrategy = getPathStrategy(context, info.authority); + } + + /** + * Return a content URI for a given {@link File}. Specific temporary + * permissions for the content URI can be set with + * {@link Context#grantUriPermission(String, Uri, int)}, or added + * to an {@link Intent} by calling {@link Intent#setData(Uri) setData()} and then + * {@link Intent#setFlags(int) setFlags()}; in both cases, the applicable flags are + * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and + * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}. A FileProvider can only return a + * content {@link Uri} for file paths defined in their <paths> + * meta-data element. See the Class Overview for more information. + * + * @param context A {@link Context} for the current component. + * @param authority The authority of a {@link FileProvider} defined in a + * {@code <provider>} element in your app's manifest. + * @param file A {@link File} pointing to the filename for which you want a + * content {@link Uri}. + * @return A content URI for the file. + * @throws IllegalArgumentException When the given {@link File} is outside + * the paths supported by the provider. + */ + public static Uri getUriForFile(Context context, String authority, File file) { + final PathStrategy strategy = getPathStrategy(context, authority); + return strategy.getUriForFile(file); + } + + /** + * Use a content URI returned by + * {@link #getUriForFile(Context, String, File) getUriForFile()} to get information about a file + * managed by the FileProvider. + * FileProvider reports the column names defined in {@link OpenableColumns}: + *
    + *
  • {@link OpenableColumns#DISPLAY_NAME}
  • + *
  • {@link OpenableColumns#SIZE}
  • + *
+ * For more information, see + * {@link ContentProvider#query(Uri, String[], String, String[], String) + * ContentProvider.query()}. + * + * @param uri A content URI returned by {@link #getUriForFile}. + * @param projection The list of columns to put into the {@link Cursor}. If null all columns are + * included. + * @param selection Selection criteria to apply. If null then all data that matches the content + * URI is returned. + * @param selectionArgs An array of {@link String}, containing arguments to bind to + * the selection parameter. The query method scans selection from left to + * right and iterates through selectionArgs, replacing the current "?" character in + * selection with the value at the current position in selectionArgs. The + * values are bound to selection as {@link String} values. + * @param sortOrder A {@link String} containing the column name(s) on which to sort + * the resulting {@link Cursor}. + * @return A {@link Cursor} containing the results of the query. + * + */ + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + // ContentProvider has already checked granted permissions + final File file = mStrategy.getFileForUri(uri); + + if (projection == null) { + projection = COLUMNS; + } + + String[] cols = new String[projection.length]; + Object[] values = new Object[projection.length]; + int i = 0; + for (String col : projection) { + if (OpenableColumns.DISPLAY_NAME.equals(col)) { + cols[i] = OpenableColumns.DISPLAY_NAME; + values[i++] = file.getName(); + } else if (OpenableColumns.SIZE.equals(col)) { + cols[i] = OpenableColumns.SIZE; + values[i++] = file.length(); + } + } + + cols = copyOf(cols, i); + values = copyOf(values, i); + + final MatrixCursor cursor = new MatrixCursor(cols, 1); + cursor.addRow(values); + return cursor; + } + + /** + * Returns the MIME type of a content URI returned by + * {@link #getUriForFile(Context, String, File) getUriForFile()}. + * + * @param uri A content URI returned by + * {@link #getUriForFile(Context, String, File) getUriForFile()}. + * @return If the associated file has an extension, the MIME type associated with that + * extension; otherwise application/octet-stream. + */ + @Override + public String getType(Uri uri) { + // ContentProvider has already checked granted permissions + final File file = mStrategy.getFileForUri(uri); + + final int lastDot = file.getName().lastIndexOf('.'); + if (lastDot >= 0) { + final String extension = file.getName().substring(lastDot + 1); + final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + if (mime != null) { + return mime; + } + } + + return "application/octet-stream"; + } + + /** + * By default, this method throws an {@link UnsupportedOperationException}. You must + * subclass FileProvider if you want to provide different functionality. + */ + @Override + public Uri insert(Uri uri, ContentValues values) { + throw new UnsupportedOperationException("No external inserts"); + } + + /** + * By default, this method throws an {@link UnsupportedOperationException}. You must + * subclass FileProvider if you want to provide different functionality. + */ + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + throw new UnsupportedOperationException("No external updates"); + } + + /** + * Deletes the file associated with the specified content URI, as + * returned by {@link #getUriForFile(Context, String, File) getUriForFile()}. Notice that this + * method does not throw an {@link IOException}; you must check its return value. + * + * @param uri A content URI for a file, as returned by + * {@link #getUriForFile(Context, String, File) getUriForFile()}. + * @param selection Ignored. Set to {@code null}. + * @param selectionArgs Ignored. Set to {@code null}. + * @return 1 if the delete succeeds; otherwise, 0. + */ + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + // ContentProvider has already checked granted permissions + final File file = mStrategy.getFileForUri(uri); + return file.delete() ? 1 : 0; + } + + /** + * By default, FileProvider automatically returns the + * {@link ParcelFileDescriptor} for a file associated with a content:// + * {@link Uri}. To get the {@link ParcelFileDescriptor}, call + * {@link android.content.ContentResolver#openFileDescriptor(Uri, String) + * ContentResolver.openFileDescriptor}. + * + * To override this method, you must provide your own subclass of FileProvider. + * + * @param uri A content URI associated with a file, as returned by + * {@link #getUriForFile(Context, String, File) getUriForFile()}. + * @param mode Access mode for the file. May be "r" for read-only access, "rw" for read and + * write access, or "rwt" for read and write access that truncates any existing file. + * @return A new {@link ParcelFileDescriptor} with which you can access the file. + */ + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { + // ContentProvider has already checked granted permissions + final File file = mStrategy.getFileForUri(uri); + final int fileMode = modeToMode(mode); + return ParcelFileDescriptor.open(file, fileMode); + } + + /** + * Return {@link PathStrategy} for given authority, either by parsing or + * returning from cache. + */ + private static PathStrategy getPathStrategy(Context context, String authority) { + PathStrategy strat; + synchronized (sCache) { + strat = sCache.get(authority); + if (strat == null) { + try { + strat = parsePathStrategy(context, authority); + } catch (IOException e) { + throw new IllegalArgumentException( + "Failed to parse " + META_DATA_FILE_PROVIDER_PATHS + " meta-data", e); + } catch (XmlPullParserException e) { + throw new IllegalArgumentException( + "Failed to parse " + META_DATA_FILE_PROVIDER_PATHS + " meta-data", e); + } + sCache.put(authority, strat); + } + } + return strat; + } + + /** + * Parse and return {@link PathStrategy} for given authority as defined in + * {@link #META_DATA_FILE_PROVIDER_PATHS} {@code <meta-data>}. + * + * @see #getPathStrategy(Context, String) + */ + private static PathStrategy parsePathStrategy(Context context, String authority) + throws IOException, XmlPullParserException { + final SimplePathStrategy strat = new SimplePathStrategy(authority); + + final ProviderInfo info = context.getPackageManager() + .resolveContentProvider(authority, PackageManager.GET_META_DATA); + final XmlResourceParser in = info.loadXmlMetaData( + context.getPackageManager(), META_DATA_FILE_PROVIDER_PATHS); + if (in == null) { + throw new IllegalArgumentException( + "Missing " + META_DATA_FILE_PROVIDER_PATHS + " meta-data"); + } + + int type; + while ((type = in.next()) != END_DOCUMENT) { + if (type == START_TAG) { + final String tag = in.getName(); + + final String name = in.getAttributeValue(null, ATTR_NAME); + String path = in.getAttributeValue(null, ATTR_PATH); + + File target = null; + if (TAG_ROOT_PATH.equals(tag)) { + target = buildPath(DEVICE_ROOT, path); + } else if (TAG_FILES_PATH.equals(tag)) { + target = buildPath(context.getFilesDir(), path); + } else if (TAG_CACHE_PATH.equals(tag)) { + target = buildPath(context.getCacheDir(), path); + } else if (TAG_EXTERNAL.equals(tag)) { + target = buildPath(context.getExternalFilesDir(null), path); + } + + if (target != null) { + strat.addRoot(name, target); + } + } + } + + return strat; + } + + /** + * Strategy for mapping between {@link File} and {@link Uri}. + *

+ * Strategies must be symmetric so that mapping a {@link File} to a + * {@link Uri} and then back to a {@link File} points at the original + * target. + *

+ * Strategies must remain consistent across app launches, and not rely on + * dynamic state. This ensures that any generated {@link Uri} can still be + * resolved if your process is killed and later restarted. + * + * @see SimplePathStrategy + */ + interface PathStrategy { + /** + * Return a {@link Uri} that represents the given {@link File}. + */ + public Uri getUriForFile(File file); + + /** + * Return a {@link File} that represents the given {@link Uri}. + */ + public File getFileForUri(Uri uri); + } + + /** + * Strategy that provides access to files living under a narrow whitelist of + * filesystem roots. It will throw {@link SecurityException} if callers try + * accessing files outside the configured roots. + *

+ * For example, if configured with + * {@code addRoot("myfiles", context.getFilesDir())}, then + * {@code context.getFileStreamPath("foo.txt")} would map to + * {@code content://myauthority/myfiles/foo.txt}. + */ + static class SimplePathStrategy implements PathStrategy { + private final String mAuthority; + private final HashMap mRoots = new HashMap(); + + public SimplePathStrategy(String authority) { + mAuthority = authority; + } + + /** + * Add a mapping from a name to a filesystem root. The provider only offers + * access to files that live under configured roots. + */ + public void addRoot(String name, File root) { + if (TextUtils.isEmpty(name)) { + throw new IllegalArgumentException("Name must not be empty"); + } + + try { + // Resolve to canonical path to keep path checking fast + root = root.getCanonicalFile(); + } catch (IOException e) { + throw new IllegalArgumentException( + "Failed to resolve canonical path for " + root, e); + } + + mRoots.put(name, root); + } + + @Override + public Uri getUriForFile(File file) { + String path; + try { + path = file.getCanonicalPath(); + } catch (IOException e) { + throw new IllegalArgumentException("Failed to resolve canonical path for " + file); + } + + // Find the most-specific root path + Map.Entry mostSpecific = null; + for (Map.Entry root : mRoots.entrySet()) { + final String rootPath = root.getValue().getPath(); + if (path.startsWith(rootPath) && (mostSpecific == null + || rootPath.length() > mostSpecific.getValue().getPath().length())) { + mostSpecific = root; + } + } + + if (mostSpecific == null) { + throw new IllegalArgumentException( + "Failed to find configured root that contains " + path); + } + + // Start at first char of path under root + final String rootPath = mostSpecific.getValue().getPath(); + if (rootPath.endsWith("/")) { + path = path.substring(rootPath.length()); + } else { + path = path.substring(rootPath.length() + 1); + } + + // Encode the tag and path separately + path = Uri.encode(mostSpecific.getKey()) + '/' + Uri.encode(path, "/"); + return new Uri.Builder().scheme("content") + .authority(mAuthority).encodedPath(path).build(); + } + + @Override + public File getFileForUri(Uri uri) { + String path = uri.getEncodedPath(); + + final int splitIndex = path.indexOf('/', 1); + final String tag = Uri.decode(path.substring(1, splitIndex)); + path = Uri.decode(path.substring(splitIndex + 1)); + + final File root = mRoots.get(tag); + if (root == null) { + throw new IllegalArgumentException("Unable to find configured root for " + uri); + } + + File file = new File(root, path); + try { + file = file.getCanonicalFile(); + } catch (IOException e) { + throw new IllegalArgumentException("Failed to resolve canonical path for " + file); + } + + if (!file.getPath().startsWith(root.getPath())) { + throw new SecurityException("Resolved path jumped beyond configured root"); + } + + return file; + } + } + + /** + * Copied from ContentResolver.java + */ + private static int modeToMode(String mode) { + int modeBits; + if ("r".equals(mode)) { + modeBits = ParcelFileDescriptor.MODE_READ_ONLY; + } else if ("w".equals(mode) || "wt".equals(mode)) { + modeBits = ParcelFileDescriptor.MODE_WRITE_ONLY + | ParcelFileDescriptor.MODE_CREATE + | ParcelFileDescriptor.MODE_TRUNCATE; + } else if ("wa".equals(mode)) { + modeBits = ParcelFileDescriptor.MODE_WRITE_ONLY + | ParcelFileDescriptor.MODE_CREATE + | ParcelFileDescriptor.MODE_APPEND; + } else if ("rw".equals(mode)) { + modeBits = ParcelFileDescriptor.MODE_READ_WRITE + | ParcelFileDescriptor.MODE_CREATE; + } else if ("rwt".equals(mode)) { + modeBits = ParcelFileDescriptor.MODE_READ_WRITE + | ParcelFileDescriptor.MODE_CREATE + | ParcelFileDescriptor.MODE_TRUNCATE; + } else { + throw new IllegalArgumentException("Invalid mode: " + mode); + } + return modeBits; + } + + private static File buildPath(File base, String... segments) { + File cur = base; + for (String segment : segments) { + if (segment != null) { + cur = new File(cur, segment); + } + } + return cur; + } + + private static String[] copyOf(String[] original, int newLength) { + final String[] result = new String[newLength]; + System.arraycopy(original, 0, result, 0, newLength); + return result; + } + + private static Object[] copyOf(Object[] original, int newLength) { + final Object[] result = new Object[newLength]; + System.arraycopy(original, 0, result, 0, newLength); + return result; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/ServiceDataProvider.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/ServiceDataProvider.java new file mode 100644 index 0000000000..7bc24d428b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/provider/ServiceDataProvider.java @@ -0,0 +1,47 @@ +package org.droidplanner.services.android.impl.data.provider; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +/** + * Created by fhuya on 12/31/14. + */ +public class ServiceDataProvider extends ContentProvider { + + @Override + public boolean onCreate() { + return false; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + return null; + } + + @Override + public String getType(Uri uri) { + return null; + } + + @Override + public String[] getStreamTypes(Uri uri, String mimeTypeFilter){ + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/exception/ConnectionException.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/exception/ConnectionException.java new file mode 100644 index 0000000000..7da22d062d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/exception/ConnectionException.java @@ -0,0 +1,10 @@ +package org.droidplanner.services.android.impl.exception; + +/** + * Created by fhuya on 11/2/14. + */ +public class ConnectionException extends Exception { + public ConnectionException(String s) { + super(s); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java new file mode 100644 index 0000000000..8d916c7fe9 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java @@ -0,0 +1,120 @@ +package org.droidplanner.services.android.impl.ui.activity; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import org.droidplanner.services.android.R; +import org.droidplanner.services.android.lib.data.ServiceDataContract; +import org.droidplanner.services.android.utils.file.FileUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * TLog file selector activity. + */ +public class TLogFileSelector extends ActionBarActivity { + + private static final String TAG = TLogFileSelector.class.getSimpleName(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tlog_file_selector); + + final Context context = getApplicationContext(); + + final Intent pickerIntent = getIntent(); + final String appId = pickerIntent.getStringExtra(ServiceDataContract.EXTRA_REQUEST_TLOG_APP_ID); + + //Set up an intent to send back to apps that request a file. + final Intent resultIntent = new Intent(ServiceDataContract.ACTION_RETURN_TLOG); + + //Set the activity's result to null to begin with + setResult(Activity.RESULT_CANCELED, null); + + final File[] tlogFiles = FileUtils.getTLogFileList(context, appId); + final TreeMap sortedFiles = new TreeMap<>(); + for(File file : tlogFiles){ + sortedFiles.put(file.getName(), file); + } + + final ArrayList sortedList = new ArrayList<>(sortedFiles.size()); + for(Map.Entry entry : sortedFiles.entrySet()){ + sortedList.add(entry.getValue()); + } + + final FileAdapter filesAdapter = new FileAdapter(context, sortedList); + + final ListView tlogListView = (ListView) findViewById(R.id.tlog_files_list); + tlogListView.setAdapter(filesAdapter); + tlogListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + //Get a file for the selected file name. + File requestFile = tlogFiles[position]; + resultIntent.putExtra(ServiceDataContract.EXTRA_TLOG_ABSOLUTE_PATH, requestFile.getAbsolutePath()); + //Set the result + setResult(Activity.RESULT_OK, resultIntent); + +// //Use the FileProvider to get a content URI +// try{ +// Uri fileUri = FileProvider.getUriForFile(context, ServiceDataContract.FILE_PROVIDER_AUTHORITY, +// requestFile); +// +// //Grant temporary read permission to the content URI +// resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); +// +// //Put the uri and mime type in the result intent +// final String mimeType = getContentResolver().getType(fileUri); +// resultIntent.setDataAndType(fileUri, mimeType); +// +// //Set the result +// setResult(Activity.RESULT_OK, resultIntent); +// } +// catch(IllegalArgumentException e){ +// Log.e(TAG, "The selected file can't be shared: " + requestFile.getName()); +// +// resultIntent.setDataAndType(null, ""); +// setResult(Activity.RESULT_CANCELED, resultIntent); +// } + + finish(); + } + }); + } + + private static class FileAdapter extends ArrayAdapter { + + public FileAdapter(Context context, List objects) { + super(context, 0, objects); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + TextView view; + File file = getItem(position); + if (convertView != null) { + view = (TextView) convertView; + } else { + view = (TextView) LayoutInflater.from(getContext()).inflate(R.layout.list_item_tlog_info, parent, false); + } + + view.setText(file.getName()); + return view; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java new file mode 100644 index 0000000000..be6b9e6a21 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java @@ -0,0 +1,30 @@ +package org.droidplanner.services.android.impl.ui.activity; + +import android.content.Intent; +import android.os.Bundle; + +import org.droidplanner.android.client.R; + + +/** + * Created by fhuya on 11/12/14. + */ +public class UsbIntentReceiver extends AppCompatActivity { + + @Override + public void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_usb_intent_receiver); + handleIntent(getIntent()); + } + + @Override + public void onNewIntent(Intent intent){ + super.onNewIntent(intent); + handleIntent(intent); + } + + private void handleIntent(Intent intent) { + finish(); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java new file mode 100644 index 0000000000..6ac07c1435 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java @@ -0,0 +1,209 @@ +package org.droidplanner.services.android.impl.utils; + +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.lib.drone.attribute.error.ErrorType; + +import java.util.Locale; + +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ALTITUDE_DISPARITY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_COMPASS_CALIBRATION_RUNNING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_GYRO_CALIBRATION_FAILED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_LEANING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_MODE_NOT_ARMABLE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_ROTOR_NOT_SPINNING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_SAFETY_SWITCH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_BELOW_FAILSAFE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_TOO_HIGH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.AUTO_TUNE_FAILED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.CRASH_DISARMING; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.EKF_VARIANCE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.LOW_BATTERY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_DATAFLASH_INSERTED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_ERROR; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PARACHUTE_TOO_LOW; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACRO_BAL_ROLL_PITCH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_BAROMETER_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_ANGLE_MAX; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_BOARD_VOLTAGE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FENCE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_MAGNETIC_FIELD; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_CALIBRATED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_EKF_HOME_VARIANCE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GPS_GLITCH; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GYROS_NOT_HEALTHY; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_HIGH_GPS_HDOP; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_ACCELEROMETERS; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_COMPASSES; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_GYROS; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INS_NOT_CALIBRATED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_NEED_GPS_LOCK; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_RC_NOT_CALIBRATED; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.RC_FAILSAFE; +import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.WAITING_FOR_NAVIGATION_ALIGNMENT; + +/** + * Autopilot error parser. + * Created by fhuya on 12/16/14. + */ +public class AndroidApWarningParser implements AutopilotWarningParser { + + @Override + public String getDefaultWarning() { + return NO_ERROR.name(); + } + + /** + * Maps the ArduPilot warnings set to the 3DR Services warnings set. + * + * @param warning warning originating from the ArduPilot autopilot + * @return equivalent 3DR Services warning type + */ + @Override + public String parseWarning(MavLinkDrone drone, String warning) { + if (android.text.TextUtils.isEmpty(warning)) + return null; + + ErrorType errorType = getErrorType(warning); + if(errorType == null) + return null; + + return errorType.name(); + } + + private ErrorType getErrorType(String warning){ + switch (warning.toLowerCase(Locale.US)) { + case "arm: thr below fs": + case "arm: throttle below failsafe": + return ARM_THROTTLE_BELOW_FAILSAFE; + + case "arm: gyro calibration failed": + return ARM_GYRO_CALIBRATION_FAILED; + + case "arm: mode not armable": + return ARM_MODE_NOT_ARMABLE; + + case "arm: rotor not spinning": + return ARM_ROTOR_NOT_SPINNING; + + case "arm: altitude disparity": + case "prearm: altitude disparity": + return ALTITUDE_DISPARITY; + + case "arm: leaning": + return ARM_LEANING; + + case "arm: throttle too high": + return ARM_THROTTLE_TOO_HIGH; + + case "arm: safety switch": + return ARM_SAFETY_SWITCH; + + case "arm: compass calibration running": + return ARM_COMPASS_CALIBRATION_RUNNING; + + + case "prearm: rc not calibrated": + return PRE_ARM_RC_NOT_CALIBRATED; + + case "prearm: barometer not healthy": + return PRE_ARM_BAROMETER_NOT_HEALTHY; + + case "prearm: compass not healthy": + return PRE_ARM_COMPASS_NOT_HEALTHY; + + case "prearm: compass not calibrated": + return PRE_ARM_COMPASS_NOT_CALIBRATED; + + case "prearm: compass offsets too high": + return PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; + + case "prearm: check mag field": + return PRE_ARM_CHECK_MAGNETIC_FIELD; + + case "prearm: inconsistent compasses": + return PRE_ARM_INCONSISTENT_COMPASSES; + + case "prearm: check fence": + return PRE_ARM_CHECK_FENCE; + + case "prearm: ins not calibrated": + return PRE_ARM_INS_NOT_CALIBRATED; + + case "prearm: accelerometers not healthy": + return PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; + + case "prearm: inconsistent accelerometers": + return PRE_ARM_INCONSISTENT_ACCELEROMETERS; + + case "prearm: gyros not healthy": + return PRE_ARM_GYROS_NOT_HEALTHY; + + case "prearm: inconsistent gyros": + return PRE_ARM_INCONSISTENT_GYROS; + + case "prearm: check board voltage": + return PRE_ARM_CHECK_BOARD_VOLTAGE; + + case "prearm: duplicate aux switch options": + return PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; + + case "prearm: check fs_thr_value": + return PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; + + case "prearm: check angle_max": + return PRE_ARM_CHECK_ANGLE_MAX; + + case "prearm: acro_bal_roll/pitch": + return PRE_ARM_ACRO_BAL_ROLL_PITCH; + + case "prearm: need 3d fix": + return PRE_ARM_NEED_GPS_LOCK; + + case "prearm: ekf-home variance": + return PRE_ARM_EKF_HOME_VARIANCE; + + case "prearm: high gps hdop": + return PRE_ARM_HIGH_GPS_HDOP; + + case "prearm: gps glitch": + case "prearm: bad velocity": + return PRE_ARM_GPS_GLITCH; + + case "prearm: waiting for navigation alignment": + case "arm: waiting for navigation alignment": + return WAITING_FOR_NAVIGATION_ALIGNMENT; + + + case "no dataflash inserted": + return NO_DATAFLASH_INSERTED; + + case "low battery!": + return LOW_BATTERY; + + case "autotune: failed": + return AUTO_TUNE_FAILED; + + case "crash: disarming": + return CRASH_DISARMING; + + case "parachute: too low": + return PARACHUTE_TOO_LOW; + + case "ekf variance": + return EKF_VARIANCE; + + case "rc failsafe": + return RC_FAILSAFE; + + + default: + return null; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java new file mode 100644 index 0000000000..e61513123b --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java @@ -0,0 +1,84 @@ +package org.droidplanner.services.android.impl.utils; + +import android.util.Log; + +import org.droidplanner.services.android.core.model.Logger; + +/** + * Android specific implementation for the {org.droidplanner.services.android.core.model.Logger} + * interface. + */ +public class AndroidLogger implements Logger { + private static Logger sLogger = new AndroidLogger(); + + public static Logger getLogger() { + return sLogger; + } + + // Only one instance is allowed. + private AndroidLogger() { + } + + @Override + public void logVerbose(String logTag, String verbose) { + if (verbose != null) { + Log.v(logTag, verbose); + } + } + + @Override + public void logDebug(String logTag, String debug) { + if (debug != null) { + Log.d(logTag, debug); + } + } + + @Override + public void logInfo(String logTag, String info) { + if (info != null) { + Log.i(logTag, info); + } + } + + @Override + public void logWarning(String logTag, String warning) { + if (warning != null) { + Log.w(logTag, warning); + } + } + + @Override + public void logWarning(String logTag, Exception exception) { + if (exception != null) { + Log.w(logTag, exception); + } + } + + @Override + public void logWarning(String logTag, String warning, Exception exception) { + if (warning != null && exception != null) { + Log.w(logTag, warning, exception); + } + } + + @Override + public void logErr(String logTag, String err) { + if (err != null) { + Log.e(logTag, err); + } + } + + @Override + public void logErr(String logTag, Exception exception) { + if (exception != null) { + Log.e(logTag, exception.getMessage(), exception); + } + } + + @Override + public void logErr(String logTag, String err, Exception exception) { + if (err != null && exception != null) { + Log.e(logTag, err, exception); + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java new file mode 100644 index 0000000000..04a73420ef --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java @@ -0,0 +1,1011 @@ +package org.droidplanner.services.android.impl.utils; + +import android.os.Bundle; +import android.os.RemoteException; +import android.text.TextUtils; +import android.view.Surface; + +import com.MAVLink.Messages.MAVLinkMessage; +import com.MAVLink.ardupilotmega.msg_ekf_status_report; +import com.MAVLink.ardupilotmega.msg_mag_cal_progress; +import com.MAVLink.ardupilotmega.msg_mag_cal_report; +import com.MAVLink.enums.MAG_CAL_STATUS; +import com.MAVLink.enums.MAV_TYPE; + +import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.core.drone.autopilot.Drone; +import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.core.drone.autopilot.apm.ArduPilot; +import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.core.drone.variables.ApmModes; +import org.droidplanner.services.android.core.drone.variables.Camera; +import org.droidplanner.services.android.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.core.gcs.follow.Follow; +import org.droidplanner.services.android.core.gcs.follow.FollowAlgorithm; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.survey.SplineSurveyImpl; +import org.droidplanner.services.android.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.core.mission.waypoints.StructureScannerImpl; +import org.droidplanner.services.android.core.survey.Footprint; +import org.droidplanner.services.android.lib.coordinate.LatLong; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.attribute.AttributeType; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress; +import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult; +import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; +import org.droidplanner.services.android.lib.drone.mission.Mission; +import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; +import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; +import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; +import org.droidplanner.services.android.lib.drone.property.CameraProxy; +import org.droidplanner.services.android.lib.drone.property.EkfStatus; +import org.droidplanner.services.android.lib.drone.property.FootPrint; +import org.droidplanner.services.android.lib.drone.property.Gps; +import org.droidplanner.services.android.lib.drone.property.GuidedState; +import org.droidplanner.services.android.lib.drone.property.Parameter; +import org.droidplanner.services.android.lib.drone.property.Parameters; +import org.droidplanner.services.android.lib.drone.property.State; +import org.droidplanner.services.android.lib.drone.property.Type; +import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import org.droidplanner.services.android.lib.drone.property.Vibration; +import org.droidplanner.services.android.lib.gcs.follow.FollowState; +import org.droidplanner.services.android.lib.gcs.follow.FollowType; +import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; +import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import org.droidplanner.services.android.lib.model.ICommandListener; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import timber.log.Timber; + +/** + * Created by Fredia Huya-Kouadio on 3/23/15. + */ +public class CommonApiUtils { + + //Private to prevent instantiation + private CommonApiUtils() { + } + + public static void postSuccessEvent(ICommandListener listener) { + if (listener != null) { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + + public static void postErrorEvent(int errorCode, ICommandListener listener) { + if (listener != null) { + try { + listener.onError(errorCode); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + + public static void postTimeoutEvent(ICommandListener listener) { + if (listener != null) { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + + public static VehicleMode getVehicleMode(ApmModes mode) { + switch (mode) { + case FIXED_WING_MANUAL: + return VehicleMode.PLANE_MANUAL; + case FIXED_WING_CIRCLE: + return VehicleMode.PLANE_CIRCLE; + + case FIXED_WING_STABILIZE: + return VehicleMode.PLANE_STABILIZE; + + case FIXED_WING_TRAINING: + return VehicleMode.PLANE_TRAINING; + + case FIXED_WING_ACRO: + return VehicleMode.PLANE_ACRO; + + case FIXED_WING_FLY_BY_WIRE_A: + return VehicleMode.PLANE_FLY_BY_WIRE_A; + + case FIXED_WING_FLY_BY_WIRE_B: + return VehicleMode.PLANE_FLY_BY_WIRE_B; + + case FIXED_WING_CRUISE: + return VehicleMode.PLANE_CRUISE; + + case FIXED_WING_AUTOTUNE: + return VehicleMode.PLANE_AUTOTUNE; + + case FIXED_WING_AUTO: + return VehicleMode.PLANE_AUTO; + + case FIXED_WING_RTL: + return VehicleMode.PLANE_RTL; + + case FIXED_WING_LOITER: + return VehicleMode.PLANE_LOITER; + + case FIXED_WING_GUIDED: + return VehicleMode.PLANE_GUIDED; + + + case ROTOR_STABILIZE: + return VehicleMode.COPTER_STABILIZE; + + case ROTOR_ACRO: + return VehicleMode.COPTER_ACRO; + + case ROTOR_ALT_HOLD: + return VehicleMode.COPTER_ALT_HOLD; + + case ROTOR_AUTO: + return VehicleMode.COPTER_AUTO; + + case ROTOR_GUIDED: + return VehicleMode.COPTER_GUIDED; + + case ROTOR_LOITER: + return VehicleMode.COPTER_LOITER; + + case ROTOR_RTL: + return VehicleMode.COPTER_RTL; + + case ROTOR_CIRCLE: + return VehicleMode.COPTER_CIRCLE; + + case ROTOR_LAND: + return VehicleMode.COPTER_LAND; + + case ROTOR_TOY: + return VehicleMode.COPTER_DRIFT; + + case ROTOR_SPORT: + return VehicleMode.COPTER_SPORT; + + case ROTOR_AUTOTUNE: + return VehicleMode.COPTER_AUTOTUNE; + + case ROTOR_POSHOLD: + return VehicleMode.COPTER_POSHOLD; + + case ROTOR_BRAKE: + return VehicleMode.COPTER_BRAKE; + + + case ROVER_MANUAL: + return VehicleMode.ROVER_MANUAL; + + case ROVER_LEARNING: + return VehicleMode.ROVER_LEARNING; + + case ROVER_STEERING: + return VehicleMode.ROVER_STEERING; + + case ROVER_HOLD: + return VehicleMode.ROVER_HOLD; + + case ROVER_AUTO: + return VehicleMode.ROVER_AUTO; + + case ROVER_RTL: + return VehicleMode.ROVER_RTL; + + case ROVER_GUIDED: + return VehicleMode.ROVER_GUIDED; + + case ROVER_INITIALIZING: + return VehicleMode.ROVER_INITIALIZING; + + default: + case UNKNOWN: + return null; + + } + } + + public static int getDroneProxyType(int originalType) { + switch (originalType) { + case MAV_TYPE.MAV_TYPE_TRICOPTER: + case MAV_TYPE.MAV_TYPE_QUADROTOR: + case MAV_TYPE.MAV_TYPE_HEXAROTOR: + case MAV_TYPE.MAV_TYPE_OCTOROTOR: + case MAV_TYPE.MAV_TYPE_HELICOPTER: + return Type.TYPE_COPTER; + + case MAV_TYPE.MAV_TYPE_FIXED_WING: + return Type.TYPE_PLANE; + + case MAV_TYPE.MAV_TYPE_GROUND_ROVER: + case MAV_TYPE.MAV_TYPE_SURFACE_BOAT: + return Type.TYPE_ROVER; + + default: + return -1; + } + } + + public static FootPrint getProxyCameraFootPrint(Footprint footprint) { + if (footprint == null) return null; + + return new FootPrint(footprint.getGSD(), footprint.getVertexInGlobalFrame()); + } + + public static FollowAlgorithm.FollowModes followTypeToMode(MavLinkDrone drone, FollowType followType) { + FollowAlgorithm.FollowModes followMode; + + switch (followType) { + case ABOVE: + followMode = (drone.getFirmwareType() == FirmwareType.ARDU_SOLO) + ? FollowAlgorithm.FollowModes.SPLINE_ABOVE + : FollowAlgorithm.FollowModes.ABOVE; + break; + + case LEAD: + followMode = FollowAlgorithm.FollowModes.LEAD; + break; + + default: + case LEASH: + followMode = (drone.getFirmwareType() == FirmwareType.ARDU_SOLO) + ? FollowAlgorithm.FollowModes.SPLINE_LEASH + : FollowAlgorithm.FollowModes.LEASH; + break; + + case CIRCLE: + followMode = FollowAlgorithm.FollowModes.CIRCLE; + break; + + case LEFT: + followMode = FollowAlgorithm.FollowModes.LEFT; + break; + + case RIGHT: + followMode = FollowAlgorithm.FollowModes.RIGHT; + break; + + case GUIDED_SCAN: + followMode = FollowAlgorithm.FollowModes.GUIDED_SCAN; + break; + + case LOOK_AT_ME: + followMode = FollowAlgorithm.FollowModes.LOOK_AT_ME; + break; + + case SOLO_SHOT: + followMode = FollowAlgorithm.FollowModes.SOLO_SHOT; + break; + } + return followMode; + } + + public static FollowType followModeToType(FollowAlgorithm.FollowModes followMode) { + FollowType followType; + + switch (followMode) { + default: + case LEASH: + case SPLINE_LEASH: + followType = FollowType.LEASH; + break; + + case LEAD: + followType = FollowType.LEAD; + break; + + case RIGHT: + followType = FollowType.RIGHT; + break; + + case LEFT: + followType = FollowType.LEFT; + break; + + case CIRCLE: + followType = FollowType.CIRCLE; + break; + + case ABOVE: + case SPLINE_ABOVE: + followType = FollowType.ABOVE; + break; + + case GUIDED_SCAN: + followType = FollowType.GUIDED_SCAN; + break; + + case LOOK_AT_ME: + followType = FollowType.LOOK_AT_ME; + break; + + case SOLO_SHOT: + followType = FollowType.SOLO_SHOT; + break; + } + + return followType; + } + + public static CameraProxy getCameraProxy(Drone drone, List cameraDetails) { + CameraDetail camDetail; + FootPrint currentFieldOfView; + List proxyPrints = new ArrayList<>(); + + if (!(drone instanceof MavLinkDrone)) { + camDetail = new CameraDetail(); + currentFieldOfView = new FootPrint(); + } else { + Camera droneCamera = ((MavLinkDrone) drone).getCamera(); + + camDetail = ProxyUtils.getCameraDetail(droneCamera.getCamera()); + + List footprints = droneCamera.getFootprints(); + for (Footprint footprint : footprints) { + proxyPrints.add(CommonApiUtils.getProxyCameraFootPrint(footprint)); + } + + Gps droneGps = (Gps) drone.getAttribute(AttributeType.GPS); + currentFieldOfView = droneGps != null && droneGps.isValid() + ? CommonApiUtils.getProxyCameraFootPrint(droneCamera.getCurrentFieldOfView()) + : new FootPrint(); + } + + return new CameraProxy(camDetail, currentFieldOfView, proxyPrints, cameraDetails); + } + + public static State getState(MavLinkDrone drone, boolean isConnected, Vibration vibration) { + if (drone == null) + return new State(); + + org.droidplanner.services.android.core.drone.variables.State droneState = drone.getState(); + ApmModes droneMode = droneState.getMode(); + AccelCalibration accelCalibration = drone.getCalibrationSetup(); + String calibrationMessage = accelCalibration != null && accelCalibration.isCalibrating() + ? accelCalibration.getMessage() + : null; + + return new State(isConnected, CommonApiUtils.getVehicleMode(droneMode), droneState.isArmed(), + droneState.isFlying(), droneState.getErrorId(), drone.getMavlinkVersion(), calibrationMessage, + droneState.getFlightStartTime(), generateEkfStatus(droneState.getEkfStatus()), + isConnected && drone.isConnectionAlive(), vibration); + } + + public static EkfStatus generateEkfStatus(msg_ekf_status_report ekfStatus) { + if (ekfStatus == null) { + return null; + } + + EkfStatus proxyEkfStatus = new EkfStatus(ekfStatus.flags, ekfStatus.compass_variance, + ekfStatus.pos_horiz_variance, ekfStatus.terrain_alt_variance, ekfStatus.velocity_variance, + ekfStatus.pos_vert_variance); + + return proxyEkfStatus; + } + + public static Mission getMission(MavLinkDrone drone) { + Mission proxyMission = new Mission(); + if (drone == null) + return proxyMission; + + org.droidplanner.services.android.core.mission.Mission droneMission = drone.getMission(); + List droneMissionItemImpls = droneMission.getComponentItems(); + + + proxyMission.setCurrentMissionItem((short) drone.getMissionStats().getCurrentWP()); + if (!droneMissionItemImpls.isEmpty()) { + for (MissionItemImpl item : droneMissionItemImpls) { + proxyMission.addMissionItem(ProxyUtils.getProxyMissionItem(item)); + } + } + + return proxyMission; + } + + public static Type getType(MavLinkDrone drone) { + if (drone == null) + return new Type(); + + return new Type(CommonApiUtils.getDroneProxyType(drone.getType()), drone.getFirmwareVersion()); + } + + public static GuidedState getGuidedState(MavLinkDrone drone) { + if (drone == null) + return new GuidedState(); + + GuidedPoint guidedPoint = drone.getGuidedPoint(); + int guidedState; + switch (guidedPoint.getState()) { + default: + case UNINITIALIZED: + guidedState = GuidedState.STATE_UNINITIALIZED; + break; + + case ACTIVE: + guidedState = GuidedState.STATE_ACTIVE; + break; + + case IDLE: + guidedState = GuidedState.STATE_IDLE; + break; + } + + LatLong guidedCoord = guidedPoint.getCoord(); + if (guidedCoord == null) { + guidedCoord = new LatLong(0, 0); + } + + double guidedAlt = guidedPoint.getAltitude(); + return new GuidedState(guidedState, new LatLongAlt(guidedCoord, guidedAlt)); + } + + public static void changeVehicleMode(MavLinkDrone drone, VehicleMode newMode, ICommandListener listener) { + if (drone == null) + return; + + int mavType; + switch (newMode.getDroneType()) { + default: + case Type.TYPE_COPTER: + mavType = MAV_TYPE.MAV_TYPE_QUADROTOR; + break; + + case Type.TYPE_PLANE: + mavType = MAV_TYPE.MAV_TYPE_FIXED_WING; + break; + + case Type.TYPE_ROVER: + mavType = MAV_TYPE.MAV_TYPE_GROUND_ROVER; + break; + } + + drone.getState().changeFlightMode(ApmModes.getMode(newMode.getMode(), mavType), listener); + } + + public static FollowState getFollowState(Follow followMe) { + if (followMe == null) + return new FollowState(); + + int state; + switch (followMe.getState()) { + + default: + case FOLLOW_INVALID_STATE: + state = FollowState.STATE_INVALID; + break; + + case FOLLOW_DRONE_NOT_ARMED: + state = FollowState.STATE_DRONE_NOT_ARMED; + break; + + case FOLLOW_DRONE_DISCONNECTED: + state = FollowState.STATE_DRONE_DISCONNECTED; + break; + + case FOLLOW_START: + state = FollowState.STATE_START; + break; + + case FOLLOW_RUNNING: + state = FollowState.STATE_RUNNING; + break; + + case FOLLOW_END: + state = FollowState.STATE_END; + break; + } + + FollowAlgorithm currentAlg = followMe.getFollowAlgorithm(); + Map modeParams = currentAlg.getParams(); + Bundle params = new Bundle(); + for (Map.Entry entry : modeParams.entrySet()) { + switch (entry.getKey()) { + case FollowType.EXTRA_FOLLOW_ROI_TARGET: + LatLongAlt target = (LatLongAlt) entry.getValue(); + if (target != null) { + params.putParcelable(entry.getKey(), target); + } + break; + + case FollowType.EXTRA_FOLLOW_RADIUS: + Double radius = (Double) entry.getValue(); + if (radius != null) + params.putDouble(entry.getKey(), radius); + break; + } + } + return new FollowState(state, CommonApiUtils.followModeToType(currentAlg.getType()), params); + } + + public static void disableFollowMe(Follow follow) { + if (follow == null) + return; + + if (follow.isEnabled()) + follow.toggleFollowMeState(); + } + + public static void triggerCamera(MavLinkDrone drone) { + if (drone == null) + return; + MavLinkDoCmds.triggerCamera(drone); + } + + public static void epmCommand(MavLinkDrone drone, boolean release, ICommandListener listener) { + if (drone == null) + return; + + MavLinkDoCmds.empCommand(drone, release, listener); + } + + public static void loadWaypoints(MavLinkDrone drone) { + if (drone == null) + return; + drone.getWaypointManager().getWaypoints(); + } + + public static void refreshParameters(MavLinkDrone drone) { + if (drone == null) + return; + drone.getParameterManager().refreshParameters(); + } + + public static void writeParameters(MavLinkDrone drone, Parameters parameters) { + if (drone == null || parameters == null) return; + + List parametersList = parameters.getParameters(); + if (parametersList.isEmpty()) + return; + + ParameterManager droneParams = drone.getParameterManager(); + for (Parameter proxyParam : parametersList) { + droneParams.sendParameter(proxyParam); + } + } + + public static void setMission(MavLinkDrone drone, Mission mission, boolean pushToDrone) { + if (drone == null) + return; + + org.droidplanner.services.android.core.mission.Mission droneMission = drone.getMission(); + droneMission.clearMissionItems(); + + List itemsList = mission.getMissionItems(); + for (MissionItem item : itemsList) { + droneMission.addMissionItem(ProxyUtils.getMissionItemImpl(droneMission, item)); + } + + if (pushToDrone) + droneMission.sendMissionToAPM(); + } + + public static void startMission(final ArduPilot drone, final boolean forceModeChange, boolean forceArm, final ICommandListener listener) { + if (drone == null) { + return; + } + + final Runnable sendCommandRunnable = new Runnable() { + @Override + public void run() { + MavLinkCommands.startMission(drone, listener); + } + }; + + final Runnable modeCheckRunnable = new Runnable() { + @Override + public void run() { + if (drone.getState().getMode() != ApmModes.ROTOR_AUTO) { + if (forceModeChange) { + changeVehicleMode(drone, VehicleMode.COPTER_AUTO, new AbstractCommandListener() { + @Override + public void onSuccess() { + sendCommandRunnable.run(); + } + + @Override + public void onError(int executionError) { + postErrorEvent(executionError, listener); + } + + @Override + public void onTimeout() { + postTimeoutEvent(listener); + } + }); + } else { + postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + return; + } else { + sendCommandRunnable.run(); + } + } + }; + + if (!drone.getState().isArmed()) { + if (forceArm) { + arm(drone, true, new AbstractCommandListener() { + @Override + public void onSuccess() { + modeCheckRunnable.run(); + } + + @Override + public void onError(int executionError) { + postErrorEvent(executionError, listener); + } + + @Override + public void onTimeout() { + postTimeoutEvent(listener); + } + }); + } else { + postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + } + return; + } + + modeCheckRunnable.run(); + } + + public static float generateDronie(MavLinkDrone drone) { + if (drone == null) + return -1; + + return (float) drone.getMission().makeAndUploadDronie(); + } + + public static void arm(ArduPilot drone, boolean arm, ICommandListener listener) { + arm(drone, arm, false, listener); + } + + public static void arm(final ArduPilot drone, final boolean arm, final boolean emergencyDisarm, final ICommandListener listener) { + if (drone == null) + return; + + if (!arm && emergencyDisarm) { + if (org.droidplanner.services.android.core.drone.variables.Type.isCopter(drone.getType()) && !isKillSwitchSupported(drone)) { + + changeVehicleMode(drone, VehicleMode.COPTER_STABILIZE, new AbstractCommandListener() { + @Override + public void onSuccess() { + MavLinkCommands.sendArmMessage(drone, arm, emergencyDisarm, listener); + } + + @Override + public void onError(int executionError) { + if (listener != null) { + try { + listener.onError(executionError); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + + @Override + public void onTimeout() { + if (listener != null) { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + } + }); + + return; + } + } + + MavLinkCommands.sendArmMessage(drone, arm, emergencyDisarm, listener); + } + + /** + * Check if the kill switch feature is supported on the given drone + * + * @param drone + * @return true if it's supported, false otherwise. + */ + public static boolean isKillSwitchSupported(MavLinkDrone drone) { + if (drone == null) + return false; + + if (!org.droidplanner.services.android.core.drone.variables.Type.isCopter(drone.getType())) + return false; + + String firmwareVersion = drone.getFirmwareVersion(); + if (TextUtils.isEmpty(firmwareVersion)) + return false; + + return !(!firmwareVersion.startsWith("APM:Copter V3.3") + && !firmwareVersion.startsWith("APM:Copter V3.4") + && !firmwareVersion.startsWith("Solo")); + + } + + public static void startMagnetometerCalibration(MavLinkDrone drone, boolean retryOnFailure, boolean saveAutomatically, int + startDelay) { + if (drone == null) + return; + + drone.getMagnetometerCalibration().startCalibration(retryOnFailure, saveAutomatically, startDelay); + } + + public static void cancelMagnetometerCalibration(MavLinkDrone drone) { + if (drone == null) + return; + + drone.getMagnetometerCalibration().cancelCalibration(); + } + + public static void acceptMagnetometerCalibration(MavLinkDrone drone) { + if (drone == null) + return; + + drone.getMagnetometerCalibration().acceptCalibration(); + } + + public static void startIMUCalibration(MavLinkDrone drone, ICommandListener listener) { + if (drone != null) + drone.getCalibrationSetup().startCalibration(listener); + } + + public static void sendIMUCalibrationAck(MavLinkDrone drone, int step) { + if (drone == null) + return; + + drone.getCalibrationSetup().sendAck(step); + } + + public static void doGuidedTakeoff(MavLinkDrone drone, double altitude, ICommandListener listener) { + if (drone == null) + return; + + drone.getGuidedPoint().doGuidedTakeoff(altitude, listener); + } + + public static void sendMavlinkMessage(MavLinkDrone drone, MavlinkMessageWrapper messageWrapper) { + if (drone == null || messageWrapper == null) + return; + + MAVLinkMessage message = messageWrapper.getMavLinkMessage(); + if (message == null) + return; + + message.compid = drone.getCompid(); + message.sysid = drone.getSysid(); + + //Set the target system and target component for MAVLink messages that support those + //attributes. + try { + Class tempMessage = message.getClass(); + Field target_system = tempMessage.getDeclaredField("target_system"); + Field target_component = tempMessage.getDeclaredField("target_component"); + + target_system.setByte(message, (byte) message.sysid); + target_component.setByte(message, (byte) message.compid); + } catch (NoSuchFieldException | SecurityException | IllegalAccessException | IllegalArgumentException | ExceptionInInitializerError e) { + Timber.e(e, e.getMessage()); + } + + drone.getMavClient().sendMessage(message, null); + } + + public static void sendGuidedPoint(MavLinkDrone drone, LatLong point, boolean force, ICommandListener listener) { + if (drone == null) + return; + + GuidedPoint guidedPoint = drone.getGuidedPoint(); + if (guidedPoint.isInitialized()) { + guidedPoint.newGuidedCoord(point); + } else if (force) { + try { + guidedPoint.forcedGuidedCoordinate(point, listener); + } catch (Exception e) { + Timber.e(e, e.getMessage()); + } + } + } + + public static void sendLookAtTarget(final MavLinkDrone drone, final LatLongAlt target, final boolean force, final ICommandListener listener){ + if(drone == null) + return; + + GuidedPoint guidedPoint = drone.getGuidedPoint(); + if(guidedPoint.isInitialized()){ + MavLinkDoCmds.setROI(drone, target, listener); + } + else if (force) { + GuidedPoint.changeToGuidedMode(drone, new AbstractCommandListener() { + @Override + public void onSuccess() { + MavLinkDoCmds.setROI(drone, target, listener); + } + + @Override + public void onError(int executionError) { + postErrorEvent(executionError, listener); + } + + @Override + public void onTimeout() { + postTimeoutEvent(listener); + } + }); + } + } + + public static void setGuidedAltitude(MavLinkDrone drone, double altitude) { + if (drone == null) + return; + + drone.getGuidedPoint().changeGuidedAltitude(altitude); + } + + public static void gotoWaypoint(MavLinkDrone drone, int waypoint, ICommandListener listener) { + if (drone == null) + return; + if (waypoint < 0) { + postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + return; + } + MavLinkDoCmds.gotoWaypoint(drone, waypoint, listener); + } + + public static void buildComplexMissionItem(MavLinkDrone drone, Bundle itemBundle) { + MissionItem missionItem = MissionItemType.restoreMissionItemFromBundle(itemBundle); + if (missionItem == null || !(missionItem instanceof MissionItem.ComplexItem)) + return; + + MissionItemType itemType = missionItem.getType(); + switch (itemType) { + case SURVEY: + Survey updatedSurvey = buildSurvey(drone, (Survey) missionItem); + if (updatedSurvey != null) + itemType.storeMissionItem(updatedSurvey, itemBundle); + break; + + case SPLINE_SURVEY: + Survey updatedSplineSurvey = buildSplineSurvey(drone, (Survey) missionItem); + if (updatedSplineSurvey != null) + itemType.storeMissionItem(updatedSplineSurvey, itemBundle); + break; + + case STRUCTURE_SCANNER: + StructureScanner updatedScanner = buildStructureScanner(drone, (StructureScanner) missionItem); + if (updatedScanner != null) + itemType.storeMissionItem(updatedScanner, itemBundle); + break; + + default: + Timber.w("Unrecognized complex mission item."); + break; + } + } + + public static Survey buildSurvey(MavLinkDrone drone, Survey survey) { + org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); + SurveyImpl updatedSurveyImpl = (SurveyImpl) ProxyUtils.getMissionItemImpl + (droneMission, survey); + + return (Survey) ProxyUtils.getProxyMissionItem(updatedSurveyImpl); + } + + public static Survey buildSplineSurvey(MavLinkDrone drone, Survey survey) { + org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); + SplineSurveyImpl updatedSplineSurvey = (SplineSurveyImpl) + ProxyUtils.getMissionItemImpl(droneMission, survey); + + return (Survey) ProxyUtils.getProxyMissionItem(updatedSplineSurvey); + } + + public static StructureScanner buildStructureScanner(MavLinkDrone drone, StructureScanner item) { + org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); + StructureScannerImpl updatedScan = (StructureScannerImpl) ProxyUtils + .getMissionItemImpl(droneMission, item); + + StructureScanner proxyScanner = (StructureScanner) ProxyUtils.getProxyMissionItem(updatedScan); + return proxyScanner; + } + + public static MagnetometerCalibrationStatus getMagnetometerCalibrationStatus(MavLinkDrone drone) { + MagnetometerCalibrationStatus calStatus = new MagnetometerCalibrationStatus(); + if (drone != null) { + MagnetometerCalibrationImpl magCalImpl = drone.getMagnetometerCalibration(); + calStatus.setCalibrationCancelled(magCalImpl.isCancelled()); + + Collection calibrationInfo = magCalImpl.getMagCalibrationTracker().values(); + for (MagnetometerCalibrationImpl.Info info : calibrationInfo) { + calStatus.addCalibrationProgress(getMagnetometerCalibrationProgress(info.getCalProgress())); + calStatus.addCalibrationResult(getMagnetometerCalibrationResult(info.getCalReport())); + } + } + + return calStatus; + } + + public static MagnetometerCalibrationProgress getMagnetometerCalibrationProgress(msg_mag_cal_progress msgProgress) { + if (msgProgress == null) + return null; + + return new MagnetometerCalibrationProgress(msgProgress.compass_id, msgProgress.completion_pct, + msgProgress.direction_x, msgProgress.direction_y, msgProgress.direction_z); + } + + public static MagnetometerCalibrationResult getMagnetometerCalibrationResult(msg_mag_cal_report msgReport) { + if (msgReport == null) + return null; + + return new MagnetometerCalibrationResult(msgReport.compass_id, + msgReport.cal_status == MAG_CAL_STATUS.MAG_CAL_SUCCESS, msgReport.autosaved == 1, msgReport.fitness, + msgReport.ofs_x, msgReport.ofs_y, msgReport.ofs_z, + msgReport.diag_x, msgReport.diag_y, msgReport.diag_z, + msgReport.offdiag_x, msgReport.offdiag_y, msgReport.offdiag_z); + } + + public static void startVideoStream(Drone drone, Bundle videoProps, String appId, String videoTag, + Surface videoSurface, ICommandListener listener) { + if (!(drone instanceof GenericMavLinkDrone)) { + postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return; + } + + GenericMavLinkDrone mavLinkDrone = (GenericMavLinkDrone) drone; + mavLinkDrone.startVideoStream(videoProps, appId, videoTag, videoSurface, listener); + } + + public static void stopVideoStream(Drone drone, String appId, String videoTag, + ICommandListener listener) { + if (!(drone instanceof GenericMavLinkDrone)) { + postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return; + } + + GenericMavLinkDrone mavLinkDrone = (GenericMavLinkDrone) drone; + mavLinkDrone.stopVideoStream(appId, videoTag, listener); + } + + public static void startVideoStreamForObserver(Drone drone, String appId, String videoTag, + ICommandListener listener) { + if (!(drone instanceof GenericMavLinkDrone)) { + postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return; + } + + GenericMavLinkDrone mavLinkDrone = (GenericMavLinkDrone) drone; + mavLinkDrone.startVideoStreamForObserver(appId, videoTag, listener); + } + + public static void stopVideoStreamForObserver(Drone drone, String appId, String videoTag, + ICommandListener listener) { + if (!(drone instanceof GenericMavLinkDrone)) { + postErrorEvent(CommandExecutionError.COMMAND_UNSUPPORTED, listener); + return; + } + + GenericMavLinkDrone mavLinkDrone = (GenericMavLinkDrone) drone; + mavLinkDrone.stopVideoStreamForObserver(appId, videoTag, listener); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java new file mode 100644 index 0000000000..b8944b4737 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java @@ -0,0 +1,140 @@ +package org.droidplanner.services.android.impl.utils; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.util.Log; + +import org.droidplanner.services.android.BuildConfig; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; + +import timber.log.Timber; + +/** + * Timber Tree to log specific log levels to a file + */ +public class LogToFileTree extends Timber.DebugTree { + private static final SimpleDateFormat LOG_DATE_FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US); + private static final SimpleDateFormat FILE_DATE_FORMAT = new SimpleDateFormat("yyyy_MM_dd_HH_mm", Locale.US); + + private final LinkedBlockingQueue logQueue = new LinkedBlockingQueue<>(); + private PrintStream logOutputFile; + private Thread dequeueThread; + private final AtomicBoolean isRunning = new AtomicBoolean(false); + private final Date date = new Date(); + + @Override + protected void log(int priority, String tag, String message, Throwable t) { + super.log(priority, tag, message, t); + + if (isLoggableToFile(priority)) { + String logOutput = getLogMessage(priority, tag, message); + logQueue.add(logOutput); + } + } + + private boolean isLoggableToFile(int priority) { + return priority >= BuildConfig.LOG_FILE_LEVEL; + } + + private String getLogMessage(int priority, String tag, String message) { + String priorityShort = getPriorityString(priority); + date.setTime(System.currentTimeMillis()); + return String.format("%s %s/%s : %s", LOG_DATE_FORMAT.format(date), priorityShort, tag, message); + } + + private String getPriorityString(int priority) { + String priorityString = null; + switch (priority) { + case Log.ASSERT: + priorityString = "ASSERT"; + break; + case Log.ERROR: + priorityString = "E"; + break; + case Log.WARN: + priorityString = "W"; + break; + case Log.INFO: + priorityString = "I"; + break; + case Log.DEBUG: + priorityString = "D"; + break; + case Log.VERBOSE: + priorityString = "V"; + break; + default: + priorityString = ""; + break; + } + return priorityString; + } + + public void createFileStartLogging(final Context context) { + if (dequeueThread != null && dequeueThread.isAlive()) { + stopLoggingThread(); + } + + dequeueThread = new Thread(new Runnable() { + public void run() { + PackageInfo pInfo; + String version = ""; + try { + pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + version = pInfo.versionName; + } catch (PackageManager.NameNotFoundException e) { + Timber.w("Failed to get package info"); + } + + File rootDir = context.getExternalFilesDir(null); + File dir = new File(rootDir, "/log_cat/"); + dir.mkdirs(); + + String fileName = String.format("%s_%s.log", version, FILE_DATE_FORMAT.format(new Date())); + File logFile = new File(dir, fileName); + try { + logOutputFile = new PrintStream(new FileOutputStream(logFile, true)); + + while (isRunning.get()) { + try { + String message = logQueue.take(); + logOutputFile.println(message); + } catch (InterruptedException e) { + Timber.w("Failed to receive message from logQueue"); + } + } + + } catch (IOException e) { + Timber.w("Failed to open file"); + } finally { + isRunning.set(false); + if (logOutputFile != null) { + logOutputFile.close(); + } + } + } + }); + + isRunning.set(true); + dequeueThread.start(); + } + + public void stopLoggingThread() { + if (dequeueThread != null) { + isRunning.set(false); + dequeueThread.interrupt(); + dequeueThread = null; + } + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java new file mode 100644 index 0000000000..34581eb814 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java @@ -0,0 +1,50 @@ +package org.droidplanner.services.android.impl.utils; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; + +import org.droidplanner.services.android.BuildConfig; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; + +/** + * Created by Fredia Huya-Kouadio on 5/11/15. + */ +public class NetworkUtils { + /** + * Is internet connection available. This method also returns true for the SITL build type + * @param context + * @return Internet connection availability. + */ + public static boolean isNetworkAvailable(Context context) { + if (!BuildConfig.SITL_DEBUG && isOnSololinkNetwork(context)) + return false; + + ConnectivityManager connectivityManager = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); + return activeNetworkInfo != null && activeNetworkInfo.isConnected(); + } + + public static String getCurrentWifiLink(Context context) { + final WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + + final WifiInfo connectedWifi = wifiMgr.getConnectionInfo(); + final String connectedSSID = connectedWifi == null ? null : connectedWifi.getSSID().replace("\"", ""); + return connectedSSID; + } + + public static boolean isOnSololinkNetwork(Context context) { + if (BuildConfig.SITL_DEBUG) + return true; + + final String connectedSSID = getCurrentWifiLink(context); + return isSoloNetwork(connectedSSID); + } + + public static boolean isSoloNetwork(String ssid) { + return ssid != null && ssid.startsWith(SoloComp.SOLO_LINK_WIFI_PREFIX); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java new file mode 100644 index 0000000000..1080fc7cf3 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java @@ -0,0 +1,557 @@ +package org.droidplanner.services.android.impl.utils; + +import android.util.Log; + +import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; +import org.droidplanner.services.android.core.mission.commands.ConditionYawImpl; +import org.droidplanner.services.android.core.mission.commands.DoJumpImpl; +import org.droidplanner.services.android.core.mission.commands.EpmGripperImpl; +import org.droidplanner.services.android.core.mission.commands.ReturnToHomeImpl; +import org.droidplanner.services.android.core.mission.commands.SetRelayImpl; +import org.droidplanner.services.android.core.mission.commands.SetServoImpl; +import org.droidplanner.services.android.core.mission.commands.TakeoffImpl; +import org.droidplanner.services.android.core.mission.survey.SplineSurveyImpl; +import org.droidplanner.services.android.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.core.mission.waypoints.CircleImpl; +import org.droidplanner.services.android.core.mission.waypoints.DoLandStartImpl; +import org.droidplanner.services.android.core.mission.waypoints.LandImpl; +import org.droidplanner.services.android.core.mission.waypoints.RegionOfInterestImpl; +import org.droidplanner.services.android.core.mission.waypoints.SplineWaypointImpl; +import org.droidplanner.services.android.core.mission.waypoints.StructureScannerImpl; +import org.droidplanner.services.android.core.mission.waypoints.WaypointImpl; +import org.droidplanner.services.android.core.survey.CameraInfo; +import org.droidplanner.services.android.core.survey.SurveyData; +import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import org.droidplanner.services.android.lib.drone.mission.item.command.CameraTrigger; +import org.droidplanner.services.android.lib.drone.mission.item.command.ChangeSpeed; +import org.droidplanner.services.android.lib.drone.mission.item.command.DoJump; +import org.droidplanner.services.android.lib.drone.mission.item.command.EpmGripper; +import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; +import org.droidplanner.services.android.lib.drone.mission.item.command.ReturnToLaunch; +import org.droidplanner.services.android.lib.drone.mission.item.command.SetRelay; +import org.droidplanner.services.android.lib.drone.mission.item.command.SetServo; +import org.droidplanner.services.android.lib.drone.mission.item.command.Takeoff; +import org.droidplanner.services.android.lib.drone.mission.item.command.YawCondition; +import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; +import org.droidplanner.services.android.lib.drone.mission.item.complex.SplineSurvey; +import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; +import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; +import org.droidplanner.services.android.lib.drone.mission.item.complex.SurveyDetail; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Circle; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.DoLandStart; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Land; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.SplineWaypoint; +import org.droidplanner.services.android.lib.drone.mission.item.spatial.Waypoint; + +/** + * Created by fhuya on 11/10/14. + */ +public class ProxyUtils { + + private static final String TAG = ProxyUtils.class.getSimpleName(); + + public static CameraDetail getCameraDetail(CameraInfo camInfo) { + if (camInfo == null) return null; + return new CameraDetail(camInfo.name, camInfo.sensorWidth, + camInfo.sensorHeight, camInfo.sensorResolution, camInfo.focalLength, + camInfo.overlap, camInfo.sidelap, camInfo.isInLandscapeOrientation); + } + + public static CameraInfo getCameraInfo(CameraDetail camDetail) { + if (camDetail == null) return null; + + CameraInfo camInfo = new CameraInfo(); + camInfo.name = camDetail.getName(); + camInfo.sensorWidth = camDetail.getSensorWidth(); + camInfo.sensorHeight = camDetail.getSensorHeight(); + camInfo.sensorResolution = camDetail.getSensorResolution(); + camInfo.focalLength = camDetail.getFocalLength(); + camInfo.overlap = camDetail.getOverlap(); + camInfo.sidelap = camDetail.getSidelap(); + camInfo.isInLandscapeOrientation = camDetail.isInLandscapeOrientation(); + + return camInfo; + } + + public static SurveyDetail getSurveyDetail(SurveyData surveyData) { + SurveyDetail surveyDetail = new SurveyDetail(); + surveyDetail.setCameraDetail(getCameraDetail(surveyData.getCameraInfo())); + surveyDetail.setSidelap(surveyData.getSidelap()); + surveyDetail.setOverlap(surveyData.getOverlap()); + surveyDetail.setAngle(surveyData.getAngle()); + surveyDetail.setAltitude(surveyData.getAltitude()); + return surveyDetail; + } + + public static MissionItemImpl getMissionItemImpl(Mission mission, MissionItem proxyItem) { + if (proxyItem == null) + return null; + + MissionItemImpl missionItemImpl; + switch (proxyItem.getType()) { + + case CAMERA_TRIGGER: { + CameraTrigger proxy = (CameraTrigger) proxyItem; + + CameraTriggerImpl temp = new CameraTriggerImpl(mission, (proxy.getTriggerDistance())); + + missionItemImpl = temp; + break; + } + case CHANGE_SPEED: { + ChangeSpeed proxy = (ChangeSpeed) proxyItem; + + ChangeSpeedImpl temp = new ChangeSpeedImpl(mission, proxy.getSpeed()); + + missionItemImpl = temp; + break; + } + case EPM_GRIPPER: { + EpmGripper proxy = (EpmGripper) proxyItem; + + EpmGripperImpl temp = new EpmGripperImpl(mission, proxy.isRelease()); + + missionItemImpl = temp; + break; + } + case RETURN_TO_LAUNCH: { + ReturnToLaunch proxy = (ReturnToLaunch) proxyItem; + + ReturnToHomeImpl temp = new ReturnToHomeImpl(mission); + temp.setHeight((proxy.getReturnAltitude())); + + missionItemImpl = temp; + break; + } + case SET_SERVO: { + SetServo proxy = (SetServo) proxyItem; + + SetServoImpl temp = new SetServoImpl(mission, proxy.getChannel(), proxy.getPwm()); + + missionItemImpl = temp; + break; + } + case TAKEOFF: { + Takeoff proxy = (Takeoff) proxyItem; + + TakeoffImpl temp = new TakeoffImpl(mission, (proxy.getTakeoffAltitude())); + + missionItemImpl = temp; + break; + } + case CIRCLE: { + Circle proxy = (Circle) proxyItem; + + CircleImpl temp = new CircleImpl(mission, (proxy.getCoordinate())); + temp.setRadius(proxy.getRadius()); + temp.setTurns(proxy.getTurns()); + + missionItemImpl = temp; + break; + } + case LAND: { + Land proxy = (Land) proxyItem; + + LandImpl temp = new LandImpl(mission, (proxy.getCoordinate())); + + missionItemImpl = temp; + break; + } + case DO_LAND_START: { + DoLandStart proxy = (DoLandStart) proxyItem; + + DoLandStartImpl temp = new DoLandStartImpl(mission, (proxy.getCoordinate())); + + missionItemImpl = temp; + break; + } + + case REGION_OF_INTEREST: { + RegionOfInterest proxy = (RegionOfInterest) proxyItem; + + RegionOfInterestImpl temp = new RegionOfInterestImpl(mission, (proxy.getCoordinate())); + + missionItemImpl = temp; + break; + } + + case RESET_ROI: { + //Sending a roi with all coordinates set to 0 will reset the current roi. + RegionOfInterestImpl temp = new RegionOfInterestImpl(mission, new LatLongAlt(0, 0, 0)); + missionItemImpl = temp; + break; + } + + case SPLINE_WAYPOINT: { + SplineWaypoint proxy = (SplineWaypoint) proxyItem; + + SplineWaypointImpl temp = new SplineWaypointImpl(mission, (proxy.getCoordinate())); + temp.setDelay(proxy.getDelay()); + + missionItemImpl = temp; + break; + } + case STRUCTURE_SCANNER: { + StructureScanner proxy = (StructureScanner) proxyItem; + + StructureScannerImpl temp = new StructureScannerImpl(mission, (proxy.getCoordinate())); + temp.setRadius((int) proxy.getRadius()); + temp.setNumberOfSteps(proxy.getStepsCount()); + temp.setAltitudeStep((int) proxy.getHeightStep()); + temp.enableCrossHatch(proxy.isCrossHatch()); + + CameraDetail camDetail = proxy.getSurveyDetail().getCameraDetail(); + if (camDetail != null) + temp.setCamera(getCameraInfo(camDetail)); + + missionItemImpl = temp; + break; + } + case WAYPOINT: { + Waypoint proxy = (Waypoint) proxyItem; + + WaypointImpl temp = new WaypointImpl(mission, (proxy + .getCoordinate())); + temp.setAcceptanceRadius(proxy.getAcceptanceRadius()); + temp.setDelay(proxy.getDelay()); + temp.setOrbitCCW(proxy.isOrbitCCW()); + temp.setOrbitalRadius(proxy.getOrbitalRadius()); + temp.setYawAngle(proxy.getYawAngle()); + + missionItemImpl = temp; + break; + } + case SURVEY: { + Survey proxy = (Survey) proxyItem; + SurveyDetail surveyDetail = proxy.getSurveyDetail(); + + SurveyImpl temp = new SurveyImpl(mission, proxy.getPolygonPoints()); + temp.setStartCameraBeforeFirstWaypoint(proxy.isStartCameraBeforeFirstWaypoint()); + + if (surveyDetail != null) { + CameraDetail cameraDetail = surveyDetail.getCameraDetail(); + if (cameraDetail != null) + temp.setCameraInfo(getCameraInfo(cameraDetail)); + + temp.update(surveyDetail.getAngle(), (surveyDetail.getAltitude()), + surveyDetail.getOverlap(), surveyDetail.getSidelap()); + } + + try { + temp.build(); + } catch (Exception e) { + Log.e(TAG, e.getMessage(), e); + } + + missionItemImpl = temp; + break; + } + case SPLINE_SURVEY: { + SplineSurvey proxy = (SplineSurvey) proxyItem; + SurveyDetail surveyDetail = proxy.getSurveyDetail(); + + SplineSurveyImpl temp = new SplineSurveyImpl(mission, proxy.getPolygonPoints()); + temp.setStartCameraBeforeFirstWaypoint(proxy.isStartCameraBeforeFirstWaypoint()); + + if (surveyDetail != null) { + CameraDetail cameraDetail = surveyDetail.getCameraDetail(); + if (cameraDetail != null) + temp.setCameraInfo(getCameraInfo(cameraDetail)); + + temp.update(surveyDetail.getAngle(), (surveyDetail.getAltitude()), + surveyDetail.getOverlap(), surveyDetail.getSidelap()); + } + + try { + temp.build(); + } catch (Exception e) { + Log.e(TAG, e.getMessage(), e); + } + + missionItemImpl = temp; + break; + } + case YAW_CONDITION: { + YawCondition proxy = (YawCondition) proxyItem; + + ConditionYawImpl temp = new ConditionYawImpl(mission, proxy.getAngle(), proxy.isRelative()); + temp.setAngularSpeed(proxy.getAngularSpeed()); + + missionItemImpl = temp; + break; + } + + case SET_RELAY: { + SetRelay proxy = (SetRelay) proxyItem; + missionItemImpl = new SetRelayImpl(mission, proxy.getRelayNumber(), proxy.isEnabled()); + break; + } + + case DO_JUMP: { + DoJump proxy = (DoJump) proxyItem; + missionItemImpl = new DoJumpImpl(mission, proxy.getWaypoint(), proxy.getRepeatCount()); + break; + } + + default: + missionItemImpl = null; + break; + } + + return missionItemImpl; + } + + public static MissionItem getProxyMissionItem(MissionItemImpl itemImpl) { + if (itemImpl == null) + return null; + + MissionItem proxyMissionItem; + switch (itemImpl.getType()) { + case WAYPOINT: { + WaypointImpl source = (WaypointImpl) itemImpl; + + Waypoint temp = new Waypoint(); + temp.setCoordinate((source.getCoordinate())); + temp.setAcceptanceRadius(source.getAcceptanceRadius()); + temp.setDelay(source.getDelay()); + temp.setOrbitalRadius(source.getOrbitalRadius()); + temp.setOrbitCCW(source.isOrbitCCW()); + temp.setYawAngle(source.getYawAngle()); + + proxyMissionItem = temp; + break; + } + + case SPLINE_WAYPOINT: { + SplineWaypointImpl source = (SplineWaypointImpl) itemImpl; + + SplineWaypoint temp = new SplineWaypoint(); + temp.setCoordinate((source.getCoordinate())); + temp.setDelay(source.getDelay()); + + proxyMissionItem = temp; + break; + } + + case TAKEOFF: { + TakeoffImpl source = (TakeoffImpl) itemImpl; + + Takeoff temp = new Takeoff(); + temp.setTakeoffAltitude(source.getFinishedAlt()); + temp.setTakeoffPitch(source.getPitch()); + + proxyMissionItem = temp; + break; + } + case RTL: { + ReturnToHomeImpl source = (ReturnToHomeImpl) itemImpl; + + ReturnToLaunch temp = new ReturnToLaunch(); + temp.setReturnAltitude(source.getHeight()); + + proxyMissionItem = temp; + break; + } + case LAND: { + LandImpl source = (LandImpl) itemImpl; + + Land temp = new Land(); + temp.setCoordinate((source.getCoordinate())); + + proxyMissionItem = temp; + break; + } + case DO_LAND_START: { + DoLandStartImpl source = (DoLandStartImpl) itemImpl; + + DoLandStart temp = new DoLandStart(); + temp.setCoordinate((source.getCoordinate())); + + proxyMissionItem = temp; + break; + } + case CIRCLE: { + CircleImpl source = (CircleImpl) itemImpl; + + Circle temp = new Circle(); + temp.setCoordinate((source.getCoordinate())); + temp.setRadius(source.getRadius()); + temp.setTurns(source.getNumberOfTurns()); + + proxyMissionItem = temp; + break; + } + + case ROI: { + RegionOfInterestImpl source = (RegionOfInterestImpl) itemImpl; + + if(source.isReset()){ + ResetROI temp = new ResetROI(); + proxyMissionItem = temp; + } + else { + RegionOfInterest temp = new RegionOfInterest(); + temp.setCoordinate((source.getCoordinate())); + + proxyMissionItem = temp; + } + break; + } + + case SURVEY: { + SurveyImpl source = (SurveyImpl) itemImpl; + + boolean isValid = true; + try { + source.build(); + } catch (Exception e) { + isValid = false; + } + + Survey temp = new Survey(); + temp.setStartCameraBeforeFirstWaypoint(source.isStartCameraBeforeFirstWaypoint()); + temp.setValid(isValid); + temp.setSurveyDetail(getSurveyDetail(source.surveyData)); + temp.setPolygonPoints((source.polygon.getPoints())); + + if (source.grid != null) { + temp.setGridPoints((source.grid.gridPoints)); + temp.setCameraLocations((source.grid.getCameraLocations())); + } + + temp.setPolygonArea(source.polygon.getArea().valueInSqMeters()); + + proxyMissionItem = temp; + break; + } + + case SPLINE_SURVEY: { + SplineSurveyImpl source = (SplineSurveyImpl) itemImpl; + + boolean isValid = true; + try { + source.build(); + } catch (Exception e) { + isValid = false; + } + + Survey temp = new Survey(); + temp.setStartCameraBeforeFirstWaypoint(source.isStartCameraBeforeFirstWaypoint()); + temp.setValid(isValid); + temp.setSurveyDetail(getSurveyDetail(source.surveyData)); + temp.setPolygonPoints((source.polygon.getPoints())); + + if (source.grid != null) { + temp.setGridPoints((source.grid.gridPoints)); + temp.setCameraLocations((source.grid.getCameraLocations())); + } + + temp.setPolygonArea(source.polygon.getArea().valueInSqMeters()); + + proxyMissionItem = temp; + break; + } + + case CYLINDRICAL_SURVEY: { + StructureScannerImpl source = (StructureScannerImpl) itemImpl; + + StructureScanner temp = new StructureScanner(); + temp.setSurveyDetail(getSurveyDetail(source.getSurveyData())); + temp.setCoordinate((source.getCoordinate())); + temp.setRadius(source.getRadius()); + temp.setCrossHatch(source.isCrossHatchEnabled()); + temp.setHeightStep(source.getEndAltitude()); + temp.setStepsCount(source.getNumberOfSteps()); + temp.setPath((source.getPath())); + + proxyMissionItem = temp; + break; + } + + case CHANGE_SPEED: { + ChangeSpeedImpl source = (ChangeSpeedImpl) itemImpl; + + ChangeSpeed temp = new ChangeSpeed(); + temp.setSpeed(source.getSpeed()); + + proxyMissionItem = temp; + break; + } + + case CAMERA_TRIGGER: { + CameraTriggerImpl source = (CameraTriggerImpl) itemImpl; + + CameraTrigger temp = new CameraTrigger(); + temp.setTriggerDistance(source.getTriggerDistance()); + + proxyMissionItem = temp; + break; + } + case EPM_GRIPPER: { + EpmGripperImpl source = (EpmGripperImpl) itemImpl; + + EpmGripper temp = new EpmGripper(); + temp.setRelease(source.isRelease()); + + proxyMissionItem = temp; + break; + } + + case SET_SERVO: { + SetServoImpl source = (SetServoImpl) itemImpl; + + SetServo temp = new SetServo(); + temp.setChannel(source.getChannel()); + temp.setPwm(source.getPwm()); + + proxyMissionItem = temp; + break; + } + case CONDITION_YAW: { + ConditionYawImpl source = (ConditionYawImpl) itemImpl; + + YawCondition temp = new YawCondition(); + temp.setAngle(source.getAngle()); + temp.setAngularSpeed(source.getAngularSpeed()); + temp.setRelative(source.isRelative()); + + proxyMissionItem = temp; + break; + } + + case SET_RELAY: { + SetRelayImpl impl = (SetRelayImpl) itemImpl; + + SetRelay proxy = new SetRelay(); + proxy.setRelayNumber(impl.getRelayNumber()); + proxy.setEnabled(impl.isEnabled()); + + proxyMissionItem = proxy; + break; + } + + case DO_JUMP: { + DoJumpImpl source = (DoJumpImpl) itemImpl; + + DoJump proxy = new DoJump(); + proxy.setWaypoint(source.getWaypoint()); + proxy.setRepeatCount(source.getRepeatCount()); + + proxyMissionItem = proxy; + break; + } + + default: + proxyMissionItem = null; + break; + } + + return proxyMissionItem; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java new file mode 100644 index 0000000000..0867f1a6f8 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java @@ -0,0 +1,117 @@ +package org.droidplanner.services.android.impl.utils; + +import android.os.RemoteException; +import android.util.Pair; + +import org.droidplanner.services.android.core.drone.autopilot.Drone; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; +import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.drone.companion.solo.SoloState; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import org.droidplanner.services.android.lib.model.ICommandListener; + +import timber.log.Timber; + +/** + * Created by Fredia Huya-Kouadio on 7/29/15. + */ +public class SoloApiUtils { + + //Private to prevent instantiation. + private SoloApiUtils() { + } + + public static SoloState getSoloLinkState(ArduSolo arduSolo) { + if (arduSolo == null) + return null; + + final SoloComp soloComp = arduSolo.getSoloComp(); + final Pair wifiSettings = soloComp.getWifiSettings(); + return new SoloState(soloComp.getAutopilotVersion(), soloComp.getControllerFirmwareVersion(), + soloComp.getControllerVersion(), soloComp.getVehicleVersion(), + wifiSettings.second, wifiSettings.first, soloComp.getTxPowerCompliantCountry(), + soloComp.getButtonSettings(), soloComp.getGimbalVersion(), + soloComp.getControllerMode(), soloComp.getControllerUnit()); + } + + public static boolean isSoloLinkFeatureAvailable(Drone drone, ICommandListener listener) { + if (drone == null) + return false; + + if(!(drone instanceof ArduSolo)){ + if (listener != null) { + try { + listener.onError(CommandExecutionError.COMMAND_UNSUPPORTED); + } catch (RemoteException e) { + Timber.e(e, e.getMessage()); + } + } + return false; + } + + return true; + } + + public static void sendSoloLinkMessage(ArduSolo arduSolo, TLVPacket messageData, + ICommandListener listener) { + if (!isSoloLinkFeatureAvailable(arduSolo, listener) || messageData == null) + return; + + final SoloComp soloComp = arduSolo.getSoloComp(); + soloComp.sendSoloLinkMessage(messageData, listener); + } + + public static void updateSoloLinkWifiSettings(ArduSolo arduSolo, + String wifiSsid, String wifiPassword, + ICommandListener listener) { + if (!isSoloLinkFeatureAvailable(arduSolo, listener)) + return; + + if (android.text.TextUtils.isEmpty(wifiSsid) && android.text.TextUtils.isEmpty(wifiPassword)) + return; + + final SoloComp soloComp = arduSolo.getSoloComp(); + soloComp.updateWifiSettings(wifiSsid, wifiPassword, listener); + } + + public static void updateSoloLinkButtonSettings(ArduSolo arduSolo, + SoloButtonSettingSetter buttonSettings, + ICommandListener listener) { + if (!isSoloLinkFeatureAvailable(arduSolo, listener) || buttonSettings == null) + return; + + final SoloComp soloComp = arduSolo.getSoloComp(); + soloComp.pushButtonSettings(buttonSettings, listener); + } + + public static void updateSoloLinkControllerMode(ArduSolo arduSolo, + @SoloControllerMode.ControllerMode int mode, + ICommandListener listener) { + if (!isSoloLinkFeatureAvailable(arduSolo, listener)) + return; + + final SoloComp soloComp = arduSolo.getSoloComp(); + soloComp.updateControllerMode(mode, listener); + } + + public static void updateSoloControllerUnit(ArduSolo arduSolo, @SoloControllerUnits.ControllerUnit String unit, ICommandListener listener){ + if(!isSoloLinkFeatureAvailable(arduSolo, listener)) + return; + + final SoloComp soloComp = arduSolo.getSoloComp(); + soloComp.updateControllerUnit(unit, listener); + } + + public static void updateSoloLinkTxPowerComplianceCountry(ArduSolo arduSolo, String compliantCountry, ICommandListener listener){ + if(!isSoloLinkFeatureAvailable(arduSolo, listener)) + return; + + final SoloComp soloComp = arduSolo.getSoloComp(); + soloComp.updateTxPowerComplianceCountry(compliantCountry, listener); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/TextUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/TextUtils.java new file mode 100644 index 0000000000..0f4bee47d3 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/TextUtils.java @@ -0,0 +1,98 @@ +package org.droidplanner.services.android.impl.utils; + +import android.graphics.Typeface; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.text.style.StyleSpan; + +/** + * Contains text, and formatting related functions. + */ +public class TextUtils { + + // Not instantiable + private TextUtils() { + } + + /** + * Returns a CharSequence that concatenates the specified array of + * CharSequence objects and then applies a list of zero or more tags to the + * entire range. + * + * @param content + * an array of character sequences to apply a style to + * @param tags + * the styled span objects to apply to the content such as + * android.text.style.StyleSpan + * + */ + private static CharSequence apply(CharSequence[] content, Object... tags) { + SpannableStringBuilder text = new SpannableStringBuilder(); + openTags(text, tags); + for (CharSequence item : content) { + text.append(item); + } + closeTags(text, tags); + return text; + } + + /** + * Iterates over an array of tags and applies them to the beginning of the + * specified Spannable object so that future text appended to the text will + * have the styling applied to it. Do not call this method directly. + */ + private static void openTags(Spannable text, Object[] tags) { + for (Object tag : tags) { + text.setSpan(tag, 0, 0, Spanned.SPAN_MARK_MARK); + } + } + + /** + * "Closes" the specified tags on a Spannable by updating the spans to be + * endpoint-exclusive so that future text appended to the end will not take + * on the same styling. Do not call this method directly. + */ + private static void closeTags(Spannable text, Object[] tags) { + int len = text.length(); + for (Object tag : tags) { + if (len > 0) { + text.setSpan(tag, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else { + text.removeSpan(tag); + } + } + } + + /** + * Returns a CharSequence that applies boldface to the concatenation of the + * specified CharSequence objects. + */ + public static CharSequence bold(CharSequence... content) { + return apply(content, new StyleSpan(Typeface.BOLD)); + } + + /** + * Returns a CharSequence that applies italics to the concatenation of the + * specified CharSequence objects. + */ + public static CharSequence italic(CharSequence... content) { + return apply(content, new StyleSpan(Typeface.ITALIC)); + } + + /** + * Returns a CharSequence that removes applied type faces. + */ + public static CharSequence normal(CharSequence... content) { + return apply(content, new StyleSpan(Typeface.NORMAL)); + } + + /** + * Returns a CharSequence that applies a foreground color to the + * concatenation of the specified CharSequence objects. + */ + public static CharSequence color(int color, CharSequence... content) { + return apply(content, new ForegroundColorSpan(color)); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/Utils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/Utils.java new file mode 100644 index 0000000000..bd0802dcb8 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/Utils.java @@ -0,0 +1,11 @@ +package org.droidplanner.services.android.impl.utils; + +/** + * Created by Fredia Huya-Kouadio on 2/4/15. + */ +public class Utils { + + public static final String PACKAGE_NAME = "org.droidplanner.services.android"; + + private Utils(){} +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java new file mode 100644 index 0000000000..0f92408853 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java @@ -0,0 +1,133 @@ +package org.droidplanner.services.android.impl.utils.analytics; + +import android.content.Context; +import android.util.Log; + +import com.google.android.gms.analytics.GoogleAnalytics; +import com.google.android.gms.analytics.HitBuilders; +import com.google.android.gms.analytics.Logger; +import com.google.android.gms.analytics.Tracker; + +import org.droidplanner.services.android.BuildConfig; +import org.droidplanner.services.android.DroidPlannerServicesApp; +import org.droidplanner.services.android.R; +import org.droidplanner.services.android.lib.drone.connection.DroneSharePrefs; +import org.droidplanner.services.android.utils.prefs.DroidPlannerPrefs; + +import java.util.Map; + +/** + * Components related to google analytics logic. + */ +public class GAUtils { + + private static final String LOG_TAG = GAUtils.class.getSimpleName(); + + // Not instantiable + private GAUtils() {} + + /** + * List the analytics categories used in the app. + */ + public static class Category { + /** + * Category for measuring failsafe events. + */ + public static final String FAILSAFE = "Failsafe"; + + /** + * Category for analytics related to mavlink connection events. + */ + public static final String MAVLINK_CONNECTION = "Mavlink connection"; + + /** + * Category for droneshare analytics + */ + public static final String DRONESHARE = "Droneshare"; + + /** + * Category for mission planning, and editing. + */ + public static final String MISSION_PLANNING = "Mission planning"; + + } + + /** + * List the custom dimension used in the app. + */ + public static class CustomDimension { + /** + * Custom dimension used to report the used mavlink connection type. + */ + public static final int MAVLINK_CONNECTION_TYPE = 1; + + /** + * Custom dimension used to report whether the user has a droneshare + * account. + */ + public static final int DRONESHARE_ACTIVE = 2; + } + + /** + * Stores a reference to the google analytics app tracker. + */ + private static Tracker sAppTracker; + + public static void initGATracker(DroidPlannerServicesApp app) { + if (sAppTracker == null) { + final Context context = app.getApplicationContext(); + + final GoogleAnalytics analytics = GoogleAnalytics.getInstance(context); + + // Call is needed for now to allow dispatching of auto activity + // reports + // (http://stackoverflow.com/a/23256722/1088814) + analytics.enableAutoActivityReports(app); + + analytics.setAppOptOut(!new DroidPlannerPrefs(context).isUsageStatisticsEnabled()); + + // If we're in debug mode, set log level to verbose. + if (BuildConfig.DEBUG) { + analytics.getLogger().setLogLevel(Logger.LogLevel.VERBOSE); + } + + sAppTracker = analytics.newTracker(R.xml.google_analytics_tracker); + } + } + + public static void startNewSession(DroneSharePrefs prefs) { + final boolean isDroneShareUser = prefs != null && prefs.isEnabled() && prefs.areLoginCredentialsSet(); + + sendHit(new HitBuilders.AppViewBuilder() + .setNewSession() + .setCustomDimension(CustomDimension.DRONESHARE_ACTIVE, + String.valueOf(isDroneShareUser)).build()); + } + + public static void sendEvent(HitBuilders.EventBuilder eventBuilder) { + if (eventBuilder != null) { + sendHit(eventBuilder.build()); + } + } + + public static void sendEvent(HitBuilders.SocialBuilder socialBuilder){ + if(socialBuilder != null){ + sendHit(socialBuilder.build()); + } + } + + public static void sendTiming(HitBuilders.TimingBuilder timingBuilder) { + if (timingBuilder != null) { + sendHit(timingBuilder.build()); + } + } + + private static void sendHit(Map hitParams) { + if (sAppTracker == null) { + Log.w(LOG_TAG, "Google Analytics tracker is not initialized."); + return; + } + + sAppTracker.send(hitParams); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java new file mode 100644 index 0000000000..64ad7aa434 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java @@ -0,0 +1,20 @@ +package org.droidplanner.services.android.impl.utils.apps; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.support.v4.content.LocalBroadcastManager; + +import org.droidplanner.services.android.ui.fragment.RecommendedAppsFragment; + +/** + * Created by Fredia Huya-Kouadio on 2/5/15. + */ +public class AppsUpdateReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + LocalBroadcastManager.getInstance(context) + .sendBroadcast(new Intent(RecommendedAppsFragment.ACTION_REFRESH_RECOMMENDED_APPS)); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/SshConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/SshConnection.java new file mode 100644 index 0000000000..3b047156c8 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/SshConnection.java @@ -0,0 +1,370 @@ +package org.droidplanner.services.android.impl.utils.connection; + +import android.text.TextUtils; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelExec; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import timber.log.Timber; + +/** + * Created by Fredia Huya-Kouadio on 2/24/15. + */ +public class SshConnection { + + private static final String TAG = SshConnection.class.getSimpleName(); + + public interface UploadListener { + void onUploaded(File uploadFile, long uploadBytesCount, long totalBytesCount); + + boolean shouldContinueUpload(); + } + + public interface DownloadListener { + + void onFileSizeCalculated(long fileSize); + + void onDownloaded(String downloadFile, long downloadBytesCount); + } + + private static final int CONNECTION_TIMEOUT = 15000; //ms + + private static final String EXEC_CHANNEL_TYPE = "exec"; + + private final JSch jsch; + private final String host; + private final String username; + private final String password; + + public SshConnection(String host, String username, String password) { + this.jsch = new JSch(); + this.host = host; + this.username = username; + this.password = password; + } + + private Session getSession() throws JSchException { + Session session = jsch.getSession(username, host); + + //Try to connect with the password set. + session.setConfig("StrictHostKeyChecking", "no"); + session.setPassword(this.password); + session.connect(CONNECTION_TIMEOUT); + + return session; + } + + public boolean ping() { + Session session = null; + try { + session = getSession(); + return true; + } catch (JSchException e) { + return false; + } finally { + if (session != null && session.isConnected()) + session.disconnect(); + } + } + + public String execute(String command) throws IOException { + if (TextUtils.isEmpty(command)) + return null; + + Session session = null; + Channel execChannel = null; + try { + session = getSession(); + + execChannel = session.openChannel(EXEC_CHANNEL_TYPE); + ((ChannelExec) execChannel).setCommand(command); + execChannel.setInputStream(null); + + final InputStream in = execChannel.getInputStream(); + execChannel.connect(CONNECTION_TIMEOUT); + + final int bufferSize = 1024; + final StringBuilder response = new StringBuilder(); + final byte[] buffer = new byte[bufferSize]; + while (true) { + while (in.available() > 0) { + int dataSize = in.read(buffer, 0, bufferSize); + if (dataSize < 0) + break; + + response.append(new String(buffer, 0, dataSize)); + } + + if (execChannel.isClosed()) { + if (in.available() > 0) continue; + Timber.d("SSH command exit status: " + execChannel.getExitStatus()); + break; + } + } + + return response.toString(); + + } catch (JSchException e) { + throw new IOException(e); + } finally { + if (execChannel != null && execChannel.isConnected()) + execChannel.disconnect(); + + if (session != null && session.isConnected()) + session.disconnect(); + } + } + + public boolean downloadFile(String localFile, String remoteFilePath) throws IOException { + return downloadFile(localFile, remoteFilePath, null); + } + + + public boolean downloadFile(String localFile, String remoteFilePath, DownloadListener listener) throws IOException { + if (localFile == null || remoteFilePath == null) + return false; + + Session session = null; + Channel execChannel = null; + FileOutputStream fos = null; + OutputStream out = null; + InputStream in = null; + + try { + + String prefix = null; + if (new File(localFile).isDirectory()) { + prefix = localFile + File.separator; + } + session = getSession(); + + // exec 'scp -f remoteFilePath' remotely + String command = "scp -f " + remoteFilePath; + Channel channel = session.openChannel("exec"); + ((ChannelExec) channel).setCommand(command); + + // get I/O streams for remote scp + out = channel.getOutputStream(); + in = channel.getInputStream(); + + channel.connect(); + byte[] buf = new byte[1024]; + + // send '\0' + buf[0] = 0; + out.write(buf, 0, 1); + out.flush(); + + int c = checkAck(in); + if (c != 'C') { + return false; + } + + // read '0644 ' + in.read(buf, 0, 5); + + long fileSize = 0L; + while (true) { + if (in.read(buf, 0, 1) < 0) { + // error + return false; + } + if (buf[0] == ' ') break; + fileSize = fileSize * 10L + (long) (buf[0] - '0'); + } + + String file = null; + for (int i = 0; ; i++) { + in.read(buf, i, 1); + if (buf[i] == (byte) 0x0a) { + file = new String(buf, 0, i); + break; + } + } + + if (listener != null) + listener.onFileSizeCalculated(fileSize); + // send '\0' + buf[0] = 0; + out.write(buf, 0, 1); + out.flush(); + + // read a content of localFile + fos = new FileOutputStream(prefix == null ? localFile : prefix + file); + int bytesToRead; + long progress = 0; + while (true) { + if (buf.length < fileSize) bytesToRead = buf.length; + else bytesToRead = (int) fileSize; + bytesToRead = in.read(buf, 0, bytesToRead); + if (bytesToRead < 0) { + // error + return false; + } + progress += bytesToRead; + fos.write(buf, 0, bytesToRead); + fileSize -= bytesToRead; + if (fileSize == 0L) break; + + if (listener != null) + listener.onDownloaded(localFile, progress); + + + } + fos.close(); + fos = null; + + if (checkAck(in) != 0) { + return false; + } + + // send '\0' + buf[0] = 0; + out.write(buf, 0, 1); + out.flush(); + + + session.disconnect(); + + } catch (JSchException e) { + throw new IOException(e); + } finally { + if (fos != null) { + fos.close(); + } + + if (out != null) + out.close(); + + if (in != null) + in.close(); + + if (execChannel != null && execChannel.isConnected()) + execChannel.disconnect(); + + if (session != null && session.isConnected()) + session.disconnect(); + } + + return true; + } + + public boolean uploadFile(File localFile, String remoteFilePath, UploadListener listener) throws IOException { + if (localFile == null || !localFile.isFile() || (listener != null && !listener.shouldContinueUpload())) + return false; + + Session session = null; + Channel execChannel = null; + FileInputStream fis = null; + OutputStream out = null; + InputStream in = null; + try { + session = getSession(); + + String command = "scp -t " + remoteFilePath; + execChannel = session.openChannel(EXEC_CHANNEL_TYPE); + ((ChannelExec) execChannel).setCommand(command); + + //Get I/O streams for remote scp + out = execChannel.getOutputStream(); + in = execChannel.getInputStream(); + + execChannel.connect(CONNECTION_TIMEOUT); + + if (checkAck(in) != 0) + return false; + + if (listener != null && !listener.shouldContinueUpload()) + return false; + + //Send "C0644 fileSize filename" + final long fileSize = localFile.length(); + command = "C0644 " + fileSize + " " + localFile.getName() + "\n"; + out.write(command.getBytes()); + out.flush(); + if (checkAck(in) != 0) + return false; + + //Send local file content + final int bufferSize = 8192; + fis = new FileInputStream(localFile); + final byte[] buffer = new byte[bufferSize]; + long uploadedBytesCount = 0; + while (true) { + int len = fis.read(buffer, 0, bufferSize); + if (len <= 0) + break; + + out.write(buffer, 0, len); + uploadedBytesCount += len; + if (listener != null) { + listener.onUploaded(localFile, uploadedBytesCount, fileSize); + + if (!listener.shouldContinueUpload()) + return false; + } + } + + //Send '\0' + out.write(0); + out.flush(); + if (checkAck(in) != 0) + return false; + + return true; + + } catch (JSchException e) { + throw new IOException(e); + } finally { + if (fis != null) { + fis.close(); + } + + if (out != null) + out.close(); + + if (in != null) + in.close(); + + if (execChannel != null && execChannel.isConnected()) + execChannel.disconnect(); + + if (session != null && session.isConnected()) + session.disconnect(); + } + } + + private static int checkAck(InputStream in) throws IOException { + int result = in.read(); + // result may be 0 for success, + // 1 for error, + // 2 for fatal error, + // -1 + + if (result == 1 || result == 2) { + //Log the error + final StringBuilder errorMsg = new StringBuilder(); + int character; + do { + character = in.read(); + errorMsg.append((char) character); + } + while (character != '\n'); + + if (errorMsg.length() > 0) + Timber.e( errorMsg.toString()); + } + + return result; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java new file mode 100644 index 0000000000..6786e322db --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java @@ -0,0 +1,494 @@ +package org.droidplanner.services.android.impl.utils.connection; + +import android.annotation.TargetApi; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.DhcpInfo; +import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.NetworkInfo; +import android.net.NetworkRequest; +import android.net.wifi.ScanResult; +import android.net.wifi.SupplicantState; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.text.TextUtils; +import android.widget.Toast; + +import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import org.droidplanner.services.android.utils.NetworkUtils; + +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +/** + * Used to handle connection with the sololink wifi network. + */ +public class WifiConnectionHandler { + + public interface WifiConnectionListener { + void onWifiConnected(String wifiSsid); + + void onWifiConnecting(); + + void onWifiDisconnected(String prevConnectedSsid); + + void onWifiScanResultsAvailable(List results); + + void onWifiConnectionFailed(LinkConnectionStatus connectionStatus); + } + + public static final String SOLO_LINK_WIFI_PREFIX = "SoloLink_"; + + private static final IntentFilter intentFilter = new IntentFilter(); + + static { + intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); + intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); + intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); + intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); + } + + private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + switch (action) { + + case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION: + notifyWifiScanResultsAvailable(wifiMgr.getScanResults()); + break; + + case WifiManager.SUPPLICANT_STATE_CHANGED_ACTION: + SupplicantState supState = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); + String ssid = NetworkUtils.getCurrentWifiLink(context); + + int supplicationError = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1); + Timber.d("Supplicant state changed error %s with state %s and ssid %s", supplicationError, supState, ssid); + if (supplicationError == WifiManager.ERROR_AUTHENTICATING) { + if (NetworkUtils.isSoloNetwork(ssid)) { + notifyWifiConnectionFailed(); + WifiConfiguration wifiConfig = getWifiConfigs(ssid); + if (wifiConfig != null) { + wifiMgr.removeNetwork(wifiConfig.networkId); + } + } + } + break; + + case WifiManager.NETWORK_STATE_CHANGED_ACTION: + NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); + NetworkInfo.State networkState = netInfo == null + ? NetworkInfo.State.DISCONNECTED + : netInfo.getState(); + + switch (networkState) { + case CONNECTED: + final WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO); + final String wifiSSID = wifiInfo.getSSID(); + Timber.i("Connected to " + wifiSSID); + + final DhcpInfo dhcpInfo = wifiMgr.getDhcpInfo(); + if (dhcpInfo != null) { + Timber.i("Dhcp info: %s", dhcpInfo.toString()); + } else { + Timber.w("Dhcp info is not available."); + } + + if (wifiSSID != null) { + setDefaultNetworkIfNecessary(wifiSSID); + } + break; + + case DISCONNECTED: + Timber.i("Disconnected from wifi network."); + notifyWifiDisconnected(); + break; + + case CONNECTING: + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + NetworkInfo.DetailedState detailedState = netInfo.getDetailedState(); + if (detailedState != null && detailedState == NetworkInfo.DetailedState.VERIFYING_POOR_LINK) { + String connectingSsid = NetworkUtils.getCurrentWifiLink(context); + setDefaultNetworkIfNecessary(connectingSsid); + } + } + Timber.d("Connecting to wifi network."); + notifyWifiConnecting(); + break; + } + break; + + case WifiManager.WIFI_STATE_CHANGED_ACTION: + break; + } + } + }; + + private final Object netReq; + private final Object netReqCb; + + private final AtomicReference connectedWifi = new AtomicReference<>(""); + + private final Context context; + + private final WifiManager wifiMgr; + private final ConnectivityManager connMgr; + + private WifiConnectionListener listener; + + public WifiConnectionHandler(Context context) { + this.context = context; + this.wifiMgr = (WifiManager) this.context.getSystemService(Context.WIFI_SERVICE); + this.connMgr = (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + netReq = new NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .build(); + + netReqCb = new ConnectivityManager.NetworkCallback() { + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private void getNetworkInfo(Network network) { + if (network == null) { + Timber.i("Network is null."); + } else { + Timber.i("Network: %s, active : %s", network, connMgr.isDefaultNetworkActive()); + LinkProperties linkProps = connMgr.getLinkProperties(network); + Timber.i("Network link properties: %s", linkProps.toString()); + Timber.i("Network capabilities: %s", connMgr.getNetworkCapabilities(network)); + } + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + public void onAvailable(Network network) { + //Check if we're still connected to solo. If not, unregister the callbacks + final String currentWifi = getCurrentWifiLink(); + if (!isSoloWifi(currentWifi)) { + resetNetworkBindings(this); + return; + } + + Timber.i("Network %s is available", network); + getNetworkInfo(network); + + final boolean wasBound; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + wasBound = connMgr.bindProcessToNetwork(network); + } else { + wasBound = ConnectivityManager.setProcessDefaultNetwork(network); + } + + if (wasBound) { + Timber.i("Bound process to network %s", network); + notifyWifiConnected(currentWifi); + } else { + Timber.w("Unable to bind process to network %s", network); + } + } + + @Override + public void onLosing(Network network, int maxMsToLive) { + Timber.w("Losing network %s", network); + } + + @Override + public void onLost(Network network) { + Timber.w("Lost network %s", network); + } + + }; + } else { + netReq = null; + netReqCb = null; + } + } + + public void setListener(WifiConnectionListener listener) { + this.listener = listener; + } + + /** + * Start the wifi connection handler process. + * It will start listening for wifi connectivity updates, and will handle them as needed. + */ + public void start() { + this.context.registerReceiver(broadcastReceiver, intentFilter); + } + + /** + * Stop the wifi connection handler process. + */ + public void stop() { + try { + this.context.unregisterReceiver(broadcastReceiver); + } catch (IllegalArgumentException e) { + Timber.w(e, "Receiver was not registered."); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + resetNetworkBindings((ConnectivityManager.NetworkCallback) netReqCb); + } + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private void resetNetworkBindings(ConnectivityManager.NetworkCallback netCb) { + Timber.i("Unregistering network callbacks."); + + connectedWifi.set(NetworkUtils.getCurrentWifiLink(context)); + try { + connMgr.unregisterNetworkCallback(netCb); + } catch (IllegalArgumentException e) { + Timber.w(e, "Network callback was not registered."); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + connMgr.bindProcessToNetwork(null); + } else { + ConnectivityManager.setProcessDefaultNetwork(null); + } + } + + /** + * Query available wifi networks + */ + public boolean refreshWifiAPs() { + Timber.d("Querying wifi access points."); + if (wifiMgr == null) { + return false; + } + + if (!wifiMgr.isWifiEnabled() && !wifiMgr.setWifiEnabled(true)) { + Toast.makeText(context, "Unable to activate Wi-Fi!", Toast.LENGTH_LONG).show(); + return false; + } + + return wifiMgr.startScan(); + } + + public boolean isOnNetwork(String wifiSsid) { + if (TextUtils.isEmpty(wifiSsid)) { + throw new IllegalArgumentException("Invalid wifi ssid " + wifiSsid); + } + + return wifiSsid.equalsIgnoreCase(getCurrentWifiLink()); + } + + public boolean isConnected(String wifiSSID) { + if (!isOnNetwork(wifiSSID)) { + return false; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Network network; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + network = connMgr.getBoundNetworkForProcess(); + } else { + network = ConnectivityManager.getProcessDefaultNetwork(); + } + + if (network == null) { + return false; + } + + NetworkCapabilities netCapabilities = connMgr.getNetworkCapabilities(network); + return netCapabilities != null && netCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI); + } else { + return true; + } + } + + public List getScanResults() { + return wifiMgr.getScanResults(); + } + + public int connectToWifi(String soloLinkId, String password) { + if (TextUtils.isEmpty(soloLinkId)) { + return LinkConnectionStatus.INVALID_CREDENTIALS; + } + + ScanResult targetScanResult = null; + final List scanResults = wifiMgr.getScanResults(); + for (ScanResult result : scanResults) { + if (result.SSID.equalsIgnoreCase(soloLinkId)) { + targetScanResult = result; + break; + } + } + + if (targetScanResult == null) { + Timber.i("No matching scan result was found for id %s", soloLinkId); + return LinkConnectionStatus.LINK_UNAVAILABLE; + } + + return connectToWifi(targetScanResult, password); + } + + public int connectToWifi(ScanResult scanResult, String password) { + if (scanResult == null) { + return LinkConnectionStatus.LINK_UNAVAILABLE; + } + + Timber.d("Connecting to wifi " + scanResult.SSID); + + + //Check if we're already connected to the given network. + if (isConnected(scanResult.SSID)) { + Timber.d("Already connected to " + scanResult.SSID); + + notifyWifiConnected(scanResult.SSID); + return 0; + } else if (isOnNetwork(scanResult.SSID)) { + setDefaultNetworkIfNecessary(scanResult.SSID); + return 0; + + } + + WifiConfiguration wifiConfig = getWifiConfigs(scanResult.SSID); + + //Network is not configured and needs a password to connect + if (wifiConfig == null) { + Timber.d("Connecting to closed wifi network."); + if (TextUtils.isEmpty(password)) { + return LinkConnectionStatus.INVALID_CREDENTIALS; + } + + if (!connectToClosedWifi(scanResult, password)) { + return LinkConnectionStatus.UNKNOWN; + } + + wifiMgr.saveConfiguration(); + wifiConfig = getWifiConfigs(scanResult.SSID); + } + + if (wifiConfig != null) { + wifiMgr.enableNetwork(wifiConfig.networkId, true); + return 0; + } + return LinkConnectionStatus.UNKNOWN; + } + + private WifiConfiguration getWifiConfigs(String networkSSID) { + List networks = wifiMgr.getConfiguredNetworks(); + if (networks == null) { + return null; + } + + for (WifiConfiguration current : networks) { + if (current.SSID != null && current.SSID.equals("\"" + networkSSID + "\"")) { + return current; + } + } + + return null; + } + + private boolean connectToClosedWifi(ScanResult scanResult, String password) { + final WifiConfiguration wifiConf = new WifiConfiguration(); + wifiConf.SSID = "\"" + scanResult.SSID + "\""; //Please note the quotes. String should contain ssid in quotes. + wifiConf.preSharedKey = "\"" + password + "\""; + + final int netId = wifiMgr.addNetwork(wifiConf); + if (netId == -1) { + Timber.e("Unable to add wifi configuration for %s", scanResult.SSID); + return false; + } + + return true; + } + + private static String trimWifiSsid(String wifiSsid) { + if (TextUtils.isEmpty(wifiSsid)) { + return ""; + } + + return wifiSsid.replace("\"", ""); + } + + private String getCurrentWifiLink() { + return getCurrentWifiLink(wifiMgr); + } + + public static String getCurrentWifiLink(WifiManager wifiMgr) { + final WifiInfo connectedWifi = wifiMgr.getConnectionInfo(); + final String connectedSSID = connectedWifi == null ? null : connectedWifi.getSSID(); + return trimWifiSsid(connectedSSID); + } + + public static boolean isSoloWifi(String wifiSsid) { + return !TextUtils.isEmpty(wifiSsid) && wifiSsid.startsWith(SOLO_LINK_WIFI_PREFIX); + } + + private void setDefaultNetworkIfNecessary(String wifiSsid) { + final String trimmedSsid = trimWifiSsid(wifiSsid); + + if (!trimmedSsid.equals(connectedWifi.get())) { + connectedWifi.set(trimmedSsid); + + if (isConnected(wifiSsid)) { + notifyWifiConnected(wifiSsid); + return; + } + + if (isSoloWifi(trimmedSsid)) { + //Attempt to connect to the vehicle. + Timber.i("Requesting route to sololink network"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + connMgr.requestNetwork((NetworkRequest) netReq, (ConnectivityManager.NetworkCallback) netReqCb); + } else { + notifyWifiConnected(trimmedSsid); + + } + } else { + notifyWifiConnected(trimmedSsid); + } + } + } + + private void notifyWifiConnected(String wifiSsid) { + if (listener != null) { + listener.onWifiConnected(wifiSsid); + } + } + + private void notifyWifiConnecting() { + if (listener != null) { + listener.onWifiConnecting(); + } + } + + private void notifyWifiDisconnected() { + if (listener != null) { + listener.onWifiDisconnected(connectedWifi.get()); + } + connectedWifi.set(""); + } + + private void notifyWifiScanResultsAvailable(List results) { + if (listener != null) { + listener.onWifiScanResultsAvailable(results); + } + } + + private void notifyWifiConnectionFailed() { + if (listener != null) { + LinkConnectionStatus linkConnectionStatus = LinkConnectionStatus + .newFailedConnectionStatus(LinkConnectionStatus.INVALID_CREDENTIALS, null); + listener.onWifiConnectionFailed(linkConnectionStatus); + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/AssetUtil.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/AssetUtil.java new file mode 100644 index 0000000000..6ac1e9197a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/AssetUtil.java @@ -0,0 +1,17 @@ +package org.droidplanner.services.android.impl.utils.file; + +import android.content.res.AssetManager; + +import java.io.IOException; + +public class AssetUtil { + + public static boolean exists(AssetManager assetManager, String directory, String fileName) + throws IOException { + final String[] assets = assetManager.list(directory); + for (String asset : assets) + if (asset.equals(fileName)) + return true; + return false; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/DirectoryPath.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/DirectoryPath.java new file mode 100644 index 0000000000..505b74f30c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/DirectoryPath.java @@ -0,0 +1,66 @@ +package org.droidplanner.services.android.impl.utils.file; + +import android.content.Context; +import android.os.Environment; + +import java.io.File; + +public class DirectoryPath { + + /** + * Main path used to store private data files related to the program + * + * @return Path to 3DR Services private data folder in external storage + */ + static public String getPrivateDataPath(Context context) { + File dataDir = context.getExternalFilesDir(null); + return dataDir.getAbsolutePath(); + } + + /** + * Main path used to store public data files related to the app. + * @param context application context + * @return Path to 3DR Services public data directory. + */ + public static String getPublicDataPath(Context context){ + final String root = Environment.getExternalStorageDirectory().getPath(); + return root + "/3DRServices/"; + } + + /** + * Folder where telemetry log files are stored + */ + static public File getTLogPath(Context context, String appId) { + File f = new File(getPrivateDataPath(context) + "/tlogs/" + appId); + if(!f.exists()) { + f.mkdirs(); + } + return f; + } + + /** + * After tlogs are uploaded they get moved to this directory + */ + static public File getTLogSentPath(Context context, String appId) { + File f = new File(getTLogPath(context, appId) + "/sent/"); + if(!f.exists()) { + f.mkdirs(); + } + return f; + } + + /** + * Storage folder for user camera description files + */ + public static String getCameraInfoPath(Context context) { + return getPublicDataPath(context) + "/CameraInfo/"; + } + + /** + * Storage folder for stacktraces + */ + public static String getCrashLogPath(Context context) { + return getPrivateDataPath(context) + "/crash_log/"; + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/FileUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/FileUtils.java new file mode 100644 index 0000000000..53fad39d27 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/FileUtils.java @@ -0,0 +1,80 @@ +package org.droidplanner.services.android.impl.utils.file; + +import android.content.Context; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class FileUtils { + + public static final String CAMERA_FILENAME_EXT = ".xml"; + + public static final String TLOG_FILENAME_EXT = ".tlog"; + + public static File[] getCameraInfoFileList(Context context) { + FilenameFilter filter = new FilenameFilter() { + @Override + public boolean accept(File dir, String filename) { + return filename.contains(CAMERA_FILENAME_EXT); + } + }; + return getFileList(DirectoryPath.getCameraInfoPath(context), filter); + } + + public static File[] getTLogFileList(Context context, String appId) { + final FilenameFilter tlogFilter = new FilenameFilter() { + public boolean accept(File dir, String filename) { + return filename.endsWith(TLOG_FILENAME_EXT); + } + }; + + File[] unsentFiles = getFileList(DirectoryPath.getTLogPath(context, appId).getPath(), tlogFilter); + File[] sentFiles = getFileList(DirectoryPath.getTLogSentPath(context, appId).getPath(), tlogFilter); + File[] tlogFiles = new File[unsentFiles.length + sentFiles.length]; + + int i = 0; + for(File file : unsentFiles) + tlogFiles[i++] = file; + + for(File file : sentFiles) + tlogFiles[i++] = file; + + return tlogFiles; + } + + static public File[] getFileList(String path, FilenameFilter filter) { + File mPath = new File(path); + if(!mPath.exists()) + return new File[0]; + + return mPath.listFiles(filter); + } + + public static FileOutputStream getExceptionFileStream(Context context) throws FileNotFoundException { + File myDir = new File(DirectoryPath.getCrashLogPath(context)); + if (!myDir.exists()) + myDir.mkdirs(); + + File file = new File(myDir, getTimeStamp() + ".log"); + if (file.exists()) + file.delete(); + return new FileOutputStream(file); + } + + /** + * Timestamp for logs in the Mission Planner Format + */ + static public String getTimeStamp(long timestamp) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.US); + return sdf.format(new Date(timestamp)); + } + + static public String getTimeStamp() { + return getTimeStamp(System.currentTimeMillis()); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java new file mode 100644 index 0000000000..6c0f11ee8c --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java @@ -0,0 +1,92 @@ +package org.droidplanner.services.android.impl.utils.file.IO; + +import android.content.Context; + +import org.droidplanner.services.android.core.survey.CameraInfo; +import org.droidplanner.services.android.utils.file.FileUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +public class CameraInfoLoader { + + private static final String CAMERA_INFO_ASSESTS_FOLDER = "CameraInfo"; + private Context context; + private HashMap filesInSdCard = new HashMap(); + private HashMap filesInAssets = new HashMap(); + + public CameraInfoLoader(Context context) { + this.context = context; + } + + public CameraInfo openFile(String file) throws Exception { + if (filesInSdCard.containsKey(file)) { + return readSdCardFile(file); + } else if (filesInAssets.containsKey(file)) { + return readAssetsFile(file); + } else { + throw new FileNotFoundException(); + } + } + + private CameraInfo readSdCardFile(String file) throws Exception { + CameraInfoReader reader = new CameraInfoReader(); + InputStream inputStream = new FileInputStream(filesInSdCard.get(file)); + reader.openFile(inputStream); + inputStream.close(); + return reader.getCameraInfo(); + } + + private CameraInfo readAssetsFile(String file) throws Exception { + CameraInfoReader reader = new CameraInfoReader(); + InputStream inputStream = context.getAssets().open(filesInAssets.get(file)); + reader.openFile(inputStream); + inputStream.close(); + return reader.getCameraInfo(); + } + + public List getCameraInfoList() { + ArrayList avaliableCameras = new ArrayList(); + List cameraInfoListFromStorage = getCameraInfoListFromStorage(); + avaliableCameras.addAll(cameraInfoListFromStorage); + List cameraInfoListFromAssets = getCameraInfoListFromAssets(); + avaliableCameras.addAll(cameraInfoListFromAssets); + return avaliableCameras; + } + + private List getCameraInfoListFromAssets() { + try { + String[] list = context.getAssets().list(CAMERA_INFO_ASSESTS_FOLDER); + filesInAssets.clear(); + for (String string : list) { + filesInAssets.put(string, CAMERA_INFO_ASSESTS_FOLDER + "/" + string); + } + return Arrays.asList(list); + + } catch (IOException e) { + return new ArrayList(); + } + } + + private List getCameraInfoListFromStorage() { + List filesName = new ArrayList<>(); + filesInSdCard.clear(); + + File[] filesList = FileUtils.getCameraInfoFileList(this.context); + if(filesList != null && filesList.length > 0) { + for (File file : filesList) { + final String filename = file.getName(); + filesName.add(filename); + filesInSdCard.put(filename, file.getAbsolutePath()); + } + } + return filesName; + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java new file mode 100644 index 0000000000..2a68aee35d --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java @@ -0,0 +1,117 @@ +package org.droidplanner.services.android.impl.utils.file.IO; + +import android.util.Xml; + +import org.droidplanner.services.android.core.survey.CameraInfo; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Class to parse a Kml file, based on the code from + * http://developer.android.com/training/basics/network-ops/xml.html + * + */ +public class CameraInfoReader { + + private XmlPullParser parser; + + private CameraInfo cameraInfo = new CameraInfo(); + + public void openFile(InputStream inputStream) throws Exception { + parse(inputStream); + inputStream.close(); + } + + public CameraInfo getCameraInfo() { + return cameraInfo; + } + + public void parse(InputStream in) throws XmlPullParserException, IOException { + parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(in, null); + parser.nextTag(); + readCameraInfo(); + } + + private void readCameraInfo() throws XmlPullParserException, IOException { + + parser.require(XmlPullParser.START_TAG, null, "cameraInfo"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // Starts by looking for the entry tag + if (name.equals("SensorWidth")) { + cameraInfo.sensorWidth = readDouble("SensorWidth"); + } else if (name.equals("SensorHeight")) { + cameraInfo.sensorHeight = readDouble("SensorHeight"); + } else if (name.equals("SensorResolution")) { + cameraInfo.sensorResolution = readDouble("SensorResolution"); + } else if (name.equals("FocalLength")) { + cameraInfo.focalLength = readDouble("FocalLength"); + } else if (name.equals("Overlap")) { + cameraInfo.overlap = readDouble("Overlap"); + } else if (name.equals("Sidelap")) { + cameraInfo.sidelap = readDouble("Sidelap"); + } else if (name.equals("Name")) { + cameraInfo.name = readString("Name"); + } else if (name.equals("Orientation")) { + cameraInfo.isInLandscapeOrientation = !readText().equals("Portrait"); + } else { + skip(); + } + } + } + + private String readString(String entry) throws IOException, XmlPullParserException { + parser.require(XmlPullParser.START_TAG, null, entry); + String value = readText(); + parser.require(XmlPullParser.END_TAG, null, entry); + return value; + } + + private Double readDouble(String entry) throws IOException, XmlPullParserException { + parser.require(XmlPullParser.START_TAG, null, entry); + Double value = Double.valueOf(readText()); + parser.require(XmlPullParser.END_TAG, null, entry); + return value; + } + + // For the tags title and summary, extracts their text values. + private String readText() throws IOException, XmlPullParserException { + String result = ""; + if (parser.next() == XmlPullParser.TEXT) { + result = parser.getText(); + parser.nextTag(); + } + return result; + } + + // Skips tags the parser isn't interested in. Uses depth to handle + // nested tags. i.e., + // if the next tag after a START_TAG isn't a matching END_TAG, it keeps + // going until it + // finds the matching END_TAG (as indicated by the value of "depth" + // being 0). + private void skip() throws XmlPullParserException, IOException { + if (parser.getEventType() != XmlPullParser.START_TAG) { + throw new IllegalStateException(); + } + int depth = 1; + while (depth != 0) { + switch (parser.next()) { + case XmlPullParser.END_TAG: + depth--; + break; + case XmlPullParser.START_TAG: + depth++; + break; + } + } + } +} \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java new file mode 100644 index 0000000000..0fb67ec23a --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java @@ -0,0 +1,28 @@ +package org.droidplanner.services.android.impl.utils.file.IO; + +import android.content.Context; + +import org.droidplanner.services.android.utils.file.FileUtils; + +import java.io.PrintStream; + +public class ExceptionWriter { + private final Context context; + + public ExceptionWriter(Context context) { + this.context = context; + } + + public void saveStackTraceToSD(Throwable exception) { + if(exception == null) + return; + + try { + PrintStream out = new PrintStream(FileUtils.getExceptionFileStream(context)); + exception.printStackTrace(out); + out.close(); + } catch (Exception excep) { + excep.printStackTrace(); + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java new file mode 100644 index 0000000000..4d493a5fea --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java @@ -0,0 +1,113 @@ +package org.droidplanner.services.android.impl.utils.file.IO; + +import android.content.Context; +import android.util.Xml; + +import org.droidplanner.services.android.core.drone.profiles.ParameterMetadata; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +/** + * Created by fhuya on 10/29/14. + */ +public class ParameterMetadataLoader { + + private static final String PARAMETERMETADATA_PATH = "Parameters/ParameterMetaData.xml"; + + private static final String METADATA_DISPLAYNAME = "DisplayName"; + private static final String METADATA_DESCRIPTION = "Description"; + private static final String METADATA_UNITS = "Units"; + private static final String METADATA_VALUES = "Values"; + private static final String METADATA_RANGE = "Range"; + + public static void load(Context context, String metadataType, Map metadata) + throws IOException, XmlPullParserException { + InputStream inputStream = context.getAssets().open(PARAMETERMETADATA_PATH); + open(inputStream, metadataType, metadata); + } + + private static void open(InputStream inputStream, String metadataType, Map metadataMap) + throws XmlPullParserException, IOException { + try { + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(inputStream, null); + parseMetadata(parser, metadataType, metadataMap); + + } finally { + try { + inputStream.close(); + } catch (IOException e) { /* nop */ + } + } + } + + private static void parseMetadata(XmlPullParser parser, String metadataType, Map metadataMap) + throws XmlPullParserException, IOException { + String name; + boolean parsing = false; + ParameterMetadata metadata = null; + metadataMap.clear(); + + int eventType = parser.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + + switch (eventType) { + case XmlPullParser.START_TAG: + name = parser.getName(); + // name == metadataType: start collecting metadata(s) + // metadata == null: create new metadata w/ name + // metadata != null: add to metadata as property + if (metadataType.equals(name)) { + parsing = true; + } else if (parsing) { + if (metadata == null) { + metadata = new ParameterMetadata(); + metadata.setName(name); + } else { + addMetaDataProperty(metadata, name, parser.nextText()); + } + } + break; + + case XmlPullParser.END_TAG: + name = parser.getName(); + // name == metadataType: done + // name == metadata.name: add metadata to metadataMap + if (metadataType.equals(name)) { + return; + } else if (metadata != null && metadata.getName().equals(name)) { + metadataMap.put(metadata.getName(), metadata); + metadata = null; + } + break; + } + eventType = parser.next(); + } + // no metadata + } + + private static void addMetaDataProperty(ParameterMetadata metaData, String name, String text) { + switch (name) { + case METADATA_DISPLAYNAME: + metaData.setDisplayName(text); + break; + case METADATA_DESCRIPTION: + metaData.setDescription(text); + break; + case METADATA_UNITS: + metaData.setUnits(text); + break; + case METADATA_RANGE: + metaData.setRange(text); + break; + case METADATA_VALUES: + metaData.setValues(text); + break; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java new file mode 100644 index 0000000000..20cb4d47ab --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java @@ -0,0 +1,142 @@ +package org.droidplanner.services.android.impl.utils.file.IO; + +import android.content.Context; +import android.content.res.AssetManager; +import android.util.Xml; + +import org.droidplanner.services.android.core.drone.profiles.VehicleProfile; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.utils.file.AssetUtil; +import org.droidplanner.services.android.utils.file.DirectoryPath; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +public class VehicleProfileReader { + private static final String VEHICLEPROFILE_PATH = "VehicleProfiles"; + + // vehicle profile tags + private static final String TAG_METADATATYPE = "ParameterMetadataType"; + + // default tags + private static final String TAG_DEFAULT = "Default"; + private static final String ATTR_WPNAV_SPEED = "wpNavSpeed"; + private static final String ATTR_MAX_ALTITUDE = "maxAltitude"; + + private static final String ATTR_TYPE = "type"; + + /** + * Load/aggregate profile from resources and file (if available) File will + * override resource settings + */ + public static VehicleProfile load(Context context, FirmwareType vehicleType) { + final String fileName = vehicleType + ".xml"; + final String path = VEHICLEPROFILE_PATH + File.separator + fileName; + + try { + VehicleProfile newProfile = new VehicleProfile(); + + File file = new File(DirectoryPath.getPublicDataPath(context) + path); + if (file.exists()) { + loadProfileFromFile(newProfile, file); + } else { + loadProfileFromResources(context, fileName, path, newProfile); + } + return newProfile; + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private static void loadProfileFromFile(final VehicleProfile newProfile, final File file) + throws FileNotFoundException, XmlPullParserException, IOException { + final InputStream inputStream = new FileInputStream(file); + VehicleProfileReader.open(inputStream, newProfile); + } + + private static void loadProfileFromResources(Context context, final String fileName, + final String path, final VehicleProfile newProfile) throws IOException, + XmlPullParserException { + final AssetManager assetManager = context.getAssets(); + if (AssetUtil.exists(assetManager, VEHICLEPROFILE_PATH, fileName)) { + final InputStream inputStream = assetManager.open(path); + VehicleProfileReader.open(inputStream, newProfile); + } + } + + private static void open(InputStream inputStream, VehicleProfile profile) + throws XmlPullParserException, IOException { + try { + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(inputStream, null); + parse(parser, profile); + + } finally { + try { + inputStream.close(); + } catch (IOException e) { /* nop */ + } + } + } + + private static void parse(XmlPullParser parser, VehicleProfile profile) + throws XmlPullParserException, IOException { + + int eventType = parser.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + + final String parserName = parser.getName(); + switch (eventType) { + case XmlPullParser.START_TAG: + if (parserName.equals(TAG_METADATATYPE)) { + // set metadata type + final String value = parser.getAttributeValue(null, ATTR_TYPE); + if (value != null) + profile.setParameterMetadataType(value); + + } else if (parserName.equals(TAG_DEFAULT)) { + // set defaults + parseDefault(parser, profile.getDefault()); + + } + break; + + case XmlPullParser.END_TAG: + break; + } + eventType = parser.next(); + } + } + + // parse Default + private static void parseDefault(XmlPullParser parser, VehicleProfile.Default default_) { + // wpNavSpeed + String value = parser.getAttributeValue(null, ATTR_WPNAV_SPEED); + if (value != null) + default_.setWpNavSpeed(parseInt(value)); + + // maxAltitude + value = parser.getAttributeValue(null, ATTR_MAX_ALTITUDE); + if (value != null) + default_.setMaxAltitude(parseInt(value)); + } + + private static int parseInt(String str) { + if (str == null) + return 0; + + try { + return Integer.parseInt(str); + } catch (NumberFormatException e) { + return 0; + } + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java new file mode 100644 index 0000000000..55793d4bc7 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java @@ -0,0 +1,50 @@ +package org.droidplanner.services.android.impl.utils.prefs; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import org.droidplanner.services.android.core.drone.profiles.VehicleProfile; +import org.droidplanner.services.android.core.drone.variables.StreamRates.Rates; +import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.utils.file.IO.VehicleProfileReader; + +/** + * Provides structured access to 3DR Services preferences + *

+ * Over time it might be good to move the various places that are doing + * prefs.getFoo(blah, default) here - to collect prefs in one place and avoid + * duplicating string constants (which tend to become stale as code evolves). + * This is called the DRY (don't repeat yourself) principle of software + * development. + */ +public class DroidPlannerPrefs implements org.droidplanner.services.android.core.drone.Preferences { + + public static final int DEFAULT_STREAM_RATE = 2; //Hz + + private final SharedPreferences prefs; + private final Context context; + + public DroidPlannerPrefs(Context context) { + this.context = context; + prefs = PreferenceManager.getDefaultSharedPreferences(context); + } + + @Override + public VehicleProfile loadVehicleProfile(FirmwareType firmwareType) { + return VehicleProfileReader.load(context, firmwareType); + } + + @Override + public Rates getRates() { + return new Rates(DEFAULT_STREAM_RATE); + } + + /** + * @return true if google analytics reporting is enabled. + */ + public boolean isUsageStatisticsEnabled() { + return prefs.getBoolean("pref_usage_statistics", true); + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java new file mode 100644 index 0000000000..ea36cb86fa --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java @@ -0,0 +1,221 @@ +package org.droidplanner.services.android.impl.utils.video; + +import android.content.Context; +import android.media.MediaScannerConnection; +import android.net.Uri; +import android.os.Environment; +import android.text.TextUtils; + +import com.coremedia.iso.boxes.Container; +import com.googlecode.mp4parser.FileDataSourceImpl; +import com.googlecode.mp4parser.authoring.Movie; +import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; +import com.googlecode.mp4parser.authoring.tracks.h264.H264TrackImpl; + +import org.droidplanner.android.client.utils.video.MediaCodecManager; +import org.droidplanner.android.client.utils.video.NaluChunk; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +/** + * Created by Fredia Huya-Kouadio on 11/22/15. + */ +class StreamRecorder implements MediaCodecManager.NaluChunkListener{ + + private final AtomicReference recordingFilename = new AtomicReference<>(); + private final AtomicBoolean areParametersSet = new AtomicBoolean(false); + + private final File mediaRootDir; + private final Context context; + + private final MediaScannerConnection.OnScanCompletedListener scanCompletedListener = new MediaScannerConnection.OnScanCompletedListener() { + @Override + public void onScanCompleted(String path, Uri uri) { + Timber.i("Media file %s was scanned successfully: %s", path, uri); + } + }; + + private ExecutorService asyncExecutor; + + private BufferedOutputStream h264Writer; + + StreamRecorder(Context context) { + this.context = context; + this.mediaRootDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_MOVIES), "stream"); + if (!this.mediaRootDir.exists()) { + this.mediaRootDir.mkdirs(); + } + } + + String getRecordingFilename(){ + return recordingFilename.get(); + } + + void startConverterThread() { + if (asyncExecutor == null || asyncExecutor.isShutdown()) { + asyncExecutor = Executors.newSingleThreadExecutor(); + } + } + + void stopConverterThread() { + if (asyncExecutor != null) + asyncExecutor.shutdown(); + } + + boolean isRecordingEnabled() { + return !TextUtils.isEmpty(recordingFilename.get()); + } + + boolean enableRecording(String mediaFilename) { + if (!isRecordingEnabled()) { + areParametersSet.set(false); + recordingFilename.set(mediaFilename); + + Timber.i("Enabling local recording to %s", mediaFilename); + File h264File = new File(mediaRootDir, mediaFilename); + if (h264File.exists()) + h264File.delete(); + + try { + h264Writer = new BufferedOutputStream(new FileOutputStream(h264File)); + return true; + } catch (FileNotFoundException e) { + Timber.e(e, e.getMessage()); + recordingFilename.set(null); + return false; + } + } else { + Timber.w("Video stream recording is already enabled"); + return false; + } + } + + boolean disableRecording() { + if (isRecordingEnabled()) { + Timber.i("Disabling local recording"); + + //Close the Buffered output stream + if (h264Writer != null) { + try { + h264Writer.close(); + } catch (IOException e) { + Timber.e(e, e.getMessage()); + } finally { + h264Writer = null; + + //Kickstart conversion of the h264 file to mp4. + convertToMp4(recordingFilename.get()); + + recordingFilename.set(null); + } + } + } + + areParametersSet.set(false); + + return true; + } + + //TODO: Maybe put this on a background thread to avoid blocking on the write to file. + @Override + public void onNaluChunkUpdated(NaluChunk parametersSet, NaluChunk dataChunk) { + if (isRecordingEnabled() && h264Writer != null) { + if(areParametersSet.get()) { + try { + writeNaluChunk(h264Writer, dataChunk); + } catch (IOException e) { + Timber.e(e, e.getMessage()); + } + } + else{ + try { + areParametersSet.set(writeNaluChunk(h264Writer, parametersSet)); + } catch (IOException e) { + Timber.e(e, e.getMessage()); + } + } + } + } + + private boolean writeNaluChunk(BufferedOutputStream bos, NaluChunk naluChunk) throws IOException { + if(naluChunk == null) + return false; + + int payloadCount = naluChunk.payloads.length; + for (int i = 0; i < payloadCount; i++) { + ByteBuffer payload = naluChunk.payloads[i]; + + if (payload.capacity() == 0) + continue; + + final int dataLength = payload.position(); + byte[] payloadData = payload.array(); + bos.write(payloadData, 0, dataLength); + } + + return true; + } + + void convertToMp4(final String filename) { + if (TextUtils.isEmpty(filename)) { + Timber.w("Invalid media filename."); + return; + } + + final File rawMedia = new File(mediaRootDir, filename); + if (!rawMedia.exists()) { + Timber.w("Media file doesn't exists."); + return; + } + + if(rawMedia.length() == 0){ + Timber.w("Media file is empty."); + return; + } + + asyncExecutor.execute(new Runnable() { + @Override + public void run() { + Timber.i("Starting h264 conversion process for media file %s.", filename); + + try { + H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl(rawMedia)); + Movie movie = new Movie(); + movie.addTrack(h264Track); + Container mp4File = new DefaultMp4Builder().build(movie); + + File dstDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); + File mp4Media = new File(dstDir, filename + ".mp4"); + Timber.i("Generating the mp4 file @ %s", mp4Media.getAbsolutePath()); + FileChannel fc = new FileOutputStream(mp4Media).getChannel(); + mp4File.writeContainer(fc); + fc.close(); + + //Delete the h264 file. + Timber.i("Deleting raw h264 media file."); + rawMedia.delete(); + + //Add the generated file to the mediastore + Timber.i("Adding the generated mp4 file to the media store."); + MediaScannerConnection.scanFile(context, + new String[]{mp4Media.getAbsolutePath()}, null, scanCompletedListener); + + } catch (IOException | NullPointerException e) { + Timber.e(e, e.getMessage()); + } + } + }); + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java new file mode 100644 index 0000000000..5d59c6504e --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java @@ -0,0 +1,514 @@ +package org.droidplanner.services.android.impl.utils.video; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.RemoteException; +import android.text.TextUtils; +import android.util.Log; +import android.view.Surface; + +import org.droidplanner.android.client.utils.connection.AbstractIpConnection; +import org.droidplanner.android.client.utils.connection.IpConnectionListener; +import org.droidplanner.android.client.utils.connection.UdpConnection; +import org.droidplanner.android.client.utils.video.DecoderListener; +import org.droidplanner.android.client.utils.video.MediaCodecManager; +import org.droidplanner.services.android.lib.drone.action.CameraActions; +import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; +import org.droidplanner.services.android.lib.model.ICommandListener; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import timber.log.Timber; + +/** + * Handles the video stream from artoo. + */ +public class VideoManager implements IpConnectionListener { + private static final String TAG = VideoManager.class.getSimpleName(); + + private static final SimpleDateFormat FILE_DATE_FORMAT = + new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.US); + + private static final String NO_VIDEO_OWNER = "no_video_owner"; + + protected static final long RECONNECT_COUNTDOWN = 1000l; //ms + + public static final int ARTOO_UDP_PORT = 5600; + private static final int UDP_BUFFER_SIZE = 1500; + + private final AtomicBoolean videoStreamObserverUsed = new AtomicBoolean(false); + + public interface LinkListener { + void onLinkConnected(); + + void onLinkDisconnected(); + } + + private final Runnable reconnectTask = new Runnable() { + @Override + public void run() { + handler.removeCallbacks(reconnectTask); + if(linkConn != null) + linkConn.connect(); + } + }; + + private LinkListener linkListener; + + protected final Handler handler; + private final AtomicBoolean isStarted = new AtomicBoolean(false); + private final AtomicBoolean wasConnected = new AtomicBoolean(false); + + private final AtomicReference videoOwnerId = new AtomicReference<>(NO_VIDEO_OWNER); + private final AtomicReference videoTagRef = new AtomicReference<>(""); + + protected UdpConnection linkConn; + + private final MediaCodecManager mediaCodecManager; + private final StreamRecorder streamRecorder; + + private int linkPort = -1; + + public VideoManager(Context context, Handler handler) { + this.streamRecorder = new StreamRecorder(context); + + this.handler = handler; + this.mediaCodecManager = new MediaCodecManager(handler); + this.mediaCodecManager.setNaluChunkListener(streamRecorder); + } + + private void enableLocalRecording(String filename) { + streamRecorder.enableRecording(filename); + } + + private void disableLocalRecording() { + streamRecorder.disableRecording(); + } + + public void startDecoding(final int udpPort, final Surface surface, final DecoderListener listener) { + start(udpPort, null); + + final Surface currentSurface = mediaCodecManager.getSurface(); + if (surface == currentSurface) { + if (listener != null) + listener.onDecodingStarted(); + return; + } + + // Stop any in progress decoding. + Log.i(TAG, "Setting up video stream decoding."); + mediaCodecManager.stopDecoding(new DecoderListener() { + @Override + public void onDecodingStarted() { + } + + @Override + public void onDecodingError() { + } + + @Override + public void onDecodingEnded() { + try { + Log.i(TAG, "Video decoding set up complete. Starting..."); + mediaCodecManager.startDecoding(surface, listener); + } catch (IOException | IllegalStateException e) { + Log.e(TAG, "Unable to create media codec.", e); + if (listener != null) + listener.onDecodingError(); + } + } + }); + } + + public void reset() { + Timber.d("Resetting video tag (%s) and owner id (%s)", videoTagRef.get(), videoOwnerId.get()); + videoTagRef.set(""); + videoOwnerId.set(NO_VIDEO_OWNER); + + disableLocalRecording(); + + stopDecoding(null); + } + + public void stopDecoding(DecoderListener listener) { + Log.i(TAG, "Aborting video decoding process."); + mediaCodecManager.stopDecoding(listener); + + stop(); + } + + public boolean isLinkConnected() { + return this.linkConn != null && this.linkConn.getConnectionStatus() == AbstractIpConnection.STATE_CONNECTED; + } + + private void start(int udpPort, LinkListener listener) { + if (this.linkConn == null || udpPort != this.linkPort){ + if (isStarted.get()){ + stop(); + } + + this.linkConn = new UdpConnection(handler, udpPort, UDP_BUFFER_SIZE, true, 42); + this.linkConn.setIpConnectionListener(this); + this.linkPort = udpPort; + } + + Log.d(TAG, "Starting video manager"); + handler.removeCallbacks(reconnectTask); + + isStarted.set(true); + this.streamRecorder.startConverterThread(); + this.linkConn.connect(); + this.linkListener = listener; + } + + private void stop() { + Log.d(TAG, "Stopping video manager"); + + handler.removeCallbacks(reconnectTask); + + isStarted.set(false); + + if(this.linkConn != null) { + //Break the link + this.linkConn.disconnect(); + this.linkConn = null; + } + + this.linkPort = -1; + + this.streamRecorder.stopConverterThread(); + } + + @Override + public void onIpConnected() { + Log.d(TAG, "Connected to video stream"); + + handler.removeCallbacks(reconnectTask); + wasConnected.set(true); + + if (linkListener != null) + linkListener.onLinkConnected(); + } + + @Override + public void onIpDisconnected() { + Log.d(TAG, "Video stream disconnected"); + + if (isStarted.get()) { + if (shouldReconnect()) { + //Try to reconnect + handler.postDelayed(reconnectTask, RECONNECT_COUNTDOWN); + } + + if (linkListener != null && wasConnected.get()) + linkListener.onLinkDisconnected(); + + wasConnected.set(false); + } + } + + @Override + public void onPacketReceived(ByteBuffer packetBuffer) { + if (!videoStreamObserverUsed.get()) { + // Feed this data stream to the decoder. + mediaCodecManager.onInputDataReceived(packetBuffer.array(), packetBuffer.limit()); + } + } + + protected void postSuccessEvent(final ICommandListener listener) { + if (handler != null && listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onSuccess(); + } catch (RemoteException e) { + Log.e(TAG, e.getMessage(), e); + } + } + }); + } + } + + protected void postTimeoutEvent(final ICommandListener listener) { + if (handler != null && listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onTimeout(); + } catch (RemoteException e) { + Log.e(TAG, e.getMessage(), e); + } + } + }); + } + } + + protected void postErrorEvent(final int error, final ICommandListener listener) { + if (handler != null && listener != null) { + handler.post(new Runnable() { + @Override + public void run() { + try { + listener.onError(error); + } catch (RemoteException e) { + Log.e(TAG, e.getMessage(), e); + } + } + }); + } + } + + protected boolean shouldReconnect() { + return true; + } + + private void checkForLocalRecording(String appId, Bundle videoProps){ + if (TextUtils.isEmpty(appId)) + return; + + final boolean isLocalRecordingEnabled = videoProps.getBoolean(CameraActions.EXTRA_VIDEO_ENABLE_LOCAL_RECORDING); + if (isLocalRecordingEnabled) { + String localRecordingFilename = videoProps.getString(CameraActions.EXTRA_VIDEO_LOCAL_RECORDING_FILENAME); + if(TextUtils.isEmpty(localRecordingFilename)){ + localRecordingFilename = appId + "." + FILE_DATE_FORMAT.format(new Date()); + } + + if(!localRecordingFilename.equalsIgnoreCase(streamRecorder.getRecordingFilename())){ + if(streamRecorder.isRecordingEnabled()){ + disableLocalRecording(); + } + + enableLocalRecording(localRecordingFilename); + } + } + else { + disableLocalRecording(); + } + } + + public void startVideoStream(Bundle videoProps, String appId, String newVideoTag, Surface videoSurface, + final ICommandListener listener) { + Timber.d("Video stream start request from %s. Video owner is %s.", appId, videoOwnerId.get()); + + if (!isAppIdValid(appId, listener)) { + return; + } + + final int udpPort = videoProps.getInt(CameraActions.EXTRA_VIDEO_PROPS_UDP_PORT, -1); + if (videoSurface == null || udpPort == -1){ + postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + return; + } + + if (newVideoTag == null) + newVideoTag = ""; + + if (appId.equals(videoOwnerId.get())) { + String currentVideoTag = videoTagRef.get(); + if (currentVideoTag == null) + currentVideoTag = ""; + + if (newVideoTag.equals(currentVideoTag)) { + // Check if the local recording state needs to be updated. + checkForLocalRecording(appId, videoProps); + + postSuccessEvent(listener); + return; + } + } + + if (videoOwnerId.compareAndSet(NO_VIDEO_OWNER, appId)) { + videoTagRef.set(newVideoTag); + + checkForLocalRecording(appId, videoProps); + + Timber.i("Starting video decoding."); + startDecoding(udpPort, videoSurface, new DecoderListener() { + + @Override + public void onDecodingStarted() { + Timber.i("Video decoding started."); + postSuccessEvent(listener); + } + + @Override + public void onDecodingError() { + Timber.i("Video decoding failed."); + postErrorEvent(CommandExecutionError.COMMAND_FAILED, listener); + reset(); + } + + @Override + public void onDecodingEnded() { + Timber.i("Video decoding ended successfully."); + reset(); + } + }); + } + else { + postErrorEvent(CommandExecutionError.COMMAND_DENIED, listener); + } + } + + public void startVideoStreamForObserver(String appId, String newVideoTag, + final ICommandListener listener) { + Timber.d("Video stream start request from %s. Video owner is %s.", appId, + videoOwnerId.get()); + + if (!isAppIdValid(appId, listener)) { + return; + } + + if (newVideoTag == null) + newVideoTag = ""; + + if (appId.equals(videoOwnerId.get())) { + String currentVideoTag = videoTagRef.get(); + if (currentVideoTag == null) + currentVideoTag = ""; + + if (newVideoTag.equals(currentVideoTag)){ + postSuccessEvent(listener); + return; + } + } + + if (videoOwnerId.compareAndSet(NO_VIDEO_OWNER, appId)) { + videoTagRef.set(newVideoTag); + Timber.i("Successful lock obtained for app with id %s.", appId); + + videoStreamObserverUsed.set(true); + + postSuccessEvent(listener); + } else { + postErrorEvent(CommandExecutionError.COMMAND_DENIED, listener); + } + } + + public void stopVideoStream(String appId, String currentVideoTag, + final ICommandListener listener) { + Timber.d("Video stream stop request from %s. Video owner is %s.", appId, videoOwnerId.get()); + + if (!isAppIdValid(appId, listener)) { + return; + } + + final String currentVideoOwner = videoOwnerId.get(); + if (NO_VIDEO_OWNER.equals(currentVideoOwner)) { + Timber.d("No video owner set. Nothing to do."); + + disableLocalRecording(); + + postSuccessEvent(listener); + return; + } + + if (currentVideoTag == null) + currentVideoTag = ""; + + if (appId.equals(currentVideoOwner) && currentVideoTag.equals(videoTagRef.get()) + && videoOwnerId.compareAndSet(currentVideoOwner, NO_VIDEO_OWNER)){ + videoTagRef.set(""); + + disableLocalRecording(); + + Timber.d("Stopping video decoding. Current owner is %s.", currentVideoOwner); + + Timber.i("Stopping video decoding."); + stopDecoding(new DecoderListener() { + @Override + public void onDecodingStarted() { + } + + @Override + public void onDecodingError() { + postSuccessEvent(listener); + } + + @Override + public void onDecodingEnded() { + postSuccessEvent(listener); + } + }); + } + else { + postErrorEvent(CommandExecutionError.COMMAND_DENIED, listener); + } + } + + public void stopVideoStreamForObserver(String appId, String currentVideoTag, + final ICommandListener listener) { + Timber.d("Video stream stop request from %s. Video owner is %s.", appId, videoOwnerId.get()); + + if (!isAppIdValid(appId, listener)) { + return; + } + + final String currentVideoOwner = videoOwnerId.get(); + if (NO_VIDEO_OWNER.equals(currentVideoOwner)) { + Timber.d("No video owner set. Nothing to do."); + + postSuccessEvent(listener); + return; + } + + if (currentVideoTag == null) + currentVideoTag = ""; + + if (appId.equals(currentVideoOwner) && currentVideoTag.equals(videoTagRef.get()) + && videoOwnerId.compareAndSet(currentVideoOwner, NO_VIDEO_OWNER)){ + videoTagRef.set(""); + + Timber.d("Stopping video decoding. Current owner is %s.", currentVideoOwner); + + Timber.i("Stop using video observer..."); + + videoStreamObserverUsed.set(false); + + postSuccessEvent(listener); + } + else { + postErrorEvent(CommandExecutionError.COMMAND_DENIED, listener); + } + } + + public void tryStoppingVideoStream(String parentId) { + if (TextUtils.isEmpty(parentId)) + return; + + final String videoOwner = videoOwnerId.get(); + if (NO_VIDEO_OWNER.equals(videoOwner)) + return; + + if (videoOwner.equals(parentId)){ + Timber.d("Stopping video owned by %s", parentId); + + if(videoStreamObserverUsed.get()){ + stopVideoStreamForObserver(parentId, videoTagRef.get(), null); + } + else { + stopVideoStream(parentId, videoTagRef.get(), null); + } + } + } + + private boolean isAppIdValid(String appId, ICommandListener listener) { + if (TextUtils.isEmpty(appId)) { + Timber.w("Owner id is empty."); + postErrorEvent(CommandExecutionError.COMMAND_DENIED, listener); + + return false; + } + + return true; + } +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/file/DecodeH264FromFile.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/file/DecodeH264FromFile.java new file mode 100644 index 0000000000..0d543d71c4 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/file/DecodeH264FromFile.java @@ -0,0 +1,13 @@ +package org.droidplanner.services.android.impl.utils.video.file; + +import android.view.Surface; + +/** + * Used to decode a h264 elementary stream from a file. + */ +public class DecodeH264FromFile { + + public void playFromFile(Surface surface){ + + } +} From d208232af07501f8eaa00180db9f8986b7af6074 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 9 May 2016 15:09:00 -0700 Subject: [PATCH 004/113] Continue fixe of path issues --- ClientLib/build.gradle | 13 ++++ ClientLib/libs/d2xx.jar | Bin 0 -> 131697 bytes .../services/android/impl/api/DPServices.java | 1 + .../android/impl/api/DroidPlannerService.java | 1 + .../services/android/impl/api/DroneApi.java | 20 +++---- .../connection/AndroidIpConnection.java | 2 +- .../connection/AndroidMavLinkConnection.java | 6 +- .../connection/AndroidTcpConnection.java | 6 +- .../connection/AndroidUdpConnection.java | 6 +- .../connection/BluetoothConnection.java | 2 +- .../connection/SoloConnection.java | 2 +- .../connection/usb/UsbConnection.java | 8 +-- .../communication/service/MAVLinkClient.java | 32 +++++----- .../impl/core/MAVLink/MavLinkCalibration.java | 2 +- .../impl/core/MAVLink/MavLinkCommands.java | 4 +- .../impl/core/MAVLink/MavLinkMsgHandler.java | 4 +- .../impl/core/MAVLink/MavLinkParameters.java | 2 +- .../android/impl/core/MAVLink/MavLinkRC.java | 2 +- .../impl/core/MAVLink/MavLinkStreamRates.java | 2 +- .../impl/core/MAVLink/MavLinkWaypoint.java | 2 +- .../impl/core/MAVLink/WaypointManager.java | 6 +- .../MAVLink/command/doCmd/MavLinkDoCmds.java | 2 +- .../MAVLink/connection/MavLinkConnection.java | 2 +- .../android/impl/core/drone/DroneEvents.java | 6 +- .../impl/core/drone/DroneInterfaces.java | 4 +- .../impl/core/drone/DroneVariable.java | 2 +- .../android/impl/core/drone/Preferences.java | 6 +- .../impl/core/drone/autopilot/Drone.java | 2 +- .../core/drone/autopilot/MavLinkDrone.java | 24 ++++---- .../core/drone/autopilot/apm/ArduCopter.java | 22 +++---- .../core/drone/autopilot/apm/ArduPilot.java | 40 ++++++------- .../core/drone/autopilot/apm/ArduPlane.java | 8 +-- .../core/drone/autopilot/apm/ArduRover.java | 8 +-- .../apm/solo/AbstractLinkManager.java | 2 +- .../drone/autopilot/apm/solo/ArduSolo.java | 20 +++---- .../drone/autopilot/apm/solo/SoloComp.java | 10 ++-- .../controller/ControllerLinkListener.java | 2 +- .../controller/ControllerLinkManager.java | 8 +-- .../apm/solo/sololink/SoloLinkListener.java | 2 +- .../apm/solo/sololink/SoloLinkManager.java | 8 +-- .../autopilot/apm/variables/APMHeartBeat.java | 8 +-- .../generic/GenericMavLinkDrone.java | 52 ++++++++-------- .../core/drone/autopilot/px4/Px4Native.java | 10 ++-- .../core/drone/profiles/ParameterManager.java | 14 ++--- .../impl/core/drone/variables/Camera.java | 10 ++-- .../core/drone/variables/GuidedPoint.java | 12 ++-- .../impl/core/drone/variables/HeartBeat.java | 8 +-- .../core/drone/variables/Magnetometer.java | 6 +- .../core/drone/variables/MissionStats.java | 6 +- .../android/impl/core/drone/variables/RC.java | 6 +- .../impl/core/drone/variables/State.java | 14 ++--- .../core/drone/variables/StreamRates.java | 10 ++-- .../impl/core/drone/variables/Type.java | 8 +-- .../calibration/AccelCalibration.java | 10 ++-- .../MagnetometerCalibrationImpl.java | 8 +-- .../android/impl/core/gcs/GCSHeartbeat.java | 2 +- .../android/impl/core/gcs/ReturnToMe.java | 14 ++--- .../android/impl/core/gcs/follow/Follow.java | 18 +++--- .../impl/core/gcs/follow/FollowAbove.java | 6 +- .../impl/core/gcs/follow/FollowAlgorithm.java | 8 +-- .../impl/core/gcs/follow/FollowCircle.java | 6 +- .../core/gcs/follow/FollowGuidedScan.java | 8 +-- .../core/gcs/follow/FollowHeadingAngle.java | 8 +-- .../impl/core/gcs/follow/FollowLead.java | 2 +- .../impl/core/gcs/follow/FollowLeash.java | 6 +- .../impl/core/gcs/follow/FollowLeft.java | 2 +- .../impl/core/gcs/follow/FollowLookAtMe.java | 4 +- .../impl/core/gcs/follow/FollowRight.java | 2 +- .../impl/core/gcs/follow/FollowSoloShot.java | 12 ++-- .../core/gcs/follow/FollowSplineAbove.java | 6 +- .../core/gcs/follow/FollowSplineLeash.java | 6 +- .../gcs/follow/FollowWithRadiusAlgorithm.java | 4 +- .../impl/core/gcs/location/FusedLocation.java | 10 ++-- .../impl/core/gcs/roi/ROIEstimator.java | 10 ++-- .../core/helpers/coordinates/CoordBounds.java | 2 +- .../impl/core/helpers/geoTools/GeoTools.java | 4 +- .../impl/core/helpers/geoTools/LineTools.java | 2 +- .../android/impl/core/mission/Mission.java | 42 ++++++------- .../impl/core/mission/MissionItemType.java | 36 +++++------ .../mission/commands/CameraTriggerImpl.java | 6 +- .../mission/commands/ChangeSpeedImpl.java | 6 +- .../mission/commands/ConditionYawImpl.java | 8 +-- .../core/mission/commands/DoJumpImpl.java | 6 +- .../core/mission/commands/EpmGripperImpl.java | 6 +- .../core/mission/commands/MissionCMD.java | 4 +- .../mission/commands/ReturnToHomeImpl.java | 6 +- .../core/mission/commands/SetRelayImpl.java | 6 +- .../core/mission/commands/SetServoImpl.java | 6 +- .../core/mission/commands/TakeoffImpl.java | 6 +- .../core/mission/survey/SplineSurveyImpl.java | 4 +- .../impl/core/mission/survey/SurveyImpl.java | 18 +++--- .../core/mission/waypoints/CircleImpl.java | 6 +- .../mission/waypoints/DoLandStartImpl.java | 6 +- .../impl/core/mission/waypoints/LandImpl.java | 6 +- .../waypoints/RegionOfInterestImpl.java | 6 +- .../mission/waypoints/SpatialCoordItem.java | 4 +- .../mission/waypoints/SplineWaypointImpl.java | 6 +- .../waypoints/StructureScannerImpl.java | 18 +++--- .../core/mission/waypoints/WaypointImpl.java | 6 +- .../core/model/AutopilotWarningParser.java | 2 +- .../android/impl/core/polygon/Polygon.java | 6 +- .../android/impl/core/srtm/SrtmData.java | 2 +- .../impl/core/srtm/SrtmDownloader.java | 2 +- .../android/impl/core/srtm/SrtmRegions.java | 2 +- .../android/impl/core/survey/Footprint.java | 2 +- .../android/impl/core/survey/SurveyData.java | 2 +- .../core/survey/grid/CircumscribedGrid.java | 6 +- .../impl/core/survey/grid/EndpointSorter.java | 6 +- .../android/impl/core/survey/grid/Grid.java | 2 +- .../impl/core/survey/grid/GridBuilder.java | 6 +- .../impl/core/survey/grid/Trimmer.java | 4 +- .../services/android/impl/data/SessionDB.java | 2 +- .../impl/ui/activity/TLogFileSelector.java | 4 +- .../impl/utils/AndroidApWarningParser.java | 4 +- .../android/impl/utils/AndroidLogger.java | 2 +- .../android/impl/utils/CommonApiUtils.java | 56 +++++++++--------- .../android/impl/utils/LogToFileTree.java | 2 +- .../android/impl/utils/NetworkUtils.java | 2 +- .../android/impl/utils/ProxyUtils.java | 44 +++++++------- .../android/impl/utils/SoloApiUtils.java | 6 +- .../android/impl/utils/analytics/GAUtils.java | 7 +-- .../impl/utils/apps/AppsUpdateReceiver.java | 2 +- .../connection/WifiConnectionHandler.java | 2 +- .../impl/utils/file/IO/CameraInfoLoader.java | 4 +- .../impl/utils/file/IO/CameraInfoReader.java | 2 +- .../impl/utils/file/IO/ExceptionWriter.java | 2 +- .../file/IO/ParameterMetadataLoader.java | 2 +- .../utils/file/IO/VehicleProfileReader.java | 8 +-- .../impl/utils/prefs/DroidPlannerPrefs.java | 10 ++-- .../main/res/xml/google_analytics_tracker.xml | 45 ++++++++++++++ 130 files changed, 575 insertions(+), 516 deletions(-) create mode 100755 ClientLib/libs/d2xx.jar create mode 100644 ClientLib/src/main/res/xml/google_analytics_tracker.xml diff --git a/ClientLib/build.gradle b/ClientLib/build.gradle index 1f08c24cbb..485365fbff 100644 --- a/ClientLib/build.gradle +++ b/ClientLib/build.gradle @@ -58,10 +58,23 @@ dependencies { compile 'com.jakewharton.timber:timber:3.1.0' compile "com.android.support:support-v4:${support_lib_version}" compile "com.android.support:appcompat-v7:${support_lib_version}" + + compile "com.google.android.gms:play-services-analytics:${play_services_version}" compile "com.google.android.gms:play-services-base:${play_services_version}" + compile "com.google.android.gms:play-services-location:${play_services_version}" + + //Java semver library + compile 'com.github.zafarkhaja:java-semver:0.9.0' + + compile 'com.jcraft:jsch:0.1.51' + + //MP4 generation library + compile 'com.googlecode.mp4parser:isoparser:1.1.7' debugCompile project(':Mavlink') releaseCompile files('libs/Mavlink.jar') + + compile files('libs/d2xx.jar') } assemble.dependsOn ':Mavlink:jar' diff --git a/ClientLib/libs/d2xx.jar b/ClientLib/libs/d2xx.jar new file mode 100755 index 0000000000000000000000000000000000000000..aea713f5b63a9bef95e488bf6bbe464a5fa1845c GIT binary patch literal 131697 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%0ALoDQ@5nm)VNTdP18Nwv+_Tn3v0uq9Bs*nH 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 P!aoH~$Q98F%P{4C`k|VM literal 0 HcmV?d00001 diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java index c47ca56491..3cb04d73e1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java @@ -4,6 +4,7 @@ import android.os.RemoteException; import android.util.Log; +import org.droidplanner.android.client.BuildConfig; import org.droidplanner.services.android.impl.core.drone.DroneManager; import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; import org.droidplanner.services.android.lib.gcs.event.GCSEvent; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java index 87c9a17d62..c4b5c52497 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java @@ -16,6 +16,7 @@ import org.droidplanner.android.client.R; import org.droidplanner.services.android.impl.core.drone.DroneManager; import org.droidplanner.services.android.impl.utils.Utils; +import org.droidplanner.services.android.impl.core.survey.CameraInfo; import org.droidplanner.services.android.impl.utils.file.IO.CameraInfoLoader; import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java index 4aa56aee96..076aec9dc4 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java @@ -13,14 +13,16 @@ import com.MAVLink.ardupilotmega.msg_mag_cal_progress; import com.MAVLink.ardupilotmega.msg_mag_cal_report; -import org.droidplanner.services.android.communication.connection.SoloConnection; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.DroneManager; -import org.droidplanner.services.android.core.drone.autopilot.Drone; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; -import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; -import org.droidplanner.services.android.exception.ConnectionException; +import org.droidplanner.services.android.impl.communication.connection.SoloConnection; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.DroneManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.impl.exception.ConnectionException; +import org.droidplanner.services.android.impl.utils.CommonApiUtils; +import org.droidplanner.services.android.impl.utils.video.VideoManager; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.action.CameraActions; import org.droidplanner.services.android.lib.drone.action.ConnectionActions; @@ -50,8 +52,6 @@ import org.droidplanner.services.android.lib.model.IMavlinkObserver; import org.droidplanner.services.android.lib.model.IObserver; import org.droidplanner.services.android.lib.model.action.Action; -import org.droidplanner.services.android.utils.CommonApiUtils; -import org.droidplanner.services.android.utils.video.VideoManager; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java index f2ab124a8c..f9e4e7ad2f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidIpConnection.java @@ -2,7 +2,7 @@ import android.content.Context; -import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; +import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java index 3b540084ea..a81f0bb27f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidMavLinkConnection.java @@ -2,9 +2,9 @@ import android.content.Context; -import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnection; -import org.droidplanner.services.android.core.model.Logger; -import org.droidplanner.services.android.utils.AndroidLogger; +import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnection; +import org.droidplanner.services.android.impl.core.model.Logger; +import org.droidplanner.services.android.impl.utils.AndroidLogger; public abstract class AndroidMavLinkConnection extends MavLinkConnection { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java index 3399a4a9ca..d9019536b9 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java @@ -2,10 +2,10 @@ import android.content.Context; -import org.droidplanner.services.android.core.MAVLink.connection.TcpConnection; -import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.impl.core.MAVLink.connection.TcpConnection; +import org.droidplanner.services.android.impl.core.model.Logger; import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; +import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java index 7b35544811..6ec4b79f6c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java @@ -3,10 +3,10 @@ import android.content.Context; import android.util.Log; -import org.droidplanner.services.android.core.MAVLink.connection.UdpConnection; -import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.impl.core.MAVLink.connection.UdpConnection; +import org.droidplanner.services.android.impl.core.model.Logger; import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; +import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import java.io.IOException; import java.net.InetAddress; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java index 250fdb94b3..f1a52b0532 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/BluetoothConnection.java @@ -8,7 +8,7 @@ import android.os.ParcelUuid; import android.util.Log; -import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; +import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnectionTypes; import java.io.IOException; import java.io.InputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java index 3ad9e10ddb..2e89043705 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java @@ -9,7 +9,7 @@ import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; import org.droidplanner.services.android.lib.drone.connection.ConnectionType; import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; +import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import java.io.IOException; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java index 8cd8f4ffd4..58c41ecd55 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java @@ -5,11 +5,11 @@ import android.hardware.usb.UsbManager; import android.util.Log; -import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; -import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; -import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.impl.communication.connection.AndroidMavLinkConnection; +import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnectionTypes; +import org.droidplanner.services.android.impl.core.model.Logger; import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.utils.AndroidLogger; +import org.droidplanner.services.android.impl.utils.AndroidLogger; import java.io.IOException; import java.util.HashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java index c98152ad07..0e1577eef1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java @@ -8,26 +8,26 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.google.android.gms.analytics.HitBuilders; -import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; -import org.droidplanner.services.android.communication.connection.AndroidTcpConnection; -import org.droidplanner.services.android.communication.connection.AndroidUdpConnection; -import org.droidplanner.services.android.communication.connection.BluetoothConnection; -import org.droidplanner.services.android.communication.connection.SoloConnection; -import org.droidplanner.services.android.communication.connection.usb.UsbConnection; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnection; -import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionListener; -import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; -import org.droidplanner.services.android.core.drone.manager.DroneCommandTracker; -import org.droidplanner.services.android.data.SessionDB; +import org.droidplanner.services.android.impl.communication.connection.AndroidMavLinkConnection; +import org.droidplanner.services.android.impl.communication.connection.AndroidTcpConnection; +import org.droidplanner.services.android.impl.communication.connection.AndroidUdpConnection; +import org.droidplanner.services.android.impl.communication.connection.BluetoothConnection; +import org.droidplanner.services.android.impl.communication.connection.SoloConnection; +import org.droidplanner.services.android.impl.communication.connection.usb.UsbConnection; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnection; +import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnectionListener; +import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnectionTypes; +import org.droidplanner.services.android.impl.core.drone.manager.DroneCommandTracker; +import org.droidplanner.services.android.impl.data.SessionDB; import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; import org.droidplanner.services.android.lib.drone.connection.ConnectionType; import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.utils.analytics.GAUtils; -import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; -import org.droidplanner.services.android.utils.file.DirectoryPath; -import org.droidplanner.services.android.utils.file.FileUtils; +import org.droidplanner.services.android.impl.utils.analytics.GAUtils; +import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; +import org.droidplanner.services.android.impl.utils.file.DirectoryPath; +import org.droidplanner.services.android.impl.utils.file.FileUtils; import java.io.File; import java.net.InetAddress; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java index 2b9a7111fe..c3b29a4208 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java @@ -5,7 +5,7 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_CMD_ACK; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.model.ICommandListener; public class MavLinkCalibration { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java index 0ab2ee886b..298cc1d162 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java @@ -10,8 +10,8 @@ import com.MAVLink.enums.MAV_FRAME; import com.MAVLink.enums.MAV_GOTO; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.variables.ApmModes; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.variables.ApmModes; import org.droidplanner.services.android.lib.model.ICommandListener; public class MavLinkCommands { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java index c8adf1bf56..ee18e77ff8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkMsgHandler.java @@ -5,8 +5,8 @@ import com.MAVLink.enums.MAV_AUTOPILOT; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; /** * Parse the received mavlink messages, and update the drone state appropriately. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java index 393a5ebb43..43ac6ffa53 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java @@ -4,7 +4,7 @@ import com.MAVLink.common.msg_param_request_read; import com.MAVLink.common.msg_param_set; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.drone.property.Parameter; public class MavLinkParameters { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java index a3353d968f..32b67b21b8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkRC.java @@ -2,7 +2,7 @@ import com.MAVLink.common.msg_rc_channels_override; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; public class MavLinkRC { public static void sendRcOverrideMsg(MavLinkDrone drone, int[] rcOutputs) { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java index eb03ef4097..be88535b79 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkStreamRates.java @@ -3,7 +3,7 @@ import com.MAVLink.common.msg_request_data_stream; import com.MAVLink.enums.MAV_DATA_STREAM; -import org.droidplanner.services.android.communication.model.DataLink.DataLinkProvider; +import org.droidplanner.services.android.impl.communication.model.DataLink.DataLinkProvider; public class MavLinkStreamRates { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java index 100042c1da..a7d8fb49d3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkWaypoint.java @@ -7,7 +7,7 @@ import com.MAVLink.common.msg_mission_set_current; import com.MAVLink.enums.MAV_MISSION_RESULT; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; public class MavLinkWaypoint { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java index 800c6a0a35..92b2520f70 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/WaypointManager.java @@ -10,9 +10,9 @@ import com.MAVLink.common.msg_mission_item_reached; import com.MAVLink.common.msg_mission_request; -import org.droidplanner.services.android.core.drone.DroneInterfaces.OnWaypointManagerListener; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnWaypointManagerListener; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java index ea0b27f5b8..c2d1d998db 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java @@ -7,7 +7,7 @@ import com.MAVLink.enums.GRIPPER_ACTIONS; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.model.ICommandListener; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java index 2a11f82a85..4c2ff5ad6f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java @@ -6,7 +6,7 @@ import com.MAVLink.MAVLinkPacket; import com.MAVLink.Parser; -import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.impl.core.model.Logger; import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; import java.io.BufferedOutputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java index 68d26e6a2a..e46606ff15 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneEvents.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java index 937d260e20..2b1d97bc72 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java @@ -2,8 +2,8 @@ import android.os.Bundle; -import org.droidplanner.services.android.core.MAVLink.WaypointManager; -import org.droidplanner.services.android.core.drone.autopilot.Drone; +import org.droidplanner.services.android.impl.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; import org.droidplanner.services.android.lib.drone.property.Parameter; public class DroneInterfaces { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java index 4adb396a20..d9528fb6ad 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java @@ -3,7 +3,7 @@ import android.os.Handler; import android.os.RemoteException; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.model.ICommandListener; import timber.log.Timber; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java index 3854c7d486..540885966d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/Preferences.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.impl.core.drone; -import org.droidplanner.services.android.core.drone.profiles.VehicleProfile; -import org.droidplanner.services.android.core.drone.variables.StreamRates; -import org.droidplanner.services.android.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.drone.profiles.VehicleProfile; +import org.droidplanner.services.android.impl.core.drone.variables.StreamRates; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; public interface Preferences { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java index 3d28f74a3c..84e472a356 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.drone.autopilot; -import org.droidplanner.services.android.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; import org.droidplanner.services.android.lib.drone.property.DroneAttribute; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.action.Action; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java index ad99a90b75..5b6eb4e1ac 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/MavLinkDrone.java @@ -2,18 +2,18 @@ import com.MAVLink.Messages.MAVLinkMessage; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.MAVLink.WaypointManager; -import org.droidplanner.services.android.core.drone.profiles.ParameterManager; -import org.droidplanner.services.android.core.drone.variables.Camera; -import org.droidplanner.services.android.core.drone.variables.GuidedPoint; -import org.droidplanner.services.android.core.drone.variables.MissionStats; -import org.droidplanner.services.android.core.drone.variables.State; -import org.droidplanner.services.android.core.drone.variables.StreamRates; -import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; -import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.impl.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.impl.core.drone.variables.Camera; +import org.droidplanner.services.android.impl.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.impl.core.drone.variables.MissionStats; +import org.droidplanner.services.android.impl.core.drone.variables.State; +import org.droidplanner.services.android.impl.core.drone.variables.StreamRates; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.mission.Mission; public interface MavLinkDrone extends Drone { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java index 231ab8c526..c849a93d7b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java @@ -8,21 +8,21 @@ import com.github.zafarkhaja.semver.Version; import org.droidplanner.android.client.apis.CapabilityApi; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.DroneManager; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.drone.profiles.ParameterManager; -import org.droidplanner.services.android.core.drone.variables.ApmModes; -import org.droidplanner.services.android.core.drone.variables.State; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.DroneManager; +import org.droidplanner.services.android.impl.core.drone.LogMessageListener; +import org.droidplanner.services.android.impl.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.impl.core.drone.variables.ApmModes; +import org.droidplanner.services.android.impl.core.drone.variables.State; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; import org.droidplanner.services.android.lib.drone.action.ControlActions; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; import org.droidplanner.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.utils.CommonApiUtils; +import org.droidplanner.services.android.impl.utils.CommonApiUtils; import java.util.concurrent.ConcurrentHashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java index 118d12c439..ccd026c1ed 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java @@ -24,24 +24,24 @@ import com.MAVLink.enums.MAV_SYS_STATUS_SENSOR; import com.github.zafarkhaja.semver.Version; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; -import org.droidplanner.services.android.core.MAVLink.WaypointManager; -import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.drone.autopilot.apm.variables.APMHeartBeat; -import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; -import org.droidplanner.services.android.core.drone.variables.ApmModes; -import org.droidplanner.services.android.core.drone.variables.Camera; -import org.droidplanner.services.android.core.drone.variables.GuidedPoint; -import org.droidplanner.services.android.core.drone.variables.HeartBeat; -import org.droidplanner.services.android.core.drone.variables.Magnetometer; -import org.droidplanner.services.android.core.drone.variables.RC; -import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; -import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkParameters; +import org.droidplanner.services.android.impl.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.impl.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.LogMessageListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.variables.APMHeartBeat; +import org.droidplanner.services.android.impl.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.variables.ApmModes; +import org.droidplanner.services.android.impl.core.drone.variables.Camera; +import org.droidplanner.services.android.impl.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.impl.core.drone.variables.HeartBeat; +import org.droidplanner.services.android.impl.core.drone.variables.Magnetometer; +import org.droidplanner.services.android.impl.core.drone.variables.RC; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.action.ControlActions; @@ -61,7 +61,7 @@ import org.droidplanner.services.android.lib.model.AbstractCommandListener; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.action.Action; -import org.droidplanner.services.android.utils.CommonApiUtils; +import org.droidplanner.services.android.impl.utils.CommonApiUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -78,7 +78,7 @@ public abstract class ArduPilot extends GenericMavLinkDrone { public static final String FIRMWARE_VERSION_NUMBER_REGEX = "\\d+(\\.\\d{1,2})?"; - private final org.droidplanner.services.android.core.drone.variables.RC rc; + private final org.droidplanner.services.android.impl.core.drone.variables.RC rc; private final Mission mission; private final GuidedPoint guidedPoint; private final AccelCalibration accelCalibrationSetup; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java index 812f577a24..1189bee122 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPlane.java @@ -8,10 +8,10 @@ import com.MAVLink.common.msg_vfr_hud; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +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. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java index 24c76f0c6e..c5dffa322a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduRover.java @@ -6,10 +6,10 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +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. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java index f0542dfebe..b8aaec8e75 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java @@ -8,7 +8,7 @@ import org.droidplanner.android.client.utils.connection.AbstractIpConnection; import org.droidplanner.android.client.utils.connection.IpConnectionListener; import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.utils.connection.SshConnection; +import org.droidplanner.services.android.impl.utils.connection.SshConnection; import java.io.IOException; import java.util.concurrent.ExecutorService; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java index 8070352716..8a6287f9b1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java @@ -13,15 +13,15 @@ import org.droidplanner.android.client.apis.CapabilityApi; import org.droidplanner.android.client.utils.TxPowerComplianceCountries; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.drone.autopilot.apm.ArduCopter; -import org.droidplanner.services.android.core.drone.variables.ApmModes; -import org.droidplanner.services.android.core.drone.variables.HeartBeat; -import org.droidplanner.services.android.core.drone.variables.StreamRates; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.LogMessageListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.ArduCopter; +import org.droidplanner.services.android.impl.core.drone.variables.ApmModes; +import org.droidplanner.services.android.impl.core.drone.variables.HeartBeat; +import org.droidplanner.services.android.impl.core.drone.variables.StreamRates; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; import org.droidplanner.services.android.lib.drone.attribute.AttributeType; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; @@ -41,7 +41,7 @@ import org.droidplanner.services.android.lib.drone.property.State; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.action.Action; -import org.droidplanner.services.android.utils.SoloApiUtils; +import org.droidplanner.services.android.impl.utils.SoloApiUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java index 4c79de830f..c1078f0b4b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java @@ -9,10 +9,10 @@ import android.util.SparseArray; import org.droidplanner.services.android.BuildConfig; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkListener; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.sololink.SoloLinkListener; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.sololink.SoloLinkManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink.SoloLinkListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink.SoloLinkManager; import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; @@ -29,7 +29,7 @@ import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.utils.NetworkUtils; +import org.droidplanner.services.android.impl.utils.NetworkUtils; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java index f45b65a55f..573470042e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java index c1891b0b06..2e47a83248 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java @@ -10,8 +10,8 @@ import org.droidplanner.android.client.utils.TxPowerComplianceCountries; import org.droidplanner.android.client.utils.connection.IpConnectionListener; import org.droidplanner.android.client.utils.connection.TcpConnection; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; @@ -19,8 +19,8 @@ import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.utils.NetworkUtils; -import org.droidplanner.services.android.utils.connection.SshConnection; +import org.droidplanner.services.android.impl.utils.NetworkUtils; +import org.droidplanner.services.android.impl.utils.connection.SshConnection; import java.io.IOException; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java index 60d48b728b..f0c507b10c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java index fde36b87d8..9aa45b86e7 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java @@ -7,9 +7,9 @@ import org.droidplanner.android.client.utils.connection.TcpConnection; import org.droidplanner.android.client.utils.connection.UdpConnection; import org.droidplanner.services.android.BuildConfig; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; @@ -21,7 +21,7 @@ import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.SimpleCommandListener; -import org.droidplanner.services.android.utils.connection.SshConnection; +import org.droidplanner.services.android.impl.utils.connection.SshConnection; import java.io.IOException; import java.net.UnknownHostException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java index 0a14cf704c..94c591ec15 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/variables/APMHeartBeat.java @@ -2,10 +2,10 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.autopilot.apm.ArduPilot; -import org.droidplanner.services.android.core.drone.variables.HeartBeat; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.ArduPilot; +import org.droidplanner.services.android.impl.core.drone.variables.HeartBeat; /** * Created by Fredia Huya-Kouadio on 10/24/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java index 6cfdc1d5b6..91b7e35337 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java @@ -22,29 +22,29 @@ import com.MAVLink.enums.MAV_MODE_FLAG; import com.MAVLink.enums.MAV_STATE; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; -import org.droidplanner.services.android.core.MAVLink.MavLinkWaypoint; -import org.droidplanner.services.android.core.MAVLink.WaypointManager; -import org.droidplanner.services.android.core.drone.DroneEvents; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.autopilot.apm.APMConstants; -import org.droidplanner.services.android.core.drone.profiles.ParameterManager; -import org.droidplanner.services.android.core.drone.variables.ApmModes; -import org.droidplanner.services.android.core.drone.variables.Camera; -import org.droidplanner.services.android.core.drone.variables.GuidedPoint; -import org.droidplanner.services.android.core.drone.variables.HeartBeat; -import org.droidplanner.services.android.core.drone.variables.MissionStats; -import org.droidplanner.services.android.core.drone.variables.State; -import org.droidplanner.services.android.core.drone.variables.StreamRates; -import org.droidplanner.services.android.core.drone.variables.Type; -import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; -import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkWaypoint; +import org.droidplanner.services.android.impl.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.impl.core.drone.DroneEvents; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.LogMessageListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.APMConstants; +import org.droidplanner.services.android.impl.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.impl.core.drone.variables.ApmModes; +import org.droidplanner.services.android.impl.core.drone.variables.Camera; +import org.droidplanner.services.android.impl.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.impl.core.drone.variables.HeartBeat; +import org.droidplanner.services.android.impl.core.drone.variables.MissionStats; +import org.droidplanner.services.android.impl.core.drone.variables.State; +import org.droidplanner.services.android.impl.core.drone.variables.StreamRates; +import org.droidplanner.services.android.impl.core.drone.variables.Type; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.action.CapabilityActions; @@ -72,9 +72,9 @@ import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.action.Action; import org.droidplanner.services.android.lib.util.MathUtils; -import org.droidplanner.services.android.utils.CommonApiUtils; -import org.droidplanner.services.android.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.services.android.utils.video.VideoManager; +import org.droidplanner.services.android.impl.utils.CommonApiUtils; +import org.droidplanner.services.android.impl.utils.prefs.DroidPlannerPrefs; +import org.droidplanner.services.android.impl.utils.video.VideoManager; /** * Base drone implementation. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java index 43a9d5f5db..05eb393f6b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/px4/Px4Native.java @@ -5,11 +5,11 @@ import com.MAVLink.Messages.MAVLinkMessage; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +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.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; /** * Created by Fredia Huya-Kouadio on 9/10/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java index a13e3e53a6..9e0566936e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java @@ -8,14 +8,14 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_param_value; -import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkParameters; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.utils.file.IO.ParameterMetadataLoader; +import org.droidplanner.services.android.impl.utils.file.IO.ParameterMetadataLoader; import java.util.Locale; import java.util.Map; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java index feb6253b39..f12cf0f29a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java @@ -3,11 +3,11 @@ import com.MAVLink.ardupilotmega.msg_camera_feedback; import com.MAVLink.ardupilotmega.msg_mount_status; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.survey.CameraInfo; -import org.droidplanner.services.android.core.survey.Footprint; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.survey.CameraInfo; +import org.droidplanner.services.android.impl.core.survey.Footprint; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.drone.attribute.AttributeType; import org.droidplanner.services.android.lib.drone.property.Altitude; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java index 6294d1591d..a2021af6a6 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java @@ -3,12 +3,12 @@ import android.os.Handler; import android.os.RemoteException; -import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.Drone; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.drone.attribute.AttributeType; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java index b236247460..76cf147ec5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/HeartBeat.java @@ -5,10 +5,10 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_heartbeat; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import timber.log.Timber; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java index 6e08581a2c..54dad0f327 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java @@ -2,9 +2,9 @@ import com.MAVLink.common.msg_raw_imu; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.drone.property.Parameter; public class Magnetometer extends DroneVariable { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java index 29329714fd..10867f128b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/MissionStats.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.impl.core.drone.variables; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; public class MissionStats extends DroneVariable { private double distanceToWp = 0; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java index 5823f467c0..6910f41638 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/RC.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_rc_channels_raw; import com.MAVLink.common.msg_servo_output_raw; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; public class RC extends DroneVariable { public int in[] = new int[8]; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java index d1da21f869..b3caa8e633 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java @@ -7,13 +7,13 @@ import com.MAVLink.ardupilotmega.msg_ekf_status_report; import com.MAVLink.enums.EKF_STATUS_FLAGS; -import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; -import org.droidplanner.services.android.core.MAVLink.WaypointManager; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.impl.core.MAVLink.WaypointManager; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.action.Action; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java index 6658f281b5..cc2f275b69 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/StreamRates.java @@ -1,10 +1,10 @@ package org.droidplanner.services.android.impl.core.drone.variables; -import org.droidplanner.services.android.core.MAVLink.MavLinkStreamRates; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkStreamRates; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; public class StreamRates extends DroneVariable implements OnDroneListener { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java index 62b9079b14..836c7b6185 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Type.java @@ -2,10 +2,10 @@ import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; public class Type extends DroneVariable implements DroneInterfaces.OnDroneListener{ diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java index 982b703c3b..e1e14d0fbd 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java @@ -6,11 +6,11 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_statustext; -import org.droidplanner.services.android.core.MAVLink.MavLinkCalibration; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +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.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.SimpleCommandListener; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java index 7b449d9f95..781daacc41 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/MagnetometerCalibrationImpl.java @@ -4,10 +4,10 @@ import com.MAVLink.ardupilotmega.msg_mag_cal_progress; import com.MAVLink.ardupilotmega.msg_mag_cal_report; -import org.droidplanner.services.android.core.MAVLink.MavLinkCalibration; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +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; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java index 8817eb4e95..0f76fcbd60 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/GCSHeartbeat.java @@ -5,7 +5,7 @@ import com.MAVLink.enums.MAV_AUTOPILOT; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.services.android.communication.model.DataLink; +import org.droidplanner.services.android.impl.communication.model.DataLink; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java index e92c3f8d3b..26e7d871f0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java @@ -2,12 +2,12 @@ import android.os.Bundle; -import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; -import org.droidplanner.services.android.core.drone.DroneInterfaces; -import org.droidplanner.services.android.core.drone.DroneInterfaces.AttributeEventListener; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.AttributeEventListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; @@ -18,7 +18,7 @@ import org.droidplanner.services.android.lib.model.AbstractCommandListener; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.action.Action; -import org.droidplanner.services.android.utils.CommonApiUtils; +import org.droidplanner.services.android.impl.utils.CommonApiUtils; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java index c14d8f3020..1558f20dce 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java @@ -2,15 +2,15 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.drone.variables.GuidedPoint; -import org.droidplanner.services.android.core.drone.variables.State; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.gcs.location.Location.LocationFinder; -import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnDroneListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.impl.core.drone.variables.State; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationFinder; +import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationReceiver; import org.droidplanner.services.android.lib.drone.action.ControlActions; import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; import org.droidplanner.services.android.lib.model.action.Action; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java index 7349ee76b8..fea76adf70 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.lib.coordinate.LatLong; public class FollowAbove extends FollowAlgorithm { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java index bb44356f55..7f2ea387b0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAlgorithm.java @@ -2,10 +2,10 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.gcs.roi.ROIEstimator; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.gcs.roi.ROIEstimator; import java.util.Collections; import java.util.Map; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java index e6035af9e4..755f5bd5ce 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.util.MathUtils; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java index 017a2c3266..e27e3f79ed 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java @@ -2,10 +2,10 @@ import android.os.Handler; -import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.roi.ROIEstimator; +import org.droidplanner.services.android.impl.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.roi.ROIEstimator; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java index 171448be98..89ffdf43f2 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java @@ -2,10 +2,10 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.lib.coordinate.LatLong; public abstract class FollowHeadingAngle extends FollowWithRadiusAlgorithm { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java index 48001714ca..7527c06dcd 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLead.java @@ -2,7 +2,7 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; public class FollowLead extends FollowHeadingAngle { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java index f1d26f5704..a75d558a7b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.drone.attribute.AttributeType; import org.droidplanner.services.android.lib.drone.property.Gps; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java index 32b158888c..d776973128 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeft.java @@ -2,7 +2,7 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; public class FollowLeft extends FollowHeadingAngle { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java index 86bac7e239..1c903f667b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLookAtMe.java @@ -2,8 +2,8 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; /** * Created by Fredia Huya-Kouadio on 3/23/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java index 5bec2abf4c..f12254ca1f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowRight.java @@ -2,7 +2,7 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; public class FollowRight extends FollowHeadingAngle { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java index 2d969306df..d9fe1601e5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java @@ -2,12 +2,12 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.gcs.roi.ROIEstimator; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.ArduSolo; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.gcs.roi.ROIEstimator; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java index 3fb5bf53ea..51962294d7 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.lib.coordinate.LatLong; /** diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java index 95b838b4c0..62b9d91777 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.attribute.AttributeType; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java index 08171b6c94..c996ccaf98 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowWithRadiusAlgorithm.java @@ -2,8 +2,8 @@ import android.os.Handler; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import java.util.HashMap; import java.util.Map; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java index 29f7c58979..994113dc37 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java @@ -14,8 +14,8 @@ import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; -import org.droidplanner.services.android.core.gcs.location.Location.LocationFinder; -import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; +import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationFinder; +import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationReceiver; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager; import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; @@ -126,8 +126,8 @@ public void onLocationResult(LocationResult result) { final boolean isLocationAccurate = isLocationAccurate(androidLocation.getAccuracy(), currentSpeed); - org.droidplanner.services.android.core.gcs.location.Location location = - new org.droidplanner.services.android.core.gcs.location.Location( + org.droidplanner.services.android.impl.core.gcs.location.Location location = + new org.droidplanner.services.android.impl.core.gcs.location.Location( new LatLongAlt( androidLocation.getLatitude(), androidLocation.getLongitude(), @@ -144,7 +144,7 @@ public void onLocationResult(LocationResult result) { notifyLocationUpdate(location); } - private void notifyLocationUpdate(org.droidplanner.services.android.core.gcs.location.Location location) { + private void notifyLocationUpdate(org.droidplanner.services.android.impl.core.gcs.location.Location location) { if (receivers.isEmpty()) return; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java index 040be3b87d..d093898e10 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java @@ -2,11 +2,11 @@ import android.os.Handler; -import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.gcs.location.Location; -import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.gcs.location.Location; +import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationReceiver; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java index 60ca3001c7..877f6c2201 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.coordinates; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java index 771771e373..3d89eb244c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; -import org.droidplanner.services.android.core.helpers.units.Area; -import org.droidplanner.services.android.core.polygon.Polygon; +import org.droidplanner.services.android.impl.core.helpers.units.Area; +import org.droidplanner.services.android.impl.core.polygon.Polygon; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.util.MathUtils; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java index 582c499abb..7d42eccdf5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; -import org.droidplanner.services.android.core.helpers.coordinates.CoordBounds; +import org.droidplanner.services.android.impl.core.helpers.coordinates.CoordBounds; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java index 7275e83084..52f0be2a43 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java @@ -7,27 +7,27 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; -import org.droidplanner.services.android.core.drone.DroneVariable; -import org.droidplanner.services.android.core.drone.autopilot.apm.APMConstants; -import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; -import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; -import org.droidplanner.services.android.core.mission.commands.ConditionYawImpl; -import org.droidplanner.services.android.core.mission.commands.DoJumpImpl; -import org.droidplanner.services.android.core.mission.commands.EpmGripperImpl; -import org.droidplanner.services.android.core.mission.commands.ReturnToHomeImpl; -import org.droidplanner.services.android.core.mission.commands.SetRelayImpl; -import org.droidplanner.services.android.core.mission.commands.SetServoImpl; -import org.droidplanner.services.android.core.mission.commands.TakeoffImpl; -import org.droidplanner.services.android.core.mission.waypoints.CircleImpl; -import org.droidplanner.services.android.core.mission.waypoints.DoLandStartImpl; -import org.droidplanner.services.android.core.mission.waypoints.LandImpl; -import org.droidplanner.services.android.core.mission.waypoints.RegionOfInterestImpl; -import org.droidplanner.services.android.core.mission.waypoints.SpatialCoordItem; -import org.droidplanner.services.android.core.mission.waypoints.SplineWaypointImpl; -import org.droidplanner.services.android.core.mission.waypoints.WaypointImpl; +import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; +import org.droidplanner.services.android.impl.core.drone.DroneVariable; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.APMConstants; +import org.droidplanner.services.android.impl.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ChangeSpeedImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ConditionYawImpl; +import org.droidplanner.services.android.impl.core.mission.commands.DoJumpImpl; +import org.droidplanner.services.android.impl.core.mission.commands.EpmGripperImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ReturnToHomeImpl; +import org.droidplanner.services.android.impl.core.mission.commands.SetRelayImpl; +import org.droidplanner.services.android.impl.core.mission.commands.SetServoImpl; +import org.droidplanner.services.android.impl.core.mission.commands.TakeoffImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.CircleImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.DoLandStartImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.LandImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.RegionOfInterestImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.SpatialCoordItem; +import org.droidplanner.services.android.impl.core.mission.waypoints.SplineWaypointImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.WaypointImpl; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.attribute.AttributeType; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java index bfb53b2a97..9e4be05617 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java @@ -1,23 +1,23 @@ package org.droidplanner.services.android.impl.core.mission; -import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; -import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; -import org.droidplanner.services.android.core.mission.commands.ConditionYawImpl; -import org.droidplanner.services.android.core.mission.commands.DoJumpImpl; -import org.droidplanner.services.android.core.mission.commands.EpmGripperImpl; -import org.droidplanner.services.android.core.mission.commands.ReturnToHomeImpl; -import org.droidplanner.services.android.core.mission.commands.SetRelayImpl; -import org.droidplanner.services.android.core.mission.commands.SetServoImpl; -import org.droidplanner.services.android.core.mission.commands.TakeoffImpl; -import org.droidplanner.services.android.core.mission.survey.SplineSurveyImpl; -import org.droidplanner.services.android.core.mission.survey.SurveyImpl; -import org.droidplanner.services.android.core.mission.waypoints.CircleImpl; -import org.droidplanner.services.android.core.mission.waypoints.DoLandStartImpl; -import org.droidplanner.services.android.core.mission.waypoints.LandImpl; -import org.droidplanner.services.android.core.mission.waypoints.RegionOfInterestImpl; -import org.droidplanner.services.android.core.mission.waypoints.SplineWaypointImpl; -import org.droidplanner.services.android.core.mission.waypoints.StructureScannerImpl; -import org.droidplanner.services.android.core.mission.waypoints.WaypointImpl; +import org.droidplanner.services.android.impl.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ChangeSpeedImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ConditionYawImpl; +import org.droidplanner.services.android.impl.core.mission.commands.DoJumpImpl; +import org.droidplanner.services.android.impl.core.mission.commands.EpmGripperImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ReturnToHomeImpl; +import org.droidplanner.services.android.impl.core.mission.commands.SetRelayImpl; +import org.droidplanner.services.android.impl.core.mission.commands.SetServoImpl; +import org.droidplanner.services.android.impl.core.mission.commands.TakeoffImpl; +import org.droidplanner.services.android.impl.core.mission.survey.SplineSurveyImpl; +import org.droidplanner.services.android.impl.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.CircleImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.DoLandStartImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.LandImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.RegionOfInterestImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.SplineWaypointImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.StructureScannerImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.WaypointImpl; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.Collections; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java index a0b4cc7378..45adf12e45 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/CameraTriggerImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java index d0e315b01b..e48ab81c6a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ChangeSpeedImpl.java @@ -4,9 +4,9 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java index 7f52ca8382..96c3063e72 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ConditionYawImpl.java @@ -3,10 +3,10 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java index 679141928f..4f0753d46b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/DoJumpImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java index eda9de68a6..9d7e9caa56 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/EpmGripperImpl.java @@ -4,9 +4,9 @@ import com.MAVLink.enums.GRIPPER_ACTIONS; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java index e0092761b0..3f456e9f2c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/MissionCMD.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java index b85f3aca0a..2e87b751bb 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/ReturnToHomeImpl.java @@ -4,9 +4,9 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java index 13acbf4eca..4e46263c74 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetRelayImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java index 8fa36f9210..b82f720da4 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/SetServoImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java index 0f5405a7ed..c877a7300b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/commands/TakeoffImpl.java @@ -4,9 +4,9 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java index ee9546b9f7..455e90bebd 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java @@ -4,8 +4,8 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java index 9cd3601e36..1a2e5b427b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java @@ -4,15 +4,15 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; -import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; -import org.droidplanner.services.android.core.polygon.Polygon; -import org.droidplanner.services.android.core.survey.CameraInfo; -import org.droidplanner.services.android.core.survey.SurveyData; -import org.droidplanner.services.android.core.survey.grid.Grid; -import org.droidplanner.services.android.core.survey.grid.GridBuilder; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.impl.core.polygon.Polygon; +import org.droidplanner.services.android.impl.core.survey.CameraInfo; +import org.droidplanner.services.android.impl.core.survey.SurveyData; +import org.droidplanner.services.android.impl.core.survey.grid.Grid; +import org.droidplanner.services.android.impl.core.survey.grid.GridBuilder; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java index 1e4fe9aca9..1ef9f7e560 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java @@ -4,9 +4,9 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java index d56998756a..395950b437 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java index 899b97112b..b526e09fac 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java index ff418828ad..8ae138c94a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java index d32e702fae..8f8ab3ff80 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java index 445557ef9c..9d561a4e71 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java index 5d438a5dd4..8a759afaf1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java @@ -3,15 +3,15 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; -import org.droidplanner.services.android.core.mission.survey.SurveyImpl; -import org.droidplanner.services.android.core.polygon.Polygon; -import org.droidplanner.services.android.core.survey.CameraInfo; -import org.droidplanner.services.android.core.survey.SurveyData; -import org.droidplanner.services.android.core.survey.grid.GridBuilder; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.impl.core.polygon.Polygon; +import org.droidplanner.services.android.impl.core.survey.CameraInfo; +import org.droidplanner.services.android.impl.core.survey.SurveyData; +import org.droidplanner.services.android.impl.core.survey.grid.GridBuilder; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java index f6ea3ef6a9..c3471ac516 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java @@ -3,9 +3,9 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.MissionItemType; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.MissionItemType; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java index 85417f54dc..1a6a5208be 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/model/AutopilotWarningParser.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.model; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; /** * Parse received autopilot warning messages. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java index 276023ce54..fc75012f27 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.impl.core.polygon; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; -import org.droidplanner.services.android.core.helpers.units.Area; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.impl.core.helpers.units.Area; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java index 7292123169..15da9f6559 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmData.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.srtm; -import org.droidplanner.services.android.core.srtm.Srtm.OnProgressListner; +import org.droidplanner.services.android.impl.core.srtm.Srtm.OnProgressListner; import java.io.BufferedInputStream; import java.io.File; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java index 32d61ea974..8049c50c81 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmDownloader.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.srtm; -import org.droidplanner.services.android.core.srtm.Srtm.OnProgressListner; +import org.droidplanner.services.android.impl.core.srtm.Srtm.OnProgressListner; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java index 84eb0e322d..ff3bada3ec 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/srtm/SrtmRegions.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.srtm; -import org.droidplanner.services.android.core.srtm.Srtm.OnProgressListner; +import org.droidplanner.services.android.impl.core.srtm.Srtm.OnProgressListner; import java.io.File; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java index f2c224a8fe..0bd82593a0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java @@ -2,7 +2,7 @@ import com.MAVLink.ardupilotmega.msg_camera_feedback; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.util.MathUtils; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java index ce01a7c51c..168bcfcd43 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/SurveyData.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.survey; -import org.droidplanner.services.android.core.helpers.units.Area; +import org.droidplanner.services.android.impl.core.helpers.units.Area; import java.util.Locale; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java index fb0961b968..c6a8d635ff 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.impl.core.survey.grid; -import org.droidplanner.services.android.core.helpers.coordinates.CoordBounds; -import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.impl.core.helpers.coordinates.CoordBounds; +import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java index 672720ef74..fa6e76e06a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.impl.core.survey.grid; -import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; -import org.droidplanner.services.android.core.helpers.geoTools.LineSampler; -import org.droidplanner.services.android.core.helpers.geoTools.LineTools; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineSampler; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java index bc70572ce9..8750443336 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.survey.grid; -import org.droidplanner.services.android.core.helpers.geoTools.PolylineTools; +import org.droidplanner.services.android.impl.core.helpers.geoTools.PolylineTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java index e7acca03d7..01593d09ab 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.impl.core.survey.grid; -import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; -import org.droidplanner.services.android.core.polygon.Polygon; -import org.droidplanner.services.android.core.survey.SurveyData; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.impl.core.polygon.Polygon; +import org.droidplanner.services.android.impl.core.survey.SurveyData; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java index e0d5d0d1f5..36659d177e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.impl.core.survey.grid; -import org.droidplanner.services.android.core.helpers.geoTools.LineLatLong; -import org.droidplanner.services.android.core.helpers.geoTools.LineTools; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; +import org.droidplanner.services.android.impl.core.helpers.geoTools.LineTools; import org.droidplanner.services.android.lib.coordinate.LatLong; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java index 5b65b0d83b..0f93ee9b24 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/data/SessionDB.java @@ -6,7 +6,7 @@ import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; -import org.droidplanner.services.android.data.SessionContract.SessionData; +import org.droidplanner.services.android.impl.data.SessionContract.SessionData; import java.util.Date; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java index 8d916c7fe9..d97db3fd46 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java @@ -13,9 +13,9 @@ import android.widget.ListView; import android.widget.TextView; -import org.droidplanner.services.android.R; +import org.droidplanner.android.client.R; +import org.droidplanner.services.android.impl.utils.file.FileUtils; import org.droidplanner.services.android.lib.data.ServiceDataContract; -import org.droidplanner.services.android.utils.file.FileUtils; import java.io.File; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java index 6ac07c1435..ef8f874e42 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.impl.utils; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.model.AutopilotWarningParser; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; import org.droidplanner.services.android.lib.drone.attribute.error.ErrorType; import java.util.Locale; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java index e61513123b..a511c69e60 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidLogger.java @@ -2,7 +2,7 @@ import android.util.Log; -import org.droidplanner.services.android.core.model.Logger; +import org.droidplanner.services.android.impl.core.model.Logger; /** * Android specific implementation for the {org.droidplanner.services.android.core.model.Logger} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java index 04a73420ef..6134c02f9d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java @@ -12,26 +12,26 @@ import com.MAVLink.enums.MAG_CAL_STATUS; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; -import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; -import org.droidplanner.services.android.core.drone.autopilot.Drone; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.autopilot.apm.ArduPilot; -import org.droidplanner.services.android.core.drone.autopilot.generic.GenericMavLinkDrone; -import org.droidplanner.services.android.core.drone.profiles.ParameterManager; -import org.droidplanner.services.android.core.drone.variables.ApmModes; -import org.droidplanner.services.android.core.drone.variables.Camera; -import org.droidplanner.services.android.core.drone.variables.GuidedPoint; -import org.droidplanner.services.android.core.drone.variables.calibration.AccelCalibration; -import org.droidplanner.services.android.core.drone.variables.calibration.MagnetometerCalibrationImpl; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.core.gcs.follow.Follow; -import org.droidplanner.services.android.core.gcs.follow.FollowAlgorithm; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.survey.SplineSurveyImpl; -import org.droidplanner.services.android.core.mission.survey.SurveyImpl; -import org.droidplanner.services.android.core.mission.waypoints.StructureScannerImpl; -import org.droidplanner.services.android.core.survey.Footprint; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.impl.core.MAVLink.command.doCmd.MavLinkDoCmds; +import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.ArduPilot; +import org.droidplanner.services.android.impl.core.drone.autopilot.generic.GenericMavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.profiles.ParameterManager; +import org.droidplanner.services.android.impl.core.drone.variables.ApmModes; +import org.droidplanner.services.android.impl.core.drone.variables.Camera; +import org.droidplanner.services.android.impl.core.drone.variables.GuidedPoint; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.AccelCalibration; +import org.droidplanner.services.android.impl.core.drone.variables.calibration.MagnetometerCalibrationImpl; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.core.gcs.follow.Follow; +import org.droidplanner.services.android.impl.core.gcs.follow.FollowAlgorithm; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.survey.SplineSurveyImpl; +import org.droidplanner.services.android.impl.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.StructureScannerImpl; +import org.droidplanner.services.android.impl.core.survey.Footprint; import org.droidplanner.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.attribute.AttributeType; @@ -377,7 +377,7 @@ public static State getState(MavLinkDrone drone, boolean isConnected, Vibration if (drone == null) return new State(); - org.droidplanner.services.android.core.drone.variables.State droneState = drone.getState(); + org.droidplanner.services.android.impl.core.drone.variables.State droneState = drone.getState(); ApmModes droneMode = droneState.getMode(); AccelCalibration accelCalibration = drone.getCalibrationSetup(); String calibrationMessage = accelCalibration != null && accelCalibration.isCalibrating() @@ -407,7 +407,7 @@ public static Mission getMission(MavLinkDrone drone) { if (drone == null) return proxyMission; - org.droidplanner.services.android.core.mission.Mission droneMission = drone.getMission(); + org.droidplanner.services.android.impl.core.mission.Mission droneMission = drone.getMission(); List droneMissionItemImpls = droneMission.getComponentItems(); @@ -586,7 +586,7 @@ public static void setMission(MavLinkDrone drone, Mission mission, boolean pushT if (drone == null) return; - org.droidplanner.services.android.core.mission.Mission droneMission = drone.getMission(); + org.droidplanner.services.android.impl.core.mission.Mission droneMission = drone.getMission(); droneMission.clearMissionItems(); List itemsList = mission.getMissionItems(); @@ -684,7 +684,7 @@ public static void arm(final ArduPilot drone, final boolean arm, final boolean e return; if (!arm && emergencyDisarm) { - if (org.droidplanner.services.android.core.drone.variables.Type.isCopter(drone.getType()) && !isKillSwitchSupported(drone)) { + if (org.droidplanner.services.android.impl.core.drone.variables.Type.isCopter(drone.getType()) && !isKillSwitchSupported(drone)) { changeVehicleMode(drone, VehicleMode.COPTER_STABILIZE, new AbstractCommandListener() { @Override @@ -732,7 +732,7 @@ public static boolean isKillSwitchSupported(MavLinkDrone drone) { if (drone == null) return false; - if (!org.droidplanner.services.android.core.drone.variables.Type.isCopter(drone.getType())) + if (!org.droidplanner.services.android.impl.core.drone.variables.Type.isCopter(drone.getType())) return false; String firmwareVersion = drone.getFirmwareVersion(); @@ -906,7 +906,7 @@ public static void buildComplexMissionItem(MavLinkDrone drone, Bundle itemBundle } public static Survey buildSurvey(MavLinkDrone drone, Survey survey) { - org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); + org.droidplanner.services.android.impl.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); SurveyImpl updatedSurveyImpl = (SurveyImpl) ProxyUtils.getMissionItemImpl (droneMission, survey); @@ -914,7 +914,7 @@ public static Survey buildSurvey(MavLinkDrone drone, Survey survey) { } public static Survey buildSplineSurvey(MavLinkDrone drone, Survey survey) { - org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); + org.droidplanner.services.android.impl.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); SplineSurveyImpl updatedSplineSurvey = (SplineSurveyImpl) ProxyUtils.getMissionItemImpl(droneMission, survey); @@ -922,7 +922,7 @@ public static Survey buildSplineSurvey(MavLinkDrone drone, Survey survey) { } public static StructureScanner buildStructureScanner(MavLinkDrone drone, StructureScanner item) { - org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); + org.droidplanner.services.android.impl.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); StructureScannerImpl updatedScan = (StructureScannerImpl) ProxyUtils .getMissionItemImpl(droneMission, item); diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java index b8944b4737..2d37f21c1c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import org.droidplanner.services.android.BuildConfig; +import org.droidplanner.android.client.BuildConfig; import java.io.File; import java.io.FileOutputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java index 34581eb814..55d2a46f47 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java @@ -7,7 +7,7 @@ import android.net.wifi.WifiManager; import org.droidplanner.services.android.BuildConfig; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; /** * Created by Fredia Huya-Kouadio on 5/11/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java index 1080fc7cf3..df2b2398b4 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java @@ -2,28 +2,28 @@ import android.util.Log; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.MissionItemImpl; -import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; -import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; -import org.droidplanner.services.android.core.mission.commands.ConditionYawImpl; -import org.droidplanner.services.android.core.mission.commands.DoJumpImpl; -import org.droidplanner.services.android.core.mission.commands.EpmGripperImpl; -import org.droidplanner.services.android.core.mission.commands.ReturnToHomeImpl; -import org.droidplanner.services.android.core.mission.commands.SetRelayImpl; -import org.droidplanner.services.android.core.mission.commands.SetServoImpl; -import org.droidplanner.services.android.core.mission.commands.TakeoffImpl; -import org.droidplanner.services.android.core.mission.survey.SplineSurveyImpl; -import org.droidplanner.services.android.core.mission.survey.SurveyImpl; -import org.droidplanner.services.android.core.mission.waypoints.CircleImpl; -import org.droidplanner.services.android.core.mission.waypoints.DoLandStartImpl; -import org.droidplanner.services.android.core.mission.waypoints.LandImpl; -import org.droidplanner.services.android.core.mission.waypoints.RegionOfInterestImpl; -import org.droidplanner.services.android.core.mission.waypoints.SplineWaypointImpl; -import org.droidplanner.services.android.core.mission.waypoints.StructureScannerImpl; -import org.droidplanner.services.android.core.mission.waypoints.WaypointImpl; -import org.droidplanner.services.android.core.survey.CameraInfo; -import org.droidplanner.services.android.core.survey.SurveyData; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; +import org.droidplanner.services.android.impl.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ChangeSpeedImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ConditionYawImpl; +import org.droidplanner.services.android.impl.core.mission.commands.DoJumpImpl; +import org.droidplanner.services.android.impl.core.mission.commands.EpmGripperImpl; +import org.droidplanner.services.android.impl.core.mission.commands.ReturnToHomeImpl; +import org.droidplanner.services.android.impl.core.mission.commands.SetRelayImpl; +import org.droidplanner.services.android.impl.core.mission.commands.SetServoImpl; +import org.droidplanner.services.android.impl.core.mission.commands.TakeoffImpl; +import org.droidplanner.services.android.impl.core.mission.survey.SplineSurveyImpl; +import org.droidplanner.services.android.impl.core.mission.survey.SurveyImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.CircleImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.DoLandStartImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.LandImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.RegionOfInterestImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.SplineWaypointImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.StructureScannerImpl; +import org.droidplanner.services.android.impl.core.mission.waypoints.WaypointImpl; +import org.droidplanner.services.android.impl.core.survey.CameraInfo; +import org.droidplanner.services.android.impl.core.survey.SurveyData; import org.droidplanner.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; import org.droidplanner.services.android.lib.drone.mission.item.command.CameraTrigger; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java index 0867f1a6f8..193ec4ef6a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java @@ -3,9 +3,9 @@ import android.os.RemoteException; import android.util.Pair; -import org.droidplanner.services.android.core.drone.autopilot.Drone; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; -import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; +import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.ArduSolo; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; import org.droidplanner.services.android.lib.drone.companion.solo.SoloState; import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java index 0f92408853..7e56f03ff1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java @@ -8,11 +8,10 @@ import com.google.android.gms.analytics.Logger; import com.google.android.gms.analytics.Tracker; -import org.droidplanner.services.android.BuildConfig; -import org.droidplanner.services.android.DroidPlannerServicesApp; -import org.droidplanner.services.android.R; +import org.droidplanner.android.client.BuildConfig; +import org.droidplanner.android.client.R; +import org.droidplanner.services.android.impl.utils.prefs.DroidPlannerPrefs; import org.droidplanner.services.android.lib.drone.connection.DroneSharePrefs; -import org.droidplanner.services.android.utils.prefs.DroidPlannerPrefs; import java.util.Map; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java index 64ad7aa434..6dec4841d9 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java @@ -5,7 +5,7 @@ import android.content.Intent; import android.support.v4.content.LocalBroadcastManager; -import org.droidplanner.services.android.ui.fragment.RecommendedAppsFragment; +import org.droidplanner.services.android.impl.ui.fragment.RecommendedAppsFragment; /** * Created by Fredia Huya-Kouadio on 2/5/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java index 6786e322db..43fdbae28d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java @@ -22,7 +22,7 @@ import android.widget.Toast; import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.utils.NetworkUtils; +import org.droidplanner.services.android.impl.utils.NetworkUtils; import java.util.List; import java.util.concurrent.atomic.AtomicReference; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java index 6c0f11ee8c..97d0858da5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoLoader.java @@ -2,8 +2,8 @@ import android.content.Context; -import org.droidplanner.services.android.core.survey.CameraInfo; -import org.droidplanner.services.android.utils.file.FileUtils; +import org.droidplanner.services.android.impl.core.survey.CameraInfo; +import org.droidplanner.services.android.impl.utils.file.FileUtils; import java.io.File; import java.io.FileInputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java index 2a68aee35d..7c2ffaa00b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/CameraInfoReader.java @@ -2,7 +2,7 @@ import android.util.Xml; -import org.droidplanner.services.android.core.survey.CameraInfo; +import org.droidplanner.services.android.impl.core.survey.CameraInfo; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java index 0fb67ec23a..ba6c03898c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ExceptionWriter.java @@ -2,7 +2,7 @@ import android.content.Context; -import org.droidplanner.services.android.utils.file.FileUtils; +import org.droidplanner.services.android.impl.utils.file.FileUtils; import java.io.PrintStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java index 4d493a5fea..25b6b9f747 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/ParameterMetadataLoader.java @@ -3,7 +3,7 @@ import android.content.Context; import android.util.Xml; -import org.droidplanner.services.android.core.drone.profiles.ParameterMetadata; +import org.droidplanner.services.android.impl.core.drone.profiles.ParameterMetadata; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java index 20cb4d47ab..da56cfdee0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/file/IO/VehicleProfileReader.java @@ -4,10 +4,10 @@ import android.content.res.AssetManager; import android.util.Xml; -import org.droidplanner.services.android.core.drone.profiles.VehicleProfile; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.utils.file.AssetUtil; -import org.droidplanner.services.android.utils.file.DirectoryPath; +import org.droidplanner.services.android.impl.core.drone.profiles.VehicleProfile; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.utils.file.AssetUtil; +import org.droidplanner.services.android.impl.utils.file.DirectoryPath; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java index 55793d4bc7..c08db2dfd6 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/prefs/DroidPlannerPrefs.java @@ -4,10 +4,10 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; -import org.droidplanner.services.android.core.drone.profiles.VehicleProfile; -import org.droidplanner.services.android.core.drone.variables.StreamRates.Rates; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.utils.file.IO.VehicleProfileReader; +import org.droidplanner.services.android.impl.core.drone.profiles.VehicleProfile; +import org.droidplanner.services.android.impl.core.drone.variables.StreamRates.Rates; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.utils.file.IO.VehicleProfileReader; /** * Provides structured access to 3DR Services preferences @@ -18,7 +18,7 @@ * This is called the DRY (don't repeat yourself) principle of software * development. */ -public class DroidPlannerPrefs implements org.droidplanner.services.android.core.drone.Preferences { +public class DroidPlannerPrefs implements org.droidplanner.services.android.impl.core.drone.Preferences { public static final int DEFAULT_STREAM_RATE = 2; //Hz diff --git a/ClientLib/src/main/res/xml/google_analytics_tracker.xml b/ClientLib/src/main/res/xml/google_analytics_tracker.xml new file mode 100644 index 0000000000..41d7498a2b --- /dev/null +++ b/ClientLib/src/main/res/xml/google_analytics_tracker.xml @@ -0,0 +1,45 @@ + + + + + + + UA-51862927-3 + + + 600 + + + 300 + + + true + + + true + + + + Flight Screen + + + + Editor Screen + + + + Configuration Screen + + + + Settings Screen + + + + Map Preferences Screen + + \ No newline at end of file From 43bfb8027185f21a65894116a5814802ec5d04f6 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Fri, 13 May 2016 11:19:51 -0700 Subject: [PATCH 005/113] Continue fixes of path issues --- ClientLib/build.gradle | 45 ++++++++++++++++ .../android/impl/api/DroidPlannerService.java | 49 ++++++++++++++---- .../drone/autopilot/apm/solo/SoloComp.java | 4 +- .../apm/solo/sololink/SoloLinkManager.java | 4 +- .../impl/ui/activity/UsbIntentReceiver.java | 1 + .../android/impl/utils/NetworkUtils.java | 2 +- .../android/impl/utils/analytics/GAUtils.java | 3 +- .../impl/utils/apps/AppsUpdateReceiver.java | 20 ------- .../main/res/drawable-hdpi/ic_stat_notify.png | Bin 0 -> 4228 bytes .../main/res/drawable-mdpi/ic_stat_notify.png | Bin 0 -> 3198 bytes .../res/drawable-xhdpi/ic_stat_notify.png | Bin 0 -> 3731 bytes .../res/drawable-xxhdpi/ic_stat_notify.png | Bin 0 -> 4222 bytes .../res/drawable-xxxhdpi/ic_stat_notify.png | Bin 0 -> 4768 bytes .../layout/activity_tlog_file_selector.xml | 32 ++++++++++++ .../layout/activity_usb_intent_receiver.xml | 8 +++ .../main/res/layout/list_item_tlog_info.xml | 11 ++++ ClientLib/src/main/res/values/strings.xml | 2 + ServiceApp/build.gradle | 3 -- 18 files changed, 146 insertions(+), 38 deletions(-) delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java create mode 100644 ClientLib/src/main/res/drawable-hdpi/ic_stat_notify.png create mode 100644 ClientLib/src/main/res/drawable-mdpi/ic_stat_notify.png create mode 100644 ClientLib/src/main/res/drawable-xhdpi/ic_stat_notify.png create mode 100644 ClientLib/src/main/res/drawable-xxhdpi/ic_stat_notify.png create mode 100644 ClientLib/src/main/res/drawable-xxxhdpi/ic_stat_notify.png create mode 100644 ClientLib/src/main/res/layout/activity_tlog_file_selector.xml create mode 100644 ClientLib/src/main/res/layout/activity_usb_intent_receiver.xml create mode 100644 ClientLib/src/main/res/layout/list_item_tlog_info.xml diff --git a/ClientLib/build.gradle b/ClientLib/build.gradle index 485365fbff..bddbb939a6 100644 --- a/ClientLib/build.gradle +++ b/ClientLib/build.gradle @@ -14,6 +14,14 @@ ext { PROJECT_LICENSES = ['Apache-2.0'] } +//Log levels values +def logLevelVerbose = 2; +def logLevelDebug = 3; +def logLevelInfo = 4; +def logLevelWarn = 5; +def logLevelError = 6; +def logLevelAssert = 7; + android { compileSdkVersion android_build_sdk_version buildToolsVersion android_build_tools_version @@ -23,6 +31,13 @@ android { targetSdkVersion android_build_target_sdk_version versionCode PUBLISH_VERSION_CODE versionName PUBLISH_VERSION + + //Build config fields + buildConfigField "boolean", "SITL_DEBUG", "false" + buildConfigField "String", "SOLO_LINK_IP", getSoloLinkIp() + buildConfigField "boolean", "WRITE_LOG_FILE", "false" + buildConfigField "int", "LOG_FILE_LEVEL", "$logLevelDebug" + buildConfigField "boolean", "ENABLE_CRASHLYTICS", "false" } sourceSets { @@ -52,6 +67,17 @@ android { } } } + + buildTypes { + debug { + debuggable true + buildConfigField "boolean", "WRITE_LOG_FILE", "true" + } + + release { + buildConfigField "boolean", "ENABLE_CRASHLYTICS", "true" + } + } } dependencies { @@ -71,10 +97,29 @@ dependencies { //MP4 generation library compile 'com.googlecode.mp4parser:isoparser:1.1.7' + compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') { + transitive = true; + } + debugCompile project(':Mavlink') releaseCompile files('libs/Mavlink.jar') compile files('libs/d2xx.jar') + + debugCompile project(':UsbSerialLibrary') + releaseCompile project(':UsbSerialLibrary') +} + +def getSoloLinkIp() { + return '\"10.1.1.10\"' +} + +def getLocalIp() { + try { + return '\"' + InetAddress.getLocalHost().getCanonicalHostName() + '\"' + }catch(Exception e){ + return '\"\"' + } } assemble.dependsOn ':Mavlink:jar' diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java index c4b5c52497..7ff60faa99 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java @@ -2,7 +2,6 @@ import android.annotation.SuppressLint; import android.app.Notification; -import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; @@ -15,8 +14,10 @@ import org.droidplanner.android.client.R; import org.droidplanner.services.android.impl.core.drone.DroneManager; -import org.droidplanner.services.android.impl.utils.Utils; import org.droidplanner.services.android.impl.core.survey.CameraInfo; +import org.droidplanner.services.android.impl.utils.LogToFileTree; +import org.droidplanner.services.android.impl.utils.Utils; +import org.droidplanner.services.android.impl.utils.analytics.GAUtils; import org.droidplanner.services.android.impl.utils.file.IO.CameraInfoLoader; import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; @@ -54,6 +55,11 @@ public class DroidPlannerService extends Service { */ private LocalBroadcastManager lbm; + /** + * Used to channel logging + */ + private LogToFileTree logToFileTree; + /** * Stores drone api instances per connected client. The client are denoted by their app id. */ @@ -206,8 +212,22 @@ public IBinder onBind(Intent intent) { public void onCreate() { super.onCreate(); - final DroidPlannerServicesApp dpApp = (DroidPlannerServicesApp) getApplication(); - dpApp.createFileStartLogging(); + //TODO: Figure out how to reenable crashlytics and timber logging from the library +// if(BuildConfig.ENABLE_CRASHLYTICS) { +// Fabric.with(this, new Crashlytics()); +// } +// +// if (BuildConfig.WRITE_LOG_FILE) { +// logToFileTree = new LogToFileTree(); +// Timber.plant(logToFileTree); +// } else if (BuildConfig.DEBUG) { +// Timber.plant(new Timber.DebugTree()); +// } +// + GAUtils.initGATracker(getApplication()); + GAUtils.startNewSession(null); + + createFileStartLogging(); Timber.d("Creating 3DR Services."); @@ -221,6 +241,18 @@ public void onCreate() { updateForegroundNotification(); } + private void createFileStartLogging() { + if (logToFileTree != null) { + logToFileTree.createFileStartLogging(getApplicationContext()); + } + } + + private void closeLogFile() { + if(logToFileTree != null) { + logToFileTree.stopLoggingThread(); + } + } + @SuppressLint("NewApi") private void updateForegroundNotification() { final Context context = getApplicationContext(); @@ -229,9 +261,9 @@ private void updateForegroundNotification() { final NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(context) .setContentTitle("3DR Services") .setPriority(NotificationCompat.PRIORITY_MIN) - .setSmallIcon(R.drawable.ic_stat_notify) - .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, - MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0)); + .setSmallIcon(R.drawable.ic_stat_notify); +// .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, +// MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0)); final int connectedCount = droneApiStore.size(); if (connectedCount > 0) { @@ -265,8 +297,7 @@ public void onDestroy() { stopForeground(true); - final DroidPlannerServicesApp dpApp = (DroidPlannerServicesApp) getApplication(); - dpApp.closeLogFile(); + closeLogFile(); } @Override diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java index c1078f0b4b..b46d259344 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java @@ -8,11 +8,12 @@ import android.util.Pair; import android.util.SparseArray; -import org.droidplanner.services.android.BuildConfig; +import org.droidplanner.android.client.BuildConfig; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkListener; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink.SoloLinkListener; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink.SoloLinkManager; +import org.droidplanner.services.android.impl.utils.NetworkUtils; import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; @@ -29,7 +30,6 @@ import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.impl.utils.NetworkUtils; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java index 9aa45b86e7..05cf3e041f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java @@ -4,12 +4,13 @@ import android.os.Handler; import android.text.TextUtils; +import org.droidplanner.android.client.BuildConfig; import org.droidplanner.android.client.utils.connection.TcpConnection; import org.droidplanner.android.client.utils.connection.UdpConnection; -import org.droidplanner.services.android.BuildConfig; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; +import org.droidplanner.services.android.impl.utils.connection.SshConnection; import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; @@ -21,7 +22,6 @@ import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; import org.droidplanner.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.lib.model.SimpleCommandListener; -import org.droidplanner.services.android.impl.utils.connection.SshConnection; import java.io.IOException; import java.net.UnknownHostException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java index be6b9e6a21..f483ec260c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java @@ -2,6 +2,7 @@ import android.content.Intent; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; import org.droidplanner.android.client.R; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java index 55d2a46f47..1a378fa46f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java @@ -6,7 +6,7 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import org.droidplanner.services.android.BuildConfig; +import org.droidplanner.android.client.BuildConfig; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; /** diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java index 7e56f03ff1..62600e94a5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java @@ -1,5 +1,6 @@ package org.droidplanner.services.android.impl.utils.analytics; +import android.app.Application; import android.content.Context; import android.util.Log; @@ -72,7 +73,7 @@ public static class CustomDimension { */ private static Tracker sAppTracker; - public static void initGATracker(DroidPlannerServicesApp app) { + public static void initGATracker(Application app) { if (sAppTracker == null) { final Context context = app.getApplicationContext(); diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java deleted file mode 100644 index 6dec4841d9..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/apps/AppsUpdateReceiver.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.droidplanner.services.android.impl.utils.apps; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.support.v4.content.LocalBroadcastManager; - -import org.droidplanner.services.android.impl.ui.fragment.RecommendedAppsFragment; - -/** - * Created by Fredia Huya-Kouadio on 2/5/15. - */ -public class AppsUpdateReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - LocalBroadcastManager.getInstance(context) - .sendBroadcast(new Intent(RecommendedAppsFragment.ACTION_REFRESH_RECOMMENDED_APPS)); - } -} diff --git a/ClientLib/src/main/res/drawable-hdpi/ic_stat_notify.png b/ClientLib/src/main/res/drawable-hdpi/ic_stat_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae0074ce7dfb263a2c66ac2255444f1c2b35594 GIT binary patch literal 4228 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 P2f3N?8KW`-r;z^ve;`j9 literal 0 HcmV?d00001 diff --git a/ClientLib/src/main/res/drawable-mdpi/ic_stat_notify.png b/ClientLib/src/main/res/drawable-mdpi/ic_stat_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..10a6ecfa2539148c52b7b882722ef9ff22674cfe GIT binary patch literal 3198 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 literal 0 HcmV?d00001 diff --git a/ClientLib/src/main/res/drawable-xhdpi/ic_stat_notify.png b/ClientLib/src/main/res/drawable-xhdpi/ic_stat_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..494fd8d040773c8f3f43541d8a0316e0e8001214 GIT binary patch literal 3731 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 literal 0 HcmV?d00001 diff --git a/ClientLib/src/main/res/drawable-xxxhdpi/ic_stat_notify.png b/ClientLib/src/main/res/drawable-xxxhdpi/ic_stat_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..76229b72097ce4b7b199c1bfbe995e83f66f5eeb GIT binary patch literal 4768 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 XMgC>C2dY#bp6QJZ%=Q1(b$j+duu(}> literal 0 HcmV?d00001 diff --git a/ClientLib/src/main/res/layout/activity_tlog_file_selector.xml b/ClientLib/src/main/res/layout/activity_tlog_file_selector.xml new file mode 100644 index 0000000000..358443fb43 --- /dev/null +++ b/ClientLib/src/main/res/layout/activity_tlog_file_selector.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ClientLib/src/main/res/layout/activity_usb_intent_receiver.xml b/ClientLib/src/main/res/layout/activity_usb_intent_receiver.xml new file mode 100644 index 0000000000..c8a5a808c2 --- /dev/null +++ b/ClientLib/src/main/res/layout/activity_usb_intent_receiver.xml @@ -0,0 +1,8 @@ + + diff --git a/ClientLib/src/main/res/layout/list_item_tlog_info.xml b/ClientLib/src/main/res/layout/list_item_tlog_info.xml new file mode 100644 index 0000000000..c6a62ebca4 --- /dev/null +++ b/ClientLib/src/main/res/layout/list_item_tlog_info.xml @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/ClientLib/src/main/res/values/strings.xml b/ClientLib/src/main/res/values/strings.xml index 1b088e5d76..5d4acc9a80 100644 --- a/ClientLib/src/main/res/values/strings.xml +++ b/ClientLib/src/main/res/values/strings.xml @@ -68,4 +68,6 @@ Auto-tune Position Hold Mission + + Telemetry Log Files diff --git a/ServiceApp/build.gradle b/ServiceApp/build.gradle index 16882fa486..5c7f4c62d8 100644 --- a/ServiceApp/build.gradle +++ b/ServiceApp/build.gradle @@ -12,10 +12,7 @@ dependencies { compile "com.android.support:cardview-v7:${support_lib_version}" compile "com.android.support:recyclerview-v7:${support_lib_version}" - compile files('libs/d2xx.jar') - compile project(':ClientLib') - compile project(':UsbSerialLibrary') compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') { transitive = true; From a859a66a9b54d3dc55ea574303a18cabeb4fc4c1 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Fri, 13 May 2016 11:54:24 -0700 Subject: [PATCH 006/113] Update the client library manifest file to incorporate the newly added components --- ClientLib/src/main/AndroidManifest.xml | 69 +++++++++++++++++++- ClientLib/src/main/res/values/strings.xml | 1 + ClientLib/src/main/res/values/themes.xml | 17 +++++ ClientLib/src/main/res/xml/device_filter.xml | 18 +++++ ClientLib/src/main/res/xml/filepaths.xml | 4 ++ ServiceApp/res/values/strings.xml | 1 - 6 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 ClientLib/src/main/res/values/themes.xml create mode 100644 ClientLib/src/main/res/xml/device_filter.xml create mode 100644 ClientLib/src/main/res/xml/filepaths.xml diff --git a/ClientLib/src/main/AndroidManifest.xml b/ClientLib/src/main/AndroidManifest.xml index af959311c2..83a45a5d5b 100644 --- a/ClientLib/src/main/AndroidManifest.xml +++ b/ClientLib/src/main/AndroidManifest.xml @@ -34,7 +34,14 @@ android:name="android.hardware.location" android:required="false"/> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ClientLib/src/main/res/values/strings.xml b/ClientLib/src/main/res/values/strings.xml index 5d4acc9a80..1241e64a23 100644 --- a/ClientLib/src/main/res/values/strings.xml +++ b/ClientLib/src/main/res/values/strings.xml @@ -70,4 +70,5 @@ Mission Telemetry Log Files + Telemetry Logs File Selector diff --git a/ClientLib/src/main/res/values/themes.xml b/ClientLib/src/main/res/values/themes.xml new file mode 100644 index 0000000000..6eb47788da --- /dev/null +++ b/ClientLib/src/main/res/values/themes.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/ClientLib/src/main/res/xml/device_filter.xml b/ClientLib/src/main/res/xml/device_filter.xml new file mode 100644 index 0000000000..8f32775e98 --- /dev/null +++ b/ClientLib/src/main/res/xml/device_filter.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ClientLib/src/main/res/xml/filepaths.xml b/ClientLib/src/main/res/xml/filepaths.xml new file mode 100644 index 0000000000..32138116e7 --- /dev/null +++ b/ClientLib/src/main/res/xml/filepaths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ServiceApp/res/values/strings.xml b/ServiceApp/res/values/strings.xml index 4fe13c6d06..3db0187efc 100644 --- a/ServiceApp/res/values/strings.xml +++ b/ServiceApp/res/values/strings.xml @@ -11,7 +11,6 @@ Upload successful! Select to view… Will try again later Droneshare upload - Telemetry Logs File Selector Telemetry Log Files Stream Rates From 7bd4a36105ebb757ad803af5ea65d3b6a3ef42c3 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Fri, 13 May 2016 12:17:38 -0700 Subject: [PATCH 007/113] Clean gradle build files --- ClientLib/build.gradle | 1 + ServiceApp/build.gradle | 3 --- build.gradle | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/ClientLib/build.gradle b/ClientLib/build.gradle index bddbb939a6..339b96355d 100644 --- a/ClientLib/build.gradle +++ b/ClientLib/build.gradle @@ -29,6 +29,7 @@ android { defaultConfig { minSdkVersion android_build_min_sdk_version targetSdkVersion android_build_target_sdk_version + versionCode PUBLISH_VERSION_CODE versionName PUBLISH_VERSION diff --git a/ServiceApp/build.gradle b/ServiceApp/build.gradle index 5c7f4c62d8..66fd6610a3 100644 --- a/ServiceApp/build.gradle +++ b/ServiceApp/build.gradle @@ -21,9 +21,6 @@ dependencies { compile 'com.jakewharton.timber:timber:3.1.0' compile 'com.jcraft:jsch:0.1.51' - compile "com.squareup.okhttp:okhttp:${okhttp_version}" - compile "com.squareup.okhttp:okhttp-urlconnection:${okhttp_version}" - //Java semver library compile 'com.github.zafarkhaja:java-semver:0.9.0' diff --git a/build.gradle b/build.gradle index 3dc9ef094d..325bac16ae 100644 --- a/build.gradle +++ b/build.gradle @@ -3,8 +3,7 @@ buildscript { ext { play_services_version = '8.4.0' - support_lib_version = '23.1.1' - okhttp_version = '2.5.0' + support_lib_version = '23.4.0' android_build_sdk_version = 23 android_build_tools_version = '23.0.2' From fe37c5a581f4aa32866024044491e8bffdcb3458 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Tue, 17 May 2016 15:31:00 -0700 Subject: [PATCH 008/113] Fix quote character in the javadocs --- .../lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java | 2 +- .../lib/drone/mission/item/spatial/RegionOfInterest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java index c758da3220..d05e1717da 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java @@ -21,7 +21,7 @@ * indicate that it has reached the Path and is prepared to receive SOLO_SPLINE_SEEK messages. * * - * This message is only valid once after a Path is loaded. There is no corresponding “detach” + * This message is only valid once after a Path is loaded. There is no corresponding "detach" * message -- the vehicle stays attached until playback mode is exited. * * @since 2.8.0 diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java index 0a32beaea7..1af44358b4 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java @@ -6,7 +6,7 @@ import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; /** - * Points the nose of the vehicle and camera gimbal at the “region of interest”. + * Points the nose of the vehicle and camera gimbal at the "region of interest". * Created by fhuya on 11/6/14. */ public class RegionOfInterest extends BaseSpatialItem implements android.os.Parcelable { From 7238feb94ec5ab63c032a235d21ab1c58897651e Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Tue, 17 May 2016 18:11:25 -0700 Subject: [PATCH 009/113] Update the gradle build files to exclude the implementation logic --- ClientLib/build.gradle | 3 ++- ServiceApp/libs/d2xx.jar | Bin 131697 -> 0 bytes release_android_library.gradle | 3 ++- settings.gradle | 11 +++++++---- 4 files changed, 11 insertions(+), 6 deletions(-) delete mode 100755 ServiceApp/libs/d2xx.jar diff --git a/ClientLib/build.gradle b/ClientLib/build.gradle index 339b96355d..dfd0807e54 100644 --- a/ClientLib/build.gradle +++ b/ClientLib/build.gradle @@ -123,6 +123,7 @@ def getLocalIp() { } } +evaluationDependsOn ':Mavlink' assemble.dependsOn ':Mavlink:jar' -apply from: "../release_android_library.gradle" \ No newline at end of file +apply from: "$rootDir/release_android_library.gradle" \ No newline at end of file diff --git a/ServiceApp/libs/d2xx.jar b/ServiceApp/libs/d2xx.jar deleted file mode 100755 index aea713f5b63a9bef95e488bf6bbe464a5fa1845c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131697 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%0ALoDQ@5nm)VNTdP18Nwv+_Tn3v0uq9Bs*nH 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 P!aoH~$Q98F%P{4C`k|VM diff --git a/release_android_library.gradle b/release_android_library.gradle index cf6f1f672c..45f28d1630 100644 --- a/release_android_library.gradle +++ b/release_android_library.gradle @@ -27,7 +27,7 @@ task androidJavadocs(type: Javadoc) { source = files title = projectDescription - exclude '**/*.aidl' + exclude '**/*.aidl', 'org/droidplanner/services/android/impl/**' classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) options.links("http://docs.oracle.com/javase/7/docs/api/") options.links("https://developer.android.com/reference/packages.html") @@ -41,6 +41,7 @@ task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs){ task androidSourcesJar(type: Jar){ classifier = 'sources' from android.sourceSets.main.java.srcDirs + exclude 'org/droidplanner/services/android/impl/**' } artifacts { diff --git a/settings.gradle b/settings.gradle index f8a9508776..9b385da1ca 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,11 +1,14 @@ -//Android projects -include ':ServiceApp', ':StarterApp' -include ':ClientLib' - //Library projects include ':Mavlink' include ':UsbSerialLibrary' +//Android library projects +include ':ClientLib' + +//Android projects +include ':ServiceApp' +include ':StarterApp' + project(':UsbSerialLibrary').projectDir = new File('dependencyLibs/usb-serial-for-android/UsbSerialLibrary') project(':Mavlink').projectDir = new File('dependencyLibs/Mavlink') project(':StarterApp').projectDir = new File('samples/StarterApp') \ No newline at end of file From 8f62427612d394a633ade3bb31bc61a5f7c51a09 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Wed, 18 May 2016 01:07:51 -0700 Subject: [PATCH 010/113] Update the connection logic for the ControlTower instance. The new logic reuse any existing services runtime, otherwise it fires its local version --- ClientLib/src/main/AndroidManifest.xml | 19 ++- .../android/client/ApiAvailability.java | 119 ++++++++++++++++++ .../android/client/ControlTower.java | 23 +--- .../android/client/DroneApiListener.java | 2 +- .../android/client/apis/ApiAvailability.java | 92 -------------- .../services/android/impl/api/DPServices.java | 2 +- .../android/impl/api/DroidPlannerService.java | 18 +++ .../lib/util/version/VersionUtils.java | 13 +- ClientLib/src/main/res/values/version.xml | 3 +- ServiceApp/AndroidManifest.xml | 4 +- .../services/android/api/DPServices.java | 2 +- 11 files changed, 171 insertions(+), 126 deletions(-) create mode 100644 ClientLib/src/main/java/org/droidplanner/android/client/ApiAvailability.java delete mode 100644 ClientLib/src/main/java/org/droidplanner/android/client/apis/ApiAvailability.java diff --git a/ClientLib/src/main/AndroidManifest.xml b/ClientLib/src/main/AndroidManifest.xml index 83a45a5d5b..86fe771849 100644 --- a/ClientLib/src/main/AndroidManifest.xml +++ b/ClientLib/src/main/AndroidManifest.xml @@ -97,16 +97,23 @@ + android:enabled="false"> + + - + + + + + + + android:name="com.o3dr.dronekit.android.core.version" + android:value="@integer/deprecated_lib_version" /> diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/ApiAvailability.java b/ClientLib/src/main/java/org/droidplanner/android/client/ApiAvailability.java new file mode 100644 index 0000000000..949e584c30 --- /dev/null +++ b/ClientLib/src/main/java/org/droidplanner/android/client/ApiAvailability.java @@ -0,0 +1,119 @@ +package org.droidplanner.android.client; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Bundle; +import android.support.annotation.NonNull; + +import org.droidplanner.android.client.utils.InstallServiceDialog; +import org.droidplanner.services.android.impl.api.DroidPlannerService; +import org.droidplanner.services.android.lib.model.IDroidPlannerServices; +import org.droidplanner.services.android.lib.util.version.VersionUtils; + +import java.util.List; + +/** + * Helper class to verify that the DroneKit-Android services APK is available and up-to-date + * Created by Fredia Huya-Kouadio on 7/7/15. + */ +class ApiAvailability { + + private static class LazyHolder { + private static final ApiAvailability INSTANCE = new ApiAvailability(); + } + + private static final String SERVICES_CLAZZ_NAME = IDroidPlannerServices.class.getName(); + private static final String METADATA_KEY = "org.droidplanner.services.android.lib.version"; + + private static final String DEPRECATED_SERVICES_CLAZZ_NAME = "com.o3dr.services.android.lib.model.IDroidPlannerServices"; + private static final String DEPRECATED_METADATA_KEY = "com.o3dr.dronekit.android.core.version"; + + public static final int API_AVAILABLE = 0; + public static final int API_MISSING = 1; + public static final int API_UPDATE_REQUIRED = 2; + + private static final int INVALID_LIB_VERSION = -1; + + //Private to prevent instantiation + private ApiAvailability() { + } + + static ApiAvailability getInstance() { + return LazyHolder.INSTANCE; + } + + /** + * Find and returns the most adequate instance of the services lib. + * + * @param context Application context. Must not be null. + * @return intent Intent used to bind to an instance of the services lib. + */ + Intent getAvailableServicesInstance(@NonNull final Context context) { + final PackageManager pm = context.getPackageManager(); + + //Check if an instance of the services library is up and running. + final Intent serviceIntent = new Intent(SERVICES_CLAZZ_NAME); + final List serviceInfos = pm.queryIntentServices(serviceIntent, PackageManager.GET_META_DATA); + if(serviceInfos != null && !serviceInfos.isEmpty()){ + for(ResolveInfo serviceInfo : serviceInfos) { + final Bundle metaData = serviceInfo.serviceInfo.metaData; + if (metaData == null) + continue; + + final int towerLibVersion = metaData.getInt(METADATA_KEY, INVALID_LIB_VERSION); + if (towerLibVersion != INVALID_LIB_VERSION && towerLibVersion >= VersionUtils.getTowerLibVersion(context)) { + serviceIntent.setClassName(serviceInfo.serviceInfo.packageName, serviceInfo.serviceInfo.name); + return serviceIntent; + } + } + } + + //TODO: For testing only.. Remove before release for shipping + final Intent deprecatedServiceIntent = new Intent(DEPRECATED_SERVICES_CLAZZ_NAME); + final List deprecatedServiceInfos = pm.queryIntentServices(deprecatedServiceIntent, PackageManager.GET_META_DATA); + if(deprecatedServiceInfos != null && !deprecatedServiceInfos.isEmpty()){ + for(ResolveInfo deprecatedServiceInfo : deprecatedServiceInfos){ + final Bundle deprecatedMetaData = deprecatedServiceInfo.serviceInfo.metaData; + if(deprecatedMetaData == null) + continue; + + final int deprecatedLibVersion = deprecatedMetaData.getInt(DEPRECATED_METADATA_KEY, INVALID_LIB_VERSION); + if(deprecatedLibVersion != INVALID_LIB_VERSION && deprecatedLibVersion >= VersionUtils.getDeprecatedLibVersion(context)){ + deprecatedServiceIntent.setClassName(deprecatedServiceInfo.serviceInfo.packageName, deprecatedServiceInfo.serviceInfo.name); + return deprecatedServiceIntent; + } + } + } + + //Didn't find any that's up and running. Enable the local one + DroidPlannerService.enableDroidPlannerService(context, true); + serviceIntent.setClass(context, DroidPlannerService.class); + return serviceIntent; + } + + /** + * Display a dialog for an error code returned from callback to {@link ApiAvailability#getAvailableServicesInstance(Context)} + * + * @param context Application context + * @param errorCode Error code returned from callback to + * {@link ApiAvailability#getAvailableServicesInstance(Context)}. If errorCode is API_AVAILABLE, then this does nothing. + */ + void showErrorDialog(Context context, int errorCode) { + switch (errorCode) { + case API_MISSING: + context.startActivity(new Intent(context, InstallServiceDialog.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(InstallServiceDialog.EXTRA_REQUIREMENT, InstallServiceDialog.REQUIRE_INSTALL)); + break; + + case API_UPDATE_REQUIRED: + context.startActivity(new Intent(context, InstallServiceDialog.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(InstallServiceDialog.EXTRA_REQUIREMENT, InstallServiceDialog.REQUIRE_UPDATE)); + break; + } + } + +} diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/ControlTower.java b/ClientLib/src/main/java/org/droidplanner/android/client/ControlTower.java index 264304758d..b7ae5f7bc6 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/ControlTower.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/ControlTower.java @@ -4,14 +4,12 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; -import org.droidplanner.android.client.apis.ApiAvailability; import org.droidplanner.android.client.interfaces.TowerListener; import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; import org.droidplanner.services.android.lib.model.IDroidPlannerServices; @@ -25,8 +23,6 @@ public class ControlTower { private static final String TAG = ControlTower.class.getSimpleName(); - private final Intent serviceIntent = new Intent(IDroidPlannerServices.class.getName()); - private final IBinder.DeathRecipient binderDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { @@ -134,22 +130,9 @@ public void connect(TowerListener listener) { towerListener = listener; if (!isTowerConnected() && !isServiceConnecting.get()) { - final int apiAvailableResult = ApiAvailability.getInstance().checkApiAvailability(context); - - switch(apiAvailableResult){ - case ApiAvailability.API_AVAILABLE: - final ResolveInfo info = context.getPackageManager().resolveService(serviceIntent, 0); - if (info != null) { - serviceIntent.setClassName(info.serviceInfo.packageName, info.serviceInfo.name); - isServiceConnecting.set(context.bindService(serviceIntent, o3drServicesConnection, - Context.BIND_AUTO_CREATE)); - } - break; - - default: - ApiAvailability.getInstance().showErrorDialog(context, apiAvailableResult); - break; - } + final Intent serviceIntent = ApiAvailability.getInstance().getAvailableServicesInstance(context); + isServiceConnecting.set(context.bindService(serviceIntent, o3drServicesConnection, + Context.BIND_AUTO_CREATE)); } } diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/DroneApiListener.java b/ClientLib/src/main/java/org/droidplanner/android/client/DroneApiListener.java index 52922dadd1..9708921ef8 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/DroneApiListener.java +++ b/ClientLib/src/main/java/org/droidplanner/android/client/DroneApiListener.java @@ -29,6 +29,6 @@ public int getClientVersionCode() throws RemoteException { @Override public int getApiVersionCode(){ - return VersionUtils.getCoreLibVersion(drone.getContext()); + return VersionUtils.getDeprecatedLibVersion(drone.getContext()); } } diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/ApiAvailability.java b/ClientLib/src/main/java/org/droidplanner/android/client/apis/ApiAvailability.java deleted file mode 100644 index 20e961102b..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/ApiAvailability.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.droidplanner.android.client.apis; - -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.support.annotation.NonNull; - -import org.droidplanner.android.client.utils.InstallServiceDialog; -import org.droidplanner.services.android.lib.model.IDroidPlannerServices; -import org.droidplanner.services.android.lib.util.version.VersionUtils; - -/** - * Helper class to verify that the DroneKit-Android services APK is available and up-to-date - * Created by Fredia Huya-Kouadio on 7/7/15. - */ -public class ApiAvailability { - - private static class LazyHolder { - private static final ApiAvailability INSTANCE = new ApiAvailability(); - } - - private static final String TAG = ApiAvailability.class.getSimpleName(); - - private static final String SERVICES_CLAZZ_NAME = IDroidPlannerServices.class.getName(); - private static final String METADATA_KEY = "com.o3dr.dronekit.android.core.version"; - - public static final int API_AVAILABLE = 0; - public static final int API_MISSING = 1; - public static final int API_UPDATE_REQUIRED = 2; - - //Private to prevent instantiation - private ApiAvailability() { - } - - public static ApiAvailability getInstance() { - return LazyHolder.INSTANCE; - } - - /** - * Verifies that DroneKit-Android services is installed and enabled on this device, and that the version - * installed is up-to-date. - * - * @param context Application context. Must not be null. - * @return status code indicating the availability of the api. - */ - public int checkApiAvailability(@NonNull final Context context) { - final PackageManager pm = context.getPackageManager(); - - //Check if DroneKit-Android services is installed. - final Intent serviceIntent = new Intent(SERVICES_CLAZZ_NAME); - final ResolveInfo serviceInfo = pm.resolveService(serviceIntent, PackageManager.GET_META_DATA); - if (serviceInfo == null) { - return API_MISSING; - } - - final Bundle metaData = serviceInfo.serviceInfo.metaData; - if (metaData == null) - return API_UPDATE_REQUIRED; - - final int coreLibVersion = metaData.getInt(METADATA_KEY); - if (coreLibVersion < VersionUtils.getCoreLibVersion(context)) - return API_UPDATE_REQUIRED; - else - return API_AVAILABLE; - } - - /** - * Display a dialog for an error code returned from callback to {@link ApiAvailability#checkApiAvailability(Context)} - * - * @param context Application context - * @param errorCode Error code returned from callback to - * {@link ApiAvailability#checkApiAvailability(Context)}. If errorCode is API_AVAILABLE, then this does nothing. - */ - public void showErrorDialog(Context context, int errorCode) { - switch (errorCode) { - case API_MISSING: - context.startActivity(new Intent(context, InstallServiceDialog.class) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(InstallServiceDialog.EXTRA_REQUIREMENT, InstallServiceDialog.REQUIRE_INSTALL)); - break; - - case API_UPDATE_REQUIRED: - context.startActivity(new Intent(context, InstallServiceDialog.class) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(InstallServiceDialog.EXTRA_REQUIREMENT, InstallServiceDialog.REQUIRE_UPDATE)); - break; - } - } - -} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java index 3cb04d73e1..6bf33e0f77 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java @@ -40,7 +40,7 @@ public int getServiceVersionCode() throws RemoteException { @Override public int getApiVersionCode() throws RemoteException { - return VersionUtils.getCoreLibVersion(serviceRef.getApplicationContext()); + return VersionUtils.getDeprecatedLibVersion(serviceRef.getApplicationContext()); } @Override diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java index 7ff60faa99..97229d63ca 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java @@ -3,8 +3,10 @@ import android.annotation.SuppressLint; import android.app.Notification; import android.app.Service; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -298,6 +300,9 @@ public void onDestroy() { stopForeground(true); closeLogFile(); + + //Disable this service. It'll be reenabled the next time its local client needs it. + enableDroidPlannerService(getApplicationContext(), false); } @Override @@ -317,4 +322,17 @@ public int onStartCommand(Intent intent, int flags, int startId) { return START_NOT_STICKY; } + /** + * Toggles the DroidPlannerService component + * @param context + * @param enable + */ + public static void enableDroidPlannerService(Context context, boolean enable){ + final ComponentName serviceComp = new ComponentName(context, DroidPlannerService.class); + final int newState = enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED + : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; + + context.getPackageManager().setComponentEnabledSetting(serviceComp, newState, PackageManager.DONT_KILL_APP); + } + } diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java index 717bc447a0..032ec52e0c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java @@ -9,8 +9,17 @@ */ public class VersionUtils { - public static int getCoreLibVersion(Context context){ - return context.getResources().getInteger(R.integer.core_lib_version); + /** + * @deprecated + * @param context + * @return + */ + public static int getDeprecatedLibVersion(Context context){ + return context.getResources().getInteger(R.integer.deprecated_lib_version); + } + + public static int getTowerLibVersion(Context context){ + return context.getResources().getInteger(R.integer.tower_lib_version); } //Prevent instantiation. diff --git a/ClientLib/src/main/res/values/version.xml b/ClientLib/src/main/res/values/version.xml index 90de7a4a26..9c7bdc2c21 100644 --- a/ClientLib/src/main/res/values/version.xml +++ b/ClientLib/src/main/res/values/version.xml @@ -1,4 +1,5 @@ - 20905 + 20905 + 0 \ No newline at end of file diff --git a/ServiceApp/AndroidManifest.xml b/ServiceApp/AndroidManifest.xml index ad206dbaa4..3499af9d44 100644 --- a/ServiceApp/AndroidManifest.xml +++ b/ServiceApp/AndroidManifest.xml @@ -104,7 +104,7 @@ + android:value="@integer/deprecated_lib_version"/> Date: Wed, 18 May 2016 01:22:45 -0700 Subject: [PATCH 011/113] Revert to original package name for compatibility --- .../o3dr}/android/client/ApplicationTest.java | 2 +- ClientLib/src/main/AndroidManifest.xml | 15 +-- .../o3dr}/android/client/ApiAvailability.java | 35 ++---- .../o3dr}/android/client/ControlTower.java | 8 +- .../o3dr}/android/client/Drone.java | 90 ++++++++-------- .../android/client/DroneApiListener.java | 10 +- .../o3dr}/android/client/DroneObserver.java | 4 +- .../o3dr}/android/client/MavlinkObserver.java | 6 +- .../o3dr}/android/client/apis/Api.java | 6 +- .../android/client/apis/CalibrationApi.java | 26 ++--- .../o3dr}/android/client/apis/CameraApi.java | 26 ++--- .../android/client/apis/CapabilityApi.java | 10 +- .../o3dr}/android/client/apis/ControlApi.java | 52 ++++----- .../android/client/apis/ExperimentalApi.java | 44 ++++---- .../o3dr}/android/client/apis/FollowApi.java | 16 +-- .../o3dr}/android/client/apis/GimbalApi.java | 26 ++--- .../o3dr}/android/client/apis/MissionApi.java | 16 +-- .../o3dr}/android/client/apis/VehicleApi.java | 52 ++++----- .../android/client/apis/solo/SoloApi.java | 16 +-- .../client/apis/solo/SoloCameraApi.java | 20 ++-- .../client/apis/solo/SoloConfigApi.java | 46 ++++---- .../client/apis/solo/SoloMessageApi.java | 8 +- .../client/interfaces/DroneListener.java | 6 +- .../client/interfaces/LinkListener.java | 8 +- .../client/interfaces/TowerListener.java | 2 +- .../client/utils/InstallServiceDialog.java | 4 +- .../utils/TxPowerComplianceCountries.java | 2 +- .../connection/AbstractIpConnection.java | 4 +- .../connection/IpConnectionListener.java | 2 +- .../utils/connection/TcpConnection.java | 2 +- .../utils/connection/UdpConnection.java | 2 +- .../utils/data/tlog/TLogIteratorCallback.java | 2 +- .../utils/data/tlog/TLogIteratorFilter.java | 4 +- .../client/utils/data/tlog/TLogParser.java | 2 +- .../utils/data/tlog/TLogParserCallback.java | 4 +- .../utils/data/tlog/TLogParserFilter.java | 4 +- .../client/utils/data/tlog/TLogPicker.java | 4 +- .../FilterByTimestampGeoTagAlgorithm.java | 6 +- .../client/utils/geotag/GeoTagAsyncTask.java | 6 +- .../client/utils/geotag/GeoTagUtils.java | 4 +- .../utils/geotag/SimpleGeoTagAlgorithm.java | 4 +- .../client/utils/unit/MetricUnitProvider.java | 2 +- .../client/utils/unit/UnitProvider.java | 2 +- .../client/utils/video/DecoderListener.java | 2 +- .../client/utils/video/MediaCodecManager.java | 2 +- .../android/client/utils/video/NaluChunk.java | 2 +- .../utils/video/NaluChunkAssembler.java | 2 +- .../android/lib/coordinate/LatLong.aidl | 3 + .../android/lib/coordinate/LatLong.java | 2 +- .../android/lib/coordinate/LatLongAlt.aidl | 4 + .../android/lib/coordinate/LatLongAlt.java | 2 +- .../android/lib/data/ServiceDataContract.java | 4 +- .../lib/drone/action/CameraActions.java | 4 +- .../lib/drone/action/CapabilityActions.java | 4 +- .../lib/drone/action/ConnectionActions.java | 4 +- .../lib/drone/action/ControlActions.java | 6 +- .../lib/drone/action/ExperimentalActions.java | 4 +- .../lib/drone/action/GimbalActions.java | 4 +- .../lib/drone/action/GuidedActions.java | 2 +- .../lib/drone/action/ParameterActions.java | 4 +- .../lib/drone/action/StateActions.java | 6 +- .../lib/drone/attribute/AttributeEvent.java | 28 ++--- .../drone/attribute/AttributeEventExtra.java | 14 +-- .../lib/drone/attribute/AttributeType.java | 38 +++---- .../error/CommandExecutionError.java | 2 +- .../lib/drone/attribute/error/ErrorType.java | 4 +- .../MagnetometerCalibrationProgress.aidl | 3 + .../MagnetometerCalibrationProgress.java | 2 +- .../MagnetometerCalibrationResult.aidl | 3 + .../MagnetometerCalibrationResult.java | 2 +- .../MagnetometerCalibrationStatus.aidl | 3 + .../MagnetometerCalibrationStatus.java | 4 +- .../drone/companion/solo/SoloAttributes.java | 4 +- .../drone/companion/solo/SoloEventExtras.java | 10 +- .../lib/drone/companion/solo/SoloEvents.java | 8 +- .../lib/drone/companion/solo/SoloState.java | 16 +-- .../companion/solo/action/SoloActions.java | 6 +- .../solo/action/SoloConfigActions.java | 10 +- .../solo/action/SoloShotsActions.java | 12 +++ .../companion/solo/button/ButtonPacket.java | 2 +- .../companion/solo/button/ButtonTypes.java | 2 +- .../solo/controller/SoloControllerMode.java | 2 +- .../solo/controller/SoloControllerUnits.java | 2 +- .../tlv/ControllerMessageInputReport.java | 2 +- .../companion/solo/tlv/SoloButtonSetting.java | 2 +- .../solo/tlv/SoloButtonSettingGetter.java | 2 +- .../solo/tlv/SoloButtonSettingSetter.java | 2 +- .../solo/tlv/SoloCableCamOptions.java | 2 +- .../solo/tlv/SoloCableCamWaypoint.java | 4 +- .../companion/solo/tlv/SoloFollowOptions.java | 2 +- .../solo/tlv/SoloFollowOptionsV2.java | 2 +- .../solo/tlv/SoloGoproConstants.java | 2 +- .../companion/solo/tlv/SoloGoproRecord.java | 2 +- .../solo/tlv/SoloGoproRequestState.java | 2 +- .../solo/tlv/SoloGoproSetExtendedRequest.java | 2 +- .../solo/tlv/SoloGoproSetRequest.java | 2 +- .../companion/solo/tlv/SoloGoproState.java | 4 +- .../companion/solo/tlv/SoloGoproStateV2.java | 4 +- .../solo/tlv/SoloMessageLocation.java | 4 +- .../solo/tlv/SoloMessageRecordPosition.java | 2 +- .../companion/solo/tlv/SoloMessageShot.java | 6 +- .../solo/tlv/SoloMessageShotGetter.java | 2 +- .../solo/tlv/SoloMessageShotManagerError.java | 2 +- .../solo/tlv/SoloMessageShotSetter.java | 2 +- .../drone/companion/solo/tlv/SoloPause.java | 2 +- .../companion/solo/tlv/SoloShotError.java | 2 +- .../companion/solo/tlv/SoloShotOptions.java | 2 +- .../companion/solo/tlv/TLVMessageParser.java | 100 +++++++++--------- .../companion/solo/tlv/TLVMessageTypes.java | 2 +- .../drone/companion/solo/tlv/TLVPacket.java | 2 +- .../solo/tlv/mpcc/SoloSplineAttach.java | 6 +- .../solo/tlv/mpcc/SoloSplineDurations.java | 6 +- .../solo/tlv/mpcc/SoloSplinePathSettings.java | 6 +- .../solo/tlv/mpcc/SoloSplinePlay.java | 6 +- .../tlv/mpcc/SoloSplinePlaybackStatus.java | 6 +- .../solo/tlv/mpcc/SoloSplinePoint.java | 8 +- .../solo/tlv/mpcc/SoloSplineRecord.java | 6 +- .../solo/tlv/mpcc/SoloSplineSeek.java | 6 +- .../inspect/SoloInspectMoveGimbal.java | 6 +- .../inspect/SoloInspectMoveVehicle.java | 6 +- .../inspect/SoloInspectSetWaypoint.java | 6 +- .../sitescan/inspect/SoloInspectStart.java | 6 +- .../solo/tlv/sitescan/scan/SoloScanStart.java | 6 +- .../tlv/sitescan/survey/SoloSurveyStart.java | 6 +- .../drone/connection/ConnectionParameter.aidl | 3 + .../drone/connection/ConnectionParameter.java | 2 +- .../drone/connection/ConnectionResult.aidl | 3 + .../drone/connection/ConnectionResult.java | 4 +- .../lib/drone/connection/ConnectionType.java | 2 +- .../lib/drone/connection/DroneSharePrefs.aidl | 3 + .../lib/drone/connection/DroneSharePrefs.java | 2 +- .../android/lib/drone/mission/Mission.aidl | 3 + .../android/lib/drone/mission/Mission.java | 6 +- .../lib/drone/mission/MissionItemType.java | 46 ++++---- .../drone/mission/action/MissionActions.java | 4 +- .../lib/drone/mission/item/MissionItem.aidl | 3 + .../lib/drone/mission/item/MissionItem.java | 6 +- .../mission/item/command/CameraTrigger.java | 6 +- .../mission/item/command/ChangeSpeed.java | 6 +- .../drone/mission/item/command/DoJump.java | 6 +- .../mission/item/command/EpmGripper.java | 6 +- .../drone/mission/item/command/ResetROI.java | 6 +- .../mission/item/command/ReturnToLaunch.java | 6 +- .../drone/mission/item/command/SetRelay.java | 6 +- .../drone/mission/item/command/SetServo.java | 6 +- .../drone/mission/item/command/Takeoff.java | 6 +- .../mission/item/command/YawCondition.java | 6 +- .../mission/item/complex/CameraDetail.aidl | 3 + .../mission/item/complex/CameraDetail.java | 2 +- .../mission/item/complex/SplineSurvey.java | 6 +- .../item/complex/StructureScanner.aidl | 3 + .../item/complex/StructureScanner.java | 10 +- .../drone/mission/item/complex/Survey.aidl | 3 + .../drone/mission/item/complex/Survey.java | 10 +- .../mission/item/complex/SurveyDetail.java | 2 +- .../mission/item/spatial/BaseSpatialItem.java | 8 +- .../drone/mission/item/spatial/Circle.java | 6 +- .../mission/item/spatial/DoLandStart.java | 6 +- .../lib/drone/mission/item/spatial/Land.java | 8 +- .../item/spatial/RegionOfInterest.java | 6 +- .../mission/item/spatial/SplineWaypoint.java | 6 +- .../drone/mission/item/spatial/Waypoint.java | 6 +- .../android/lib/drone/property/Altitude.aidl | 3 + .../android/lib/drone/property/Altitude.java | 2 +- .../android/lib/drone/property/Attitude.aidl | 3 + .../android/lib/drone/property/Attitude.java | 2 +- .../android/lib/drone/property/Battery.aidl | 3 + .../android/lib/drone/property/Battery.java | 2 +- .../lib/drone/property/CameraProxy.java | 4 +- .../lib/drone/property/DroneAttribute.java | 2 +- .../android/lib/drone/property/EkfStatus.aidl | 3 + .../android/lib/drone/property/EkfStatus.java | 2 +- .../android/lib/drone/property/FootPrint.aidl | 3 + .../android/lib/drone/property/FootPrint.java | 6 +- .../android/lib/drone/property/Gps.aidl | 3 + .../android/lib/drone/property/Gps.java | 4 +- .../lib/drone/property/GuidedState.aidl | 3 + .../lib/drone/property/GuidedState.java | 4 +- .../android/lib/drone/property/Home.aidl | 3 + .../android/lib/drone/property/Home.java | 4 +- .../android/lib/drone/property/Parameter.java | 2 +- .../lib/drone/property/Parameters.aidl | 3 + .../lib/drone/property/Parameters.java | 2 +- .../android/lib/drone/property/Signal.aidl | 3 + .../android/lib/drone/property/Signal.java | 2 +- .../android/lib/drone/property/Speed.aidl | 3 + .../android/lib/drone/property/Speed.java | 2 +- .../android/lib/drone/property/State.aidl | 3 + .../android/lib/drone/property/State.java | 2 +- .../android/lib/drone/property/Type.aidl | 3 + .../android/lib/drone/property/Type.java | 2 +- .../lib/drone/property/VehicleMode.aidl | 3 + .../lib/drone/property/VehicleMode.java | 2 +- .../android/lib/drone/property/Vibration.aidl | 3 + .../android/lib/drone/property/Vibration.java | 2 +- .../lib/gcs/action/CalibrationActions.java | 4 +- .../lib/gcs/action/FollowMeActions.java | 4 +- .../android/lib/gcs/event/GCSEvent.java | 4 +- .../android/lib/gcs/follow/FollowState.aidl | 3 + .../android/lib/gcs/follow/FollowState.java | 4 +- .../android/lib/gcs/follow/FollowType.aidl | 3 + .../android/lib/gcs/follow/FollowType.java | 2 +- .../lib/gcs/link/LinkConnectionStatus.java | 8 +- .../android/lib/gcs/link/LinkEvent.java | 4 +- .../android/lib/gcs/link/LinkEventExtra.java | 6 +- .../lib/gcs/returnToMe/ReturnToMeState.aidl | 3 + .../lib/gcs/returnToMe/ReturnToMeState.java | 6 +- .../lib/mavlink/MavlinkMessageWrapper.aidl | 2 + .../lib/mavlink/MavlinkMessageWrapper.java | 2 +- .../lib/model/AbstractCommandListener.java | 2 +- .../android/lib/model/IApiListener.aidl | 4 +- .../android/lib/model/ICommandListener.aidl | 4 +- .../lib/model/IDroidPlannerServices.aidl | 6 +- .../services/android/lib/model/IDroneApi.aidl | 12 +-- .../android/lib/model/IMavlinkObserver.aidl | 4 +- .../services/android/lib/model/IObserver.aidl | 4 +- .../lib/model/SimpleCommandListener.java | 2 +- .../android/lib/model/action/Action.aidl | 3 + .../android/lib/model/action/Action.java | 2 +- .../services/android/lib/util/MathUtils.java | 6 +- .../android/lib/util/ParcelableUtils.java | 2 +- .../android/lib/util/SpannableUtils.java | 2 +- .../services/android/lib/util/Utils.java | 2 +- .../googleApi/GoogleApiClientManager.java | 2 +- .../lib/util/version/VersionUtils.java | 22 ++++ .../services/android/impl/api/DPServices.java | 16 +-- .../android/impl/api/DroidPlannerService.java | 10 +- .../services/android/impl/api/DroneApi.java | 58 +++++----- .../connection/AndroidTcpConnection.java | 2 +- .../connection/AndroidUdpConnection.java | 2 +- .../connection/SoloConnection.java | 6 +- .../connection/usb/UsbCDCConnection.java | 2 +- .../connection/usb/UsbConnection.java | 2 +- .../impl/communication/model/DataLink.java | 4 +- .../communication/service/MAVLinkClient.java | 8 +- .../impl/core/MAVLink/MavLinkCalibration.java | 2 +- .../impl/core/MAVLink/MavLinkCommands.java | 2 +- .../impl/core/MAVLink/MavLinkParameters.java | 2 +- .../MAVLink/command/doCmd/MavLinkDoCmds.java | 4 +- .../MAVLink/connection/MavLinkConnection.java | 2 +- .../connection/MavLinkConnectionListener.java | 2 +- .../impl/core/drone/DroneInterfaces.java | 2 +- .../android/impl/core/drone/DroneManager.java | 20 ++-- .../impl/core/drone/DroneVariable.java | 2 +- .../impl/core/drone/autopilot/Drone.java | 6 +- .../core/drone/autopilot/apm/ArduCopter.java | 10 +- .../core/drone/autopilot/apm/ArduPilot.java | 46 ++++---- .../apm/solo/AbstractLinkManager.java | 6 +- .../drone/autopilot/apm/solo/ArduSolo.java | 42 ++++---- .../drone/autopilot/apm/solo/SoloComp.java | 34 +++--- .../controller/ControllerLinkListener.java | 6 +- .../controller/ControllerLinkManager.java | 20 ++-- .../apm/solo/sololink/SoloLinkListener.java | 4 +- .../apm/solo/sololink/SoloLinkManager.java | 28 ++--- .../generic/GenericMavLinkDrone.java | 54 +++++----- .../drone/manager/DroneCommandTracker.java | 2 +- .../drone/manager/MavLinkDroneManager.java | 26 ++--- .../core/drone/profiles/ParameterManager.java | 2 +- .../impl/core/drone/variables/Camera.java | 10 +- .../core/drone/variables/GuidedPoint.java | 14 +-- .../core/drone/variables/Magnetometer.java | 2 +- .../impl/core/drone/variables/State.java | 6 +- .../calibration/AccelCalibration.java | 4 +- .../android/impl/core/gcs/ReturnToMe.java | 20 ++-- .../android/impl/core/gcs/follow/Follow.java | 6 +- .../impl/core/gcs/follow/FollowAbove.java | 2 +- .../impl/core/gcs/follow/FollowCircle.java | 4 +- .../core/gcs/follow/FollowGuidedScan.java | 4 +- .../core/gcs/follow/FollowHeadingAngle.java | 2 +- .../impl/core/gcs/follow/FollowLeash.java | 6 +- .../impl/core/gcs/follow/FollowSoloShot.java | 6 +- .../core/gcs/follow/FollowSplineAbove.java | 2 +- .../core/gcs/follow/FollowSplineLeash.java | 8 +- .../impl/core/gcs/location/FusedLocation.java | 6 +- .../impl/core/gcs/location/Location.java | 2 +- .../impl/core/gcs/roi/ROIEstimator.java | 4 +- .../core/helpers/coordinates/CoordBounds.java | 2 +- .../impl/core/helpers/geoTools/GeoTools.java | 6 +- .../core/helpers/geoTools/LineLatLong.java | 2 +- .../core/helpers/geoTools/LineSampler.java | 2 +- .../impl/core/helpers/geoTools/LineTools.java | 2 +- .../core/helpers/geoTools/PointTools.java | 2 +- .../core/helpers/geoTools/PolylineTools.java | 2 +- .../impl/core/helpers/geoTools/Simplify.java | 2 +- .../core/helpers/geoTools/spline/Spline.java | 2 +- .../helpers/geoTools/spline/SplinePath.java | 2 +- .../android/impl/core/mission/Mission.java | 14 +-- .../impl/core/mission/MissionItemType.java | 2 +- .../core/mission/survey/SplineSurveyImpl.java | 2 +- .../impl/core/mission/survey/SurveyImpl.java | 2 +- .../core/mission/waypoints/CircleImpl.java | 2 +- .../mission/waypoints/DoLandStartImpl.java | 4 +- .../impl/core/mission/waypoints/LandImpl.java | 4 +- .../waypoints/RegionOfInterestImpl.java | 2 +- .../mission/waypoints/SpatialCoordItem.java | 4 +- .../mission/waypoints/SplineWaypointImpl.java | 2 +- .../waypoints/StructureScannerImpl.java | 4 +- .../core/mission/waypoints/WaypointImpl.java | 2 +- .../android/impl/core/polygon/Polygon.java | 2 +- .../android/impl/core/survey/Footprint.java | 4 +- .../core/survey/grid/CircumscribedGrid.java | 2 +- .../impl/core/survey/grid/EndpointSorter.java | 2 +- .../android/impl/core/survey/grid/Grid.java | 2 +- .../impl/core/survey/grid/GridBuilder.java | 2 +- .../impl/core/survey/grid/Trimmer.java | 2 +- .../impl/ui/activity/TLogFileSelector.java | 4 +- .../impl/ui/activity/UsbIntentReceiver.java | 2 +- .../impl/utils/AndroidApWarningParser.java | 82 +++++++------- .../android/impl/utils/CommonApiUtils.java | 58 +++++----- .../android/impl/utils/LogToFileTree.java | 2 +- .../android/impl/utils/NetworkUtils.java | 2 +- .../android/impl/utils/ProxyUtils.java | 46 ++++---- .../android/impl/utils/SoloApiUtils.java | 14 +-- .../android/impl/utils/analytics/GAUtils.java | 6 +- .../connection/WifiConnectionHandler.java | 2 +- .../impl/utils/video/StreamRecorder.java | 4 +- .../impl/utils/video/VideoManager.java | 16 +-- .../android/lib/coordinate/LatLong.aidl | 3 - .../android/lib/coordinate/LatLongAlt.aidl | 4 - .../MagnetometerCalibrationProgress.aidl | 3 - .../MagnetometerCalibrationResult.aidl | 3 - .../MagnetometerCalibrationStatus.aidl | 3 - .../solo/action/SoloShotsActions.java | 12 --- .../drone/connection/ConnectionParameter.aidl | 3 - .../drone/connection/ConnectionResult.aidl | 3 - .../lib/drone/connection/DroneSharePrefs.aidl | 3 - .../android/lib/drone/mission/Mission.aidl | 3 - .../lib/drone/mission/item/MissionItem.aidl | 3 - .../mission/item/complex/CameraDetail.aidl | 3 - .../item/complex/StructureScanner.aidl | 3 - .../drone/mission/item/complex/Survey.aidl | 3 - .../android/lib/drone/property/Altitude.aidl | 3 - .../android/lib/drone/property/Attitude.aidl | 3 - .../android/lib/drone/property/Battery.aidl | 3 - .../android/lib/drone/property/EkfStatus.aidl | 3 - .../android/lib/drone/property/FootPrint.aidl | 3 - .../android/lib/drone/property/Gps.aidl | 3 - .../lib/drone/property/GuidedState.aidl | 3 - .../android/lib/drone/property/Home.aidl | 3 - .../lib/drone/property/Parameters.aidl | 3 - .../android/lib/drone/property/Signal.aidl | 3 - .../android/lib/drone/property/Speed.aidl | 3 - .../android/lib/drone/property/State.aidl | 3 - .../android/lib/drone/property/Type.aidl | 3 - .../lib/drone/property/VehicleMode.aidl | 3 - .../android/lib/drone/property/Vibration.aidl | 3 - .../android/lib/gcs/follow/FollowState.aidl | 3 - .../android/lib/gcs/follow/FollowType.aidl | 3 - .../lib/gcs/returnToMe/ReturnToMeState.aidl | 3 - .../lib/mavlink/MavlinkMessageWrapper.aidl | 2 - .../android/lib/model/action/Action.aidl | 3 - .../lib/util/version/VersionUtils.java | 27 ----- ClientLib/src/main/res/values/version.xml | 3 +- .../services/android/api/DPServices.java | 14 +-- .../android/api/DroidPlannerService.java | 8 +- .../services/android/api/DroneApi.java | 58 +++++----- .../connection/AndroidTcpConnection.java | 2 +- .../connection/AndroidUdpConnection.java | 2 +- .../connection/SoloConnection.java | 6 +- .../connection/usb/UsbCDCConnection.java | 2 +- .../connection/usb/UsbConnection.java | 2 +- .../android/communication/model/DataLink.java | 4 +- .../communication/service/MAVLinkClient.java | 8 +- .../core/MAVLink/MavLinkCalibration.java | 2 +- .../android/core/MAVLink/MavLinkCommands.java | 2 +- .../core/MAVLink/MavLinkParameters.java | 2 +- .../MAVLink/command/doCmd/MavLinkDoCmds.java | 4 +- .../MAVLink/connection/MavLinkConnection.java | 2 +- .../connection/MavLinkConnectionListener.java | 2 +- .../android/core/drone/DroneInterfaces.java | 2 +- .../android/core/drone/DroneManager.java | 20 ++-- .../android/core/drone/DroneVariable.java | 2 +- .../android/core/drone/autopilot/Drone.java | 6 +- .../core/drone/autopilot/apm/ArduCopter.java | 10 +- .../core/drone/autopilot/apm/ArduPilot.java | 46 ++++---- .../apm/solo/AbstractLinkManager.java | 6 +- .../drone/autopilot/apm/solo/ArduSolo.java | 42 ++++---- .../drone/autopilot/apm/solo/SoloComp.java | 32 +++--- .../controller/ControllerLinkListener.java | 6 +- .../controller/ControllerLinkManager.java | 22 ++-- .../apm/solo/sololink/SoloLinkListener.java | 4 +- .../apm/solo/sololink/SoloLinkManager.java | 26 ++--- .../generic/GenericMavLinkDrone.java | 54 +++++----- .../drone/manager/DroneCommandTracker.java | 2 +- .../drone/manager/MavLinkDroneManager.java | 26 ++--- .../core/drone/profiles/ParameterManager.java | 2 +- .../android/core/drone/variables/Camera.java | 10 +- .../core/drone/variables/GuidedPoint.java | 14 +-- .../core/drone/variables/Magnetometer.java | 2 +- .../android/core/drone/variables/State.java | 6 +- .../calibration/AccelCalibration.java | 4 +- .../services/android/core/gcs/ReturnToMe.java | 20 ++-- .../android/core/gcs/follow/Follow.java | 6 +- .../android/core/gcs/follow/FollowAbove.java | 2 +- .../android/core/gcs/follow/FollowCircle.java | 4 +- .../core/gcs/follow/FollowGuidedScan.java | 4 +- .../core/gcs/follow/FollowHeadingAngle.java | 2 +- .../android/core/gcs/follow/FollowLeash.java | 6 +- .../core/gcs/follow/FollowSoloShot.java | 6 +- .../core/gcs/follow/FollowSplineAbove.java | 2 +- .../core/gcs/follow/FollowSplineLeash.java | 8 +- .../core/gcs/location/FusedLocation.java | 6 +- .../android/core/gcs/location/Location.java | 2 +- .../android/core/gcs/roi/ROIEstimator.java | 4 +- .../core/helpers/coordinates/CoordBounds.java | 2 +- .../core/helpers/geoTools/GeoTools.java | 6 +- .../core/helpers/geoTools/LineLatLong.java | 2 +- .../core/helpers/geoTools/LineSampler.java | 2 +- .../core/helpers/geoTools/LineTools.java | 2 +- .../core/helpers/geoTools/PointTools.java | 2 +- .../core/helpers/geoTools/PolylineTools.java | 2 +- .../core/helpers/geoTools/Simplify.java | 2 +- .../core/helpers/geoTools/spline/Spline.java | 2 +- .../helpers/geoTools/spline/SplinePath.java | 2 +- .../android/core/mission/Mission.java | 14 +-- .../android/core/mission/MissionItemType.java | 2 +- .../core/mission/survey/SplineSurveyImpl.java | 2 +- .../core/mission/survey/SurveyImpl.java | 2 +- .../core/mission/waypoints/CircleImpl.java | 2 +- .../mission/waypoints/DoLandStartImpl.java | 4 +- .../core/mission/waypoints/LandImpl.java | 4 +- .../waypoints/RegionOfInterestImpl.java | 2 +- .../mission/waypoints/SpatialCoordItem.java | 4 +- .../mission/waypoints/SplineWaypointImpl.java | 2 +- .../waypoints/StructureScannerImpl.java | 4 +- .../core/mission/waypoints/WaypointImpl.java | 2 +- .../android/core/polygon/Polygon.java | 2 +- .../android/core/survey/Footprint.java | 4 +- .../core/survey/grid/CircumscribedGrid.java | 2 +- .../core/survey/grid/EndpointSorter.java | 2 +- .../android/core/survey/grid/Grid.java | 2 +- .../android/core/survey/grid/GridBuilder.java | 2 +- .../android/core/survey/grid/Trimmer.java | 2 +- .../android/ui/activity/TLogFileSelector.java | 2 +- .../ui/adapter/AppConnectionAdapter.java | 2 +- .../android/utils/AndroidApWarningParser.java | 82 +++++++------- .../android/utils/CommonApiUtils.java | 58 +++++----- .../services/android/utils/ProxyUtils.java | 46 ++++---- .../services/android/utils/SoloApiUtils.java | 14 +-- .../android/utils/analytics/GAUtils.java | 2 +- .../connection/WifiConnectionHandler.java | 2 +- .../android/utils/video/StreamRecorder.java | 4 +- .../android/utils/video/VideoManager.java | 16 +-- .../android/client/apis/ControlApiTest.java | 14 +-- .../solo/tlv/TLVMessageParserTest.java | 2 +- .../android/lib/util/MathUtilsTest.java | 6 +- .../services/android/BasicTest.java | 4 +- .../core/helpers/coordinates/Coord2DTest.java | 2 +- .../core/helpers/coordinates/Coord3DTest.java | 4 +- .../helpers/coordinates/CoordBoundsTest.java | 2 +- .../core/helpers/geoTools/GeoToolsTest.java | 4 +- .../waypoints/SpatialCoordItemTest.java | 2 +- .../mission/waypoints/WaypointImplTest.java | 2 +- .../android/core/survey/FootprintTest.java | 2 +- .../services/android/mock/MockDrone.java | 6 +- .../android/mock/MockMAVLinkClient.java | 4 +- doc/resources.rst | 2 +- .../sample/hellodrone/MainActivity.java | 58 +++++----- 458 files changed, 1746 insertions(+), 1778 deletions(-) rename ClientLib/src/androidTest/java/{org/droidplanner => com/o3dr}/android/client/ApplicationTest.java (88%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/ApiAvailability.java (64%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/ControlTower.java (94%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/Drone.java (89%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/DroneApiListener.java (64%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/DroneObserver.java (81%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/MavlinkObserver.java (56%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/Api.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/CalibrationApi.java (71%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/CameraApi.java (73%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/CapabilityApi.java (94%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/ControlApi.java (76%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/ExperimentalApi.java (89%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/FollowApi.java (72%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/GimbalApi.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/MissionApi.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/VehicleApi.java (77%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/solo/SoloApi.java (55%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/solo/SoloCameraApi.java (94%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/solo/SoloConfigApi.java (66%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/apis/solo/SoloMessageApi.java (76%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/interfaces/DroneListener.java (66%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/interfaces/LinkListener.java (58%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/interfaces/TowerListener.java (72%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/InstallServiceDialog.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/TxPowerComplianceCountries.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/connection/AbstractIpConnection.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/connection/IpConnectionListener.java (80%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/connection/TcpConnection.java (96%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/connection/UdpConnection.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/data/tlog/TLogIteratorCallback.java (89%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/data/tlog/TLogIteratorFilter.java (73%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/data/tlog/TLogParser.java (99%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/data/tlog/TLogParserCallback.java (76%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/data/tlog/TLogParserFilter.java (80%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/data/tlog/TLogPicker.java (84%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java (95%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/geotag/GeoTagAsyncTask.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/geotag/GeoTagUtils.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/geotag/SimpleGeoTagAlgorithm.java (85%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/unit/MetricUnitProvider.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/unit/UnitProvider.java (87%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/video/DecoderListener.java (76%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/video/MediaCodecManager.java (99%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/video/NaluChunk.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/android/client/utils/video/NaluChunkAssembler.java (99%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/coordinate/LatLong.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/coordinate/LatLongAlt.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/data/ServiceDataContract.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/CameraActions.java (82%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/CapabilityActions.java (78%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/ConnectionActions.java (79%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/ControlActions.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/ExperimentalActions.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/GimbalActions.java (87%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/GuidedActions.java (72%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/ParameterActions.java (79%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/action/StateActions.java (84%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/attribute/AttributeEvent.java (84%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/attribute/AttributeEventExtra.java (84%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/attribute/AttributeType.java (60%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/attribute/error/CommandExecutionError.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/attribute/error/ErrorType.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java (96%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/SoloAttributes.java (78%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/SoloEventExtras.java (82%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/SoloEvents.java (88%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/SoloState.java (89%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/action/SoloActions.java (59%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/action/SoloConfigActions.java (78%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloShotsActions.java rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/button/ButtonPacket.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/button/ButtonTypes.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java (96%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java (96%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java (95%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java (95%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java (96%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java (95%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java (95%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloPause.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloShotError.java (94%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java (66%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/TLVPacket.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java (84%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java (94%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java (96%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java (79%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java (88%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java (74%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java (75%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/connection/ConnectionParameter.java (99%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/connection/ConnectionResult.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/connection/ConnectionType.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/connection/DroneSharePrefs.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/Mission.java (92%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/MissionItemType.java (80%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/action/MissionActions.java (92%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/MissionItem.java (87%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/CameraTrigger.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/ChangeSpeed.java (89%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/DoJump.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/EpmGripper.java (88%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/ResetROI.java (82%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/ReturnToLaunch.java (89%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/SetRelay.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/SetServo.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/Takeoff.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/command/YawCondition.java (92%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/complex/CameraDetail.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/complex/SplineSurvey.java (79%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/complex/StructureScanner.java (93%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/complex/Survey.java (95%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/complex/SurveyDetail.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java (85%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/spatial/Circle.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/spatial/DoLandStart.java (78%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/spatial/Land.java (73%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java (81%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java (90%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/mission/item/spatial/Waypoint.java (94%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Altitude.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Attitude.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Battery.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/CameraProxy.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/DroneAttribute.java (69%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/EkfStatus.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/FootPrint.java (90%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Gps.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/GuidedState.java (93%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Home.java (93%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Parameter.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Parameters.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Signal.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Speed.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/State.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Type.java (97%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/VehicleMode.java (98%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/property/Vibration.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/action/CalibrationActions.java (91%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/action/FollowMeActions.java (83%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/event/GCSEvent.java (86%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/follow/FollowState.java (93%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/follow/FollowType.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/link/LinkConnectionStatus.java (94%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/link/LinkEvent.java (68%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/link/LinkEventExtra.java (60%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/gcs/returnToMe/ReturnToMeState.java (93%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/mavlink/MavlinkMessageWrapper.java (96%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/AbstractCommandListener.java (85%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/IApiListener.aidl (79%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/ICommandListener.aidl (69%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/IDroidPlannerServices.aidl (86%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/IDroneApi.aidl (81%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/IMavlinkObserver.aidl (73%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/IObserver.aidl (75%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/SimpleCommandListener.java (88%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.aidl rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/model/action/Action.java (95%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/util/MathUtils.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/util/ParcelableUtils.java (97%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/util/SpannableUtils.java (98%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/util/Utils.java (75%) rename ClientLib/src/main/java/{org/droidplanner => com/o3dr}/services/android/lib/util/googleApi/GoogleApiClientManager.java (99%) create mode 100644 ClientLib/src/main/java/com/o3dr/services/android/lib/util/version/VersionUtils.java delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl delete mode 100644 ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java rename ServiceApp/test/java/{org/droidplanner => com/o3dr}/android/client/apis/ControlApiTest.java (88%) rename ServiceApp/test/java/{org/droidplanner => com/o3dr}/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java (99%) rename ServiceApp/test/java/{org/droidplanner => com/o3dr}/services/android/lib/util/MathUtilsTest.java (96%) diff --git a/ClientLib/src/androidTest/java/org/droidplanner/android/client/ApplicationTest.java b/ClientLib/src/androidTest/java/com/o3dr/android/client/ApplicationTest.java similarity index 88% rename from ClientLib/src/androidTest/java/org/droidplanner/android/client/ApplicationTest.java rename to ClientLib/src/androidTest/java/com/o3dr/android/client/ApplicationTest.java index b6e3c75194..24aefeac26 100644 --- a/ClientLib/src/androidTest/java/org/droidplanner/android/client/ApplicationTest.java +++ b/ClientLib/src/androidTest/java/com/o3dr/android/client/ApplicationTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client; +package com.o3dr.android.client; import android.app.Application; import android.test.ApplicationTestCase; diff --git a/ClientLib/src/main/AndroidManifest.xml b/ClientLib/src/main/AndroidManifest.xml index 86fe771849..94d254941c 100644 --- a/ClientLib/src/main/AndroidManifest.xml +++ b/ClientLib/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.o3dr.android.client"> @@ -43,7 +43,7 @@ android:value="5ee4471ba6e8cd8858006c8166469bba33d64b2f" /> - - - - - - + + android:value="@integer/core_lib_version" /> diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/ApiAvailability.java b/ClientLib/src/main/java/com/o3dr/android/client/ApiAvailability.java similarity index 64% rename from ClientLib/src/main/java/org/droidplanner/android/client/ApiAvailability.java rename to ClientLib/src/main/java/com/o3dr/android/client/ApiAvailability.java index 949e584c30..9eb2ba6ed3 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/ApiAvailability.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/ApiAvailability.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client; +package com.o3dr.android.client; import android.content.Context; import android.content.Intent; @@ -7,10 +7,11 @@ import android.os.Bundle; import android.support.annotation.NonNull; -import org.droidplanner.android.client.utils.InstallServiceDialog; +import com.o3dr.android.client.utils.InstallServiceDialog; +import com.o3dr.services.android.lib.model.IDroidPlannerServices; +import com.o3dr.services.android.lib.util.version.VersionUtils; + import org.droidplanner.services.android.impl.api.DroidPlannerService; -import org.droidplanner.services.android.lib.model.IDroidPlannerServices; -import org.droidplanner.services.android.lib.util.version.VersionUtils; import java.util.List; @@ -25,10 +26,7 @@ private static class LazyHolder { } private static final String SERVICES_CLAZZ_NAME = IDroidPlannerServices.class.getName(); - private static final String METADATA_KEY = "org.droidplanner.services.android.lib.version"; - - private static final String DEPRECATED_SERVICES_CLAZZ_NAME = "com.o3dr.services.android.lib.model.IDroidPlannerServices"; - private static final String DEPRECATED_METADATA_KEY = "com.o3dr.dronekit.android.core.version"; + private static final String METADATA_KEY = "com.o3dr.dronekit.android.core.version"; public static final int API_AVAILABLE = 0; public static final int API_MISSING = 1; @@ -62,31 +60,14 @@ Intent getAvailableServicesInstance(@NonNull final Context context) { if (metaData == null) continue; - final int towerLibVersion = metaData.getInt(METADATA_KEY, INVALID_LIB_VERSION); - if (towerLibVersion != INVALID_LIB_VERSION && towerLibVersion >= VersionUtils.getTowerLibVersion(context)) { + final int coreLibVersion = metaData.getInt(METADATA_KEY, INVALID_LIB_VERSION); + if (coreLibVersion != INVALID_LIB_VERSION && coreLibVersion >= VersionUtils.getCoreLibVersion(context)) { serviceIntent.setClassName(serviceInfo.serviceInfo.packageName, serviceInfo.serviceInfo.name); return serviceIntent; } } } - //TODO: For testing only.. Remove before release for shipping - final Intent deprecatedServiceIntent = new Intent(DEPRECATED_SERVICES_CLAZZ_NAME); - final List deprecatedServiceInfos = pm.queryIntentServices(deprecatedServiceIntent, PackageManager.GET_META_DATA); - if(deprecatedServiceInfos != null && !deprecatedServiceInfos.isEmpty()){ - for(ResolveInfo deprecatedServiceInfo : deprecatedServiceInfos){ - final Bundle deprecatedMetaData = deprecatedServiceInfo.serviceInfo.metaData; - if(deprecatedMetaData == null) - continue; - - final int deprecatedLibVersion = deprecatedMetaData.getInt(DEPRECATED_METADATA_KEY, INVALID_LIB_VERSION); - if(deprecatedLibVersion != INVALID_LIB_VERSION && deprecatedLibVersion >= VersionUtils.getDeprecatedLibVersion(context)){ - deprecatedServiceIntent.setClassName(deprecatedServiceInfo.serviceInfo.packageName, deprecatedServiceInfo.serviceInfo.name); - return deprecatedServiceIntent; - } - } - } - //Didn't find any that's up and running. Enable the local one DroidPlannerService.enableDroidPlannerService(context, true); serviceIntent.setClass(context, DroidPlannerService.class); diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/ControlTower.java b/ClientLib/src/main/java/com/o3dr/android/client/ControlTower.java similarity index 94% rename from ClientLib/src/main/java/org/droidplanner/android/client/ControlTower.java rename to ClientLib/src/main/java/com/o3dr/android/client/ControlTower.java index b7ae5f7bc6..a8415cfd31 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/ControlTower.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/ControlTower.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client; +package com.o3dr.android.client; import android.content.ComponentName; import android.content.Context; @@ -10,9 +10,9 @@ import android.os.RemoteException; import android.util.Log; -import org.droidplanner.android.client.interfaces.TowerListener; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.model.IDroidPlannerServices; +import com.o3dr.android.client.interfaces.TowerListener; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.model.IDroidPlannerServices; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/Drone.java b/ClientLib/src/main/java/com/o3dr/android/client/Drone.java similarity index 89% rename from ClientLib/src/main/java/org/droidplanner/android/client/Drone.java rename to ClientLib/src/main/java/com/o3dr/android/client/Drone.java index 08ec83dcb0..d73e7cbfc1 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/Drone.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/Drone.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client; +package com.o3dr.android.client; import android.content.Context; import android.os.Bundle; @@ -9,50 +9,50 @@ import android.os.SystemClock; import android.util.Log; -import org.droidplanner.android.client.apis.CalibrationApi; -import org.droidplanner.android.client.apis.ControlApi; -import org.droidplanner.android.client.apis.ExperimentalApi; -import org.droidplanner.android.client.apis.FollowApi; -import org.droidplanner.android.client.apis.MissionApi; -import org.droidplanner.android.client.apis.VehicleApi; -import org.droidplanner.android.client.interfaces.DroneListener; -import org.droidplanner.android.client.interfaces.LinkListener; -import org.droidplanner.android.client.utils.TxPowerComplianceCountries; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloAttributes; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.drone.mission.Mission; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Attitude; -import org.droidplanner.services.android.lib.drone.property.Battery; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.GuidedState; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.Parameters; -import org.droidplanner.services.android.lib.drone.property.Signal; -import org.droidplanner.services.android.lib.drone.property.Speed; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.drone.property.Type; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.gcs.follow.FollowState; -import org.droidplanner.services.android.lib.gcs.follow.FollowType; -import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; -import org.droidplanner.services.android.lib.gcs.link.LinkEvent; -import org.droidplanner.services.android.lib.gcs.link.LinkEventExtra; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.IDroneApi; -import org.droidplanner.services.android.lib.model.IObserver; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.apis.CalibrationApi; +import com.o3dr.android.client.apis.ControlApi; +import com.o3dr.android.client.apis.ExperimentalApi; +import com.o3dr.android.client.apis.FollowApi; +import com.o3dr.android.client.apis.MissionApi; +import com.o3dr.android.client.apis.VehicleApi; +import com.o3dr.android.client.interfaces.DroneListener; +import com.o3dr.android.client.interfaces.LinkListener; +import com.o3dr.android.client.utils.TxPowerComplianceCountries; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; +import com.o3dr.services.android.lib.drone.companion.solo.SoloAttributes; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEventExtras; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEvents; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.mission.Mission; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Attitude; +import com.o3dr.services.android.lib.drone.property.Battery; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.GuidedState; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameters; +import com.o3dr.services.android.lib.drone.property.Signal; +import com.o3dr.services.android.lib.drone.property.Speed; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.drone.property.Type; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.gcs.follow.FollowState; +import com.o3dr.services.android.lib.gcs.follow.FollowType; +import com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState; +import com.o3dr.services.android.lib.gcs.link.LinkEvent; +import com.o3dr.services.android.lib.gcs.link.LinkEventExtra; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.IDroneApi; +import com.o3dr.services.android.lib.model.IObserver; +import com.o3dr.services.android.lib.model.action.Action; import java.util.NoSuchElementException; import java.util.concurrent.ConcurrentLinkedQueue; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/DroneApiListener.java b/ClientLib/src/main/java/com/o3dr/android/client/DroneApiListener.java similarity index 64% rename from ClientLib/src/main/java/org/droidplanner/android/client/DroneApiListener.java rename to ClientLib/src/main/java/com/o3dr/android/client/DroneApiListener.java index 9708921ef8..43b3e35a71 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/DroneApiListener.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/DroneApiListener.java @@ -1,10 +1,10 @@ -package org.droidplanner.android.client; +package com.o3dr.android.client; import android.os.RemoteException; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; -import org.droidplanner.services.android.lib.model.IApiListener; -import org.droidplanner.services.android.lib.util.version.VersionUtils; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.util.version.VersionUtils; /** * Created by fhuya on 12/15/14. @@ -29,6 +29,6 @@ public int getClientVersionCode() throws RemoteException { @Override public int getApiVersionCode(){ - return VersionUtils.getDeprecatedLibVersion(drone.getContext()); + return VersionUtils.getCoreLibVersion(drone.getContext()); } } diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/DroneObserver.java b/ClientLib/src/main/java/com/o3dr/android/client/DroneObserver.java similarity index 81% rename from ClientLib/src/main/java/org/droidplanner/android/client/DroneObserver.java rename to ClientLib/src/main/java/com/o3dr/android/client/DroneObserver.java index b9aaf11c60..3e85011a68 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/DroneObserver.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/DroneObserver.java @@ -1,9 +1,9 @@ -package org.droidplanner.android.client; +package com.o3dr.android.client; import android.os.Bundle; import android.os.RemoteException; -import org.droidplanner.services.android.lib.model.IObserver; +import com.o3dr.services.android.lib.model.IObserver; /** * Created by fhuya on 10/29/14. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/MavlinkObserver.java b/ClientLib/src/main/java/com/o3dr/android/client/MavlinkObserver.java similarity index 56% rename from ClientLib/src/main/java/org/droidplanner/android/client/MavlinkObserver.java rename to ClientLib/src/main/java/com/o3dr/android/client/MavlinkObserver.java index 24acf4f572..627ad8a1f3 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/MavlinkObserver.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/MavlinkObserver.java @@ -1,7 +1,7 @@ -package org.droidplanner.android.client; +package com.o3dr.android.client; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.IMavlinkObserver; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.IMavlinkObserver; /** * Allows to register for mavlink message updates. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/Api.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/Api.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/Api.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/Api.java index 6be88d82a8..5b0d48aac8 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/Api.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/Api.java @@ -1,7 +1,7 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.model.AbstractCommandListener; import java.util.concurrent.ConcurrentHashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/CalibrationApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/CalibrationApi.java similarity index 71% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/CalibrationApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/CalibrationApi.java index 8ed8a0f50a..80dca6618f 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/CalibrationApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/CalibrationApi.java @@ -1,22 +1,22 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.ACTION_ACCEPT_MAGNETOMETER_CALIBRATION; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.ACTION_CANCEL_MAGNETOMETER_CALIBRATION; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.ACTION_SEND_IMU_CALIBRATION_ACK; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.ACTION_START_IMU_CALIBRATION; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.ACTION_START_MAGNETOMETER_CALIBRATION; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.EXTRA_IMU_STEP; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.EXTRA_RETRY_ON_FAILURE; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.EXTRA_SAVE_AUTOMATICALLY; -import static org.droidplanner.services.android.lib.gcs.action.CalibrationActions.EXTRA_START_DELAY; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.ACTION_ACCEPT_MAGNETOMETER_CALIBRATION; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.ACTION_CANCEL_MAGNETOMETER_CALIBRATION; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.ACTION_SEND_IMU_CALIBRATION_ACK; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.ACTION_START_IMU_CALIBRATION; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.ACTION_START_MAGNETOMETER_CALIBRATION; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.EXTRA_IMU_STEP; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.EXTRA_RETRY_ON_FAILURE; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.EXTRA_SAVE_AUTOMATICALLY; +import static com.o3dr.services.android.lib.gcs.action.CalibrationActions.EXTRA_START_DELAY; /** * Provides access to the calibration specific functionality. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/CameraApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/CameraApi.java similarity index 73% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/CameraApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/CameraApi.java index 5258b0b7a0..b56067ccba 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/CameraApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/CameraApi.java @@ -1,24 +1,24 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; import android.support.annotation.NonNull; import android.view.Surface; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.ACTION_START_VIDEO_STREAM; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.ACTION_STOP_VIDEO_STREAM; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_DISPLAY; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_ENABLE_LOCAL_RECORDING; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_LOCAL_RECORDING_FILENAME; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_PROPS_UDP_PORT; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_TAG; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_PROPERTIES; +import static com.o3dr.services.android.lib.drone.action.CameraActions.ACTION_START_VIDEO_STREAM; +import static com.o3dr.services.android.lib.drone.action.CameraActions.ACTION_STOP_VIDEO_STREAM; +import static com.o3dr.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_DISPLAY; +import static com.o3dr.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_ENABLE_LOCAL_RECORDING; +import static com.o3dr.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_LOCAL_RECORDING_FILENAME; +import static com.o3dr.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_PROPS_UDP_PORT; +import static com.o3dr.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_TAG; +import static com.o3dr.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_PROPERTIES; /** * Provides support to control generic camera functionality diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/CapabilityApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/CapabilityApi.java similarity index 94% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/CapabilityApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/CapabilityApi.java index a1eb52802b..8a3bc4f935 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/CapabilityApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/CapabilityApi.java @@ -1,16 +1,16 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.drone.action.CapabilityActions.*; +import static com.o3dr.services.android.lib.drone.action.CapabilityActions.*; /** * Allows to query the capabilities offered by the vehicle. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/ControlApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/ControlApi.java similarity index 76% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/ControlApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/ControlApi.java index 5756552f51..5806705305 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/ControlApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/ControlApi.java @@ -1,35 +1,35 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +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.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_DO_GUIDED_TAKEOFF; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_ENABLE_MANUAL_CONTROL; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_LOOK_AT_TARGET; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_SEND_BRAKE_VEHICLE; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_SEND_GUIDED_POINT; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_SET_CONDITION_YAW; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_SET_GUIDED_ALTITUDE; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_SET_VELOCITY; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_ALTITUDE; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_DO_ENABLE; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_FORCE_GUIDED_POINT; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_GUIDED_POINT; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_LOOK_AT_TARGET; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_X; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Y; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Z; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_YAW_CHANGE_RATE; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_YAW_IS_RELATIVE; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_YAW_TARGET_ANGLE; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_DO_GUIDED_TAKEOFF; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_ENABLE_MANUAL_CONTROL; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_LOOK_AT_TARGET; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_SEND_BRAKE_VEHICLE; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_SEND_GUIDED_POINT; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_SET_CONDITION_YAW; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_SET_GUIDED_ALTITUDE; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_SET_VELOCITY; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_ALTITUDE; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_DO_ENABLE; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_FORCE_GUIDED_POINT; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_GUIDED_POINT; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_LOOK_AT_TARGET; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_X; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Y; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Z; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_YAW_CHANGE_RATE; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_YAW_IS_RELATIVE; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_YAW_TARGET_ANGLE; /** * Provides access to the vehicle control functionality. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/ExperimentalApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/ExperimentalApi.java similarity index 89% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/ExperimentalApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/ExperimentalApi.java index bd30c4d2c8..8dbbe15f3b 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/ExperimentalApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/ExperimentalApi.java @@ -1,35 +1,35 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; import android.util.Log; -import org.droidplanner.android.client.Drone; -import org.droidplanner.android.client.utils.connection.IpConnectionListener; -import org.droidplanner.android.client.utils.connection.UdpConnection; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.android.client.utils.connection.IpConnectionListener; +import com.o3dr.android.client.utils.connection.UdpConnection; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.action.ExperimentalActions; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.nio.ByteBuffer; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_TAG; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.ACTION_SEND_MAVLINK_MESSAGE; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.ACTION_SET_RELAY; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.ACTION_SET_ROI; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.ACTION_SET_SERVO; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.ACTION_TRIGGER_CAMERA; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.EXTRA_IS_RELAY_ON; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.EXTRA_MAVLINK_MESSAGE; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.EXTRA_RELAY_NUMBER; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.EXTRA_SERVO_CHANNEL; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.EXTRA_SERVO_PWM; -import static org.droidplanner.services.android.lib.drone.action.ExperimentalActions.EXTRA_SET_ROI_LAT_LONG_ALT; +import static com.o3dr.services.android.lib.drone.action.CameraActions.EXTRA_VIDEO_TAG; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.ACTION_SEND_MAVLINK_MESSAGE; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.ACTION_SET_RELAY; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.ACTION_SET_ROI; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.ACTION_SET_SERVO; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.ACTION_TRIGGER_CAMERA; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.EXTRA_IS_RELAY_ON; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.EXTRA_MAVLINK_MESSAGE; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.EXTRA_RELAY_NUMBER; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.EXTRA_SERVO_CHANNEL; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.EXTRA_SERVO_PWM; +import static com.o3dr.services.android.lib.drone.action.ExperimentalActions.EXTRA_SET_ROI_LAT_LONG_ALT; /** * Contains drone commands with no defined interaction model yet. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/FollowApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/FollowApi.java similarity index 72% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/FollowApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/FollowApi.java index e340102539..8513d18fb2 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/FollowApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/FollowApi.java @@ -1,17 +1,17 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.gcs.follow.FollowType; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.gcs.follow.FollowType; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.gcs.action.FollowMeActions.ACTION_DISABLE_FOLLOW_ME; -import static org.droidplanner.services.android.lib.gcs.action.FollowMeActions.ACTION_ENABLE_FOLLOW_ME; -import static org.droidplanner.services.android.lib.gcs.action.FollowMeActions.ACTION_UPDATE_FOLLOW_PARAMS; -import static org.droidplanner.services.android.lib.gcs.action.FollowMeActions.EXTRA_FOLLOW_TYPE; +import static com.o3dr.services.android.lib.gcs.action.FollowMeActions.ACTION_DISABLE_FOLLOW_ME; +import static com.o3dr.services.android.lib.gcs.action.FollowMeActions.ACTION_ENABLE_FOLLOW_ME; +import static com.o3dr.services.android.lib.gcs.action.FollowMeActions.ACTION_UPDATE_FOLLOW_PARAMS; +import static com.o3dr.services.android.lib.gcs.action.FollowMeActions.EXTRA_FOLLOW_TYPE; /** * Provides access to the Follow me api. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/GimbalApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/GimbalApi.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/GimbalApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/GimbalApi.java index cd3db2ea6c..f8e445f36f 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/GimbalApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/GimbalApi.java @@ -1,24 +1,24 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; import android.support.annotation.NonNull; import com.MAVLink.enums.MAV_MOUNT_MODE; -import org.droidplanner.android.client.Drone; -import org.droidplanner.android.client.interfaces.DroneListener; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; -import org.droidplanner.services.android.lib.drone.property.Type; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.android.client.interfaces.DroneListener; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.drone.property.Type; +import com.o3dr.services.android.lib.model.SimpleCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import static org.droidplanner.services.android.lib.drone.action.GimbalActions.*; +import static com.o3dr.services.android.lib.drone.action.GimbalActions.*; public final class GimbalApi extends Api implements DroneListener { @@ -43,7 +43,7 @@ public interface GimbalOrientationListener { /** * Indicates errors occurring from attempting to set the gimbal orientation. - * @param error @see {@link org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError} + * @param error @see {@link com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError} */ void onGimbalOrientationCommandError(int error); } diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/MissionApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/MissionApi.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/MissionApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/MissionApi.java index 1d4b669d65..efcbcf02d7 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/MissionApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/MissionApi.java @@ -1,17 +1,17 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.drone.mission.Mission; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.drone.mission.Mission; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.drone.mission.action.MissionActions.*; +import static com.o3dr.services.android.lib.drone.mission.action.MissionActions.*; /** * Provides access to missions specific functionality. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/VehicleApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/VehicleApi.java similarity index 77% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/VehicleApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/VehicleApi.java index db1ea35866..1b7ef38b43 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/VehicleApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/VehicleApi.java @@ -1,35 +1,35 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.os.Bundle; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.property.Parameters; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +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.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.property.Parameters; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.drone.action.ConnectionActions.ACTION_CONNECT; -import static org.droidplanner.services.android.lib.drone.action.ConnectionActions.ACTION_DISCONNECT; -import static org.droidplanner.services.android.lib.drone.action.ConnectionActions.EXTRA_CONNECT_PARAMETER; -import static org.droidplanner.services.android.lib.drone.action.ParameterActions.ACTION_REFRESH_PARAMETERS; -import static org.droidplanner.services.android.lib.drone.action.ParameterActions.ACTION_WRITE_PARAMETERS; -import static org.droidplanner.services.android.lib.drone.action.ParameterActions.EXTRA_PARAMETERS; -import static org.droidplanner.services.android.lib.drone.action.StateActions.ACTION_ARM; -import static org.droidplanner.services.android.lib.drone.action.StateActions.ACTION_ENABLE_RETURN_TO_ME; -import static org.droidplanner.services.android.lib.drone.action.StateActions.ACTION_SET_VEHICLE_HOME; -import static org.droidplanner.services.android.lib.drone.action.StateActions.ACTION_SET_VEHICLE_MODE; -import static org.droidplanner.services.android.lib.drone.action.StateActions.ACTION_UPDATE_VEHICLE_DATA_STREAM_RATE; -import static org.droidplanner.services.android.lib.drone.action.StateActions.EXTRA_ARM; -import static org.droidplanner.services.android.lib.drone.action.StateActions.EXTRA_EMERGENCY_DISARM; -import static org.droidplanner.services.android.lib.drone.action.StateActions.EXTRA_IS_RETURN_TO_ME_ENABLED; -import static org.droidplanner.services.android.lib.drone.action.StateActions.EXTRA_VEHICLE_DATA_STREAM_RATE; -import static org.droidplanner.services.android.lib.drone.action.StateActions.EXTRA_VEHICLE_HOME_LOCATION; -import static org.droidplanner.services.android.lib.drone.action.StateActions.EXTRA_VEHICLE_MODE; +import static com.o3dr.services.android.lib.drone.action.ConnectionActions.ACTION_CONNECT; +import static com.o3dr.services.android.lib.drone.action.ConnectionActions.ACTION_DISCONNECT; +import static com.o3dr.services.android.lib.drone.action.ConnectionActions.EXTRA_CONNECT_PARAMETER; +import static com.o3dr.services.android.lib.drone.action.ParameterActions.ACTION_REFRESH_PARAMETERS; +import static com.o3dr.services.android.lib.drone.action.ParameterActions.ACTION_WRITE_PARAMETERS; +import static com.o3dr.services.android.lib.drone.action.ParameterActions.EXTRA_PARAMETERS; +import static com.o3dr.services.android.lib.drone.action.StateActions.ACTION_ARM; +import static com.o3dr.services.android.lib.drone.action.StateActions.ACTION_ENABLE_RETURN_TO_ME; +import static com.o3dr.services.android.lib.drone.action.StateActions.ACTION_SET_VEHICLE_HOME; +import static com.o3dr.services.android.lib.drone.action.StateActions.ACTION_SET_VEHICLE_MODE; +import static com.o3dr.services.android.lib.drone.action.StateActions.ACTION_UPDATE_VEHICLE_DATA_STREAM_RATE; +import static com.o3dr.services.android.lib.drone.action.StateActions.EXTRA_ARM; +import static com.o3dr.services.android.lib.drone.action.StateActions.EXTRA_EMERGENCY_DISARM; +import static com.o3dr.services.android.lib.drone.action.StateActions.EXTRA_IS_RETURN_TO_ME_ENABLED; +import static com.o3dr.services.android.lib.drone.action.StateActions.EXTRA_VEHICLE_DATA_STREAM_RATE; +import static com.o3dr.services.android.lib.drone.action.StateActions.EXTRA_VEHICLE_HOME_LOCATION; +import static com.o3dr.services.android.lib.drone.action.StateActions.EXTRA_VEHICLE_MODE; /** * Provides access to the vehicle specific functionality. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloApi.java similarity index 55% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloApi.java index 1c1b0fa21f..8dd2d0c0ec 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloApi.java @@ -1,15 +1,15 @@ -package org.droidplanner.android.client.apis.solo; +package com.o3dr.android.client.apis.solo; import android.os.Bundle; -import org.droidplanner.android.client.Drone; -import org.droidplanner.android.client.apis.Api; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.android.client.apis.Api; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloActions.ACTION_SEND_MESSAGE; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloActions.EXTRA_MESSAGE_DATA; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloActions.ACTION_SEND_MESSAGE; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloActions.EXTRA_MESSAGE_DATA; /** * Created by Fredia Huya-Kouadio on 7/31/15. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloCameraApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloCameraApi.java similarity index 94% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloCameraApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloCameraApi.java index 72d1509ab9..add5c098c3 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloCameraApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloCameraApi.java @@ -1,18 +1,18 @@ -package org.droidplanner.android.client.apis.solo; +package com.o3dr.android.client.apis.solo; import android.os.Bundle; import android.view.Surface; import com.MAVLink.enums.GOPRO_COMMAND; -import org.droidplanner.android.client.Drone; -import org.droidplanner.android.client.apis.CameraApi; -import org.droidplanner.android.client.apis.CapabilityApi; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproConstants; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproRecord; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproSetExtendedRequest; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproSetRequest; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import com.o3dr.android.client.Drone; +import com.o3dr.android.client.apis.CameraApi; +import com.o3dr.android.client.apis.CapabilityApi; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproConstants; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproRecord; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproSetExtendedRequest; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproSetRequest; +import com.o3dr.services.android.lib.model.AbstractCommandListener; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloConfigApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloConfigApi.java similarity index 66% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloConfigApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloConfigApi.java index d70618d071..cae78919ef 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloConfigApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloConfigApi.java @@ -1,30 +1,30 @@ -package org.droidplanner.android.client.apis.solo; +package com.o3dr.android.client.apis.solo; import android.os.Bundle; -import org.droidplanner.android.client.Drone; -import org.droidplanner.android.client.utils.TxPowerComplianceCountries; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.android.client.utils.TxPowerComplianceCountries; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_REFRESH_SOLO_VERSIONS; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_BUTTON_SETTINGS; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_CONTROLLER_MODE; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_CONTROLLER_UNIT; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_TX_POWER_COMPLIANCE_COUNTRY; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_WIFI_SETTINGS; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_BUTTON_SETTINGS; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_CONTROLLER_MODE; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_CONTROLLER_UNIT; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_TX_POWER_COMPLIANT_COUNTRY_CODE; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_WIFI_PASSWORD; -import static org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_WIFI_SSID; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_REFRESH_SOLO_VERSIONS; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_BUTTON_SETTINGS; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_CONTROLLER_MODE; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_CONTROLLER_UNIT; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_TX_POWER_COMPLIANCE_COUNTRY; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.ACTION_UPDATE_WIFI_SETTINGS; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_BUTTON_SETTINGS; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_CONTROLLER_MODE; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_CONTROLLER_UNIT; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_TX_POWER_COMPLIANT_COUNTRY_CODE; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_WIFI_PASSWORD; +import static com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions.EXTRA_WIFI_SSID; /** * Created by Fredia Huya-Kouadio on 7/31/15. @@ -82,7 +82,7 @@ public void updateButtonSettings(SoloButtonSettingSetter buttonSettings, Abstrac /** * Updates the controller mode (joystick mapping) * - * @param controllerMode Controller mode. @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} + * @param controllerMode Controller mode. @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} * @param listener Register a callback to receive update of the command execution status. */ public void updateControllerMode(@SoloControllerMode.ControllerMode int controllerMode, AbstractCommandListener listener) { @@ -126,7 +126,7 @@ public void refreshSoloVersions(){ /** * Updates the controller unit system. - * @param controllerUnit Controller unit system. @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} + * @param controllerUnit Controller unit system. @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} * @param listener Register a callback that receive update of the command execution status. */ public void updateControllerUnit(@SoloControllerUnits.ControllerUnit String controllerUnit, final AbstractCommandListener listener){ diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloMessageApi.java b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloMessageApi.java similarity index 76% rename from ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloMessageApi.java rename to ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloMessageApi.java index 3f127271db..c9ad2187b0 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/apis/solo/SoloMessageApi.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/apis/solo/SoloMessageApi.java @@ -1,8 +1,8 @@ -package org.droidplanner.android.client.apis.solo; +package com.o3dr.android.client.apis.solo; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.AbstractCommandListener; import java.util.concurrent.ConcurrentHashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/interfaces/DroneListener.java b/ClientLib/src/main/java/com/o3dr/android/client/interfaces/DroneListener.java similarity index 66% rename from ClientLib/src/main/java/org/droidplanner/android/client/interfaces/DroneListener.java rename to ClientLib/src/main/java/com/o3dr/android/client/interfaces/DroneListener.java index b9b702b41b..1fa92a64fb 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/interfaces/DroneListener.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/interfaces/DroneListener.java @@ -1,9 +1,9 @@ -package org.droidplanner.android.client.interfaces; +package com.o3dr.android.client.interfaces; import android.os.Bundle; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; /** * Created by fhuya on 11/18/14. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/interfaces/LinkListener.java b/ClientLib/src/main/java/com/o3dr/android/client/interfaces/LinkListener.java similarity index 58% rename from ClientLib/src/main/java/org/droidplanner/android/client/interfaces/LinkListener.java rename to ClientLib/src/main/java/com/o3dr/android/client/interfaces/LinkListener.java index 4a791aeed2..2dac623510 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/interfaces/LinkListener.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/interfaces/LinkListener.java @@ -1,14 +1,14 @@ -package org.droidplanner.android.client.interfaces; +package com.o3dr.android.client.interfaces; import android.support.annotation.NonNull; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; /** * An interface that will update the caller with information about the link connection. * - * This is passed to the {@link org.droidplanner.android.client.Drone#connect(ConnectionParameter, LinkListener)} + * This is passed to the {@link com.o3dr.android.client.Drone#connect(ConnectionParameter, LinkListener)} * method. */ public interface LinkListener { diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/interfaces/TowerListener.java b/ClientLib/src/main/java/com/o3dr/android/client/interfaces/TowerListener.java similarity index 72% rename from ClientLib/src/main/java/org/droidplanner/android/client/interfaces/TowerListener.java rename to ClientLib/src/main/java/com/o3dr/android/client/interfaces/TowerListener.java index 6f725c2823..a3d2ef98e4 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/interfaces/TowerListener.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/interfaces/TowerListener.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.interfaces; +package com.o3dr.android.client.interfaces; /** * Created by fhuya on 11/12/14. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/InstallServiceDialog.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/InstallServiceDialog.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/InstallServiceDialog.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/InstallServiceDialog.java index 0fa5fdea2a..652bda078c 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/InstallServiceDialog.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/InstallServiceDialog.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils; +package com.o3dr.android.client.utils; import android.content.Intent; import android.content.pm.PackageManager; @@ -10,7 +10,7 @@ import android.widget.TextView; import android.widget.Toast; -import org.droidplanner.android.client.R; +import com.o3dr.android.client.R; /** * Created by fhuya on 11/14/14. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/TxPowerComplianceCountries.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/TxPowerComplianceCountries.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/TxPowerComplianceCountries.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/TxPowerComplianceCountries.java index 60bb4d3f80..70a00c48f9 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/TxPowerComplianceCountries.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/TxPowerComplianceCountries.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils; +package com.o3dr.android.client.utils; /** * Created by chavi on 1/27/16. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/AbstractIpConnection.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/AbstractIpConnection.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/AbstractIpConnection.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/connection/AbstractIpConnection.java index 38318cd8d2..fbc3c98631 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/AbstractIpConnection.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/AbstractIpConnection.java @@ -1,11 +1,11 @@ -package org.droidplanner.android.client.utils.connection; +package com.o3dr.android.client.utils.connection; import android.os.Handler; import android.os.Process; import android.os.RemoteException; import android.util.Log; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import java.io.IOException; import java.io.InterruptedIOException; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/IpConnectionListener.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/IpConnectionListener.java similarity index 80% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/IpConnectionListener.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/connection/IpConnectionListener.java index a87a1ac986..01c7453794 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/IpConnectionListener.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/IpConnectionListener.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.connection; +package com.o3dr.android.client.utils.connection; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/TcpConnection.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/TcpConnection.java similarity index 96% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/TcpConnection.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/connection/TcpConnection.java index c47c5281d7..2a133ec257 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/TcpConnection.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/TcpConnection.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.connection; +package com.o3dr.android.client.utils.connection; import android.os.Handler; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/UdpConnection.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/UdpConnection.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/UdpConnection.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/connection/UdpConnection.java index c1af99b5f4..2315745e21 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/connection/UdpConnection.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/connection/UdpConnection.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.connection; +package com.o3dr.android.client.utils.connection; import android.os.Handler; import android.util.Log; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogIteratorCallback.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogIteratorCallback.java similarity index 89% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogIteratorCallback.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogIteratorCallback.java index 5bdef71adf..14a9883d2f 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogIteratorCallback.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogIteratorCallback.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.data.tlog; +package com.o3dr.android.client.utils.data.tlog; /** * Callback for asynchronous TLog iterator. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogIteratorFilter.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogIteratorFilter.java similarity index 73% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogIteratorFilter.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogIteratorFilter.java index a655b2e5cd..21b7544ea3 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogIteratorFilter.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogIteratorFilter.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.data.tlog; +package com.o3dr.android.client.utils.data.tlog; /** * Filter class for TLog iterator to allow the caller to determine the criteria for returned event. @@ -8,7 +8,7 @@ public interface TLogIteratorFilter { * This method is called when an event is parsed to determine whether the caller wants this result * returned. * - * @param event {@link org.droidplanner.android.client.utils.data.tlog.TLogParser.Event} + * @param event {@link com.o3dr.android.client.utils.data.tlog.TLogParser.Event} * @return whether this event should be accepted based off criteria */ boolean acceptEvent(TLogParser.Event event); diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParser.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParser.java similarity index 99% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParser.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParser.java index 3a1ecc7257..748e3a8ed8 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParser.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParser.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.data.tlog; +package com.o3dr.android.client.utils.data.tlog; import android.net.Uri; import android.os.Handler; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserCallback.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserCallback.java similarity index 76% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserCallback.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserCallback.java index c629a7633e..c6940bc61a 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserCallback.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserCallback.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.data.tlog; +package com.o3dr.android.client.utils.data.tlog; import java.util.List; @@ -10,7 +10,7 @@ public interface TLogParserCallback { /** * Callback for successful retrieval of one or more Event. * - * @param events {@link org.droidplanner.android.client.utils.data.tlog.TLogParser.Event} + * @param events {@link com.o3dr.android.client.utils.data.tlog.TLogParser.Event} */ void onResult(List events); diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserFilter.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserFilter.java similarity index 80% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserFilter.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserFilter.java index 3128d852fe..c6b1bcfc14 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogParserFilter.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogParserFilter.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.data.tlog; +package com.o3dr.android.client.utils.data.tlog; /** * Filter class for TLog parser to allow the caller to determine the criteria for the list @@ -9,7 +9,7 @@ public interface TLogParserFilter { * This method is called when an event is parsed to determine whether the caller wants this result * in the returned list. * - * @param event {@link org.droidplanner.android.client.utils.data.tlog.TLogParser.Event} + * @param event {@link com.o3dr.android.client.utils.data.tlog.TLogParser.Event} * @return whether this event should be accepted based off criteria */ boolean includeEvent(TLogParser.Event event); diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogPicker.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogPicker.java similarity index 84% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogPicker.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogPicker.java index d7704b2bf4..98cdd32c74 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/data/tlog/TLogPicker.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/data/tlog/TLogPicker.java @@ -1,9 +1,9 @@ -package org.droidplanner.android.client.utils.data.tlog; +package com.o3dr.android.client.utils.data.tlog; import android.app.Activity; import android.content.Intent; -import org.droidplanner.services.android.lib.data.ServiceDataContract; +import com.o3dr.services.android.lib.data.ServiceDataContract; /** * Provides utility to select a tlog files. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java similarity index 95% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java index e7b37aa1ba..39df59a9dd 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/FilterByTimestampGeoTagAlgorithm.java @@ -1,12 +1,12 @@ -package org.droidplanner.android.client.utils.geotag; +package com.o3dr.android.client.utils.geotag; import android.util.Log; import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.ardupilotmega.msg_camera_feedback; import com.MAVLink.common.msg_named_value_int; -import org.droidplanner.android.client.utils.data.tlog.TLogParser; -import org.droidplanner.android.client.utils.data.tlog.TLogParser.Event; +import com.o3dr.android.client.utils.data.tlog.TLogParser; +import com.o3dr.android.client.utils.data.tlog.TLogParser.Event; import java.io.File; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagAsyncTask.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagAsyncTask.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagAsyncTask.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagAsyncTask.java index c1d3a59a7c..6bc0dea834 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagAsyncTask.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagAsyncTask.java @@ -1,8 +1,8 @@ -package org.droidplanner.android.client.utils.geotag; +package com.o3dr.android.client.utils.geotag; import android.os.AsyncTask; -import org.droidplanner.android.client.utils.data.tlog.TLogParser; +import com.o3dr.android.client.utils.data.tlog.TLogParser; import java.io.File; import java.util.ArrayList; @@ -32,7 +32,7 @@ public void onProgress(int numProcessed, int numTotal) { * Warning: this copies data to external storage * * @param rootDir {@link File} - * @param events {@link List< org.droidplanner.android.client.utils.data.tlog.TLogParser.Event>} list of events to geotag photos. + * @param events {@link List< com.o3dr.android.client.utils.data.tlog.TLogParser.Event>} list of events to geotag photos. * @param photos {@link List} list of files of photos to geotag. */ public GeoTagAsyncTask(File rootDir, List events, ArrayList photos) { diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagUtils.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagUtils.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagUtils.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagUtils.java index 0af582351d..527f5c135c 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/GeoTagUtils.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/GeoTagUtils.java @@ -1,9 +1,9 @@ -package org.droidplanner.android.client.utils.geotag; +package com.o3dr.android.client.utils.geotag; import android.media.ExifInterface; import com.MAVLink.ardupilotmega.msg_camera_feedback; -import org.droidplanner.android.client.utils.data.tlog.TLogParser; +import com.o3dr.android.client.utils.data.tlog.TLogParser; import java.io.File; import java.io.FileInputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/SimpleGeoTagAlgorithm.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/SimpleGeoTagAlgorithm.java similarity index 85% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/SimpleGeoTagAlgorithm.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/SimpleGeoTagAlgorithm.java index fa530cda43..a1b52f3326 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/geotag/SimpleGeoTagAlgorithm.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/geotag/SimpleGeoTagAlgorithm.java @@ -1,6 +1,6 @@ -package org.droidplanner.android.client.utils.geotag; +package com.o3dr.android.client.utils.geotag; -import org.droidplanner.android.client.utils.data.tlog.TLogParser; +import com.o3dr.android.client.utils.data.tlog.TLogParser; import java.io.File; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/MetricUnitProvider.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/MetricUnitProvider.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/MetricUnitProvider.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/unit/MetricUnitProvider.java index fecc71f248..e40be713ed 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/MetricUnitProvider.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/MetricUnitProvider.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.unit; +package com.o3dr.android.client.utils.unit; import java.util.Locale; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/UnitProvider.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/UnitProvider.java similarity index 87% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/UnitProvider.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/unit/UnitProvider.java index ea2a26318c..367d96c1bd 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/unit/UnitProvider.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/unit/UnitProvider.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.unit; +package com.o3dr.android.client.utils.unit; /** * Created by fhuya on 1/11/15. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/DecoderListener.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/DecoderListener.java similarity index 76% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/video/DecoderListener.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/video/DecoderListener.java index 5d2f8d902a..9178ad7ffd 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/DecoderListener.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/DecoderListener.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.video; +package com.o3dr.android.client.utils.video; /** * Created by fhuya on 12/4/14. diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/MediaCodecManager.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/MediaCodecManager.java similarity index 99% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/video/MediaCodecManager.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/video/MediaCodecManager.java index c3226d09f7..96b4eb0cf0 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/MediaCodecManager.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/MediaCodecManager.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.video; +package com.o3dr.android.client.utils.video; import android.annotation.TargetApi; import android.media.MediaCodec; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunk.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunk.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunk.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunk.java index 9eefe64f2d..d77f313545 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunk.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunk.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.video; +package com.o3dr.android.client.utils.video; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunkAssembler.java b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunkAssembler.java similarity index 99% rename from ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunkAssembler.java rename to ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunkAssembler.java index d63e2c9cd6..c5ee961cb1 100644 --- a/ClientLib/src/main/java/org/droidplanner/android/client/utils/video/NaluChunkAssembler.java +++ b/ClientLib/src/main/java/com/o3dr/android/client/utils/video/NaluChunkAssembler.java @@ -1,4 +1,4 @@ -package org.droidplanner.android.client.utils.video; +package com.o3dr.android.client.utils.video; import android.annotation.TargetApi; import android.media.MediaCodec; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.aidl new file mode 100644 index 0000000000..8c32cbff3b --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.coordinate; + +parcelable LatLong; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.java index c1046bc048..261104da61 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLong.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.coordinate; +package com.o3dr.services.android.lib.coordinate; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.aidl new file mode 100644 index 0000000000..5628aaac7f --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.aidl @@ -0,0 +1,4 @@ +package com.o3dr.services.android.lib.coordinate; + +parcelable LatLongAlt; + diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.java index a9733ba2fa..68c8d5cefe 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/coordinate/LatLongAlt.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.coordinate; +package com.o3dr.services.android.lib.coordinate; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/data/ServiceDataContract.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/data/ServiceDataContract.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/data/ServiceDataContract.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/data/ServiceDataContract.java index d005399119..e68f937aaa 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/data/ServiceDataContract.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/data/ServiceDataContract.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.data; +package com.o3dr.services.android.lib.data; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * The contract between the 3DR Services data provider, and applications. Contains definitions for the supported URIs diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CameraActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CameraActions.java similarity index 82% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CameraActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CameraActions.java index 46d909e31e..342dfd3662 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CameraActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CameraActions.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; /** * Created by Fredia Huya-Kouadio on 7/31/15. @@ -9,7 +9,7 @@ public class CameraActions { private CameraActions() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action.camera"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.action.camera"; public static final String ACTION_START_VIDEO_STREAM = PACKAGE_NAME + ".START_VIDEO_STREAM"; public static final String EXTRA_VIDEO_DISPLAY = "extra_video_display"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CapabilityActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CapabilityActions.java similarity index 78% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CapabilityActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CapabilityActions.java index d0885b2715..159df0a055 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/CapabilityActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/CapabilityActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 7/15/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ConnectionActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ConnectionActions.java similarity index 79% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ConnectionActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ConnectionActions.java index 5eedef866e..99b265b5a8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ConnectionActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ConnectionActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Contains builder methods use to generate connect or disconnect actions. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ControlActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ControlActions.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ControlActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ControlActions.java index 4d99733d08..2857822d36 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ControlActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ControlActions.java @@ -1,13 +1,13 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 9/7/15. */ public class ControlActions { - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.action.control"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.action.control"; public static final String ACTION_DO_GUIDED_TAKEOFF = Utils.PACKAGE_NAME + ".action.DO_GUIDED_TAKEOFF"; public static final String EXTRA_ALTITUDE = "extra_altitude"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ExperimentalActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ExperimentalActions.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ExperimentalActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ExperimentalActions.java index 6380c13f5e..f537e11462 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ExperimentalActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ExperimentalActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GimbalActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GimbalActions.java similarity index 87% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GimbalActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GimbalActions.java index 164253025f..39fddd505d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GimbalActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GimbalActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; public class GimbalActions { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GuidedActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GuidedActions.java similarity index 72% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GuidedActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GuidedActions.java index 82181c2841..9273f4febb 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/GuidedActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/GuidedActions.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ParameterActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ParameterActions.java similarity index 79% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ParameterActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ParameterActions.java index 3c5201669d..310c534565 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/ParameterActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/ParameterActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/StateActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/StateActions.java similarity index 84% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/StateActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/StateActions.java index 5a77dafec1..73442f6ac1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/action/StateActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/action/StateActions.java @@ -1,13 +1,13 @@ -package org.droidplanner.services.android.lib.drone.action; +package com.o3dr.services.android.lib.drone.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. */ public class StateActions { - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.action.state"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.action.state"; public static final String ACTION_ARM = Utils.PACKAGE_NAME + ".action.ARM"; public static final String EXTRA_ARM = "extra_arm"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEvent.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEvent.java similarity index 84% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEvent.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEvent.java index 7d44f5b504..1c2e5e1892 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEvent.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEvent.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.attribute; +package com.o3dr.services.android.lib.drone.attribute; /** * Stores all possible drone events. @@ -9,7 +9,7 @@ public class AttributeEvent { private AttributeEvent() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.attribute.event"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.attribute.event"; /** * Attitude attribute events. @@ -19,14 +19,14 @@ private AttributeEvent() { /** * Signals an autopilot error. * - * @see {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_ERROR_ID} + * @see {@link com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_ERROR_ID} */ public static final String AUTOPILOT_ERROR = PACKAGE_NAME + ".AUTOPILOT_ERROR"; /** * Event describing a message received from the autopilot. - * The message content can be retrieved using the {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE} key. - * The message level can be retrieved using the {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE_LEVEL} key. + * The message content can be retrieved using the {@link com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE} key. + * The message level can be retrieved using the {@link com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra#EXTRA_AUTOPILOT_MESSAGE_LEVEL} key. */ public static final String AUTOPILOT_MESSAGE = PACKAGE_NAME + ".AUTOPILOT_MESSAGE"; @@ -84,16 +84,16 @@ private AttributeEvent() { /** * Event to signal the start of parameters refresh from the vehicle. * - * @see {@link org.droidplanner.services.android.lib.drone.property.Parameters} - * @see {@link org.droidplanner.services.android.lib.drone.property.Parameter} + * @see {@link com.o3dr.services.android.lib.drone.property.Parameters} + * @see {@link com.o3dr.services.android.lib.drone.property.Parameter} */ public static final String PARAMETERS_REFRESH_STARTED = PACKAGE_NAME + ".PARAMETERS_REFRESH_STARTED"; /** * Event to signal the completion of the parameters refresh from the vehicle. * - * @see {@link org.droidplanner.services.android.lib.drone.property.Parameters} - * @see {@link org.droidplanner.services.android.lib.drone.property.Parameter} + * @see {@link com.o3dr.services.android.lib.drone.property.Parameters} + * @see {@link com.o3dr.services.android.lib.drone.property.Parameter} */ public static final String PARAMETERS_REFRESH_COMPLETED = PACKAGE_NAME + ".PARAMETERS_REFRESH_ENDED"; @@ -148,31 +148,31 @@ private AttributeEvent() { /** * Signals updates of the ekf status. - * @see {@link org.droidplanner.services.android.lib.drone.property.State} + * @see {@link com.o3dr.services.android.lib.drone.property.State} */ public static final String STATE_EKF_REPORT = PACKAGE_NAME + ".STATE_EKF_REPORT"; /** * Signals updates to the ekf position state. - * @see {@link org.droidplanner.services.android.lib.drone.property.State} + * @see {@link com.o3dr.services.android.lib.drone.property.State} */ public static final String STATE_EKF_POSITION = PACKAGE_NAME + ".STATE_EKF_POSITION"; /** * Signals update of the vehicle mode. - * @see {@link org.droidplanner.services.android.lib.drone.property.State} + * @see {@link com.o3dr.services.android.lib.drone.property.State} */ public static final String STATE_VEHICLE_MODE = PACKAGE_NAME + ".STATE_VEHICLE_MODE"; /** * Signals vehicle vibration updates. - * @see {@link org.droidplanner.services.android.lib.drone.property.State} + * @see {@link com.o3dr.services.android.lib.drone.property.State} */ public static final String STATE_VEHICLE_VIBRATION = PACKAGE_NAME + ".STATE_VEHICLE_VIBRATION"; /** * Signals vehicle UID updates. - * @see {@link org.droidplanner.services.android.lib.drone.property.State} + * @see {@link com.o3dr.services.android.lib.drone.property.State} */ public static final String STATE_VEHICLE_UID = PACKAGE_NAME + ".STATE_VEHICLE_UID"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEventExtra.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEventExtra.java similarity index 84% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEventExtra.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEventExtra.java index bab6f8e075..58a29f5757 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeEventExtra.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeEventExtra.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.attribute; +package com.o3dr.services.android.lib.drone.attribute; /** * Holds handles used to retrieve additional information broadcast along a drone event. @@ -9,7 +9,7 @@ public class AttributeEventExtra { private AttributeEventExtra() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.attribute.event.extra"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.attribute.event.extra"; /** * Used to access the vehicle id. @@ -19,15 +19,15 @@ private AttributeEventExtra() { /** * Used to access autopilot error type. * - * @see {@link org.droidplanner.services.android.lib.drone.attribute.error.ErrorType} - * @see {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_ERROR} + * @see {@link com.o3dr.services.android.lib.drone.attribute.error.ErrorType} + * @see {@link com.o3dr.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_ERROR} */ public static final String EXTRA_AUTOPILOT_ERROR_ID = PACKAGE_NAME + ".AUTOPILOT_ERROR_ID"; /** * Used to access autopilot messages. * - * @see {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_MESSAGE} + * @see {@link com.o3dr.services.android.lib.drone.attribute.AttributeEvent#AUTOPILOT_MESSAGE} */ public static final String EXTRA_AUTOPILOT_MESSAGE = PACKAGE_NAME + ".AUTOPILOT_MESSAGE"; @@ -41,14 +41,14 @@ private AttributeEventExtra() { /** * Used to access the magnetometer calibration progress. * - * @see {@link org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress} + * @see {@link com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress} */ public static final String EXTRA_CALIBRATION_MAG_PROGRESS = PACKAGE_NAME + ".CALIBRATION_MAG_PROGRESS"; /** * Used to access the result from the magnetometer calibration. * - * @see {@link org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult} + * @see {@link com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult} */ public static final String EXTRA_CALIBRATION_MAG_RESULT = PACKAGE_NAME + ".CALIBRATION_MAG_RESULT"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeType.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeType.java similarity index 60% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeType.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeType.java index 7d4a64d453..36ffe91fcd 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/AttributeType.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/AttributeType.java @@ -1,109 +1,109 @@ -package org.droidplanner.services.android.lib.drone.attribute; +package com.o3dr.services.android.lib.drone.attribute; /** * Stores the set of attribute types. */ public class AttributeType { - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.attribute"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.attribute"; //Private to prevent instantiation private AttributeType(){} /** * Used to access the vehicle's altitude state. - * @see {@link org.droidplanner.services.android.lib.drone.property.Altitude} + * @see {@link com.o3dr.services.android.lib.drone.property.Altitude} */ public static final String ALTITUDE = PACKAGE_NAME + ".ALTITUDE"; /** * Used to access the vehicle's attitude state. - * @see {@link org.droidplanner.services.android.lib.drone.property.Attitude} + * @see {@link com.o3dr.services.android.lib.drone.property.Attitude} */ public static final String ATTITUDE = PACKAGE_NAME + ".ATTITUDE"; /** * Used to access the vehicle's battery state. - * @see {@link org.droidplanner.services.android.lib.drone.property.Speed} + * @see {@link com.o3dr.services.android.lib.drone.property.Speed} */ public static final String BATTERY = PACKAGE_NAME + ".BATTERY"; /** * Used to access the set of camera information available for the connected drone. - * @see {@link org.droidplanner.services.android.lib.drone.property.CameraProxy} + * @see {@link com.o3dr.services.android.lib.drone.property.CameraProxy} */ public static final String CAMERA = PACKAGE_NAME + ".CAMERA"; /** * Used to acces the vehicle's follow state. - * @see {@link org.droidplanner.services.android.lib.gcs.follow.FollowState} + * @see {@link com.o3dr.services.android.lib.gcs.follow.FollowState} */ public static final String FOLLOW_STATE = PACKAGE_NAME + ".FOLLOW_STATE"; /** * Used to access the vehicle's guided state. - * @see {@link org.droidplanner.services.android.lib.drone.property.GuidedState} + * @see {@link com.o3dr.services.android.lib.drone.property.GuidedState} */ public static final String GUIDED_STATE = PACKAGE_NAME + ".GUIDED_STATE"; /** * Used to access the vehicle's gps state. - * @see {@link org.droidplanner.services.android.lib.drone.property.Gps} object. + * @see {@link com.o3dr.services.android.lib.drone.property.Gps} object. */ public static final String GPS = PACKAGE_NAME + ".GPS"; /** * Used to access the vehicle's home state. - * @see {@link org.droidplanner.services.android.lib.drone.property.Home} + * @see {@link com.o3dr.services.android.lib.drone.property.Home} */ public static final String HOME = PACKAGE_NAME + ".HOME"; /** * Used to access the vehicle's mission state. - * @see {@link org.droidplanner.services.android.lib.drone.mission.Mission} + * @see {@link com.o3dr.services.android.lib.drone.mission.Mission} */ public static final String MISSION = PACKAGE_NAME + ".MISSION"; /** * Used to access the vehicle's parameters. - * @see {@link org.droidplanner.services.android.lib.drone.property.Parameters} - * @see {@link org.droidplanner.services.android.lib.drone.property.Parameter} + * @see {@link com.o3dr.services.android.lib.drone.property.Parameters} + * @see {@link com.o3dr.services.android.lib.drone.property.Parameter} */ public static final String PARAMETERS = PACKAGE_NAME + ".PARAMETERS"; /** * Used to access the vehicle's signal state. - * @see {@link org.droidplanner.services.android.lib.drone.property.Signal} + * @see {@link com.o3dr.services.android.lib.drone.property.Signal} */ public static final String SIGNAL = PACKAGE_NAME + ".SIGNAL"; /** * Used to access the vehicle's speed info. - * @see {@link org.droidplanner.services.android.lib.drone.property.Speed} + * @see {@link com.o3dr.services.android.lib.drone.property.Speed} */ public static final String SPEED = PACKAGE_NAME + ".SPEED"; /** * Used to access the vehicle state. - * @see {@link org.droidplanner.services.android.lib.drone.property.State} object. + * @see {@link com.o3dr.services.android.lib.drone.property.State} object. */ public static final String STATE = PACKAGE_NAME + ".STATE"; /** * Used to access the vehicle type. - * @see {@link org.droidplanner.services.android.lib.drone.property.Type} + * @see {@link com.o3dr.services.android.lib.drone.property.Type} */ public static final String TYPE = PACKAGE_NAME + ".TYPE"; /** * Used to retrieve the status of the currently or last running magnetometer calibration. - * @see {@link org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus} + * @see {@link com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus} */ public static final String MAGNETOMETER_CALIBRATION_STATUS = PACKAGE_NAME + ".MAGNETOMETER_CALIBRATION_STATUS"; /** * Used to retrieve the 'return to me' state. - * @see {@link org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState} + * @see {@link com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState} */ public static final String RETURN_TO_ME_STATE = PACKAGE_NAME + ".RETURN_TO_ME_STATE"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/CommandExecutionError.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/CommandExecutionError.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/CommandExecutionError.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/CommandExecutionError.java index 53ad940f10..42b60f6e55 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/CommandExecutionError.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/CommandExecutionError.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.attribute.error; +package com.o3dr.services.android.lib.drone.attribute.error; /** * List the possible command execution errors. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/ErrorType.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/ErrorType.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/ErrorType.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/ErrorType.java index 65b4c4d96a..32dcdc6353 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/attribute/error/ErrorType.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/attribute/error/ErrorType.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.attribute.error; +package com.o3dr.services.android.lib.drone.attribute.error; import android.content.Context; import android.os.Parcel; @@ -6,7 +6,7 @@ import android.support.annotation.StringRes; import android.text.TextUtils; -import org.droidplanner.android.client.R; +import com.o3dr.android.client.R; /** * List all the possible error types. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl new file mode 100644 index 0000000000..888eb913e4 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.calibration.magnetometer; + +parcelable MagnetometerCalibrationProgress; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java index 9657472b9b..a86318fc7d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.calibration.magnetometer; +package com.o3dr.services.android.lib.drone.calibration.magnetometer; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl new file mode 100644 index 0000000000..555cd8fbc9 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.calibration.magnetometer; + +parcelable MagnetometerCalibrationResult; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java index e2152ec484..c5ccbf675a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.calibration.magnetometer; +package com.o3dr.services.android.lib.drone.calibration.magnetometer; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl new file mode 100644 index 0000000000..cc03c0ffbb --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.calibration.magnetometer; + +parcelable MagnetometerCalibrationStatus; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java similarity index 96% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java index 5f4243c990..e684ee5e5f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.calibration.magnetometer; +package com.o3dr.services.android.lib.drone.calibration.magnetometer; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; import java.util.ArrayList; import java.util.HashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloAttributes.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloAttributes.java similarity index 78% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloAttributes.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloAttributes.java index 8afbba9088..05e0dc29fd 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloAttributes.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloAttributes.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo; +package com.o3dr.services.android.lib.drone.companion.solo; /** * Stores the set of solo attribute types. @@ -9,7 +9,7 @@ public class SoloAttributes { //Private to prevent instantiation private SoloAttributes(){} - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.attribute"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.attribute"; /** * Used to access the sololink state. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEventExtras.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEventExtras.java similarity index 82% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEventExtras.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEventExtras.java index ee75e076ac..f5480e339d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEventExtras.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEventExtras.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo; +package com.o3dr.services.android.lib.drone.companion.solo; /** * Holds handles used to retrieve additional information broadcast along a drone event. @@ -9,10 +9,10 @@ public class SoloEventExtras { //Private to prevent instantiation private SoloEventExtras(){} - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.event.extra"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.event.extra"; /** - * Used to retrieve the {@link org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket} object describing the button event. + * Used to retrieve the {@link com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket} object describing the button event. */ public static final String EXTRA_SOLO_BUTTON_EVENT = PACKAGE_NAME + ".EXTRA_SOLO_BUTTON_EVENT"; /** @@ -63,14 +63,14 @@ private SoloEventExtras(){} /** * Used to retrieve the controller mode. - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} * @see {@link SoloEvents#SOLO_CONTROLLER_MODE_UPDATED} */ public static final String EXTRA_SOLO_CONTROLLER_MODE = PACKAGE_NAME + ".EXTRA_SOLO_CONTROLLER_MODE"; /** * Used to retrieve the controller unit system. - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} * @see {@link SoloEvents#SOLO_CONTROLLER_UNIT_UPDATED} */ public static final String EXTRA_SOLO_CONTROLLER_UNIT = PACKAGE_NAME + ".EXTRA_SOLO_CONTROLLER_UNIT"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEvents.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEvents.java similarity index 88% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEvents.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEvents.java index 9a4d8d45c6..c7429e459e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloEvents.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloEvents.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo; +package com.o3dr.services.android.lib.drone.companion.solo; /** * Stores all possible drone events. @@ -10,18 +10,18 @@ public class SoloEvents { private SoloEvents() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.event"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.event"; /** * Broadcasts updates to the GoPro state. * - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproState} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproState} */ public static final String SOLO_GOPRO_STATE_UPDATED = PACKAGE_NAME + ".GOPRO_STATE_UPDATED"; /** * Broadcasts updates to the Gopro extended state. - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2} */ public static final String SOLO_GOPRO_STATE_V2_UPDATED = PACKAGE_NAME + ".GOPRO_STATE_V2_UPDATED"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloState.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloState.java similarity index 89% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloState.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloState.java index 55080d6962..1925e137e3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/SoloState.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/SoloState.java @@ -1,15 +1,15 @@ -package org.droidplanner.services.android.lib.drone.companion.solo; +package com.o3dr.services.android.lib.drone.companion.solo; import android.os.Parcel; import android.util.SparseArray; -import org.droidplanner.android.client.utils.TxPowerComplianceCountries; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.android.client.utils.TxPowerComplianceCountries; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; import java.nio.ByteBuffer; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloActions.java similarity index 59% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloActions.java index e55fe0a41b..539495fc2c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloActions.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.action; +package com.o3dr.services.android.lib.drone.companion.solo.action; /** * Created by Fredia Huya-Kouadio on 7/10/15. @@ -9,14 +9,14 @@ public class SoloActions { private SoloActions() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.action"; public static final String ACTION_SEND_MESSAGE = PACKAGE_NAME + ".SEND_MESSAGE"; /** * TLV message object to send to the sololink companion computer. * - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket} */ public static final String EXTRA_MESSAGE_DATA = "extra_message_data"; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloConfigActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloConfigActions.java similarity index 78% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloConfigActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloConfigActions.java index 36e8474f83..098202d159 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloConfigActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloConfigActions.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.action; +package com.o3dr.services.android.lib.drone.companion.solo.action; /** * Created by Fredia Huya-Kouadio on 7/31/15. @@ -9,7 +9,7 @@ public class SoloConfigActions { private SoloConfigActions() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action.config"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.action.config"; public static final String ACTION_UPDATE_WIFI_SETTINGS = PACKAGE_NAME + ".UPDATE_WIFI_SETTINGS"; public static final String EXTRA_WIFI_SSID = "extra_wifi_ssid"; @@ -20,7 +20,7 @@ private SoloConfigActions() { /** * Used to retrieve the button settings to push to the sololink companion computer. * - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter} */ public static final String EXTRA_BUTTON_SETTINGS = "extra_button_settings"; @@ -29,7 +29,7 @@ private SoloConfigActions() { /** * Controller mode to apply. * - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode} */ public static final String EXTRA_CONTROLLER_MODE = "extra_controller_mode"; @@ -54,7 +54,7 @@ private SoloConfigActions() { /** * Controller unit system to apply. - * @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} + * @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} */ public static final String EXTRA_CONTROLLER_UNIT = "extra_controller_unit"; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloShotsActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloShotsActions.java new file mode 100644 index 0000000000..9d5a2b9f70 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/action/SoloShotsActions.java @@ -0,0 +1,12 @@ +package com.o3dr.services.android.lib.drone.companion.solo.action; + +/** + * Created by Fredia Huya-Kouadio on 7/31/15. + */ +public class SoloShotsActions { + + //Private to prevent instantiation + private SoloShotsActions(){} + + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.drone.companion.solo.action.shots"; +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonPacket.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonPacket.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonPacket.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonPacket.java index 405d6a2a80..1db907e750 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonPacket.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonPacket.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.button; +package com.o3dr.services.android.lib.drone.companion.solo.button; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonTypes.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonTypes.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonTypes.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonTypes.java index e7eb4d5e19..b53b415fd3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/button/ButtonTypes.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/button/ButtonTypes.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.button; +package com.o3dr.services.android.lib.drone.companion.solo.button; /** * Created by djmedina on 4/15/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java index af9a809dbe..308621fe8d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerMode.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.controller; +package com.o3dr.services.android.lib.drone.companion.solo.controller; import android.support.annotation.IntDef; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java index f665fc9300..568a5a3444 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/controller/SoloControllerUnits.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.controller; +package com.o3dr.services.android.lib.drone.companion.solo.controller; import android.support.annotation.StringDef; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java index b7b5f4909e..d26e7e1005 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/ControllerMessageInputReport.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java similarity index 96% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java index f3d8c5bce2..e1dc3ebae3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSetting.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java index 4b8f50ba06..6b2a954a05 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingGetter.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java index c24261ff74..cf0e241c4b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloButtonSettingSetter.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java index 4d69f78b8f..8d3a38ca42 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamOptions.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java index c95209b861..4fe5460b59 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloCableCamWaypoint.java @@ -1,8 +1,8 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java index 401c7834df..dcc6ae7cd3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptions.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java index 30fc494e52..c8a953fc12 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloFollowOptionsV2.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; import android.support.annotation.IntDef; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java similarity index 96% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java index 772456debd..a4e440356c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproConstants.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.support.annotation.IntDef; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java similarity index 95% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java index 02531b70e8..3b7d680a98 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRecord.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java index ae8b0313dd..2f627ce557 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproRequestState.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java similarity index 95% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java index db8ccb10e1..cc383cc758 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetExtendedRequest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java similarity index 96% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java index 60e61a32d1..700cc224fd 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproSetRequest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java index cce36dd39d..aaa277ed4c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproState.java @@ -1,8 +1,8 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java index bd65694ca2..98fb9b3ce9 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloGoproStateV2.java @@ -1,8 +1,8 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java index 9542805fbc..9b7cd7c33b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageLocation.java @@ -1,8 +1,8 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java index b543569a4b..1fbbf7ba2b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageRecordPosition.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java similarity index 95% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java index a51a9538b8..f5fec3a54d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShot.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.content.Context; import android.os.Parcel; -import org.droidplanner.android.client.R; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; +import com.o3dr.android.client.R; +import com.o3dr.services.android.lib.drone.property.VehicleMode; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java index 7cc5048501..64da99e4f8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotGetter.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java similarity index 95% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java index b4c74eab87..d8715de398 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotManagerError.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java index 3f20c0e7be..2b5fea6ed1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloMessageShotSetter.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloPause.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloPause.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloPause.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloPause.java index a5edcb8483..0a8ff3c778 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloPause.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloPause.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotError.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotError.java similarity index 94% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotError.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotError.java index 346d5d3990..138fdc7679 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotError.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotError.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java index e02c5da9f9..c71b41f9aa 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/SoloShotOptions.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java similarity index 66% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java index 5d9a0f3ca3..0be0641668 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParser.java @@ -1,21 +1,21 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.util.Log; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectStart; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectSetWaypoint; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveGimbal; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveVehicle; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineAttach; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineDurations; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePathSettings; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlay; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlaybackStatus; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePoint; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineRecord; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineSeek; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.scan.SoloScanStart; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.survey.SoloSurveyStart; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectStart; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectSetWaypoint; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveGimbal; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect.SoloInspectMoveVehicle; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineAttach; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineDurations; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePathSettings; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlay; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePlaybackStatus; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplinePoint; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineRecord; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc.SoloSplineSeek; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.scan.SoloScanStart; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.survey.SoloSurveyStart; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; @@ -23,41 +23,41 @@ import java.util.ArrayList; import java.util.List; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_ARTOO_INPUT_REPORT_MESSAGE; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_OPTIONS; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_WAYPOINT; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS_V2; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GET_BUTTON_SETTING; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_RECORD; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_REQUEST_STATE; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_EXTENDED_REQUEST; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_REQUEST; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE_V2; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_GIMBAL; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_VEHICLE; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_SET_WAYPOINT; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_START; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_GET_CURRENT_SHOT; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_LOCATION; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_RECORD_POSITION; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SET_CURRENT_SHOT; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SHOT_MANAGER_ERROR; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_PAUSE_BUTTON; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SCAN_START; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SET_BUTTON_SETTING; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_ERROR; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_OPTIONS; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_ATTACH; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PATH_SETTINGS; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_DURATIONS; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAY; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAYBACK_STATUS; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_POINT; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_RECORD; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_SEEK; -import static org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SURVEY_START; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_ARTOO_INPUT_REPORT_MESSAGE; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_OPTIONS; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_CABLE_CAM_WAYPOINT; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_FOLLOW_OPTIONS_V2; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GET_BUTTON_SETTING; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_RECORD; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_REQUEST_STATE; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_EXTENDED_REQUEST; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_SET_REQUEST; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_GOPRO_STATE_V2; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_GIMBAL; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_MOVE_VEHICLE; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_SET_WAYPOINT; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_INSPECT_START; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_GET_CURRENT_SHOT; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_LOCATION; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_RECORD_POSITION; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SET_CURRENT_SHOT; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_MESSAGE_SHOT_MANAGER_ERROR; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_PAUSE_BUTTON; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SCAN_START; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SET_BUTTON_SETTING; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_ERROR; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SHOT_OPTIONS; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_ATTACH; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PATH_SETTINGS; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_DURATIONS; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAY; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_PLAYBACK_STATUS; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_POINT; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_RECORD; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SPLINE_SEEK; +import static com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes.TYPE_SOLO_SURVEY_START; /** * Utility class to generate tlv packet from received bytes. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java index 55ed7b0dca..1ed03112b9 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageTypes.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; /** * All sololink messages types. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVPacket.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVPacket.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVPacket.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVPacket.java index 3a93a0846f..6c9b7ef0a5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVPacket.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVPacket.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java index d05e1717da..50ab52ec45 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineAttach.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java index a9aecac5c7..253891a564 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineDurations.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java index af7c8be308..3517463d2a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePathSettings.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; import android.support.annotation.IntDef; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java similarity index 84% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java index aea4c12000..e20d76ecb3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlay.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java similarity index 94% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java index 843ceb9a49..ef5eb786ec 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePlaybackStatus.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java similarity index 96% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java index 9fd75854b8..d07817d407 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplinePoint.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java similarity index 79% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java index 4a32dccdd0..c6f7912844 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineRecord.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java index 6671ff2bee..0d4f473322 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/mpcc/SoloSplineSeek.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.mpcc; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.mpcc; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java index d91dbc1b51..d2211f4cae 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveGimbal.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java index a2a833822d..44b56546bb 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectMoveVehicle.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java index 2702f8ec3d..c212ecdf6c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectSetWaypoint.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java similarity index 88% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java index 8941be0763..4ea4f4a90f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/inspect/SoloInspectStart.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.inspect; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java similarity index 74% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java index 29e3dbd4ab..46a1307f16 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/scan/SoloScanStart.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.scan; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.scan; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java similarity index 75% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java index 2ef136d872..ff593c288e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/sitescan/survey/SoloSurveyStart.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv.sitescan.survey; +package com.o3dr.services.android.lib.drone.companion.solo.tlv.sitescan.survey; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.aidl new file mode 100644 index 0000000000..542f0426ef --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.connection; + +parcelable ConnectionParameter; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.java similarity index 99% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.java index 98816876a3..68b62f0e06 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionParameter.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.connection; +package com.o3dr.services.android.lib.drone.connection; import android.os.Bundle; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.aidl new file mode 100644 index 0000000000..778ee0fb45 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.connection; + +parcelable ConnectionResult; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.java index e974efef09..c4d4a652fa 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionResult.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.connection; +package com.o3dr.services.android.lib.drone.connection; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; /** * @deprecated Use {@link LinkConnectionStatus} instead. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionType.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionType.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionType.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionType.java index 72d3ed9097..ac2468ac48 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionType.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/ConnectionType.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.connection; +package com.o3dr.services.android.lib.drone.connection; /** * Contains constants used for the connection parameters. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.aidl new file mode 100644 index 0000000000..61766b87c2 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.connection; + +parcelable DroneSharePrefs; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.java index 3e82c9d5a4..34d2b600af 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/connection/DroneSharePrefs.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.connection; +package com.o3dr.services.android.lib.drone.connection; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.aidl new file mode 100644 index 0000000000..1f5b4b43af --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.mission; + +parcelable Mission; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.java index 3316216997..10c739ae8f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/Mission.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.mission; +package com.o3dr.services.android.lib.drone.mission; import android.os.Bundle; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/MissionItemType.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/MissionItemType.java similarity index 80% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/MissionItemType.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/MissionItemType.java index 057a01f918..4329c1e969 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/MissionItemType.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/MissionItemType.java @@ -1,31 +1,31 @@ -package org.droidplanner.services.android.lib.drone.mission; +package com.o3dr.services.android.lib.drone.mission; import android.os.Bundle; import android.os.Parcelable; import android.os.Parcelable.Creator; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.item.command.CameraTrigger; -import org.droidplanner.services.android.lib.drone.mission.item.command.ChangeSpeed; -import org.droidplanner.services.android.lib.drone.mission.item.command.DoJump; -import org.droidplanner.services.android.lib.drone.mission.item.command.EpmGripper; -import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; -import org.droidplanner.services.android.lib.drone.mission.item.command.ReturnToLaunch; -import org.droidplanner.services.android.lib.drone.mission.item.command.SetRelay; -import org.droidplanner.services.android.lib.drone.mission.item.command.SetServo; -import org.droidplanner.services.android.lib.drone.mission.item.command.Takeoff; -import org.droidplanner.services.android.lib.drone.mission.item.command.YawCondition; -import org.droidplanner.services.android.lib.drone.mission.item.complex.SplineSurvey; -import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; -import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Circle; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.DoLandStart; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Land; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.SplineWaypoint; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Waypoint; -import org.droidplanner.services.android.lib.drone.property.Type; -import org.droidplanner.services.android.lib.util.ParcelableUtils; +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; /** * /** diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/action/MissionActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/action/MissionActions.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/action/MissionActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/action/MissionActions.java index da5eba3809..e30a873550 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/action/MissionActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/action/MissionActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.drone.mission.action; +package com.o3dr.services.android.lib.drone.mission.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.aidl new file mode 100644 index 0000000000..0c80afe28b --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.mission.item; + +parcelable MissionItem; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.java similarity index 87% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.java index 86bc91fd31..f41e312013 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/MissionItem.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.mission.item; +package com.o3dr.services.android.lib.drone.mission.item; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/5/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/CameraTrigger.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/CameraTrigger.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/CameraTrigger.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/CameraTrigger.java index dcefdf68b4..bdb4c6eb0e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/CameraTrigger.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/CameraTrigger.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ChangeSpeed.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ChangeSpeed.java similarity index 89% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ChangeSpeed.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ChangeSpeed.java index b7f508baa5..f119571d85 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ChangeSpeed.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ChangeSpeed.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/DoJump.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/DoJump.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/DoJump.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/DoJump.java index cf359ffbc7..fa0d8bea3a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/DoJump.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/DoJump.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Created by Toby on 7/31/2015. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/EpmGripper.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/EpmGripper.java similarity index 88% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/EpmGripper.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/EpmGripper.java index ac5136bcc2..9b7c68ce63 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/EpmGripper.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/EpmGripper.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ResetROI.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ResetROI.java similarity index 82% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ResetROI.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ResetROI.java index 99c3127182..4ffe4b5274 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ResetROI.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ResetROI.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Reset the current region of interest lock. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ReturnToLaunch.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ReturnToLaunch.java similarity index 89% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ReturnToLaunch.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ReturnToLaunch.java index b0141a20be..ce81de4825 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/ReturnToLaunch.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/ReturnToLaunch.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetRelay.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetRelay.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetRelay.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetRelay.java index 10b4449eeb..fd711d30c5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetRelay.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetRelay.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Set a Relay pin’s voltage high or low. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetServo.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetServo.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetServo.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetServo.java index d513bb0524..8b0debe0d8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/SetServo.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/SetServo.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * Mission command used to move a servo to a particular pwm value. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/Takeoff.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/Takeoff.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/Takeoff.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/Takeoff.java index 6d3a79e399..1d6d0ab60f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/Takeoff.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/Takeoff.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * The vehicle will climb straight up from it’s current location to the altitude specified (in meters). diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/YawCondition.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/YawCondition.java similarity index 92% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/YawCondition.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/YawCondition.java index a7a0a16f8e..e73e865c83 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/command/YawCondition.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/command/YawCondition.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.command; +package com.o3dr.services.android.lib.drone.mission.item.command; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; /** * Created by fhuya on 11/10/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.aidl new file mode 100644 index 0000000000..d91496c7ae --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.mission.item.complex; + +parcelable CameraDetail; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java index 43a29a7834..9f4eb0ffdc 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; +package com.o3dr.services.android.lib.drone.mission.item.complex; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SplineSurvey.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SplineSurvey.java similarity index 79% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SplineSurvey.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SplineSurvey.java index d200411865..15c4a35653 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SplineSurvey.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SplineSurvey.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; +package com.o3dr.services.android.lib.drone.mission.item.complex; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** */ diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.aidl new file mode 100644 index 0000000000..440fcc0011 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.mission.item.complex; + +parcelable StructureScanner; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.java index 639c80e0d2..1c8eba77db 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/StructureScanner.java @@ -1,12 +1,12 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; +package com.o3dr.services.android.lib.drone.mission.item.complex; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.BaseSpatialItem; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.spatial.BaseSpatialItem; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.aidl new file mode 100644 index 0000000000..db5804910f --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.mission.item.complex; + +parcelable Survey; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.java similarity index 95% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.java index 30e594ed53..f0ae8c7fd5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/Survey.java @@ -1,11 +1,11 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; +package com.o3dr.services.android.lib.drone.mission.item.complex; import android.os.Parcel; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.util.MathUtils; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SurveyDetail.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SurveyDetail.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SurveyDetail.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SurveyDetail.java index dfe74d5f23..01a582bc0c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/SurveyDetail.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/complex/SurveyDetail.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; +package com.o3dr.services.android.lib.drone.mission.item.complex; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java similarity index 85% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java index 50d34d6043..a26045f4fe 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/BaseSpatialItem.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.mission.item.spatial; +package com.o3dr.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; +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.MissionItemType; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Circle.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Circle.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Circle.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Circle.java index bb7d296ba0..ed54252db3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Circle.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Circle.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.spatial; +package com.o3dr.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/DoLandStart.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/DoLandStart.java similarity index 78% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/DoLandStart.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/DoLandStart.java index 4b8898dbf0..72627318ef 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/DoLandStart.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/DoLandStart.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.spatial; +package com.o3dr.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; public class DoLandStart extends BaseSpatialItem implements android.os.Parcelable { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Land.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Land.java similarity index 73% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Land.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Land.java index 36602739cc..fbd83ff574 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Land.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Land.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.drone.mission.item.spatial; +package com.o3dr.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java similarity index 81% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java index 1af44358b4..07e52afbb8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/RegionOfInterest.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.spatial; +package com.o3dr.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Points the nose of the vehicle and camera gimbal at the "region of interest". diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java index db66f4af02..3a67f512a7 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/SplineWaypoint.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.spatial; +package com.o3dr.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Waypoint.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Waypoint.java similarity index 94% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Waypoint.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Waypoint.java index 1b154de2c0..93dbc4990c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/spatial/Waypoint.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/mission/item/spatial/Waypoint.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.mission.item.spatial; +package com.o3dr.services.android.lib.drone.mission.item.spatial; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; /** * Created by fhuya on 11/6/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.aidl new file mode 100644 index 0000000000..24036d3286 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Altitude; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.java index 464ec350f5..2f260b14b1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Altitude.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.aidl new file mode 100644 index 0000000000..b190149d53 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Attitude; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.java index e39e00d52d..1dbe4e3734 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Attitude.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.aidl new file mode 100644 index 0000000000..b21943e45a --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Battery; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.java index 68e8b4a79d..93c751b316 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Battery.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/CameraProxy.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/CameraProxy.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/CameraProxy.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/CameraProxy.java index 9e406a36ce..282bf0be86 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/CameraProxy.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/CameraProxy.java @@ -1,8 +1,8 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; -import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; +import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/DroneAttribute.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/DroneAttribute.java similarity index 69% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/DroneAttribute.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/DroneAttribute.java index ed1c129bf7..155fb0e404 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/DroneAttribute.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/DroneAttribute.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.aidl new file mode 100644 index 0000000000..65b22eeb76 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable EkfStatus; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.java index 1db6ff5c2b..da511eea18 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/EkfStatus.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.aidl new file mode 100644 index 0000000000..62c0895c48 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable FootPrint; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.java similarity index 90% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.java index df85f8d143..f47f9d19e2 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/FootPrint.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.util.MathUtils; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.aidl new file mode 100644 index 0000000000..7d7dd49eda --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Gps; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.java index bab8a03d44..44c7a52b87 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Gps.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; /** * Stores GPS information. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.aidl new file mode 100644 index 0000000000..08622a05ed --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable GuidedState; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.java index 43e85a5fee..5cd9e38f26 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/GuidedState.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; /** * Created by fhuya on 11/5/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.aidl new file mode 100644 index 0000000000..663d56906f --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Home; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.java index b7ea4085ff..91a1ea2e3b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Home.java @@ -1,9 +1,9 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; /** * Location from which the drone took off. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameter.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameter.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameter.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameter.java index 3925375a58..c60d9bd542 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameter.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameter.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.aidl new file mode 100644 index 0000000000..4935bbb0a3 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Parameters; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.java index ed23d75b45..99627ec9f2 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Parameters.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.support.annotation.NonNull; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.aidl new file mode 100644 index 0000000000..066887d2e8 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Signal; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.java index 095109c2ef..1d62fbe6e9 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Signal.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.aidl new file mode 100644 index 0000000000..ad1b9b0c06 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Speed; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.java index 021cca3554..3846928216 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Speed.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.aidl new file mode 100644 index 0000000000..a800c9c22e --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable State; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.java index dfe2e387db..237d5dd0e0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/State.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; import android.text.TextUtils; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.aidl new file mode 100644 index 0000000000..b2b4dc60b2 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Type; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.java index c76290f265..eb77d91f0b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Type.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.aidl new file mode 100644 index 0000000000..a22d63a69f --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable VehicleMode; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.java index 8c36bac70f..dda33e2ab0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/VehicleMode.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.aidl new file mode 100644 index 0000000000..385bd7dfe8 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.drone.property; + +parcelable Vibration; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.java index 005fb99afd..ad56090a40 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/drone/property/Vibration.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.property; +package com.o3dr.services.android.lib.drone.property; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/CalibrationActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/CalibrationActions.java similarity index 91% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/CalibrationActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/CalibrationActions.java index a096a51ad9..5b730f71bf 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/CalibrationActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/CalibrationActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.gcs.action; +package com.o3dr.services.android.lib.gcs.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/FollowMeActions.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/FollowMeActions.java similarity index 83% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/FollowMeActions.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/FollowMeActions.java index 6491b53679..26575c9963 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/action/FollowMeActions.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/action/FollowMeActions.java @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.gcs.action; +package com.o3dr.services.android.lib.gcs.action; -import org.droidplanner.services.android.lib.util.Utils; +import com.o3dr.services.android.lib.util.Utils; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/event/GCSEvent.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/event/GCSEvent.java similarity index 86% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/event/GCSEvent.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/event/GCSEvent.java index 7169a89465..f078c758ed 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/event/GCSEvent.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/event/GCSEvent.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.gcs.event; +package com.o3dr.services.android.lib.gcs.event; /** * Stores the list of gcs events (as action), and their extra parameters. @@ -6,7 +6,7 @@ */ public class GCSEvent { - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.gcs.event"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.gcs.event"; /** * Key to retrieve the app id for the client that caused the event. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.aidl new file mode 100644 index 0000000000..42712bb2d2 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.gcs.follow; + +parcelable FollowState; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.java index 4ab68f3fdf..ad5df9aec4 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowState.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.gcs.follow; +package com.o3dr.services.android.lib.gcs.follow; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; /** * Created by fhuya on 11/5/14. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.aidl new file mode 100644 index 0000000000..e05ac398d1 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.gcs.follow; + +parcelable FollowType; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.java index ab3b3c36ba..8903530c91 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/follow/FollowType.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.gcs.follow; +package com.o3dr.services.android.lib.gcs.follow; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkConnectionStatus.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkConnectionStatus.java similarity index 94% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkConnectionStatus.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkConnectionStatus.java index bc1efba494..e9f1c95980 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkConnectionStatus.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkConnectionStatus.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.gcs.link; +package com.o3dr.services.android.lib.gcs.link; import android.os.Bundle; import android.os.Parcel; @@ -10,9 +10,9 @@ /** * Conveys information about the link connection state. *

- * This value is returned in the {@link org.droidplanner.android.client.Drone#notifyAttributeUpdated} as the - * extra value {@link org.droidplanner.services.android.lib.gcs.link.LinkEventExtra#EXTRA_CONNECTION_STATUS} - * when the attribute event is {@link org.droidplanner.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} + * This value is returned in the {@link com.o3dr.android.client.Drone#notifyAttributeUpdated} as the + * extra value {@link com.o3dr.services.android.lib.gcs.link.LinkEventExtra#EXTRA_CONNECTION_STATUS} + * when the attribute event is {@link com.o3dr.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} */ public final class LinkConnectionStatus implements Parcelable { /** diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEvent.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEvent.java similarity index 68% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEvent.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEvent.java index c65e1b03a4..2758155a1e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEvent.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEvent.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.gcs.link; +package com.o3dr.services.android.lib.gcs.link; /** * Stores all possible link events. @@ -8,7 +8,7 @@ public class LinkEvent { private LinkEvent() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.gcs.link.event"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.gcs.link.event"; /** * Notifies what the link connection status currently is. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEventExtra.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEventExtra.java similarity index 60% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEventExtra.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEventExtra.java index 465f8321e1..03559f95a1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/link/LinkEventExtra.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/link/LinkEventExtra.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.gcs.link; +package com.o3dr.services.android.lib.gcs.link; /** * Holds handles used to retrieve additional information broadcast along a link event. @@ -9,13 +9,13 @@ public class LinkEventExtra { private LinkEventExtra() { } - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.gcs.link.event.extra"; + private static final String PACKAGE_NAME = "com.o3dr.services.android.lib.gcs.link.event.extra"; /** * Used to access the link connection status. * * @see {@link LinkConnectionStatus} - * @see {@link org.droidplanner.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} + * @see {@link com.o3dr.services.android.lib.gcs.link.LinkEvent#LINK_STATE_UPDATED} */ public static final String EXTRA_CONNECTION_STATUS = PACKAGE_NAME + ".CONNECTION_STATUS"; } diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl new file mode 100644 index 0000000000..e60daca327 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.gcs.returnToMe; + +parcelable ReturnToMeState; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.java similarity index 93% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.java index fe016cc636..51b52c6b08 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/gcs/returnToMe/ReturnToMeState.java @@ -1,10 +1,10 @@ -package org.droidplanner.services.android.lib.gcs.returnToMe; +package com.o3dr.services.android.lib.gcs.returnToMe; import android.os.Parcel; import android.support.annotation.IntDef; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.aidl new file mode 100644 index 0000000000..acdb8164f4 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.aidl @@ -0,0 +1,2 @@ +package com.o3dr.services.android.lib.mavlink; +parcelable MavlinkMessageWrapper; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.java similarity index 96% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.java index cbe7d88a25..1603e34351 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/mavlink/MavlinkMessageWrapper.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.mavlink; +package com.o3dr.services.android.lib.mavlink; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/AbstractCommandListener.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/AbstractCommandListener.java similarity index 85% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/AbstractCommandListener.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/AbstractCommandListener.java index ba5bbafa56..d40d7e3555 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/AbstractCommandListener.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/AbstractCommandListener.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; /** * Created by Fredia Huya-Kouadio on 7/5/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IApiListener.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IApiListener.aidl similarity index 79% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IApiListener.aidl rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/IApiListener.aidl index 841aac7c92..ef7a544a45 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IApiListener.aidl +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IApiListener.aidl @@ -1,6 +1,6 @@ -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; /** * DroneAPI event listener. A valid instance must be provided at api registration. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/ICommandListener.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/ICommandListener.aidl similarity index 69% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/ICommandListener.aidl rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/ICommandListener.aidl index 2f930226ac..42c758bf49 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/ICommandListener.aidl +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/ICommandListener.aidl @@ -1,5 +1,5 @@ //ICommandListener.aidl -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; /** * Asynchronous notification of a command execution state. @@ -13,7 +13,7 @@ oneway interface ICommandListener { /** * Called when the command execution failed. - * @param executionError Defined by {@link org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError} + * @param executionError Defined by {@link com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError} */ void onError(int executionError); diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroidPlannerServices.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroidPlannerServices.aidl similarity index 86% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroidPlannerServices.aidl rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroidPlannerServices.aidl index a95e359ece..b65beb8b10 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroidPlannerServices.aidl +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroidPlannerServices.aidl @@ -1,8 +1,8 @@ // IDroidPlannerServices.aidl -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; -import org.droidplanner.services.android.lib.model.IDroneApi; -import org.droidplanner.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.model.IDroneApi; +import com.o3dr.services.android.lib.model.IApiListener; /** * Used to establish connection with a drone. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroneApi.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroneApi.aidl similarity index 81% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroneApi.aidl rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroneApi.aidl index fff0b7e467..30172c0304 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IDroneApi.aidl +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IDroneApi.aidl @@ -1,10 +1,10 @@ // IDroneApi.aidl -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; -import org.droidplanner.services.android.lib.model.IObserver; -import org.droidplanner.services.android.lib.model.IMavlinkObserver; -import org.droidplanner.services.android.lib.model.action.Action; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.IObserver; +import com.o3dr.services.android.lib.model.IMavlinkObserver; +import com.o3dr.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.model.ICommandListener; /** * Interface used to access the drone properties. @@ -14,7 +14,7 @@ interface IDroneApi { /** * Retrieves the attribute whose type is specified by the parameter. * @param attributeType type of the attribute to retrieve. The list of supported - types is stored in {@link org.droidplanner.services.android.lib.drone.attribute.AttributeType}. + types is stored in {@link com.o3dr.services.android.lib.drone.attribute.AttributeType}. * @return Bundle object containing the requested attribute. */ Bundle getAttribute(String attributeType); diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IMavlinkObserver.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IMavlinkObserver.aidl similarity index 73% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IMavlinkObserver.aidl rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/IMavlinkObserver.aidl index 0e1ea7089f..3730942f06 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IMavlinkObserver.aidl +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IMavlinkObserver.aidl @@ -1,7 +1,7 @@ // IMavlinkObserver.aidl -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; /** * Asynchronous notification on receipt of new mavlink message. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IObserver.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IObserver.aidl similarity index 75% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IObserver.aidl rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/IObserver.aidl index c4eb5a0d60..dfc3067225 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/IObserver.aidl +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/IObserver.aidl @@ -1,5 +1,5 @@ // IObserver.aidl -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; /** * Asynchronous notification on change of vehicle state is available by registering observers for @@ -9,7 +9,7 @@ oneway interface IObserver { /** * Notify observer that the named attribute has changed. - * @param attributeEvent event describing the update. The supported events are listed in {@link org.droidplanner.services.android.lib.drone.attribute.AttributeEvent} + * @param attributeEvent event describing the update. The supported events are listed in {@link com.o3dr.services.android.lib.drone.attribute.AttributeEvent} * @param attributeBundle bundle object from which additional event data can be retrieved. */ void onAttributeUpdated(String attributeEvent, in Bundle eventExtras); diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/SimpleCommandListener.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/SimpleCommandListener.java similarity index 88% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/SimpleCommandListener.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/SimpleCommandListener.java index 4a5121de10..8f08a61877 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/SimpleCommandListener.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/SimpleCommandListener.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.model; +package com.o3dr.services.android.lib.model; /** * Basic command listener implementation. diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.aidl b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.aidl new file mode 100644 index 0000000000..dde1180a46 --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.aidl @@ -0,0 +1,3 @@ +package com.o3dr.services.android.lib.model.action; + +parcelable Action; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.java similarity index 95% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.java index 7cd105778f..2b5833cd9d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/model/action/Action.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.model.action; +package com.o3dr.services.android.lib.model.action; import android.os.Bundle; import android.os.Parcel; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/MathUtils.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/MathUtils.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/util/MathUtils.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/util/MathUtils.java index ff90254289..bb9dcbb192 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/MathUtils.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/MathUtils.java @@ -1,7 +1,7 @@ -package org.droidplanner.services.android.lib.util; +package com.o3dr.services.android.lib.util; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/ParcelableUtils.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/ParcelableUtils.java similarity index 97% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/util/ParcelableUtils.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/util/ParcelableUtils.java index daa00d5af1..1f3de2ca8c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/ParcelableUtils.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/ParcelableUtils.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.util; +package com.o3dr.services.android.lib.util; import android.os.Parcel; import android.os.Parcelable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/SpannableUtils.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/SpannableUtils.java similarity index 98% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/util/SpannableUtils.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/util/SpannableUtils.java index b589346cf6..4d5224a43e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/SpannableUtils.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/SpannableUtils.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.util; +package com.o3dr.services.android.lib.util; import android.graphics.Typeface; import android.text.Spannable; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/Utils.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java similarity index 75% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/util/Utils.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java index 990c494398..6af347cc5a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/Utils.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.util; +package com.o3dr.services.android.lib.util; /** * Created by Fredia Huya-Kouadio on 1/19/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/googleApi/GoogleApiClientManager.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/googleApi/GoogleApiClientManager.java similarity index 99% rename from ClientLib/src/main/java/org/droidplanner/services/android/lib/util/googleApi/GoogleApiClientManager.java rename to ClientLib/src/main/java/com/o3dr/services/android/lib/util/googleApi/GoogleApiClientManager.java index 5655046b44..5a56c206a8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/googleApi/GoogleApiClientManager.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/googleApi/GoogleApiClientManager.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.util.googleApi; +package com.o3dr.services.android.lib.util.googleApi; import android.content.Context; import android.os.Bundle; diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/version/VersionUtils.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/version/VersionUtils.java new file mode 100644 index 0000000000..2f7f75016a --- /dev/null +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/version/VersionUtils.java @@ -0,0 +1,22 @@ +package com.o3dr.services.android.lib.util.version; + +import android.content.Context; + +import com.o3dr.android.client.R; + +/** + * Created by fhuya on 11/12/14. + */ +public class VersionUtils { + + /** + * @param context + * @return + */ + public static int getCoreLibVersion(Context context){ + return context.getResources().getInteger(R.integer.core_lib_version); + } + + //Prevent instantiation. + private VersionUtils(){} +} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java index 6bf33e0f77..739b8edcd0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DPServices.java @@ -4,14 +4,14 @@ import android.os.RemoteException; import android.util.Log; -import org.droidplanner.android.client.BuildConfig; +import com.o3dr.android.client.BuildConfig; import org.droidplanner.services.android.impl.core.drone.DroneManager; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.gcs.event.GCSEvent; -import org.droidplanner.services.android.lib.model.IApiListener; -import org.droidplanner.services.android.lib.model.IDroidPlannerServices; -import org.droidplanner.services.android.lib.model.IDroneApi; -import org.droidplanner.services.android.lib.util.version.VersionUtils; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.gcs.event.GCSEvent; +import com.o3dr.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.model.IDroidPlannerServices; +import com.o3dr.services.android.lib.model.IDroneApi; +import com.o3dr.services.android.lib.util.version.VersionUtils; import java.util.ArrayList; import java.util.List; @@ -40,7 +40,7 @@ public int getServiceVersionCode() throws RemoteException { @Override public int getApiVersionCode() throws RemoteException { - return VersionUtils.getDeprecatedLibVersion(serviceRef.getApplicationContext()); + return VersionUtils.getCoreLibVersion(serviceRef.getApplicationContext()); } @Override diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java index 97229d63ca..22689d0881 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroidPlannerService.java @@ -14,17 +14,17 @@ import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; -import org.droidplanner.android.client.R; +import com.o3dr.android.client.R; import org.droidplanner.services.android.impl.core.drone.DroneManager; import org.droidplanner.services.android.impl.core.survey.CameraInfo; import org.droidplanner.services.android.impl.utils.LogToFileTree; import org.droidplanner.services.android.impl.utils.Utils; import org.droidplanner.services.android.impl.utils.analytics.GAUtils; import org.droidplanner.services.android.impl.utils.file.IO.CameraInfoLoader; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; -import org.droidplanner.services.android.lib.model.IApiListener; -import org.droidplanner.services.android.lib.model.IDroidPlannerServices; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; +import com.o3dr.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.model.IDroidPlannerServices; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java index 076aec9dc4..4199fa5474 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/api/DroneApi.java @@ -23,35 +23,35 @@ import org.droidplanner.services.android.impl.exception.ConnectionException; import org.droidplanner.services.android.impl.utils.CommonApiUtils; import org.droidplanner.services.android.impl.utils.video.VideoManager; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.action.CameraActions; -import org.droidplanner.services.android.lib.drone.action.ConnectionActions; -import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; -import org.droidplanner.services.android.lib.drone.mission.Mission; -import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.gcs.event.GCSEvent; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.gcs.link.LinkEvent; -import org.droidplanner.services.android.lib.gcs.link.LinkEventExtra; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.IApiListener; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.IDroneApi; -import org.droidplanner.services.android.lib.model.IMavlinkObserver; -import org.droidplanner.services.android.lib.model.IObserver; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.action.CameraActions; +import com.o3dr.services.android.lib.drone.action.ConnectionActions; +import com.o3dr.services.android.lib.drone.action.ExperimentalActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.drone.mission.Mission; +import com.o3dr.services.android.lib.drone.mission.action.MissionActions; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.item.command.ResetROI; +import com.o3dr.services.android.lib.drone.mission.item.spatial.RegionOfInterest; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.gcs.event.GCSEvent; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkEvent; +import com.o3dr.services.android.lib.gcs.link.LinkEventExtra; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.IDroneApi; +import com.o3dr.services.android.lib.model.IMavlinkObserver; +import com.o3dr.services.android.lib.model.IObserver; +import com.o3dr.services.android.lib.model.action.Action; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java index d9019536b9..99b4710532 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidTcpConnection.java @@ -4,7 +4,7 @@ import org.droidplanner.services.android.impl.core.MAVLink.connection.TcpConnection; import org.droidplanner.services.android.impl.core.model.Logger; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java index 6ec4b79f6c..b75a77b5c5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/AndroidUdpConnection.java @@ -5,7 +5,7 @@ import org.droidplanner.services.android.impl.core.MAVLink.connection.UdpConnection; import org.droidplanner.services.android.impl.core.model.Logger; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java index 2e89043705..282273c1fe 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/SoloConnection.java @@ -6,9 +6,9 @@ import android.os.Bundle; import android.text.TextUtils; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionType; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java index 69b1fd3bb4..a5706925b5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbCDCConnection.java @@ -12,7 +12,7 @@ import com.hoho.android.usbserial.driver.UsbSerialDriver; import com.hoho.android.usbserial.driver.UsbSerialProber; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import java.io.IOException; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java index 58c41ecd55..20039ab11b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/connection/usb/UsbConnection.java @@ -8,7 +8,7 @@ import org.droidplanner.services.android.impl.communication.connection.AndroidMavLinkConnection; import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnectionTypes; import org.droidplanner.services.android.impl.core.model.Logger; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.impl.utils.AndroidLogger; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java index d45fc31697..1917b2bc51 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/model/DataLink.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.impl.communication.model; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.model.ICommandListener; public class DataLink { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java index 0e1577eef1..9ecb8ec234 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/communication/service/MAVLinkClient.java @@ -20,10 +20,10 @@ import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnectionTypes; import org.droidplanner.services.android.impl.core.drone.manager.DroneCommandTracker; import org.droidplanner.services.android.impl.data.SessionDB; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionType; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.impl.utils.analytics.GAUtils; import org.droidplanner.services.android.impl.utils.connection.WifiConnectionHandler; import org.droidplanner.services.android.impl.utils.file.DirectoryPath; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java index c3b29a4208..a75893ddb8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCalibration.java @@ -6,7 +6,7 @@ import com.MAVLink.enums.MAV_CMD_ACK; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; public class MavLinkCalibration { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java index 298cc1d162..00578e96a4 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkCommands.java @@ -12,7 +12,7 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.drone.variables.ApmModes; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; public class MavLinkCommands { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java index 43ac6ffa53..48bc7aa7c9 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/MavLinkParameters.java @@ -5,7 +5,7 @@ import com.MAVLink.common.msg_param_set; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; public class MavLinkParameters { public static void requestParametersList(MavLinkDrone drone) { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java index c2d1d998db..b1d41d87f8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/command/doCmd/MavLinkDoCmds.java @@ -8,8 +8,8 @@ import com.MAVLink.enums.MAV_CMD; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.model.ICommandListener; public class MavLinkDoCmds { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java index 4c2ff5ad6f..560aa45d4c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnection.java @@ -7,7 +7,7 @@ import com.MAVLink.Parser; import org.droidplanner.services.android.impl.core.model.Logger; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import java.io.BufferedOutputStream; import java.io.FileOutputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java index e85567e52e..81a3c3ed03 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/MAVLink/connection/MavLinkConnectionListener.java @@ -2,7 +2,7 @@ import com.MAVLink.MAVLinkPacket; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; /** * Provides updates about the mavlink connection. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java index 2b1d97bc72..d276fd7ef6 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneInterfaces.java @@ -4,7 +4,7 @@ import org.droidplanner.services.android.impl.core.MAVLink.WaypointManager; import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; public class DroneInterfaces { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java index 058a2f79e2..08084e7eee 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneManager.java @@ -14,16 +14,16 @@ import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.utils.CommonApiUtils; import org.droidplanner.services.android.impl.utils.analytics.GAUtils; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.action.GimbalActions; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionType; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.action.GimbalActions; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.concurrent.ConcurrentHashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java index d9528fb6ad..faf75dcf09 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/DroneVariable.java @@ -4,7 +4,7 @@ import android.os.RemoteException; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import timber.log.Timber; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java index 84e472a356..305903f9fe 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/Drone.java @@ -1,9 +1,9 @@ package org.droidplanner.services.android.impl.core.drone.autopilot; import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; /** * Created by Fredia Huya-Kouadio on 7/27/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java index c849a93d7b..74d64bde00 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduCopter.java @@ -7,7 +7,7 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.github.zafarkhaja.semver.Version; -import org.droidplanner.android.client.apis.CapabilityApi; +import com.o3dr.android.client.apis.CapabilityApi; import org.droidplanner.services.android.impl.communication.model.DataLink; import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCommands; import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; @@ -18,10 +18,10 @@ import org.droidplanner.services.android.impl.core.drone.variables.State; import org.droidplanner.services.android.impl.core.firmware.FirmwareType; import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.impl.utils.CommonApiUtils; import java.util.concurrent.ConcurrentHashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java index ccd026c1ed..aa95e52d8b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilot.java @@ -42,25 +42,25 @@ import org.droidplanner.services.android.impl.core.drone.variables.calibration.MagnetometerCalibrationImpl; import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; -import org.droidplanner.services.android.lib.drone.action.GimbalActions; -import org.droidplanner.services.android.lib.drone.action.ParameterActions; -import org.droidplanner.services.android.lib.drone.action.StateActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.gcs.action.CalibrationActions; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.action.ExperimentalActions; +import com.o3dr.services.android.lib.drone.action.GimbalActions; +import com.o3dr.services.android.lib.drone.action.ParameterActions; +import com.o3dr.services.android.lib.drone.action.StateActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.mission.action.MissionActions; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.gcs.action.CalibrationActions; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.impl.utils.CommonApiUtils; import java.util.regex.Matcher; @@ -190,8 +190,8 @@ public boolean executeAsyncAction(Action action, final ICommandListener listener return true; case MissionActions.ACTION_SET_MISSION: - data.setClassLoader(org.droidplanner.services.android.lib.drone.mission.Mission.class.getClassLoader()); - org.droidplanner.services.android.lib.drone.mission.Mission mission = data.getParcelable(MissionActions.EXTRA_MISSION); + data.setClassLoader(com.o3dr.services.android.lib.drone.mission.Mission.class.getClassLoader()); + com.o3dr.services.android.lib.drone.mission.Mission mission = data.getParcelable(MissionActions.EXTRA_MISSION); boolean pushToDrone = data.getBoolean(MissionActions.EXTRA_PUSH_TO_DRONE); CommonApiUtils.setMission(this, mission, pushToDrone); return true; @@ -257,8 +257,8 @@ public boolean executeAsyncAction(Action action, final ICommandListener listener return true; case ParameterActions.ACTION_WRITE_PARAMETERS: - data.setClassLoader(org.droidplanner.services.android.lib.drone.property.Parameters.class.getClassLoader()); - org.droidplanner.services.android.lib.drone.property.Parameters parameters = data.getParcelable(ParameterActions.EXTRA_PARAMETERS); + data.setClassLoader(com.o3dr.services.android.lib.drone.property.Parameters.class.getClassLoader()); + com.o3dr.services.android.lib.drone.property.Parameters parameters = data.getParcelable(ParameterActions.EXTRA_PARAMETERS); CommonApiUtils.writeParameters(this, parameters); return true; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java index b8aaec8e75..c418d7ec65 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/AbstractLinkManager.java @@ -5,9 +5,9 @@ import android.os.RemoteException; import android.text.TextUtils; -import org.droidplanner.android.client.utils.connection.AbstractIpConnection; -import org.droidplanner.android.client.utils.connection.IpConnectionListener; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.android.client.utils.connection.AbstractIpConnection; +import com.o3dr.android.client.utils.connection.IpConnectionListener; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.impl.utils.connection.SshConnection; import java.io.IOException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java index 8a6287f9b1..0815e6303b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/ArduSolo.java @@ -11,8 +11,8 @@ import com.MAVLink.common.msg_statustext; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.android.client.apis.CapabilityApi; -import org.droidplanner.android.client.utils.TxPowerComplianceCountries; +import com.o3dr.android.client.apis.CapabilityApi; +import com.o3dr.android.client.utils.TxPowerComplianceCountries; import org.droidplanner.services.android.impl.communication.model.DataLink; import org.droidplanner.services.android.impl.core.drone.DroneInterfaces; import org.droidplanner.services.android.impl.core.drone.LogMessageListener; @@ -22,25 +22,25 @@ import org.droidplanner.services.android.impl.core.drone.variables.StreamRates; import org.droidplanner.services.android.impl.core.firmware.FirmwareType; import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloAttributes; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; -import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloActions; -import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.SoloAttributes; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEventExtras; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEvents; +import com.o3dr.services.android.lib.drone.companion.solo.action.SoloActions; +import com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.impl.utils.SoloApiUtils; import java.util.regex.Matcher; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java index b46d259344..dd3d700f36 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/SoloComp.java @@ -8,28 +8,28 @@ import android.util.Pair; import android.util.SparseArray; -import org.droidplanner.android.client.BuildConfig; +import com.o3dr.android.client.BuildConfig; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkListener; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink.SoloLinkListener; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink.SoloLinkManager; import org.droidplanner.services.android.impl.utils.NetworkUtils; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproState; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEventExtras; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEvents; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonTypes; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproState; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java index 573470042e..d723262088 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java @@ -1,9 +1,9 @@ package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; /** * Created by Fredia Huya-Kouadio on 7/10/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java index 2e47a83248..edd00d07ef 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java @@ -7,18 +7,18 @@ import com.github.zafarkhaja.semver.Version; -import org.droidplanner.android.client.utils.TxPowerComplianceCountries; -import org.droidplanner.android.client.utils.connection.IpConnectionListener; -import org.droidplanner.android.client.utils.connection.TcpConnection; +import com.o3dr.android.client.utils.TxPowerComplianceCountries; +import com.o3dr.android.client.utils.connection.IpConnectionListener; +import com.o3dr.android.client.utils.connection.TcpConnection; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.impl.utils.NetworkUtils; import org.droidplanner.services.android.impl.utils.connection.SshConnection; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java index f0c507b10c..9e926cfa25 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.sololink; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; /** * Created by Fredia Huya-Kouadio on 7/10/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java index 05cf3e041f..4ab3058b79 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java @@ -4,24 +4,24 @@ import android.os.Handler; import android.text.TextUtils; -import org.droidplanner.android.client.BuildConfig; -import org.droidplanner.android.client.utils.connection.TcpConnection; -import org.droidplanner.android.client.utils.connection.UdpConnection; +import com.o3dr.android.client.BuildConfig; +import com.o3dr.android.client.utils.connection.TcpConnection; +import com.o3dr.android.client.utils.connection.UdpConnection; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.AbstractLinkManager; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; import org.droidplanner.services.android.impl.utils.connection.SshConnection; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproRequestState; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageShotManagerError; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproRequestState; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageShotManagerError; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.SimpleCommandListener; import java.io.IOException; import java.net.UnknownHostException; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java index 91b7e35337..8fd96ecefa 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/autopilot/generic/GenericMavLinkDrone.java @@ -45,33 +45,33 @@ import org.droidplanner.services.android.impl.core.firmware.FirmwareType; import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.action.CapabilityActions; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; -import org.droidplanner.services.android.lib.drone.action.StateActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Attitude; -import org.droidplanner.services.android.lib.drone.property.Battery; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.Parameters; -import org.droidplanner.services.android.lib.drone.property.Signal; -import org.droidplanner.services.android.lib.drone.property.Speed; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.drone.property.Vibration; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.action.CapabilityActions; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.action.ExperimentalActions; +import com.o3dr.services.android.lib.drone.action.StateActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.mission.action.MissionActions; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Attitude; +import com.o3dr.services.android.lib.drone.property.Battery; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameters; +import com.o3dr.services.android.lib.drone.property.Signal; +import com.o3dr.services.android.lib.drone.property.Speed; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.drone.property.Vibration; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.util.MathUtils; import org.droidplanner.services.android.impl.utils.CommonApiUtils; import org.droidplanner.services.android.impl.utils.prefs.DroidPlannerPrefs; import org.droidplanner.services.android.impl.utils.video.VideoManager; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java index 5c2b25ba6e..600b0f5d6e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/DroneCommandTracker.java @@ -8,7 +8,7 @@ import com.MAVLink.common.msg_command_long; import com.MAVLink.common.msg_set_mode; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import java.util.concurrent.ConcurrentHashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java index a2851e7193..8516635ec2 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/manager/MavLinkDroneManager.java @@ -36,19 +36,19 @@ import org.droidplanner.services.android.impl.utils.CommonApiUtils; import org.droidplanner.services.android.impl.utils.SoloApiUtils; import org.droidplanner.services.android.impl.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.action.GimbalActions; -import org.droidplanner.services.android.lib.drone.action.StateActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.gcs.action.FollowMeActions; -import org.droidplanner.services.android.lib.gcs.follow.FollowType; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.action.GimbalActions; +import com.o3dr.services.android.lib.drone.action.StateActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.gcs.action.FollowMeActions; +import com.o3dr.services.android.lib.gcs.follow.FollowType; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import java.util.HashMap; import java.util.Map; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java index 9e0566936e..2f13821858 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/profiles/ParameterManager.java @@ -14,7 +14,7 @@ import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.OnDroneListener; import org.droidplanner.services.android.impl.core.drone.DroneVariable; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.impl.utils.file.IO.ParameterMetadataLoader; import java.util.Locale; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java index f12cf0f29a..ad29c679c3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Camera.java @@ -8,11 +8,11 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.survey.CameraInfo; import org.droidplanner.services.android.impl.core.survey.Footprint; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Attitude; -import org.droidplanner.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Attitude; +import com.o3dr.services.android.lib.drone.property.Gps; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java index a2021af6a6..7f88143cda 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/GuidedPoint.java @@ -9,13 +9,13 @@ import org.droidplanner.services.android.impl.core.drone.DroneVariable; import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.SimpleCommandListener; import timber.log.Timber; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java index 54dad0f327..3c6f67179c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/Magnetometer.java @@ -5,7 +5,7 @@ import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.services.android.impl.core.drone.DroneVariable; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; public class Magnetometer extends DroneVariable { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java index b3caa8e633..49860dca09 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/State.java @@ -14,9 +14,9 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.drone.autopilot.generic.GenericMavLinkDrone; import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import timber.log.Timber; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java index e1e14d0fbd..a26344259b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/drone/variables/calibration/AccelCalibration.java @@ -11,8 +11,8 @@ import org.droidplanner.services.android.impl.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.services.android.impl.core.drone.DroneVariable; import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.SimpleCommandListener; import java.util.concurrent.atomic.AtomicReference; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java index 26e7d871f0..910da2e3e0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/ReturnToMe.java @@ -8,16 +8,16 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.impl.utils.CommonApiUtils; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java index 1558f20dce..57ba021657 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/Follow.java @@ -11,9 +11,9 @@ import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationFinder; import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationReceiver; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.model.action.Action; public class Follow implements OnDroneListener, LocationReceiver { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java index fea76adf70..f5642ef3c6 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowAbove.java @@ -5,7 +5,7 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; public class FollowAbove extends FollowAlgorithm { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java index 755f5bd5ce..8a95b929ce 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowCircle.java @@ -5,8 +5,8 @@ import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.util.MathUtils; public class FollowCircle extends FollowWithRadiusAlgorithm { /** diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java index e27e3f79ed..91e6b688d1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowGuidedScan.java @@ -6,8 +6,8 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.roi.ROIEstimator; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.HashMap; import java.util.Map; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java index 89ffdf43f2..7fa5a5f5d5 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowHeadingAngle.java @@ -6,7 +6,7 @@ import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; public abstract class FollowHeadingAngle extends FollowWithRadiusAlgorithm { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java index a75d558a7b..afcb2dbafe 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowLeash.java @@ -5,9 +5,9 @@ import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Gps; public class FollowLeash extends FollowWithRadiusAlgorithm { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java index d9fe1601e5..50601733ee 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSoloShot.java @@ -8,9 +8,9 @@ import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.impl.core.gcs.roi.ROIEstimator; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; /** * Created by Fredia Huya-Kouadio on 8/3/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java index 51962294d7..7b80c35b17 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineAbove.java @@ -5,7 +5,7 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; /** * Created by fhuya on 1/5/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java index 62b9d91777..30efeb2fa2 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/follow/FollowSplineLeash.java @@ -5,10 +5,10 @@ import org.droidplanner.services.android.impl.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Gps; /** * Created by fhuya on 1/5/15. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java index 994113dc37..db3a7eece0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/FusedLocation.java @@ -16,9 +16,9 @@ import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationFinder; import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationReceiver; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager; -import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.util.googleApi.GoogleApiClientManager; +import com.o3dr.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java index 65624661c9..47f969f1d1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/location/Location.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.gcs.location; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; public class Location { diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java index d093898e10..c35254a868 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/gcs/roi/ROIEstimator.java @@ -7,8 +7,8 @@ import org.droidplanner.services.android.impl.core.gcs.location.Location; import org.droidplanner.services.android.impl.core.gcs.location.Location.LocationReceiver; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java index 877f6c2201..00dd39e474 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBounds.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.impl.core.helpers.coordinates; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java index 3d89eb244c..142607b3d1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoTools.java @@ -2,9 +2,9 @@ import org.droidplanner.services.android.impl.core.helpers.units.Area; import org.droidplanner.services.android.impl.core.polygon.Polygon; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.util.MathUtils; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java index 03153cc803..509ea9c5d0 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineLatLong.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; public class LineLatLong { private final LatLong start; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java index b541090f7a..213160186a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineSampler.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java index 7d42eccdf5..bf155f5c03 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/LineTools.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; import org.droidplanner.services.android.impl.core.helpers.coordinates.CoordBounds; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java index 5655ffba91..0fc5e4e75c 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PointTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java index 9a74e6f584..1649eadbff 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/PolylineTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java index de60458bca..8ee6cfb75e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/Simplify.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java index 4e0f128417..cbc9f1c7fb 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/Spline.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools.spline; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java index a7e8e9459f..5926309855 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/helpers/geoTools/spline/SplinePath.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.impl.core.helpers.geoTools.spline; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java index 52f0be2a43..a73cfe40de 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/Mission.java @@ -28,13 +28,13 @@ import org.droidplanner.services.android.impl.core.mission.waypoints.SpatialCoordItem; import org.droidplanner.services.android.impl.core.mission.waypoints.SplineWaypointImpl; import org.droidplanner.services.android.impl.core.mission.waypoints.WaypointImpl; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Attitude; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Attitude; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.drone.property.Parameter; import java.util.ArrayList; import java.util.Collections; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java index 9e4be05617..294ad4ad6d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/MissionItemType.java @@ -18,7 +18,7 @@ import org.droidplanner.services.android.impl.core.mission.waypoints.SplineWaypointImpl; import org.droidplanner.services.android.impl.core.mission.waypoints.StructureScannerImpl; import org.droidplanner.services.android.impl.core.mission.waypoints.WaypointImpl; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.Collections; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java index 455e90bebd..a741a8e8f6 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SplineSurveyImpl.java @@ -6,7 +6,7 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemType; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java index 1a2e5b427b..e633ad8630 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/survey/SurveyImpl.java @@ -13,7 +13,7 @@ import org.droidplanner.services.android.impl.core.survey.SurveyData; import org.droidplanner.services.android.impl.core.survey.grid.Grid; import org.droidplanner.services.android.impl.core.survey.grid.GridBuilder; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java index 1ef9f7e560..db6500a5ac 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/CircleImpl.java @@ -7,7 +7,7 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import org.droidplanner.services.android.impl.core.mission.MissionItemType; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java index 395950b437..bfcd060f52 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/DoLandStartImpl.java @@ -6,8 +6,8 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import org.droidplanner.services.android.impl.core.mission.MissionItemType; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java index b526e09fac..0e924647df 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImpl.java @@ -6,8 +6,8 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import org.droidplanner.services.android.impl.core.mission.MissionItemType; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java index 8ae138c94a..fc43a3695b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/RegionOfInterestImpl.java @@ -6,7 +6,7 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import org.droidplanner.services.android.impl.core.mission.MissionItemType; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java index 8f8ab3ff80..e611b00836 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItem.java @@ -4,8 +4,8 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java index 9d561a4e71..329ed297f1 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/SplineWaypointImpl.java @@ -6,7 +6,7 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import org.droidplanner.services.android.impl.core.mission.MissionItemType; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java index 8a759afaf1..b08bba4c10 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/StructureScannerImpl.java @@ -12,8 +12,8 @@ import org.droidplanner.services.android.impl.core.survey.CameraInfo; import org.droidplanner.services.android.impl.core.survey.SurveyData; import org.droidplanner.services.android.impl.core.survey.grid.GridBuilder; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java index c3471ac516..ec2b2ada41 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImpl.java @@ -6,7 +6,7 @@ import org.droidplanner.services.android.impl.core.mission.Mission; import org.droidplanner.services.android.impl.core.mission.MissionItemImpl; import org.droidplanner.services.android.impl.core.mission.MissionItemType; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java index fc75012f27..aaf7cb6b6a 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/polygon/Polygon.java @@ -3,7 +3,7 @@ import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; import org.droidplanner.services.android.impl.core.helpers.units.Area; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.Collections; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java index 0bd82593a0..16cabb4af8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/Footprint.java @@ -3,8 +3,8 @@ import com.MAVLink.ardupilotmega.msg_camera_feedback; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.util.MathUtils; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java index c6a8d635ff..f25b3a3595 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/CircumscribedGrid.java @@ -3,7 +3,7 @@ import org.droidplanner.services.android.impl.core.helpers.coordinates.CoordBounds; import org.droidplanner.services.android.impl.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java index fa6e76e06a..91bd0fee8b 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/EndpointSorter.java @@ -3,7 +3,7 @@ import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; import org.droidplanner.services.android.impl.core.helpers.geoTools.LineSampler; import org.droidplanner.services.android.impl.core.helpers.geoTools.LineTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java index 8750443336..42f80bfb6e 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Grid.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.impl.core.survey.grid; import org.droidplanner.services.android.impl.core.helpers.geoTools.PolylineTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java index 01593d09ab..25a2560318 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/GridBuilder.java @@ -3,7 +3,7 @@ import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; import org.droidplanner.services.android.impl.core.polygon.Polygon; import org.droidplanner.services.android.impl.core.survey.SurveyData; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java index 36659d177e..7544681b1f 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/core/survey/grid/Trimmer.java @@ -2,7 +2,7 @@ import org.droidplanner.services.android.impl.core.helpers.geoTools.LineLatLong; import org.droidplanner.services.android.impl.core.helpers.geoTools.LineTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java index d97db3fd46..2f3df9171d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/TLogFileSelector.java @@ -13,9 +13,9 @@ import android.widget.ListView; import android.widget.TextView; -import org.droidplanner.android.client.R; +import com.o3dr.android.client.R; import org.droidplanner.services.android.impl.utils.file.FileUtils; -import org.droidplanner.services.android.lib.data.ServiceDataContract; +import com.o3dr.services.android.lib.data.ServiceDataContract; import java.io.File; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java index f483ec260c..31f6f376d9 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/ui/activity/UsbIntentReceiver.java @@ -4,7 +4,7 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import org.droidplanner.android.client.R; +import com.o3dr.android.client.R; /** diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java index ef8f874e42..5b694b8488 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/AndroidApWarningParser.java @@ -2,50 +2,50 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.impl.core.model.AutopilotWarningParser; -import org.droidplanner.services.android.lib.drone.attribute.error.ErrorType; +import com.o3dr.services.android.lib.drone.attribute.error.ErrorType; import java.util.Locale; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ALTITUDE_DISPARITY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_COMPASS_CALIBRATION_RUNNING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_GYRO_CALIBRATION_FAILED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_LEANING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_MODE_NOT_ARMABLE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_ROTOR_NOT_SPINNING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_SAFETY_SWITCH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_BELOW_FAILSAFE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_TOO_HIGH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.AUTO_TUNE_FAILED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.CRASH_DISARMING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.EKF_VARIANCE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.LOW_BATTERY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_DATAFLASH_INSERTED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_ERROR; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PARACHUTE_TOO_LOW; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACRO_BAL_ROLL_PITCH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_BAROMETER_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_ANGLE_MAX; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_BOARD_VOLTAGE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FENCE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_MAGNETIC_FIELD; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_CALIBRATED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_EKF_HOME_VARIANCE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GPS_GLITCH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GYROS_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_HIGH_GPS_HDOP; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_ACCELEROMETERS; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_COMPASSES; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_GYROS; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INS_NOT_CALIBRATED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_NEED_GPS_LOCK; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_RC_NOT_CALIBRATED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.RC_FAILSAFE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.WAITING_FOR_NAVIGATION_ALIGNMENT; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ALTITUDE_DISPARITY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_COMPASS_CALIBRATION_RUNNING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_GYRO_CALIBRATION_FAILED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_LEANING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_MODE_NOT_ARMABLE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_ROTOR_NOT_SPINNING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_SAFETY_SWITCH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_BELOW_FAILSAFE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_TOO_HIGH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.AUTO_TUNE_FAILED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.CRASH_DISARMING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.EKF_VARIANCE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.LOW_BATTERY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.NO_DATAFLASH_INSERTED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.NO_ERROR; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PARACHUTE_TOO_LOW; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACRO_BAL_ROLL_PITCH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_BAROMETER_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_ANGLE_MAX; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_BOARD_VOLTAGE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FENCE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_MAGNETIC_FIELD; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_CALIBRATED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_EKF_HOME_VARIANCE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GPS_GLITCH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GYROS_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_HIGH_GPS_HDOP; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_ACCELEROMETERS; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_COMPASSES; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_GYROS; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INS_NOT_CALIBRATED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_NEED_GPS_LOCK; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_RC_NOT_CALIBRATED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.RC_FAILSAFE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.WAITING_FOR_NAVIGATION_ALIGNMENT; /** * Autopilot error parser. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java index 6134c02f9d..70c49fa399 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/CommonApiUtils.java @@ -32,35 +32,35 @@ import org.droidplanner.services.android.impl.core.mission.survey.SurveyImpl; import org.droidplanner.services.android.impl.core.mission.waypoints.StructureScannerImpl; import org.droidplanner.services.android.impl.core.survey.Footprint; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress; -import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult; -import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; -import org.droidplanner.services.android.lib.drone.mission.Mission; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; -import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; -import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; -import org.droidplanner.services.android.lib.drone.property.CameraProxy; -import org.droidplanner.services.android.lib.drone.property.EkfStatus; -import org.droidplanner.services.android.lib.drone.property.FootPrint; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.GuidedState; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.Parameters; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.drone.property.Type; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.drone.property.Vibration; -import org.droidplanner.services.android.lib.gcs.follow.FollowState; -import org.droidplanner.services.android.lib.gcs.follow.FollowType; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress; +import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult; +import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; +import com.o3dr.services.android.lib.drone.mission.Mission; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; +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.property.CameraProxy; +import com.o3dr.services.android.lib.drone.property.EkfStatus; +import com.o3dr.services.android.lib.drone.property.FootPrint; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.GuidedState; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameters; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.drone.property.Type; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.drone.property.Vibration; +import com.o3dr.services.android.lib.gcs.follow.FollowState; +import com.o3dr.services.android.lib.gcs.follow.FollowType; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import java.lang.reflect.Field; import java.util.ArrayList; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java index 2d37f21c1c..7f3e249f11 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/LogToFileTree.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import org.droidplanner.android.client.BuildConfig; +import com.o3dr.android.client.BuildConfig; import java.io.File; import java.io.FileOutputStream; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java index 1a378fa46f..24d3caa2b2 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/NetworkUtils.java @@ -6,7 +6,7 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import org.droidplanner.android.client.BuildConfig; +import com.o3dr.android.client.BuildConfig; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; /** diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java index df2b2398b4..ecf50d8de3 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/ProxyUtils.java @@ -24,29 +24,29 @@ import org.droidplanner.services.android.impl.core.mission.waypoints.WaypointImpl; import org.droidplanner.services.android.impl.core.survey.CameraInfo; import org.droidplanner.services.android.impl.core.survey.SurveyData; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.item.command.CameraTrigger; -import org.droidplanner.services.android.lib.drone.mission.item.command.ChangeSpeed; -import org.droidplanner.services.android.lib.drone.mission.item.command.DoJump; -import org.droidplanner.services.android.lib.drone.mission.item.command.EpmGripper; -import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; -import org.droidplanner.services.android.lib.drone.mission.item.command.ReturnToLaunch; -import org.droidplanner.services.android.lib.drone.mission.item.command.SetRelay; -import org.droidplanner.services.android.lib.drone.mission.item.command.SetServo; -import org.droidplanner.services.android.lib.drone.mission.item.command.Takeoff; -import org.droidplanner.services.android.lib.drone.mission.item.command.YawCondition; -import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; -import org.droidplanner.services.android.lib.drone.mission.item.complex.SplineSurvey; -import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; -import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; -import org.droidplanner.services.android.lib.drone.mission.item.complex.SurveyDetail; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Circle; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.DoLandStart; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Land; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.SplineWaypoint; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Waypoint; +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.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.CameraDetail; +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.complex.SurveyDetail; +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; /** * Created by fhuya on 11/10/14. diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java index 193ec4ef6a..40de5d3cb8 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/SoloApiUtils.java @@ -6,13 +6,13 @@ import org.droidplanner.services.android.impl.core.drone.autopilot.Drone; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.ArduSolo; import org.droidplanner.services.android.impl.core.drone.autopilot.apm.solo.SoloComp; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloState; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.SoloState; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; import timber.log.Timber; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java index 62600e94a5..28a7a21795 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/analytics/GAUtils.java @@ -9,10 +9,10 @@ import com.google.android.gms.analytics.Logger; import com.google.android.gms.analytics.Tracker; -import org.droidplanner.android.client.BuildConfig; -import org.droidplanner.android.client.R; +import com.o3dr.android.client.BuildConfig; +import com.o3dr.android.client.R; import org.droidplanner.services.android.impl.utils.prefs.DroidPlannerPrefs; -import org.droidplanner.services.android.lib.drone.connection.DroneSharePrefs; +import com.o3dr.services.android.lib.drone.connection.DroneSharePrefs; import java.util.Map; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java index 43fdbae28d..4c7ac9d164 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/connection/WifiConnectionHandler.java @@ -21,7 +21,7 @@ import android.text.TextUtils; import android.widget.Toast; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.impl.utils.NetworkUtils; import java.util.List; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java index ea36cb86fa..3b8a36a96d 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/StreamRecorder.java @@ -12,8 +12,8 @@ import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; import com.googlecode.mp4parser.authoring.tracks.h264.H264TrackImpl; -import org.droidplanner.android.client.utils.video.MediaCodecManager; -import org.droidplanner.android.client.utils.video.NaluChunk; +import com.o3dr.android.client.utils.video.MediaCodecManager; +import com.o3dr.android.client.utils.video.NaluChunk; import java.io.BufferedOutputStream; import java.io.File; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java index 5d59c6504e..0c7ea0ab28 100644 --- a/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java +++ b/ClientLib/src/main/java/org/droidplanner/services/android/impl/utils/video/VideoManager.java @@ -8,14 +8,14 @@ import android.util.Log; import android.view.Surface; -import org.droidplanner.android.client.utils.connection.AbstractIpConnection; -import org.droidplanner.android.client.utils.connection.IpConnectionListener; -import org.droidplanner.android.client.utils.connection.UdpConnection; -import org.droidplanner.android.client.utils.video.DecoderListener; -import org.droidplanner.android.client.utils.video.MediaCodecManager; -import org.droidplanner.services.android.lib.drone.action.CameraActions; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.android.client.utils.connection.AbstractIpConnection; +import com.o3dr.android.client.utils.connection.IpConnectionListener; +import com.o3dr.android.client.utils.connection.UdpConnection; +import com.o3dr.android.client.utils.video.DecoderListener; +import com.o3dr.android.client.utils.video.MediaCodecManager; +import com.o3dr.services.android.lib.drone.action.CameraActions; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.model.ICommandListener; import java.io.IOException; import java.nio.ByteBuffer; diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl deleted file mode 100644 index 382127ad38..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLong.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.coordinate; - -parcelable LatLong; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl deleted file mode 100644 index a50343e3df..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/coordinate/LatLongAlt.aidl +++ /dev/null @@ -1,4 +0,0 @@ -package org.droidplanner.services.android.lib.coordinate; - -parcelable LatLongAlt; - diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl deleted file mode 100644 index 92e5e9f91a..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationProgress.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.calibration.magnetometer; - -parcelable MagnetometerCalibrationProgress; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl deleted file mode 100644 index 2195cee82a..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationResult.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.calibration.magnetometer; - -parcelable MagnetometerCalibrationResult; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl deleted file mode 100644 index 4f129fe9fa..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/calibration/magnetometer/MagnetometerCalibrationStatus.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.calibration.magnetometer; - -parcelable MagnetometerCalibrationStatus; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java deleted file mode 100644 index aedbb4d504..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/companion/solo/action/SoloShotsActions.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.action; - -/** - * Created by Fredia Huya-Kouadio on 7/31/15. - */ -public class SoloShotsActions { - - //Private to prevent instantiation - private SoloShotsActions(){} - - private static final String PACKAGE_NAME = "org.droidplanner.services.android.lib.drone.companion.solo.action.shots"; -} diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl deleted file mode 100644 index e9e3a3c9a8..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionParameter.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.connection; - -parcelable ConnectionParameter; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl deleted file mode 100644 index baa036fcbc..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/ConnectionResult.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.connection; - -parcelable ConnectionResult; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl deleted file mode 100644 index 07feec7882..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/connection/DroneSharePrefs.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.connection; - -parcelable DroneSharePrefs; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl deleted file mode 100644 index 69462fb922..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/Mission.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.mission; - -parcelable Mission; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl deleted file mode 100644 index 62f8947e2f..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/MissionItem.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.mission.item; - -parcelable MissionItem; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl deleted file mode 100644 index 9b81c1bdf9..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/CameraDetail.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; - -parcelable CameraDetail; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl deleted file mode 100644 index 5d3de94a90..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/StructureScanner.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; - -parcelable StructureScanner; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl deleted file mode 100644 index 2d6bd998bd..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/mission/item/complex/Survey.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.mission.item.complex; - -parcelable Survey; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl deleted file mode 100644 index 5620f3fa99..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Altitude.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Altitude; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl deleted file mode 100644 index 58b33ac277..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Attitude.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Attitude; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl deleted file mode 100644 index e8ffa81496..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Battery.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Battery; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl deleted file mode 100644 index 541e286302..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/EkfStatus.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable EkfStatus; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl deleted file mode 100644 index dcbe232ed7..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/FootPrint.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable FootPrint; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl deleted file mode 100644 index 9a0f3c8b22..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Gps.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Gps; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl deleted file mode 100644 index 2c354ea89b..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/GuidedState.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable GuidedState; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl deleted file mode 100644 index e6c766dabf..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Home.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Home; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl deleted file mode 100644 index 2b137a0424..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Parameters.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Parameters; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl deleted file mode 100644 index ddad34381c..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Signal.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Signal; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl deleted file mode 100644 index 29bc4a100d..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Speed.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Speed; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl deleted file mode 100644 index efda6a7ec6..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/State.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable State; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl deleted file mode 100644 index b0459c1ce9..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Type.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Type; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl deleted file mode 100644 index ff41df28c9..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/VehicleMode.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable VehicleMode; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl deleted file mode 100644 index 4e67d0077c..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/drone/property/Vibration.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.drone.property; - -parcelable Vibration; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl deleted file mode 100644 index 960c6472d9..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowState.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.gcs.follow; - -parcelable FollowState; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl deleted file mode 100644 index fe9e41c7d4..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/follow/FollowType.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.gcs.follow; - -parcelable FollowType; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl deleted file mode 100644 index 3442e6d0f4..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/gcs/returnToMe/ReturnToMeState.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.gcs.returnToMe; - -parcelable ReturnToMeState; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl deleted file mode 100644 index f29776059f..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/mavlink/MavlinkMessageWrapper.aidl +++ /dev/null @@ -1,2 +0,0 @@ -package org.droidplanner.services.android.lib.mavlink; -parcelable MavlinkMessageWrapper; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl b/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl deleted file mode 100644 index 4ff71deba2..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/model/action/Action.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package org.droidplanner.services.android.lib.model.action; - -parcelable Action; \ No newline at end of file diff --git a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java b/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java deleted file mode 100644 index 032ec52e0c..0000000000 --- a/ClientLib/src/main/java/org/droidplanner/services/android/lib/util/version/VersionUtils.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.droidplanner.services.android.lib.util.version; - -import android.content.Context; - -import org.droidplanner.android.client.R; - -/** - * Created by fhuya on 11/12/14. - */ -public class VersionUtils { - - /** - * @deprecated - * @param context - * @return - */ - public static int getDeprecatedLibVersion(Context context){ - return context.getResources().getInteger(R.integer.deprecated_lib_version); - } - - public static int getTowerLibVersion(Context context){ - return context.getResources().getInteger(R.integer.tower_lib_version); - } - - //Prevent instantiation. - private VersionUtils(){} -} diff --git a/ClientLib/src/main/res/values/version.xml b/ClientLib/src/main/res/values/version.xml index 9c7bdc2c21..90de7a4a26 100644 --- a/ClientLib/src/main/res/values/version.xml +++ b/ClientLib/src/main/res/values/version.xml @@ -1,5 +1,4 @@ - 20905 - 0 + 20905 \ No newline at end of file diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java b/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java index 29dc8b9cd3..506008f8d9 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DPServices.java @@ -4,12 +4,12 @@ import android.os.RemoteException; import android.util.Log; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.gcs.event.GCSEvent; -import org.droidplanner.services.android.lib.model.IApiListener; -import org.droidplanner.services.android.lib.model.IDroidPlannerServices; -import org.droidplanner.services.android.lib.model.IDroneApi; -import org.droidplanner.services.android.lib.util.version.VersionUtils; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.gcs.event.GCSEvent; +import com.o3dr.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.model.IDroidPlannerServices; +import com.o3dr.services.android.lib.model.IDroneApi; +import com.o3dr.services.android.lib.util.version.VersionUtils; import org.droidplanner.services.android.BuildConfig; import org.droidplanner.services.android.core.drone.DroneManager; @@ -41,7 +41,7 @@ public int getServiceVersionCode() throws RemoteException { @Override public int getApiVersionCode() throws RemoteException { - return VersionUtils.getDeprecatedLibVersion(serviceRef.getApplicationContext()); + return VersionUtils.getCoreLibVersion(serviceRef.getApplicationContext()); } @Override diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java index 9a8f8ec344..9b8ec586b3 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java @@ -13,10 +13,10 @@ import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; -import org.droidplanner.services.android.lib.model.IApiListener; -import org.droidplanner.services.android.lib.model.IDroidPlannerServices; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; +import com.o3dr.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.model.IDroidPlannerServices; import org.droidplanner.services.android.DroidPlannerServicesApp; import org.droidplanner.services.android.R; diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java index 360d3f658b..c3b30e17bd 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java @@ -12,35 +12,35 @@ 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.lib.drone.action.CameraActions; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.action.ConnectionActions; -import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; -import org.droidplanner.services.android.lib.drone.mission.Mission; -import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.gcs.event.GCSEvent; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.gcs.link.LinkEvent; -import org.droidplanner.services.android.lib.gcs.link.LinkEventExtra; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.IApiListener; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.IDroneApi; -import org.droidplanner.services.android.lib.model.IMavlinkObserver; -import org.droidplanner.services.android.lib.model.IObserver; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.action.CameraActions; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.action.ConnectionActions; +import com.o3dr.services.android.lib.drone.action.ExperimentalActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.drone.mission.Mission; +import com.o3dr.services.android.lib.drone.mission.action.MissionActions; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.item.command.ResetROI; +import com.o3dr.services.android.lib.drone.mission.item.spatial.RegionOfInterest; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.gcs.event.GCSEvent; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkEvent; +import com.o3dr.services.android.lib.gcs.link.LinkEventExtra; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.IApiListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.IDroneApi; +import com.o3dr.services.android.lib.model.IMavlinkObserver; +import com.o3dr.services.android.lib.model.IObserver; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.communication.connection.SoloConnection; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java index fdba99d243..54b37879e4 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java @@ -2,7 +2,7 @@ import android.content.Context; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.core.MAVLink.connection.TcpConnection; import org.droidplanner.services.android.core.model.Logger; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java index a9b28eaac3..98103e94b3 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java @@ -3,7 +3,7 @@ import android.content.Context; import android.util.Log; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.core.MAVLink.connection.UdpConnection; import org.droidplanner.services.android.core.model.Logger; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java index efcc772b1b..cee0bbdee6 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java @@ -6,9 +6,9 @@ import android.os.Bundle; import android.text.TextUtils; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionType; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.utils.connection.WifiConnectionHandler; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java index de872f61fe..ca48297c77 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java @@ -11,7 +11,7 @@ import com.hoho.android.usbserial.driver.UsbSerialDriver; import com.hoho.android.usbserial.driver.UsbSerialProber; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import java.io.IOException; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java index fb77ef56e7..00e389ce69 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java @@ -5,7 +5,7 @@ import android.hardware.usb.UsbManager; import android.util.Log; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; import org.droidplanner.services.android.core.MAVLink.connection.MavLinkConnectionTypes; diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java b/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java index 43123f499e..62ac365510 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.communication.model; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.model.ICommandListener; public class DataLink { diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java b/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java index 40b54fac7d..a646e9b893 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java @@ -7,10 +7,10 @@ import com.MAVLink.MAVLinkPacket; import com.MAVLink.Messages.MAVLinkMessage; import com.google.android.gms.analytics.HitBuilders; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionType; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; import org.droidplanner.services.android.communication.connection.AndroidTcpConnection; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java index 73b55bd3c8..7d863bcad2 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java @@ -4,7 +4,7 @@ import com.MAVLink.common.msg_command_long; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_CMD_ACK; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java index 45c572ba50..4c17097660 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java @@ -9,7 +9,7 @@ import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; import com.MAVLink.enums.MAV_GOTO; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.core.drone.variables.ApmModes; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java index d0dcbf6e66..49be088377 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java @@ -5,7 +5,7 @@ import com.MAVLink.common.msg_param_request_list; import com.MAVLink.common.msg_param_request_read; import com.MAVLink.common.msg_param_set; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; public class MavLinkParameters { public static void requestParametersList(MavLinkDrone drone) { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java index 48bcc7cc2d..ed00aba64b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java @@ -6,8 +6,8 @@ import com.MAVLink.common.msg_mission_set_current; import com.MAVLink.enums.GRIPPER_ACTIONS; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java index 6e60b84ed9..857242c1e3 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java @@ -5,7 +5,7 @@ import com.MAVLink.MAVLinkPacket; import com.MAVLink.Parser; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.core.model.Logger; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java index dd9ec185f4..75cb55e9d9 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.MAVLink.connection; import com.MAVLink.MAVLinkPacket; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; /** * Provides updates about the mavlink connection. diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java index 25e087a6d4..32be8546e6 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java @@ -2,7 +2,7 @@ import android.os.Bundle; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.core.MAVLink.WaypointManager; import org.droidplanner.services.android.core.drone.autopilot.Drone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java index 74aa93e791..7eb4b88c75 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java @@ -6,16 +6,16 @@ import android.text.TextUtils; import android.util.Log; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.action.GimbalActions; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionType; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.action.GimbalActions; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.api.DroneApi; import org.droidplanner.services.android.communication.model.DataLink; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java index 7e0485c0a7..4f107d983b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java @@ -3,7 +3,7 @@ import android.os.Handler; import android.os.RemoteException; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java index dc6a2c7a99..75db51176e 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.drone.autopilot; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java index bf557f9210..5482e411e7 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java @@ -6,11 +6,11 @@ import com.github.zafarkhaja.semver.Version; import com.MAVLink.Messages.MAVLinkMessage; -import org.droidplanner.android.client.apis.CapabilityApi; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.android.client.apis.CapabilityApi; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java index 72b16d91f9..88b36c1a54 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java @@ -23,25 +23,25 @@ import com.MAVLink.enums.MAV_MOUNT_MODE; import com.MAVLink.enums.MAV_SYS_STATUS_SENSOR; import com.github.zafarkhaja.semver.Version; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; -import org.droidplanner.services.android.lib.drone.action.GimbalActions; -import org.droidplanner.services.android.lib.drone.action.ParameterActions; -import org.droidplanner.services.android.lib.drone.action.StateActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.gcs.action.CalibrationActions; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.action.ExperimentalActions; +import com.o3dr.services.android.lib.drone.action.GimbalActions; +import com.o3dr.services.android.lib.drone.action.ParameterActions; +import com.o3dr.services.android.lib.drone.action.StateActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.mission.action.MissionActions; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.gcs.action.CalibrationActions; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; @@ -190,8 +190,8 @@ public boolean executeAsyncAction(Action action, final ICommandListener listener return true; case MissionActions.ACTION_SET_MISSION: - data.setClassLoader(org.droidplanner.services.android.lib.drone.mission.Mission.class.getClassLoader()); - org.droidplanner.services.android.lib.drone.mission.Mission mission = data.getParcelable(MissionActions.EXTRA_MISSION); + data.setClassLoader(com.o3dr.services.android.lib.drone.mission.Mission.class.getClassLoader()); + com.o3dr.services.android.lib.drone.mission.Mission mission = data.getParcelable(MissionActions.EXTRA_MISSION); boolean pushToDrone = data.getBoolean(MissionActions.EXTRA_PUSH_TO_DRONE); CommonApiUtils.setMission(this, mission, pushToDrone); return true; @@ -257,8 +257,8 @@ public boolean executeAsyncAction(Action action, final ICommandListener listener return true; case ParameterActions.ACTION_WRITE_PARAMETERS: - data.setClassLoader(org.droidplanner.services.android.lib.drone.property.Parameters.class.getClassLoader()); - org.droidplanner.services.android.lib.drone.property.Parameters parameters = data.getParcelable(ParameterActions.EXTRA_PARAMETERS); + data.setClassLoader(com.o3dr.services.android.lib.drone.property.Parameters.class.getClassLoader()); + com.o3dr.services.android.lib.drone.property.Parameters parameters = data.getParcelable(ParameterActions.EXTRA_PARAMETERS); CommonApiUtils.writeParameters(this, parameters); return true; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java index 58fc0b2f0a..824e53bc25 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java @@ -5,9 +5,9 @@ import android.os.RemoteException; import android.text.TextUtils; -import org.droidplanner.android.client.utils.connection.AbstractIpConnection; -import org.droidplanner.android.client.utils.connection.IpConnectionListener; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.android.client.utils.connection.AbstractIpConnection; +import com.o3dr.android.client.utils.connection.IpConnectionListener; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.utils.connection.SshConnection; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java index 5f3f114251..4ccf52e246 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java @@ -10,27 +10,27 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_statustext; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.android.client.apis.CapabilityApi; -import org.droidplanner.android.client.utils.TxPowerComplianceCountries; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloAttributes; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; -import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloActions; -import org.droidplanner.services.android.lib.drone.companion.solo.action.SoloConfigActions; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.apis.CapabilityApi; +import com.o3dr.android.client.utils.TxPowerComplianceCountries; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.SoloAttributes; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEventExtras; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEvents; +import com.o3dr.services.android.lib.drone.companion.solo.action.SoloActions; +import com.o3dr.services.android.lib.drone.companion.solo.action.SoloConfigActions; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java index c77894ba66..4017d32a62 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java @@ -8,22 +8,22 @@ import android.util.Pair; import android.util.SparseArray; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEventExtras; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloEvents; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproState; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEventExtras; +import com.o3dr.services.android.lib.drone.companion.solo.SoloEvents; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonTypes; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproState; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproStateV2; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.BuildConfig; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkListener; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java index 27269ad42b..5a22767982 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java index c46c5a46dd..d4c9a7c0c1 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java @@ -6,16 +6,16 @@ import android.util.Pair; import com.github.zafarkhaja.semver.Version; -import org.droidplanner.android.client.utils.TxPowerComplianceCountries; -import org.droidplanner.android.client.utils.connection.IpConnectionListener; -import org.droidplanner.android.client.utils.connection.TcpConnection; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonPacket; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.android.client.utils.TxPowerComplianceCountries; +import com.o3dr.android.client.utils.connection.IpConnectionListener; +import com.o3dr.android.client.utils.connection.TcpConnection; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonPacket; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; @@ -321,7 +321,7 @@ int getControllerMode() { /** * Return the current controller unit * - * @return @see {@link org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} + * @return @see {@link com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit} */ public @SoloControllerUnits.ControllerUnit diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java index bdf15953de..1ad78a13cd 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.drone.autopilot.apm.solo.sololink; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.AbstractLinkManager; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; /** * Created by Fredia Huya-Kouadio on 7/10/15. diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java index d5da0c4814..53bd915e17 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java @@ -9,19 +9,19 @@ import org.droidplanner.services.android.core.drone.autopilot.apm.solo.SoloComp; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.controller.ControllerLinkManager; -import org.droidplanner.android.client.utils.connection.TcpConnection; -import org.droidplanner.android.client.utils.connection.UdpConnection; -import org.droidplanner.services.android.lib.drone.companion.solo.button.ButtonTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloGoproRequestState; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageShotManagerError; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import com.o3dr.android.client.utils.connection.TcpConnection; +import com.o3dr.android.client.utils.connection.UdpConnection; +import com.o3dr.services.android.lib.drone.companion.solo.button.ButtonTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingGetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloGoproRequestState; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageShotManagerError; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageTypes; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.SimpleCommandListener; import org.droidplanner.services.android.utils.connection.SshConnection; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java index c9cd8306e1..4295cd0395 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java @@ -21,33 +21,33 @@ import com.MAVLink.common.msg_vibration; import com.MAVLink.enums.MAV_MODE_FLAG; import com.MAVLink.enums.MAV_STATE; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.action.CapabilityActions; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.action.ExperimentalActions; -import org.droidplanner.services.android.lib.drone.action.StateActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.mission.action.MissionActions; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Attitude; -import org.droidplanner.services.android.lib.drone.property.Battery; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.Parameters; -import org.droidplanner.services.android.lib.drone.property.Signal; -import org.droidplanner.services.android.lib.drone.property.Speed; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.drone.property.Vibration; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.action.CapabilityActions; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.action.ExperimentalActions; +import com.o3dr.services.android.lib.drone.action.StateActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.mission.action.MissionActions; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Attitude; +import com.o3dr.services.android.lib.drone.property.Battery; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameters; +import com.o3dr.services.android.lib.drone.property.Signal; +import com.o3dr.services.android.lib.drone.property.Speed; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.drone.property.Vibration; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.util.MathUtils; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java index 9b9251eb9a..1aa348b63c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java @@ -7,7 +7,7 @@ import com.MAVLink.common.msg_command_ack; import com.MAVLink.common.msg_command_long; import com.MAVLink.common.msg_set_mode; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import java.util.concurrent.ConcurrentHashMap; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java index 9b5ee2247a..ea56e7c642 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java @@ -10,19 +10,19 @@ import com.MAVLink.ardupilotmega.msg_mag_cal_report; import com.MAVLink.common.msg_command_ack; import com.google.android.gms.location.LocationRequest; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.action.GimbalActions; -import org.droidplanner.services.android.lib.drone.action.StateActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.gcs.action.FollowMeActions; -import org.droidplanner.services.android.lib.gcs.follow.FollowType; -import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.action.GimbalActions; +import com.o3dr.services.android.lib.drone.action.StateActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.gcs.action.FollowMeActions; +import com.o3dr.services.android.lib.gcs.follow.FollowType; +import com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.api.DroneApi; import org.droidplanner.services.android.communication.service.MAVLinkClient; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java index 06f3dc981c..414fb7aeff 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java @@ -7,7 +7,7 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_param_value; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.core.MAVLink.MavLinkParameters; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java index 552d56af5e..8e6c2dabe5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java @@ -11,11 +11,11 @@ import com.MAVLink.ardupilotmega.msg_camera_feedback; import com.MAVLink.ardupilotmega.msg_mount_status; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Attitude; -import org.droidplanner.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Attitude; +import com.o3dr.services.android.lib.drone.property.Gps; public class Camera extends DroneVariable { private CameraInfo camera = new CameraInfo(); diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java index e3142c4cd6..6dc640e836 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java @@ -3,13 +3,13 @@ import android.os.Handler; import android.os.RemoteException; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.SimpleCommandListener; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java index 598f2fec26..22f42e9e61 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java @@ -5,7 +5,7 @@ import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import com.MAVLink.common.msg_raw_imu; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameter; public class Magnetometer extends DroneVariable { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java index 5e6d3bfd44..1d9120757b 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java @@ -6,9 +6,9 @@ import com.MAVLink.ardupilotmega.msg_ekf_status_report; import com.MAVLink.enums.EKF_STATUS_FLAGS; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; import org.droidplanner.services.android.core.MAVLink.WaypointManager; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java index cc867f700c..11b40a376a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java @@ -5,8 +5,8 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_statustext; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.SimpleCommandListener; import org.droidplanner.services.android.core.MAVLink.MavLinkCalibration; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java index 49caeb8853..c71e91545a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java @@ -2,16 +2,16 @@ import android.os.Bundle; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEventExtra; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.gcs.returnToMe.ReturnToMeState; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeEventExtra; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.gcs.returnToMe.ReturnToMeState; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; import org.droidplanner.services.android.core.drone.DroneInterfaces; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java index c41ce3f170..e19a46f9a6 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.drone.action.ControlActions; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.drone.action.ControlActions; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.services.android.core.drone.DroneInterfaces.OnDroneListener; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java index 3df2daaed7..abba4c9076 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java @@ -2,7 +2,7 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java index cc0fc4fb58..dff589bb38 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java @@ -2,8 +2,8 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.util.MathUtils; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java index b16bda87ef..c83292cdec 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java @@ -2,8 +2,8 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java index e809543cd5..5c71d0f93f 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java @@ -2,7 +2,7 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java index 76dd5dc1c5..86320669c6 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Gps; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java index f9ff68be57..d79a676e92 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java @@ -2,9 +2,9 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloMessageLocation; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java index a84e3c0d5d..7a504557be 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java @@ -2,7 +2,7 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java index 6fe4be77cb..7f23b8bab5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java @@ -2,10 +2,10 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Gps; import org.droidplanner.services.android.core.drone.manager.MavLinkDroneManager; import org.droidplanner.services.android.core.gcs.location.Location; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java index 8dfe95b6ac..6f59f53e21 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java @@ -13,9 +13,9 @@ import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager; -import org.droidplanner.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.util.googleApi.GoogleApiClientManager; +import com.o3dr.services.android.lib.util.googleApi.GoogleApiClientManager.GoogleApiClientTask; import org.droidplanner.services.android.core.gcs.location.Location.LocationFinder; import org.droidplanner.services.android.core.gcs.location.Location.LocationReceiver; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java index 75f7b52e3c..2d8c3255dd 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.gcs.location; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; public class Location { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java b/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java index 941574beca..7b8a8b8fb3 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java @@ -2,8 +2,8 @@ import android.os.Handler; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java index a6022eb891..c6d19f86e1 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java index 596744dd2a..487b54e967 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.util.MathUtils; import org.droidplanner.services.android.core.helpers.units.Area; import org.droidplanner.services.android.core.polygon.Polygon; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java index 433f08295b..9158204156 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; public class LineLatLong { private final LatLong start; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java index d4c945888b..27fe9d0cf9 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java index de0ec9c312..1c7e94bb6f 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java index 180e0b88f7..249e04983a 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java index 2ea8f9b9a9..4d90a6ea52 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java index 4486d61107..8fb8440764 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java index 7d42f03422..202ebf756f 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools.spline; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java index a7ade0e875..6dc89c5c2d 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.geoTools.spline; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java index a626a6794d..73eb58aa3c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java @@ -6,13 +6,13 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.property.Attitude; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.property.Attitude; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.drone.property.Parameter; import org.droidplanner.services.android.core.drone.DroneInterfaces.DroneEventsType; import org.droidplanner.services.android.core.drone.DroneVariable; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java index fef3558061..74bee68cad 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.mission; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java index 0fe672f604..9a22fdd852 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java @@ -3,7 +3,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemType; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java index a09732f291..b118f7d6d9 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java @@ -3,7 +3,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java index 0df20d2bd2..3588ddafd0 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java @@ -3,7 +3,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java index 2e81e85c46..3742576772 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java index 8d1d1c0ceb..bdf7e55f24 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java index 8d31511d7f..0ec6a2275c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java @@ -8,7 +8,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; public class RegionOfInterestImpl extends SpatialCoordItem { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java index f0bec31b48..1f3e5bbb51 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java index 7d4490a45b..289ab46cb0 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java @@ -2,7 +2,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java index 397f1a8f29..219e5984a8 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java @@ -2,8 +2,8 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; import org.droidplanner.services.android.core.mission.Mission; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java index 444da332f4..17bcc4c9e5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java @@ -8,7 +8,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; public class WaypointImpl extends SpatialCoordItem { diff --git a/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java b/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java index 925b803888..fd5ff4f6a5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.polygon; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.Collections; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java index 59b73c57da..43f356453c 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java @@ -1,8 +1,8 @@ package org.droidplanner.services.android.core.survey; import com.MAVLink.ardupilotmega.msg_camera_feedback; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.util.MathUtils; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.util.MathUtils; import org.droidplanner.services.android.core.helpers.geoTools.GeoTools; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java index e1498ada79..238e0aedcc 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java index 62c0d44a88..453893acd0 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java index d73e66a092..22ee63c62e 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import org.droidplanner.services.android.core.helpers.geoTools.PolylineTools; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java index 7e1b2e45fe..7a3f8e7d37 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java index 1bd29da518..816a15d94e 100644 --- a/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java +++ b/ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.survey.grid; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java b/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java index 18850b9d88..c2d13e4968 100644 --- a/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java +++ b/ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java @@ -13,7 +13,7 @@ import android.widget.ListView; import android.widget.TextView; -import org.droidplanner.services.android.lib.data.ServiceDataContract; +import com.o3dr.services.android.lib.data.ServiceDataContract; import org.droidplanner.services.android.R; import org.droidplanner.services.android.utils.file.FileUtils; diff --git a/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java b/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java index 8f4372514a..924f757369 100644 --- a/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java +++ b/ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java @@ -16,7 +16,7 @@ import org.droidplanner.services.android.R; import org.droidplanner.services.android.api.DroneApi; -import org.droidplanner.services.android.lib.util.SpannableUtils; +import com.o3dr.services.android.lib.util.SpannableUtils; import java.util.ArrayList; import java.util.List; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java b/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java index 29e86b91e5..49bc607c39 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java @@ -1,52 +1,52 @@ package org.droidplanner.services.android.utils; -import org.droidplanner.services.android.lib.drone.attribute.error.ErrorType; +import com.o3dr.services.android.lib.drone.attribute.error.ErrorType; import org.droidplanner.services.android.core.model.AutopilotWarningParser; import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; import java.util.Locale; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ALTITUDE_DISPARITY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_COMPASS_CALIBRATION_RUNNING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_GYRO_CALIBRATION_FAILED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_LEANING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_MODE_NOT_ARMABLE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_ROTOR_NOT_SPINNING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_SAFETY_SWITCH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_BELOW_FAILSAFE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_TOO_HIGH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.AUTO_TUNE_FAILED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.CRASH_DISARMING; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.EKF_VARIANCE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.LOW_BATTERY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_DATAFLASH_INSERTED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.NO_ERROR; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PARACHUTE_TOO_LOW; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACRO_BAL_ROLL_PITCH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_BAROMETER_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_ANGLE_MAX; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_BOARD_VOLTAGE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FENCE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_MAGNETIC_FIELD; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_CALIBRATED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_EKF_HOME_VARIANCE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GPS_GLITCH; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GYROS_NOT_HEALTHY; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_HIGH_GPS_HDOP; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_ACCELEROMETERS; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_COMPASSES; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_GYROS; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INS_NOT_CALIBRATED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_NEED_GPS_LOCK; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_RC_NOT_CALIBRATED; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.RC_FAILSAFE; -import static org.droidplanner.services.android.lib.drone.attribute.error.ErrorType.WAITING_FOR_NAVIGATION_ALIGNMENT; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ALTITUDE_DISPARITY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_COMPASS_CALIBRATION_RUNNING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_GYRO_CALIBRATION_FAILED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_LEANING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_MODE_NOT_ARMABLE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_ROTOR_NOT_SPINNING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_SAFETY_SWITCH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_BELOW_FAILSAFE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.ARM_THROTTLE_TOO_HIGH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.AUTO_TUNE_FAILED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.CRASH_DISARMING; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.EKF_VARIANCE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.LOW_BATTERY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.NO_DATAFLASH_INSERTED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.NO_ERROR; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PARACHUTE_TOO_LOW; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACCELEROMETERS_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_ACRO_BAL_ROLL_PITCH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_BAROMETER_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_ANGLE_MAX; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_BOARD_VOLTAGE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FAILSAFE_THRESHOLD_VALUE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_FENCE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_CHECK_MAGNETIC_FIELD; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_CALIBRATED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_COMPASS_OFFSETS_TOO_HIGH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_DUPLICATE_AUX_SWITCH_OPTIONS; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_EKF_HOME_VARIANCE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GPS_GLITCH; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_GYROS_NOT_HEALTHY; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_HIGH_GPS_HDOP; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_ACCELEROMETERS; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_COMPASSES; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INCONSISTENT_GYROS; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_INS_NOT_CALIBRATED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_NEED_GPS_LOCK; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.PRE_ARM_RC_NOT_CALIBRATED; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.RC_FAILSAFE; +import static com.o3dr.services.android.lib.drone.attribute.error.ErrorType.WAITING_FOR_NAVIGATION_ALIGNMENT; /** * Autopilot error parser. diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java index 2344f70372..b3de4522a0 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java @@ -11,35 +11,35 @@ import com.MAVLink.ardupilotmega.msg_mag_cal_report; import com.MAVLink.enums.MAG_CAL_STATUS; import com.MAVLink.enums.MAV_TYPE; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress; -import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult; -import org.droidplanner.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; -import org.droidplanner.services.android.lib.drone.mission.Mission; -import org.droidplanner.services.android.lib.drone.mission.MissionItemType; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; -import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; -import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; -import org.droidplanner.services.android.lib.drone.property.CameraProxy; -import org.droidplanner.services.android.lib.drone.property.EkfStatus; -import org.droidplanner.services.android.lib.drone.property.FootPrint; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.GuidedState; -import org.droidplanner.services.android.lib.drone.property.Parameter; -import org.droidplanner.services.android.lib.drone.property.Parameters; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.drone.property.Type; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.drone.property.Vibration; -import org.droidplanner.services.android.lib.gcs.follow.FollowState; -import org.droidplanner.services.android.lib.gcs.follow.FollowType; -import org.droidplanner.services.android.lib.mavlink.MavlinkMessageWrapper; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationProgress; +import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationResult; +import com.o3dr.services.android.lib.drone.calibration.magnetometer.MagnetometerCalibrationStatus; +import com.o3dr.services.android.lib.drone.mission.Mission; +import com.o3dr.services.android.lib.drone.mission.MissionItemType; +import com.o3dr.services.android.lib.drone.mission.item.MissionItem; +import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; +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.property.CameraProxy; +import com.o3dr.services.android.lib.drone.property.EkfStatus; +import com.o3dr.services.android.lib.drone.property.FootPrint; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.GuidedState; +import com.o3dr.services.android.lib.drone.property.Parameter; +import com.o3dr.services.android.lib.drone.property.Parameters; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.drone.property.Type; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.drone.property.Vibration; +import com.o3dr.services.android.lib.gcs.follow.FollowState; +import com.o3dr.services.android.lib.gcs.follow.FollowType; +import com.o3dr.services.android.lib.mavlink.MavlinkMessageWrapper; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; import org.droidplanner.services.android.core.MAVLink.command.doCmd.MavLinkDoCmds; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java index c8768962ba..d69eb63456 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java @@ -2,29 +2,29 @@ import android.util.Log; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.mission.item.MissionItem; -import org.droidplanner.services.android.lib.drone.mission.item.command.CameraTrigger; -import org.droidplanner.services.android.lib.drone.mission.item.command.ChangeSpeed; -import org.droidplanner.services.android.lib.drone.mission.item.command.DoJump; -import org.droidplanner.services.android.lib.drone.mission.item.command.EpmGripper; -import org.droidplanner.services.android.lib.drone.mission.item.command.ResetROI; -import org.droidplanner.services.android.lib.drone.mission.item.command.ReturnToLaunch; -import org.droidplanner.services.android.lib.drone.mission.item.command.SetRelay; -import org.droidplanner.services.android.lib.drone.mission.item.command.SetServo; -import org.droidplanner.services.android.lib.drone.mission.item.command.Takeoff; -import org.droidplanner.services.android.lib.drone.mission.item.command.YawCondition; -import org.droidplanner.services.android.lib.drone.mission.item.complex.CameraDetail; -import org.droidplanner.services.android.lib.drone.mission.item.complex.StructureScanner; -import org.droidplanner.services.android.lib.drone.mission.item.complex.Survey; -import org.droidplanner.services.android.lib.drone.mission.item.complex.SplineSurvey; -import org.droidplanner.services.android.lib.drone.mission.item.complex.SurveyDetail; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Circle; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.DoLandStart; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Land; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.RegionOfInterest; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.SplineWaypoint; -import org.droidplanner.services.android.lib.drone.mission.item.spatial.Waypoint; +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.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.CameraDetail; +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.complex.SplineSurvey; +import com.o3dr.services.android.lib.drone.mission.item.complex.SurveyDetail; +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 org.droidplanner.services.android.core.mission.Mission; import org.droidplanner.services.android.core.mission.MissionItemImpl; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java index 471a5a6bf0..cb057b248d 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java @@ -3,13 +3,13 @@ import android.os.RemoteException; import android.util.Pair; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerMode; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloState; -import org.droidplanner.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; -import org.droidplanner.services.android.lib.drone.companion.solo.tlv.TLVPacket; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode; +import com.o3dr.services.android.lib.drone.companion.solo.SoloState; +import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSettingSetter; +import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.core.drone.autopilot.Drone; import org.droidplanner.services.android.core.drone.autopilot.apm.solo.ArduSolo; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java b/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java index 6c49179a4a..93e761a069 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java @@ -14,7 +14,7 @@ import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.Logger; import com.google.android.gms.analytics.Tracker; -import org.droidplanner.services.android.lib.drone.connection.DroneSharePrefs; +import com.o3dr.services.android.lib.drone.connection.DroneSharePrefs; /** * Components related to google analytics logic. diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java b/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java index ec91e0ce01..c1488398a5 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java @@ -21,7 +21,7 @@ import android.text.TextUtils; import android.widget.Toast; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.utils.NetworkUtils; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java b/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java index 57f64014c1..08de14fe4e 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java @@ -11,8 +11,8 @@ import com.googlecode.mp4parser.authoring.Movie; import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; import com.googlecode.mp4parser.authoring.tracks.h264.H264TrackImpl; -import org.droidplanner.android.client.utils.video.MediaCodecManager; -import org.droidplanner.android.client.utils.video.NaluChunk; +import com.o3dr.android.client.utils.video.MediaCodecManager; +import com.o3dr.android.client.utils.video.NaluChunk; import java.io.BufferedOutputStream; import java.io.File; diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java b/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java index 1129ae9bf7..7856e71329 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java @@ -8,14 +8,14 @@ import android.util.Log; import android.view.Surface; -import org.droidplanner.android.client.utils.connection.AbstractIpConnection; -import org.droidplanner.android.client.utils.connection.IpConnectionListener; -import org.droidplanner.android.client.utils.connection.UdpConnection; -import org.droidplanner.android.client.utils.video.DecoderListener; -import org.droidplanner.android.client.utils.video.MediaCodecManager; -import org.droidplanner.services.android.lib.drone.action.CameraActions; -import org.droidplanner.services.android.lib.drone.attribute.error.CommandExecutionError; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.android.client.utils.connection.AbstractIpConnection; +import com.o3dr.android.client.utils.connection.IpConnectionListener; +import com.o3dr.android.client.utils.connection.UdpConnection; +import com.o3dr.android.client.utils.video.DecoderListener; +import com.o3dr.android.client.utils.video.MediaCodecManager; +import com.o3dr.services.android.lib.drone.action.CameraActions; +import com.o3dr.services.android.lib.drone.attribute.error.CommandExecutionError; +import com.o3dr.services.android.lib.model.ICommandListener; import java.io.IOException; import java.nio.ByteBuffer; diff --git a/ServiceApp/test/java/org/droidplanner/android/client/apis/ControlApiTest.java b/ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java similarity index 88% rename from ServiceApp/test/java/org/droidplanner/android/client/apis/ControlApiTest.java rename to ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java index 16a2819975..c2cb9ada0f 100644 --- a/ServiceApp/test/java/org/droidplanner/android/client/apis/ControlApiTest.java +++ b/ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java @@ -1,11 +1,11 @@ -package org.droidplanner.android.client.apis; +package com.o3dr.android.client.apis; import android.content.Context; import android.os.Bundle; import android.util.SparseArray; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.action.Action; import org.droidplanner.services.android.mock.MockDrone; import org.junit.Assert; @@ -15,10 +15,10 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.ACTION_SET_VELOCITY; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_X; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Y; -import static org.droidplanner.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Z; +import static com.o3dr.services.android.lib.drone.action.ControlActions.ACTION_SET_VELOCITY; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_X; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Y; +import static com.o3dr.services.android.lib.drone.action.ControlActions.EXTRA_VELOCITY_Z; /** * Created by Fredia Huya-Kouadio on 10/23/15. diff --git a/ServiceApp/test/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java b/ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java similarity index 99% rename from ServiceApp/test/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java rename to ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java index 91475c3ccf..9481db292c 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java +++ b/ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.lib.drone.companion.solo.tlv; +package com.o3dr.services.android.lib.drone.companion.solo.tlv; import com.MAVLink.enums.GOPRO_COMMAND; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/lib/util/MathUtilsTest.java b/ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java similarity index 96% rename from ServiceApp/test/java/org/droidplanner/services/android/lib/util/MathUtilsTest.java rename to ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java index f7d1601e7b..162db05696 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/lib/util/MathUtilsTest.java +++ b/ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java @@ -1,7 +1,7 @@ -package org.droidplanner.services.android.lib.util; +package com.o3dr.services.android.lib.util; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java b/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java index 856f1f2cfb..cc6a50e20a 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java @@ -8,8 +8,8 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_command_long; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.gcs.link.LinkConnectionStatus; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java index 4a2e3498e5..392967e3ab 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java index 6bcdd02841..d8c25059ac 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java index 6891ffc64a..5cde695c93 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java @@ -1,6 +1,6 @@ package org.droidplanner.services.android.core.helpers.coordinates; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java index 8407fb5344..41cd080e82 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.helpers.geoTools; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java index 6984be96e4..dc2c54593e 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java @@ -2,7 +2,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_FRAME; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java index d54a00e0e6..12c3e955be 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java @@ -2,7 +2,7 @@ import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java b/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java index e245e6e1d6..a5621dbb3a 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java @@ -1,7 +1,7 @@ package org.droidplanner.services.android.core.survey; import com.MAVLink.ardupilotmega.msg_camera_feedback; -import org.droidplanner.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLong; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java index 7d83771780..496a2b559c 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java @@ -3,9 +3,9 @@ import android.content.Context; import android.os.Parcelable; -import org.droidplanner.android.client.Drone; -import org.droidplanner.services.android.lib.drone.property.DroneAttribute; -import org.droidplanner.services.android.lib.model.action.Action; +import com.o3dr.android.client.Drone; +import com.o3dr.services.android.lib.drone.property.DroneAttribute; +import com.o3dr.services.android.lib.model.action.Action; import java.util.HashMap; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java index 351acdde12..8373e3182b 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java +++ b/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java @@ -4,8 +4,8 @@ import com.MAVLink.MAVLinkPacket; import com.MAVLink.Messages.MAVLinkMessage; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.model.ICommandListener; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.model.ICommandListener; import org.droidplanner.services.android.communication.model.DataLink; import org.droidplanner.services.android.communication.service.MAVLinkClient; diff --git a/doc/resources.rst b/doc/resources.rst index b3fb99f195..dae1a5d206 100644 --- a/doc/resources.rst +++ b/doc/resources.rst @@ -38,7 +38,7 @@ Tower (Droidplanner 3) The most used Android ground control station for drones. -`Source `_ | `Play Store `_ +`Source `_ | `Play Store `_ Tower Pebble ---------- diff --git a/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/MainActivity.java b/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/MainActivity.java index 95f8241405..e7591b10e5 100644 --- a/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/MainActivity.java +++ b/samples/StarterApp/src/main/java/org/droidplanner/sample/hellodrone/MainActivity.java @@ -17,39 +17,39 @@ import android.widget.TextView; import android.widget.Toast; -import org.droidplanner.android.client.ControlTower; -import org.droidplanner.android.client.Drone; -import org.droidplanner.android.client.apis.ControlApi; -import org.droidplanner.android.client.apis.ExperimentalApi; -import org.droidplanner.android.client.apis.solo.SoloCameraApi; -import org.droidplanner.android.client.apis.VehicleApi; -import org.droidplanner.android.client.interfaces.DroneListener; -import org.droidplanner.android.client.interfaces.TowerListener; -import org.droidplanner.android.client.utils.video.DecoderListener; -import org.droidplanner.android.client.utils.video.MediaCodecManager; -import org.droidplanner.services.android.lib.coordinate.LatLong; -import org.droidplanner.services.android.lib.coordinate.LatLongAlt; -import org.droidplanner.services.android.lib.drone.attribute.AttributeEvent; -import org.droidplanner.services.android.lib.drone.attribute.AttributeType; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloAttributes; -import org.droidplanner.services.android.lib.drone.companion.solo.SoloState; -import org.droidplanner.services.android.lib.drone.connection.ConnectionParameter; -import org.droidplanner.services.android.lib.drone.connection.ConnectionResult; -import org.droidplanner.services.android.lib.drone.connection.ConnectionType; -import org.droidplanner.services.android.lib.drone.property.Altitude; -import org.droidplanner.services.android.lib.drone.property.Gps; -import org.droidplanner.services.android.lib.drone.property.Home; -import org.droidplanner.services.android.lib.drone.property.Speed; -import org.droidplanner.services.android.lib.drone.property.State; -import org.droidplanner.services.android.lib.drone.property.Type; -import org.droidplanner.services.android.lib.drone.property.VehicleMode; -import org.droidplanner.services.android.lib.model.AbstractCommandListener; -import org.droidplanner.services.android.lib.model.SimpleCommandListener; +import com.o3dr.android.client.ControlTower; +import com.o3dr.android.client.Drone; +import com.o3dr.android.client.apis.ControlApi; +import com.o3dr.android.client.apis.ExperimentalApi; +import com.o3dr.android.client.apis.solo.SoloCameraApi; +import com.o3dr.android.client.apis.VehicleApi; +import com.o3dr.android.client.interfaces.DroneListener; +import com.o3dr.android.client.interfaces.TowerListener; +import com.o3dr.android.client.utils.video.DecoderListener; +import com.o3dr.android.client.utils.video.MediaCodecManager; +import com.o3dr.services.android.lib.coordinate.LatLong; +import com.o3dr.services.android.lib.coordinate.LatLongAlt; +import com.o3dr.services.android.lib.drone.attribute.AttributeEvent; +import com.o3dr.services.android.lib.drone.attribute.AttributeType; +import com.o3dr.services.android.lib.drone.companion.solo.SoloAttributes; +import com.o3dr.services.android.lib.drone.companion.solo.SoloState; +import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; +import com.o3dr.services.android.lib.drone.connection.ConnectionResult; +import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.drone.property.Altitude; +import com.o3dr.services.android.lib.drone.property.Gps; +import com.o3dr.services.android.lib.drone.property.Home; +import com.o3dr.services.android.lib.drone.property.Speed; +import com.o3dr.services.android.lib.drone.property.State; +import com.o3dr.services.android.lib.drone.property.Type; +import com.o3dr.services.android.lib.drone.property.VehicleMode; +import com.o3dr.services.android.lib.model.AbstractCommandListener; +import com.o3dr.services.android.lib.model.SimpleCommandListener; import java.io.IOException; import java.util.List; -import static org.droidplanner.android.client.apis.ExperimentalApi.*; +import static com.o3dr.android.client.apis.ExperimentalApi.*; public class MainActivity extends AppCompatActivity implements DroneListener, TowerListener { private static final String TAG = MainActivity.class.getSimpleName(); From 1f5141d5e01123b24a4d4c47326e92e22dbf62d9 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Wed, 18 May 2016 01:49:55 -0700 Subject: [PATCH 012/113] Fix package name --- .../src/main/java/com/o3dr/services/android/lib/util/Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java index 6af347cc5a..cb12e0e519 100644 --- a/ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java +++ b/ClientLib/src/main/java/com/o3dr/services/android/lib/util/Utils.java @@ -5,5 +5,5 @@ */ public class Utils { - public static final String PACKAGE_NAME = "org.droidplanner.services.android"; + public static final String PACKAGE_NAME = "com.o3dr.services.android"; } From 568d367b508e987a15893fd9041dbe546efb2c3e Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Wed, 18 May 2016 09:35:38 -0700 Subject: [PATCH 013/113] Clean Tower-lib project --- {ServiceApp => ClientLib}/art/ic_launcher.svg | 0 .../art/ic_stat_notify.svg | 0 ClientLib/build.gradle | 17 + .../android/client/apis/ControlApiTest.java | 7 +- .../solo/tlv/TLVMessageParserTest.java | 0 .../android/lib/util/MathUtilsTest.java | 0 .../services/android/impl}/BasicTest.java | 21 +- .../drone/autopilot/apm/ArduPilotTest.java | 2 +- .../core/helpers/coordinates/Coord2DTest.java | 2 +- .../core/helpers/coordinates/Coord3DTest.java | 2 +- .../helpers/coordinates/CoordBoundsTest.java | 2 +- .../core/helpers/geoTools/GeoToolsTest.java | 5 +- .../impl}/core/helpers/units/AreaTest.java | 2 +- .../ChangeCameraTriggerImplTest.java | 6 +- .../waypoints/ChangeSpeedImplTest.java | 6 +- .../waypoints/ConditionYawImplTest.java | 6 +- .../core/mission/waypoints/LandImplTest.java | 4 +- .../waypoints/SpatialCoordItemTest.java | 4 +- .../mission/waypoints/TakeoffImplTest.java | 6 +- .../mission/waypoints/WaypointImplTest.java | 4 +- .../impl}/core/survey/FootprintTest.java | 2 +- .../android/impl}/mock/MockDrone.java | 2 +- .../android/impl}/mock/MockMAVLinkClient.java | 7 +- .../assets/CameraInfo/Canon A2300 A2400.xml | 0 .../CameraInfo/Canon ELPH 110 320 HS.xml | 0 .../CameraInfo/Canon ELPH 115 130 IS.xml | 0 .../assets/CameraInfo/Canon ELPH 330 HS.xml | 0 .../assets/CameraInfo/Canon ELPH 520 HS.xml | 0 .../main}/assets/CameraInfo/Canon S100.xml | 0 .../assets/CameraInfo/Canon S110 S120.xml | 0 .../main}/assets/CameraInfo/Canon SX260.xml | 0 .../assets/CameraInfo/GoPro Hero 3+ Black.xml | 0 .../GoPro Hero 3+ Silver (Medium).xml | 0 .../GoPro Hero 3+ Silver (Wide).xml | 0 .../assets/CameraInfo/GoPro Hero 3+ White.xml | 0 .../assets/CameraInfo/GoPro Hero 4 Black.xml | 0 .../assets/CameraInfo/GoPro_Hero_3_Silver.xml | 0 .../main}/assets/CameraInfo/Mobius_A_Lens.xml | 0 .../main}/assets/CameraInfo/Mobius_B_Lens.xml | 0 .../assets/CameraInfo/Sentek GEMS V0.xml | 0 .../assets/CameraInfo/Sentek GEMS V1.xml | 0 .../assets/CameraInfo/Sentek GEMS V2.xml | 0 .../assets/CameraInfo/Sony NEX5 16mm.xml | 0 .../assets/CameraInfo/Sony NEX5 20mm.xml | 0 .../assets/CameraInfo/Sony NEX5 25mm.xml | 0 .../main}/assets/CameraInfo/Sony QX1 16mm.xml | 0 .../main}/assets/CameraInfo/Sony QX1 20mm.xml | 0 .../assets/CameraInfo/Sony RX100 M3 24mm.xml | 0 .../assets/CameraInfo/Sony RX100 M3 70mm.xml | 0 .../assets/CameraInfo/Sony RX100_M3 50mm.xml | 0 .../assets/Parameters/ParameterMetaData.xml | 0 .../assets/VehicleProfiles/ArduCopter.xml | 0 .../assets/VehicleProfiles/ArduPlane.xml | 0 .../assets/VehicleProfiles/ArduRover.xml | 0 .../main}/assets/VehicleProfiles/ArduSolo.xml | 0 ServiceApp/.gitignore | 61 - ServiceApp/AndroidManifest.xml | 132 --- ServiceApp/LICENSE.md | 596 ---------- ServiceApp/README.md | 8 - .../assets/AppStore/recommendedApps.json | 28 - ServiceApp/build.gradle | 242 ---- ServiceApp/lint.xml | 9 - ServiceApp/proguard.cfg | 71 -- .../drawable-hdpi/ic_android_black_24dp.png | Bin 441 -> 0 bytes ServiceApp/res/drawable-hdpi/ic_launcher.png | Bin 5238 -> 0 bytes .../drawable-hdpi/ic_person_black_24dp.png | Bin 369 -> 0 bytes .../drawable-hdpi/ic_settings_black_24dp.png | Bin 561 -> 0 bytes .../ic_settings_ethernet_black_24dp.png | Bin 454 -> 0 bytes .../res/drawable-hdpi/ic_stat_notify.png | Bin 4228 -> 0 bytes .../vpi__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_selected_holo.9.png | Bin 148 -> 0 bytes .../vpi__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_unselected_focused_holo.9.png | Bin 146 -> 0 bytes .../vpi__tab_unselected_holo.9.png | Bin 153 -> 0 bytes .../vpi__tab_unselected_pressed_holo.9.png | Bin 145 -> 0 bytes .../drawable-mdpi/ic_android_black_24dp.png | Bin 304 -> 0 bytes ServiceApp/res/drawable-mdpi/ic_launcher.png | Bin 4280 -> 0 bytes .../drawable-mdpi/ic_person_black_24dp.png | Bin 278 -> 0 bytes .../drawable-mdpi/ic_settings_black_24dp.png | Bin 416 -> 0 bytes .../ic_settings_ethernet_black_24dp.png | Bin 356 -> 0 bytes .../res/drawable-mdpi/ic_stat_notify.png | Bin 3198 -> 0 bytes .../vpi__tab_selected_focused_holo.9.png | Bin 148 -> 0 bytes .../vpi__tab_selected_holo.9.png | Bin 151 -> 0 bytes .../vpi__tab_selected_pressed_holo.9.png | Bin 150 -> 0 bytes .../vpi__tab_unselected_focused_holo.9.png | Bin 150 -> 0 bytes .../vpi__tab_unselected_holo.9.png | Bin 157 -> 0 bytes .../vpi__tab_unselected_pressed_holo.9.png | Bin 155 -> 0 bytes .../drawable-xhdpi/ic_android_black_24dp.png | Bin 489 -> 0 bytes ServiceApp/res/drawable-xhdpi/ic_launcher.png | Bin 6261 -> 0 bytes .../drawable-xhdpi/ic_person_black_24dp.png | Bin 409 -> 0 bytes .../drawable-xhdpi/ic_settings_black_24dp.png | Bin 691 -> 0 bytes .../ic_settings_ethernet_black_24dp.png | Bin 547 -> 0 bytes .../res/drawable-xhdpi/ic_stat_notify.png | Bin 3731 -> 0 bytes .../vpi__tab_selected_focused_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_selected_holo.9.png | Bin 153 -> 0 bytes .../vpi__tab_selected_pressed_holo.9.png | Bin 147 -> 0 bytes .../vpi__tab_unselected_focused_holo.9.png | Bin 148 -> 0 bytes .../vpi__tab_unselected_holo.9.png | Bin 166 -> 0 bytes .../vpi__tab_unselected_pressed_holo.9.png | Bin 149 -> 0 bytes .../drawable-xxhdpi/ic_android_black_24dp.png | Bin 693 -> 0 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 8144 -> 0 bytes .../drawable-xxhdpi/ic_person_black_24dp.png | Bin 548 -> 0 bytes .../ic_settings_black_24dp.png | Bin 969 -> 0 bytes .../ic_settings_ethernet_black_24dp.png | Bin 784 -> 0 bytes .../res/drawable-xxhdpi/ic_stat_notify.png | Bin 4222 -> 0 bytes .../ic_android_black_24dp.png | Bin 834 -> 0 bytes .../res/drawable-xxxhdpi/ic_launcher.png | Bin 10573 -> 0 bytes .../drawable-xxxhdpi/ic_person_black_24dp.png | Bin 712 -> 0 bytes .../ic_settings_black_24dp.png | Bin 1257 -> 0 bytes .../ic_settings_ethernet_black_24dp.png | Bin 1042 -> 0 bytes .../res/drawable-xxxhdpi/ic_stat_notify.png | Bin 4768 -> 0 bytes .../res/drawable/action_button_install_bg.xml | 5 - .../res/drawable/action_button_open_bg.xml | 5 - ServiceApp/res/drawable/vpi__dark_theme.xml | 10 - ServiceApp/res/drawable/vpi__light_theme.xml | 26 - .../res/drawable/vpi__tab_indicator.xml | 34 - ServiceApp/res/layout/activity_main.xml | 32 - .../layout/activity_tlog_file_selector.xml | 33 - .../layout/activity_usb_intent_receiver.xml | 8 - ServiceApp/res/layout/divider_view.xml | 8 - .../res/layout/fragment_app_connections.xml | 22 - .../res/layout/fragment_connections.xml | 18 - .../res/layout/fragment_recommended_apps.xml | 8 - .../res/layout/item_recommended_app_info.xml | 91 -- .../res/layout/list_item_drone_info.xml | 70 -- ServiceApp/res/layout/list_item_tlog_info.xml | 11 - ServiceApp/res/menu/activity_main.xml | 8 - ServiceApp/res/raw/beep_beep.wav | Bin 141902 -> 0 bytes ServiceApp/res/values-de/strings.xml | 25 - ServiceApp/res/values-it/strings.xml | 14 - ServiceApp/res/values-sw600dp/dimens.xml | 4 - ServiceApp/res/values-w720dp/dimens.xml | 5 - ServiceApp/res/values-zh-rCN/strings.xml | 20 - ServiceApp/res/values-zh-rTW/strings.xml | 20 - ServiceApp/res/values/arrays.xml | 203 ---- ServiceApp/res/values/attrs.xml | 7 - ServiceApp/res/values/colors.xml | 16 - ServiceApp/res/values/dimens.xml | 10 - ServiceApp/res/values/strings.xml | 36 - ServiceApp/res/values/styles.xml | 46 - ServiceApp/res/values/themes.xml | 19 - .../res/xml-zh-rCN/checklist_default.xml | 91 -- ServiceApp/res/xml-zh-rCN/checklist_full.xml | 123 -- ServiceApp/res/xml/device_filter.xml | 18 - ServiceApp/res/xml/filepaths.xml | 4 - .../res/xml/google_analytics_tracker.xml | 45 - ServiceApp/res/xml/preferences.xml | 63 - .../android/DroidPlannerServicesApp.java | 61 - .../services/android/api/DPServices.java | 84 -- .../android/api/DroidPlannerService.java | 292 ----- .../services/android/api/DroneAccess.java | 22 - .../services/android/api/DroneApi.java | 759 ------------- .../connection/AndroidIpConnection.java | 45 - .../connection/AndroidMavLinkConnection.java | 21 - .../connection/AndroidTcpConnection.java | 87 -- .../connection/AndroidUdpConnection.java | 162 --- .../connection/BluetoothConnection.java | 154 --- .../connection/SoloConnection.java | 207 ---- .../connection/usb/UsbCDCConnection.java | 218 ---- .../connection/usb/UsbConnection.java | 158 --- .../connection/usb/UsbFTDIConnection.java | 132 --- .../android/communication/model/DataLink.java | 26 - .../communication/service/MAVLinkClient.java | 315 ----- .../core/MAVLink/MavLinkCalibration.java | 112 -- .../android/core/MAVLink/MavLinkCommands.java | 231 ---- .../core/MAVLink/MavLinkMsgHandler.java | 80 -- .../core/MAVLink/MavLinkParameters.java | 48 - .../android/core/MAVLink/MavLinkRC.java | 22 - .../core/MAVLink/MavLinkStreamRates.java | 41 - .../android/core/MAVLink/MavLinkWaypoint.java | 54 - .../android/core/MAVLink/WaypointManager.java | 340 ------ .../MAVLink/command/doCmd/MavLinkDoCmds.java | 160 --- .../MAVLink/connection/MavLinkConnection.java | 506 --------- .../connection/MavLinkConnectionListener.java | 24 - .../connection/MavLinkConnectionTypes.java | 50 - .../MAVLink/connection/TcpConnection.java | 72 -- .../MAVLink/connection/UdpConnection.java | 107 -- .../android/core/drone/DroneEvents.java | 73 -- .../android/core/drone/DroneInterfaces.java | 225 ---- .../android/core/drone/DroneManager.java | 350 ------ .../android/core/drone/DroneVariable.java | 79 -- .../core/drone/LogMessageListener.java | 9 - .../android/core/drone/Preferences.java | 12 - .../android/core/drone/autopilot/Drone.java | 36 - .../core/drone/autopilot/MavLinkDrone.java | 62 - .../drone/autopilot/apm/APMConstants.java | 27 - .../core/drone/autopilot/apm/ArduCopter.java | 162 --- .../core/drone/autopilot/apm/ArduPilot.java | 603 ---------- .../core/drone/autopilot/apm/ArduPlane.java | 65 -- .../core/drone/autopilot/apm/ArduRover.java | 35 - .../apm/solo/AbstractLinkManager.java | 207 ---- .../drone/autopilot/apm/solo/ArduSolo.java | 425 ------- .../drone/autopilot/apm/solo/SoloComp.java | 437 ------- .../controller/ControllerLinkListener.java | 25 - .../controller/ControllerLinkManager.java | 643 ----------- .../apm/solo/sololink/SoloLinkListener.java | 15 - .../apm/solo/sololink/SoloLinkManager.java | 381 ------- .../autopilot/apm/variables/APMHeartBeat.java | 51 - .../generic/GenericMavLinkDrone.java | 885 --------------- .../core/drone/autopilot/px4/Px4Native.java | 28 - .../drone/manager/DroneCommandTracker.java | 175 --- .../drone/manager/MavLinkDroneManager.java | 362 ------ .../core/drone/profiles/ParameterManager.java | 268 ----- .../drone/profiles/ParameterMetadata.java | 68 -- .../core/drone/profiles/VehicleProfile.java | 43 - .../core/drone/variables/ApmModes.java | 131 --- .../android/core/drone/variables/Camera.java | 65 -- .../core/drone/variables/GuidedPoint.java | 373 ------ .../core/drone/variables/HeartBeat.java | 141 --- .../core/drone/variables/Magnetometer.java | 53 - .../core/drone/variables/MissionStats.java | 46 - .../android/core/drone/variables/RC.java | 42 - .../android/core/drone/variables/State.java | 228 ---- .../core/drone/variables/StreamRates.java | 69 -- .../android/core/drone/variables/Type.java | 75 -- .../calibration/AccelCalibration.java | 153 --- .../MagnetometerCalibrationImpl.java | 126 -- .../android/core/firmware/FirmwareType.java | 48 - .../android/core/gcs/GCSHeartbeat.java | 73 -- .../services/android/core/gcs/ReturnToMe.java | 211 ---- .../android/core/gcs/follow/Follow.java | 165 --- .../android/core/gcs/follow/FollowAbove.java | 31 - .../core/gcs/follow/FollowAlgorithm.java | 128 --- .../android/core/gcs/follow/FollowCircle.java | 36 - .../core/gcs/follow/FollowGuidedScan.java | 100 -- .../core/gcs/follow/FollowHeadingAngle.java | 33 - .../android/core/gcs/follow/FollowLead.java | 18 - .../android/core/gcs/follow/FollowLeash.java | 42 - .../android/core/gcs/follow/FollowLeft.java | 18 - .../core/gcs/follow/FollowLookAtMe.java | 24 - .../android/core/gcs/follow/FollowRight.java | 18 - .../core/gcs/follow/FollowSoloShot.java | 102 -- .../core/gcs/follow/FollowSplineAbove.java | 40 - .../core/gcs/follow/FollowSplineLeash.java | 51 - .../gcs/follow/FollowWithRadiusAlgorithm.java | 42 - .../core/gcs/location/FusedLocation.java | 226 ---- .../android/core/gcs/location/Location.java | 62 - .../android/core/gcs/package-info.java | 4 - .../android/core/gcs/roi/ROIEstimator.java | 106 -- .../core/helpers/coordinates/CoordBounds.java | 55 - .../core/helpers/geoTools/GeoTools.java | 221 ---- .../core/helpers/geoTools/LineLatLong.java | 59 - .../core/helpers/geoTools/LineSampler.java | 58 - .../core/helpers/geoTools/LineTools.java | 80 -- .../core/helpers/geoTools/PointTools.java | 123 -- .../core/helpers/geoTools/PolylineTools.java | 28 - .../core/helpers/geoTools/Simplify.java | 47 - .../core/helpers/geoTools/spline/Spline.java | 47 - .../helpers/geoTools/spline/SplinePath.java | 55 - .../android/core/helpers/units/Area.java | 35 - .../android/core/mission/Mission.java | 434 ------- .../android/core/mission/MissionItemImpl.java | 54 - .../android/core/mission/MissionItemType.java | 98 -- .../mission/commands/CameraTriggerImpl.java | 55 - .../mission/commands/ChangeSpeedImpl.java | 64 -- .../mission/commands/ConditionYawImpl.java | 82 -- .../core/mission/commands/DoJumpImpl.java | 74 -- .../core/mission/commands/EpmGripperImpl.java | 61 - .../core/mission/commands/MissionCMD.java | 25 - .../mission/commands/ReturnToHomeImpl.java | 60 - .../core/mission/commands/SetRelayImpl.java | 64 -- .../core/mission/commands/SetServoImpl.java | 71 -- .../core/mission/commands/TakeoffImpl.java | 79 -- .../core/mission/survey/SplineSurveyImpl.java | 40 - .../core/mission/survey/SurveyImpl.java | 129 --- .../core/mission/waypoints/CircleImpl.java | 81 -- .../mission/waypoints/DoLandStartImpl.java | 53 - .../core/mission/waypoints/LandImpl.java | 53 - .../waypoints/RegionOfInterestImpl.java | 53 - .../mission/waypoints/SpatialCoordItem.java | 61 - .../mission/waypoints/SplineWaypointImpl.java | 64 -- .../waypoints/StructureScannerImpl.java | 166 --- .../core/mission/waypoints/WaypointImpl.java | 101 -- .../core/model/AutopilotWarningParser.java | 13 - .../services/android/core/model/Logger.java | 25 - .../android/core/polygon/Polygon.java | 77 -- .../services/android/core/srtm/Srtm.java | 48 - .../services/android/core/srtm/SrtmData.java | 89 -- .../android/core/srtm/SrtmDownloader.java | 97 -- .../android/core/srtm/SrtmRegions.java | 76 -- .../services/android/core/srtm/UnZip.java | 32 - .../android/core/survey/CameraInfo.java | 37 - .../android/core/survey/Footprint.java | 74 -- .../android/core/survey/SurveyData.java | 96 -- .../core/survey/grid/CircumscribedGrid.java | 61 - .../core/survey/grid/EndpointSorter.java | 71 -- .../android/core/survey/grid/Grid.java | 34 - .../android/core/survey/grid/GridBuilder.java | 54 - .../android/core/survey/grid/Trimmer.java | 50 - .../android/data/SessionContract.java | 49 - .../services/android/data/SessionDB.java | 72 -- .../android/data/provider/FileProvider.java | 757 ------------ .../data/provider/ServiceDataProvider.java | 47 - .../exception/ConnectionException.java | 10 - .../android/ui/activity/MainActivity.java | 108 -- .../android/ui/activity/TLogFileSelector.java | 121 -- .../ui/activity/UsbIntentReceiver.java | 31 - .../ui/adapter/AppConnectionAdapter.java | 123 -- .../ui/adapter/RecommendedAppsAdapter.java | 246 ---- .../ui/fragment/AppConnectionsFragment.java | 130 --- .../ui/fragment/RecommendedAppsFragment.java | 83 -- .../ui/fragment/ViewCategoryFragment.java | 92 -- .../android/ui/widget/PageIndicator.java | 67 -- .../android/ui/widget/TabPageIndicator.java | 278 ----- .../android/utils/AndroidApWarningParser.java | 210 ---- .../services/android/utils/AndroidLogger.java | 84 -- .../android/utils/CommonApiUtils.java | 1011 ----------------- .../services/android/utils/LogToFileTree.java | 140 --- .../services/android/utils/NetworkUtils.java | 50 - .../services/android/utils/ProxyUtils.java | 558 --------- .../services/android/utils/SoloApiUtils.java | 118 -- .../services/android/utils/TextUtils.java | 98 -- .../services/android/utils/Utils.java | 11 - .../android/utils/analytics/GAUtils.java | 133 --- .../utils/apps/AppsUpdateReceiver.java | 20 - .../utils/connection/SshConnection.java | 370 ------ .../connection/WifiConnectionHandler.java | 495 -------- .../android/utils/file/AssetUtil.java | 17 - .../android/utils/file/DirectoryPath.java | 68 -- .../android/utils/file/FileUtils.java | 80 -- .../utils/file/IO/CameraInfoLoader.java | 92 -- .../utils/file/IO/CameraInfoReader.java | 117 -- .../utils/file/IO/ExceptionWriter.java | 28 - .../file/IO/ParameterMetadataLoader.java | 113 -- .../utils/file/IO/VehicleProfileReader.java | 142 --- .../utils/prefs/DroidPlannerPrefs.java | 50 - .../android/utils/video/StreamRecorder.java | 220 ---- .../android/utils/video/VideoManager.java | 514 --------- .../utils/video/file/DecodeH264FromFile.java | 13 - .../droidplanner/services/package-info.java | 5 - settings.gradle | 1 - 331 files changed, 65 insertions(+), 26504 deletions(-) rename {ServiceApp => ClientLib}/art/ic_launcher.svg (100%) rename {ServiceApp => ClientLib}/art/ic_stat_notify.svg (100%) rename {ServiceApp/test => ClientLib/src/androidTest}/java/com/o3dr/android/client/apis/ControlApiTest.java (96%) rename {ServiceApp/test => ClientLib/src/androidTest}/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java (100%) rename {ServiceApp/test => ClientLib/src/androidTest}/java/com/o3dr/services/android/lib/util/MathUtilsTest.java (100%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/BasicTest.java (80%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/drone/autopilot/apm/ArduPilotTest.java (96%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/helpers/coordinates/Coord2DTest.java (81%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/helpers/coordinates/Coord3DTest.java (94%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/helpers/coordinates/CoordBoundsTest.java (94%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/helpers/geoTools/GeoToolsTest.java (93%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/helpers/units/AreaTest.java (92%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/mission/waypoints/ChangeCameraTriggerImplTest.java (74%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/mission/waypoints/ChangeSpeedImplTest.java (79%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/mission/waypoints/ConditionYawImplTest.java (76%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/mission/waypoints/LandImplTest.java (83%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/mission/waypoints/SpatialCoordItemTest.java (83%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/mission/waypoints/TakeoffImplTest.java (77%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/mission/waypoints/WaypointImplTest.java (85%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/core/survey/FootprintTest.java (97%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/mock/MockDrone.java (95%) rename {ServiceApp/test/java/org/droidplanner/services/android => ClientLib/src/androidTest/java/org/droidplanner/services/android/impl}/mock/MockMAVLinkClient.java (78%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon A2300 A2400.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon ELPH 110 320 HS.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon ELPH 115 130 IS.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon ELPH 330 HS.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon ELPH 520 HS.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon S100.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon S110 S120.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Canon SX260.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/GoPro Hero 3+ Black.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/GoPro Hero 3+ Silver (Medium).xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/GoPro Hero 3+ Silver (Wide).xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/GoPro Hero 3+ White.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/GoPro Hero 4 Black.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/GoPro_Hero_3_Silver.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Mobius_A_Lens.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Mobius_B_Lens.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sentek GEMS V0.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sentek GEMS V1.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sentek GEMS V2.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony NEX5 16mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony NEX5 20mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony NEX5 25mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony QX1 16mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony QX1 20mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony RX100 M3 24mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony RX100 M3 70mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/CameraInfo/Sony RX100_M3 50mm.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/Parameters/ParameterMetaData.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/VehicleProfiles/ArduCopter.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/VehicleProfiles/ArduPlane.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/VehicleProfiles/ArduRover.xml (100%) rename {ServiceApp => ClientLib/src/main}/assets/VehicleProfiles/ArduSolo.xml (100%) delete mode 100644 ServiceApp/.gitignore delete mode 100644 ServiceApp/AndroidManifest.xml delete mode 100644 ServiceApp/LICENSE.md delete mode 100644 ServiceApp/README.md delete mode 100644 ServiceApp/assets/AppStore/recommendedApps.json delete mode 100644 ServiceApp/build.gradle delete mode 100644 ServiceApp/lint.xml delete mode 100644 ServiceApp/proguard.cfg delete mode 100755 ServiceApp/res/drawable-hdpi/ic_android_black_24dp.png delete mode 100644 ServiceApp/res/drawable-hdpi/ic_launcher.png delete mode 100755 ServiceApp/res/drawable-hdpi/ic_person_black_24dp.png delete mode 100755 ServiceApp/res/drawable-hdpi/ic_settings_black_24dp.png delete mode 100755 ServiceApp/res/drawable-hdpi/ic_settings_ethernet_black_24dp.png delete mode 100644 ServiceApp/res/drawable-hdpi/ic_stat_notify.png delete mode 100644 ServiceApp/res/drawable-hdpi/vpi__tab_selected_focused_holo.9.png delete mode 100644 ServiceApp/res/drawable-hdpi/vpi__tab_selected_holo.9.png delete mode 100644 ServiceApp/res/drawable-hdpi/vpi__tab_selected_pressed_holo.9.png delete mode 100644 ServiceApp/res/drawable-hdpi/vpi__tab_unselected_focused_holo.9.png delete mode 100644 ServiceApp/res/drawable-hdpi/vpi__tab_unselected_holo.9.png delete mode 100644 ServiceApp/res/drawable-hdpi/vpi__tab_unselected_pressed_holo.9.png delete mode 100755 ServiceApp/res/drawable-mdpi/ic_android_black_24dp.png delete mode 100644 ServiceApp/res/drawable-mdpi/ic_launcher.png delete mode 100755 ServiceApp/res/drawable-mdpi/ic_person_black_24dp.png delete mode 100755 ServiceApp/res/drawable-mdpi/ic_settings_black_24dp.png delete mode 100755 ServiceApp/res/drawable-mdpi/ic_settings_ethernet_black_24dp.png delete mode 100644 ServiceApp/res/drawable-mdpi/ic_stat_notify.png delete mode 100644 ServiceApp/res/drawable-mdpi/vpi__tab_selected_focused_holo.9.png delete mode 100644 ServiceApp/res/drawable-mdpi/vpi__tab_selected_holo.9.png delete mode 100644 ServiceApp/res/drawable-mdpi/vpi__tab_selected_pressed_holo.9.png delete mode 100644 ServiceApp/res/drawable-mdpi/vpi__tab_unselected_focused_holo.9.png delete mode 100644 ServiceApp/res/drawable-mdpi/vpi__tab_unselected_holo.9.png delete mode 100644 ServiceApp/res/drawable-mdpi/vpi__tab_unselected_pressed_holo.9.png delete mode 100755 ServiceApp/res/drawable-xhdpi/ic_android_black_24dp.png delete mode 100644 ServiceApp/res/drawable-xhdpi/ic_launcher.png delete mode 100755 ServiceApp/res/drawable-xhdpi/ic_person_black_24dp.png delete mode 100755 ServiceApp/res/drawable-xhdpi/ic_settings_black_24dp.png delete mode 100755 ServiceApp/res/drawable-xhdpi/ic_settings_ethernet_black_24dp.png delete mode 100644 ServiceApp/res/drawable-xhdpi/ic_stat_notify.png delete mode 100644 ServiceApp/res/drawable-xhdpi/vpi__tab_selected_focused_holo.9.png delete mode 100644 ServiceApp/res/drawable-xhdpi/vpi__tab_selected_holo.9.png delete mode 100644 ServiceApp/res/drawable-xhdpi/vpi__tab_selected_pressed_holo.9.png delete mode 100644 ServiceApp/res/drawable-xhdpi/vpi__tab_unselected_focused_holo.9.png delete mode 100644 ServiceApp/res/drawable-xhdpi/vpi__tab_unselected_holo.9.png delete mode 100644 ServiceApp/res/drawable-xhdpi/vpi__tab_unselected_pressed_holo.9.png delete mode 100755 ServiceApp/res/drawable-xxhdpi/ic_android_black_24dp.png delete mode 100644 ServiceApp/res/drawable-xxhdpi/ic_launcher.png delete mode 100755 ServiceApp/res/drawable-xxhdpi/ic_person_black_24dp.png delete mode 100755 ServiceApp/res/drawable-xxhdpi/ic_settings_black_24dp.png delete mode 100755 ServiceApp/res/drawable-xxhdpi/ic_settings_ethernet_black_24dp.png delete mode 100644 ServiceApp/res/drawable-xxhdpi/ic_stat_notify.png delete mode 100755 ServiceApp/res/drawable-xxxhdpi/ic_android_black_24dp.png delete mode 100644 ServiceApp/res/drawable-xxxhdpi/ic_launcher.png delete mode 100755 ServiceApp/res/drawable-xxxhdpi/ic_person_black_24dp.png delete mode 100755 ServiceApp/res/drawable-xxxhdpi/ic_settings_black_24dp.png delete mode 100755 ServiceApp/res/drawable-xxxhdpi/ic_settings_ethernet_black_24dp.png delete mode 100644 ServiceApp/res/drawable-xxxhdpi/ic_stat_notify.png delete mode 100644 ServiceApp/res/drawable/action_button_install_bg.xml delete mode 100644 ServiceApp/res/drawable/action_button_open_bg.xml delete mode 100644 ServiceApp/res/drawable/vpi__dark_theme.xml delete mode 100644 ServiceApp/res/drawable/vpi__light_theme.xml delete mode 100644 ServiceApp/res/drawable/vpi__tab_indicator.xml delete mode 100644 ServiceApp/res/layout/activity_main.xml delete mode 100644 ServiceApp/res/layout/activity_tlog_file_selector.xml delete mode 100644 ServiceApp/res/layout/activity_usb_intent_receiver.xml delete mode 100644 ServiceApp/res/layout/divider_view.xml delete mode 100644 ServiceApp/res/layout/fragment_app_connections.xml delete mode 100644 ServiceApp/res/layout/fragment_connections.xml delete mode 100644 ServiceApp/res/layout/fragment_recommended_apps.xml delete mode 100644 ServiceApp/res/layout/item_recommended_app_info.xml delete mode 100644 ServiceApp/res/layout/list_item_drone_info.xml delete mode 100644 ServiceApp/res/layout/list_item_tlog_info.xml delete mode 100644 ServiceApp/res/menu/activity_main.xml delete mode 100755 ServiceApp/res/raw/beep_beep.wav delete mode 100644 ServiceApp/res/values-de/strings.xml delete mode 100644 ServiceApp/res/values-it/strings.xml delete mode 100644 ServiceApp/res/values-sw600dp/dimens.xml delete mode 100644 ServiceApp/res/values-w720dp/dimens.xml delete mode 100644 ServiceApp/res/values-zh-rCN/strings.xml delete mode 100644 ServiceApp/res/values-zh-rTW/strings.xml delete mode 100644 ServiceApp/res/values/arrays.xml delete mode 100644 ServiceApp/res/values/attrs.xml delete mode 100644 ServiceApp/res/values/colors.xml delete mode 100644 ServiceApp/res/values/dimens.xml delete mode 100644 ServiceApp/res/values/strings.xml delete mode 100644 ServiceApp/res/values/styles.xml delete mode 100644 ServiceApp/res/values/themes.xml delete mode 100644 ServiceApp/res/xml-zh-rCN/checklist_default.xml delete mode 100644 ServiceApp/res/xml-zh-rCN/checklist_full.xml delete mode 100644 ServiceApp/res/xml/device_filter.xml delete mode 100644 ServiceApp/res/xml/filepaths.xml delete mode 100644 ServiceApp/res/xml/google_analytics_tracker.xml delete mode 100644 ServiceApp/res/xml/preferences.xml delete mode 100644 ServiceApp/src/org/droidplanner/services/android/DroidPlannerServicesApp.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/api/DPServices.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/api/DroneAccess.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidIpConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidMavLinkConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidTcpConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/AndroidUdpConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/BluetoothConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/SoloConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbCDCConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/connection/usb/UsbFTDIConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/model/DataLink.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/communication/service/MAVLinkClient.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCalibration.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkCommands.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkMsgHandler.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkParameters.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkRC.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkStreamRates.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/MavLinkWaypoint.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/WaypointManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/command/doCmd/MavLinkDoCmds.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionListener.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/MavLinkConnectionTypes.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/TcpConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/MAVLink/connection/UdpConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/DroneEvents.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/DroneInterfaces.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/DroneManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/DroneVariable.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/LogMessageListener.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/Preferences.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/Drone.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/MavLinkDrone.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/APMConstants.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduCopter.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilot.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPlane.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/ArduRover.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/AbstractLinkManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/ArduSolo.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/SoloComp.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkListener.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/controller/ControllerLinkManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkListener.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/solo/sololink/SoloLinkManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/apm/variables/APMHeartBeat.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/generic/GenericMavLinkDrone.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/autopilot/px4/Px4Native.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/manager/DroneCommandTracker.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/manager/MavLinkDroneManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/ParameterMetadata.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/profiles/VehicleProfile.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/ApmModes.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Camera.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/GuidedPoint.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/HeartBeat.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Magnetometer.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/MissionStats.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/RC.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/State.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/StreamRates.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/Type.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/AccelCalibration.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/drone/variables/calibration/MagnetometerCalibrationImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/firmware/FirmwareType.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/GCSHeartbeat.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/ReturnToMe.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/Follow.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAbove.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowAlgorithm.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowCircle.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowGuidedScan.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowHeadingAngle.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLead.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeash.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLeft.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowLookAtMe.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowRight.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSoloShot.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineAbove.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowSplineLeash.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/follow/FollowWithRadiusAlgorithm.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/location/FusedLocation.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/location/Location.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/package-info.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/gcs/roi/ROIEstimator.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/coordinates/CoordBounds.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/GeoTools.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineLatLong.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineSampler.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/LineTools.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PointTools.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/PolylineTools.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/Simplify.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/Spline.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/geoTools/spline/SplinePath.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/helpers/units/Area.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/Mission.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/MissionItemType.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/CameraTriggerImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/ChangeSpeedImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/ConditionYawImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/DoJumpImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/EpmGripperImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/MissionCMD.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/ReturnToHomeImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/SetRelayImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/SetServoImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/commands/TakeoffImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SplineSurveyImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/survey/SurveyImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/CircleImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/DoLandStartImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/LandImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/RegionOfInterestImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItem.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/SplineWaypointImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/StructureScannerImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/mission/waypoints/WaypointImpl.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/model/AutopilotWarningParser.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/model/Logger.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/polygon/Polygon.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/srtm/Srtm.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/srtm/SrtmData.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/srtm/SrtmDownloader.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/srtm/SrtmRegions.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/srtm/UnZip.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/CameraInfo.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/Footprint.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/SurveyData.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/grid/CircumscribedGrid.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/grid/EndpointSorter.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Grid.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/grid/GridBuilder.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/core/survey/grid/Trimmer.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/data/SessionContract.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/data/SessionDB.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/data/provider/FileProvider.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/data/provider/ServiceDataProvider.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/exception/ConnectionException.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/activity/MainActivity.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/activity/TLogFileSelector.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/activity/UsbIntentReceiver.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/adapter/AppConnectionAdapter.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/adapter/RecommendedAppsAdapter.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/fragment/AppConnectionsFragment.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/fragment/RecommendedAppsFragment.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/fragment/ViewCategoryFragment.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/widget/PageIndicator.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/ui/widget/TabPageIndicator.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/AndroidApWarningParser.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/AndroidLogger.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/CommonApiUtils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/LogToFileTree.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/NetworkUtils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/ProxyUtils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/SoloApiUtils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/TextUtils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/Utils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/analytics/GAUtils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/apps/AppsUpdateReceiver.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/connection/SshConnection.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/connection/WifiConnectionHandler.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/AssetUtil.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/FileUtils.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/IO/CameraInfoLoader.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/IO/CameraInfoReader.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/IO/ExceptionWriter.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/IO/ParameterMetadataLoader.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/file/IO/VehicleProfileReader.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/prefs/DroidPlannerPrefs.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/video/StreamRecorder.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/video/VideoManager.java delete mode 100644 ServiceApp/src/org/droidplanner/services/android/utils/video/file/DecodeH264FromFile.java delete mode 100644 ServiceApp/src/org/droidplanner/services/package-info.java diff --git a/ServiceApp/art/ic_launcher.svg b/ClientLib/art/ic_launcher.svg similarity index 100% rename from ServiceApp/art/ic_launcher.svg rename to ClientLib/art/ic_launcher.svg diff --git a/ServiceApp/art/ic_stat_notify.svg b/ClientLib/art/ic_stat_notify.svg similarity index 100% rename from ServiceApp/art/ic_stat_notify.svg rename to ClientLib/art/ic_stat_notify.svg diff --git a/ClientLib/build.gradle b/ClientLib/build.gradle index dfd0807e54..13d480239b 100644 --- a/ClientLib/build.gradle +++ b/ClientLib/build.gradle @@ -1,4 +1,6 @@ apply plugin: 'com.android.library' +apply plugin: 'io.fabric' +apply plugin: 'com.getkeepsafe.dexcount' ext { VERSION_MAJOR = 0 @@ -75,10 +77,20 @@ android { buildConfigField "boolean", "WRITE_LOG_FILE", "true" } + sitl { + debuggable true + buildConfigField "String", "SOLO_LINK_IP", getLocalIp() + buildConfigField "boolean", "SITL_DEBUG", "true" + } + release { buildConfigField "boolean", "ENABLE_CRASHLYTICS", "true" } } + + testOptions { + unitTests.returnDefaultValues = true + } } dependencies { @@ -103,12 +115,17 @@ dependencies { } debugCompile project(':Mavlink') + sitlCompile project(':Mavlink') releaseCompile files('libs/Mavlink.jar') compile files('libs/d2xx.jar') debugCompile project(':UsbSerialLibrary') + sitlCompile project(':UsbSerialLibrary') releaseCompile project(':UsbSerialLibrary') + + androidTestCompile 'junit:junit:4.12' + androidTestCompile "org.robolectric:robolectric:3.0" } def getSoloLinkIp() { diff --git a/ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java b/ClientLib/src/androidTest/java/com/o3dr/android/client/apis/ControlApiTest.java similarity index 96% rename from ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java rename to ClientLib/src/androidTest/java/com/o3dr/android/client/apis/ControlApiTest.java index c2cb9ada0f..5b0203af76 100644 --- a/ServiceApp/test/java/com/o3dr/android/client/apis/ControlApiTest.java +++ b/ClientLib/src/androidTest/java/com/o3dr/android/client/apis/ControlApiTest.java @@ -7,8 +7,9 @@ import com.o3dr.services.android.lib.model.AbstractCommandListener; import com.o3dr.services.android.lib.model.action.Action; -import org.droidplanner.services.android.mock.MockDrone; -import org.junit.Assert; +import junit.framework.Assert; + +import org.droidplanner.services.android.impl.mock.MockDrone; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; @@ -24,7 +25,7 @@ * Created by Fredia Huya-Kouadio on 10/23/15. */ @RunWith(RobolectricGradleTestRunner.class) -@Config(constants = org.droidplanner.services.android.BuildConfig.class, sdk = 18) +@Config(constants = com.o3dr.android.client.BuildConfig.class, sdk = 18) public class ControlApiTest { private static final SparseArray expectedVelocitiesPerAttitude = new SparseArray<>(); diff --git a/ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java b/ClientLib/src/androidTest/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java similarity index 100% rename from ServiceApp/test/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java rename to ClientLib/src/androidTest/java/com/o3dr/services/android/lib/drone/companion/solo/tlv/TLVMessageParserTest.java diff --git a/ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java b/ClientLib/src/androidTest/java/com/o3dr/services/android/lib/util/MathUtilsTest.java similarity index 100% rename from ServiceApp/test/java/com/o3dr/services/android/lib/util/MathUtilsTest.java rename to ClientLib/src/androidTest/java/com/o3dr/services/android/lib/util/MathUtilsTest.java diff --git a/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/BasicTest.java similarity index 80% rename from ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/BasicTest.java index cc6a50e20a..313f94a605 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/BasicTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/BasicTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android; +package org.droidplanner.services.android.impl; import android.content.Context; import android.os.Bundle; @@ -8,25 +8,28 @@ import com.MAVLink.Messages.MAVLinkMessage; import com.MAVLink.common.msg_command_long; import com.MAVLink.enums.MAV_CMD; +import com.o3dr.android.client.BuildConfig; import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; import com.o3dr.services.android.lib.gcs.link.LinkConnectionStatus; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.core.MAVLink.MavLinkCommands; -import org.droidplanner.services.android.core.drone.LogMessageListener; -import org.droidplanner.services.android.core.drone.autopilot.MavLinkDrone; -import org.droidplanner.services.android.core.drone.autopilot.apm.ArduCopter; -import org.droidplanner.services.android.core.firmware.FirmwareType; -import org.droidplanner.services.android.mock.MockMAVLinkClient; -import org.droidplanner.services.android.utils.AndroidApWarningParser; import org.junit.Assert; import org.junit.Before; + +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.core.MAVLink.MavLinkCommands; +import org.droidplanner.services.android.impl.core.drone.LogMessageListener; +import org.droidplanner.services.android.impl.core.drone.autopilot.MavLinkDrone; +import org.droidplanner.services.android.impl.core.drone.autopilot.apm.ArduCopter; +import org.droidplanner.services.android.impl.core.firmware.FirmwareType; +import org.droidplanner.services.android.impl.mock.MockMAVLinkClient; +import org.droidplanner.services.android.impl.utils.AndroidApWarningParser; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; + /** * Created by djmedina on 3/5/15. * This is a simple test case. diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilotTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilotTest.java similarity index 96% rename from ServiceApp/test/java/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilotTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilotTest.java index aa26a0f7d4..2a7daa2fa0 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/drone/autopilot/apm/ArduPilotTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/drone/autopilot/apm/ArduPilotTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.drone.autopilot.apm; +package org.droidplanner.services.android.impl.core.drone.autopilot.apm; import com.github.zafarkhaja.semver.Version; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/Coord2DTest.java similarity index 81% rename from ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/Coord2DTest.java index 392967e3ab..74bde32af0 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord2DTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/Coord2DTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.helpers.coordinates; +package org.droidplanner.services.android.impl.core.helpers.coordinates; import com.o3dr.services.android.lib.coordinate.LatLong; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/Coord3DTest.java similarity index 94% rename from ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/Coord3DTest.java index d8c25059ac..c535556833 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/Coord3DTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/Coord3DTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.helpers.coordinates; +package org.droidplanner.services.android.impl.core.helpers.coordinates; import com.o3dr.services.android.lib.coordinate.LatLong; import com.o3dr.services.android.lib.coordinate.LatLongAlt; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBoundsTest.java similarity index 94% rename from ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBoundsTest.java index 5cde695c93..ec87117274 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/coordinates/CoordBoundsTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/coordinates/CoordBoundsTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.helpers.coordinates; +package org.droidplanner.services.android.impl.core.helpers.coordinates; import com.o3dr.services.android.lib.coordinate.LatLong; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoToolsTest.java similarity index 93% rename from ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoToolsTest.java index 41cd080e82..9e45ebcf2b 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/geoTools/GeoToolsTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/geoTools/GeoToolsTest.java @@ -1,11 +1,12 @@ -package org.droidplanner.services.android.core.helpers.geoTools; +package org.droidplanner.services.android.impl.core.helpers.geoTools; import com.o3dr.services.android.lib.coordinate.LatLong; import com.o3dr.services.android.lib.coordinate.LatLongAlt; import junit.framework.TestCase; -import org.droidplanner.services.android.core.polygon.Polygon; +import org.droidplanner.services.android.impl.core.polygon.Polygon; + public class GeoToolsTest extends TestCase { diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/units/AreaTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/units/AreaTest.java similarity index 92% rename from ServiceApp/test/java/org/droidplanner/services/android/core/helpers/units/AreaTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/units/AreaTest.java index 5476372415..685d4f711f 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/helpers/units/AreaTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/helpers/units/AreaTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.helpers.units; +package org.droidplanner.services.android.impl.core.helpers.units; import junit.framework.TestCase; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ChangeCameraTriggerImplTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ChangeCameraTriggerImplTest.java similarity index 74% rename from ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ChangeCameraTriggerImplTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ChangeCameraTriggerImplTest.java index d354c433b3..5bd9516365 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ChangeCameraTriggerImplTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ChangeCameraTriggerImplTest.java @@ -1,12 +1,12 @@ -package org.droidplanner.services.android.core.mission.waypoints; +package org.droidplanner.services.android.impl.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import junit.framework.TestCase; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.commands.CameraTriggerImpl; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.commands.CameraTriggerImpl; import java.util.List; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ChangeSpeedImplTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ChangeSpeedImplTest.java similarity index 79% rename from ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ChangeSpeedImplTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ChangeSpeedImplTest.java index b5b6fbe13c..16a26b26d0 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ChangeSpeedImplTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ChangeSpeedImplTest.java @@ -1,12 +1,12 @@ -package org.droidplanner.services.android.core.mission.waypoints; +package org.droidplanner.services.android.impl.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import junit.framework.TestCase; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.commands.ChangeSpeedImpl; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.commands.ChangeSpeedImpl; import java.util.List; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ConditionYawImplTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ConditionYawImplTest.java similarity index 76% rename from ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ConditionYawImplTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ConditionYawImplTest.java index aa28ddc4ad..35a5a299a2 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/ConditionYawImplTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/ConditionYawImplTest.java @@ -1,12 +1,12 @@ -package org.droidplanner.services.android.core.mission.waypoints; +package org.droidplanner.services.android.impl.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import junit.framework.TestCase; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.commands.ConditionYawImpl; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.commands.ConditionYawImpl; import java.util.List; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/LandImplTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImplTest.java similarity index 83% rename from ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/LandImplTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImplTest.java index 8b062c8b4e..22859b6971 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/LandImplTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/LandImplTest.java @@ -1,11 +1,11 @@ -package org.droidplanner.services.android.core.mission.waypoints; +package org.droidplanner.services.android.impl.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import junit.framework.TestCase; -import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.Mission; import java.util.List; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItemTest.java similarity index 83% rename from ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItemTest.java index dc2c54593e..35c0b8a1fd 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/SpatialCoordItemTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/SpatialCoordItemTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.mission.waypoints; +package org.droidplanner.services.android.impl.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_FRAME; @@ -6,7 +6,7 @@ import junit.framework.TestCase; -import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.Mission; public class SpatialCoordItemTest extends TestCase { diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/TakeoffImplTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/TakeoffImplTest.java similarity index 77% rename from ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/TakeoffImplTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/TakeoffImplTest.java index 31c8e126c2..30f9589925 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/TakeoffImplTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/TakeoffImplTest.java @@ -1,12 +1,12 @@ -package org.droidplanner.services.android.core.mission.waypoints; +package org.droidplanner.services.android.impl.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; import junit.framework.TestCase; -import org.droidplanner.services.android.core.mission.Mission; -import org.droidplanner.services.android.core.mission.commands.TakeoffImpl; +import org.droidplanner.services.android.impl.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.commands.TakeoffImpl; import java.util.List; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImplTest.java similarity index 85% rename from ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImplTest.java index 12c3e955be..ebc4edc33b 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/mission/waypoints/WaypointImplTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/mission/waypoints/WaypointImplTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.mission.waypoints; +package org.droidplanner.services.android.impl.core.mission.waypoints; import com.MAVLink.common.msg_mission_item; import com.MAVLink.enums.MAV_CMD; @@ -6,7 +6,7 @@ import junit.framework.TestCase; -import org.droidplanner.services.android.core.mission.Mission; +import org.droidplanner.services.android.impl.core.mission.Mission; import java.util.List; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/survey/FootprintTest.java similarity index 97% rename from ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/survey/FootprintTest.java index a5621dbb3a..2e0327bb55 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/core/survey/FootprintTest.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/core/survey/FootprintTest.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.core.survey; +package org.droidplanner.services.android.impl.core.survey; import com.MAVLink.ardupilotmega.msg_camera_feedback; import com.o3dr.services.android.lib.coordinate.LatLong; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/mock/MockDrone.java similarity index 95% rename from ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/mock/MockDrone.java index 496a2b559c..55fe2d5c33 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockDrone.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/mock/MockDrone.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.mock; +package org.droidplanner.services.android.impl.mock; import android.content.Context; import android.os.Parcelable; diff --git a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/mock/MockMAVLinkClient.java similarity index 78% rename from ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java rename to ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/mock/MockMAVLinkClient.java index 8373e3182b..21a36c1c94 100644 --- a/ServiceApp/test/java/org/droidplanner/services/android/mock/MockMAVLinkClient.java +++ b/ClientLib/src/androidTest/java/org/droidplanner/services/android/impl/mock/MockMAVLinkClient.java @@ -1,4 +1,4 @@ -package org.droidplanner.services.android.mock; +package org.droidplanner.services.android.impl.mock; import android.content.Context; @@ -7,8 +7,9 @@ import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; import com.o3dr.services.android.lib.model.ICommandListener; -import org.droidplanner.services.android.communication.model.DataLink; -import org.droidplanner.services.android.communication.service.MAVLinkClient; +import org.droidplanner.services.android.impl.communication.model.DataLink; +import org.droidplanner.services.android.impl.communication.service.MAVLinkClient; + /** * Created by Fredia Huya-Kouadio on 12/17/15. diff --git a/ServiceApp/assets/CameraInfo/Canon A2300 A2400.xml b/ClientLib/src/main/assets/CameraInfo/Canon A2300 A2400.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon A2300 A2400.xml rename to ClientLib/src/main/assets/CameraInfo/Canon A2300 A2400.xml diff --git a/ServiceApp/assets/CameraInfo/Canon ELPH 110 320 HS.xml b/ClientLib/src/main/assets/CameraInfo/Canon ELPH 110 320 HS.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon ELPH 110 320 HS.xml rename to ClientLib/src/main/assets/CameraInfo/Canon ELPH 110 320 HS.xml diff --git a/ServiceApp/assets/CameraInfo/Canon ELPH 115 130 IS.xml b/ClientLib/src/main/assets/CameraInfo/Canon ELPH 115 130 IS.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon ELPH 115 130 IS.xml rename to ClientLib/src/main/assets/CameraInfo/Canon ELPH 115 130 IS.xml diff --git a/ServiceApp/assets/CameraInfo/Canon ELPH 330 HS.xml b/ClientLib/src/main/assets/CameraInfo/Canon ELPH 330 HS.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon ELPH 330 HS.xml rename to ClientLib/src/main/assets/CameraInfo/Canon ELPH 330 HS.xml diff --git a/ServiceApp/assets/CameraInfo/Canon ELPH 520 HS.xml b/ClientLib/src/main/assets/CameraInfo/Canon ELPH 520 HS.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon ELPH 520 HS.xml rename to ClientLib/src/main/assets/CameraInfo/Canon ELPH 520 HS.xml diff --git a/ServiceApp/assets/CameraInfo/Canon S100.xml b/ClientLib/src/main/assets/CameraInfo/Canon S100.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon S100.xml rename to ClientLib/src/main/assets/CameraInfo/Canon S100.xml diff --git a/ServiceApp/assets/CameraInfo/Canon S110 S120.xml b/ClientLib/src/main/assets/CameraInfo/Canon S110 S120.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon S110 S120.xml rename to ClientLib/src/main/assets/CameraInfo/Canon S110 S120.xml diff --git a/ServiceApp/assets/CameraInfo/Canon SX260.xml b/ClientLib/src/main/assets/CameraInfo/Canon SX260.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Canon SX260.xml rename to ClientLib/src/main/assets/CameraInfo/Canon SX260.xml diff --git a/ServiceApp/assets/CameraInfo/GoPro Hero 3+ Black.xml b/ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ Black.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/GoPro Hero 3+ Black.xml rename to ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ Black.xml diff --git a/ServiceApp/assets/CameraInfo/GoPro Hero 3+ Silver (Medium).xml b/ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ Silver (Medium).xml similarity index 100% rename from ServiceApp/assets/CameraInfo/GoPro Hero 3+ Silver (Medium).xml rename to ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ Silver (Medium).xml diff --git a/ServiceApp/assets/CameraInfo/GoPro Hero 3+ Silver (Wide).xml b/ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ Silver (Wide).xml similarity index 100% rename from ServiceApp/assets/CameraInfo/GoPro Hero 3+ Silver (Wide).xml rename to ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ Silver (Wide).xml diff --git a/ServiceApp/assets/CameraInfo/GoPro Hero 3+ White.xml b/ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ White.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/GoPro Hero 3+ White.xml rename to ClientLib/src/main/assets/CameraInfo/GoPro Hero 3+ White.xml diff --git a/ServiceApp/assets/CameraInfo/GoPro Hero 4 Black.xml b/ClientLib/src/main/assets/CameraInfo/GoPro Hero 4 Black.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/GoPro Hero 4 Black.xml rename to ClientLib/src/main/assets/CameraInfo/GoPro Hero 4 Black.xml diff --git a/ServiceApp/assets/CameraInfo/GoPro_Hero_3_Silver.xml b/ClientLib/src/main/assets/CameraInfo/GoPro_Hero_3_Silver.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/GoPro_Hero_3_Silver.xml rename to ClientLib/src/main/assets/CameraInfo/GoPro_Hero_3_Silver.xml diff --git a/ServiceApp/assets/CameraInfo/Mobius_A_Lens.xml b/ClientLib/src/main/assets/CameraInfo/Mobius_A_Lens.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Mobius_A_Lens.xml rename to ClientLib/src/main/assets/CameraInfo/Mobius_A_Lens.xml diff --git a/ServiceApp/assets/CameraInfo/Mobius_B_Lens.xml b/ClientLib/src/main/assets/CameraInfo/Mobius_B_Lens.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Mobius_B_Lens.xml rename to ClientLib/src/main/assets/CameraInfo/Mobius_B_Lens.xml diff --git a/ServiceApp/assets/CameraInfo/Sentek GEMS V0.xml b/ClientLib/src/main/assets/CameraInfo/Sentek GEMS V0.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sentek GEMS V0.xml rename to ClientLib/src/main/assets/CameraInfo/Sentek GEMS V0.xml diff --git a/ServiceApp/assets/CameraInfo/Sentek GEMS V1.xml b/ClientLib/src/main/assets/CameraInfo/Sentek GEMS V1.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sentek GEMS V1.xml rename to ClientLib/src/main/assets/CameraInfo/Sentek GEMS V1.xml diff --git a/ServiceApp/assets/CameraInfo/Sentek GEMS V2.xml b/ClientLib/src/main/assets/CameraInfo/Sentek GEMS V2.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sentek GEMS V2.xml rename to ClientLib/src/main/assets/CameraInfo/Sentek GEMS V2.xml diff --git a/ServiceApp/assets/CameraInfo/Sony NEX5 16mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony NEX5 16mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony NEX5 16mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony NEX5 16mm.xml diff --git a/ServiceApp/assets/CameraInfo/Sony NEX5 20mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony NEX5 20mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony NEX5 20mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony NEX5 20mm.xml diff --git a/ServiceApp/assets/CameraInfo/Sony NEX5 25mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony NEX5 25mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony NEX5 25mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony NEX5 25mm.xml diff --git a/ServiceApp/assets/CameraInfo/Sony QX1 16mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony QX1 16mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony QX1 16mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony QX1 16mm.xml diff --git a/ServiceApp/assets/CameraInfo/Sony QX1 20mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony QX1 20mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony QX1 20mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony QX1 20mm.xml diff --git a/ServiceApp/assets/CameraInfo/Sony RX100 M3 24mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony RX100 M3 24mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony RX100 M3 24mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony RX100 M3 24mm.xml diff --git a/ServiceApp/assets/CameraInfo/Sony RX100 M3 70mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony RX100 M3 70mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony RX100 M3 70mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony RX100 M3 70mm.xml diff --git a/ServiceApp/assets/CameraInfo/Sony RX100_M3 50mm.xml b/ClientLib/src/main/assets/CameraInfo/Sony RX100_M3 50mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/Sony RX100_M3 50mm.xml rename to ClientLib/src/main/assets/CameraInfo/Sony RX100_M3 50mm.xml diff --git a/ServiceApp/assets/Parameters/ParameterMetaData.xml b/ClientLib/src/main/assets/Parameters/ParameterMetaData.xml similarity index 100% rename from ServiceApp/assets/Parameters/ParameterMetaData.xml rename to ClientLib/src/main/assets/Parameters/ParameterMetaData.xml diff --git a/ServiceApp/assets/VehicleProfiles/ArduCopter.xml b/ClientLib/src/main/assets/VehicleProfiles/ArduCopter.xml similarity index 100% rename from ServiceApp/assets/VehicleProfiles/ArduCopter.xml rename to ClientLib/src/main/assets/VehicleProfiles/ArduCopter.xml diff --git a/ServiceApp/assets/VehicleProfiles/ArduPlane.xml b/ClientLib/src/main/assets/VehicleProfiles/ArduPlane.xml similarity index 100% rename from ServiceApp/assets/VehicleProfiles/ArduPlane.xml rename to ClientLib/src/main/assets/VehicleProfiles/ArduPlane.xml diff --git a/ServiceApp/assets/VehicleProfiles/ArduRover.xml b/ClientLib/src/main/assets/VehicleProfiles/ArduRover.xml similarity index 100% rename from ServiceApp/assets/VehicleProfiles/ArduRover.xml rename to ClientLib/src/main/assets/VehicleProfiles/ArduRover.xml diff --git a/ServiceApp/assets/VehicleProfiles/ArduSolo.xml b/ClientLib/src/main/assets/VehicleProfiles/ArduSolo.xml similarity index 100% rename from ServiceApp/assets/VehicleProfiles/ArduSolo.xml rename to ClientLib/src/main/assets/VehicleProfiles/ArduSolo.xml diff --git a/ServiceApp/.gitignore b/ServiceApp/.gitignore deleted file mode 100644 index 9328249888..0000000000 --- a/ServiceApp/.gitignore +++ /dev/null @@ -1,61 +0,0 @@ -# built application files -*.apk -*.ap_ - -# files for the dex VM -*.dex - -# Java class files -*.class - -# generated files -bin/ -gen/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Eclipse project files -#.classpath -#.project -tmp.txt - -# Proguard folder generated by Eclipse -proguard/ - -# Intellij project files -*.iml -*.ipr -*.iws -.idea/ - -*.pydevproject -#.project -.metadata -bin/** -tmp/** -tmp/**/* -*.tmp -*.bak -*.swp -*~.nib -local.properties -#.classpath -.settings/ -.loadpath - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - - -#Do not ignore the versioning script -!.externalToolBuilders/Verisoning.launch - -# PDT-specific -.buildpath - -doc/* diff --git a/ServiceApp/AndroidManifest.xml b/ServiceApp/AndroidManifest.xml deleted file mode 100644 index 3499af9d44..0000000000 --- a/ServiceApp/AndroidManifest.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ServiceApp/LICENSE.md b/ServiceApp/LICENSE.md deleted file mode 100644 index 369916a906..0000000000 --- a/ServiceApp/LICENSE.md +++ /dev/null @@ -1,596 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -========================== - -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. <> - -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. - -## Preamble - -The GNU General Public License is a free, copyleft license for software and other -kinds of works. - -The licenses for most software and other practical works are designed to take away -your freedom to share and change the works. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change all versions of a -program--to make sure it remains free software for all its users. We, the Free -Software Foundation, use the GNU General Public License for most of our software; it -applies also to any other work released this way by its authors. You can apply it to -your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General -Public Licenses are designed to make sure that you have the freedom to distribute -copies of free software (and charge for them if you wish), that you receive source -code or can get it if you want it, that you can change the software or use pieces of -it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or -asking you to surrender the rights. Therefore, you have certain responsibilities if -you distribute copies of the software, or if you modify it: responsibilities to -respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, -you must pass on to the recipients the same freedoms that you received. You must make -sure that they, too, receive or can get the source code. And you must show them these -terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert -copyright on the software, and (2) offer you this License giving you legal permission -to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is -no warranty for this free software. For both users' and authors' sake, the GPL -requires that modified versions be marked as changed, so that their problems will not -be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of -the software inside them, although the manufacturer can do so. This is fundamentally -incompatible with the aim of protecting users' freedom to change the software. The -systematic pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we have designed -this version of the GPL to prohibit the practice for those products. If such problems -arise substantially in other domains, we stand ready to extend this provision to -those domains in future versions of the GPL, as needed to protect the freedom of -users. - -Finally, every program is threatened constantly by software patents. States should -not allow patents to restrict development and use of software on general-purpose -computers, but in those that do, we wish to avoid the special danger that patents -applied to a free program could make it effectively proprietary. To prevent this, the -GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -## TERMS AND CONDITIONS - -### 0. Definitions. - -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this -License. Each licensee is addressed as “you”. “Licensees” and -“recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in -a fashion requiring copyright permission, other than the making of an exact copy. The -resulting work is called a “modified version” of the earlier work or a -work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on -the Program. - -To “propagate” a work means to do anything with it that, without -permission, would make you directly or secondarily liable for infringement under -applicable copyright law, except executing it on a computer or modifying a private -copy. Propagation includes copying, distribution (with or without modification), -making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through a computer -network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the -extent that it includes a convenient and prominently visible feature that (1) -displays an appropriate copyright notice, and (2) tells the user that there is no -warranty for the work (except to the extent that warranties are provided), that -licensees may convey the work under this License, and how to view a copy of this -License. If the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -### 1. Source Code. - -The “source code” for a work means the preferred form of the work for -making modifications to it. “Object code” means any non-source form of a -work. - -A “Standard Interface” means an interface that either is an official -standard defined by a recognized standards body, or, in the case of interfaces -specified for a particular programming language, one that is widely used among -developers working in that language. - -The “System Libraries” of an executable work include anything, other than -the work as a whole, that (a) is included in the normal form of packaging a Major -Component, but which is not part of that Major Component, and (b) serves only to -enable use of the work with that Major Component, or to implement a Standard -Interface for which an implementation is available to the public in source code form. -A “Major Component”, in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system (if any) on which -the executable work runs, or a compiler used to produce the work, or an object code -interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the -source code needed to generate, install, and (for an executable work) run the object -code and to modify the work, including scripts to control those activities. However, -it does not include the work's System Libraries, or general-purpose tools or -generally available free programs which are used unmodified in performing those -activities but which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for the work, and -the source code for shared libraries and dynamically linked subprograms that the work -is specifically designed to require, such as by intimate data communication or -control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate -automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -### 2. Basic Permissions. - -All rights granted under this License are granted for the term of copyright on the -Program, and are irrevocable provided the stated conditions are met. This License -explicitly affirms your unlimited permission to run the unmodified Program. The -output from running a covered work is covered by this License only if the output, -given its content, constitutes a covered work. This License acknowledges your rights -of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without -conditions so long as your license otherwise remains in force. You may convey covered -works to others for the sole purpose of having them make modifications exclusively -for you, or provide you with facilities for running those works, provided that you -comply with the terms of this License in conveying all material for which you do not -control copyright. Those thus making or running the covered works for you must do so -exclusively on your behalf, under your direction and control, on terms that prohibit -them from making any copies of your copyrighted material outside their relationship -with you. - -Conveying under any other circumstances is permitted solely under the conditions -stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological measure under any -applicable law fulfilling obligations under article 11 of the WIPO copyright treaty -adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention -of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of -technological measures to the extent such circumvention is effected by exercising -rights under this License with respect to the covered work, and you disclaim any -intention to limit operation or modification of the work as a means of enforcing, -against the work's users, your or third parties' legal rights to forbid circumvention -of technological measures. - -### 4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you receive it, in any -medium, provided that you conspicuously and appropriately publish on each copy an -appropriate copyright notice; keep intact all notices stating that this License and -any non-permissive terms added in accord with section 7 apply to the code; keep -intact all notices of the absence of any warranty; and give all recipients a copy of -this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer -support or warranty protection for a fee. - -### 5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to produce it from -the Program, in the form of source code under the terms of section 4, provided that -you also meet all of these conditions: - -* a) The work must carry prominent notices stating that you modified it, and giving a -relevant date. -* b) The work must carry prominent notices stating that it is released under this -License and any conditions added under section 7. This requirement modifies the -requirement in section 4 to “keep intact all notices”. -* c) You must license the entire work, as a whole, under this License to anyone who -comes into possession of a copy. This License will therefore apply, along with any -applicable section 7 additional terms, to the whole of the work, and all its parts, -regardless of how they are packaged. This License gives no permission to license the -work in any other way, but it does not invalidate such permission if you have -separately received it. -* d) If the work has interactive user interfaces, each must display Appropriate Legal -Notices; however, if the Program has interactive interfaces that do not display -Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are -not by their nature extensions of the covered work, and which are not combined with -it such as to form a larger program, in or on a volume of a storage or distribution -medium, is called an “aggregate” if the compilation and its resulting -copyright are not used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work in an aggregate -does not cause this License to apply to the other parts of the aggregate. - -### 6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms of sections 4 and -5, provided that you also convey the machine-readable Corresponding Source under the -terms of this License, in one of these ways: - -* a) Convey the object code in, or embodied in, a physical product (including a -physical distribution medium), accompanied by the Corresponding Source fixed on a -durable physical medium customarily used for software interchange. -* b) Convey the object code in, or embodied in, a physical product (including a -physical distribution medium), accompanied by a written offer, valid for at least -three years and valid for as long as you offer spare parts or customer support for -that product model, to give anyone who possesses the object code either (1) a copy of -the Corresponding Source for all the software in the product that is covered by this -License, on a durable physical medium customarily used for software interchange, for -a price no more than your reasonable cost of physically performing this conveying of -source, or (2) access to copy the Corresponding Source from a network server at no -charge. -* c) Convey individual copies of the object code with a copy of the written offer to -provide the Corresponding Source. This alternative is allowed only occasionally and -noncommercially, and only if you received the object code with such an offer, in -accord with subsection 6b. -* d) Convey the object code by offering access from a designated place (gratis or for -a charge), and offer equivalent access to the Corresponding Source in the same way -through the same place at no further charge. You need not require recipients to copy -the Corresponding Source along with the object code. If the place to copy the object -code is a network server, the Corresponding Source may be on a different server -(operated by you or a third party) that supports equivalent copying facilities, -provided you maintain clear directions next to the object code saying where to find -the Corresponding Source. Regardless of what server hosts the Corresponding Source, -you remain obligated to ensure that it is available for as long as needed to satisfy -these requirements. -* e) Convey the object code using peer-to-peer transmission, provided you inform -other peers where the object code and Corresponding Source of the work are being -offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the -Corresponding Source as a System Library, need not be included in conveying the -object code work. - -A “User Product” is either (1) a “consumer product”, which -means any tangible personal property which is normally used for personal, family, or -household purposes, or (2) anything designed or sold for incorporation into a -dwelling. In determining whether a product is a consumer product, doubtful cases -shall be resolved in favor of coverage. For a particular product received by a -particular user, “normally used” refers to a typical or common use of -that class of product, regardless of the status of the particular user or of the way -in which the particular user actually uses, or expects or is expected to use, the -product. A product is a consumer product regardless of whether the product has -substantial commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, -procedures, authorization keys, or other information required to install and execute -modified versions of a covered work in that User Product from a modified version of -its Corresponding Source. The information must suffice to ensure that the continued -functioning of the modified object code is in no case prevented or interfered with -solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for -use in, a User Product, and the conveying occurs as part of a transaction in which -the right of possession and use of the User Product is transferred to the recipient -in perpetuity or for a fixed term (regardless of how the transaction is -characterized), the Corresponding Source conveyed under this section must be -accompanied by the Installation Information. But this requirement does not apply if -neither you nor any third party retains the ability to install modified object code -on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to -continue to provide support service, warranty, or updates for a work that has been -modified or installed by the recipient, or for the User Product in which it has been -modified or installed. Access to a network may be denied when the modification itself -materially and adversely affects the operation of the network or violates the rules -and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with -this section must be in a format that is publicly documented (and with an -implementation available to the public in source code form), and must require no -special password or key for unpacking, reading or copying. - -### 7. Additional Terms. - -“Additional permissions” are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. Additional -permissions that are applicable to the entire Program shall be treated as though they -were included in this License, to the extent that they are valid under applicable -law. If additional permissions apply only to part of the Program, that part may be -used separately under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any -additional permissions from that copy, or from any part of it. (Additional -permissions may be written to require their own removal in certain cases when you -modify the work.) You may place additional permissions on material, added by you to a -covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a -covered work, you may (if authorized by the copyright holders of that material) -supplement the terms of this License with terms: - -* a) Disclaiming warranty or limiting liability differently from the terms of -sections 15 and 16 of this License; or -* b) Requiring preservation of specified reasonable legal notices or author -attributions in that material or in the Appropriate Legal Notices displayed by works -containing it; or -* c) Prohibiting misrepresentation of the origin of that material, or requiring that -modified versions of such material be marked in reasonable ways as different from the -original version; or -* d) Limiting the use for publicity purposes of names of licensors or authors of the -material; or -* e) Declining to grant rights under trademark law for use of some trade names, -trademarks, or service marks; or -* f) Requiring indemnification of licensors and authors of that material by anyone -who conveys the material (or modified versions of it) with contractual assumptions of -liability to the recipient, for any liability that these contractual assumptions -directly impose on those licensors and authors. - -All other non-permissive additional terms are considered “further -restrictions” within the meaning of section 10. If the Program as you received -it, or any part of it, contains a notice stating that it is governed by this License -along with a term that is a further restriction, you may remove that term. If a -license document contains a further restriction but permits relicensing or conveying -under this License, you may add to a covered work material governed by the terms of -that license document, provided that the further restriction does not survive such -relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in -the relevant source files, a statement of the additional terms that apply to those -files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a -separately written license, or stated as exceptions; the above requirements apply -either way. - -### 8. Termination. - -You may not propagate or modify a covered work except as expressly provided under -this License. Any attempt otherwise to propagate or modify it is void, and will -automatically terminate your rights under this License (including any patent licenses -granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a -particular copyright holder is reinstated (a) provisionally, unless and until the -copyright holder explicitly and finally terminates your license, and (b) permanently, -if the copyright holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently -if the copyright holder notifies you of the violation by some reasonable means, this -is the first time you have received notice of violation of this License (for any -work) from that copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of -parties who have received copies or rights from you under this License. If your -rights have been terminated and not permanently reinstated, you do not qualify to -receive new licenses for the same material under section 10. - -### 9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy of the -Program. Ancillary propagation of a covered work occurring solely as a consequence of -using peer-to-peer transmission to receive a copy likewise does not require -acceptance. However, nothing other than this License grants you permission to -propagate or modify any covered work. These actions infringe copyright if you do not -accept this License. Therefore, by modifying or propagating a covered work, you -indicate your acceptance of this License to do so. - -### 10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives a license -from the original licensors, to run, modify and propagate that work, subject to this -License. You are not responsible for enforcing compliance by third parties with this -License. - -An “entity transaction” is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an organization, or -merging organizations. If propagation of a covered work results from an entity -transaction, each party to that transaction who receives a copy of the work also -receives whatever licenses to the work the party's predecessor in interest had or -could give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if the predecessor -has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or -affirmed under this License. For example, you may not impose a license fee, royalty, -or other charge for exercise of rights granted under this License, and you may not -initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging -that any patent claim is infringed by making, using, selling, offering for sale, or -importing the Program or any portion of it. - -### 11. Patents. - -A “contributor” is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The work thus -licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or -controlled by the contributor, whether already acquired or hereafter acquired, that -would be infringed by some manner, permitted by this License, of making, using, or -selling its contributor version, but do not include claims that would be infringed -only as a consequence of further modification of the contributor version. For -purposes of this definition, “control” includes the right to grant patent -sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license -under the contributor's essential patent claims, to make, use, sell, offer for sale, -import and otherwise run, modify and propagate the contents of its contributor -version. - -In the following three paragraphs, a “patent license” is any express -agreement or commitment, however denominated, not to enforce a patent (such as an -express permission to practice a patent or covenant not to sue for patent -infringement). To “grant” such a patent license to a party means to make -such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the -Corresponding Source of the work is not available for anyone to copy, free of charge -and under the terms of this License, through a publicly available network server or -other readily accessible means, then you must either (1) cause the Corresponding -Source to be so available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner consistent with -the requirements of this License, to extend the patent license to downstream -recipients. “Knowingly relying” means you have actual knowledge that, but -for the patent license, your conveying the covered work in a country, or your -recipient's use of the covered work in a country, would infringe one or more -identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you -convey, or propagate by procuring conveyance of, a covered work, and grant a patent -license to some of the parties receiving the covered work authorizing them to use, -propagate, modify or convey a specific copy of the covered work, then the patent -license you grant is automatically extended to all recipients of the covered work and -works based on it. - -A patent license is “discriminatory” if it does not include within the -scope of its coverage, prohibits the exercise of, or is conditioned on the -non-exercise of one or more of the rights that are specifically granted under this -License. You may not convey a covered work if you are a party to an arrangement with -a third party that is in the business of distributing software, under which you make -payment to the third party based on the extent of your activity of conveying the -work, and under which the third party grants, to any of the parties who would receive -the covered work from you, a discriminatory patent license (a) in connection with -copies of the covered work conveyed by you (or copies made from those copies), or (b) -primarily for and in connection with specific products or compilations that contain -the covered work, unless you entered into that arrangement, or that patent license -was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied -license or other defenses to infringement that may otherwise be available to you -under applicable patent law. - -### 12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or otherwise) -that contradict the conditions of this License, they do not excuse you from the -conditions of this License. If you cannot convey a covered work so as to satisfy -simultaneously your obligations under this License and any other pertinent -obligations, then as a consequence you may not convey it at all. For example, if you -agree to terms that obligate you to collect a royalty for further conveying from -those to whom you convey the Program, the only way you could satisfy both those terms -and this License would be to refrain entirely from conveying the Program. - -### 13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have permission to link or -combine any covered work with a work licensed under version 3 of the GNU Affero -General Public License into a single combined work, and to convey the resulting work. -The terms of this License will continue to apply to the part which is the covered -work, but the special requirements of the GNU Affero General Public License, section -13, concerning interaction through a network will apply to the combination as such. - -### 14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the GNU -General Public License from time to time. Such new versions will be similar in spirit -to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that -a certain numbered version of the GNU General Public License “or any later -version” applies to it, you have the option of following the terms and -conditions either of that numbered version or of any later version published by the -Free Software Foundation. If the Program does not specify a version number of the GNU -General Public License, you may choose any version ever published by the Free -Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU -General Public License can be used, that proxy's public statement of acceptance of a -version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no -additional obligations are imposed on any author or copyright holder as a result of -your choosing to follow a later version. - -### 15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE -QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE -DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -### 16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY -COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS -PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, -INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE -OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE -WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -### 17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot be -given local legal effect according to their terms, reviewing courts shall apply local -law that most closely approximates an absolute waiver of all civil liability in -connection with the Program, unless a warranty or assumption of liability accompanies -a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -## How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to -the public, the best way to achieve this is to make it free software which everyone -can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them -to the start of each source file to most effectively state the exclusion of warranty; -and each file should have at least the “copyright” line and a pointer to -where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this -when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of -the General Public License. Of course, your program's commands might be different; -for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to -sign a “copyright disclaimer” for the program, if necessary. For more -information on this, and how to apply and follow the GNU GPL, see -<>. - -The GNU General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may consider it -more useful to permit linking proprietary applications with the library. If this is -what you want to do, use the GNU Lesser General Public License instead of this -License. But first, please read -<>. diff --git a/ServiceApp/README.md b/ServiceApp/README.md deleted file mode 100644 index c17f3a86a7..0000000000 --- a/ServiceApp/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# 3DR Services App - -### [3DR Services App](https://play.google.com/store/apps/details?id=org.droidplanner.services.android) -The app is currently under development, and we would love your help for beta testing. -To join the beta: - 1. [Become a beta tester](https://play.google.com/apps/testing/org.droidplanner.services.android) -, and follow the instructions on the link to download the beta release from the Google Play store (it may take 30+ minutes to show up after becoming a beta tester). - 2. Send feedback: Post your feedback in the [3DR Services Google+ community](https://plus.google.com/communities/109484130178804610965) or in the [gitter channel](https://gitter.im/dronekit/dronekit-android). We want to hear what you think! diff --git a/ServiceApp/assets/AppStore/recommendedApps.json b/ServiceApp/assets/AppStore/recommendedApps.json deleted file mode 100644 index d7810c5f35..0000000000 --- a/ServiceApp/assets/AppStore/recommendedApps.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "apps": [ - { - "applicationId": "com.o3dr.solo.android", - "appName": "Solo", - "appDescription" : "Flight made simple: Use the Solo app to control your 3DR Solo drone.", - "appIconUrl" : "https://lh3.googleusercontent.com/_rCy-r5n_4TYqbb1nBFBwjCm9vjKDq6LQfsVS-qWSNmOzj7jH1VopvHjr-fFM_NTtN_9=w300-rw" - }, - { - "applicationId": "org.droidplanner.android", - "appName": "Tower", - "appDescription" : "Tower is 3DR’s powerful and intuitive new flight control program. It provides everything you need to plan, fly and track any 3DR-powered drone.", - "appIconUrl" : "https://lh5.ggpht.com/3NLRo7-EEUFOCIRPDInbB79-Kbe5CThKpWYUuY3p-eiFcndr-i2kXNRigvu6WvQthSw=w300-rw" - }, - { - "applicationId" : "com.o3dr.android.dp.wear", - "appName" : "Tower Wear", - "appDescription" : "Tower-Wear is a wear companion app for 3DR Tower.", - "appIconUrl" : "https://lh5.ggpht.com/8QedcF8g5boPkiq5SB23weUfBtKexIFz28KEvesWPIIIalszbHTLzu-4d7Ey-sbO_Q=w300-rw" - }, - { - "applicationId" : "org.droidplanner.pebble", - "appName" : "Tower Pebble", - "appDescription" : "Tower-Pebble is a pebble companion app for 3DR Tower.", - "appIconUrl" : "https://lh3.ggpht.com/1hlm3CaEh9FbLk3QFxDPj7D_sR4E2ex60kGFUOk5H6O5JQfhGgXOFw0RbHIR_P9GgtfO=w300-rw" - } - ] -} \ No newline at end of file diff --git a/ServiceApp/build.gradle b/ServiceApp/build.gradle deleted file mode 100644 index 66fd6610a3..0000000000 --- a/ServiceApp/build.gradle +++ /dev/null @@ -1,242 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'io.fabric' -apply plugin: 'com.getkeepsafe.dexcount' - -dependencies { - - compile "com.google.android.gms:play-services-analytics:${play_services_version}" - compile "com.google.android.gms:play-services-location:${play_services_version}" - - compile "com.android.support:support-v4:${support_lib_version}" - compile "com.android.support:appcompat-v7:${support_lib_version}" - compile "com.android.support:cardview-v7:${support_lib_version}" - compile "com.android.support:recyclerview-v7:${support_lib_version}" - - compile project(':ClientLib') - - compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') { - transitive = true; - } - - compile 'com.jakewharton.timber:timber:3.1.0' - compile 'com.jcraft:jsch:0.1.51' - - //Java semver library - compile 'com.github.zafarkhaja:java-semver:0.9.0' - - //MP4 generation library - compile 'com.googlecode.mp4parser:isoparser:1.1.7' - - testCompile 'junit:junit:4.12' - testCompile "org.robolectric:robolectric:3.0" -} - -//Decomposed version name and code (https://plus.google.com/+JakeWharton/posts/6f5TcVPRZij) -def versionMajor = 1 -def versionMinor = 5 -def versionPatch = 3 -def versionBuild = 4 //bump for dogfood builds, public betas, etc. -def versionPrefix = "3DR Services v" - -//Log levels values -def logLevelVerbose = 2; -def logLevelDebug = 3; -def logLevelInfo = 4; -def logLevelWarn = 5; -def logLevelError = 6; -def logLevelAssert = 7; - -android { - compileSdkVersion android_build_sdk_version - buildToolsVersion android_build_tools_version - - defaultConfig { - applicationId 'org.droidplanner.services.android' - minSdkVersion android_build_min_sdk_version - targetSdkVersion android_build_target_sdk_version - buildConfigField "boolean", "SITL_DEBUG", "false" - buildConfigField "String", "SOLO_LINK_IP", getSoloLinkIp() - - versionCode computeVersionCode(versionMajor, versionMinor, versionPatch, versionBuild) - versionName generateVersionName(versionPrefix, versionMajor, versionMinor, versionPatch) - - //Write logs to file preferences - buildConfigField "boolean", "WRITE_LOG_FILE", "false" - buildConfigField "int", "LOG_FILE_LEVEL", "$logLevelDebug" - buildConfigField "boolean", "ENABLE_CRASHLYTICS", "false" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - } - - // Move the tests to tests/java, tests/res, etc... - test { - java.srcDirs = ['test/java'] - } - - // Move the build types to build-types/ - // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... - // This moves them out of them default location under src//... which would - // conflict with src/ being used by the main source set. - // Adding new build types or product flavors should be accompanied - // by a similar customization. - debug.setRoot('build-types/debug') - release.setRoot('build-types/release') - } - - signingConfigs { - release { - storeFile getAppKeystoreFile() - storePassword getAppKeystorePassword() - keyAlias getAppKey() - keyPassword getAppKeyPassword() - } - } - - android.applicationVariants.all { variant -> - variant.outputs.each { output -> - def file = output.outputFile - if (file != null && file.name.endsWith('.apk')) { - def buildType = variant.buildType.getName() - def flavorName = variant.getFlavorName() - def versionCode = defaultConfig.versionCode - output.outputFile = new File(file.parent, "3dr-services-${flavorName}-${buildType}.${versionCode}.apk") - } - } - } - - android.variantFilter { variant -> - def flavors = variant.getFlavors() - if(!flavors.isEmpty()) { - def flavorName = flavors.get(0).name - def buildTypeName = variant.buildType.name - - //Filter in the variants we interested in building. - def ignoreVariant = true - switch (buildTypeName) { - case "release": - switch (flavorName) { - case "alpha": - case "beta": - case "prod": - ignoreVariant = false - break - } - break; - - case "debug": - switch (flavorName) { - case "dev": - case "sitl": - ignoreVariant = false - break - } - break; - - case "staging": - switch (flavorName) { - case "beta": - ignoreVariant = false - break - } - break - } - - variant.setIgnore(ignoreVariant); - } - } - - productFlavors { - prod { - - } - - dev { - versionName generateVersionName(versionPrefix, versionMajor, versionMinor, versionPatch, generateVersionNameSuffix(versionBuild, "dev", true)) - } - - beta { - versionName generateVersionName(versionPrefix, versionMajor, versionMinor, versionPatch, generateVersionNameSuffix(versionBuild, "beta")) - } - - alpha { - versionName generateVersionName(versionPrefix, versionMajor, versionMinor, versionPatch, generateVersionNameSuffix(versionBuild, "alpha")) - } - - sitl { - versionName generateVersionName(versionPrefix, versionMajor, versionMinor, versionPatch, generateVersionNameSuffix(versionBuild, "sitl")) - buildConfigField "String", "SOLO_LINK_IP", getLocalIp() - buildConfigField "boolean", "SITL_DEBUG", "true" - } - } - - buildTypes { - debug { - debuggable true - buildConfigField "boolean", "WRITE_LOG_FILE", "true" - } - - staging { - debuggable true - signingConfig signingConfigs.release - buildConfigField "boolean", "ENABLE_CRASHLYTICS", "true" - buildConfigField "boolean", "WRITE_LOG_FILE", "true" - } - - release { - signingConfig signingConfigs.release - buildConfigField "boolean", "ENABLE_CRASHLYTICS", "true" - } - } - - //FIXME: Remove when lint errors are taken care of. - lintOptions { - abortOnError false - } - - testOptions { - unitTests.returnDefaultValues = true - } -} - -def getAppKeystoreFile() { - def filePath = hasProperty('COM_O3DR_SERVICES_KEYSTORE') ? COM_O3DR_SERVICES_KEYSTORE : null - return filePath ? file(filePath) : null -} - -def getAppKeystorePassword(){ - return hasProperty('COM_O3DR_SERVICES_KEYSTORE_PWD') ? COM_O3DR_SERVICES_KEYSTORE_PWD : '' -} - -def getAppKeyPassword() { - return hasProperty('COM_O3DR_SERVICES_KEY_PWD') ? COM_O3DR_SERVICES_KEY_PWD : '' -} - -def getAppKey() { - return hasProperty('COM_O3DR_SERVICES_KEY_ALIAS') ? COM_O3DR_SERVICES_KEY_ALIAS : '' -} - -def getSoloLinkIp() { - return '\"10.1.1.10\"' -} - -def getLocalIp() { - try { - return '\"' + InetAddress.getLocalHost().getCanonicalHostName() + '\"' - }catch(Exception e){ - return '\"\"' - } -} diff --git a/ServiceApp/lint.xml b/ServiceApp/lint.xml deleted file mode 100644 index 35c04f83ec..0000000000 --- a/ServiceApp/lint.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/ServiceApp/proguard.cfg b/ServiceApp/proguard.cfg deleted file mode 100644 index 6b8f1a3a7e..0000000000 --- a/ServiceApp/proguard.cfg +++ /dev/null @@ -1,71 +0,0 @@ -# -# Proguard config for the demo project. -# -# Author: zdwang@google.com (David Wang) -# - -# Standard config from ADT - --dontpreverify --flattenpackagehierarchy --optimizationpasses 5 --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --verbose - --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* - --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference --keep public class com.android.vending.licensing.ILicensingService - --keepclasseswithmembernames class * { - native ; -} - --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet); -} - --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet, int); -} - --keepclassmembers class * extends android.app.Activity { - public void *(android.view.View); -} - --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - --keep class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} - -# Additional ones needed for Maps API library. --keepclassmembers class * implements java.io.Serializable { private static final long serialVersionUID; } --keep public class com.google.googlenav.capabilities.CapabilitiesController* - -# Additional config needed for Guava --keep public interface com.google.common.base.FinalizableReference { void finalizeReferent(); } -# Missing annotations are harmless. --dontwarn sun.misc.Unsafe --dontwarn javax.annotation.** -# Ignore invalid constant ref. See -# https://groups.google.com/d/topic/guava-discuss/YCZzeCiIVoI/discussion --dontwarn com.google.common.collect.MinMaxPriorityQueue - -# As described in tools/proguard/examples/android.pro - ignore all warnings. --dontwarn android.support.v4.** - -# Additional config for greenRobot/eventBus --keepclassmembers class ** { - public void onEvent*(**); -} \ No newline at end of file diff --git a/ServiceApp/res/drawable-hdpi/ic_android_black_24dp.png b/ServiceApp/res/drawable-hdpi/ic_android_black_24dp.png deleted file mode 100755 index 6d09039da7e05443e6c95df653507d03a941fc48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?unr}!K<9t>tY`ML3{fZC&-Qv_SwrK(=sI?Zut z>a?3m&H_9l3;k<9WB{TP2f??B}jrXkB~ERl{Cj^}-t~y%iR>`S4!7@M>Yb|2LB#@z&d~ zuHe`zIr-x9g>6djexw}PSif}1)HAd5%uQcf%{Mw|ksWVPa+5ozopr06k2r$p8QV diff --git a/ServiceApp/res/drawable-hdpi/ic_launcher.png b/ServiceApp/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index 5ceed5ff40dbb7898217942e72e02202a9390b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5238 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 diff --git a/ServiceApp/res/drawable-hdpi/ic_person_black_24dp.png b/ServiceApp/res/drawable-hdpi/ic_person_black_24dp.png deleted file mode 100755 index 2eeb7c6533637fbc64f8ff82882ca892308b46dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;Lb6AYF9SoB8UsT^3j@P1pisjL z28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?vX!FH%rWkuz|J+BXVo|{>(a_4Zf&i12APfy_$lzYD;>RBg)W#)m!@3PNHI({g8 zvoNnmutmH&Bdg`uw+qKOTFYC`>^Ixge#>peQp^A4Ju@d?*IC(Azj4u~vfF(5J`tN! z-Q10j>0|~iIH%5B$8mGBddk5D{&|{9_J>SXoLJb`wBd30v8~+CGB*3D`29Yw&F|^M zt1nvgre{^B=EwA-9EbFeT3p$l#004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00F5VGpw2O5THccy! z2&$Yh#WW>NBM{s%$qeVz5Zu#Z7Nw;P-$so;vT4%v@owF0Td(x!qLV*s1cD>KW)#p*_^A)XUqS zH7|6V-rJUhd|5ZUzaAn0T6jQE;e>G}C>k|6l1y;Q2Z9n&``lQeqtRCxO_Oerovbnx zbfyezqW*Amt<6`dPutY^w~-B5Txnf2>95oeR+#d4F}@SE00000NkvXXu0mjfm%8R= diff --git a/ServiceApp/res/drawable-hdpi/ic_settings_ethernet_black_24dp.png b/ServiceApp/res/drawable-hdpi/ic_settings_ethernet_black_24dp.png deleted file mode 100755 index f88954f4b8907c2cc6f1bd88dc42698a2dd17fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00BNpL_t(Y$L*9|O2a@Dg}?U2Y8zjrh}LCTsL(Blh^QDu zHxg)-RMCxy7Am*|p&GR6&0sYg&~6Q zLEE&w#uPz#WTDWI1}_N0JFEGvfL8?JjTJ9%TYBs>^{iJTz3jSoOgcJ`zknl(j#d48xWokP}zxI_Aq7{t$(!JJj*@oI^kL?!W wo+T^MWQ;H@XdejZG3O*|^gRqItE?I78~o#=&}+5^c>n+a07*qoM6N<$g0G6R+yDRo diff --git a/ServiceApp/res/drawable-hdpi/ic_stat_notify.png b/ServiceApp/res/drawable-hdpi/ic_stat_notify.png deleted file mode 100644 index 0ae0074ce7dfb263a2c66ac2255444f1c2b35594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4228 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 P2f3N?8KW`-r;z^ve;`j9 diff --git a/ServiceApp/res/drawable-hdpi/vpi__tab_selected_focused_holo.9.png b/ServiceApp/res/drawable-hdpi/vpi__tab_selected_focused_holo.9.png deleted file mode 100644 index 673e3bf10d60cc54b6dfef2fcda24575073adf61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgJWBc+iXw=G=Ra=)z4*}Q$iB}l;b6k diff --git a/ServiceApp/res/drawable-hdpi/vpi__tab_selected_holo.9.png b/ServiceApp/res/drawable-hdpi/vpi__tab_selected_holo.9.png deleted file mode 100644 index d57df98b501944b4ba63623766c396b5bccc29ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg}h~fd(*my85}Sb4q9e0H>EG$N&HU diff --git a/ServiceApp/res/drawable-hdpi/vpi__tab_unselected_focused_holo.9.png b/ServiceApp/res/drawable-hdpi/vpi__tab_unselected_focused_holo.9.png deleted file mode 100644 index 294991d7931432f4ce0615f83594077185b41e53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s&X6Hgb%5RRG22KRnVX>4qKXwM^^Uwi5RN9qg%hl7#%FO7Y8A{hJ} m-AWwAG-}%xl(FUbF)^t86Xr1Vx%dsJpTX1B&t;ucLK6TtwI;Oy diff --git a/ServiceApp/res/drawable-hdpi/vpi__tab_unselected_holo.9.png b/ServiceApp/res/drawable-hdpi/vpi__tab_unselected_holo.9.png deleted file mode 100644 index 19532ab10d4fe414d597ed44ed50c91a3e3b9279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 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 aIO+d7Ajltr+5R;E0000O=~G=WkL+ z=jq}YVsSb-L1LamcOv)U@HTy(*%Brl!T%;cv=^yUa62uwqe$S6N5tW95#ITn**~0C zwfSmDT@${xfbol#&rfSM)1*V5%rCBzopr0G60pD*ylh diff --git a/ServiceApp/res/drawable-mdpi/ic_settings_black_24dp.png b/ServiceApp/res/drawable-mdpi/ic_settings_black_24dp.png deleted file mode 100755 index 3405c951d26b3718e6fd1b2e570562d42cf31743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO=~G=WkOt zDBJ>5+tknKG**5lyRqf5Yf>);oSFO2OyJ|*=>B1^EU0-uErmU9@zD$!p6}q1N zly}8W`c~bE>AT|YDnzcEVwGgic5W@(uZoII)gsFcCp=Dmc9>P?#iG8nJ~ze6mpuA5 zn~oZpwbaudil&cZpHeNm%{!4@I>}SMDbEPJVd>7;p@pu6{1- HoD!MO=~G=WkKx z$J50z#Nu>vg2cmyxd#PT?=WVTF5~T%_-B-o(DBURPx6dz-%88F^=H@x(V8 zxxP5G&*AcaLzbkimLeLT+YbsydbB?jzAz%+n{A|z9joX$a scBC=6rYDwbN;k`f6;>x)=+6NLO0fL})A{Rcf&OIhboFyt=akR{0JEuj0ssI2 diff --git a/ServiceApp/res/drawable-mdpi/ic_stat_notify.png b/ServiceApp/res/drawable-mdpi/ic_stat_notify.png deleted file mode 100644 index 10a6ecfa2539148c52b7b882722ef9ff22674cfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3198 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 diff --git a/ServiceApp/res/drawable-mdpi/vpi__tab_selected_focused_holo.9.png b/ServiceApp/res/drawable-mdpi/vpi__tab_selected_focused_holo.9.png deleted file mode 100644 index c9972e74bb4fc7416960e238afd47b1ac363e316..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDd7^K@|x;h4Gh+(zC520Y9MizoD2>~^~(JZa^V pUoEkkaeSh9w)TUlKa6vZ+qJ0**((%Vy8umK@O1TaS?83{1OR&wE2RJc diff --git a/ServiceApp/res/drawable-mdpi/vpi__tab_selected_holo.9.png b/ServiceApp/res/drawable-mdpi/vpi__tab_selected_holo.9.png deleted file mode 100644 index 587337caf74f9ba3d32ba1c7cc8fb8b0b5ba245b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo^mK6y;h4Gh+(zC53JlB#xw8$}k`45e4cLk;e3y7!_%!uv(Z^d6 t0#9x~Qa^f(Id{#0H&;LIP<)f9-+fKc+F|3Yl|VxnJYD@<);T3K0RZ_tFJ}M% diff --git a/ServiceApp/res/drawable-mdpi/vpi__tab_selected_pressed_holo.9.png b/ServiceApp/res/drawable-mdpi/vpi__tab_selected_pressed_holo.9.png deleted file mode 100644 index 155c4fc753ed43185b31df3bea2af1ea5b3e7482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo@N{tu;h33haPQZY#>U2n_RP$O>mRT6my}r8=UW!n`aACInYB!EW!u3$ rIYDzn*o$v%D|qmWd&mA1`&tG?86nH1GYjqj&0z3!^>bP0l+XkKX|61& diff --git a/ServiceApp/res/drawable-mdpi/vpi__tab_unselected_holo.9.png b/ServiceApp/res/drawable-mdpi/vpi__tab_unselected_holo.9.png deleted file mode 100644 index a2dbf42b74f7fafb6d8a057306a9c021867d035c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c0!3HFsSlX9@1d5$JLpXq-h9ji|$mcBZh%9Dc z;O+!rM)Q-W*8&CYJzX3_IA$jQ`2XLYnVI=;y+&GsLz;ns!JqUb2WA}}9-f|K(evAk wfFg6gPD@K@^jg!TZFujONZyK%*Ov1zxbO?iIdA+_5oi>Hr>mdKI;Vst04D7$hX4Qo diff --git a/ServiceApp/res/drawable-mdpi/vpi__tab_unselected_pressed_holo.9.png b/ServiceApp/res/drawable-mdpi/vpi__tab_unselected_pressed_holo.9.png deleted file mode 100644 index b1223fe3c407e072bb22d6f534397bf3254939fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c0!3HFsSlX9@1d5$JLpXq-h9ji|$mcBZh%9Dc z;O+!rM)Q-W*8&A?JzX3_IA$gr-1{}9v9a-?Ju~y+`p0YiB_$U2xUsRZwQat4>8lS< uMnfl1c4A|rBX^f%!~&s(1*$LFm>5oL2|PB@cz*+E5QC?ypUXO@geCw>u`ROz diff --git a/ServiceApp/res/drawable-xhdpi/ic_android_black_24dp.png b/ServiceApp/res/drawable-xhdpi/ic_android_black_24dp.png deleted file mode 100755 index 50fbefd5e86fddd7ac107947a591264c33de64da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 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 A6aWAK diff --git a/ServiceApp/res/drawable-xhdpi/ic_settings_black_24dp.png b/ServiceApp/res/drawable-xhdpi/ic_settings_black_24dp.png deleted file mode 100755 index 2b775b64659e4cef4afc79b8e0b6a1ae1b049f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691 zcmV;k0!;mhP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00JvXL_t(o!|j;8Pm@s;#(${TCVWYWY1uUn7#Kto62wRt z3^+(wO#B;+2@XXVOk4~OIykuiLt|6^2qH7G94dG7n(+vnW8upf?S@kSof=0CzN;gCH%D-93Wz>xQyl;C^+Qv4$W`U(W(<>BGo?S~pjnvz6Z%GrQQ{qEOxv7hReU*ZBD#YO z0lmUed*8YnE6EzsvoY))4!YfFODpO#BKtLD+0S3~Rhiu-sUg2NYuCP^d<3d&dHene zZC-H;v~r)6mb+*a(0|ErFLu4r+_Wehyb|pqx|6biUL|d!KP#SVg(5Hh(UuM95CjfcY;8e;Ra|n|*9NonlO)LibK=YSb4*CjPz+|*kK{c#6{z9-WWcn|3qb@P zn2%|iFMFo{WOvhS9r&vkWj$)z?k0y>uK{0hl_N~CX(cZ+NjKMc8C};}U50gmO>zuJ z^Db@~ZcCrJNoRx`;UQ(lnsdp5p^*l=U9UHg{W}F-H;`>AGU6WeglvXSWAw%Sj|~4x Z`~p3i20ETM-aG&R002ovPDHLkV1jZ(BwGLg diff --git a/ServiceApp/res/drawable-xhdpi/ic_settings_ethernet_black_24dp.png b/ServiceApp/res/drawable-xhdpi/ic_settings_ethernet_black_24dp.png deleted file mode 100755 index c40232db574546680a17807ace6a7ed61099f78c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I$HP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00EmxL_t(o!|j&6FGEon#(&y|E~rpt6huNal1>&8!O$jz zrJG4&u!({ACnOS^ND%)3Ld2v(#Y%i6q^!O|rIA*9EvF~Nz3sWT*LI&yec$JK&&j#( z`zg^5<2`kCPMhbE=g#RKtZ(GAi%vv zvl}EMly@}PZ`bX-{2ebNjG4Z0d|c@pMCmJYTVW7A#VpQ_OFvxPr0saNL`k6$Gwz-8 lA6_A1_?_3P0|yQ);~TSl4IUDl=|%tm002ovPDHLkV1g1->PY|q diff --git a/ServiceApp/res/drawable-xhdpi/ic_stat_notify.png b/ServiceApp/res/drawable-xhdpi/ic_stat_notify.png deleted file mode 100644 index 494fd8d040773c8f3f43541d8a0316e0e8001214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3731 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 diff --git a/ServiceApp/res/drawable-xhdpi/vpi__tab_selected_holo.9.png b/ServiceApp/res/drawable-xhdpi/vpi__tab_selected_holo.9.png deleted file mode 100644 index e4229f26b2771d884934b80d0056b8dd66d10edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8+o-U3d5>t~6?){q5*x2~c-l(n1@K5>ymj5$1a2Oc?!34d7Ck`Aq skg(^gW|wXH-lZoEvTk@AJm}J3sQWAGentL}KF}BjPgg&ebxsLQ0KFYBT>t<8 diff --git a/ServiceApp/res/drawable-xhdpi/vpi__tab_selected_pressed_holo.9.png b/ServiceApp/res/drawable-xhdpi/vpi__tab_selected_pressed_holo.9.png deleted file mode 100644 index e862cb12154541c150fb2d9bb98872bcff506317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5(#$xWo$;KAD39oi<@P`m7(8A5T-G@yGywqAKq?vl diff --git a/ServiceApp/res/drawable-xhdpi/vpi__tab_unselected_holo.9.png b/ServiceApp/res/drawable-xhdpi/vpi__tab_unselected_holo.9.png deleted file mode 100644 index 9465173781eaa7fc9ab0e191904f928ad1c0b8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#0V1dK=^FznmSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1+PZ!4!j+x0n{{OdUW@bKIZ*t~9!x;yr|1&pm7#RS;1ieP?Kk11H z2?+-Ger=J9{IX`d2{ZSUyAFF~k44WnGFVV~q2hHg8$(d6=$w>Y|ILABGI+ZBxvX004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00J#ZL_t(&-tCw@PZUuUhM(Pa*SH!J1BC@9T2S#1sBN^h zF){oC3TjGFDnAlJVPV8A){oezKfwanfK~+50u&Q!G@3xMa4Z}*%piso&;>|&x8f*?Gl+Ba8CIalXx zbj4j8pc*eDgT=^xlqp`b$!`SV7aP1{lB)nTco#)K#7s3_L?$in(20KckN4c_;XJ@p zHJ&>$(#Czvb%EX7IG;FcjdPg~UjNWCL$)|yyl@0zonb4SCLg_V1YyN$;T8+w2*P6v zoEwF41mU{=i{o?5;ICZv{j;0Ybb%%YS`M1MtqZhT8fZxqXS7uQ{2SNuSXFZ-w1#f# z0gbBwjq3r8sQ``X0gb2tUC9%auO02GRFN)qf=<8AGsg~xeB&O?-dRx^*)FL#YsW5M z?FH)sxm;2-m$<>K36RSrMLUVmZ4)4uOG+I&N*qg6I7KN#E151SmAX=>Y!<_E99K`; zV;+D4Pyh-*0Vn_kpa2wr0+0_-vY8hX&rFv%(Dy{>R}-L2mpD*65!yBZ@^ER!zP5Ha zXR=Xrxj2w!*`~`DGsgn8KQ^Shcx(lKa#3NaesD?av2Us5&NIC boE@k?NY~ufTx9hv00000NkvXXu0mjfW2PQ= diff --git a/ServiceApp/res/drawable-xxhdpi/ic_launcher.png b/ServiceApp/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index cd633a3014c3e281fb954f8889b0c09f8806b4fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8144 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 mAhA3OQjmf)P17{(Z}bYWub7s^E_TWQ0000G diff --git a/ServiceApp/res/drawable-xxhdpi/ic_settings_black_24dp.png b/ServiceApp/res/drawable-xxhdpi/ic_settings_black_24dp.png deleted file mode 100755 index 47f0e0d820c17fe1187dd79811a3c5fda163ab53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 969 zcmV;)12+7LP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00TiuL_t(&-tC!LNL4`?fIrQJvZ7K;NpB0Hn1o0VMifK@ zy#+y1L=lFC1r_xiEs*zW7*V!JAP6m>3DNdgXhpP;rbrSkl%_3KR$7*crsji-=m0x!1dL%D`ouc1*-!6#btdvA2>prUgLMM!oLo`x_7cW&bF=X8Th)icXgGR7kN=OeP zc<|9@#P~t7SZJzI>bpi-NQ#FB14r2$Mi7 znQm&vH3D3tHlbNSC~#NA?iApvvaP zPU;*U2|s&}7Gb9Fvu`8YRA;p`&+6?M%A~p8V3cAxtX!cz8snp?91beh!(Wlg4UJ{7 zfmkUej++{kdZww5Szc)t4mA>`IL>KOI$0poNv7YRw7M>MaWl0>$KSrls_In361I<0 zW(<=lGu&_wkR%(Uqb`d4W~%YwqnZ{MMgAfA9Gb#=tJ|P%c|{Gd)v8djP669$P3Hm8 zI+LKU{ub*Q8@OJ;Gi{m2ED!V>Mj0i@004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00M|fL_t(&-tCynOO#O<#(&cywd<C@3f>C|-wI=ge5oAzya(@trqpcVg_|Ed?5V*xAA-6p9I& ztQiOSfXyP|u7gx$S*W_X_?LwM#9oW=t&ar^36TN(RLqBW#RbIv|#gS_}#kZQ_I2 z=Sfsc$!pCkTef_)hgq@L%~FdxwBy$H*NVl@UA_l6rH!Qv`hphiZgrQi?9&ij)0)fC z#Sd$l(jo$7HvuB?Vm#~o^bJOAw3>shNODzo&vWEShj z_&7Rir5P1V2a;qK@mD_*2-$bHSgWfJ#Dz|jw@)h$t=dwv(^cdqAu;eHG8w8 zXRXVog?E!=7Gq`YvzDG&hNCl!u^h9Oab_|8iOyL|&n!JohGf>7rp^X((xkl`NgqqC zwxFwV1JG)4ce=cexi3)PEDm=@%UZo|cViVVil`r)wPLh0S7Z#j52MX|M4|Z1errY( z6DSn#$@pk!dnxdWtxk+>yk?dLUoHOtYn&Nt9bTFS1qB5K1qB8DNBRw`>}~5#vcfq4 O0000JPTD?GGESYir#uZNJ|8UEJF;vBf~Zl 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 diff --git a/ServiceApp/res/drawable-xxxhdpi/ic_android_black_24dp.png b/ServiceApp/res/drawable-xxxhdpi/ic_android_black_24dp.png deleted file mode 100755 index da54292923f0baff15dcd51e82e8bfec6d12ec60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 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 ZYUxu|%TwEnQP(5^nyPv#wMzC8{{u{-#zX)B diff --git a/ServiceApp/res/drawable-xxxhdpi/ic_person_black_24dp.png b/ServiceApp/res/drawable-xxxhdpi/ic_person_black_24dp.png deleted file mode 100755 index 3b55aa12b0eb98691f51bd11fa878311ad710939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmV;(0yq7MP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00KZsL_t(|+U=UpY7Y!v0ebETQf#_z*3r z!Ij`+=t{AYA{1<+BNh4}-3FqR7TUP<&&E#Mg|VBj-CW@coi= z?&RDFD2k#eilQirqNGWQ1w2|D5)yJi3y&(Le8^vCjqjK~)!{W$vgI#O=eVzYuR@+t zkg9);om1s|wauhN{TcQn=^G3_6?vb2bp37wQQyMFh|Tk7BMF*?dTf1zVNuS(d7LOf zD5Z_o66qTZo&^2N10GvZ>WHHI01Jur4TgF50X(Y!4fg?BRsovs0~}ff@ZARptpWrZ zz?y@+w@~hf_*LGI(W+H|IrjmIbQ0@-a-K@#BG+C<%}Eo8J@>nVg}V7%iPLReT16jeO$kK%RNT2 zXqx+cPF=oNpLoEzVd~FX^n3KVxHGJ6Yn79s>vwA<{g>e7A$0xedviHm{STSy8w?-0 znwEZv-OTm7(~#1Cyk0obPwh?qjm$>(?>gb8eSjrr`Ubq6h%=KMNt&xf8{qhD=Zi{pHid%0000=P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00d!4L_t(|+U;9eY)w%VU2WA&h-eKpHvJ>1ImX5mL4=SX zHAGF3_#`nmln{RK;X@=y1Rph~l&_){5o#u_QZcr~JQJNK!5-NRH2?BRAUleqRJ32Fj2387e@I%EyU=Q-;O0e6diOLNMjoq zrqjS2wt@LN4QyZ=*rd}yHrv1~agZ{o-(0JS{qN5+-4nDAQHHI+ zQJMm=NXHu|`Js4?$;32<7%QS~xJhmX_IM2a%vn5#X`hSyel+i^>O8EMatzKZkY9z1 zw(sqkD&&VE!$y8nJW*qy9L?kg)~k^pij7kFUGPPffv-rG891m)ekhJebQt0mdU$g8LXiXeWuAeaD6<^k7#bVdn;_Scy^QR$3-o*|`Mln=0b&Em+PUFx57p?v6XmLAHyzcd~b$ZZ0KF3*@l& z{jOr>6xMs;2%5WA#W7fA{JHb2m`xi+C6@cug1lfDYLOM|5(Dd5|5{s*3_}gHVjXN? zz2~2S&xWBA{!2UftzYtEjZ3Y*6>kIM8VC$bWag?UqL$kkrI0`;;~IwauiXq$VD?sl4a~$Ns;JW=A1>*m&+U^p3d6j>;?Ri zvM-)mmfg8jESkUllh#E&bDCapXnYh?vFQEflsK@T=NTw+YCcs`v6%9YjdPb{W9vH4 zz&syXi}_Tp45nGzfT9g04NGYbySElIxbNO8&O_DlSy`G&1ESN)Y<2R5=f$0jH9+l# z#fkk|RR%2XOf-qOcu{v@d24058Us^odvfPg$j`U02l^``er^D$tz2ep4!5uW&3 zD*c7FQE!8O!vTz>DK?RL;od8rV>~g9qT9URqPA8N;D}`rJHkq`RgFaKcapyst^cS( zGV#!ten*Y|S!sAS=3p#kN|8-kyTx7*r70YTaX22%SxaPf*uQi5YgAfip`*t$!;HP7 znwfo?XCAPQ&V~xzmai1EL3h|CD{}oh%U&me0X(0Q56(_X? z{-1!dbQ+k=HZVh{fgx-I{dF4P{}r({l;SzF$Eg+*7+3PkDIp9HAV7cs0er#_=WN)d Tv8ld300000NkvXXu0mjfLCH4e diff --git a/ServiceApp/res/drawable-xxxhdpi/ic_settings_ethernet_black_24dp.png b/ServiceApp/res/drawable-xxxhdpi/ic_settings_ethernet_black_24dp.png deleted file mode 100755 index 2cd69e5631382a44bfbbd3249312cbc525529108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1042 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 XMgC>C2dY#bp6QJZ%=Q1(b$j+duu(}> diff --git a/ServiceApp/res/drawable/action_button_install_bg.xml b/ServiceApp/res/drawable/action_button_install_bg.xml deleted file mode 100644 index 1de45da804..0000000000 --- a/ServiceApp/res/drawable/action_button_install_bg.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ServiceApp/res/drawable/action_button_open_bg.xml b/ServiceApp/res/drawable/action_button_open_bg.xml deleted file mode 100644 index b0b281017c..0000000000 --- a/ServiceApp/res/drawable/action_button_open_bg.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ServiceApp/res/drawable/vpi__dark_theme.xml b/ServiceApp/res/drawable/vpi__dark_theme.xml deleted file mode 100644 index 9a3693eac8..0000000000 --- a/ServiceApp/res/drawable/vpi__dark_theme.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/ServiceApp/res/drawable/vpi__light_theme.xml b/ServiceApp/res/drawable/vpi__light_theme.xml deleted file mode 100644 index f955db7205..0000000000 --- a/ServiceApp/res/drawable/vpi__light_theme.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/ServiceApp/res/drawable/vpi__tab_indicator.xml b/ServiceApp/res/drawable/vpi__tab_indicator.xml deleted file mode 100644 index 520d08c252..0000000000 --- a/ServiceApp/res/drawable/vpi__tab_indicator.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/ServiceApp/res/layout/activity_main.xml b/ServiceApp/res/layout/activity_main.xml deleted file mode 100644 index a9939dda0f..0000000000 --- a/ServiceApp/res/layout/activity_main.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/ServiceApp/res/layout/activity_tlog_file_selector.xml b/ServiceApp/res/layout/activity_tlog_file_selector.xml deleted file mode 100644 index e8db2df669..0000000000 --- a/ServiceApp/res/layout/activity_tlog_file_selector.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/ServiceApp/res/layout/activity_usb_intent_receiver.xml b/ServiceApp/res/layout/activity_usb_intent_receiver.xml deleted file mode 100644 index c8a5a808c2..0000000000 --- a/ServiceApp/res/layout/activity_usb_intent_receiver.xml +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/ServiceApp/res/layout/divider_view.xml b/ServiceApp/res/layout/divider_view.xml deleted file mode 100644 index 431331d0a9..0000000000 --- a/ServiceApp/res/layout/divider_view.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/ServiceApp/res/layout/fragment_app_connections.xml b/ServiceApp/res/layout/fragment_app_connections.xml deleted file mode 100644 index afe3005d60..0000000000 --- a/ServiceApp/res/layout/fragment_app_connections.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/ServiceApp/res/layout/fragment_connections.xml b/ServiceApp/res/layout/fragment_connections.xml deleted file mode 100644 index 81f6fac3be..0000000000 --- a/ServiceApp/res/layout/fragment_connections.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/ServiceApp/res/layout/fragment_recommended_apps.xml b/ServiceApp/res/layout/fragment_recommended_apps.xml deleted file mode 100644 index 02b49b8ad1..0000000000 --- a/ServiceApp/res/layout/fragment_recommended_apps.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/ServiceApp/res/layout/item_recommended_app_info.xml b/ServiceApp/res/layout/item_recommended_app_info.xml deleted file mode 100644 index df41a8dde0..0000000000 --- a/ServiceApp/res/layout/item_recommended_app_info.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - -