[清扫车]feat: 处理异常情况,第一次展示操作面板时根据透出的底盘数据恢复相关按钮状态;

This commit is contained in:
aibingbing
2022-08-26 19:17:58 +08:00
parent 7e55339bb6
commit 19f86f46cb
2 changed files with 169 additions and 1 deletions

View File

@@ -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;

View File

@@ -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();
}
}