From d616e4bc6dd7884003a0cb248f38e70979ad8a44 Mon Sep 17 00:00:00 2001 From: bxb Date: Fri, 3 Feb 2023 18:19:17 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=85=E6=89=AB=E8=BD=A6]=E4=B8=8A=E8=A3=85?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=9F=BA=E6=9C=AC=E9=80=BB=E8=BE=91=E5=92=8C?= =?UTF-8?q?=E4=BA=BA=E5=B7=A5=E9=A9=BE=E9=A9=B6=E5=9C=B0=E5=9B=BE=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-sweeper/build.gradle | 1 - .../callback/CleaningModeStateCallback.java | 12 + .../och/sweeper/constant/OperateStateEnum.kt | 12 + .../fragment/BaseSweeperTabFragment.java | 47 ++- .../och/sweeper/fragment/SweeperFragment.kt | 55 +-- .../sweeper/presenter/SweeperPresenter.java | 19 +- .../sweeper/ui/SweeperOperatePanelView.java | 345 +++++------------- .../och/sweeper/ui/popwindow/MenuPopWindow.kt | 5 +- .../popwindow/SweeperOperatePanelPopWindow.kt | 50 +++ .../sweeper/util/SweeperFutianCmdUtil.java | 60 ++- .../view/SweeperCurrentTaskInfoView.kt | 23 +- .../sweeper/view/SweeperTrafficLightView.kt | 23 +- .../och/sweeper/view/SweeperWorkModeView.kt | 116 +++++- .../res/layout/sweeper_amap_navi_view.xml | 10 +- .../main/res/layout/sweeper_base_fragment.xml | 12 +- .../res/layout/sweeper_operate_panel_view.xml | 45 --- .../sweeper_popwindow_operate_panel.xml | 8 + .../main/res/layout/sweeper_traffic_data.xml | 10 +- .../res/layout/sweeper_traffic_light_view.xml | 14 +- .../src/main/res/layout/sweeper_work_mode.xml | 101 +++-- 20 files changed, 529 insertions(+), 439 deletions(-) create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/CleaningModeStateCallback.java create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/OperateStateEnum.kt create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt create mode 100644 OCH/mogo-och-sweeper/src/main/res/layout/sweeper_popwindow_operate_panel.xml diff --git a/OCH/mogo-och-sweeper/build.gradle b/OCH/mogo-och-sweeper/build.gradle index c0e3198f9f..fab2f9a2ca 100644 --- a/OCH/mogo-och-sweeper/build.gradle +++ b/OCH/mogo-och-sweeper/build.gradle @@ -53,7 +53,6 @@ dependencies { implementation rootProject.ext.dependencies.rxandroid implementation rootProject.ext.dependencies.androidxcardview implementation project(":OCH:mogo-och-common-module") - implementation rootProject.ext.dependencies.androidxrecyclerview } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/CleaningModeStateCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/CleaningModeStateCallback.java new file mode 100644 index 0000000000..b1ec2c6867 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/CleaningModeStateCallback.java @@ -0,0 +1,12 @@ +package com.mogo.och.sweeper.callback; + +import com.mogo.och.sweeper.constant.OperateStateEnum; + +import chassis.ChassisStatesOuterClass; + +/** + * 上装状态回调 + */ +public interface CleaningModeStateCallback { + void cleaningModeState(OperateStateEnum cleaningModeState, ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState,boolean isSelectPureSweepMode); +} diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/OperateStateEnum.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/OperateStateEnum.kt new file mode 100644 index 0000000000..fcb68755ba --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/OperateStateEnum.kt @@ -0,0 +1,12 @@ +package com.mogo.och.sweeper.constant + +/** + * 上装面板操作状态 + */ +enum class OperateStateEnum(val code: Int) { + SYNCING_STATUS( 1),//清扫车底盘状态同步中 + STARTING_STATUS( 2),//上装中 + FAIL_STATUS( 3),//上装失败 + SUCCESS_STATUS(4),//上装成功 + NO_STATUS(-1);//暂无模式 +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java index 7b686e25b7..ac794360a3 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java @@ -25,7 +25,6 @@ import com.mogo.map.marker.IMogoMarkerManager; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.och.sweeper.R; -import com.mogo.och.sweeper.ui.SweeperOperatePanelView; import com.mogo.och.sweeper.view.SweeperCurrentTaskInfoView; import com.mogo.och.sweeper.view.SweeperTrafficDataView; import com.mogo.och.sweeper.view.SweeperWorkModeView; @@ -37,7 +36,8 @@ import com.mogo.och.sweeper.view.SweeperWorkModeView; * * @author tongchenfei */ -public abstract class BaseSweeperTabFragment> extends MvpFragment implements IMogoMapListener { +public abstract class BaseSweeperTabFragment> extends MvpFragment implements IMogoMapListener, + View.OnClickListener { private static final String TAG = "BaseOchFragment"; //地图放大缩小 @@ -56,16 +56,16 @@ public abstract class BaseSweeperTabFragment debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) ); - showAmapNaviToStationFragment(true); } private void updateSwitchMapIcon() { @@ -136,6 +135,8 @@ public abstract class BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener { +class SweeperFragment : BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener{ private var mAdapter: TaskListAdapter? = null - - //当前任务操作菜单 - private var mTaskMenuPopWindow: MenuPopWindow? = null - - // private var mPosition: Int = -1 private val mutableList: MutableList by lazy { mutableListOf() } + private var subTaskType:Int=1;//1:自动驾驶子任务 2:人工驾驶子任务 + + //当前经纬度 + private var mCurLatitude = 0.0 + private var mCurLongitude = 0.0 override fun getTagName(): String { return "SweepersFragment" } @@ -44,8 +50,9 @@ class SweeperFragment : BaseSweeperTabFragment - - } - //任务操作菜单打开关闭处理 - currentTaskPanelView.getIvMore().setOnClickListener { v: View? -> - if (mTaskMenuPopWindow?.isShowing != true) { - mTaskMenuPopWindow?.showAsDropDown( - workModePanelView, - resources.getDimension(R.dimen.dp_580).toInt(), - resources.getDimension(R.dimen.dp_36).toInt() - ) - } else { - mTaskMenuPopWindow?.dismiss() - } + currentTaskPanelView.setData(workModePanelView,mutableList, mPosition,this) + //mock数据 + workModePanelView.setSweeperFutianCleanSystemState(subTaskType,SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData(),trafficDataView) } } @@ -136,4 +129,18 @@ class SweeperFragment : BaseSweeperTabFragment - implements IMoGoAutopilotStatusListener, ISweeperControllerStatusCallback, ISweeperADASStatusCallback{ + implements IMoGoAutopilotStatusListener, ISweeperControllerStatusCallback, ISweeperADASStatusCallback, IMoGoSweeperFutianCleanSystemListener { private static final String TAG = "BusPresenter"; @@ -41,6 +46,8 @@ public class SweeperPresenter extends Presenter super(view); //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口 CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this); + //清扫车模式和贴边数据回调监听 + CallerSweeperFutianCleanSystemListenerManager.INSTANCE.addListener(TAG,this); SweeperTaskModel.getInstance().init(); OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp()); } @@ -66,6 +73,7 @@ public class SweeperPresenter extends Presenter public void releaseListener() { SweeperTaskModel.getInstance().setControllerStatusCallback(null); SweeperTaskModel.getInstance().setAdasStatusCallback(null); + CallerSweeperFutianCleanSystemListenerManager.INSTANCE.removeListener(TAG); } public void restartAutopilot() { @@ -175,4 +183,13 @@ public class SweeperPresenter extends Presenter public void onStartAdasFailure() { } + + @Override + public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { + runOnUIThread(() ->mView.onSweeperFutianCleanSystemState(cleanSystemState)); + } + @Override + public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { + + } } 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 336b6c837b..f3e65ef078 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 @@ -1,5 +1,34 @@ package com.mogo.och.sweeper.ui; +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckedTextView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; +import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; +import com.mogo.eagle.core.utilcode.util.ThreadUtils; +import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.och.sweeper.R; +import com.mogo.och.sweeper.callback.CleaningModeStateCallback; +import com.mogo.och.sweeper.constant.OperateStateEnum; +import com.mogo.och.sweeper.util.SweeperFutianCmdUtil; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import chassis.ChassisStatesOuterClass; +import chassis.SpecialVehicleTaskCmdOuterClass; + import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_DIRECTION_BOTH_SIDE; import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_DIRECTION_LEFT_SIDE; import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_DIRECTION_RIGHT_SIDE; @@ -10,39 +39,6 @@ import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_MODE_PURE_SWE import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_MODE_PURE_WASH; import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_MODE_WASH_SWEEP; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Handler; -import android.os.Message; -import android.util.AttributeSet; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.CheckedTextView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; - -import com.mogo.eagle.core.function.api.autopilot.IMoGoSweeperFutianCleanSystemListener; -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; -import com.mogo.eagle.core.function.call.autopilot.CallerSweeperFutianCleanSystemListenerManager; -import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; -import com.mogo.eagle.core.utilcode.util.ThreadUtils; -import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.och.sweeper.R; -import com.mogo.och.sweeper.util.SweeperFutianCmdUtil; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import chassis.ChassisStatesOuterClass; -import chassis.SpecialVehicleTaskCmdOuterClass; -import planning.RoboSweeperTaskIndexOuterClass; - /** * 清扫车操作面板View */ @@ -52,7 +48,6 @@ public class SweeperOperatePanelView extends LinearLayout { private static final int CMD_EXECUTE_TIMEOUT_SECONDS = 30; private static final int CMD_EXECUTE_MOCK_SUCCESS_SECONDS = 3; - CheckedTextView mBtnCleanWorkOpenClose;//开关 CheckedTextView mBtnCleanModePureSweep;//纯扫 CheckedTextView mBtnCleanModePureWash;//纯洗 CheckedTextView mBtnCleanModeSweepWash;//洗扫 @@ -65,7 +60,6 @@ public class SweeperOperatePanelView extends LinearLayout { LinearLayout mLoadingContainer;//loading container TextView mLoadingHintTop;//loading 提示-上面 TextView mLoadingHintBottom;//loading 提示-下面 - private TextView mBtnCancel;//取消 private TextView mBtnReset;//复位 // 作业模式相关操作按钮的id @@ -112,6 +106,12 @@ public class SweeperOperatePanelView extends LinearLayout { put(R.id.btn_clean_intensity_strong, CLEAN_INTENSITY_STRONG); } }; + private boolean isSelectPureSweepMode = false;//用于标注是否选中纯扫 + + private CleaningModeStateCallback cleaningModeStateCallback; + //设置清扫模式数据 + private static ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.Builder builder = + ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.newBuilder(); public SweeperOperatePanelView(Context context) { super(context); @@ -134,7 +134,6 @@ public class SweeperOperatePanelView extends LinearLayout { private void initView(Context context) { LayoutInflater.from(context).inflate(R.layout.sweeper_operate_panel_view, this, true); - mBtnCleanWorkOpenClose = (CheckedTextView) findViewById(R.id.btn_clean_work_open_close); mBtnCleanModePureSweep = (CheckedTextView) findViewById(R.id.btn_clean_mode_pure_sweep); mBtnCleanModePureWash = (CheckedTextView) findViewById(R.id.btn_clean_mode_pure_wash); mBtnCleanModeSweepWash = (CheckedTextView) findViewById(R.id.btn_clean_mode_sweep_wash); @@ -147,13 +146,11 @@ public class SweeperOperatePanelView extends LinearLayout { mLoadingContainer = findViewById(R.id.loading_hint_container); mLoadingHintTop = findViewById(R.id.loading_hint_top); mLoadingHintBottom = findViewById(R.id.loading_hint_bottom); - mBtnCancel = findViewById(R.id.btn_operate_panel_cancel); mBtnReset = findViewById(R.id.btn_operate_panel_reset); initViewListener(); } private void initViewListener() { - setClickListener(mBtnCleanWorkOpenClose, (v) -> onCleanWorkBtnClick()); setClickListener(mBtnCleanModePureSweep, (v) -> onCleanModeBtnClick(v)); setClickListener(mBtnCleanModePureWash, (v) -> onCleanModeBtnClick(v)); setClickListener(mBtnCleanModeSweepWash, (v) -> onCleanModeBtnClick(v)); @@ -164,94 +161,6 @@ public class SweeperOperatePanelView extends LinearLayout { setClickListener(mBtnCleanIntensityStandard, (v) -> onCleanIntensityBtnClick(v)); setClickListener(mBtnCleanIntensityStrong, (v) -> onCleanIntensityBtnClick(v)); setClickListener(mBtnReset, (v) -> onOperateReset()); - setClickListener(mBtnCancel, (v) -> onOperateCancel()); - } - - /** - * 清扫任务开关按钮点击事件 - */ - private void onCleanWorkBtnClick() { - // 是否是 关闭 操作 - boolean isCloseAction = mBtnCleanWorkOpenClose.isChecked(); - CmdRequestCallback cmdRequestCallback = new CmdRequestCallback() { - @Override - public void onSendCmd() { - showLoadingMask(CMD_EXECUTE_TIMEOUT_SECONDS); - } - - @Override - public void onCountDownTick(int seconds) { - updateLoadingCountDown(seconds); - } - - @Override - public boolean onCheckIfCmdSuccess(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { - boolean success = false; - if (cleanSystemState == null) { - return success; - } - if (isCloseAction) { - success = !cleanSystemState.getSecuMotWorkSts(); - } else { - success = cleanSystemState.getSecuMotWorkSts(); - } - return success; - } - - @Override - public void onCmdSuccess() { - runOnUIThread(() -> { - if (isCloseAction) { - mBtnCleanWorkOpenClose.setText("Open"); - mBtnCleanWorkOpenClose.setChecked(false); - toggleCleanModeBtnsStatus(false); - toggleCleanDirectionBtnsStatus(false); - toggleCleanIntensityBtnsStatus(false); - } else { - mBtnCleanWorkOpenClose.setText("Close"); - mBtnCleanWorkOpenClose.setChecked(true); - toggleCleanModeBtnsStatus(true); - } - hideLoadingMask(); - showCmdExecuteSuccessToast(); - }); - } - - @Override - public void onCmdFailed() { - } - - @Override - public void onCmdTimeout() { - //按钮样式恢复原样 - runOnUIThread(() -> { - if (isCloseAction) { - mBtnCleanWorkOpenClose.setText("Close"); - mBtnCleanWorkOpenClose.setChecked(true); - } else { - mBtnCleanWorkOpenClose.setText("Open"); - mBtnCleanWorkOpenClose.setChecked(false); - } - hideLoadingMask(); - showCmdExecuteTimeoutToast(); - }); - } - }; - if (isCloseAction) { - //关闭操作,点击时需要弹框提示确认后,关闭 - showConfirmCleanWorkCloseDialog(() -> { - sendSweeperCmd( - SweeperFutianCmdUtil.buildCleanWorkStopCmd(), - cmdRequestCallback - , CMD_EXECUTE_TIMEOUT_SECONDS); - }); - } else { - //打开操作,点击时打开 - sendSweeperCmd( - SweeperFutianCmdUtil.buildCleanWorkStartCmd(), - cmdRequestCallback, - CMD_EXECUTE_TIMEOUT_SECONDS); - } } /** @@ -272,12 +181,15 @@ public class SweeperOperatePanelView extends LinearLayout { && currentChoosedModeBtnView.getId() == currentClickView.getId(); //是否纯吸View boolean isPureAbsorptionClick = currentClickView.getId() == R.id.btn_clean_mode_pure_absorption; + builder.setSecuWorkTonSts(isPureAbsorptionClick&&isClickCurrentChoosedModeBtn); //是否纯洗View boolean isPureWashClick = currentClickView.getId() == R.id.btn_clean_mode_pure_wash; + builder.setSecuModWashSts(isPureWashClick&&isClickCurrentChoosedModeBtn); //是否纯扫View boolean isPureSweepClick = currentClickView.getId() == R.id.btn_clean_mode_pure_sweep; //是否洗扫View boolean isWashSweepClick = currentClickView.getId() == R.id.btn_clean_mode_sweep_wash; + builder.setSecuModWashSweepSts(isWashSweepClick&&isClickCurrentChoosedModeBtn); CmdRequestCallback cmdRequestCallback = new CmdRequestCallback() { @Override @@ -303,7 +215,7 @@ public class SweeperOperatePanelView extends LinearLayout { // 纯吸 boolean clean_mode_pure_draw = cleanSystemState.getSecuWorkTonSts(); // 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式 - boolean clean_mode_pure_sweep = checkIfCleanModePureSweep(cleanSystemState); + boolean clean_mode_pure_sweep = SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState); // 关闭作业模式(实际执行了3个操作: 关闭作业模式 关闭清扫方向 切换标准强度,实际以关闭作业模式成功为准) boolean clean_mode_close = !clean_mode_wash_sweep && !clean_mode_pure_wash @@ -312,16 +224,20 @@ public class SweeperOperatePanelView extends LinearLayout { if (isClickCurrentChoosedModeBtn && clean_mode_close) {// 关闭放第一判断 success = clean_mode_close; + isSelectPureSweepMode = false; } else if (isPureSweepClick) { //success = clean_mode_pure_sweep; //纯扫 这个模式实际在福田清扫车上没有这个按钮,只是发送指令给特种车端,默认此命令肯定是正确的 success = true; } else if (isPureWashClick) { success = clean_mode_pure_wash; + isSelectPureSweepMode = false; } else if (isWashSweepClick) { success = clean_mode_wash_sweep; + isSelectPureSweepMode = false; } else if (isPureAbsorptionClick) { success = clean_mode_pure_draw; + isSelectPureSweepMode = false; } return success; } @@ -395,6 +311,9 @@ public class SweeperOperatePanelView extends LinearLayout { boolean isLeftSide = currentClickView.getId() == R.id.btn_clean_direction_left_side; boolean isRightSide = currentClickView.getId() == R.id.btn_clean_direction_right_side; boolean isBothSide = currentClickView.getId() == R.id.btn_clean_direction_both_side; + builder.setSecuWorkLeftSts(isLeftSide&&isClickCurrentChoosedDirectionBtn); + builder.setSecuWorkRightSts(isRightSide&&isClickCurrentChoosedDirectionBtn); + builder.setSecuWorkOnBothsidesSts(isBothSide&&isClickCurrentChoosedDirectionBtn); CmdRequestCallback cmdRequestCallback = new CmdRequestCallback() { @@ -484,7 +403,9 @@ public class SweeperOperatePanelView extends LinearLayout { private void onCleanIntensityBtnClick(final View currentClickView) { boolean isStandardBtnClick = currentClickView.getId() == R.id.btn_clean_intensity_standard; + builder.setSecuWorkStandSts(isStandardBtnClick); boolean isStrongBtnClick = currentClickView.getId() == R.id.btn_clean_intensity_strong; + builder.setSecuWorkStrongSts(isStrongBtnClick); CmdRequestCallback cmdRequestCallback = new CmdRequestCallback() { @Override public void onSendCmd() { @@ -662,6 +583,9 @@ public class SweeperOperatePanelView extends LinearLayout { timeout )); mLoadingHintBottom.setVisibility(timeout < 0 ? View.INVISIBLE : View.VISIBLE); + if (cleaningModeStateCallback != null && timeout > 0) { + cleaningModeStateCallback.cleaningModeState(OperateStateEnum.STARTING_STATUS, builder.build(), isSelectPureSweepMode); + } }); } @@ -694,6 +618,9 @@ public class SweeperOperatePanelView extends LinearLayout { * 命令执行成功toast */ private void showCmdExecuteSuccessToast() { + if (cleaningModeStateCallback != null) { + cleaningModeStateCallback.cleaningModeState(OperateStateEnum.SUCCESS_STATUS, builder.build(), isSelectPureSweepMode); + } ToastUtils.showLong("设备已响应,操作成功"); } @@ -701,42 +628,12 @@ public class SweeperOperatePanelView extends LinearLayout { * 命令执行超时toast */ private void showCmdExecuteTimeoutToast() { + if (cleaningModeStateCallback != null) { + cleaningModeStateCallback.cleaningModeState(OperateStateEnum.FAIL_STATUS, builder.build(), isSelectPureSweepMode); + } ToastUtils.showLong("超时未响应,操作失败"); } - /** - * 根据底盘数据恢复操作面板中相关按钮状态 成功toast - */ - private void showRecoverPanelButtonStateSuccessToast() { - ToastUtils.showLong("恢复操作面板状态成功"); - } - - /** - * 关闭清扫作业时,确认操作的弹框 - * - * @param runnable - */ - private void showConfirmCleanWorkCloseDialog(Runnable runnable) { - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setMessage("是否关闭清扫作业?"); - builder.setCancelable(true); - builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - runnable.run(); - dialog.dismiss(); - } - }); - builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - AlertDialog dialog = builder.create(); - dialog.show(); - } - private void runOnUIThread(Runnable runnable) { ThreadUtils.runOnUiThread(new Runnable() { @Override @@ -755,62 +652,29 @@ public class SweeperOperatePanelView extends LinearLayout { }); } - // 当前时间戳 - private long mCurrentTimeMillis; - // 底盘数据回调时间间隔 - private static final long VEHICLE_STATE_INTERVAL_MILLIS = 500L; - - /** - * 底盘数据透传listener - */ - private final IMoGoSweeperFutianCleanSystemListener mIMoGoAutopilotVehicleStateListener = new IMoGoSweeperFutianCleanSystemListener() { - - @Override - public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { - long current = System.currentTimeMillis(); - if (current - mCurrentTimeMillis <= VEHICLE_STATE_INTERVAL_MILLIS) { - return; - } - mCurrentTimeMillis = current; - - Log.d(TAG, "onSweeperFutianCleanSystemState"); - // 第一次进入时同步底盘状态,只拿第一次的数据 - if (mSyncingVehicleState) { - onSyncVehicleStateCallBack(cleanSystemState); - return; - } - // 有命令正在执行 - if (mCurrentCmdRequestCallback != null) { - Log.d(TAG, "getSecuWorkLeftSts = " + cleanSystemState.getSecuWorkLeftSts()); - if (mCurrentCmdRequestCallback.onCheckIfCmdSuccess(cleanSystemState)) { - mCurrentCmdRequestCallback.onCmdSuccess(); - mCurrentCmdRequestCallback = null; - } - } - } - - @Override - public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { - - } - }; + public void setSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState, + CleaningModeStateCallback cleaningModeStateCallback) { + this.cleaningModeStateCallback = cleaningModeStateCallback; + onSyncVehicleStateCallBack(cleanSystemState); + // 有命令正在执行 +// if (mCurrentCmdRequestCallback != null) { +// Log.d(TAG, "getSecuWorkLeftSts = " + cleanSystemState.getSecuWorkLeftSts()); +// if (mCurrentCmdRequestCallback.onCheckIfCmdSuccess(cleanSystemState)) { +// mCurrentCmdRequestCallback.onCmdSuccess(); +// mCurrentCmdRequestCallback = null; +// } +// } + } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - CallerSweeperFutianCleanSystemListenerManager.INSTANCE.addListener(TAG, mIMoGoAutopilotVehicleStateListener); // 最终调试时需要打开 - syncVehicleStateAndRecoverOperatePanelStates(); + //syncVehicleStateAndRecoverOperatePanelStates(); // Mock VehicleState 数据回调 - // UiThreadHandler.postDelayed(() -> { - // onSyncVehicleStateCallBack(SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData()); - // }, 3000L); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - CallerSweeperFutianCleanSystemListenerManager.INSTANCE.removeListener(TAG); + // UiThreadHandler.postDelayed(() -> { +// onSyncVehicleStateCallBack(SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData()); +// }, 3000L); } /** @@ -819,12 +683,10 @@ public class SweeperOperatePanelView extends LinearLayout { private synchronized void syncVehicleStateAndRecoverOperatePanelStates() { // show sync loading showLoadingMask("状态同步中,请稍后", -1); - mSyncingVehicleState = true; } private synchronized void onSyncVehicleStateCallBack(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { if (cleanSystemState == null) return; - mSyncingVehicleState = false; // 清扫作业开启状态(以电机状态为true代表Open成功,实际控制端控制步骤为:1.发送远程控制上装指令 2.发送电机启动指令) boolean clean_open_requirement = cleanSystemState.getSecuMotWorkSts(); // 作业模式状态 @@ -844,22 +706,13 @@ public class SweeperOperatePanelView extends LinearLayout { boolean clean_direction_both_side = cleanSystemState.getSecuWorkOnBothsidesSts(); // 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式 - boolean clean_mode_pure_sweep = checkIfCleanModePureSweep(cleanSystemState); + boolean clean_mode_pure_sweep = SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState); // 作业强度状态 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); @@ -904,39 +757,9 @@ public class SweeperOperatePanelView extends LinearLayout { setCleanIntensityStrong(); } hideLoadingMask(); - showRecoverPanelButtonStateSuccessToast(); }); } - /** - * 通过底盘数据判断是纯扫模式 - * - * @param cleanSystemState - * @return - */ - private boolean checkIfCleanModePureSweep(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { - // 作业模式状态 - // 洗扫 - 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); - return clean_mode_pure_sweep; - } - /** * 发送清扫车相关作业命令 * @@ -962,7 +785,7 @@ public class SweeperOperatePanelView extends LinearLayout { msg.obj = timeout; mSweeperOperateCmdHandler.sendMessage(msg); // Mock Cmd Success -// mockSendCmdSuccess(); + mockSendCmdSuccess(); } private void mockSendCmdSuccess() { @@ -985,21 +808,15 @@ public class SweeperOperatePanelView extends LinearLayout { ); } - /** - * 取消关闭面板 - */ - private void onOperateCancel(){ - this.setVisibility(View.GONE); - } /** * 复位 */ - private void onOperateReset(){ + private void onOperateReset() { } + private final static SweeperOperateCmdHandler mSweeperOperateCmdHandler = new SweeperOperateCmdHandler(); 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; @@ -1030,8 +847,10 @@ public class SweeperOperatePanelView extends LinearLayout { } } else if (msg.what == MSG_CMD_EXECUTE_MOCK_SUCCESS) { if (mCurrentCmdRequestCallback != null) { - mCurrentCmdRequestCallback.onCmdSuccess(); - mCurrentCmdRequestCallback = null; + if (mCurrentCmdRequestCallback.onCheckIfCmdSuccess(builder.build())) { + mCurrentCmdRequestCallback.onCmdSuccess(); + mCurrentCmdRequestCallback = null; + } } removeMessages(MSG_CMD_EXECUTE_COUNT_DOWN); } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/MenuPopWindow.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/MenuPopWindow.kt index 5aec5548c9..94992a6f57 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/MenuPopWindow.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/MenuPopWindow.kt @@ -8,13 +8,16 @@ import android.view.View import android.view.ViewGroup.LayoutParams import android.widget.PopupWindow import android.widget.TextView +import chassis.ChassisStatesOuterClass import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.callback.CleaningModeStateCallback +import com.mogo.och.sweeper.constant.OperateStateEnum import com.mogo.och.sweeper.constant.TaskMenuTypeEnum /** * 当前任务操作菜单栏 */ -class MenuPopWindow : PopupWindow, View.OnClickListener { +class MenuPopWindow : PopupWindow, View.OnClickListener{ private var mTvJumpOverTask: TextView? = null diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt new file mode 100644 index 0000000000..692549639f --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt @@ -0,0 +1,50 @@ +package com.mogo.och.sweeper.ui.popwindow + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.PopupWindow +import android.widget.TextView +import chassis.ChassisStatesOuterClass +import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.callback.CleaningModeStateCallback +import com.mogo.och.sweeper.ui.SweeperOperatePanelView + +/** + * 清扫车面板浮窗 + */ +class SweeperOperatePanelPopWindow : PopupWindow { + + private var mOperatePanelView: SweeperOperatePanelView? = null + private var mBtnCancel: TextView? = null //取消 + + constructor(context: Context) : super(context) { + init(context) + } + + private fun init(context: Context) { + setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + mOperatePanelView = LayoutInflater.from(context).inflate(R.layout.sweeper_popwindow_operate_panel, null) as SweeperOperatePanelView? + mBtnCancel = mOperatePanelView?.findViewById(R.id.btn_operate_panel_cancel) + width = ViewGroup.LayoutParams.WRAP_CONTENT + height = ViewGroup.LayoutParams.WRAP_CONTENT + contentView = mOperatePanelView + isFocusable = true + isOutsideTouchable = true + mBtnCancel?.setOnClickListener { + dismiss() + } + } + + /** + * 设置清扫模式数据 + */ + fun setCleanSystemState( + cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates, + cleaningModeStateCallback: CleaningModeStateCallback + ) { + mOperatePanelView?.setSweeperFutianCleanSystemState(cleanSystemState, cleaningModeStateCallback) + } +} \ No newline at end of file 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 969b0dbc34..307dfa528e 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,7 +1,7 @@ package com.mogo.och.sweeper.util; +import chassis.ChassisStatesOuterClass; import chassis.SpecialVehicleTaskCmdOuterClass; -import chassis.VehicleStateOuterClass; /** * 清扫车-福田,构建业务命令数据的工具类 @@ -131,13 +131,67 @@ public class SweeperFutianCmdUtil { .setRoboSweeperFutianCleanCmd(fuTianCleanCmd).build(); } + /** + * 判断是否有作业模式 + * @param cleanSystemState + * @return true:没有作业模式 false:有作业模式 + */ + public static boolean checkIfCleanMode(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState){ + return (!cleanSystemState.getSecuModWashSweepSts()&&!cleanSystemState.getSecuModWashSts()&&!cleanSystemState.getSecuWorkTonSts())&& + (!cleanSystemState.getSecuWorkLeftSts()&&!cleanSystemState.getSecuWorkRightSts()&&!cleanSystemState.getSecuWorkOnBothsidesSts()); + } + + /** + * 判断是否有清扫方向 + * @param cleanSystemState + * @return true:没有清扫方向 false:有清扫方向 + */ + public static boolean checkIfCleanDirection(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState){ + return !cleanSystemState.getSecuWorkLeftSts()&&!cleanSystemState.getSecuWorkRightSts()&&!cleanSystemState.getSecuWorkOnBothsidesSts(); + } + /** + * 判断是否有作业强度 + * @param cleanSystemState + * @return true:没有作业强度 false:有作业强度 + */ + public static boolean checkIfCleanIntensity(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState){ + return !cleanSystemState.getSecuWorkLeftSts()&&!cleanSystemState.getSecuWorkRightSts()&&!cleanSystemState.getSecuWorkOnBothsidesSts(); + } + /** + * 判断是否纯扫模式 + * + * @param cleanSystemState + * @return + */ + public static boolean checkIfCleanModePureSweep(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { + // 作业模式状态 + // 洗扫 + 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); + return clean_mode_pure_sweep; + } /** * 构建底盘Mock数据 * * @return */ - public static VehicleStateOuterClass.SweeperFuTianCleanSystemState buildSweeperFuTionCleanSystemStateMockData() { - VehicleStateOuterClass.SweeperFuTianCleanSystemState.Builder builder = VehicleStateOuterClass.SweeperFuTianCleanSystemState.newBuilder(); + public static ChassisStatesOuterClass.SweeperFuTianTaskSystemStates buildSweeperFuTionCleanSystemStateMockData() { + ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.Builder builder = ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.newBuilder(); builder.setSecuMotWorkSts(true); builder.setSecuModWashSts(true); builder.setSecuWorkOnBothsidesSts(true); diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt index 217eccbbea..1921a111ab 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt @@ -8,12 +8,15 @@ import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.och.sweeper.R import com.mogo.och.sweeper.bean.TaskInfoBean +import com.mogo.och.sweeper.ui.popwindow.MenuPopWindow import kotlinx.android.synthetic.main.sweeper_current_task_info.view.* /** * 清扫车当前任务信息展示 */ class SweeperCurrentTaskInfoView : ConstraintLayout { + //当前任务操作菜单 + private var mTaskMenuPopWindow: MenuPopWindow? = null constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { initView(context) @@ -25,13 +28,11 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { private fun initView(context: Context) { LayoutInflater.from(context).inflate(R.layout.sweeper_current_task_info, this) } - - fun getIvMore(): ImageView = ivMore - /** * 设置当前任务数据 */ - fun setData(listTask: List, currentPosition: Int) { + fun setData(workModePanelView:SweeperWorkModeView,listTask: List, currentPosition: Int,menuItemClickListener: MenuPopWindow.OnMenuItemOnClickListener) { + mTaskMenuPopWindow = MenuPopWindow(context, menuItemClickListener) if (listTask.size == 1) { preSubTask.setData(listTask[currentPosition], isSelect=true,isLastTask=true) currentSubTask.visibility = View.INVISIBLE @@ -53,7 +54,7 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { lastSubTask.setData(listTask[2], isLastTask=true) //当前正在执行的任务是最后一个子任务 } else if (currentPosition == listTask.size - 1) { - preSubTask.setData(listTask[currentPosition - 2], isSelect=true) + preSubTask.setData(listTask[currentPosition - 2]) currentSubTask.setData(listTask[currentPosition-1]) lastSubTask.setData(listTask[currentPosition], isSelect=true,isLastTask=true) } else { @@ -62,6 +63,18 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { lastSubTask.setData(listTask[currentPosition + 1],isLastTask=true) } } + //任务操作菜单打开关闭处理 + ivMore.setOnClickListener { + if (mTaskMenuPopWindow?.isShowing != true) { + mTaskMenuPopWindow?.showAsDropDown( + workModePanelView, + resources.getDimension(R.dimen.dp_580).toInt(), + resources.getDimension(R.dimen.dp_36).toInt() + ) + } else { + mTaskMenuPopWindow?.dismiss() + } + } } /** diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt index affb7d5100..4b31af6fc5 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt @@ -47,7 +47,8 @@ class SweeperTrafficLightView @JvmOverloads constructor(context: Context?, attrs super.disableWarningTrafficLight() UiThreadHandler.post { mCurrentLightId = 0 - mLightIconIV!!.setImageResource(R.drawable.sweeper_light_gay_nor) + mLightTimeTV?.text = "" + mLightIconIV?.setImageResource(R.drawable.sweeper_light_gay_nor) } } @@ -70,9 +71,9 @@ class SweeperTrafficLightView @JvmOverloads constructor(context: Context?, attrs super.changeCountdownRed(redNum) UiThreadHandler.post { if (redNum > 0) { - mLightTimeTV!!.text = redNum.toString() + mLightTimeTV?.text = redNum.toString() } else { - mLightTimeTV!!.text = "" + mLightTimeTV?.text = "" } } } @@ -81,9 +82,9 @@ class SweeperTrafficLightView @JvmOverloads constructor(context: Context?, attrs super.changeCountdownGreen(greenNum) UiThreadHandler.post { if (greenNum > 0) { - mLightTimeTV!!.text = greenNum.toString() + mLightTimeTV?.text = greenNum.toString() } else { - mLightTimeTV!!.text = "" + mLightTimeTV?.text = "" } } } @@ -92,9 +93,9 @@ class SweeperTrafficLightView @JvmOverloads constructor(context: Context?, attrs super.changeCountdownYellow(yellowNum) UiThreadHandler.post { if (yellowNum > 0) { - mLightTimeTV!!.text = yellowNum.toString() + mLightTimeTV?.text = yellowNum.toString() } else { - mLightTimeTV!!.text = "" + mLightTimeTV?.text = "" } } } @@ -107,10 +108,10 @@ class SweeperTrafficLightView @JvmOverloads constructor(context: Context?, attrs private fun updateTrafficLightIcon(lightId: Int) { UiThreadHandler.post { when (lightId) { - 1 -> mLightIconIV!!.setImageResource(R.drawable.sweeper_light_red_nor) - 2 -> mLightIconIV!!.setImageResource(R.drawable.sweeper_lightyellow_nor) - 3 -> mLightIconIV!!.setImageResource(R.drawable.sweeper_light_green_nor) - else -> mLightIconIV!!.setImageResource(R.drawable.sweeper_light_gay_nor) + 1 -> mLightIconIV?.setImageResource(R.drawable.sweeper_light_red_nor) + 2 -> mLightIconIV?.setImageResource(R.drawable.sweeper_lightyellow_nor) + 3 -> mLightIconIV?.setImageResource(R.drawable.sweeper_light_green_nor) + else -> mLightIconIV?.setImageResource(R.drawable.sweeper_light_gay_nor) } } } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt index 1b1e145d05..606fddd5c5 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt @@ -3,13 +3,26 @@ package com.mogo.och.sweeper.view import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import chassis.ChassisStatesOuterClass.SweeperFuTianTaskSystemStates import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.callback.CleaningModeStateCallback +import com.mogo.och.sweeper.constant.OperateStateEnum +import com.mogo.och.sweeper.ui.popwindow.SweeperOperatePanelPopWindow +import com.mogo.och.sweeper.util.SweeperFutianCmdUtil +import kotlinx.android.synthetic.main.sweeper_work_mode.view.* /** * 清扫车模式信息展示 */ -class SweeperWorkModeView : ConstraintLayout { +class SweeperWorkModeView : ConstraintLayout, CleaningModeStateCallback { + + private var isSelectPureSweepMode:Boolean=false + + //清扫模式选择面板 + private var mOperatePanelPopWindow: SweeperOperatePanelPopWindow? = null + constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { initView(context) @@ -20,5 +33,106 @@ class SweeperWorkModeView : ConstraintLayout { private fun initView(context: Context) { LayoutInflater.from(context).inflate(R.layout.sweeper_work_mode, this) + mOperatePanelPopWindow = SweeperOperatePanelPopWindow(context) + } + /** + * 设置清扫模式面板 + */ + fun setSweeperFutianCleanSystemState(taskType:Int,cleanSystemState: SweeperFuTianTaskSystemStates, trafficDataView: SweeperTrafficDataView) { + mOperatePanelPopWindow?.setCleanSystemState(cleanSystemState,this@SweeperWorkModeView) + //清扫模式选择面板打开关闭处理 + ivOpenOperatePanel.setOnClickListener { + if (mOperatePanelPopWindow?.isShowing != true) { + mOperatePanelPopWindow?.showAsDropDown( + trafficDataView, + resources.getDimension(R.dimen.dp_600).toInt(), + 0 + ) + } else { + mOperatePanelPopWindow?.dismiss() + } + } + //清扫车暂未选择清扫模式或者任务类型是人工驾驶子任务,则暂无清扫模式 + if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState)||taskType==2){ + setShowOrHideCleanSystemState(OperateStateEnum.NO_STATUS,cleanSystemState) + }else{ + setShowOrHideCleanSystemState(OperateStateEnum.SUCCESS_STATUS,cleanSystemState) + } + } + + /** + * 设置清扫模式状态显示和隐藏 + */ + fun setShowOrHideCleanSystemState(operateState: OperateStateEnum,cleanSystemState: SweeperFuTianTaskSystemStates) { + when (operateState.code) { + OperateStateEnum.SYNCING_STATUS.code ->{ + groupWorkModelPanel?.visibility = View.GONE + tvNoDataDesc?.visibility = View.VISIBLE + tvNoDataDesc?.text = "状态同步中,请稍后" + } + OperateStateEnum.FAIL_STATUS.code ->{ + groupWorkModelPanel?.visibility = View.GONE + tvNoDataDesc?.visibility = View.VISIBLE + tvNoDataDesc?.text = "上装启动失败" + } + OperateStateEnum.STARTING_STATUS.code ->{ + groupWorkModelPanel?.visibility = View.GONE + tvNoDataDesc?.visibility = View.VISIBLE + tvNoDataDesc?.text = "上装启动中..." + } + OperateStateEnum.NO_STATUS.code ->{ + groupWorkModelPanel?.visibility = View.GONE + tvNoDataDesc?.visibility = View.VISIBLE + tvNoDataDesc?.text = "暂无" + } + else->{ + groupWorkModelPanel?.visibility = View.VISIBLE + tvNoDataDesc?.visibility = View.GONE + setCleanModeData(cleanSystemState) + } + + } + } + override fun cleaningModeState(operateState: OperateStateEnum, cleanSystemState: SweeperFuTianTaskSystemStates,isSelectPureSweepMode:Boolean) { + this.isSelectPureSweepMode=isSelectPureSweepMode + setShowOrHideCleanSystemState(operateState,cleanSystemState) + } + /** + * 设置清扫模式数据 + */ + private fun setCleanModeData(cleanSystemState: SweeperFuTianTaskSystemStates){ + if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState)){ + groupWorkModelPanel?.visibility = View.GONE + tvNoDataDesc?.visibility = View.VISIBLE + tvNoDataDesc?.text = "暂无" + }else{ + groupWorkModelPanel?.visibility = View.VISIBLE + tvNoDataDesc?.visibility = View.GONE + // 作业模式 + if (cleanSystemState.secuModWashSweepSts) tvCleaningMode?.text = "洗扫模式" + if (cleanSystemState.secuModWashSts) tvCleaningMode?.text = "纯洗模式" + if (cleanSystemState.secuWorkTonSts) tvCleaningMode?.text = "纯吸模式" + if (SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState)||isSelectPureSweepMode) tvCleaningMode?.text = "纯扫模式" + } + //清扫方向 + if(SweeperFutianCmdUtil.checkIfCleanDirection(cleanSystemState)){ + tvCleaningDirection.visibility=View.GONE + }else{ + tvCleaningDirection.visibility=View.VISIBLE + // 左侧 + if (cleanSystemState.secuWorkLeftSts) tvCleaningDirection?.text = "左侧" + // 右侧 + if (cleanSystemState.secuWorkRightSts) tvCleaningDirection?.text = "右侧" + // 两侧 + if (cleanSystemState.secuWorkOnBothsidesSts) tvCleaningDirection?.text = "两侧" + } + if (SweeperFutianCmdUtil.checkIfCleanIntensity(cleanSystemState)){ + tvCleaningIntensity.visibility=View.GONE + }else{ + tvCleaningIntensity.visibility=View.VISIBLE + // 作业强度 + if (cleanSystemState.secuWorkStandSts) tvCleaningIntensity?.text = "标准" + if (cleanSystemState.secuWorkStrongSts) tvCleaningIntensity?.text = "强力" + } } } \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_amap_navi_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_amap_navi_view.xml index 10174a8e2a..4653dc9dcf 100644 --- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_amap_navi_view.xml +++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_amap_navi_view.xml @@ -1,13 +1,11 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + app:cardCornerRadius="@dimen/dp_30" + app:cardElevation="0dp" + app:cardUseCompatPadding="false"> + app:layout_constraintBottom_toBottomOf="parent" + android:layout_marginEnd="@dimen/module_mogo_och_margin_right" + android:layout_marginBottom="@dimen/module_mogo_och_margin_bottom"/> +