[Sweeper Colud] feat: 增加 云端下发大任务 暂停/恢复 的处理/弹框/发送收到消息的回执;

refactor: 任务列表中状态 从子任务状态 修改为 大任务状态 (暂停/恢复 动作在大任务上);
This commit is contained in:
aibingbing
2023-07-21 16:07:52 +08:00
parent 306f6a17c0
commit b5e2ae75af
6 changed files with 236 additions and 26 deletions

View File

@@ -10,6 +10,8 @@ import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon.Code
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask
import com.zhjt.mogo.adas.data.sweeper.task.big.SweeperBigTaskStatus
import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendResume.ActionType
import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendResume.BigTaskActionPush
import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop.StopTaskType
/**
@@ -51,6 +53,12 @@ interface ISweeperCloudTaskCallback {
* 云端同步大任务状态
*/
fun onSweeperCloudBigTaskStatus(taskId:String, bigTaskStatus: SweeperCommon.TaskStatus)
/**
* 云端同步大任务暂停 / 恢复 指令
*/
fun onSweeperCloudBigTaskSuspendResume(taskId:String, actionType: ActionType, isPop:Boolean)
/**
* 设置轨迹坐标点集合
*/

View File

@@ -24,6 +24,8 @@ import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createReceivedBigTas
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createSweeperTaskEndDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createSweeperTaskExceptionEndDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createSweeperTaskNormalEndDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createSweeperTaskResumeDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createSweeperTaskSuspendDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.printMessage
import com.mogo.och.sweepercloud.view.SweeperCurrentTaskInfoView
import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask
@@ -32,7 +34,7 @@ import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.SubTaskInfo
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.TaskModel
import com.zhjt.mogo.adas.data.sweeper.task.big.SweeperBigTaskStatus
import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendResume
import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm
import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop
import kotlinx.android.synthetic.main.fragment_och_sweeper.sweeper_cl_work_mode
@@ -56,6 +58,7 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
private var mTaskInfo: SweeperTask.TaskInfo? = null
private var mSubTaskType: TaskModel = TaskModel.DEFAULT_MODEL //1:自动驾驶子任务 2人工驾驶子任务 -1:未知任务类型
private var mCurrentRunningSubTaskInfo: SubTaskInfo? = null//当前正在执行的子任务
private var mCurrentSuspendSubTaskInfo: SubTaskInfo? = null//当前暂停的子任务
private val mLoadingDialog: SweeperCloudLoadingDialog by lazy { SweeperCloudLoadingDialog(requireContext()) }
private var mDialog: SweeperCloudDialog? = null
@@ -244,6 +247,11 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
} else {
mCurrentRunningSubTaskInfo = null
}
if (subTaskStatus == SweeperCommon.TaskStatus.SUSPENDED) {
mCurrentSuspendSubTaskInfo = subBuilder.build()
} else {
mCurrentSuspendSubTaskInfo = null
}
//判断是否结束子任务
if (subTaskStatus == SweeperCommon.TaskStatus.FINISHED) {
//已完成的计入任务进度,未完成的不计入
@@ -408,6 +416,68 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
showNotice("任务已暂停")
ToastUtils.showLong("任务已暂停")
//更新任务列表中大任务状态
val builder = it.toBuilder()
builder.taskStatus = SweeperCommon.TaskStatus.SUSPENDED
mTaskInfo = builder.build()
getCurrentTaskView().setData(mTaskInfo, getCurrentRunningSubTaskPosition())
} else if (it.taskStatus == SweeperCommon.TaskStatus.SUSPENDED
&& bigTaskStatus == SweeperCommon.TaskStatus.RUNNING) { //恢复
showNotice("任务已恢复")
ToastUtils.showLong("任务已恢复")
//更新任务列表中大任务状态
val builder = it.toBuilder()
builder.taskStatus = SweeperCommon.TaskStatus.RUNNING
mTaskInfo = builder.build()
getCurrentTaskView().setData(mTaskInfo, getCurrentRunningSubTaskPosition())
}
}
}
/**
* 云端同步 暂停/恢复 大任务状态
*/
fun onSweeperCloudBigTaskSuspendOrResume(taskId: String, actionType: SweeperTaskCloudSuspendResume.ActionType, isPop:Boolean) {
//隐藏loading
mLoadingDialog.hideLoading()
mTaskInfo?.let {
//如果云端要更新的任务和本地缓存任务不是同一个,在无法进行任务列表状态更新
if (it.taskId != taskId) {
return
}
// 发送接收到信息的ACK回执
mPresenter?.sendSweeperSuspendResumeTaskResp(taskId, SweeperTaskCloudSuspendResume.Code.RECEIVED)
if (isPop) {
//数据重复导致连续弹窗
if (mDialog != null && mDialog!!.isShowing) {
return
}
when (actionType) {
SweeperTaskCloudSuspendResume.ActionType.SUSPENDED -> {
mDialog = sweeperCloudTaskSuspendDialog()
showNotice("云端暂停任务,注意车辆即将停车!")
}
else -> {
mDialog = sweeperCloudTaskResumeDialog()
var ttsString = "云端恢复任务,注意车辆即将启动!"
mCurrentSuspendSubTaskInfo?.also { suspendSub ->
val isAutoPoilotState = mPresenter?.autopilotState == STATUS_AUTOPILOT_ENABLE
when {
suspendSub.taskModel == TaskModel.MANUAL -> {
ttsString = "云端恢复任务,请继续手动驾驶完成任务!"
}
suspendSub.taskModel == TaskModel.AUTO && isAutoPoilotState -> {
ttsString = "云端恢复任务,注意车辆即将启动!"
}
suspendSub.taskModel == TaskModel.AUTO && !isAutoPoilotState -> {
ttsString = "云端恢复任务,请到达合适的位置后开启自动驾驶!"
}
}
}
showNotice(ttsString)
}
}
mDialog?.show()
}
}
}
@@ -563,7 +633,11 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
}
}, subTaskInfo)
mDialog?.show()
showNotice("请确认并执行子任务")
if (subTaskInfo.taskModel == TaskModel.MANUAL) {
showNotice("请确认并执行子任务")
} else { //自动驾驶子任务需要提醒在N档且拉起手刹做好准备工作
showNotice("请确认并执行子任务, 保持N档拉手刹再进入自动驾驶")
}
}
/**
@@ -609,4 +683,50 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
showNotice("已为您接取任务")
}
}
/**
* 大任务暂停弹框
*/
private fun sweeperCloudTaskSuspendDialog(): SweeperCloudDialog? {
return createSweeperTaskSuspendDialog(context, object : SweeperCloudDialogClickListener {
override fun onConfirm() {
}
override fun onRefuseOrEnd() {
}
override fun onCountDownStop() {
}
override fun onNext() {
}
})
}
/**
* 大任务恢复弹框
*/
private fun sweeperCloudTaskResumeDialog(): SweeperCloudDialog? {
return createSweeperTaskResumeDialog(context, object : SweeperCloudDialogClickListener {
override fun onConfirm() {
}
override fun onRefuseOrEnd() {
}
override fun onCountDownStop() {
}
override fun onNext() {
}
})
}
}

