[清扫车]人工驾驶子任务和结束任务弹窗相关逻辑添加

This commit is contained in:
bxb
2023-02-11 17:00:13 +08:00
parent c0e172077f
commit c271e96695
10 changed files with 360 additions and 229 deletions

View File

@@ -3,9 +3,10 @@ package com.mogo.och.sweeper.bean
/**
* 子任务信息
*/
data class SweeperSubTaskBean(var taskId:Int?,
data class SweeperSubTaskBean(var taskId:Int=0,
var taskName:String?,
var taskStartTime:Long?,
var sort:Int=1,
var subList:MutableList<SubInfo>?)
data class SubInfo(
var taskId: Int = 0,
@@ -13,6 +14,6 @@ data class SubInfo(
var mileage: Int = 0,
var taskStatus: Int,// 状态1未执行 2执行中 3结束 4跳过
var taskType: Int,//1自动驾驶 2人工驾驶
var timeSpent: Long = 0,
var timeSpent: String,
var sort: Int = 0,
)

View File

@@ -2,6 +2,8 @@ package com.mogo.och.sweeper.callback
import com.mogo.och.sweeper.bean.SweeperMainTaskBean
import com.mogo.och.sweeper.bean.SweeperSubTaskBean
import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean
import com.mogo.och.sweeper.constant.SubTaskTypeEnum
import com.mogo.och.sweeper.constant.TaskStatusEnum
/**
@@ -30,8 +32,8 @@ interface ISweeperTaskCallback {
fun setMainTaskReset(isSuccess: Boolean)
/**
* 空数据展示
* @param type
* 获取子任务详情包括轨迹信息
*/
fun emptyDataUI(type: Int)
fun setSubTakDetail(subTaskDetailBean: SweeperSubTaskDetailBean,subTaskTypeEnum: SubTaskTypeEnum)
}

View File

@@ -7,10 +7,6 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.Group;
import androidx.fragment.app.FragmentTransaction;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.mvp.IView;
import com.mogo.commons.mvp.MvpFragment;
@@ -27,11 +23,16 @@ import com.mogo.map.listener.MogoMapListenerHandler;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.map.uicontroller.VisualAngleMode;
import com.mogo.och.common.module.map.AmapNaviToDestinationModel;
import com.mogo.och.sweeper.R;
import com.mogo.och.sweeper.view.SweeperCurrentTaskInfoView;
import com.mogo.och.sweeper.view.SweeperTrafficDataView;
import com.mogo.och.sweeper.view.SweeperWorkModeView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.Group;
import androidx.fragment.app.FragmentTransaction;
/**
* 网约车基础Fragment主要负责布局通用界面处理站点面板和通话面板互斥情况
* <p>
@@ -331,32 +332,32 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
/**
* 人工驾驶地图导航
* 展示人工驾驶地图导航
*
* @param isShow
*/
protected void showAmapNaviToStationFragment(boolean isShow) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (isShow) {
mGroupNaviPanel.setVisibility(View.VISIBLE);
if(isShow){
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
mOchAmapNaviFragment = SweeperAmapNaviFragment.newInstance();
if (mOchAmapNaviFragment.isAdded()) {
return;
}
transaction.add(R.id.module_mogo_och_navi_panel_container, mOchAmapNaviFragment).show(mOchAmapNaviFragment);
transaction.commitAllowingStateLoss();
} else {
mGroupNaviPanel.setVisibility(View.VISIBLE);
}else{
AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
mGroupNaviPanel.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.sweeper_close_navi_icon) {
mGroupNaviPanel.setVisibility(View.GONE);
showAmapNaviToStationFragment(false);
} else if (id == R.id.sweeper_refresh_navi) {
refreshNavi();
}
}
public abstract void refreshNavi();
}

View File

