makcar/app/src/main/java/com/aros/apron/manager/StickManager.java

300 lines
13 KiB
Java
Raw Normal View History

2026-01-30 11:47:32 +08:00
package com.aros.apron.manager;
import static com.aros.apron.tools.Utils.getIDJIErrorMsg;
import static dji.sdk.keyvalue.key.KeyTools.createKey;
import android.os.Handler;
2026-02-10 20:46:40 +08:00
import android.os.Looper;
2026-01-30 11:47:32 +08:00
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.aros.apron.base.BaseManager;
import com.aros.apron.callback.MVirtualStickStateListener;
import com.aros.apron.entity.MessageDown;
import com.aros.apron.entity.Movement;
import com.aros.apron.tools.LogUtil;
import com.aros.apron.tools.Utils;
import dji.sdk.keyvalue.key.FlightControllerKey;
import dji.sdk.keyvalue.key.KeyTools;
import dji.sdk.keyvalue.value.common.EmptyMsg;
import dji.sdk.keyvalue.value.flightcontroller.FlightCoordinateSystem;
import dji.sdk.keyvalue.value.flightcontroller.FlightMode;
import dji.sdk.keyvalue.value.flightcontroller.RollPitchControlMode;
import dji.sdk.keyvalue.value.flightcontroller.VerticalControlMode;
import dji.sdk.keyvalue.value.flightcontroller.VirtualStickFlightControlParam;
import dji.sdk.keyvalue.value.flightcontroller.YawControlMode;
import dji.v5.common.callback.CommonCallbacks;
import dji.v5.common.error.IDJIError;
import dji.v5.manager.KeyManager;
import dji.v5.manager.aircraft.virtualstick.VirtualStickManager;
import dji.v5.manager.aircraft.waypoint3.WaypointMissionManager;
import dji.v5.manager.interfaces.IWaypointMissionManager;
public class StickManager extends BaseManager {
private StickManager() {
}
private static class StickHolder {
private static final StickManager INSTANCE = new StickManager();
}
public static StickManager getInstance() {
return StickHolder.INSTANCE;
}
public void initStickInfo() {
Boolean isConnect = KeyManager.getInstance().getValue(createKey(FlightControllerKey.KeyConnection));
if (isConnect != null && isConnect) {
VirtualStickManager.getInstance().setVirtualStickStateListener(new MVirtualStickStateListener());
}
}
public void enableVirtualStick1() {
VirtualStickManager.getInstance().setVirtualStickAdvancedModeEnabled(true);
VirtualStickManager.getInstance().enableVirtualStick(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
LogUtil.log(TAG, "控制权获取成功");
VirtualStickManager.getInstance().setVirtualStickAdvancedModeEnabled(true);
2026-02-10 20:46:40 +08:00
2026-01-30 11:47:32 +08:00
}
@Override
public void onFailure(@NonNull IDJIError error) {
LogUtil.log(TAG, "拖动控制权获取成功");
}
});
}
public void disableVirtualStick1() {
VirtualStickManager.getInstance().setVirtualStickAdvancedModeEnabled(false);
VirtualStickManager.getInstance().enableVirtualStick(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
LogUtil.log(TAG, "控制取消成功");
VirtualStickManager.getInstance().setVirtualStickAdvancedModeEnabled(true);
}
@Override
public void onFailure(@NonNull IDJIError error) {
LogUtil.log(TAG, "拖动控制权取消成功");
}
});
}
2026-02-10 20:46:40 +08:00
//取消虚拟摇杆控制权
2026-01-30 11:47:32 +08:00
public void enableVirtualStick(MessageDown message) {
2026-02-10 20:46:40 +08:00
//吐过开启了drc或者使用过摇杆
if(Movement.getInstance().isOpendrc()==false){
2026-01-30 11:47:32 +08:00
VirtualStickManager.getInstance().setVirtualStickAdvancedModeEnabled(true);
VirtualStickManager.getInstance().enableVirtualStick(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
2026-02-10 20:46:40 +08:00
Movement.getInstance().setOpendrc(true);
2026-01-30 11:47:32 +08:00
if (message != null) {
sendMsg2Server(message);
}
2026-02-10 20:46:40 +08:00
2026-01-30 11:47:32 +08:00
LogUtil.log(TAG, "控制权获取成功");
VirtualStickManager.getInstance().setVirtualStickAdvancedModeEnabled(true);
//获得过控制权
Movement.getInstance().setVirtualcontrollget(true);
}
@Override
public void onFailure(@NonNull IDJIError error) {
if (message != null) {
sendFailMsg2Server(message, "控制权获取失败:" + Utils.getIDJIErrorMsg(error));
}
}
});
2026-02-10 20:46:40 +08:00
}
2026-01-30 11:47:32 +08:00
}
//取消虚拟摇杆控制权
public void disableVirtualStick(MessageDown message) {
VirtualStickManager.getInstance().disableVirtualStick(new CommonCallbacks.CompletionCallback() {
@Override
public void onSuccess() {
if (message != null) {
sendMsg2Server(message);
2026-02-11 10:06:54 +08:00
2026-01-30 11:47:32 +08:00
if(Movement.getInstance().getFlightmode()==1){
Movement.getInstance().setMode_code(5);
}else if(Movement.getInstance().getFlightmode()==2){
Movement.getInstance().setMode_code(17);
}
2026-02-11 10:06:54 +08:00
2026-01-30 11:47:32 +08:00
Movement.getInstance().setOpendrc(false);
}
LogUtil.log(TAG, "控制权已取消");
Movement.getInstance().setVirtualcontrollget(false);
}
@Override
public void onFailure(@NonNull IDJIError error) {
if (message!=null){
sendFailMsg2Server(message,"控制权释放失败:"+ Utils.getIDJIErrorMsg(error));
}
LogUtil.log(TAG, "控制权释放失败:"+Utils.getIDJIErrorMsg(error));
}
});
}
//飞行控制权抢夺
public void setVirtualStickModeEnabled(MessageDown message) {
2026-02-10 20:46:40 +08:00
2026-02-01 14:34:23 +08:00
//Movement.getInstance().setMode_code(3);
2026-01-30 11:47:32 +08:00
//设置标志为
2026-02-10 20:46:40 +08:00
new Handler(Looper.getMainLooper()).postDelayed(() -> {
// 这里放你要延迟执行的代码
StickManager.getInstance().enableVirtualStick(message);
}, 2000);
//sendMsg2Server(message);
2026-01-30 11:47:32 +08:00
////// Boolean isConnect = KeyManager.getInstance().getValue(KeyTools.createKey(FlightControllerKey.KeyConnection));
////// if (isConnect != null && isConnect) {
////// FlightMode flightMode = KeyManager.getInstance().getValue(KeyTools.createKey(FlightControllerKey.KeyFlightMode));
////// LogUtil.log(TAG, "控制权抢夺当前飞机状态:" + flightMode.name());
////// if (flightMode != null) {
////// switch (flightMode) {
////// case GO_HOME:
////// KeyManager.getInstance().performAction(createKey(FlightControllerKey.KeyStopGoHome), new CommonCallbacks.CompletionCallbackWithParam<EmptyMsg>() {
////// @Override
////// public void onSuccess(EmptyMsg emptyMsg) {
////// sendMsg2Server(message);
////// }
////// @Override
////// public void onFailure(@NonNull IDJIError error) {
////// sendFailMsg2Server(message, "取消返航执行失败:" + getIDJIErrorMsg(error));
////// }
////// });
////// break;
////// case WAYPOINT:
////// IWaypointMissionManager missionManager = WaypointMissionManager.getInstance();
////// missionManager.stopMission(TextUtils.isEmpty(Movement.getInstance().getMissionName())
////// ? "aros" : Movement.getInstance().getMissionName(), new CommonCallbacks.CompletionCallback() {
////// @Override
////// public void onSuccess() {
////// new Handler().postDelayed(new Runnable() {
////// @Override
////// public void run() {
////// VirtualStickManager.getInstance().enableVirtualStick(new CommonCallbacks.CompletionCallback() {
////// @Override
////// public void onSuccess() {
////// sendMsg2Server( message);
////// LogUtil.log(TAG, "终止任务,控制权设置成功");
////// Movement.getInstance().setWaylineCanResume(true);
////// Movement.getInstance().setVirtualStickEnableReason(3);
////// Movement.getInstance().setVirtualStickQuitMission(true);
////// }
////// @Override
////// public void onFailure(@NonNull IDJIError error) {
////// sendFailMsg2Server( message, "控制权设置失败:" + getIDJIErrorMsg(error));
////// }
////// });
////// VirtualStickManager.getInstance().setVirtualStickAdvancedModeEnabled(true);
////// }
////// }, 400);
////// }
//////
////// @Override
////// public void onFailure(@NonNull IDJIError error) {
////// sendFailMsg2Server(message, "终止任务以获取控制权失败:" + getIDJIErrorMsg(error));
////// }
////// });
////// break;
////// case AUTO_LANDING:
////// KeyManager.getInstance().performAction(createKey(FlightControllerKey.KeyStopAutoLanding), new CommonCallbacks.CompletionCallbackWithParam<EmptyMsg>() {
////// @Override
////// public void onSuccess(EmptyMsg emptyMsg) {
////// sendMsg2Server(message);
////// }
//////
////// @Override
////// public void onFailure(@NonNull IDJIError error) {
////// sendFailMsg2Server(message, "取消降落执行失败:" + getIDJIErrorMsg(error));
////// }
////// });
////// break;
////// case VIRTUAL_STICK:
////// sendFailMsg2Server(message, "已获取控制权,无需重复获取");
////// break;
////// default:
////// sendMsg2Server(message);
////// break;
////// }
//// }
// }
//
}
//飞行器虚拟摇杆
public void sendVirtualStickAdvancedParam(MessageDown message) {
Boolean isConnect = KeyManager.getInstance().getValue(
KeyTools.createKey(FlightControllerKey.KeyConnection));
if (isConnect != null && isConnect ) {
if (!getGimbalAndCameraEnabled()){
return;
}
if (!Movement.getInstance().isPlaneWing()){
LogUtil.log(TAG,"飞机未起飞:禁止手控");
return;
}
VirtualStickFlightControlParam param = new VirtualStickFlightControlParam();
param.setRollPitchControlMode(RollPitchControlMode.VELOCITY);//
param.setYawControlMode(YawControlMode.ANGULAR_VELOCITY);
param.setVerticalControlMode(VerticalControlMode.VELOCITY);
param.setRollPitchCoordinateSystem(FlightCoordinateSystem.BODY);
if (!TextUtils.isEmpty(message.getData().getY())){
param.setPitch(Double.valueOf(message.getData().getY()));//左右(速度模式-10m/s-10m/s)
}
if (!TextUtils.isEmpty(message.getData().getX())){
param.setRoll(Double.valueOf(message.getData().getX()));//前后(速度模式-10m/s-10m/s)
}
if (!TextUtils.isEmpty(message.getData().getW())){
param.setYaw(Double.valueOf(message.getData().getW()));//旋转(角速度模式-100-100)
}
if (!TextUtils.isEmpty(message.getData().getH())){
param.setVerticalThrottle(Double.valueOf(message.getData().getH()));//上下(速度模式-4m/s-4m/s)
}
//手动飞行
Movement.getInstance().setMode_code(16);
VirtualStickManager.getInstance().sendVirtualStickAdvancedParam(param);
Movement.getInstance().setVirtualStickEnableReason(3);
// sendMsg2Server( message, "移动...");
}
// else {
// sendFailMsg2Server( message, "飞控未连接");
// }
}
//
//
// public void releaseStick(){
// VirtualStickManager.getInstance().setVirtualStickStateListener(null);
// }
}