View File

@@ -410,8 +410,14 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
}
@Override
public void onSweeperFutianCloudTaskCloudSuspendResume(@NonNull SweeperCloudTask.MessageType messageType, @Nullable String reqNo, long sysTime, @Nullable SweeperTaskCloudSuspendResume.BigTaskActionPush bigTaskActionPush) {
public void onSweeperFutianCloudTaskCloudSuspendResume(@NonNull SweeperCloudTask.MessageType messageType, @Nullable String reqNo, long sysTime,
@Nullable SweeperTaskCloudSuspendResume.BigTaskActionPush bigTaskActionPush) {
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "messageType: " + messageType.getNumber() + " sysTime" + sysTime + " reqNo" + reqNo + " " +
"onSweeperFutianCloudTaskCloudSuspendResume" + printMessage(bigTaskActionPush));
if (mSweeperTaskCallback != null && bigTaskActionPush != null) {
msgTypeAndReqNo.put(messageType.getNumber(), reqNo);
mSweeperTaskCallback.onSweeperCloudBigTaskSuspendResume(bigTaskActionPush.getTaskId(), bigTaskActionPush.getAction(), bigTaskActionPush.getIsPop());
}
}
@Override
@@ -590,6 +596,24 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
//SweeperCloudTaskUtils.mockSendCloudBootable();
}
/**
* 大任务暂停/恢复 接收到指令到 回复
* @param taskId
* @param code
*/
public void sendSweeperSuspendResumeTaskResp(String taskId, SweeperTaskCloudSuspendResume.Code code) {
SweeperTaskCloudSuspendResume.BigTaskActionResp.Builder builder = SweeperTaskCloudSuspendResume.BigTaskActionResp.newBuilder();
builder.setSn(getDriverSn());
builder.setTaskId(taskId);
builder.setCode(code);
SweeperTaskCloudSuspendResume.BigTaskActionResp resp = builder.build();
String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTaskSuspendResume.getNumber());
CallerLogger.INSTANCE.d(M_SWEEPER + TAG,
"sendSweeperSuspendResumeTaskResp" + printMessage(resp) + " reqNo:" + reqNo + " messageType:" + SweeperCloudTask.MessageType.CloudPushTaskSuspendResume);
getAutoPilotControlManager().sendSweeperCloudSuspendResumeTaskResp(reqNo, resp);
}
public CallerAutoPilotControlManager getAutoPilotControlManager() {
return CallerAutoPilotControlManager.INSTANCE;
}