@@ -4,16 +4,18 @@ import android.os.Bundle
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import chassis.ChassisStatesOuterClass
import com.amap.api.navi.model.NaviLatLng
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.och.sweeper.R
import com.mogo.och.sweeper.bean.SubInfo
import com.mogo.och.sweeper.bean.SweeperMainTaskBean
import com.mogo.och.sweeper.bean.SweeperSubTaskBean
import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean
import com.mogo.och.sweeper.constant.SubTaskTypeEnum
import com.mogo.och.sweeper.constant.TaskStatusEnum
import com.mogo.och.sweeper.presenter.SweeperPresenter
import com.mogo.och.sweeper.ui.adapter.TaskListAdapter
import com.mogo.och.sweeper.ui.dialog.SweeperManualDrivingDialog
import com.mogo.och.sweeper.ui.dialog.SweeperNoTitleCommonDialog
import com.mogo.och.sweeper.ui.popwindow.MenuPopWindow
import com.mogo.och.sweeper.util.SweeperFutianCmdUtil
import kotlinx.android.synthetic.main.fragment_och_sweeper.*
@@ -22,17 +24,20 @@ import kotlinx.android.synthetic.main.sweeper_no_data_common_view.*
/**
* 清扫车主界面
*/
class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresenter?>(), MenuPopWindow.OnMenuItemOnClickListener{
class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresenter?>(), MenuPopWindow.OnMenuItemOnClickListener {
private var mAdapter: TaskListAdapter? = null
private var mCurrentSubPosition: Int =0 //子任务下标
private var mMainMutableList: MutableList<SweeperMainTaskBean>?=null
private var mSubMutableList: MutableList<SubInfo>?=null
private var mSubTaskBean: SweeperSubTaskBean?=null
private var mSubTaskType:SubTaskTypeEnum=SubTaskTypeEnum.AUTOPILOT_SUBTYPE //1:自动驾驶子任务 2人工驾驶子任务
private var mCleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates?=null
private var mIsLastSubTask=false //是否最后一个子任务
private var mSubTaskId=-1//子任务id
private var mMainTask:SweeperMainTaskBean?=null
private var mCurrentSubPosition: Int = 0 //子任务下标
private var mMainMutableList: MutableList<SweeperMainTaskBean>? = null
private var mSubMutableList: MutableList<SubInfo>? = 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
//当前经纬度
override fun getTagName(): String {
@@ -41,38 +46,36 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
override fun initViews() {
super.initViews()
mMainMutableList= mutableListOf()
mMainMutableList?.add(SweeperMainTaskBean(1, "惠新西街南口地铁站公交站", 10,1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(2, "惠新西街南口地铁站公交站", 10,1675935380000L))
mMainMutableList?.add(SweeperMainTaskBean(3, "惠新西街南口地铁站公交站", 10,1675762580000L))
mMainMutableList?.add(SweeperMainTaskBean(4, "环球贸易中心", 10,1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(5, "惠新西街南口地铁站公交站", 10,1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(6, "惠新西街南口地铁站公交站", 10,1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(7, "惠新西街南口地铁站公交站", 10,1675762580000L))
mMainMutableList?.add(SweeperMainTaskBean(8, "环球贸易中心", 10,1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(9, "惠新西街南口地铁站公交站", 10,1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(10, "惠新西街南口地铁站公交站", 10,1675935380000L))
mSubMutableList= mutableListOf()
mSubMutableList?.add(SubInfo(1, "惠新西街南口地铁站公交站", 1200,1,1,1675848980000L,0))
mSubMutableList?.add(SubInfo(2, "惠新西街南口地铁站公交站", 2000,1,1,1675935380000L,0))
mSubMutableList?.add(SubInfo(3, "惠新西街南口地铁站公交站", 500,1,1,1675762580000L,0))
mSubMutableList?.add(SubInfo(4, "环球贸易中心", 10,1,1,1675848980000L,0))
mSubMutableList?.add(SubInfo(5, "惠新西街南口地铁站公交站", 800,1,1,1675848980000L,0))
mSubMutableList?.add(SubInfo(6, "惠新西街南口地铁站公交站", 90000,1,1,1675848980000L,0))
mSubMutableList?.add(SubInfo(7, "惠新西街南口地铁站公交站", 12356,1,1,1675762580000L,0))
mSubMutableList?.add(SubInfo(8, "环球贸易中心", 400,1,1,1675848980000L,0))
mSubMutableList?.add(SubInfo(9, "惠新西街南口地铁站公交站", 200,1,1,1675848980000L,0))
mSubMutableList?.add(SubInfo(10, "惠新西街南口地铁站公交站", 300,1,1,1675935380000L,0))
mMainMutableList = mutableListOf()
mMainMutableList?.add(SweeperMainTaskBean(1, "环球贸易中心", 10, 1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(2, "惠新西街南口地铁站公交站", 10, 1675935380000L))
mMainMutableList?.add(SweeperMainTaskBean(3, "环球贸易中心", 10, 1675762580000L))
mMainMutableList?.add(SweeperMainTaskBean(4, "环球贸易中心", 10, 1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(5, "惠新西街南口地铁站公交站", 10, 1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(6, "惠新西街南口地铁站公交站", 10, 1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(7, "惠新西街南口地铁站公交站", 10, 1675762580000L))
mMainMutableList?.add(SweeperMainTaskBean(8, "环球贸易中心", 10, 1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(9, "惠新西街南口地铁站公交站", 10, 1675848980000L))
mMainMutableList?.add(SweeperMainTaskBean(10, "惠新西街南口地铁站公交站", 10, 1675935380000L))
mSubMutableList = mutableListOf()
mSubMutableList?.add(SubInfo(1, "环球贸易中心", 1200, 1, 2, "1小时40分钟", 1))
mSubMutableList?.add(SubInfo(2, "环球贸易中心", 2000, 1, 1, "10小时34分钟", 1))
mSubMutableList?.add(SubInfo(3, "环球贸易中心", 500, 1, 1, "10小时34分钟", 1))
mSubMutableList?.add(SubInfo(4, "环球贸易中心", 10, 1, 1, "10小时34分钟", 0))
mSubMutableList?.add(SubInfo(5, "惠新西街南口地铁站公交站", 800, 1, 1, "10小时34分钟", 1))
mSubMutableList?.add(SubInfo(6, "惠新西街南口地铁站公交站", 90000, 1, 1, "10小时34分钟", 1))
mSubMutableList?.add(SubInfo(7, "惠新西街南口地铁站公交站", 12356, 1, 1, "10小时34分钟", 1))
mSubMutableList?.add(SubInfo(8, "环球贸易中心", 400, 1, 1, "10小时34分钟", 1))
mSubMutableList?.add(SubInfo(9, "惠新西街南口地铁站公交站", 200, 1, 1, "10小时34分钟", 1))
mSubMutableList?.add(SubInfo(10, "惠新西街南口地铁站公交站", 300, 1, 1, "10小时34分钟", 1))
mAdapter = context?.let { TaskListAdapter(it, mMainMutableList)}
mAdapter = context?.let { TaskListAdapter(it, mMainMutableList) }
val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
rvTaskList?.layoutManager = linearLayoutManager
rvTaskList?.adapter = mAdapter
mAdapter?.setOnTaskItemClickListener(onTaskItemClickListener)
initListener()
showAmapNaviToStationFragment(true)
startNaviToStation(true, 40.199247410363796, 116.73367125257714, 40.20070929640184, 116.73582650844378)
}
override fun createPresenter(): SweeperPresenter {
@@ -83,9 +86,11 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
super.onActivityCreated(savedInstanceState)
mPresenter?.getCurrentTask()
}
override fun getTaskListPanelViewId(): Int {
return R.layout.fragment_och_sweeper
}
/**
* VR模式切换
*
@@ -105,8 +110,8 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
/**
* 根据自动驾驶状态更新按钮
*/
fun readyTaskBtn(text:String,isClick:Boolean,isTaskWorking:Boolean) {
currentTaskPanelView.setEnableClickBtn(text,isClick,isTaskWorking)
fun readyTaskBtn(text: String, isClick: Boolean, isTaskWorking: Boolean) {
currentTaskPanelView.setEnableClickBtn(text, isClick, isTaskWorking)
}
/**
@@ -114,25 +119,36 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
*/
private fun initListener() {
tvTaskConfirm.setOnClickListener {
mMainTask?.let { task->
mSubTaskBean= SweeperSubTaskBean(task.mainTaskId,task.mainTaskName,task.mainTaskStartTime,mSubMutableList)
mMainTask?.let { task ->
mCurrentSubPosition=0
mSubTaskBean = SweeperSubTaskBean(task.mainTaskId, task.mainTaskName, task.mainTaskStartTime, 1, mSubMutableList)
//获取当前子任务列表
presenter?.getSubTaskList(task.mainTaskId,mSubTaskBean)
presenter?.getSubTaskList(task.mainTaskId, mSubTaskBean)
}
//mock 数据
setShowTaskListPanelView(false)
workModePanelView.visibility = View.VISIBLE
setShowCurrentTaskPanelView(true)
currentTaskPanelView.setData(workModePanelView,mSubTaskBean, mCurrentSubPosition,this,presenter)
workModePanelView.setSweeperFutianCleanSystemState(mSubTaskType,if(mCleanSystemState==null) SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData() else mCleanSystemState,trafficDataView)
setSubTaskData()
if (mSubTaskType == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE) {//如果是人工驾驶子任务,则弹窗
manualDriving(null)
} else {
setShowTaskListPanelView(false)
workModePanelView.visibility = View.VISIBLE
setShowCurrentTaskPanelView(true)
currentTaskPanelView.setData(workModePanelView, mSubTaskBean, mCurrentSubPosition, this, presenter)
workModePanelView.setSweeperFutianCleanSystemState(
mSubTaskType,
if (mCleanSystemState == null) SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData() else mCleanSystemState,
trafficDataView
)
}
}
}
private val onTaskItemClickListener = object : TaskListAdapter.TaskItemClickListener {
override fun onItemClick(position: Int,mainTask:SweeperMainTaskBean) {
override fun onItemClick(position: Int, mainTask: SweeperMainTaskBean) {
mAdapter?.selectPosition(position)
tvTaskConfirm.isSelected = true
this@SweeperFragment.mMainTask=mainTask
this@SweeperFragment.mMainTask = mainTask
}
}
@@ -140,13 +156,141 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
override fun onMenuItemClick(itemType: TaskStatusEnum) {
when (itemType) {
TaskStatusEnum.JUMP_OVER_SUBTASK -> {//跳过任务
presenter?.subTaskSkip(mSubTaskId,mIsLastSubTask)
presenter?.subTaskSkip(mSubTaskId, mIsLastSubTask)
//mock
if (mSubTaskType == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE){//人工驾驶子任务
showAmapNaviToStationFragment(false)
}
mCurrentSubPosition++
currentTaskPanelView.setData(workModePanelView,mSubTaskBean, mCurrentSubPosition,this,presenter)
currentTaskPanelView.setData(workModePanelView, mSubTaskBean, mCurrentSubPosition, this@SweeperFragment, presenter)
}
TaskStatusEnum.END_TASK -> {
subTaskEnd()
}
}
}
fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) {
this.mCleanSystemState = cleanSystemState
workModePanelView.setSweeperFutianCleanSystemState(mSubTaskType, cleanSystemState, trafficDataView)
}
/**
* 设置当前主任务列表数据
*/
fun setMainTaskList(mainTaskBeanList: MutableList<SweeperMainTaskBean>?) {
setShowCurrentTaskPanelView(false)
setShowTaskListPanelView(true)
workModePanelView.visibility = View.GONE
if (mainTaskBeanList != null && mainTaskBeanList.isNotEmpty()) {
noTaskDataView.visibility = View.GONE
sweeperListCl.visibility = View.VISIBLE
mAdapter?.setTaskListData(mainTaskBeanList)
} else {
noTaskDataView.visibility = View.VISIBLE
sweeperListCl.visibility = View.GONE
}
}
/**
* 设置当前子任务列表数据
*/
fun setSubTaskBean(subTaskBean: SweeperSubTaskBean?) {
this.mSubTaskBean = subTaskBean
this.mSubTaskBean?.let {
setShowCurrentTaskPanelView(true)
setShowTaskListPanelView(false)
workModePanelView.visibility = View.VISIBLE
mCurrentSubPosition = it.sort - 1
currentTaskPanelView.setData(workModePanelView, it, mCurrentSubPosition, this, presenter)
setSubTaskData()
presenter?.getSubTaskDetail(mSubTaskId, mSubTaskType)//加载子任务详情包括轨迹信息
}
}
/**
* 更新子任务状态
*/
fun updateSubTaskStatus(typeEnum: TaskStatusEnum, isLastSubTask: Boolean) {
if (isLastSubTask) {
setShowCurrentTaskPanelView(false)
setShowTaskListPanelView(true)
return
}
when (typeEnum) {
TaskStatusEnum.END_SUBTASK -> {//子任务结束
mCurrentSubPosition++
setSubTaskData()
presenter?.getSubTaskDetail(mSubTaskId, mSubTaskType)
if (mSubTaskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE) {//自动驾驶子任务
presenter?.startTask(mSubTaskId, mSubTaskType)
}
}
TaskStatusEnum.JUMP_OVER_SUBTASK -> { //子任务跳过
presenter?.subTaskEnd(mSubTaskId, mIsLastSubTask)
if (mSubTaskType == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE){//人工驾驶子任务
showAmapNaviToStationFragment(false)
}
}
TaskStatusEnum.START_SUBTASK -> { //子任务开始
if (mSubTaskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE) {//自动驾驶子任务
readyTaskBtn("暂停任务", true, true)
}
currentTaskPanelView.setCurrentData(mCurrentSubPosition)
}
}
}
/**
* 子任务信息详情,包括轨迹文件
*/
fun setSubTakDetail(subTaskDetailBean: SweeperSubTaskDetailBean, subTaskTypeEnum: SubTaskTypeEnum) {
if (subTaskTypeEnum == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE) {//人工驾驶子任务
this.mSubTaskDetailBean=subTaskDetailBean
manualDriving(subTaskDetailBean)
}
}
/**
* 主任务重置
*/
fun setMainTaskReset(isSuccess: Boolean) {
if (isSuccess) {
setShowCurrentTaskPanelView(false)
setShowTaskListPanelView(true)
workModePanelView.visibility = View.GONE
}
}
/**
* 设置当前选中的子任务信息
*/
private fun setSubTaskData() {
mSubMutableList?.let {
mSubTaskId = it[mCurrentSubPosition].taskId
mSubTaskName=it[mCurrentSubPosition].taskName
mSubTaskType = if (it[mCurrentSubPosition].taskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code)
SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE
//设置当前子任务id
presenter?.setSubTaskId(mSubTaskId)
//设置是否是最后一个子任务
presenter?.setIsLastSubtask(mCurrentSubPosition==it.size-1)
}
}
/**
* 跳过子任务
*/
private fun subTaskEnd() {
//结束任务
val builder = SweeperNoTitleCommonDialog.Builder()
val endConfirmDialog = builder
.tips("是否结束任务?")
.confirmStr("确认")
.cancelStr("取消")
.build(requireContext())
endConfirmDialog?.setClickListener(object : SweeperNoTitleCommonDialog.ClickListener {
override fun confirm() {
mMainTask?.let {
presenter?.mainTaskReset(it.mainTaskId)
}
@@ -155,99 +299,53 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
setShowCurrentTaskPanelView(false)
workModePanelView.visibility = View.GONE
}
}
}
fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) {
this.mCleanSystemState=cleanSystemState
workModePanelView.setSweeperFutianCleanSystemState(mSubTaskType,cleanSystemState,trafficDataView)
}
/**
* 导航去目的地
*/
private fun startNaviToStation(isVoicePlay: Boolean, startLat: Double, startLng: Double, endLat: Double, endLng: Double) {
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
val startNaviLatLng = NaviLatLng(startLat, startLng)
val endNaviLatLng = NaviLatLng(endLat, endLng)
AmapNaviToDestinationModel.getInstance(context).initAMapNavi(startNaviLatLng, endNaviLatLng)
AmapNaviToDestinationModel.getInstance(context).setVoiceIsMute(isVoicePlay)
}
/**
* 设置当前主任务列表数据
*/
fun setMainTaskList(mainTaskBeanList: MutableList<SweeperMainTaskBean>?){
setShowCurrentTaskPanelView(false)
setShowTaskListPanelView(true)
workModePanelView.visibility = View.GONE
if(mainTaskBeanList!=null&& mainTaskBeanList.isNotEmpty()){
noTaskDataView.visibility=View.GONE
sweeperListCl.visibility=View.VISIBLE
mAdapter?.setTaskListData(mainTaskBeanList)
}else{
noTaskDataView.visibility=View.VISIBLE
sweeperListCl.visibility=View.GONE
}
}
/**
* 设置当前子任务列表数据
*/
fun setSubTaskBean(subTaskBean: SweeperSubTaskBean?){
this.mSubTaskBean= subTaskBean
setShowCurrentTaskPanelView(true)
setShowTaskListPanelView(false)
workModePanelView.visibility = View.VISIBLE
currentTaskPanelView.setData(workModePanelView,mSubTaskBean, mCurrentSubPosition,this,presenter)
setSubTaskData()
}
/**
* 更新子任务状态
*/
fun updateSubTaskStatus(typeEnum: TaskStatusEnum, isLastSubTask: Boolean){
if (isLastSubTask){
setShowCurrentTaskPanelView(false)
setShowTaskListPanelView(true)
return
}
when(typeEnum){
TaskStatusEnum.END_SUBTASK->{//子任务结束
mCurrentSubPosition++
setSubTaskData()
presenter?.startTask(mSubTaskId,mSubTaskType)
override fun cancel() {
endConfirmDialog?.dismiss()
}
TaskStatusEnum.JUMP_OVER_SUBTASK->{ //子任务跳过
presenter?.subTaskEnd(mSubTaskId,mIsLastSubTask)
}
TaskStatusEnum.START_SUBTASK->{ //子任务开始
if (mSubTaskType==SubTaskTypeEnum.AUTOPILOT_SUBTYPE){//自动驾驶子任务
readyTaskBtn("暂停任务",true,true)
}else{//手动驾驶的子任务会弹窗
}
currentTaskPanelView.setCurrentData(mCurrentSubPosition)
}
}
}
/**
* 主任务重置
*/
fun setMainTaskReset(isSuccess: Boolean){
if (isSuccess){
setShowCurrentTaskPanelView(false)
setShowTaskListPanelView(true)
workModePanelView.visibility = View.GONE
}
})
endConfirmDialog?.show()
}
/**
* 设置子任务数据
* 人工驾驶子任务
*/
private fun setSubTaskData(){
mSubMutableList?.let {
mSubTaskId=it[mCurrentSubPosition].taskId
mSubTaskType=if (it[mCurrentSubPosition].taskType==SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code)
SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE
private fun manualDriving(subTaskDetailBean: SweeperSubTaskDetailBean?) {
val builder = SweeperManualDrivingDialog.Builder()
val endConfirmDialog = builder
.tips("前方子任务惠新西街南口地铁站公交站手动驾驶至惠新西街南口地铁站公交站")
.confirmStr("确认")
.build(requireContext())
endConfirmDialog?.setClickListener(object : SweeperManualDrivingDialog.ClickListener {
override fun confirm() {
presenter?.startTask(mSubTaskId, mSubTaskType)
showAmapNaviToStationFragment(true)
presenter?.startNaviToStation(true, 40.199247410363796, 116.73367125257714, 40.20070929640184, 116.73582650844378)
//mock
setShowTaskListPanelView(false)
workModePanelView.visibility = View.VISIBLE
setShowCurrentTaskPanelView(true)
currentTaskPanelView.setData(workModePanelView, mSubTaskBean, mCurrentSubPosition, this@SweeperFragment, presenter)
workModePanelView.setSweeperFutianCleanSystemState(
mSubTaskType,
if (mCleanSystemState == null) SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData() else mCleanSystemState,
trafficDataView
)
}
})
endConfirmDialog?.show()
}
/**
* 当前位置经纬度
*/
fun setCurrentLocation(location: MogoLocation){
this.mLocation=location
}
override fun refreshNavi(){
mSubTaskDetailBean?.apply {
mLocation?.let {
presenter?.startNaviToStation(true, it.longitude, it.latitude, endSiteLon, endSiteLat)
}
}
}
}

View File

@@ -370,7 +370,7 @@ public class SweeperTaskModel {
}
/**
* 将业务订单信息保存,鹰眼可取用
* 将轨迹文件信息同步到鹰眼
*/
private void updateAutopilotControlParameters() {
@@ -523,16 +523,18 @@ public class SweeperTaskModel {
/**
* 获取子任务详情包括轨迹文件信息
*/
public void getSubTaskDetail(int subTaskId) {
public void getSubTaskDetail(int subTaskId,SubTaskTypeEnum subTaskType) {
SweeperServiceManager.getSubTaskDetail(subTaskId, mContext, new OchCommonServiceCallback<BaseResponse<SweeperSubTaskDetailBean>>() {
@Override
public void onSuccess(BaseResponse<SweeperSubTaskDetailBean> data) {
if (data != null) {
currentSubTaskDetail = data.getData();
if (currentSubTaskDetail!=null){
//自动驾驶发送要下载文件轨迹路径
SweeperTrajectoryManager.getInstance().syncTrajectoryInfo(currentSubTaskDetail);
updateAutopilotControlParameters();
if (subTaskType==SubTaskTypeEnum.AUTOPILOT_SUBTYPE){//自动驾驶子任务
//向自动驾驶发送要下载文件轨迹路径
SweeperTrajectoryManager.getInstance().syncTrajectoryInfo(currentSubTaskDetail);
updateAutopilotControlParameters();
}
}
}

View File

@@ -49,7 +49,6 @@ public interface ISweeperApiService {
*/
@GET("/och-sweep/api/task/v1/subTaskList")
Observable<BaseResponse<List<SubInfo>>> getSubTaskList(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("carSn") String sn, @Query("taskId") int taskId);
/**
* 子任务详情 包括子任务轨迹信息
* @param appId

View File

@@ -2,12 +2,10 @@ package com.mogo.och.sweeper.presenter;
import android.os.Looper;
import com.elegant.network.utils.GsonUtil;
import com.amap.api.navi.model.NaviLatLng;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.mvp.Presenter;
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
@@ -15,12 +13,12 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoSweeperFutianCleanSystemL
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerSweeperFutianCleanSystemListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
import com.mogo.och.common.module.utils.PinYinUtil;
import com.mogo.och.common.module.map.AmapNaviToDestinationModel;
import com.mogo.och.sweeper.bean.SweeperMainTaskBean;
import com.mogo.och.sweeper.bean.SweeperSubTaskBean;
import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean;
import com.mogo.och.sweeper.callback.ISweeperADASStatusCallback;
import com.mogo.och.sweeper.callback.ISweeperControllerStatusCallback;
import com.mogo.och.sweeper.callback.ISweeperTaskCallback;
@@ -49,20 +47,21 @@ import system_master.SystemStatusInfo;
* @author tongchenfei
*/
public class SweeperPresenter extends Presenter<SweeperFragment>
implements IMoGoAutopilotStatusListener, ISweeperControllerStatusCallback, ISweeperADASStatusCallback, IMoGoSweeperFutianCleanSystemListener, ISweeperTaskCallback {
implements IMoGoAutopilotStatusListener, ISweeperControllerStatusCallback, ISweeperADASStatusCallback,
IMoGoSweeperFutianCleanSystemListener, ISweeperTaskCallback {
private static final String TAG = "BusPresenter";
private static final String TAG = "SweeperPresenter";
//当前子任务id
private int mSubTaskId=0;
private int mSubTaskId = 0;
//当前是否最后一个子任务
private boolean mIsLastSubtask=false;
private boolean mIsLastSubtask = false;
public SweeperPresenter(SweeperFragment view) {
super(view);
//2021.11.1 鹰眼架构整合由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口
CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
//清扫车模式和贴边数据回调监听
CallerSweeperFutianCleanSystemListenerManager.INSTANCE.addListener(TAG,this);
CallerSweeperFutianCleanSystemListenerManager.INSTANCE.addListener(TAG, this);
SweeperTaskModel.getInstance().init();
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
}
@@ -92,48 +91,49 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
SweeperTaskModel.getInstance().setSweeperTaskCallback(null);
CallerSweeperFutianCleanSystemListenerManager.INSTANCE.removeListener(TAG);
}
@Override
public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
if (autopilotStatusInfo == null) return;
switch (autopilotStatusInfo.getState()){
switch (autopilotStatusInfo.getState()) {
case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE://不可自动驾驶
runOnUIThread(() -> mView.readyTaskBtn("准备出发",false,false));
runOnUIThread(() -> mView.readyTaskBtn("准备出发", false, false));
break;
case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE://人工驾驶
if (SweeperTaskModel.getInstance().getSubWorking()){
if(FunctionBuildConfig.isDemoMode){//美化模式开启时
if (SweeperTaskModel.getInstance().getSubWorking()) {
if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
SweeperTaskModel.getInstance().startBeautificationMode();
}
}else{
if (FunctionBuildConfig.isDemoMode){//美化模式开启时
} else {
if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
//关闭美化模式
SweeperTaskModel.getInstance().closeBeautificationMode();
}
}
runOnUIThread(() -> mView.readyTaskBtn("准备出发",true,false));
runOnUIThread(() -> mView.readyTaskBtn("准备出发", true, false));
break;
case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING://自动驾驶中
if (SweeperTaskModel.getInstance().getSubWorking()){
if (FunctionBuildConfig.isDemoMode){//美化模式开启时
if (SweeperTaskModel.getInstance().getSubWorking()) {
if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
SweeperTaskModel.getInstance().startBeautificationMode();
}
runOnUIThread(() -> mView.readyTaskBtn("暂停任务",true,true));
}else{
runOnUIThread(() -> mView.readyTaskBtn("准备出发",true,false));
runOnUIThread(() -> mView.readyTaskBtn("暂停任务", true, true));
} else {
runOnUIThread(() -> mView.readyTaskBtn("准备出发", true, false));
}
case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING://平行驾驶
if (SweeperTaskModel.getInstance().getSubWorking()){
if(FunctionBuildConfig.isDemoMode){//美化模式开启时
if (SweeperTaskModel.getInstance().getSubWorking()) {
if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;//是否强制绘制引导线
CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);//是否自动启动自驾
}
}else{
if (FunctionBuildConfig.isDemoMode){//美化模式开启时
} else {
if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
//关闭美化模式
SweeperTaskModel.getInstance().closeBeautificationMode();
}
}
runOnUIThread(() -> mView.readyTaskBtn("准备出发",true,false));
runOnUIThread(() -> mView.readyTaskBtn("准备出发", true, false));
break;
default:
break;
@@ -149,24 +149,30 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
public void onCarLocationChanged(MogoLocation location) {
if (null != location) {
runOnUIThread(() -> mView.updateSpeedView((float) location.getGnssSpeed()));
runOnUIThread(() -> mView.setCurrentLocation(location));
}
}
public void cancelAutoPilot(){
public void cancelAutoPilot() {
//结束自动驾驶
CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot();
}
@Override
public void startOpenAutopilot() {
}
public void setSubTaskId(int mSubTaskId) {
this.mSubTaskId = mSubTaskId;
SweeperTaskModel.getInstance().setSubTaskId(mSubTaskId);
}
public void setIsLastSubtask(boolean mIsLastSubtask) {
this.mIsLastSubtask = mIsLastSubtask;
SweeperTaskModel.getInstance().setIsLastSubtask(mIsLastSubtask);
}
private void runOnUIThread(Runnable executor) {
if (executor == null) {
return;
@@ -177,6 +183,7 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
executor.run();
}
}
/**
* 测试使用
*
@@ -219,29 +226,33 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
@Override
public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) {
runOnUIThread(() ->mView.onSweeperFutianCleanSystemState(cleanSystemState));
runOnUIThread(() -> mView.onSweeperFutianCleanSystemState(cleanSystemState));
}
@Override
public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) {
}
/**
* 获取当前正在执行的任务
*/
public void getCurrentTask(){
public void getCurrentTask() {
SweeperTaskModel.getInstance().getCurrentTask();
}
/**
* 获取子任务列表
*/
public void getSubTaskList(int taskId,SweeperSubTaskBean sweeperSubTaskBean){
SweeperTaskModel.getInstance().getSubTaskList(taskId,sweeperSubTaskBean);
public void getSubTaskList(int taskId, SweeperSubTaskBean sweeperSubTaskBean) {
SweeperTaskModel.getInstance().getSubTaskList(taskId, sweeperSubTaskBean);
}
/**
* 获取子任务详情包括轨迹文件信息
*/
public void getSubTaskDetail(int subTaskId){
SweeperTaskModel.getInstance().getSubTaskDetail(subTaskId);
public void getSubTaskDetail(int subTaskId, SubTaskTypeEnum subTaskType) {
SweeperTaskModel.getInstance().getSubTaskDetail(subTaskId, subTaskType);
}
/**
* 子任务开始上报
@@ -249,11 +260,11 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
/**
* 开始任务
*/
public void startTask(int subTaskId,SubTaskTypeEnum subTaskType){
if (SweeperTaskModel.getInstance().getSubWorking()&&subTaskType==SubTaskTypeEnum.AUTOPILOT_SUBTYPE){//如果任务正在执行中,被人工接管后掉出自驾,则只重启自动驾驶
public void startTask(int subTaskId, SubTaskTypeEnum subTaskType) {
if (SweeperTaskModel.getInstance().getSubWorking() && subTaskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE) {//如果任务正在执行中,被人工接管后掉出自驾,则只重启自动驾驶
SweeperTaskModel.getInstance().startAutopilot();
}else{
SweeperTaskModel.getInstance().subTaskStart(subTaskId,subTaskType);
} else {
SweeperTaskModel.getInstance().subTaskStart(subTaskId, subTaskType);
}
// AutopilotControlParameters parameters = new AutopilotControlParameters();
// parameters.isSpeakVoice = true;
@@ -286,22 +297,25 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
// CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters));
// CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters);
}
/**
* 子任务结束上报
*/
public void subTaskEnd(int subTaskId,boolean isLastSubTask){
SweeperTaskModel.getInstance().subTaskEnd(subTaskId,isLastSubTask);
public void subTaskEnd(int subTaskId, boolean isLastSubTask) {
SweeperTaskModel.getInstance().subTaskEnd(subTaskId, isLastSubTask);
}
/**
* 子任务跳过上报
*/
public void subTaskSkip(int subTaskId,boolean isLastSubTask){
SweeperTaskModel.getInstance().subTaskSkip(subTaskId,isLastSubTask);
public void subTaskSkip(int subTaskId, boolean isLastSubTask) {
SweeperTaskModel.getInstance().subTaskSkip(subTaskId, isLastSubTask);
}
/**
* 主任务重置
*/
public void mainTaskReset(int taskId){
public void mainTaskReset(int taskId) {
SweeperTaskModel.getInstance().mainTaskReset(taskId);
}
@@ -316,14 +330,14 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
}
@Override
public void updateSubTaskStatus(TaskStatusEnum typeEnum,boolean isLastSubTask) {
if (isLastSubTask){
if(FunctionBuildConfig.isDemoMode){//美化模式开启时
SweeperTaskModel.getInstance().closeBeautificationMode();
}
cancelAutoPilot();
}
mView.updateSubTaskStatus(typeEnum,isLastSubTask);
public void updateSubTaskStatus(TaskStatusEnum typeEnum, boolean isLastSubTask) {
if (isLastSubTask) {
if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
SweeperTaskModel.getInstance().closeBeautificationMode();
}
cancelAutoPilot();
}
mView.updateSubTaskStatus(typeEnum, isLastSubTask);
}
@Override
@@ -332,7 +346,18 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
}
@Override
public void emptyDataUI(int type) {
public void setSubTakDetail(@NonNull SweeperSubTaskDetailBean subTaskDetailBean, SubTaskTypeEnum subTaskTypeEnum) {
mView.setSubTakDetail(subTaskDetailBean, subTaskTypeEnum);
}
/**
* 导航去目的地
*/
public void startNaviToStation(Boolean isVoicePlay, double startLat, double startLng, double endLat, double endLng) {
AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
NaviLatLng startNaviLatLng = new NaviLatLng(startLat, startLng);
NaviLatLng endNaviLatLng = new NaviLatLng(endLat, endLng);
AmapNaviToDestinationModel.getInstance(getContext()).initAMapNavi(startNaviLatLng, endNaviLatLng);
AmapNaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(isVoicePlay);
}
}

View File

@@ -38,12 +38,12 @@ class SubTaskView : ConstraintLayout {
} else {
"${taskInfo.mileage / 1000F}千米"
}
var timeSpent=if(DateTimeUtil.secondsToHourStr(taskInfo.timeSpent)!=""){
"${DateTimeUtil.secondsToHourStr(taskInfo.timeSpent/1000)}小时${DateTimeUtil.secondsToMinuteStr(taskInfo.timeSpent/1000)}分钟"
}else{
"${DateTimeUtil.secondsToMinuteStr(taskInfo.timeSpent/1000)}分钟"
}
tvSubTaskDesc.text = "全程约${mileage},预计耗时$timeSpent 分钟"
// var timeSpent=if(DateTimeUtil.secondsToHourStr(taskInfo.timeSpent)!=""){
// "${DateTimeUtil.secondsToHourStr(taskInfo.timeSpent/1000)}小时${DateTimeUtil.secondsToMinuteStr(taskInfo.timeSpent/1000)}分钟"
// }else{
// "${DateTimeUtil.secondsToMinuteStr(taskInfo.timeSpent/1000)}分钟"
// }
tvSubTaskDesc.text = "全程约${mileage},预计耗时${taskInfo.timeSpent}"
tvSubTaskName.setTextColor(if (isSelect) Color.parseColor("#3BD2FF") else Color.parseColor("#FFFFFF"))
if (isSelect) {
ivSubTaskSelect.visibility = View.VISIBLE

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_width="@dimen/dp_560"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/bg_shape_work_mode">
@@ -13,7 +13,7 @@
android:textSize="@dimen/dp_38"
android:textColor="@color/white"
android:layout_marginTop="@dimen/dp_21"
android:text="任务AAAAAAA"
android:text="惠新西街南口地铁站公交站"
android:layout_marginStart="@dimen/dp_28"
/>
<TextView

View File

@@ -8,14 +8,15 @@
android:id="@+id/tvSubTaskName"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:text="惠新西街南口地铁"
android:textSize="@dimen/dp_40"
tools:text="惠新西街南口地铁站公交站"
android:textSize="@dimen/dp_38"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="@dimen/dp_87"
android:maxLines="2"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginEnd="@dimen/dp_26"
/>
<ImageView
android:id="@+id/ivSubTaskSelect"
@@ -41,19 +42,21 @@
/>
<TextView
android:id="@+id/tvSubTaskDesc"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/tvSubTaskName"
app:layout_constraintStart_toStartOf="@+id/tvSubTaskName"
app:layout_constraintEnd_toEndOf="parent"
android:textColor="#A6CEFF"
tools:text="全程约384米预计耗时19分钟"
android:textSize="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_4"
android:textSize="@dimen/dp_24"
android:layout_marginTop="@dimen/dp_1"
android:layout_marginEnd="@dimen/dp_26"
/>
<ImageView
android:id="@+id/ivRightDownArrow"
android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_70"
android:layout_height="@dimen/dp_60"
android:src="@drawable/icon_right_down_arrow"
app:layout_constraintTop_toTopOf="@+id/tvSubTaskDesc"
android:layout_marginStart="@dimen/dp_46"