From 19f86f46cbfecf37461f51b371636a8ae99b3bc4 Mon Sep 17 00:00:00 2001 From: aibingbing Date: Fri, 26 Aug 2022 19:17:58 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=85=E6=89=AB=E8=BD=A6]feat:=20=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=BC=82=E5=B8=B8=E6=83=85=E5=86=B5=EF=BC=8C=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E5=B1=95=E7=A4=BA=E6=93=8D=E4=BD=9C=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E6=97=B6=E6=A0=B9=E6=8D=AE=E9=80=8F=E5=87=BA=E7=9A=84?= =?UTF-8?q?=E5=BA=95=E7=9B=98=E6=95=B0=E6=8D=AE=E6=81=A2=E5=A4=8D=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8C=89=E9=92=AE=E7=8A=B6=E6=80=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sweeper/ui/SweeperOperatePanelView.java | 111 +++++++++++++++++- .../sweeper/util/SweeperFutianCmdUtil.java | 59 ++++++++++ 2 files changed, 169 insertions(+), 1 deletion(-) diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java index 1b40a8f95f..86ee7e3d0d 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java @@ -31,6 +31,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager; import com.mogo.eagle.core.utilcode.util.ThreadUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.module.common.view.OnPreventFastClickListener; import com.mogo.och.sweeper.R; import com.mogo.och.sweeper.util.SweeperFutianCmdUtil; @@ -557,6 +558,7 @@ public class SweeperOperatePanelView extends LinearLayout { getContext().getApplicationContext().getString(R.string.sweeper_operate_panel_cmd_execute_timeout), timeout )); + mLoadingHintBottom.setVisibility(timeout < 0 ? View.INVISIBLE : View.VISIBLE); }); } @@ -680,6 +682,11 @@ public class SweeperOperatePanelView extends LinearLayout { @Override public void onSweeperFutianCleanSystemState(@NonNull VehicleStateOuterClass.SweeperFuTianCleanSystemState cleanSystemState) { + // 第一次进入时同步底盘状态,只拿第一次的数据 + if (mSyncingVehicleState) { + onSyncVehicleStateCallBack(cleanSystemState); + return; + } // 有命令正在执行 if (mCurrentCmdRequestCallback != null) { if (mCurrentCmdRequestCallback.onCheckIfCmdSuccess(cleanSystemState)) { @@ -694,6 +701,12 @@ public class SweeperOperatePanelView extends LinearLayout { protected void onAttachedToWindow() { super.onAttachedToWindow(); CallerAutopilotVehicleStateListenerManager.INSTANCE.addListener(TAG, mIMoGoAutopilotVehicleStateListener); + syncVehicleStateAndRecoverOperatePanelStates(); + // TODO + // Mock VehicleState 数据回调 + UiThreadHandler.postDelayed(() -> { + onSyncVehicleStateCallBack(SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData()); + }, 3000L); } @Override @@ -702,6 +715,101 @@ public class SweeperOperatePanelView extends LinearLayout { CallerAutopilotVehicleStateListenerManager.INSTANCE.removeListener(TAG); } + /** + * 等待同步底盘数据,并根据底盘数据恢复操作面板中按钮的状态 + */ + private synchronized void syncVehicleStateAndRecoverOperatePanelStates() { + // show sync loading + showLoadingMask("状态同步中,请稍后", -1); + mSyncingVehicleState = true; + } + + private synchronized void onSyncVehicleStateCallBack(VehicleStateOuterClass.SweeperFuTianCleanSystemState cleanSystemState) { + if (cleanSystemState == null) return; + mSyncingVehicleState = false; + // 清扫作业开启状态(以电机状态为true代表Open成功,实际控制端控制步骤为:1.发送远程控制上装指令 2.发送电机启动指令) + boolean clean_open_requirement = cleanSystemState.getSecuMotWorkSts(); + // 作业模式状态 + // 洗扫 + boolean clean_mode_wash_sweep = cleanSystemState.getSecuModWashSweepSts(); + // 纯洗 + boolean clean_mode_pure_wash = cleanSystemState.getSecuModWashSts(); + // 纯吸 + boolean clean_mode_pure_draw = cleanSystemState.getSecuWorkTonSts(); + + // 清扫方向状态 + // 左侧 + boolean clean_direction_left_side = cleanSystemState.getSecuWorkLeftSts(); + // 右侧 + boolean clean_direction_right_side = cleanSystemState.getSecuWorkRightSts(); + // 两侧 + boolean clean_direction_both_side = cleanSystemState.getSecuWorkOnBothsidesSts(); + + // 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式 + boolean clean_mode_pure_sweep = (clean_direction_left_side || clean_direction_right_side || clean_direction_both_side) + && (!clean_mode_wash_sweep && !clean_mode_pure_wash && !clean_mode_pure_draw); + + // 作业强度状态 + boolean clean_intensity_standard = cleanSystemState.getSecuWorkStandSts(); + boolean clean_intensity_strong = cleanSystemState.getSecuWorkStrongSts(); + + runOnUIThread(() -> { + if (clean_open_requirement) { + // 打开状态 + mBtnCleanWorkOpenClose.setText("Close"); + mBtnCleanWorkOpenClose.setChecked(true); + } else { + // 关闭状态 + mBtnCleanWorkOpenClose.setText("Open"); + mBtnCleanWorkOpenClose.setChecked(false); + } + if (clean_mode_pure_sweep) { + //纯扫 + mBtnCleanModePureSweep.setChecked(true); + mBtnCleanModePureSweep.setEnabled(true); + toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_sweep, false); + } else if (clean_mode_pure_wash) { + //纯洗 + mBtnCleanModePureWash.setChecked(true); + mBtnCleanModePureWash.setEnabled(true); + toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_wash, false); + } else if (clean_mode_wash_sweep) { + //洗扫 + mBtnCleanModeSweepWash.setChecked(true); + mBtnCleanModeSweepWash.setEnabled(true); + toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_sweep_wash, false); + } else if (clean_mode_pure_draw) { + //纯吸,需要disable作业方向 + mBtnCleanModePureAbsorption.setChecked(true); + mBtnCleanModePureAbsorption.setEnabled(true); + toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_absorption, false); + toggleCleanDirectionBtnsStatus(false); + } + + if (!clean_mode_pure_draw) {// 非纯吸模式才有清扫方向 + if (clean_direction_left_side) { + mBtnCleanDirectionLeftSide.setChecked(true); + mBtnCleanDirectionLeftSide.setEnabled(true); + toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_left_side, false); + } else if (clean_direction_right_side) { + mBtnCleanDirectionRightSide.setChecked(true); + mBtnCleanDirectionRightSide.setEnabled(true); + toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_right_side, false); + } else if (clean_direction_both_side) { + mBtnCleanDirectionBothSide.setChecked(true); + mBtnCleanDirectionBothSide.setEnabled(true); + toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_both_side, false); + } + } + if (clean_intensity_standard) { + setCleanIntensityStandard(); + } else if (clean_intensity_strong) { + setCleanIntensityStrong(); + } + }); + hideLoadingMask(); + } + /** * 发送清扫车相关作业命令 * @@ -747,7 +855,8 @@ public class SweeperOperatePanelView extends LinearLayout { } private final static SweeperOperateCmdHandler mSweeperOperateCmdHandler = new SweeperOperateCmdHandler(); - private static CmdRequestCallback mCurrentCmdRequestCallback; + private static CmdRequestCallback mCurrentCmdRequestCallback;//发送命令后的回调 + private boolean mSyncingVehicleState;//第一次进入页面时,同步底盘状态的标志位 private static final int MSG_CMD_EXECUTE_COUNT_DOWN = 10001; private static final int MSG_CMD_EXECUTE_MOCK_SUCCESS = 10002; diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java index 4fe8d9ff9c..969b0dbc34 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java @@ -1,6 +1,7 @@ package com.mogo.och.sweeper.util; import chassis.SpecialVehicleTaskCmdOuterClass; +import chassis.VehicleStateOuterClass; /** * 清扫车-福田,构建业务命令数据的工具类 @@ -20,26 +21,48 @@ public class SweeperFutianCmdUtil { public static final int CLEAN_INTENSITY_STRAND = 1;//作业强度-标准 public static final int CLEAN_INTENSITY_STRONG = 2;//作业强度-加强 + /** + * 清扫作业:打开 + * + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanWorkStartCmd() { return buildCleanWorkCmd(CLEAN_WORK_OPEN); } + /** + * 清扫作业:关闭 + * + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanWorkStopCmd() { return buildCleanWorkCmd(CLEAN_WORK_CLOSE); } + private static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanWorkCmd(int startOrStop) { SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder(); builder.setCleanOpenRequirement(startOrStop); return buildTaskCmd(builder.build()); } + /** + * 作业模式:传入具体的模式对应的值 + * + * @param value + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanModeCmd(int value) { SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder(); builder.setCleanModeRequirement(value); return buildTaskCmd(builder.build()); } + /** + * 作业模式:纯吸 + * + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanModePureDrawCmd() { SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder(); builder.setCleanModeRequirement(CLEAN_MODE_PURE_DRAW); @@ -48,6 +71,11 @@ public class SweeperFutianCmdUtil { return buildTaskCmd(builder.build()); } + /** + * 作业模式:关闭作业模式 + * + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanModeCloseCmd() { SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder(); builder.setCleanModeRequirement(CLEAN_MODE_CLOSE); @@ -58,6 +86,12 @@ public class SweeperFutianCmdUtil { return buildTaskCmd(builder.build()); } + /** + * 作业方向:根据具体的方向传入具体的值 + * + * @param value + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanDirectionCmd(int value) { SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder(); builder.setCleanDirectionRequirement(value); @@ -66,6 +100,11 @@ public class SweeperFutianCmdUtil { return buildTaskCmd(builder.build()); } + /** + * 作业方向:关闭作业方向 + * + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanDirectionCloseCmd() { SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder(); builder.setCleanDirectionRequirement(CLEAN_DIRECTION_CLOSE); @@ -74,6 +113,12 @@ public class SweeperFutianCmdUtil { return buildTaskCmd(builder.build()); } + /** + * 作业强度:传入具体的值 + * + * @param value + * @return + */ public static SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd buildCleanIntensityCmd(int value) { SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder(); builder.setCleanIntensityRequirement(value); @@ -86,4 +131,18 @@ public class SweeperFutianCmdUtil { .setRoboSweeperFutianCleanCmd(fuTianCleanCmd).build(); } + /** + * 构建底盘Mock数据 + * + * @return + */ + public static VehicleStateOuterClass.SweeperFuTianCleanSystemState buildSweeperFuTionCleanSystemStateMockData() { + VehicleStateOuterClass.SweeperFuTianCleanSystemState.Builder builder = VehicleStateOuterClass.SweeperFuTianCleanSystemState.newBuilder(); + builder.setSecuMotWorkSts(true); + builder.setSecuModWashSts(true); + builder.setSecuWorkOnBothsidesSts(true); + builder.setSecuWorkStrongSts(true); + return builder.build(); + } + }