diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f16bba90..20e2cefa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,9 @@ + + + @@ -110,6 +113,17 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/aros/apron/activity/MainActivity.kt b/app/src/main/java/com/aros/apron/activity/MainActivity.kt index b71585ba..d5eab416 100644 --- a/app/src/main/java/com/aros/apron/activity/MainActivity.kt +++ b/app/src/main/java/com/aros/apron/activity/MainActivity.kt @@ -733,6 +733,7 @@ open class MainActivity : BaseActivity() { startVtxHeartbeat() SpeakerManager.getInstance().initMegaphoneInfo() + GimbalManager.getInstance().setmode() //GimbalManager.getInstance().gimsetmode() @@ -799,7 +800,7 @@ open class MainActivity : BaseActivity() { GeoidManager.getInstance().init(this); - + GimbalManager.getInstance().setmode() //GimbalManager.getInstance().gimsetmode() //开启雷达监听器 //PerceptionManager.getInstance().isladraopeninti() @@ -821,8 +822,6 @@ open class MainActivity : BaseActivity() { LogUtil.log(TAG, "推流类型:" + PreferenceUtils.getInstance().customStreamType) } - - } else { if ((isFlightControllerConnect == null || isFlightControllerConnect != true) && (isCameraConnect == null || isCameraConnect != true)) { handler.postDelayed({ @@ -869,7 +868,7 @@ open class MainActivity : BaseActivity() { //开启雷达监听器 //PerceptionManager.getInstance().isladraopeninti() - + GimbalManager.getInstance().setmode() LogUtil.log(TAG, "自定义推流方式:" + PreferenceUtils.getInstance().customStreamType) @@ -1261,6 +1260,12 @@ open class MainActivity : BaseActivity() { FLAG_STOP_ARUCO -> startArucoType = 0 + "REFRESH_VIDEO_SOURCE" -> { + // 起飞后刷新视频源,避免FPVWidget因相机状态变化卡死 + swapVideoSource() + LogUtil.log(TAG,"刷新视频流") + } + MqttCallBack.FLAG_RESET_CLEAN_MODE -> setViewVisibilityWithCleanMode() } diff --git a/app/src/main/java/com/aros/apron/callback/MqttCallBack.java b/app/src/main/java/com/aros/apron/callback/MqttCallBack.java index 248ef6d6..68495102 100644 --- a/app/src/main/java/com/aros/apron/callback/MqttCallBack.java +++ b/app/src/main/java/com/aros/apron/callback/MqttCallBack.java @@ -30,6 +30,7 @@ import com.aros.apron.manager.StickManager; import com.aros.apron.manager.StreamManager; import com.aros.apron.manager.SystemManager; import com.aros.apron.manager.TakeOffToPointManager; +import com.aros.apron.manager.UpdateManager; import com.aros.apron.mix.Aprondown; import com.aros.apron.mix.Aprongim; import com.aros.apron.tools.ApronArucoDetect; @@ -600,6 +601,20 @@ public class MqttCallBack extends BaseManager implements MqttCallbackExtended { } break; + case Constant.APP_UPDATE: + LogUtil.log(TAG, "收到:远程更新 " + jsonString); + String apkUrl = message.getData() != null ? message.getData().getUrl() : null; + if (apkUrl != null && !apkUrl.isEmpty()) { + UpdateManager.getInstance().startUpdate( + ApronApp.Companion.getApplication(), + apkUrl, + () -> sendMsg2Server(message) + ); + } else { + LogUtil.log(TAG, "更新APK链接为空"); + sendFailMsg2Server(message, "更新APK链接为空"); + } + break; // //获取控制权 // case 60007: diff --git a/app/src/main/java/com/aros/apron/constant/Constant.java b/app/src/main/java/com/aros/apron/constant/Constant.java index a2b2033e..7482d847 100644 --- a/app/src/main/java/com/aros/apron/constant/Constant.java +++ b/app/src/main/java/com/aros/apron/constant/Constant.java @@ -342,9 +342,12 @@ public class Constant { //A1云台校准 public static final String DRC_LIGHT_CALIBRATION="drc_light_calibration"; - - - - + /** + * 远程更新APK + */ + public static final String APP_UPDATE="app_update"; } + + + diff --git a/app/src/main/java/com/aros/apron/manager/CameraManager.java b/app/src/main/java/com/aros/apron/manager/CameraManager.java index 4ffd222c..fade1a4d 100644 --- a/app/src/main/java/com/aros/apron/manager/CameraManager.java +++ b/app/src/main/java/com/aros/apron/manager/CameraManager.java @@ -173,6 +173,12 @@ public class CameraManager extends BaseManager { Movement.getInstance().setPhoto_status("fail"); Movement.getInstance().setMode_code(3); stopReport(); + }else if(t1 == PanoramaExitStatus.ABORTED){ + Movement.getInstance().setPhoto_current_step(3000); + Movement.getInstance().setPhoto_result(0); + Movement.getInstance().setPhoto_status("fail"); + Movement.getInstance().setMode_code(3); + stopReport(); } } } diff --git a/app/src/main/java/com/aros/apron/manager/FlightManager.java b/app/src/main/java/com/aros/apron/manager/FlightManager.java index 6a0cb38a..db7c0c60 100644 --- a/app/src/main/java/com/aros/apron/manager/FlightManager.java +++ b/app/src/main/java/com/aros/apron/manager/FlightManager.java @@ -914,9 +914,11 @@ public class FlightManager extends BaseManager { //降落时将云台朝下 private void gimbalDownwards() { - if (goHomeExecutionState == GoHomeState.LANDING.value() && Movement.getInstance().getElevation() > 11 && !isGimbalDownwards) { + + + MediaDataCenter.getInstance().getCameraStreamManager().setVisionAssistViewDirection(VisionAssistDirection.DOWN, new CommonCallbacks.CompletionCallback() { @Override public void onSuccess() { @@ -951,12 +953,18 @@ public class FlightManager extends BaseManager { DroneHelper.getInstance().setCameraFocusMode(); + + new android.os.Handler().postDelayed(() -> { setkuaim(); }, 500); new android.os.Handler().postDelayed(() -> { setCameraExposureMode(); }, 500); + + new android.os.Handler().postDelayed(() -> { + EventBus.getDefault().post("REFRESH_VIDEO_SOURCE"); + }, 2000); //将镜头设置为自动对焦 // new android.os.Handler().postDelayed(() -> { // setCameraExposureCompensation(); @@ -1342,30 +1350,35 @@ public class FlightManager extends BaseManager { if (!getGimbalAndCameraEnabled()) { return; } + GimbalManager.getInstance().gimbalReset(); + + new Handler().postDelayed(() -> { + if (Movement.getInstance().isPlaneWing() && Movement.getInstance().getHome_distance() < 20 + && Movement.getInstance().getElevation() < 88 + && Movement.getInstance().getBattery_a_capacity_percent() > 25 + && ((flightMode != null && flightMode == FlightMode.WAYPOINT) || + (flightMode != null && flightMode == FlightMode.AUTO_TAKE_OFF))) { + WayLineExecutingInterruptManager.getInstance().onExecutingInterruptToDo(); + } else { + Boolean isConnect = KeyManager.getInstance().getValue(createKey(FlightControllerKey.KeyConnection)); + + KeyManager.getInstance().performAction(createKey(FlightControllerKey.KeyStartGoHome), new CommonCallbacks.CompletionCallbackWithParam() { + @Override + public void onSuccess(EmptyMsg emptyMsg) { + sendMsg2Server(message); + } + + @Override + public void onFailure(@NonNull IDJIError error) { + sendFailMsg2Server(message, "返航执行失败:" + getIDJIErrorMsg(error)); + } + }); + + } - if (Movement.getInstance().isPlaneWing() && Movement.getInstance().getHome_distance() < 20 - && Movement.getInstance().getElevation() < 88 - && Movement.getInstance().getBattery_a_capacity_percent() > 25 - && ((flightMode != null && flightMode == FlightMode.WAYPOINT) || - (flightMode != null && flightMode == FlightMode.AUTO_TAKE_OFF))) { - WayLineExecutingInterruptManager.getInstance().onExecutingInterruptToDo(); - } else { - Boolean isConnect = KeyManager.getInstance().getValue(createKey(FlightControllerKey.KeyConnection)); - KeyManager.getInstance().performAction(createKey(FlightControllerKey.KeyStartGoHome), new CommonCallbacks.CompletionCallbackWithParam() { - @Override - public void onSuccess(EmptyMsg emptyMsg) { - sendMsg2Server(message); - } - - @Override - public void onFailure(@NonNull IDJIError error) { - sendFailMsg2Server(message, "返航执行失败:" + getIDJIErrorMsg(error)); - } - }); - - } + },1000); } diff --git a/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java b/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java index c80f0e2b..5f9ccce7 100644 --- a/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java +++ b/app/src/main/java/com/aros/apron/manager/FlightTaskProgressManager.java @@ -32,7 +32,7 @@ public class FlightTaskProgressManager extends BaseManager { //如果是一键起飞航线或之后的指点飞行,这个就不用发,除此之外航线以及指点飞行都要发 if (PreferenceUtils.getInstance().getMissionType()==0&& (Movement.getInstance().isPlaneWing() - || Movement.getInstance().isMotorsOn()) && Movement.getInstance().isWaylineinterpter() ) { + || Movement.getInstance().isMotorsOn()) && Movement.getInstance().isWaylineinterpter()) { sendFlightTaskProgress2Server(); } diff --git a/app/src/main/java/com/aros/apron/manager/GimbalManager.java b/app/src/main/java/com/aros/apron/manager/GimbalManager.java index 2d81356f..de754e70 100644 --- a/app/src/main/java/com/aros/apron/manager/GimbalManager.java +++ b/app/src/main/java/com/aros/apron/manager/GimbalManager.java @@ -169,6 +169,22 @@ public class GimbalManager extends BaseManager { VirtualStickManager.getInstance().sendVirtualStickAdvancedParam(virtualStickFlightControlParam); } + public void setmode() { + + KeyManager.getInstance().setValue(KeyTools.createKey(GimbalKey.KeyGimbalMode, ComponentIndexType.PORT_1), GimbalMode.YAW_FOLLOW, new CommonCallbacks.CompletionCallback() { + @Override + public void onSuccess() { + LogUtil.log(TAG, "云台跟随"); + } + + @Override + public void onFailure(@NonNull IDJIError idjiError) { + LogUtil.log(TAG, "云台跟随失败"); + } + }); + + + } //云台重置 public void gimbalReset() { @@ -255,6 +271,10 @@ public class GimbalManager extends BaseManager { case 3: GimbalAngleRotation rotation1 = new GimbalAngleRotation(); rotation1.setMode(GimbalAngleRotationMode.ABSOLUTE_ANGLE); + if (!TextUtils.isEmpty(Movement.getInstance().getGimbal_yaw() + "")) { + rotation1.setYaw(Movement.getInstance().getGimbal_yaw()); + LogUtil.log(TAG,"俯仰向下"+Movement.getInstance().getGimbal_yaw()); + } rotation1.setPitch(-90.0); KeyManager.getInstance().performAction(KeyTools.createKey(GimbalKey.KeyRotateByAngle, ComponentIndexType.PORT_1), rotation1, new CommonCallbacks.CompletionCallbackWithParam() { @Override @@ -268,6 +288,22 @@ public class GimbalManager extends BaseManager { } } ); + +// GimbalAngleRotation rotation1 = new GimbalAngleRotation(); +// rotation1.setMode(GimbalAngleRotationMode.ABSOLUTE_ANGLE); +// rotation1.setPitch(-90.0); +// KeyManager.getInstance().performAction(KeyTools.createKey(GimbalKey.KeyRotateByAngle, ComponentIndexType.PORT_1), rotation1, new CommonCallbacks.CompletionCallbackWithParam() { +// @Override +// public void onSuccess(EmptyMsg emptyMsg) { +// sendMsg2Server(message); +// } +// +// @Override +// public void onFailure(@NonNull IDJIError error) { +// sendFailMsg2Server(message, "偏航向下失败:" + getIDJIErrorMsg(error)); +// } +// } +// ); break; } diff --git a/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java b/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java index 6461159d..d6e55464 100644 --- a/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java +++ b/app/src/main/java/com/aros/apron/manager/MissionV3Manager.java @@ -26,6 +26,8 @@ import com.dji.wpmzsdk.common.data.KMZInfo; import com.dji.wpmzsdk.manager.WPMZManager; import com.google.gson.Gson; +import org.greenrobot.eventbus.EventBus; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -270,8 +272,9 @@ public class MissionV3Manager extends BaseManager { Movement.getInstance().setVirtualStickQuitMission(false); sendEvent2Server("任务状态:航线任务执行中断", 1); - Movement.getInstance().setTask_status("paused"); + if(PreferenceUtils.getInstance().getMissionType()==0){ + Movement.getInstance().setTask_status("paused"); sendFlightTaskProgress2Server(); } @@ -805,14 +808,10 @@ public class MissionV3Manager extends BaseManager { sendEvent2Server("任务开始执行", 1); Movement.getInstance().setTask_current_step(23); -// Movement.getInstance().setMode_code(5); - -// // 自动起飞 -// Movement.getInstance().setMode_code(4); -// -// new android.os.Handler(android.os.Looper.getMainLooper()).postDelayed(() -> { -// Movement.getInstance().setMode_code(5); -// }, 2000); + // 起飞后相机状态变化可能导致FPVWidget卡死,延迟刷新视频源 + mainHandler.postDelayed(() -> { + EventBus.getDefault().post("REFRESH_VIDEO_SOURCE"); + }, 2000); } @@ -878,7 +877,13 @@ public class MissionV3Manager extends BaseManager { @Override public void onSuccess() { sendMsg2Server(message); - Movement.getInstance().setTask_status("paused"); + + if( PreferenceUtils.getInstance().getMissionType()==0){ + Movement.getInstance().setTask_status("paused"); + + sendFlightTaskProgress2Server(); + } + //暂停成功就是手动飞行 diff --git a/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java b/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java index 80d9f836..82c3d407 100644 --- a/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java +++ b/app/src/main/java/com/aros/apron/manager/TakeOffToPointManager.java @@ -33,6 +33,8 @@ import com.dji.wpmzsdk.common.data.KMZInfo; import com.dji.wpmzsdk.manager.WPMZManager; import com.google.gson.Gson; +import org.greenrobot.eventbus.EventBus; + import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -392,6 +394,12 @@ public class TakeOffToPointManager extends BaseManager { sendEvent2Server("任务开始执行", 1); Movement.getInstance().setTask_current_step(23); Movement.getInstance().setTakeoff_result(0); + + // 起飞后相机状态变化可能导致FPVWidget卡死,延迟刷新视频源 + mainHandler.postDelayed(() -> { + EventBus.getDefault().post("REFRESH_VIDEO_SOURCE"); + }, 2000); + } @Override