From 010a0cebee842ed865c0e0b55c2b7665989cf825 Mon Sep 17 00:00:00 2001 From: bxb Date: Thu, 23 Feb 2023 15:53:03 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=85=E6=89=AB=E8=BD=A6]=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5=E5=8F=8A=E5=85=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/sweeper/bean/SubStartRequest.kt | 4 +- .../och/sweeper/bean/SweeperSubTaskBean.kt | 6 +- .../sweeper/callback/ISweeperTaskCallback.kt | 2 +- .../mogo/och/sweeper/constant/SweeperConst.kt | 15 +- .../och/sweeper/fragment/SweeperFragment.kt | 199 +++++++++--------- .../och/sweeper/model/SweeperTaskModel.java | 40 ++-- .../och/sweeper/net/ISweeperApiService.java | 4 +- .../och/sweeper/net/SweeperServiceManager.kt | 14 +- .../sweeper/presenter/SweeperPresenter.java | 34 ++- .../och/sweeper/ui/adapter/TaskListAdapter.kt | 9 +- .../view/SweeperCurrentTaskInfoView.kt | 96 +++++---- .../och/sweeper/view/SweeperWorkModeView.kt | 3 +- .../main/res/layout/fragment_och_sweeper.xml | 2 +- .../res/layout/sweeper_current_task_info.xml | 5 +- .../layout/sweeper_no_data_common_view.xml | 2 +- .../src/main/res/layout/sweeper_work_mode.xml | 3 +- 16 files changed, 233 insertions(+), 205 deletions(-) diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SubStartRequest.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SubStartRequest.kt index 2caa0c7236..f0793a69a5 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SubStartRequest.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SubStartRequest.kt @@ -5,5 +5,7 @@ import com.mogo.cloud.passport.MoGoAiCloudClientConfig data class SubStartRequest( var carSn:String=MoGoAiCloudClientConfig.getInstance().sn, var taskId:Int, - var startTime:Long + var startTime:Long, + var isFirst:Boolean, + var isEnd:Boolean ) \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskBean.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskBean.kt index e311bcda7b..8ea10a1f4b 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskBean.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskBean.kt @@ -5,7 +5,7 @@ package com.mogo.och.sweeper.bean */ data class SweeperSubTaskBean(var taskId:Int=0, var taskName:String?, - var taskStartTime:Long?, + var taskStartTime:Long=0, var sort:Int=1, var subList:MutableList?) data class SubInfo( @@ -15,5 +15,9 @@ data class SubInfo( var taskStatus: Int,// 状态1未执行 2执行中 3结束 4跳过 var taskType: Int,//1自动驾驶 2人工驾驶 var timeSpent: String, + var startWgs84Lon:Double,//起点经度 + var startWgs84Lat:Double,//起点纬度 + var endWgs84Lon:Double,//终点经度 + var endWgs84Lat:Double,//终点纬度 var sort: Int = 0, ) \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt index 1f83ed73da..f2243c1a05 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt @@ -19,7 +19,7 @@ interface ISweeperTaskCallback { /** * 获取子任务列表 */ - fun setSubTaskBean(subTaskBean: SweeperSubTaskBean?,isWorkingSubTask:Boolean) + fun setSubTaskBean(subTaskBean: SweeperSubTaskBean,isWorkingSubTask:Boolean) /** * 更新子任务状态 diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt index 9dbf2304af..b060d6b76a 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt @@ -8,10 +8,10 @@ import com.mogo.commons.debug.DebugConfig class SweeperConst { companion object { - private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com" - //private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com" - private const val BASE_URL_OCH_QA = "http://sweep-dev.svc.zhidaoauto.com" - private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com" + private const val BASE_URL_OCH_DEV = "https://och-driver-dev.zhidaozhixing.com" + //private const val BASE_URL_OCH_QA = "https://och-driver-qa.zhidaozhixing.com" + private const val BASE_URL_OCH_QA = "https://och-driver-dev.zhidaozhixing.com" + private const val BASE_URL_OCH_RELEASE = "https://och-driver.zhidaozhixing.com" @JvmStatic fun getBaseUrl(): String { @@ -31,23 +31,27 @@ class SweeperConst { // 上报心跳轮询ms const val LOOP_PERIOD_60S = 60 * 1000L + // 开始服务启动自动驾驶等待时间(埋点上传) const val LOOP_PERIOD_15S = 15 * 1000L const val LOOP_PERIOD_1S = 1 * 1000L const val LOOP_DELAY = 100L // 下发给MEC轨迹信息间隔时间 10秒 - const val LOOP_PERIOD_10S = 10 * 1000L + const val LOOP_PERIOD_10S = 10 * 1000L + // 尝试下发给MEC轨迹最多10次 const val LOOP_SEND_TRAJ_TIMES = 10 //起点UUID const val SWEEPER_START_MAP_MAKER = "sweeper_start_map_maker"; + //终点UUID const val SWEEPER_END_MAP_MAKER = "sweeper_end_map_maker"; // 埋点key:接管后点击'自动驾驶'按钮启动 const val EVENT_KEY_RESTART_AUTOPILOT = "event_key_och_sweeper_restart_autopilot" + // 埋点key:开始服务开启自动驾驶(成功/失败) const val EVENT_KEY_START_SERVICE = "event_key_och_sweeper_start_service" const val EVENT_PARAM_SN = "sn" @@ -60,6 +64,7 @@ class SweeperConst { const val EVENT_PARAM_START_FAILURE_MSG = "start_autopilot_failure_msg" // 启动自驾失败原因 const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false + // 埋点key:开启自动驾驶前已识别的异常,会导致无法开启自驾 const val EVENT_KEY_AP_UNABLE_START_REASON = "event_key_och_bus_ap_unable_start_reason" const val EVENT_PARAM_UNABLE_START_REASON = "unable_start_reason"; diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt index 6bc5c66ae4..b507e66ff8 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt @@ -2,11 +2,12 @@ package com.mogo.och.sweeper.fragment import android.os.Bundle import android.view.View -import androidx.annotation.MainThread import androidx.annotation.UiThread import androidx.recyclerview.widget.LinearLayoutManager import chassis.ChassisStatesOuterClass +import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil import com.mogo.och.sweeper.R import com.mogo.och.sweeper.bean.SubInfo import com.mogo.och.sweeper.bean.SweeperMainTaskBean @@ -25,20 +26,19 @@ import kotlinx.android.synthetic.main.sweeper_no_data_common_view.* /** * 清扫车主界面 */ -class SweeperFragment : BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener{ +class SweeperFragment : BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener { private var mAdapter: TaskListAdapter? = null private var mCurrentSubPosition: Int = 0 //子任务下标 - private var mMainMutableList: MutableList? = null private var mSubMutableList: MutableList? = null private var mSubTaskBean: SweeperSubTaskBean? = null private var mSubTaskType: SubTaskTypeEnum = SubTaskTypeEnum.AUTOPILOT_SUBTYPE //1:自动驾驶子任务 2:人工驾驶子任务 private var mCleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates? = null - private var mIsLastSubTask: Boolean = false //是否最后一个子任务 private var mSubTaskId: Int = -1//子任务id private var mSubTaskName: String? = null private var mMainTask: SweeperMainTaskBean? = null - private var mLocation:MogoLocation?=null - private var mSubTaskDetailBean:SweeperSubTaskDetailBean?=null + private var mLocation: MogoLocation? = null + private var mSubTaskDetailBean: SweeperSubTaskDetailBean? = null + //当前经纬度 override fun getTagName(): String { return "SweepersFragment" @@ -46,29 +46,7 @@ class SweeperFragment : BaseSweeperTabFragment - mCurrentSubPosition=0 + mCurrentSubPosition = 0 mSubTaskBean = SweeperSubTaskBean(task.mainTaskId, task.mainTaskName, task.mainTaskStartTime, 1, mSubMutableList) //获取当前子任务列表 - //presenter?.getSubTaskList(task.mainTaskId, mSubTaskBean) - } - - //mock 数据 - setSubTaskData() - if (mSubTaskType.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code) {//如果是人工驾驶子任务,则弹窗 - manualDriving(null) - } else { - setShowTaskListPanelView(false) - setShowCurrentTaskPanelView(true) - sweeper_cl_work_mode.visibility = View.VISIBLE - sweeper_current_task_view.setData(sweeper_cl_work_mode, mSubTaskBean, mCurrentSubPosition, this, presenter) + presenter?.getSubTaskList(task.mainTaskId, mSubTaskBean) } } + //列表任务刷新 + ivTaskListRefresh.setOnClickListener { + mPresenter?.getMainTaskList() + } + //无任务时刷新 + ivNoTaskRefresh.setOnClickListener { + mPresenter?.getMainTaskList() + } } private val onTaskItemClickListener = object : TaskListAdapter.TaskItemClickListener { @@ -175,24 +152,20 @@ class SweeperFragment : BaseSweeperTabFragment {//跳过任务 - presenter?.subTaskSkip(mSubTaskId, mIsLastSubTask) - //mock - if (mSubTaskType.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code){//人工驾驶子任务 - showAmapNaviToStationFragment(false) - } - mCurrentSubPosition++ - sweeper_current_task_view.setData(sweeper_cl_work_mode, mSubTaskBean, mCurrentSubPosition, this@SweeperFragment, presenter) + presenter?.subTaskSkip(isFirstSubTask(), isLastSubTask(), mSubTaskId) } - TaskStatusEnum.END_TASK.code -> { - subTaskEnd() + TaskStatusEnum.END_TASK.code -> {//结束主任务 + endMainTask() } } } + @UiThread fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) { this.mCleanSystemState = cleanSystemState sweeper_cl_work_mode.setSweeperFutianCleanSystemState(mSubTaskType, cleanSystemState) } + /** * 设置当前主任务列表数据 */ @@ -213,20 +186,31 @@ class SweeperFragment : BaseSweeperTabFragment + if (subList.size<=0){ + return + } + addStartAndEndMarker( + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(), subList[0].startWgs84Lon, subList[0].startWgs84Lat), + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(), subList[subList.size-1].endWgs84Lon, subList[subList.size-1].endWgs84Lat) + ) + } } } @@ -242,33 +226,35 @@ class SweeperFragment : BaseSweeperTabFragment {//子任务结束 - mCurrentSubPosition++ - setSubTaskData() - presenter?.getSubTaskDetail(mSubTaskId, mSubTaskType) - if (mSubTaskType.code == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) {//自动驾驶子任务 - presenter?.startTask(mSubTaskId, mSubTaskType) + //是否是最后一个子任务结束 + if (isLastSubTask()){ + mPresenter?.getMainTaskList() + clearAllMarkerAndPolyline() + }else{ + mCurrentSubPosition++ + setSubTaskData() + presenter?.getSubTaskDetail(mSubTaskId, mSubTaskType) + if (mSubTaskType.code == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) {//自动驾驶子任务 + presenter?.startTask(isFirstSubTask(), isLastSubTask(), mSubTaskId, mSubTaskType) + } } } TaskStatusEnum.JUMP_OVER_SUBTASK.code -> { //子任务跳过 - presenter?.subTaskEnd(mSubTaskId, mIsLastSubTask) - if (mSubTaskType.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code){//人工驾驶子任务 + presenter?.subTaskEnd(isFirstSubTask(), isLastSubTask(), mSubTaskId) + if (mSubTaskType.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code) {//人工驾驶子任务 showAmapNaviToStationFragment(false) } } TaskStatusEnum.START_SUBTASK.code -> { //子任务开始 if (mSubTaskType.code == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) {//自动驾驶子任务 readyTaskBtn(true, true) - }else{ + } else { readyTaskBtn(false, false) } setShowTaskListPanelView(false) sweeper_cl_work_mode.visibility = View.VISIBLE setShowCurrentTaskPanelView(true) sweeper_current_task_view.setCurrentData(mCurrentSubPosition) -// sweeper_cl_work_mode.setSweeperFutianCleanSystemState( -// mSubTaskType, -// if (mCleanSystemState == null) SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData() else mCleanSystemState -// ) } } @@ -279,7 +265,7 @@ class SweeperFragment : BaseSweeperTabFragment=1 代表是重试 每次子任务结束/主任务结束清空置为0 private volatile int firstStartAutopilot = 0; @@ -181,13 +184,10 @@ public class SweeperTaskModel { } }; - - public void setSubTaskId(int mSubTaskId) { - this.mSubTaskId = mSubTaskId; - } - - public void setIsLastSubtask(boolean mIsLastSubtask) { - this.mIsLastSubtask = mIsLastSubtask; + public void setSubtask(boolean isFirstSubtask,boolean isLastSubtask,int subTaskId) { + this.mIsLastSubtask = isLastSubtask; + this.mIsFirstSubtask=isFirstSubtask; + this.mSubTaskId=subTaskId; } public static List coordinateConverterWgsToGcjList(Context mContext, @@ -356,7 +356,7 @@ public class SweeperTaskModel { CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "行程日志-当前==subTaskId=" + currentSubTaskDetail.getId()); //到达子任务终点 结束子任务 - subTaskEnd(mSubTaskId, mIsLastSubtask); + subTaskEnd(mIsFirstSubtask,mIsLastSubtask,mSubTaskId); } public void triggerStartServiceEvent(boolean isRestart, boolean send) { @@ -578,8 +578,8 @@ public class SweeperTaskModel { /** * 子任务开始上报 */ - public void subTaskStart(int subTaskId, SubTaskTypeEnum subTaskType) { - SweeperServiceManager.subTaskStart(subTaskId, mContext, new OchCommonServiceCallback>() { + public void subTaskStart(boolean isFirst,boolean isEnd,int subTaskId, SubTaskTypeEnum subTaskType) { + SweeperServiceManager.subTaskStart(isFirst,isEnd,subTaskId, mContext, new OchCommonServiceCallback>() { @Override public void onSuccess(BaseResponse data) { if (mSweeperTaskCallback != null && data != null) { @@ -627,16 +627,16 @@ public class SweeperTaskModel { /** * 子任务结束上报 */ - public void subTaskEnd(int subTaskId, boolean isLastSubTask) { - SweeperServiceManager.subTaskEnd(subTaskId, mContext, new OchCommonServiceCallback>() { + public void subTaskEnd(boolean isFirst,boolean isEnd,int subTaskId) { + SweeperServiceManager.subTaskEnd(isFirst,isEnd,subTaskId, mContext, new OchCommonServiceCallback>() { @Override public void onSuccess(BaseResponse data) { if (mSweeperTaskCallback != null && data != null) { if (data.getData()) { isSubTaskWorking = false; isArriveSubTaskEndSite = true; - mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.END_SUBTASK, isLastSubTask); - if (isLastSubTask) { + mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.END_SUBTASK, isEnd); + if (isEnd) { if (FunctionBuildConfig.isDemoMode) {//美化模式开启时 SweeperTaskModel.getInstance().closeBeautificationMode(); } @@ -674,15 +674,15 @@ public class SweeperTaskModel { /** * 子任务跳过上报 */ - public void subTaskSkip(int subTaskId, boolean isLastSubTask) { - SweeperServiceManager.subTaskSkip(subTaskId, mContext, new OchCommonServiceCallback>() { + public void subTaskSkip(boolean isFirst,boolean isEnd,int subTaskId) { + SweeperServiceManager.subTaskSkip(isFirst,isEnd,subTaskId, mContext, new OchCommonServiceCallback>() { @Override public void onSuccess(BaseResponse data) { if (mSweeperTaskCallback != null && data != null) { if (data.getData()) { - mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.JUMP_OVER_SUBTASK, isLastSubTask); - if (isLastSubTask) {//如果是最后一个子任务,则跳过完成后,调用结束子任务接口,这样后端可以才可以把整个大任务结束掉 - subTaskEnd(subTaskId, true); + mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.JUMP_OVER_SUBTASK, isEnd); + if (isEnd) {//如果是最后一个子任务,则跳过完成后,调用结束子任务接口,这样后端可以才可以把整个大任务结束掉 + subTaskEnd(isFirst,isEnd,subTaskId); } } } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java index 114641913b..8a2795a83d 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java @@ -11,6 +11,7 @@ import java.util.List; import io.reactivex.Observable; import retrofit2.http.Body; import retrofit2.http.GET; +import retrofit2.http.HTTP; import retrofit2.http.Header; import retrofit2.http.Headers; import retrofit2.http.POST; @@ -38,7 +39,6 @@ public interface ISweeperApiService { */ @GET("/och-sweep/api/task/v1/mainTaskList") Observable>> getMainTaskList(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("carSn") String carSn); - /** * 清扫车子任务列表 * @param appId @@ -99,6 +99,6 @@ public interface ISweeperApiService { * @return */ @GET("/och-sweep/api/task/v1/mainTaskReset") - Observable> mainTaskReset(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("taskId") int taskId); + Observable> mainTaskReset(@Header ("appId") String appId, @Header("ticket") String ticket,@Query("carSn") String carSn, @Query("taskId") int taskId); } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.kt index de52ae2af0..c228f3390c 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.kt @@ -41,7 +41,6 @@ object SweeperServiceManager { .transformTry() .subscribe(OchCommonSubscribeImpl(context, callback, "getMainTaskList")) } - /** * 获取子任务列表 */ @@ -76,8 +75,8 @@ object SweeperServiceManager { * 子任务开始上报 */ @JvmStatic - fun subTaskStart(subTaskId: Int,context: Context, callback: OchCommonServiceCallback>?) { - val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis()) + fun subTaskStart(isFirst:Boolean,isEnd:Boolean,subTaskId: Int,context: Context, callback: OchCommonServiceCallback>?) { + val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis(),isFirst,isEnd) mService.subTaskStart( MoGoAiCloudClientConfig.getInstance().serviceAppId, MoGoAiCloudClientConfig.getInstance().token, @@ -91,8 +90,8 @@ object SweeperServiceManager { * 子任务结束上报 */ @JvmStatic - fun subTaskEnd(subTaskId: Int,context: Context, callback: OchCommonServiceCallback>?) { - val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis()) + fun subTaskEnd(isFirst:Boolean,isEnd:Boolean,subTaskId: Int,context: Context, callback: OchCommonServiceCallback>?) { + val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis(),isFirst,isEnd) mService.subTaskEnd( MoGoAiCloudClientConfig.getInstance().serviceAppId, MoGoAiCloudClientConfig.getInstance().token, @@ -106,8 +105,8 @@ object SweeperServiceManager { * 子任务跳过上报 */ @JvmStatic - fun subTaskSkip(subTaskId: Int,context: Context, callback: OchCommonServiceCallback>?) { - val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis()) + fun subTaskSkip(isFirst:Boolean,isEnd:Boolean,subTaskId: Int,context: Context, callback: OchCommonServiceCallback>?) { + val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis(),isFirst,isEnd) mService.subTaskSkip( MoGoAiCloudClientConfig.getInstance().serviceAppId, MoGoAiCloudClientConfig.getInstance().token, @@ -125,6 +124,7 @@ object SweeperServiceManager { mService.mainTaskReset( MoGoAiCloudClientConfig.getInstance().serviceAppId, MoGoAiCloudClientConfig.getInstance().token, + MoGoAiCloudClientConfig.getInstance().sn, taskId ) .transformTry() diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java index ff44ca41a0..c7f4c0593c 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java @@ -182,19 +182,12 @@ public class SweeperPresenter extends Presenter } /** - * 当前子任务id - * @param mSubTaskId + * 设置当前子任务信息 */ - public void setSubTaskId(int mSubTaskId) { - this.mSubTaskId = mSubTaskId; - SweeperTaskModel.getInstance().setSubTaskId(mSubTaskId); + public void setSubtask(boolean isFirstSubtask,boolean isLastSubtask,int subTaskId) { + this.mSubTaskId = subTaskId; + SweeperTaskModel.getInstance().setSubtask(isFirstSubtask,isLastSubtask,subTaskId); } - - public void setIsLastSubtask(boolean mIsLastSubtask) { - this.mIsLastSubtask = mIsLastSubtask; - SweeperTaskModel.getInstance().setIsLastSubtask(mIsLastSubtask); - } - private void runOnUIThread(Runnable executor) { if (executor == null) { return; @@ -350,7 +343,12 @@ public class SweeperPresenter extends Presenter public void getCurrentTask() { SweeperTaskModel.getInstance().getCurrentTask(); } - + /** + * 获取主任务列表 + */ + public void getMainTaskList() { + SweeperTaskModel.getInstance().getMainTaskList(); + } /** * 获取子任务列表 */ @@ -370,13 +368,13 @@ public class SweeperPresenter extends Presenter /** * 开始任务 */ - public void startTask(int subTaskId, SubTaskTypeEnum subTaskType) { + public void startTask(boolean isFirst,boolean isEnd,int subTaskId, SubTaskTypeEnum subTaskType) { if (SweeperTaskModel.getInstance().getSubWorking()) {//如果任务正在执行中,被人工接管后掉出自驾,则只重启自动驾驶 if (subTaskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE) { SweeperTaskModel.getInstance().startAutopilot(); } } else { - SweeperTaskModel.getInstance().subTaskStart(subTaskId, subTaskType); + SweeperTaskModel.getInstance().subTaskStart(isFirst,isEnd,subTaskId, subTaskType); } // AutopilotControlParameters parameters = new AutopilotControlParameters(); // parameters.isSpeakVoice = true; @@ -413,15 +411,15 @@ public class SweeperPresenter extends Presenter /** * 子任务结束上报 */ - public void subTaskEnd(int subTaskId, boolean isLastSubTask) { - SweeperTaskModel.getInstance().subTaskEnd(subTaskId, isLastSubTask); + public void subTaskEnd(boolean isFirst,boolean isEnd,int subTaskId) { + SweeperTaskModel.getInstance().subTaskEnd(isFirst,isEnd,subTaskId); } /** * 子任务跳过上报 */ - public void subTaskSkip(int subTaskId, boolean isLastSubTask) { - SweeperTaskModel.getInstance().subTaskSkip(subTaskId, isLastSubTask); + public void subTaskSkip(boolean isFirst,boolean isEnd,int subTaskId) { + SweeperTaskModel.getInstance().subTaskSkip(isFirst,isEnd,subTaskId); } /** diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/adapter/TaskListAdapter.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/adapter/TaskListAdapter.kt index 6e11288167..debec1e397 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/adapter/TaskListAdapter.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/adapter/TaskListAdapter.kt @@ -1,6 +1,5 @@ package com.mogo.och.sweeper.ui.adapter -import android.content.Context import android.graphics.Color import android.view.LayoutInflater import android.view.View @@ -12,12 +11,10 @@ import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.sweeper.R import com.mogo.och.sweeper.bean.SweeperMainTaskBean -class TaskListAdapter( - private val context: Context, - private var data: List?, -) : RecyclerView.Adapter() { +class TaskListAdapter() : RecyclerView.Adapter() { private var mItemClickListener: TaskItemClickListener? = null private var mSelectPosition: Int = -1 + private var data:MutableList?=null fun setOnTaskItemClickListener(itemClickListener: TaskItemClickListener?) { mItemClickListener = itemClickListener } @@ -40,7 +37,7 @@ class TaskListAdapter( this.mSelectPosition = position notifyDataSetChanged() } - fun setTaskListData(data: List?){ + fun setTaskListData(data: MutableList?){ this.data=data notifyDataSetChanged() } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt index 7fd7812e50..61cc66451b 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.sweeper.R import com.mogo.och.sweeper.bean.SubInfo import com.mogo.och.sweeper.bean.SweeperSubTaskBean @@ -19,11 +20,11 @@ import kotlinx.android.synthetic.main.sweeper_current_task_info.view.* class SweeperCurrentTaskInfoView : ConstraintLayout { //当前任务操作菜单 private var mTaskMenuPopWindow: MenuPopWindow? = null - private var presenter: SweeperPresenter?=null - private var mCurrentPosition=-1 - private var listTask:List?=null - private var isStartTask:Boolean=false - private var mSubTaskType:SubTaskTypeEnum=SubTaskTypeEnum.AUTOPILOT_SUBTYPE + private var presenter: SweeperPresenter? = null + private var mCurrentPosition = 0 + private var listTask: List? = null + private var isStartTask: Boolean = false + private var mSubTaskType: SubTaskTypeEnum = SubTaskTypeEnum.AUTOPILOT_SUBTYPE constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { @@ -45,12 +46,17 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { subTaskBean: SweeperSubTaskBean?, currentPosition: Int, menuItemClickListener: MenuPopWindow.OnMenuItemOnClickListener, - presenter:SweeperPresenter? + presenter: SweeperPresenter? ) { - this.presenter=presenter - this.listTask=subTaskBean?.subList - this.mCurrentPosition=currentPosition + this.presenter = presenter + this.mCurrentPosition = currentPosition mTaskMenuPopWindow = MenuPopWindow(context, menuItemClickListener) + subTaskBean?.apply { + this@SweeperCurrentTaskInfoView.listTask = subList + tvTaskName.text = taskName + val calendar = DateTimeUtil.formatLongToCalendar(taskStartTime) + tvTaskTime.text = DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.TAXI_HH_mm) + } setCurrentData(currentPosition) //任务操作菜单打开关闭处理 ivMore.setOnClickListener { @@ -65,40 +71,41 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { } } readyTaskBtn.setOnClickListener { - if (!isStartTask){ + if (!isStartTask) { //开始执行任务 startSubTask() - }else{ - isStartTask=false + } else { + isStartTask = false } } } + /** * 设置准备就绪按钮时都可以点击 */ - fun setEnableClickBtn(isClick:Boolean,isPause:Boolean) { - if (mSubTaskType.code==SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code){ - tvTaskState.text="暂未准备" + fun setEnableClickBtn(isClick: Boolean, isPause: Boolean) { + if (mSubTaskType.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code) { + tvTaskState.text = "暂未准备" tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_not_ready) - readyTaskBtn.text="准备出发" - readyTaskBtn.isClickable=false - readyTaskBtn.isSelected=false - isStartTask=false - }else{ - if (isPause){ - readyTaskBtn.text="暂停任务" - }else{ - readyTaskBtn.text="准备出发" + readyTaskBtn.text = "准备出发" + readyTaskBtn.isClickable = false + readyTaskBtn.isSelected = false + isStartTask = false + } else { + if (isPause) { + readyTaskBtn.text = "暂停任务" + } else { + readyTaskBtn.text = "准备出发" } - readyTaskBtn.isClickable=isClick - readyTaskBtn.isSelected=isClick - isStartTask=isPause - if (isPause){ - tvTaskState.text="正在作业" + readyTaskBtn.isClickable = isClick + readyTaskBtn.isSelected = isClick + isStartTask = isPause + if (isPause) { + tvTaskState.text = "正在作业" tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_working) - }else{ - tvTaskState.text="暂未准备" + } else { + tvTaskState.text = "暂未准备" tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_not_ready) } } @@ -107,18 +114,35 @@ class SweeperCurrentTaskInfoView : ConstraintLayout { /** * 开始子任务 */ - private fun startSubTask(){ + private fun startSubTask() { listTask?.let { - presenter?.startTask(it[mCurrentPosition].taskId, - if(it[mCurrentPosition].taskType== SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE) + presenter?.startTask( + isFirstSubTask(), + isLastSubTask(), + it[mCurrentPosition].taskId, + if (it[mCurrentPosition].taskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE + ) } } + /** + * 是否第一个子任务 + */ + private fun isFirstSubTask():Boolean{ + return mCurrentPosition==0 + } + /** + * 是否第一个子任务 + */ + private fun isLastSubTask():Boolean{ + return mCurrentPosition == (listTask?.size ?: 0) + } /** * 填充数据 */ - fun setCurrentData(mCurrentPosition:Int){ + fun setCurrentData(mCurrentPosition: Int) { listTask?.let { - mSubTaskType=if (it[mCurrentPosition].taskType==SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE + mSubTaskType = + if (it[mCurrentPosition].taskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE if (it.size == 1) { preSubTask.setData(it[mCurrentPosition], isSelect = true, isLastTask = true) currentSubTask.visibility = View.INVISIBLE diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt index 565ec75a99..eb90c33411 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt @@ -69,7 +69,8 @@ class SweeperWorkModeView : ConstraintLayout, ICleaningModeStateCallback { * 设置清扫模式面板 */ fun setSweeperFutianCleanSystemState(taskType: SubTaskTypeEnum, cleanSystemState: SweeperFuTianTaskSystemStates?) { - mOperatePanelPopWindow?.setCleanSystemState(cleanSystemState, this@SweeperWorkModeView) + // TODO:传递清扫车底盘数据给上装面板 + //mOperatePanelPopWindow?.setCleanSystemState(cleanSystemState, this@SweeperWorkModeView) if (this.operateState.code==OperateStateEnum.STARTING_STATUS.code){ return } diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml index c1f255a8f0..a7fb634bf9 100644 --- a/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml +++ b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml @@ -60,7 +60,7 @@ android:layout_marginTop="@dimen/dp_43" /> + android:src="@drawable/sweeper_clean_mode_icon" + android:visibility="gone"/>