From e7f7f351d3daae5d1c4832e0e30252e3f563f14f Mon Sep 17 00:00:00 2001 From: "daniel.chen" Date: Mon, 1 Aug 2022 20:15:11 +0800 Subject: [PATCH] update 4.16.2 --- Sample Code/app/build.gradle | 4 +- .../flightcontroller/VirtualStickView.java | 147 ++++++-------- .../DualRemoteControllerView.java | 180 ++++++++++++++++++ .../sample/demo/utmiss/UTMISSActivity.java | 19 +- .../sample/internal/view/DemoListView.java | 5 +- .../layout/view_dual_remote_controller.xml | 48 +++++ .../app/src/main/res/values/strings.xml | 1 + 7 files changed, 300 insertions(+), 104 deletions(-) create mode 100644 Sample Code/app/src/main/java/com/dji/sdk/sample/demo/remotecontroller/DualRemoteControllerView.java create mode 100644 Sample Code/app/src/main/res/layout/view_dual_remote_controller.xml diff --git a/Sample Code/app/build.gradle b/Sample Code/app/build.gradle index b3690c44..7281f7d1 100644 --- a/Sample Code/app/build.gradle +++ b/Sample Code/app/build.gradle @@ -77,7 +77,7 @@ android { dependencies { implementation 'androidx.multidex:multidex:2.0.0' implementation 'com.squareup:otto:1.3.8' - implementation('com.dji:dji-sdk:4.16.1', { + implementation('com.dji:dji-sdk:4.16.2', { /** * Uncomment the "library-anti-distortion" if your app does not need Anti Distortion for Mavic 2 Pro and Mavic 2 Zoom. * Uncomment the "fly-safe-database" if you need database for release, or we will download it when DJISDKManager.getInstance().registerApp @@ -87,7 +87,7 @@ dependencies { exclude module: 'library-anti-distortion' //exclude module: 'fly-safe-database' }) - compileOnly 'com.dji:dji-sdk-provided:4.16.1' + compileOnly 'com.dji:dji-sdk-provided:4.16.2' implementation 'androidx.appcompat:appcompat:1.0.0' implementation 'androidx.core:core:1.0.0' diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/flightcontroller/VirtualStickView.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/flightcontroller/VirtualStickView.java index 70114f53..afc08ed9 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/flightcontroller/VirtualStickView.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/flightcontroller/VirtualStickView.java @@ -39,19 +39,11 @@ import dji.sdk.flightcontroller.FlightController; import dji.sdk.flightcontroller.Simulator; -//TODO: Refactor needed /** * Class for virtual stick. */ -public class VirtualStickView extends RelativeLayout - implements View.OnClickListener, CompoundButton.OnCheckedChangeListener, PresentableView { - - private boolean yawControlModeFlag = true; - private boolean rollPitchControlModeFlag = true; - private boolean verticalControlModeFlag = true; - private boolean horizontalCoordinateFlag = true; - +public class VirtualStickView extends RelativeLayout implements View.OnClickListener, CompoundButton.OnCheckedChangeListener, PresentableView { private Button btnEnableVirtualStick; private Button btnDisableVirtualStick; private Button btnHorizontalCoordinate; @@ -73,7 +65,9 @@ public class VirtualStickView extends RelativeLayout private float roll; private float yaw; private float throttle; - private FlightControllerKey isSimulatorActived; + private boolean isSimulatorActived = false; + private FlightController flightController = null; + private Simulator simulator = null; public VirtualStickView(Context context) { super(context); @@ -111,13 +105,28 @@ protected void onDetachedFromWindow() { private void init(Context context) { LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE); layoutInflater.inflate(R.layout.view_virtual_stick, this, true); - - initAllKeys(); + initParams(); initUI(); } - private void initAllKeys() { - isSimulatorActived = FlightControllerKey.create(FlightControllerKey.IS_SIMULATOR_ACTIVE); + private void initParams() { + // We recommand you use the below settings, a standard american hand style. + if (flightController == null) { + if (ModuleVerificationUtil.isFlightControllerAvailable()) { + flightController = DJISampleApplication.getAircraftInstance().getFlightController(); + } + } + flightController.setVerticalControlMode(VerticalControlMode.VELOCITY); + flightController.setRollPitchControlMode(RollPitchControlMode.VELOCITY); + flightController.setYawControlMode(YawControlMode.ANGULAR_VELOCITY); + flightController.setRollPitchCoordinateSystem(FlightCoordinateSystem.BODY); + + // Check if the simulator is activated. + if (simulator == null) { + simulator = ModuleVerificationUtil.getSimulator(); + } + isSimulatorActived = simulator.isSimulatorActive(); + } private void initUI() { @@ -145,15 +154,13 @@ private void initUI() { btnTakeOff.setOnClickListener(this); btnSimulator.setOnCheckedChangeListener(VirtualStickView.this); - Boolean isSimulatorOn = (Boolean) KeyManager.getInstance().getValue(isSimulatorActived); - if (isSimulatorOn != null && isSimulatorOn) { + if (isSimulatorActived) { btnSimulator.setChecked(true); textView.setText("Simulator is On."); } } private void setUpListeners() { - Simulator simulator = ModuleVerificationUtil.getSimulator(); if (simulator != null) { simulator.setStateCallback(new SimulatorState.Callback() { @Override @@ -173,7 +180,7 @@ public void onUpdate(@NonNull final SimulatorState simulatorState) { } }); } else { - ToastUtils.setResultToToast("Disconnected!"); + ToastUtils.setResultToToast("Simulator disconnected!"); } screenJoystickLeft.setJoystickListener(new OnScreenJoystickListener() { @@ -190,15 +197,8 @@ public void onTouch(OnScreenJoystick joystick, float pX, float pY) { float pitchJoyControlMaxSpeed = 10; float rollJoyControlMaxSpeed = 10; - if (horizontalCoordinateFlag) { - if (rollPitchControlModeFlag) { - pitch = (float) (pitchJoyControlMaxSpeed * pX); - roll = (float) (rollJoyControlMaxSpeed * pY); - } else { - pitch = - (float) (pitchJoyControlMaxSpeed * pY); - roll = (float) (rollJoyControlMaxSpeed * pX); - } - } + pitch = pitchJoyControlMaxSpeed * pY; + roll = rollJoyControlMaxSpeed * pX; if (null == sendVirtualStickDataTimer) { sendVirtualStickDataTask = new SendVirtualStickDataTask(); @@ -219,7 +219,7 @@ public void onTouch(OnScreenJoystick joystick, float pX, float pY) { if (Math.abs(pY) < 0.02) { pY = 0; } - float verticalJoyControlMaxSpeed = 2; + float verticalJoyControlMaxSpeed = 4; float yawJoyControlMaxSpeed = 20; yaw = yawJoyControlMaxSpeed * pX; @@ -270,72 +270,45 @@ public void onResult(DJIError djiError) { break; case R.id.btn_roll_pitch_control_mode: - if (rollPitchControlModeFlag) { + if (flightController.getRollPitchControlMode() == RollPitchControlMode.VELOCITY) { flightController.setRollPitchControlMode(RollPitchControlMode.ANGLE); - rollPitchControlModeFlag = false; } else { flightController.setRollPitchControlMode(RollPitchControlMode.VELOCITY); - rollPitchControlModeFlag = true; - } - try { - ToastUtils.setResultToToast(flightController.getRollPitchControlMode().name()); - } catch (Exception ex) { } + ToastUtils.setResultToToast(flightController.getRollPitchControlMode().name()); break; - case R.id.btn_yaw_control_mode: - if (yawControlModeFlag) { + if (flightController.getYawControlMode() == YawControlMode.ANGULAR_VELOCITY) { flightController.setYawControlMode(YawControlMode.ANGLE); - yawControlModeFlag = false; } else { flightController.setYawControlMode(YawControlMode.ANGULAR_VELOCITY); - yawControlModeFlag = true; - } - try { - ToastUtils.setResultToToast(flightController.getYawControlMode().name()); - } catch (Exception ex) { } + ToastUtils.setResultToToast(flightController.getYawControlMode().name()); break; - case R.id.btn_vertical_control_mode: - if (verticalControlModeFlag) { + if (flightController.getVerticalControlMode() == VerticalControlMode.VELOCITY) { flightController.setVerticalControlMode(VerticalControlMode.POSITION); - verticalControlModeFlag = false; } else { flightController.setVerticalControlMode(VerticalControlMode.VELOCITY); - verticalControlModeFlag = true; - } - try { - ToastUtils.setResultToToast(flightController.getVerticalControlMode().name()); - } catch (Exception ex) { } + ToastUtils.setResultToToast(flightController.getVerticalControlMode().name()); break; - case R.id.btn_horizontal_coordinate: - if (horizontalCoordinateFlag) { + if (flightController.getRollPitchCoordinateSystem() == FlightCoordinateSystem.BODY) { flightController.setRollPitchCoordinateSystem(FlightCoordinateSystem.GROUND); - horizontalCoordinateFlag = false; } else { flightController.setRollPitchCoordinateSystem(FlightCoordinateSystem.BODY); - horizontalCoordinateFlag = true; - } - try { - ToastUtils.setResultToToast(flightController.getRollPitchCoordinateSystem().name()); - } catch (Exception ex) { } + ToastUtils.setResultToToast(flightController.getRollPitchCoordinateSystem().name()); break; - case R.id.btn_take_off: - flightController.startTakeoff(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { DialogUtils.showDialogBasedOnError(getContext(), djiError); } }); - break; - default: break; } @@ -349,29 +322,27 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean b) { } private void onClickSimulator(boolean isChecked) { - Simulator simulator = ModuleVerificationUtil.getSimulator(); if (simulator == null) { return; } if (isChecked) { - textView.setVisibility(VISIBLE); - - simulator.start(InitializationData.createInstance(new LocationCoordinate2D(23, 113), 10, 10), - new CommonCallbacks.CompletionCallback() { - @Override - public void onResult(DJIError djiError) { - - } - }); + simulator.start(InitializationData.createInstance(new LocationCoordinate2D(23, 113), 10, 10), new CommonCallbacks.CompletionCallback() { + @Override + public void onResult(DJIError djiError) { + if (djiError != null) { + ToastUtils.setResultToToast(djiError.getDescription()); + } + } + }); } else { - textView.setVisibility(INVISIBLE); - simulator.stop(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - + if (djiError != null) { + ToastUtils.setResultToToast(djiError.getDescription()); + } } }); } @@ -383,22 +354,18 @@ public int getDescription() { } private class SendVirtualStickDataTask extends TimerTask { - @Override public void run() { - if (ModuleVerificationUtil.isFlightControllerAvailable()) { - DJISampleApplication.getAircraftInstance() - .getFlightController() - .sendVirtualStickFlightControlData(new FlightControlData(pitch, - roll, - yaw, - throttle), - new CommonCallbacks.CompletionCallback() { - @Override - public void onResult(DJIError djiError) { - - } - }); + if (flightController != null) { + //接口写反了,setPitch()应该传入roll值,setRoll()应该传入pitch值 + flightController.sendVirtualStickFlightControlData(new FlightControlData(roll, pitch, yaw, throttle), new CommonCallbacks.CompletionCallback() { + @Override + public void onResult(DJIError djiError) { + if (djiError != null) { + ToastUtils.setResultToToast(djiError.getDescription()); + } + } + }); } } } diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/remotecontroller/DualRemoteControllerView.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/remotecontroller/DualRemoteControllerView.java new file mode 100644 index 00000000..62fabec2 --- /dev/null +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/remotecontroller/DualRemoteControllerView.java @@ -0,0 +1,180 @@ +package com.dji.sdk.sample.demo.remotecontroller; + +import android.app.Service; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.dji.sdk.sample.R; +import com.dji.sdk.sample.internal.controller.DJISampleApplication; +import com.dji.sdk.sample.internal.utils.ModuleVerificationUtil; +import com.dji.sdk.sample.internal.utils.ToastUtils; +import com.dji.sdk.sample.internal.view.PresentableView; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import dji.common.error.DJIError; +import dji.common.remotecontroller.RCMode; +import dji.keysdk.DJIKey; +import dji.keysdk.FlightControllerKey; +import dji.keysdk.KeyManager; +import dji.keysdk.RemoteControllerKey; +import dji.keysdk.callback.ActionCallback; +import dji.keysdk.callback.KeyListener; +import dji.midware.data.model.P3.DataGetPushMultiRcAuthOwnerStatus; +import dji.midware.data.model.P3.DataMultiRcControlAuthoritySurpass; +import dji.sdk.remotecontroller.RemoteController; + +public class DualRemoteControllerView extends RelativeLayout implements PresentableView { + TextView dualRemoteControllerStatus = null; + Button channelAPairing = null; + Button channelBPairing = null; + Button takeGimbalControl = null; + Button takeAircraftControl = null; + + RemoteController remoteController = null; + + public DualRemoteControllerView(Context context) { + super(context); + initUI(context); + initModule(); + initListener(); + } + + void initUI(Context context) { + setClickable(true); + LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE); + layoutInflater.inflate(R.layout.view_dual_remote_controller, this, true); + dualRemoteControllerStatus = findViewById(R.id.dual_remote_controller_status); + channelAPairing = findViewById(R.id.channel_A_pairing); + channelBPairing = findViewById(R.id.channel_B_pairing); + takeGimbalControl = findViewById(R.id.take_gimbal_control); + takeAircraftControl = findViewById(R.id.take_aircraft_control); + } + + void initModule() { + if (ModuleVerificationUtil.isRemoteControllerAvailable()) { + remoteController = DJISampleApplication.getAircraftInstance().getRemoteController(); + } + } + + void initListener() { + channelAPairing.setOnClickListener(view -> { + if (remoteController != null) { + remoteController.startModePairing(RCMode.CHANNEL_A, djiError -> { + if (djiError == null) { + ToastUtils.setResultToToast("startModePairing with channel A successfully."); + if (dualRemoteControllerStatus != null) { + dualRemoteControllerStatus.setText("The current remote controller is using Channel A."); + } + } else { + ToastUtils.setResultToToast("startModePairing with channel A failed, description: " + djiError.getDescription()); + } + }); + } + }); + channelBPairing.setOnClickListener(view -> { + if (remoteController != null) { + remoteController.startModePairing(RCMode.CHANNEL_B, djiError -> { + if (djiError == null) { + ToastUtils.setResultToToast("startModePairing with channel B successfully."); + if (dualRemoteControllerStatus != null) { + dualRemoteControllerStatus.setText("The current remote controller is using Channel B."); + } + } else { + ToastUtils.setResultToToast("startModePairing with channel B failed, description: " + djiError.getDescription()); + } + }); + } + }); + takeGimbalControl.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (remoteController != null) { + ArrayList authorityArrayList = new ArrayList<>(); + authorityArrayList.add(DataMultiRcControlAuthoritySurpass.RCAuthority.Gimbal1ControlAuth); + authorityArrayList.add(DataMultiRcControlAuthoritySurpass.RCAuthority.Gimbal2ControlAuth); + authorityArrayList.add(DataMultiRcControlAuthoritySurpass.RCAuthority.Gimbal3ControlAuth); + remoteController.setRCAuthSurpass(authorityArrayList, djiError -> { + if (djiError == null) { + ToastUtils.setResultToToast("This RC has taken all gimbals control"); + } else { + ToastUtils.setResultToToast("Take gimbal control failed, description: " + djiError.getDescription()); + } + }); + } + } + }); + takeAircraftControl.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (remoteController != null) { + ArrayList authorityArrayList = new ArrayList<>(); + authorityArrayList.add(DataMultiRcControlAuthoritySurpass.RCAuthority.FlightControlAuth); + remoteController.setRCAuthSurpass(authorityArrayList, djiError -> { + if (djiError == null) { + ToastUtils.setResultToToast("This RC has taken the aircraft control"); + } else { + ToastUtils.setResultToToast("Take aircraft control failed, description: " + djiError.getDescription()); + } + }); + } + } + }); + DJIKey multiRCControlAuthoritySurpass = RemoteControllerKey.create(RemoteControllerKey.MULTI_RC_GIMBALS_CONTROL_AUTH_OWNER); + KeyManager.getInstance().addListener(multiRCControlAuthoritySurpass, new KeyListener() { + @Override + public void onValueChange(@Nullable Object oldValue, @Nullable Object newValue) { + if (newValue != null) { + DataGetPushMultiRcAuthOwnerStatus.RCModeChannel[] rcModeChannel = (DataGetPushMultiRcAuthOwnerStatus.RCModeChannel[]) newValue; + StringBuilder sb = new StringBuilder(); + sb.append("Current RC's control: \n"); + for (int i = 0; i < rcModeChannel.length; i++) { + sb.append(rcModeChannel[i].name()); + sb.append("\n"); + } + ToastUtils.setResultToToast(sb.toString()); + } + } + }); + DJIKey multiRCFlightControlAuthOwner = FlightControllerKey.createFlightAssistantKey(FlightControllerKey.MULTI_RC_FLIGHT_CONTROL_AUTH_OWNER); + KeyManager.getInstance().addListener(multiRCFlightControlAuthOwner, new KeyListener() { + @Override + public void onValueChange(@Nullable Object oldValue, @Nullable Object newValue) { + if (newValue != null) { + DataGetPushMultiRcAuthOwnerStatus.RCModeChannel controlAuth = (DataGetPushMultiRcAuthOwnerStatus.RCModeChannel) newValue; + ToastUtils.setResultToToast("RC flight control auth belongs to " + controlAuth.name()); + } + } + }); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + @Override + public int getDescription() { + return R.string.component_listview_dual_remote_controller; + } + + @NonNull + @NotNull + @Override + public String getHint() { + return this.getClass().getSimpleName() + ".java"; + } +} diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java index 0ef7283f..5a2b39dd 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java @@ -26,13 +26,21 @@ public class UTMISSActivity extends AppCompatActivity { + @BindView(R.id.txt_db_path) TextView mTvDbPath; + @BindView(R.id.txt_status) TextView mTvStatus; + @BindView(R.id.txt_info) TextView mTvInfo; + @BindView(R.id.edt_token_key) EditText mEdtTokenKey; + @BindView(R.id.edt_manufactureId) EditText mEdtManufactureId; + @BindView(R.id.edt_uasId) EditText mEdtUasId; + + @BindView(R.id.btn_start) Button mBtnInit; String dbPath; @@ -42,17 +50,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_utmiss); ButterKnife.bind(this); - initUI(); - } - - private void initUI(){ - mTvDbPath = findViewById(R.id.txt_db_path); - mTvStatus = findViewById(R.id.txt_status); - mTvInfo = findViewById(R.id.txt_info); - mEdtTokenKey = findViewById(R.id.edt_token_key); - mEdtManufactureId = findViewById(R.id.edt_manufactureId); - mEdtUasId = findViewById(R.id.edt_uasId); - mBtnInit = findViewById(R.id.btn_start); init(); } diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/DemoListView.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/DemoListView.java index 5289917b..15583d0f 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/DemoListView.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/DemoListView.java @@ -52,6 +52,7 @@ import com.dji.sdk.sample.demo.missionoperator.WaypointV2MissionOperatorView; import com.dji.sdk.sample.demo.mobileremotecontroller.MobileRemoteControllerView; import com.dji.sdk.sample.demo.radar.RadarView; +import com.dji.sdk.sample.demo.remotecontroller.DualRemoteControllerView; import com.dji.sdk.sample.demo.remotecontroller.PushRemoteControllerDataView; import com.dji.sdk.sample.demo.timeline.TimelineMissionControlView; import com.dji.sdk.sample.demo.useraccount.LDMView; @@ -201,7 +202,9 @@ private void initView(Context context) { new GroupItem(R.string.remote_controller_listview_push_info, PushRemoteControllerDataView.class), new GroupItem(R.string.component_listview_mobile_remote_controller, - MobileRemoteControllerView.class)); + MobileRemoteControllerView.class), + new GroupItem(R.string.component_listview_dual_remote_controller, + DualRemoteControllerView.class)); // Set-up ExpandableListView expandableListView = (ExpandableListView) view.findViewById(R.id.expandable_list); diff --git a/Sample Code/app/src/main/res/layout/view_dual_remote_controller.xml b/Sample Code/app/src/main/res/layout/view_dual_remote_controller.xml new file mode 100644 index 00000000..5bad6b06 --- /dev/null +++ b/Sample Code/app/src/main/res/layout/view_dual_remote_controller.xml @@ -0,0 +1,48 @@ + + + + + + + + + +