[清扫车]feat: 处理异常情况,第一次展示操作面板时根据透出的底盘数据恢复相关按钮状态;
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user