From 1c46f27af880fdd7c7bfb71d32e835512681c5e4 Mon Sep 17 00:00:00 2001 From: bxb Date: Thu, 4 May 2023 14:10:37 +0800 Subject: [PATCH] =?UTF-8?q?[sweeper-cloud]=20=E6=B8=85=E6=89=AB=E8=BD=A6?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BA=91=E7=AB=AF=E6=AD=A3=E5=9C=A8=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=9A=84=E4=BB=BB=E5=8A=A1=E9=80=BB=E8=BE=91=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sweepercloud/fragment/SweeperFragment.kt | 132 ++++++++++++------ .../sweepercloud/model/SweeperTaskModel.java | 14 +- .../presenter/SweeperPresenter.java | 50 ++++++- .../util/SweeperCloudTaskMockUtils.kt | 101 ++++++++++++++ .../mogo/och/sweepercloud/view/SubTaskView.kt | 8 +- .../layout/sweeper_no_data_common_view.xml | 10 -- 6 files changed, 257 insertions(+), 58 deletions(-) create mode 100644 OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskMockUtils.kt 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 e8c4578a19..f9c514b39f 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 @@ -7,10 +7,15 @@ import chassis.ChassisStatesOuterClass import com.amap.api.maps.model.LatLng import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.sweepercloud.R import com.mogo.och.sweepercloud.bean.SweeperRoutePlanningUpdateReqBean import com.mogo.och.sweepercloud.presenter.SweeperPresenter import com.mogo.och.sweepercloud.ui.dialog.SweeperCloudDialog +import com.mogo.och.sweepercloud.util.SweeperCloudTaskMockUtils.sendCloudTaskInfo +import com.mogo.och.sweepercloud.view.SweeperCurrentTaskInfoView +import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask +import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.SubTaskInfo import kotlinx.android.synthetic.main.fragment_och_sweeper.* import kotlinx.android.synthetic.main.sweeper_no_data_common_view.* @@ -20,16 +25,18 @@ import kotlinx.coroutines.launch /** * 清扫车主界面 */ -class SweeperFragment : BaseSweeperTabFragment(){ +class SweeperFragment : BaseSweeperTabFragment() { companion object { const val TAG = "SweeperFragment" } + private var mCurrentSubPosition: Int = 0 //子任务下标 private var mSubMutableList: MutableList? = null private var mCleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates? = null private var mLocation: MogoLocation? = null - private var mSubTaskType:Int=0 //0:自动驾驶子任务 1:人工驾驶子任务 + private var mTaskInfo: SweeperTask.TaskInfo? = null + private var mSubTaskType: Int = 0 //0:自动驾驶子任务 1:人工驾驶子任务 override fun getTagName(): String { return "SweepersFragment" @@ -39,9 +46,6 @@ class SweeperFragment : BaseSweeperTabFragment builder.build(it1) } - dialog?.show() } } @@ -121,6 +111,7 @@ class SweeperFragment : BaseSweeperTabFragment() for (index in subList.indices) { - val startLocation=subList[index].startLocation + val startLocation = subList[index].startLocation val startLatLng = LatLng(startLocation.latitude, startLocation.longitude) dataList.add(index, startLatLng) - val endLocation=subList[index].endLocation + val endLocation = subList[index].endLocation val endLatLng = LatLng(endLocation.latitude, endLocation.longitude) dataList.add(index + 1, endLatLng) } @@ -152,17 +143,31 @@ class SweeperFragment : BaseSweeperTabFragment) { - val endPoint= subList[mCurrentSubPosition].endLocation + private fun setEndStationMarker(subList: MutableList) { + val endPoint = subList[mCurrentSubPosition].endLocation val endLatLng = LatLng(endPoint.latitude, endPoint.longitude) super.mCurrentTaskEndStation = endLatLng setCurrentTaskEndMarker(endLatLng) } + /** + * 设置云端任务信息 + */ + fun onSweeperCloudTask(messageType: SweeperCloudTask.MessageType, taskInfo: SweeperTask.TaskInfo) { + this.mTaskInfo = taskInfo + setShowCurrentTaskPanelView(true) + if (messageType == SweeperCloudTask.MessageType.PadSendGetTaskReq) {//主动拉取云端正在执行的任务,则直接在任务列表展示 + getCurrentView().setData(taskInfo, mCurrentSubPosition) + } else {//云端下发的任务信息需要弹窗接取 + receivedTaskInfoDialog() + } + } //模拟结束子任务 override fun debugEndSubTask() { super.debugEndSubTask() + mPresenter?.getCurrentTask() + //sendCloudTaskInfo(SweeperCloudTask.MessageType.CloudPushTask) } /** @@ -171,4 +176,53 @@ class SweeperFragment : BaseSweeperTabFragment) { super.setTaskRouteList(routeList) } + + private fun getCurrentView(): SweeperCurrentTaskInfoView = sweeper_current_task_view + + /** + * 接取云端任务弹窗 + */ + private fun receivedTaskInfoDialog() { + mTaskInfo?.apply { + var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder() + val startCalendar = DateTimeUtil.formatLongToCalendar(taskStartTime) + val endCalendar = DateTimeUtil.formatLongToCalendar(taskEndTime) + builder.titleStr = "任务接取" + builder.contentStr = "请确认是否接取任务${taskName}" + builder.tipStr = "(任务时间${DateTimeUtil.formatCalendarToString(startCalendar, DateTimeUtil.HH_mm)}-${ + DateTimeUtil.formatCalendarToString( + endCalendar, + DateTimeUtil.HH_mm + ) + })" + builder.leftStr = "确认" + builder.middleStr = "" + builder.rightStr = "拒绝" + builder.countDownTime = 15 + builder.listener = object : SweeperCloudDialog.SweeperCloudClickListener { + override fun onConfirm() { + ToastUtils.showLong("确认") + setShowCurrentTaskPanelView(true) + } + + override fun onRefuse() { + ToastUtils.showLong("拒绝") + setShowCurrentTaskPanelView(false) + } + + override fun onCountDownStop() { + ToastUtils.showLong("倒计时结束") + setShowCurrentTaskPanelView(false) + } + + override fun onNext() { + + } + + } + val dialog = context?.let { it1 -> builder.build(it1) } + dialog?.show() + } + + } } \ 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 fb3aa1dedb..6d2a8e096e 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 @@ -32,6 +32,7 @@ import com.mogo.och.sweepercloud.callback.ISweeperCloudTaskCallback; 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.SweeperCloudTaskMockUtils; import com.mogo.och.sweepercloud.util.SweeperFutianCmdUtil; import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask; import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable; @@ -507,7 +508,11 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM public void getCurrentTask() { SweeperTask.GetTaskReq.Builder builder = SweeperTask.GetTaskReq.newBuilder(); builder.setSn(getDriverSn()); - getAutoPilotControlManager().sendSweeperGetTaskReq(String.valueOf(System.currentTimeMillis()), builder.build()); + String reqNo = String.valueOf(System.currentTimeMillis()); + SweeperTask.GetTaskReq getTaskReq = builder.build(); + CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getCurrentTask:" + GsonUtil.jsonFromObject(getTaskReq) + "reqNo:" + reqNo); + getAutoPilotControlManager().sendSweeperGetTaskReq(reqNo, builder.build()); + SweeperCloudTaskMockUtils.sendCloudTaskInfo(SweeperCloudTask.MessageType.PadSendGetTaskReq); } /** @@ -558,6 +563,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM /** * pad上报是否可以进自驾 + * * @param taskId * @param subTaskId * @param lineId @@ -568,10 +574,10 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM builder.setTaskId(taskId); builder.setSubTaskId(subTaskId); builder.setLineId(lineId); - SweeperBootable.IsBootable isBootable=builder.build(); + SweeperBootable.IsBootable isBootable = builder.build(); String reqNo = String.valueOf(System.currentTimeMillis()); CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperAutopilotBootable" + GsonUtil.jsonFromObject(isBootable) + "reqNo:" + reqNo); - getAutoPilotControlManager().sendSweeperAutopilotBootable(reqNo,isBootable); + getAutoPilotControlManager().sendSweeperAutopilotBootable(reqNo, isBootable); } public CallerAutoPilotControlManager getAutoPilotControlManager() { @@ -616,7 +622,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM @Override public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { - CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotIpcConnectStatusChanged status:" + status + "reason:" + reason); + //CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotIpcConnectStatusChanged status:" + status + " reason:" + reason); } @Override 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 1d61bb6d11..ed2218e9f3 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 @@ -19,6 +19,7 @@ import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask; 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.confirm.SweeperTaskConfirm; import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop; @@ -110,6 +111,7 @@ public class SweeperPresenter extends Presenter AutopilotStatusInfo info = new AutopilotStatusInfo(); info.setState(status); } + /** * 获取当前正在执行的任务 */ @@ -117,6 +119,48 @@ public class SweeperPresenter extends Presenter SweeperTaskModel.getInstance().getCurrentTask(); } + /** + * 接取任务弹窗响应 + * + * @param taskId + * @param code + */ + public void sendSweeperStartTaskResp(String taskId, SweeperTask.StartTaskCode code) { + SweeperTaskModel.getInstance().sendSweeperStartTaskResp(taskId, code); + } + + /** + * 子任务弹窗确认 + * + * @param taskId + * @param subTaskId + * @param code + */ + public void sendSweeperTaskConfirmResp(String taskId, String subTaskId, SweeperTaskConfirm.TaskConfirmCode code) { + SweeperTaskModel.getInstance().sendSweeperTaskConfirmResp(taskId, subTaskId, code); + } + + /** + * 大任务结束弹窗确认 + * + * @param taskId + * @param code + */ + public void sendSweeperStopTaskResp(String taskId, SweeperTaskStop.StopTaskCode code) { + SweeperTaskModel.getInstance().sendSweeperStopTaskResp(taskId, code); + } + + /** + * pad上报是否可以进自驾 + * + * @param taskId + * @param subTaskId + * @param lineId + */ + public void sendSweeperAutopilotBootable(String taskId, String subTaskId, long lineId) { + SweeperTaskModel.getInstance().sendSweeperAutopilotBootable(taskId, subTaskId, lineId); + } + @Override public void setRouteList(@NonNull ArrayList routeList) { mView.setTaskRouteList(routeList); @@ -124,7 +168,7 @@ public class SweeperPresenter extends Presenter @Override public void onSweeperCloudTask(@NonNull SweeperCloudTask.MessageType messageType, @NonNull SweeperTask.TaskInfo taskInfo) { - + mView.onSweeperCloudTask(messageType,taskInfo); } @Override @@ -160,11 +204,11 @@ public class SweeperPresenter extends Presenter @Override public void setWeltDataToMap(@NonNull ArrayList weltDataBeans, boolean isWeltData, @NonNull String distance) { - mView.setWeltDataToMap(weltDataBeans,isWeltData,distance); + mView.setWeltDataToMap(weltDataBeans, isWeltData, distance); } @Override public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { - mView.onSweeperFutianCleanSystemState(cleanSystemState); + mView.onSweeperFutianCleanSystemState(cleanSystemState); } } diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskMockUtils.kt b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskMockUtils.kt new file mode 100644 index 0000000000..492b4420b3 --- /dev/null +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/util/SweeperCloudTaskMockUtils.kt @@ -0,0 +1,101 @@ +package com.mogo.och.sweepercloud.util + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.och.sweepercloud.model.SweeperTaskModel +import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask.MessageType +import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon +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 + +object SweeperCloudTaskMockUtils { + /** + * 模拟云控发送任务给pad + */ + @JvmStatic + fun sendCloudTaskInfo(messageType: MessageType) { + val builder = TaskInfo.newBuilder() + builder.sn = getDriverSn() + builder.taskId = "10" + builder.taskName = "环球贸易中心B座" + builder.currentTime = System.currentTimeMillis() + builder.taskStartTime = 1682664162000 + builder.taskEndTime = 1682750562000 + //第一个子任务 + val subBuilder0 = SubTaskInfo.newBuilder() + subBuilder0.subTaskId = "0" + subBuilder0.subTaskName = "自动驾驶子任务0" + subBuilder0.taskModel = TaskModel.AUTO + subBuilder0.taskStatus = SweeperCommon.TaskStatus.TO_START + val startLocation0 = Location.newBuilder() + startLocation0.siteName = "子任务起点0" + startLocation0.wgsLongitude = 121.6421189511 + startLocation0.wgsLatitude = 37.4767125311 + startLocation0.longitude = 121.64693997741931 + startLocation0.latitude = 37.47740504453125 + subBuilder0.startLocation = startLocation0.build() + val endLocation0 = Location.newBuilder() + endLocation0.siteName = "子任务终点0" + endLocation0.wgsLongitude = 121.6392313 + endLocation0.wgsLatitude = 37.4726471 + endLocation0.longitude = 121.64404710861349 + endLocation0.latitude = 37.47333410433059 + subBuilder0.startLocation = endLocation0.build() + subBuilder0.lineId = 123 + subBuilder0.lineName = "测试路线0" + builder.addSubList(subBuilder0.build()) + //第二个子任务 + val subBuilder1 = SubTaskInfo.newBuilder() + subBuilder1.subTaskId = "1" + subBuilder1.subTaskName = "自动驾驶子任务1" + subBuilder1.taskModel = TaskModel.AUTO + subBuilder1.taskStatus = SweeperCommon.TaskStatus.TO_START + val startLocation1 = Location.newBuilder() + startLocation1.siteName = "测试子任务站点1" + startLocation1.wgsLongitude = 121.6421189511 + startLocation1.wgsLatitude = 37.47264711 + startLocation1.longitude = 121.6469395478903 + startLocation1.latitude = 37.47333856025812 + subBuilder1.startLocation=startLocation1.build() + val endLocation1 = Location.newBuilder() + endLocation1.siteName = "测试子任务站点1" + endLocation1.wgsLongitude = 121.4261245286646 + endLocation1.wgsLatitude = 37.52885874483938 + endLocation1.longitude = 121.43138115208806 + endLocation1.latitude = 37.52987767688798 + subBuilder1.endLocation = endLocation1.build() + builder.addSubList(subBuilder1.build()) + //第三个子任务 + val subBuilder2 = SubTaskInfo.newBuilder() + subBuilder2.subTaskId = "1" + subBuilder2.subTaskName = "人工驾驶子任务路线2" + subBuilder2.taskModel = TaskModel.MANUAL + subBuilder2.taskStatus = SweeperCommon.TaskStatus.TO_START + val startLocation2 = Location.newBuilder() + startLocation2.siteName = "人工驾驶子任务站点2" + startLocation2.wgsLongitude = 121.31344761929978 + startLocation2.wgsLatitude = 37.53205755535642 + startLocation2.longitude = 121.3185679517558 + startLocation2.latitude = 37.5329694887952 + subBuilder2.startLocation=startLocation2.build() + val endLocation2 = Location.newBuilder() + endLocation2.siteName = "人工驾驶子任务站点2" + endLocation2.wgsLongitude = 121.4551205070834 + endLocation2.wgsLatitude =37.47936696980237 + endLocation2.longitude =121.46030960742117 + endLocation2.latitude = 37.48032689641474 + subBuilder2.endLocation = endLocation2.build() + builder.addSubList(subBuilder2.build()) + SweeperTaskModel.getInstance().onSweeperFutianCloudTask( + messageType, + "${System.currentTimeMillis()}", + System.currentTimeMillis(), + builder.build() + ) + } + + fun getDriverSn(): String? { + return MoGoAiCloudClientConfig.getInstance().sn + } +} \ 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 bd09b232b8..fd39fe7705 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 @@ -18,8 +18,7 @@ class SubTaskView : ConstraintLayout { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { initView(context) } - - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {} private fun initView(context: Context) { @@ -32,6 +31,11 @@ class SubTaskView : ConstraintLayout { fun setData(taskInfo: SubTaskInfo, isSelect: Boolean = false, isLastTask: Boolean = false) { tvSubTaskName.text = taskInfo.subTaskName tvSubTaskName.setTextColor(if (isSelect) Color.parseColor("#3BD2FF") else Color.parseColor("#FFFFFF")) + if (taskInfo.taskModel.number == 1) {//人工驾驶子任务 + ivManualDriving.visibility = View.VISIBLE + } else { + ivManualDriving.visibility = View.GONE + } if (isSelect) { ivSubTask.setImageResource(R.drawable.sweeper_icon_select_subtask) } else { diff --git a/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_no_data_common_view.xml b/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_no_data_common_view.xml index f82cb901f2..7e35dd415c 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_no_data_common_view.xml +++ b/OCH/sweeper/sweeper-cloud/src/main/res/layout/sweeper_no_data_common_view.xml @@ -30,14 +30,4 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/ivNoTaskData" /> - - \ No newline at end of file