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 ) ;
2026-02-27 10:18:56 +08:00
VirtualStickManager . getInstance ( ) . disableVirtualStick ( new CommonCallbacks . CompletionCallback ( ) {
2026-01-30 11:47:32 +08:00
@Override
public void onSuccess ( ) {
LogUtil . log ( TAG , " 控制取消成功 " ) ;
2026-02-27 10:18:56 +08:00
VirtualStickManager . getInstance ( ) . setVirtualStickAdvancedModeEnabled ( false ) ;
2026-01-30 11:47:32 +08:00
}
@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);
// }
}