diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/callback/ISweeperCloudTaskCallback.kt b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/callback/ISweeperCloudTaskCallback.kt index 92fc78aafb..631cfd330a 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/callback/ISweeperCloudTaskCallback.kt +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/callback/ISweeperCloudTaskCallback.kt @@ -3,13 +3,15 @@ package com.mogo.och.sweepercloud.callback import chassis.ChassisStatesOuterClass import com.mogo.och.sweepercloud.bean.SweeperRoutePlanningUpdateReqBean import com.mogo.och.sweepercloud.database.bean.WeltDataBean -import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask +import com.zhjt.mogo.adas.data.AiCloudTask import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable.IsBootableResp 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 /** @@ -20,7 +22,7 @@ interface ISweeperCloudTaskCallback { /** * 接取云端任务/正在执行中任务信息回调 */ - fun onSweeperCloudTask(messageType: SweeperCloudTask.MessageType,taskInfo: SweeperTask.TaskInfo?) + fun onSweeperCloudTask(messageType: AiCloudTask.MessageType, taskInfo: SweeperTask.TaskInfo?) /** * 云端下发子任务请求pad确认 @@ -40,7 +42,7 @@ interface ISweeperCloudTaskCallback { /** * 挂起/恢复 */ - fun onSweeperCloudTaskSuspendResume(messageType: SweeperCloudTask.MessageType,taskId:String,subTaskId:String,code:Code) + fun onSweeperCloudTaskSuspendResume(messageType: AiCloudTask.MessageType,taskId:String,subTaskId:String,code:Code) /** * pad请求云端进入自驾 @@ -50,7 +52,13 @@ interface ISweeperCloudTaskCallback { /** * 云端同步大任务状态 */ - fun onSweeperCloudBigTaskStatus(taskId:String,subTaskStatus: SweeperBigTaskStatus.BigTaskStatus) + fun onSweeperCloudBigTaskStatus(taskId:String, bigTaskStatus: SweeperCommon.TaskStatus, isPop:Boolean) + + /** + * 云端同步大任务暂停 / 恢复 指令 + */ + fun onSweeperCloudBigTaskSuspendResume(taskId:String, actionType: ActionType, isPop:Boolean) + /** * 设置轨迹坐标点集合 */ diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/constant/SweeperConst.kt b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/constant/SweeperConst.kt index aa96c7f40d..1c4f5891e8 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/constant/SweeperConst.kt +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/constant/SweeperConst.kt @@ -55,9 +55,9 @@ class SweeperConst { const val EVENT_PARAM_UNABLE_START_REASON = "unable_start_reason"; /** - * 订单起终点Marker类型 + * 子任务起终点Marker类型 */ - const val TYPE_MARKER_SWEEPER_ORDER = "TYPE_MARKER_SWEEPER_ORDER" + const val TYPE_MARKER_SWEEPER_SUBTASK_START_END = "TYPE_MARKER_SWEEPER_SUBTASK_START_END" const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java index 91673ddac4..b7cdb653fd 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/BaseSweeperTabFragment.java @@ -53,6 +53,7 @@ import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; +import java.util.Random; import mogo.telematics.pad.MessagePad; @@ -207,6 +208,24 @@ public abstract class BaseSweeperTabFragment SweeperCloudTaskUtils.mockSendCloudBigTaskStatus() ); + // 模拟 添加高精地图Marker + findViewById(R.id.btnAddHDMarker).setOnClickListener(view -> { + // 坐标地址:湖南省衡阳市雁峰区金龙坪街道科学城大道衡山科学城停车场 + SweeperCloudTaskUtils.mockAddHdMarker("marker_sweeper_subtask_123_start", + 112.57742887355035, + 26.82068193910221, + true); + // 坐标地址:湖南省衡阳市雁峰区岳屏镇雁鸣路 + SweeperCloudTaskUtils.mockAddHdMarker("marker_sweeper_subtask_123_end", + 112.56666738544979, + 26.822879976829867, + false); + } + ); + // 模拟 移除高精地图Marker + findViewById(R.id.btnRemoveHDMarker).setOnClickListener(view -> + SweeperCloudTaskUtils.mockRemoveHDMarker() + ); mTrafficDataView.getSpeedImage().setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/SweeperFragment.kt b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/SweeperFragment.kt index 0714e5ddc3..361c88dcbe 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/SweeperFragment.kt +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/fragment/SweeperFragment.kt @@ -5,38 +5,48 @@ import android.view.View import androidx.lifecycle.lifecycleScope import chassis.ChassisStatesOuterClass import com.amap.api.maps.model.LatLng -import com.elegant.utils.UiThreadHandler import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.Companion.STATUS_AUTOPILOT_ENABLE +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.Companion.STATUS_AUTOPILOT_RUNNING +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.map.overlay.core.Level +import com.mogo.map.overlay.point.Point +import com.mogo.och.common.module.utils.OCHThreadPoolManager import com.mogo.och.common.module.voice.VoiceNotice.showNotice import com.mogo.och.sweepercloud.R import com.mogo.och.sweepercloud.bean.SweeperRoutePlanningUpdateReqBean import com.mogo.och.sweepercloud.callback.SweeperCloudDialogClickListener +import com.mogo.och.sweepercloud.constant.SweeperConst.Companion.TYPE_MARKER_SWEEPER_SUBTASK_START_END import com.mogo.och.sweepercloud.database.MyDataBase import com.mogo.och.sweepercloud.presenter.SweeperPresenter import com.mogo.och.sweepercloud.ui.dialog.SweeperCloudDialog import com.mogo.och.sweepercloud.ui.dialog.SweeperCloudLoadingDialog +import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createConfirmStartSubTaskDialog -import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createReceivedTaskInfoDialog +import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createReceivedBigTaskInfoDialog 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 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.common.SweeperCommon.TaskStatus 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.* -import kotlinx.android.synthetic.main.sweeper_no_data_common_view.* +import kotlinx.android.synthetic.main.fragment_och_sweeper.sweeper_cl_work_mode +import kotlinx.android.synthetic.main.fragment_och_sweeper.sweeper_current_task_view +import kotlinx.android.synthetic.main.sweeper_no_data_common_view.noTaskDataView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -54,8 +64,13 @@ class SweeperFragment : BaseSweeperTabFragment { + mDialog = sweeperCloudTaskSuspendDialog(it.taskId) + showNotice("云端暂停任务,注意车辆即将停车!") + } + + else -> { + var ttsString = "云端恢复任务,注意车辆即将启动!" + mCurrentSuspendSubTaskInfo?.also { suspendSub -> + val isAutoPoilotState = + mPresenter?.autopilotState == STATUS_AUTOPILOT_RUNNING + when { + suspendSub.taskModel == TaskModel.MANUAL -> { + ttsString = "云端恢复任务,请继续手动驾驶完成任务!" + } + + suspendSub.taskModel == TaskModel.AUTO && isAutoPoilotState -> { + ttsString = "云端恢复任务,注意车辆即将启动!" + } + + suspendSub.taskModel == TaskModel.AUTO && !isAutoPoilotState -> { + ttsString = "云端恢复任务,请到达合适的位置后开启自动驾驶!" + } + } + } + showNotice(ttsString) + mDialog = sweeperCloudTaskResumeDialog(ttsString, it.taskId) + } + } mDialog?.show() - showNotice("任务已结束") + } else { + // 发送接收到信息的ACK回执 + mPresenter?.sendSweeperSuspendResumeTaskResp( + taskId, + SweeperTaskCloudSuspendResume.Code.RECEIVED + ) } } } @@ -402,7 +587,11 @@ class SweeperFragment : BaseSweeperTabFragment= 1) { - return "${day}天${hour}时${minute}分钟" + } + + override fun onCountDownStop() { + // 发送接收到信息的ACK回执 + mPresenter?.sendSweeperSuspendResumeTaskResp( + taskId, + SweeperTaskCloudSuspendResume.Code.RECEIVED + ) + } + + override fun onNext() { + + } + }) + } + + /** + * 大任务恢复弹框 + */ + private fun sweeperCloudTaskResumeDialog(contentStr: String, taskId: String): SweeperCloudDialog? { + return createSweeperTaskResumeDialog(context, object : SweeperCloudDialogClickListener { + override fun onConfirm() { + // 发送接收到信息的ACK回执 + mPresenter?.sendSweeperSuspendResumeTaskResp( + taskId, + SweeperTaskCloudSuspendResume.Code.RECEIVED + ) + } + + override fun onRefuseOrEnd() { + + } + + override fun onCountDownStop() { + // 发送接收到信息的ACK回执 + mPresenter?.sendSweeperSuspendResumeTaskResp( + taskId, + SweeperTaskCloudSuspendResume.Code.RECEIVED + ) + } + + override fun onNext() { + + } + }, contentStr) + } + + /** + * 添加高精地图中的 子任务 起终点 Marker + */ + private fun addHDMapMarkerBySubTask(subTask: SubTaskInfo) { + if (subTask.startLocation == null + || subTask.endLocation == null + || subTask.subTaskId == null + ) { + return } - if (hour >= 1) { - return "${hour}时${minute}分钟" + val startPoint = subTask.startLocation + val endPoint = subTask.endLocation + val hdMarkerIdStart = "marker_sweeper_subtask_${subTask.subTaskId}_start" + val hdMarkerIdEnd = "marker_sweeper_subtask_${subTask.subTaskId}_end" + + val setStartMarkerRunnable = createSetHDMapMakerRunnable(hdMarkerIdStart, startPoint.wgsLongitude, startPoint.wgsLatitude, true) + val setEndMarkerRunnable = createSetHDMapMakerRunnable(hdMarkerIdEnd, endPoint.wgsLongitude, endPoint.wgsLatitude, false) + val removeMarkerRunnable = createRemoveHDMapMakerRunnable() + + val addSubTaskHDMarkRunnable = Runnable { + // 先移除高精地图中的 子任务 起终点 Marker, 避免重复添加 + removeMarkerRunnable.run() + setStartMarkerRunnable.run() + setEndMarkerRunnable.run() } - return "${minute}分钟" + OCHThreadPoolManager.getsInstance().execute(addSubTaskHDMarkRunnable) + } + + /** + * 移除高精地图中的 子任务 起终点 Marker + */ + private fun removeHDMapMarkerBySubTask(subTaskInfo: SubTaskInfo?) { + val removeMarkerRunnable = createRemoveHDMapMakerRunnable() + OCHThreadPoolManager.getsInstance().execute(removeMarkerRunnable) + } + + /** + * 设置高精地图里的Marker Runnable + */ + private fun createSetHDMapMakerRunnable( + uuid: String, + longitude: Double, + latitude: Double, + isStartMarker: Boolean + ) : Runnable { + //开启线程执行起终点marker设置 + val setMapMarkerRunnable = Runnable { + CallerLogger.d( + SceneConstant.M_SWEEPER + "-" +TAG + "-setMapMaker", + "threadName=${Thread.currentThread().name}, uuid=$uuid, latitude=$latitude, longitude=$longitude" + ) + + val builder = + Point.Options.Builder(TYPE_MARKER_SWEEPER_SUBTASK_START_END, Level.MAP_MARKER) + .setId(uuid) + .anchor(0.5f, 0.5f) + .set3DMode(true) + .isUseGps(true) + .controlAngle(true) + .icon3DRes(if (isStartMarker) R.raw.star_marker else R.raw.end_marker) + .longitude(longitude) + .latitude(latitude) + val mapUIController = CallerMapUIServiceManager.getMapUIController() + if (mapUIController != null) { + val centerLine = mapUIController.getCenterLineInfo(longitude, latitude, -1f) + if (null != centerLine) { // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 地图未初始化会返回空 + val angle = centerLine.angle + if (angle != null) { + builder.rotate(angle.toFloat()) + } + } + } + val overlayManager = CallerMapUIServiceManager.getOverlayManager() + overlayManager?.showOrUpdatePoint(builder.build()) + } + return setMapMarkerRunnable + } + + /** + * 移除高精地图里的Marker Runnable + */ + private fun createRemoveHDMapMakerRunnable() : Runnable{ + //开启线程移除起终点marker设置 + val removeMapMarkerRunnable = Runnable { + CallerLogger.d( + SceneConstant.M_SWEEPER + "-" +TAG + "-RemoveMapMaker", + "threadName=${Thread.currentThread().name}" + ) + val overlayManager = CallerMapUIServiceManager.getOverlayManager() + overlayManager?.removeAllPointsInOwner(TYPE_MARKER_SWEEPER_SUBTASK_START_END) + } + return removeMapMarkerRunnable } } \ No newline at end of file diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java index d28a75a76f..2b749ff5ed 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java @@ -39,12 +39,13 @@ import com.mogo.och.sweepercloud.constant.SweeperConst; import com.mogo.och.sweepercloud.database.MyDataBase; import com.mogo.och.sweepercloud.database.bean.WeltDataBean; import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils; -import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask; +import com.zhjt.mogo.adas.data.AiCloudTask; import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable; import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask; -import com.zhjt.mogo.adas.data.sweeper.task.SweeperTaskSuspendResume; 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.s_r.SweeperTaskSuspendResume; import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus; import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop; @@ -183,7 +184,6 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM }); } - public void setControllerStatusCallback(ISweeperControllerStatusCallback callback) { this.mControllerStatusCallback = callback; } @@ -217,7 +217,6 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } } } - }; public void setSubtask(String subTaskId, SweeperTask.TaskModel subTaskType, int currentLineId) { @@ -257,8 +256,9 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM return this.mAutopilotState; } - public static List coordinateConverterWgsToGcjList(Context mContext, - List mogoLatLngList) { + public static List coordinateConverterWgsToGcjList( + Context mContext, + List mogoLatLngList) { List points = new ArrayList<>(); for (MessagePad.Location m : mogoLatLngList) { LatLng mogoLatLng = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(mContext, m); @@ -305,7 +305,6 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } if (mSubTaskType == SweeperTask.TaskModel.MANUAL) {//收集人工驾驶子任务坐标点 addCoordinates(gnssInfo); - return; } } }; @@ -333,7 +332,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } @Override - public void onSweeperFutianCloudTask(@NonNull SweeperCloudTask.MessageType messageType, String reqNo, long sysTime, + public void onSweeperFutianCloudTask(@NonNull AiCloudTask.MessageType messageType, String reqNo, long sysTime, SweeperTask.TaskInfo taskInfo) { CallerLogger.d(M_SWEEPER + TAG, @@ -345,7 +344,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } @Override - public void onSweeperFutianCloudTaskConfirm(@NonNull SweeperCloudTask.MessageType messageType, String reqNo, long sysTime, + public void onSweeperFutianCloudTaskConfirm(@NonNull AiCloudTask.MessageType messageType, String reqNo, long sysTime, SweeperTaskConfirm.TaskConfirm taskConfirm) { CallerLogger.d(M_SWEEPER + TAG, "messageType: " + messageType.getNumber() + " sysTime:" + sysTime + " reqNo:" + reqNo + " " + @@ -357,7 +356,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } @Override - public void onSweeperFutianCloudTaskStatus(@NonNull SweeperCloudTask.MessageType messageType, String reqNo, long sysTime, + public void onSweeperFutianCloudTaskStatus(@NonNull AiCloudTask.MessageType messageType, String reqNo, long sysTime, SweeperTaskStatus.TaskStatusPush taskStatusPush) { CallerLogger.d(M_SWEEPER + TAG, "messageType: " + messageType.getNumber() + " sysTime:" + sysTime + " reqNo:" + reqNo + " " + "onSweeperFutianCloudTaskStatus:" + printMessage(taskStatusPush)); @@ -368,7 +367,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } @Override - public void onSweeperFutianCloudTaskStop(@NonNull SweeperCloudTask.MessageType messageType, String reqNo, long sysTime, + public void onSweeperFutianCloudTaskStop(@NonNull AiCloudTask.MessageType messageType, String reqNo, long sysTime, SweeperTaskStop.StopTaskReq stopTaskReq) { CallerLogger.d(M_SWEEPER + TAG, "messageType: " + messageType.getNumber() + " sysTime:" + sysTime + " reqNo:" + reqNo + " " + "onSweeperFutianCloudTaskStop:" + printMessage(stopTaskReq)); @@ -379,7 +378,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } @Override - public void onSweeperFutianCloudTaskSuspendResume(@NonNull SweeperCloudTask.MessageType messageType, String reqNo, long sysTime, + public void onSweeperFutianCloudTaskSuspendResume(@NonNull AiCloudTask.MessageType messageType, String reqNo, long sysTime, SweeperTaskSuspendResume.SuspendResumeTaskResp suspendResumeTaskResp) { CallerLogger.d(M_SWEEPER + TAG, "messageType: " + messageType.getNumber() + " sysTime:" + sysTime + " reqNo:" + reqNo + " " + "onSweeperFutianCloudTaskSuspendResume:" + printMessage(suspendResumeTaskResp)); @@ -391,7 +390,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } @Override - public void onSweeperFutianCloudBootable(@NonNull SweeperCloudTask.MessageType messageType, String reqNo, long sysTime, + public void onSweeperFutianCloudBootable(@NonNull AiCloudTask.MessageType messageType, String reqNo, long sysTime, SweeperBootable.IsBootableResp isBootableResp) { CallerLogger.d(M_SWEEPER + TAG, "messageType: " + messageType.getNumber() + " sysTime:" + sysTime + " reqNo:" + reqNo + " " + "onSweeperFutianCloudBootable:" + printMessage(isBootableResp)); @@ -402,13 +401,24 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } @Override - public void onSweeperFutianCloudBigTaskStatus(@NonNull SweeperCloudTask.MessageType messageType, String reqNo, long sysTime, + public void onSweeperFutianCloudBigTaskStatus(@NonNull AiCloudTask.MessageType messageType, String reqNo, long sysTime, SweeperBigTaskStatus.BigTaskStatusPush bigTaskStatusPush) { CallerLogger.d(M_SWEEPER + TAG, "messageType: " + messageType.getNumber() + " sysTime:" + sysTime + " reqNo:" + reqNo + " " + "onSweeperFutianCloudBigTaskStatus:" + printMessage(bigTaskStatusPush)); if (mSweeperTaskCallback != null && bigTaskStatusPush != null) { msgTypeAndReqNo.put(messageType.getNumber(), reqNo); - mSweeperTaskCallback.onSweeperCloudBigTaskStatus(bigTaskStatusPush.getTaskId(), bigTaskStatusPush.getTaskStatus()); + mSweeperTaskCallback.onSweeperCloudBigTaskStatus(bigTaskStatusPush.getTaskId(), bigTaskStatusPush.getTaskStatus(), bigTaskStatusPush.getIsPop()); + } + } + + @Override + public void onSweeperFutianCloudTaskCloudSuspendResume(@NonNull AiCloudTask.MessageType messageType, @Nullable String reqNo, long sysTime, + @Nullable SweeperTaskCloudSuspendResume.BigTaskActionPush bigTaskActionPush) { + CallerLogger.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()); } } @@ -430,24 +440,25 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM @Override public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { - if (roboSweeperTaskIndex == null) { - return; - } - - long current = System.currentTimeMillis(); - if (current - mWeltDataCurrentTimeMillis <= WELT_DATA_INTERVAL_MILLIS) { - return; - } - mWeltDataCurrentTimeMillis = current; - - //没有任务数据时,不处理贴边 - if (!isHasTaskInfo) { - return; - } - - CallerLogger.d(M_SWEEPER + TAG, - "mSubTaskType:" + mSubTaskType + "+ onSweeperFutianTaskIndexData:" + printMessage(roboSweeperTaskIndex)); - handleWeltData(roboSweeperTaskIndex); +// 20230728 因小地图不展示了,贴边数据先不处理了,浪费资源 +// if (roboSweeperTaskIndex == null) { +// return; +// } +// +// long current = System.currentTimeMillis(); +// if (current - mWeltDataCurrentTimeMillis <= WELT_DATA_INTERVAL_MILLIS) { +// return; +// } +// mWeltDataCurrentTimeMillis = current; +// +// //没有任务数据时,不处理贴边 +// if (!isHasTaskInfo) { +// return; +// } +// +// CallerLogger.INSTANCE.d(M_SWEEPER + TAG, +// "mSubTaskType:" + mSubTaskType + "+ onSweeperFutianTaskIndexData:" + printMessage(roboSweeperTaskIndex)); +// handleWeltData(roboSweeperTaskIndex); } /** @@ -494,7 +505,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM } } - public static String format(double value) { + private static String format(double value) { BigDecimal bd = new BigDecimal(value); bd = bd.setScale(2, RoundingMode.HALF_UP); return bd.toString(); @@ -508,8 +519,9 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM builder.setSn(getDriverSn()); String reqNo = SweeperCloudTaskUtils.getRequestId(); SweeperTask.GetTaskReq getTaskReq = builder.build(); + CallerLogger.d(M_SWEEPER + TAG, - "getCurrentTask:" + printMessage(getTaskReq) + " reqNo:" + reqNo + " messageType:" + SweeperCloudTask.MessageType.PadSendGetTaskReq.getNumber()); + "getCurrentTask:" + printMessage(getTaskReq) + " reqNo:" + reqNo + " messageType:" + AiCloudTask.MessageType.PadSendGetTaskReq.getNumber()); getAutoPilotControlManager().sendSweeperGetTaskReq(reqNo, getTaskReq); } @@ -522,10 +534,11 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM builder.setTaskId(taskId); builder.setCode(code); SweeperTask.StartTaskResp startTaskResp = builder.build(); - String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTask.getNumber()); + String reqNo = msgTypeAndReqNo.get(AiCloudTask.MessageType.CloudPushTask.getNumber()); + getAutoPilotControlManager().sendSweeperStartTaskResp(reqNo, startTaskResp); CallerLogger.d(M_SWEEPER + TAG, - "sendSweeperStartTaskResp:" + printMessage(startTaskResp) + " reqNo:" + reqNo + " messageType:" + SweeperCloudTask.MessageType.CloudPushTask.getNumber()); + "sendSweeperStartTaskResp:" + printMessage(startTaskResp) + " reqNo:" + reqNo + " messageType:" + AiCloudTask.MessageType.CloudPushTask.getNumber()); } /** @@ -538,9 +551,9 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM builder.setSubTaskId(subTaskId); builder.setCode(code); SweeperTaskConfirm.TaskConfirmResp taskConfirmResp = builder.build(); - String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTaskConfirm.getNumber()); + String reqNo = msgTypeAndReqNo.get(AiCloudTask.MessageType.CloudPushTaskConfirm.getNumber()); CallerLogger.d(M_SWEEPER + TAG, - "sendSweeperTaskConfirmResp" + printMessage(taskConfirmResp) + " reqNo:" + reqNo + " messageType:" + SweeperCloudTask.MessageType.CloudPushTaskConfirm.getNumber()); + "sendSweeperTaskConfirmResp" + printMessage(taskConfirmResp) + " reqNo:" + reqNo + " messageType:" + AiCloudTask.MessageType.CloudPushTaskConfirm.getNumber()); getAutoPilotControlManager().sendSweeperTaskConfirmResp(reqNo, taskConfirmResp); } @@ -556,9 +569,10 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM builder.setTaskId(taskId); builder.setCode(code); SweeperTaskStop.StopTaskResp stopTaskResp = builder.build(); - String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTaskStop.getNumber()); + String reqNo = msgTypeAndReqNo.get(AiCloudTask.MessageType.CloudPushTaskStop.getNumber()); + CallerLogger.d(M_SWEEPER + TAG, - "sendSweeperStopTaskResp" + printMessage(stopTaskResp) + " reqNo:" + reqNo + " messageType:" + SweeperCloudTask.MessageType.CloudPushTaskStop.getNumber()); + "sendSweeperStopTaskResp" + printMessage(stopTaskResp) + " reqNo:" + reqNo + " messageType:" + AiCloudTask.MessageType.CloudPushTaskStop.getNumber()); getAutoPilotControlManager().sendSweeperStopTaskResp(reqNo, stopTaskResp); } @@ -577,13 +591,31 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM builder.setLineId(lineId); SweeperBootable.IsBootable isBootable = builder.build(); String reqNo = SweeperCloudTaskUtils.getRequestId(); + CallerLogger.d(M_SWEEPER + TAG, - "sendSweeperAutopilotBootable" + printMessage(isBootable) + " reqNo:" + reqNo + " messageType:" + SweeperCloudTask.MessageType.PadSendBootable.getNumber()); + "sendSweeperAutopilotBootable" + printMessage(isBootable) + " reqNo:" + reqNo + " messageType:" + AiCloudTask.MessageType.PadSendBootable.getNumber()); getAutoPilotControlManager().sendSweeperAutopilotBootable(reqNo, isBootable); - // TODO: 2023/5/16 //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(AiCloudTask.MessageType.CloudPushTaskSuspendResume.getNumber()); + + CallerLogger.d(M_SWEEPER + TAG, + "sendSweeperSuspendResumeTaskResp" + printMessage(resp) + " reqNo:" + reqNo + " messageType:" + AiCloudTask.MessageType.CloudPushTaskSuspendResume); + getAutoPilotControlManager().sendSweeperCloudSuspendResumeTaskResp(reqNo, resp); + } + public CallerAutoPilotControlManager getAutoPilotControlManager() { return CallerAutoPilotControlManager.INSTANCE; } @@ -594,23 +626,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM @Override public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { - //CallerLogger.d(M_SWEEPER + TAG, "onAutopilotStatusResponse state:" + autoPilotStatusInfo.getState()); - this.mAutopilotState = autoPilotStatusInfo.getState(); - if (mControllerStatusCallback != null) { - mControllerStatusCallback.onAutopilotState(autoPilotStatusInfo.getState()); - } - switch (autoPilotStatusInfo.getState()) { - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE://不可自动驾驶 - break; - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE://人工驾驶 - break; - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING://自动驾驶中 - break; - case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING://平行驾驶 - break; - default: - break; - } + } @Override @@ -631,6 +647,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM @Override public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { if (status == 0x00) {//判断工控机重连后,获取当前正在执行的子任务,延时10秒,防止工控机连接上时SN为空 + CallerAutoPilotControlManager.INSTANCE.setIsSubscribeBackCameraVideoVideo(0, false);//TODO 当前3.2.0版本产品未规划后摄像头展示功能 UiThreadHandler.postDelayed(() -> { getCurrentTask(); }, 10000); @@ -666,11 +683,27 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM @Override public void onAutopilotStatusResponse(int state) { - // TODO: 2023/6/19 bingbing + //CallerLogger.d(M_SWEEPER + TAG, "onAutopilotStatusResponse state:" + state); + this.mAutopilotState = state; + if (mControllerStatusCallback != null) { + mControllerStatusCallback.onAutopilotState(state); + } + switch (state) { + case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE://不可自动驾驶 + break; + case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE://人工驾驶 + break; + case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING://自动驾驶中 + break; + case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING://平行驾驶 + break; + default: + break; + } } @Override public void onAutopilotDockerInfo(@NonNull String dockerVersion) { - // TODO: 2023/6/19 bingbing + } } diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/presenter/SweeperPresenter.java b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/presenter/SweeperPresenter.java index ef59d0863f..5c8cf98409 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/presenter/SweeperPresenter.java +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/presenter/SweeperPresenter.java @@ -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.autopilotmanager.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 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 routeList) { mView.setTaskRouteList(routeList); @@ -212,8 +221,13 @@ public class SweeperPresenter extends Presenter } @Override - public void onSweeperCloudBigTaskStatus(@NonNull String taskId, SweeperBigTaskStatus.BigTaskStatus subTaskStatus) { - ThreadUtils.runOnUiThread(() -> mView.onSweeperCloudBigTaskStatus(taskId, subTaskStatus)); + public void onSweeperCloudBigTaskStatus(@NonNull String taskId, SweeperCommon.TaskStatus bigTaskStatus, boolean isPop) { + ThreadUtils.runOnUiThread(() -> mView.onSweeperCloudBigTaskStatus(taskId, bigTaskStatus, isPop)); + } + + @Override + public void onSweeperCloudBigTaskSuspendResume(@NonNull String taskId, @NonNull SweeperTaskCloudSuspendResume.ActionType actionType, boolean isPop) { + ThreadUtils.runOnUiThread(() -> mView.onSweeperCloudBigTaskSuspendOrResume(taskId, actionType, isPop)); } @Override diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskUtils.kt b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskUtils.kt index 9bcd53b6be..e63b6806fb 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskUtils.kt +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskUtils.kt @@ -1,27 +1,36 @@ package com.mogo.och.sweepercloud.util import android.content.Context +import android.util.Log import com.elegant.utils.UiThreadHandler import com.google.protobuf.MessageOrBuilder import com.google.protobuf.TextFormat import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.map.overlay.core.Level +import com.mogo.map.overlay.point.Point import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.OCHThreadPoolManager import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.sweepercloud.R import com.mogo.och.sweepercloud.callback.SweeperCloudDialogClickListener +import com.mogo.och.sweepercloud.constant.SweeperConst import com.mogo.och.sweepercloud.model.SweeperTaskModel import com.mogo.och.sweepercloud.ui.dialog.SweeperCloudDialog -import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask.MessageType +import com.zhjt.mogo.adas.data.AiCloudTask 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" @@ -41,7 +50,7 @@ object SweeperCloudTaskUtils { * 模拟云控发送任务给pad */ @JvmStatic - fun mockSendCloudTaskInfo(messageType: MessageType) { + fun mockSendCloudTaskInfo(messageType: AiCloudTask.MessageType) { val builder = TaskInfo.newBuilder() builder.sn = getDriverSn() builder.taskId = "10" @@ -160,7 +169,7 @@ object SweeperCloudTaskUtils { builder.taskId = "10" builder.subTaskId = "1" SweeperTaskModel.getInstance().onSweeperFutianCloudTaskConfirm( - MessageType.CloudPushTaskConfirm, "${System.currentTimeMillis()}", + AiCloudTask.MessageType.CloudPushTaskConfirm, "${System.currentTimeMillis()}", System.currentTimeMillis(), builder.build() ) } @@ -176,7 +185,7 @@ object SweeperCloudTaskUtils { builder.subTaskId = "1" builder.taskStatus = SweeperCommon.TaskStatus.RUNNING SweeperTaskModel.getInstance().onSweeperFutianCloudTaskStatus( - MessageType.CloudPushTaskStatus, "${System.currentTimeMillis()}", + AiCloudTask.MessageType.CloudPushTaskStatus, "${System.currentTimeMillis()}", System.currentTimeMillis(), builder.build() ) } @@ -191,7 +200,7 @@ object SweeperCloudTaskUtils { builder.taskId = "10" builder.type = SweeperTaskStop.StopTaskType.ADVANCE SweeperTaskModel.getInstance().onSweeperFutianCloudTaskStop( - MessageType.CloudPushTaskStop, "${System.currentTimeMillis()}", + AiCloudTask.MessageType.CloudPushTaskStop, "${System.currentTimeMillis()}", System.currentTimeMillis(), builder.build() ) } @@ -204,10 +213,10 @@ 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()}", + AiCloudTask.MessageType.CloudPushBigTaskStatus, "${System.currentTimeMillis()}", System.currentTimeMillis(), builder.build() ) } @@ -224,26 +233,73 @@ object SweeperCloudTaskUtils { builder.code = SweeperCommon.Code.SUCCEED UiThreadHandler.getsUiHandler().postDelayed({ SweeperTaskModel.getInstance().onSweeperFutianCloudBootable( - MessageType.PadSendBootable, "${System.currentTimeMillis()}", + AiCloudTask.MessageType.PadSendBootable, "${System.currentTimeMillis()}", System.currentTimeMillis(), builder.build() ) }, 10000) } + /** + * 模式添加高精地图Marker + */ + @JvmStatic + fun mockAddHdMarker(uuid: String, longitude: Double, latitude: Double, isStartMarker: Boolean) { + //开启线程执行起终点marker设置 + val setMapMarkerRunnable = Runnable { + val builder = + Point.Options.Builder(SweeperConst.TYPE_MARKER_SWEEPER_SUBTASK_START_END, Level.MAP_MARKER) + .setId(uuid) + .anchor(0.5f, 0.5f) + .set3DMode(true) + .isUseGps(true) + .controlAngle(true) + .icon3DRes(if (isStartMarker) R.raw.star_marker else R.raw.end_marker) + .longitude(longitude) + .latitude(latitude) + val mapUIController = CallerMapUIServiceManager.getMapUIController() + if (mapUIController != null) { + val centerLine = mapUIController.getCenterLineInfo(longitude, latitude, -1f) + if (null != centerLine) { // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致 地图未初始化会返回空 + val angle = centerLine.angle + if (angle != null) { + builder.rotate(angle.toFloat()) + } + } + } + val overlayManager = CallerMapUIServiceManager.getOverlayManager() + Log.d(TAG, "CallerMapUIServiceManager.getOverlayManager()=$overlayManager") + overlayManager?.showOrUpdatePoint(builder.build()) + } + OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable) + } + + /** + * 模拟 移除高精地图Marker + */ + @JvmStatic + fun mockRemoveHDMarker() { + //开启线程移除起终点marker设置 + val removeMapMarkerRunnable = Runnable { + val overlayManager = CallerMapUIServiceManager.getOverlayManager() + overlayManager?.removeAllPointsInOwner(SweeperConst.TYPE_MARKER_SWEEPER_SUBTASK_START_END) + } + OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable) + } + private fun getDriverSn(): String? { return MoGoAiCloudClientConfig.getInstance().sn } /** - * 创建接收任务弹窗 + * 创建接收大任务弹窗 */ @JvmStatic - fun createReceivedTaskInfoDialog(context: Context?, listener: SweeperCloudDialogClickListener?, taskInfo: TaskInfo): SweeperCloudDialog? { + fun createReceivedBigTaskInfoDialog(context: Context?, listener: SweeperCloudDialogClickListener?, taskInfo: TaskInfo): SweeperCloudDialog? { var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder() val startCalendar = DateTimeUtil.formatLongToCalendar(taskInfo.taskStartTime) val endCalendar = DateTimeUtil.formatLongToCalendar(taskInfo.taskEndTime) builder.titleStr = "任务接取" - builder.contentStr = "请确认是否接取${taskInfo.taskName}" + builder.contentStr = "已为您接取任务${taskInfo.taskName}" builder.tipStr = "(任务时间${DateTimeUtil.formatCalendarToString(startCalendar, DateTimeUtil.HH_mm)}-${ DateTimeUtil.formatCalendarToString( endCalendar, @@ -252,8 +308,8 @@ object SweeperCloudTaskUtils { })" builder.leftStr = "确认" builder.middleStr = "" - builder.rightStr = "拒绝" - builder.countDownTime = 15 + builder.rightStr = "" + builder.countDownTime = 10 builder.listener = listener return context?.let { it1 -> builder.build(it1) } } @@ -268,20 +324,20 @@ object SweeperCloudTaskUtils { subTaskInfo: SubTaskInfo ): SweeperCloudDialog? { var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder() - builder.titleStr = "任务确认" - builder.contentStr = "请确认是否执行${subTaskInfo.subTaskName}" + builder.titleStr = "子任务确认" + builder.contentStr = "请确认并执行子任务 ${subTaskInfo.subTaskName}" builder.tipStr = - if (subTaskInfo.taskModel == TaskModel.MANUAL) "[需手动驾驶至终点${subTaskInfo.endLocation.siteName}]" else "[自动驾驶至终点${subTaskInfo.endLocation.siteName}]" + if (subTaskInfo.taskModel == TaskModel.MANUAL) "[需手动驾驶至终点 ${subTaskInfo.endLocation.siteName}]" else "[自动驾驶至终点 ${subTaskInfo.endLocation.siteName},请保持N档拉手刹再进入自动驾驶]" builder.leftStr = "确认" - builder.middleStr = "下一个" - builder.rightStr = "结束" - builder.countDownTime = 15 + builder.middleStr = "" + builder.rightStr = "" + builder.countDownTime = 10 builder.listener = listener return context?.let { it1 -> builder.build(it1) } } /** - * 创建结束任务弹窗 + * 创建任务中止弹窗 */ @JvmStatic fun createSweeperTaskEndDialog( @@ -291,28 +347,33 @@ object SweeperCloudTaskUtils { timeoutStr: String ): SweeperCloudDialog? { var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder() - builder.titleStr = "任务结束" + val titleStr = when (stopTaskType) { + SweeperTaskStop.StopTaskType.ADVANCE -> "任务中止" + SweeperTaskStop.StopTaskType.EXCEPTION -> "任务异常结束" + else -> "任务结束" + } + builder.titleStr = titleStr when (stopTaskType) { //任务提前结束 SweeperTaskStop.StopTaskType.ADVANCE -> { - builder.contentStr = "云端请求终止任务,请确认" - builder.tipStr = "【确认后请接管停车】" + builder.contentStr = "云端中止任务,注意车辆即将停车!" + builder.tipStr = "" builder.leftStr = "确认" builder.middleStr = "" - builder.rightStr = "拒绝" - VoiceNotice.showNotice("云端请求终止任务,请确认") + builder.rightStr = "" + VoiceNotice.showNotice("云端中止任务") } - //任务超时结束 - SweeperTaskStop.StopTaskType.TIMEOUT -> { - builder.contentStr = "任务已超时${timeoutStr},请确认是否结束" - builder.tipStr = "【结束后请接管停车】" + //任务异常结束 + SweeperTaskStop.StopTaskType.EXCEPTION -> { + builder.contentStr = "云端异常结束任务!" + builder.tipStr = "" builder.leftStr = "确认" builder.middleStr = "" - builder.rightStr = "拒绝" - VoiceNotice.showNotice("任务已超时${timeoutStr},请确认是否结束") + builder.rightStr = "" + VoiceNotice.showNotice("云端异常结束任务") } } - builder.countDownTime = 15 + builder.countDownTime = 10 builder.listener = listener return context?.let { it1 -> builder.build(it1) } } @@ -358,12 +419,72 @@ 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?, + contentStr: String + ): SweeperCloudDialog? { + var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder() + builder.titleStr = "任务恢复" + builder.contentStr = 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) } + @JvmStatic fun getRequestId():String{ return UUID.randomUUID().toString() } + + /** + * 计算任务超时时间 + */ + @JvmStatic + fun getTimeSpentString(taskEndTime: Long): String { + val timeLag: Long = System.currentTimeMillis() - taskEndTime + //天 + val day: Long = timeLag / (24 * 60 * 60 * 1000) + //小时 + val hour = (timeLag / (60 * 60 * 1000) - day * 24) + //分钟 + val minute = ((timeLag / (60 * 1000)) - day * 24 * 60 - hour * 60) + + if (day >= 1) { + return "${day}天${hour}时${minute}分钟" + } + if (hour >= 1) { + return "${hour}时${minute}分钟" + } + return "${minute}分钟" + } + + } \ No newline at end of file diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SubTaskView.kt b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SubTaskView.kt index 32559b6bdc..8f2b8709ec 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SubTaskView.kt +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SubTaskView.kt @@ -30,15 +30,20 @@ class SubTaskView : ConstraintLayout { /** * 设置子任务信息 */ - fun setData(taskInfo: SubTaskInfo,isLastTask: Boolean = false) { + fun setData(taskInfo: SubTaskInfo, isLastTask: Boolean = false) { tvSubTaskName.text = taskInfo.subTaskName - tvSubTaskName.setTextColor(if (taskInfo.taskStatus==SweeperCommon.TaskStatus.RUNNING) Color.parseColor("#3BD2FF") else Color.parseColor("#FFFFFF")) + tvSubTaskName.setTextColor( + if (taskInfo.taskStatus == SweeperCommon.TaskStatus.RUNNING) + Color.parseColor("#3BD2FF") + else + Color.parseColor("#FFFFFF") + ) if (taskInfo.taskModel == TaskModel.MANUAL) {//人工驾驶子任务 ivManualDriving.visibility = View.VISIBLE } else { ivManualDriving.visibility = View.GONE } - if (taskInfo.taskStatus==SweeperCommon.TaskStatus.RUNNING) { + if (taskInfo.taskStatus == SweeperCommon.TaskStatus.RUNNING) { ivSubTask.setImageResource(R.drawable.sweeper_icon_select_subtask) } else { ivSubTask.setImageResource(R.drawable.sweeper_icon_not_select_subtask) diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SweeperCurrentTaskInfoView.kt b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SweeperCurrentTaskInfoView.kt index 41b06aae2d..3295ab76a0 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SweeperCurrentTaskInfoView.kt +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/view/SweeperCurrentTaskInfoView.kt @@ -1,5 +1,6 @@ package com.mogo.och.sweepercloud.view +import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.util.AttributeSet @@ -10,10 +11,17 @@ 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 -import kotlinx.android.synthetic.main.sweeper_current_task_info.view.* +import kotlinx.android.synthetic.main.sweeper_current_task_info.view.currentSubTask +import kotlinx.android.synthetic.main.sweeper_current_task_info.view.lastSubTask +import kotlinx.android.synthetic.main.sweeper_current_task_info.view.preSubTask +import kotlinx.android.synthetic.main.sweeper_current_task_info.view.tvStartAuto +import kotlinx.android.synthetic.main.sweeper_current_task_info.view.tvTaskName +import kotlinx.android.synthetic.main.sweeper_current_task_info.view.tvTaskState +import kotlinx.android.synthetic.main.sweeper_current_task_info.view.tvTaskTime /** * 清扫车当前任务信息展示 @@ -46,7 +54,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 { @@ -56,7 +64,7 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { /** * 根据当前自动驾驶状态,更新【请求进入自动驾驶】按钮样式 */ - fun updateStartAutoPilotBtnState(autopilotState: Int) { + fun updateStartAutoPilotBtnByAutoPilotState(autopilotState: Int) { when (autopilotState) { //不可自动驾驶 IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> { @@ -82,90 +90,119 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { } /** - * 设置当前任务数据 + * 根据 当前自动驾驶状态-是否是自动驾驶子任务-子任务是否在运行,更新【请求进入自动驾驶】按钮样式 */ - fun setData( - subTaskBean: TaskInfo?, - currentPosition: Int = -1 + fun updateStartAutoPilotBtnByAutoPilotState( + isManualAutoPilotState: Boolean, + isAutoSubTask: Boolean, + isSubTaskRunning: Boolean ) { - subTaskBean?.apply { - this@SweeperCurrentTaskInfoView.listTask = subListList - tvTaskName.text = taskName - val calendarStart = DateTimeUtil.formatLongToCalendar(taskStartTime) - val calendarEnd = DateTimeUtil.formatLongToCalendar(taskEndTime) - tvTaskTime.text = - "${DateTimeUtil.formatCalendarToString(calendarStart, DateTimeUtil.HH_mm)}-${ - DateTimeUtil.formatCalendarToString( - calendarEnd, - DateTimeUtil.HH_mm - ) - }" - } - listTask?.let { - //特殊处理当前暂无执行中任务的情况 - if (currentPosition == -1) { - setSubTaskState(false) - setCurrentData(currentPosition + 1) - } else { - setSubTaskState(it[currentPosition].taskStatus == TaskStatus.RUNNING) - setCurrentData(currentPosition) - } - } - } - - /** - * 设置子任务的状态 - */ - private fun setSubTaskState(isWorking: Boolean) { - if (isWorking) { - tvTaskState.text = "任务执行中" - tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_working) + if (isManualAutoPilotState && isAutoSubTask && isSubTaskRunning) { + tvStartAuto.setTextColor(Color.parseColor("#FFFFFFFF")) + tvStartAuto.isSelected = true } else { - tvTaskState.text = "任务待开始" - tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_not_ready) + tvStartAuto.setTextColor(Color.parseColor("#66FFFFFF")) + tvStartAuto.isSelected = false } } - /** - * 填充数据 - */ - private fun setCurrentData(currentPosition: Int) { - listTask?.let { - if (it.size == 1) { - preSubTask.setData(it[currentPosition], isLastTask = true) - currentSubTask.visibility = View.INVISIBLE - lastSubTask.visibility = View.INVISIBLE - } else if (it.size == 2) { - if (currentPosition == 0) { - preSubTask.setData(it[currentPosition]) - currentSubTask.setData(it[1], isLastTask = true) + /** + * 设置当前任务数据 + */ + @SuppressLint("SetTextI18n") + fun setData( + taskInfo: TaskInfo?, + currentPosition: Int = -1 + ) { + // 更新 任务名称、任务时间 + taskInfo?.apply { + this@SweeperCurrentTaskInfoView.listTask = subListList + tvTaskName.text = taskName + val calendarStart = DateTimeUtil.formatLongToCalendar(taskStartTime) + val calendarEnd = DateTimeUtil.formatLongToCalendar(taskEndTime) + tvTaskTime.text = + "${DateTimeUtil.formatCalendarToString(calendarStart, DateTimeUtil.HH_mm)}-${ + DateTimeUtil.formatCalendarToString( + calendarEnd, + DateTimeUtil.HH_mm + ) + }" + } + // 更新大任务状态 + updateTaskStateText(taskInfo?.taskStatus ?: TaskStatus.TO_START) + // 更新子任务列表 + listTask?.let { + //特殊处理当前暂无执行中任务的情况 + if (currentPosition == -1) { + setCurrentData(currentPosition + 1) } else { - preSubTask.setData(it[currentPosition - 1]) - currentSubTask.setData(it[currentPosition], isLastTask = true) - } - preSubTask.visibility = View.VISIBLE - currentSubTask.visibility = View.VISIBLE - lastSubTask.visibility = View.GONE - } else { - preSubTask.visibility = View.VISIBLE - currentSubTask.visibility = View.VISIBLE - lastSubTask.visibility = View.VISIBLE - //当前正在执行的任务是第一个子任务 - if (currentPosition == 0) { - preSubTask.setData(it[currentPosition]) - currentSubTask.setData(it[1]) - lastSubTask.setData(it[2], isLastTask = true) - //当前正在执行的任务是最后一个子任务 - } else if (currentPosition == it.size - 1) { - preSubTask.setData(it[currentPosition - 2]) - currentSubTask.setData(it[currentPosition - 1]) - lastSubTask.setData(it[currentPosition], isLastTask = true) - } else { - preSubTask.setData(it[currentPosition - 1]) - currentSubTask.setData(it[currentPosition]) - lastSubTask.setData(it[currentPosition + 1], isLastTask = true) + setCurrentData(currentPosition) } } } - } -} \ No newline at end of file + + /** + * 设置任务的状态 + */ + 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) + } + } + } + + /** + * 填充数据 + */ + private fun setCurrentData(currentPosition: Int) { + listTask?.let { + if (it.size == 1) { + preSubTask.setData(it[currentPosition], isLastTask = true) + currentSubTask.visibility = View.INVISIBLE + lastSubTask.visibility = View.INVISIBLE + } else if (it.size == 2) { + if (currentPosition == 0) { + preSubTask.setData(it[currentPosition]) + currentSubTask.setData(it[1], isLastTask = true) + } else { + preSubTask.setData(it[currentPosition - 1]) + currentSubTask.setData(it[currentPosition], isLastTask = true) + } + preSubTask.visibility = View.VISIBLE + currentSubTask.visibility = View.VISIBLE + lastSubTask.visibility = View.GONE + } else { + preSubTask.visibility = View.VISIBLE + currentSubTask.visibility = View.VISIBLE + lastSubTask.visibility = View.VISIBLE + //当前正在执行的任务是第一个子任务 + if (currentPosition == 0) { + preSubTask.setData(it[currentPosition]) + currentSubTask.setData(it[1]) + lastSubTask.setData(it[2], isLastTask = true) + //当前正在执行的任务是最后一个子任务 + } else if (currentPosition == it.size - 1) { + preSubTask.setData(it[currentPosition - 2]) + currentSubTask.setData(it[currentPosition - 1]) + lastSubTask.setData(it[currentPosition], isLastTask = true) + } else { + preSubTask.setData(it[currentPosition - 1]) + currentSubTask.setData(it[currentPosition]) + lastSubTask.setData(it[currentPosition + 1], isLastTask = true) + } + } + } + } + } \ No newline at end of file diff --git a/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_base_fragment.xml b/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_base_fragment.xml index f600703e61..a4fb73058a 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_base_fragment.xml +++ b/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_base_fragment.xml @@ -199,7 +199,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#f80" - android:text="pad查询当前任务" + android:text="pad查询当前大任务" android:textSize="30sp" app:layout_constraintRight_toRightOf="@+id/btnStartAutopilot" app:layout_constraintTop_toBottomOf="@+id/btnStartAutopilot" /> @@ -209,7 +209,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#f00" - android:text="接收云控任务" + android:text="模拟云控下发任务" android:textSize="30sp" app:layout_constraintRight_toRightOf="@+id/btnQueryCurrentTask" app:layout_constraintTop_toBottomOf="@+id/btnQueryCurrentTask" /> @@ -219,7 +219,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#0f0" - android:text="云控子任务确认" + android:text="模拟云控发送子任务确认" android:textSize="30sp" app:layout_constraintRight_toRightOf="@id/btnSendTask" app:layout_constraintTop_toBottomOf="@id/btnSendTask" /> @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00f" - android:text="云控结束大任务" + android:text="模拟云控结束大任务" android:textColor="#fff" android:textSize="30sp" app:layout_constraintRight_toRightOf="@id/btnSendTask" @@ -240,7 +240,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ffffff" - android:text="云控子任务状态" + android:text="模拟云控下发子任务状态" android:textSize="30sp" app:layout_constraintRight_toRightOf="@id/btnSendEndTask" app:layout_constraintTop_toBottomOf="@id/btnSendEndTask" /> @@ -250,19 +250,41 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#000000" - android:text="云控大任务状态" + android:text="模拟云控下发大任务状态" android:textColor="#fff" android:textSize="30sp" app:layout_constraintRight_toRightOf="@id/btnSendSubtaskStatus" app:layout_constraintTop_toBottomOf="@id/btnSendSubtaskStatus" /> +