View File

@@ -1,6 +1,9 @@
package com.mogo.och.sweepercloud.presenter;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.mvp.Presenter;
import com.mogo.eagle.core.data.map.MogoLocation;
@@ -8,8 +11,8 @@ import com.mogo.eagle.core.function.call.autopilot.CallerSweeperFutianCleanSyste
import com.mogo.eagle.core.utilcode.util.ThreadUtils;
import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
import com.mogo.och.sweepercloud.bean.SweeperRoutePlanningUpdateReqBean;
import com.mogo.och.sweepercloud.callback.ISweeperControllerStatusCallback;
import com.mogo.och.sweepercloud.callback.ISweeperCloudTaskCallback;
import com.mogo.och.sweepercloud.callback.ISweeperControllerStatusCallback;
import com.mogo.och.sweepercloud.callback.ISweeperTaskRouteCallback;
import com.mogo.och.sweepercloud.database.bean.WeltDataBean;
import com.mogo.och.sweepercloud.fragment.SweeperFragment;
@@ -18,15 +21,12 @@ import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask;
import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable;
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon;
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask;
import com.zhjt.mogo.adas.data.sweeper.task.big.SweeperBigTaskStatus;
import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendResume;
import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm;
import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import chassis.ChassisStatesOuterClass;
/**
@@ -175,6 +175,15 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
SweeperTaskModel.getInstance().sendSweeperAutopilotBootable(taskId, subTaskId, lineId);
}
/**
* 大任务暂停/恢复 接收到指令到 回复
* @param taskId
* @param code
*/
public void sendSweeperSuspendResumeTaskResp(String taskId, SweeperTaskCloudSuspendResume.Code code) {
SweeperTaskModel.getInstance().sendSweeperSuspendResumeTaskResp(taskId, code);
}
@Override
public void setRouteList(@NonNull ArrayList<SweeperRoutePlanningUpdateReqBean.Result> routeList) {
mView.setTaskRouteList(routeList);
@@ -216,6 +225,11 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
ThreadUtils.runOnUiThread(() -> mView.onSweeperCloudBigTaskStatus(taskId, bigTaskStatus));
}
@Override
public void onSweeperCloudBigTaskSuspendResume(@NonNull String taskId, @NonNull SweeperTaskCloudSuspendResume.ActionType actionType, boolean isPop) {
ThreadUtils.runOnUiThread(() -> mView.onSweeperCloudBigTaskSuspendOrResume(taskId, actionType, isPop));
}
@Override
public void setWeltDataToMap(@NonNull ArrayList<WeltDataBean> weltDataBeans, boolean isWeltData, @NonNull String distance) {
ThreadUtils.runOnUiThread(() -> mView.setWeltDataToMap(weltDataBeans, isWeltData, distance));

View File

@@ -15,13 +15,15 @@ import com.mogo.och.sweepercloud.ui.dialog.SweeperCloudDialog
import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask.MessageType
import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.*
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.Location
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.SubTaskInfo
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.TaskInfo
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.TaskModel
import com.zhjt.mogo.adas.data.sweeper.task.big.SweeperBigTaskStatus
import com.zhjt.mogo.adas.data.sweeper.task.big.SweeperBigTaskStatus.BigTaskStatus
import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm.TaskConfirm
import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus
import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop
import java.util.*
import java.util.UUID
object SweeperCloudTaskUtils {
const val TAG = "SweeperCloudTaskUtils"
@@ -204,7 +206,7 @@ object SweeperCloudTaskUtils {
val builder = SweeperBigTaskStatus.BigTaskStatusPush.newBuilder()
builder.sn = getDriverSn()
builder.taskId = "10"
builder.taskStatus = BigTaskStatus.FINISHED
builder.taskStatus = SweeperCommon.TaskStatus.FINISHED
builder.systemTime = System.currentTimeMillis()
SweeperTaskModel.getInstance().onSweeperFutianCloudBigTaskStatus(
MessageType.CloudPushBigTaskStatus, "${System.currentTimeMillis()}",
@@ -358,6 +360,40 @@ object SweeperCloudTaskUtils {
return context?.let { it1 -> builder.build(it1) }
}
@JvmStatic
fun createSweeperTaskSuspendDialog(
context: Context?,
listener: SweeperCloudDialogClickListener?
): SweeperCloudDialog? {
var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder()
builder.titleStr = "任务暂停"
builder.contentStr = "云端暂停任务,注意车辆即将停车!"
builder.tipStr = "【云端任务恢复前不可启动自动驾驶】"
builder.leftStr = "确认"
builder.middleStr = ""
builder.rightStr = ""
builder.countDownTime = 10
builder.listener = listener
return context?.let { it1 -> builder.build(it1) }
}
@JvmStatic
fun createSweeperTaskResumeDialog(
context: Context?,
listener: SweeperCloudDialogClickListener?
): SweeperCloudDialog? {
var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder()
builder.titleStr = "任务恢复"
builder.contentStr = "云端恢复任务,注意车辆即将启动!"
builder.tipStr = "【注意安全,坐稳扶好】"
builder.leftStr = "确认"
builder.middleStr = ""
builder.rightStr = ""
builder.countDownTime = 10
builder.listener = listener
return context?.let { it1 -> builder.build(it1) }
}
@JvmStatic
fun printMessage(message: MessageOrBuilder): String {
return "\n"+TextFormat.printer().escapingNonAscii(false).printToString(message)

View File

@@ -10,6 +10,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.sweepercloud.R
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon.TaskStatus
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.SubTaskInfo
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.TaskInfo
@@ -46,7 +47,7 @@ class SweeperCurrentTaskInfoView : ConstraintLayout {
private fun initView(context: Context) {
LayoutInflater.from(context).inflate(R.layout.sweeper_current_task_info, this)
setSubTaskState(false)
updateTaskStateText(TaskStatus.TO_START)
}
fun getAutoBtn(): TextView {
@@ -85,10 +86,10 @@ class SweeperCurrentTaskInfoView : ConstraintLayout {
* 设置当前任务数据
*/
fun setData(
subTaskBean: TaskInfo?,
taskInfo: TaskInfo?,
currentPosition: Int = -1
) {
subTaskBean?.apply {
taskInfo?.apply {
this@SweeperCurrentTaskInfoView.listTask = subListList
tvTaskName.text = taskName
val calendarStart = DateTimeUtil.formatLongToCalendar(taskStartTime)
@@ -104,25 +105,32 @@ class SweeperCurrentTaskInfoView : ConstraintLayout {
listTask?.let {
//特殊处理当前暂无执行中任务的情况
if (currentPosition == -1) {
setSubTaskState(false)
updateTaskStateText(TaskStatus.TO_START)
setCurrentData(currentPosition + 1)
} else {
setSubTaskState(it[currentPosition].taskStatus == TaskStatus.RUNNING)
updateTaskStateText(taskInfo?.taskStatus ?: TaskStatus.RUNNING)
setCurrentData(currentPosition)
}
}
}
/**
* 设置任务的状态
* 设置任务的状态
*/
private fun setSubTaskState(isWorking: Boolean) {
if (isWorking) {
tvTaskState.text = "任务执行中"
tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_working)
} else {
tvTaskState.text = "任务待开始"
tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_not_ready)
private fun updateTaskStateText(taskStatus: SweeperCommon.TaskStatus) {
when (taskStatus) {
SweeperCommon.TaskStatus.RUNNING -> {
tvTaskState.text = "任务执行中"
tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_working)
}
SweeperCommon.TaskStatus.SUSPENDED -> {
tvTaskState.text = "任务已暂停"
tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_not_ready)
}
else -> {
tvTaskState.text = "任务待开始"
tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_not_ready)
}
}
}