[清扫车]接口添加字段及其逻辑修改

This commit is contained in:
bxb
2023-02-23 15:53:03 +08:00
parent 00d4203c46
commit 010a0cebee
16 changed files with 233 additions and 205 deletions

View File

@@ -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
)

View File

@@ -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<SubInfo>?)
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,
)

View File

@@ -19,7 +19,7 @@ interface ISweeperTaskCallback {
/**
* 获取子任务列表
*/
fun setSubTaskBean(subTaskBean: SweeperSubTaskBean?,isWorkingSubTask:Boolean)
fun setSubTaskBean(subTaskBean: SweeperSubTaskBean,isWorkingSubTask:Boolean)
/**
* 更新子任务状态

View File

@@ -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";

View File

@@ -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<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: 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<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, "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() }
val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
rvTaskList?.layoutManager = linearLayoutManager
@@ -96,25 +74,27 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
*
* @return
*/
fun setShowTaskListPanelView(isShow: Boolean) {
private fun setShowTaskListPanelView(isShow: Boolean) {
if (isShow) {
sweeper_current_task_list_view.visibility = View.VISIBLE
} else {
sweeper_current_task_list_view.visibility = View.GONE
}
}
/**
* 当前任务面板隐藏或显示
*
* @return
*/
fun setShowCurrentTaskPanelView(isShow: Boolean) {
private fun setShowCurrentTaskPanelView(isShow: Boolean) {
if (isShow) {
sweeper_current_task_view.visibility = View.VISIBLE
} else {
sweeper_current_task_view.visibility = View.GONE
}
}
/**
* VR模式切换
*
@@ -122,8 +102,8 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
*/
fun onVRModeChanged(isVRMode: Boolean) {
if (mRootView != null) {
mRootView.visibility = if (isVRMode) View.VISIBLE else View.GONE
}
mRootView.visibility = if (isVRMode) View.VISIBLE else View.GONE
}
}
fun hideOchSweeper() {}
@@ -144,23 +124,20 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
private fun initListener() {
tvTaskConfirm.setOnClickListener {
mMainTask?.let { task ->
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<SweeperFragment?, SweeperPresente
override fun onMenuItemClick(itemType: TaskStatusEnum) {
when (itemType.code) {
TaskStatusEnum.JUMP_OVER_SUBTASK.code -> {//跳过任务
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<SweeperFragment?, SweeperPresente
/**
* 设置当前子任务列表数据
*/
fun setSubTaskBean(subTaskBean: SweeperSubTaskBean?,isWorkingSubTask:Boolean) {
fun setSubTaskBean(subTaskBean: SweeperSubTaskBean, isWorkingSubTask: Boolean) {
this.mSubTaskBean = subTaskBean
this.mSubTaskBean?.let {
setShowCurrentTaskPanelView(true)
setShowTaskListPanelView(false)
sweeper_cl_work_mode.visibility = View.VISIBLE
mCurrentSubPosition = if (isWorkingSubTask){//如果是正在执行的子任务
mCurrentSubPosition = if (isWorkingSubTask) {//如果是正在执行的子任务
it.sort - 1
}else{
} else {
0
}
sweeper_current_task_view.setData(sweeper_cl_work_mode, it, mCurrentSubPosition, this, presenter)
mSubMutableList=it.subList
setSubTaskData()
presenter?.getSubTaskDetail(mSubTaskId, mSubTaskType)//加载子任务详情包括轨迹信息
mMainTask = SweeperMainTaskBean(it.taskId, it.taskName, 0, it.taskStartTime)
mSubMutableList?.let {subList->
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<SweeperFragment?, SweeperPresente
}
when (typeEnum.code) {
TaskStatusEnum.END_SUBTASK.code -> {//子任务结束
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<SweeperFragment?, SweeperPresente
*/
fun setSubTakDetail(subTaskDetailBean: SweeperSubTaskDetailBean, subTaskTypeEnum: SubTaskTypeEnum) {
if (subTaskTypeEnum.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code) {//人工驾驶子任务
this.mSubTaskDetailBean=subTaskDetailBean
this.mSubTaskDetailBean = subTaskDetailBean
manualDriving(subTaskDetailBean)
}
}
@@ -289,9 +275,10 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
*/
fun setMainTaskReset(isSuccess: Boolean) {
if (isSuccess) {
setShowCurrentTaskPanelView(false)
setShowTaskListPanelView(true)
sweeper_cl_work_mode.visibility = View.GONE
//任务重置后,重新拉取任务列表数据
mPresenter?.getMainTaskList()
//清除任务全览图的marker和路线
clearAllMarkerAndPolyline()
}
}
@@ -301,20 +288,18 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
private fun setSubTaskData() {
mSubMutableList?.let {
mSubTaskId = it[mCurrentSubPosition].taskId
mSubTaskName=it[mCurrentSubPosition].taskName
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)
SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE
//设置当前子任务信息
presenter?.setSubtask(isFirstSubTask(), isLastSubTask(), mSubTaskId)
}
}
/**
* 跳过子任务
* 结束主任务
*/
private fun subTaskEnd() {
private fun endMainTask() {
//结束任务
val builder = SweeperNoTitleCommonDialog.Builder()
val endConfirmDialog = builder
@@ -327,10 +312,6 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
mMainTask?.let {
presenter?.mainTaskReset(it.mainTaskId)
}
//mock
setShowTaskListPanelView(true)
setShowCurrentTaskPanelView(false)
sweeper_cl_work_mode.visibility = View.GONE
}
override fun cancel() {
@@ -343,37 +324,51 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
/**
* 人工驾驶子任务
*/
private fun manualDriving(subTaskDetailBean: SweeperSubTaskDetailBean?) {
private fun manualDriving(subTaskDetailBean: SweeperSubTaskDetailBean) {
val builder = SweeperManualDrivingDialog.Builder()
val endConfirmDialog = builder
.tips("前方子任务惠新西街南口地铁站公交站手动驾驶至惠新西街南口地铁站公交站")
.tips("前方子任务${mSubTaskName}手动驾驶至${subTaskDetailBean?.endSiteName}")
.confirmStr("确认")
.build(requireContext())
endConfirmDialog?.setClickListener(object : SweeperManualDrivingDialog.ClickListener {
override fun confirm() {
presenter?.startTask(mSubTaskId, mSubTaskType)
presenter?.startTask(isFirstSubTask(), isLastSubTask(), mSubTaskId, mSubTaskType)
showAmapNaviToStationFragment(true)
presenter?.startNaviToStation(true, 40.199247410363796, 116.73367125257714, 40.20070929640184, 116.73582650844378)
//mock
setShowTaskListPanelView(false)
sweeper_cl_work_mode.visibility = View.VISIBLE
setShowCurrentTaskPanelView(true)
sweeper_current_task_view.setData(sweeper_cl_work_mode, mSubTaskBean, mCurrentSubPosition, this@SweeperFragment, presenter)
// sweeper_cl_work_mode.setSweeperFutianCleanSystemState(
// mSubTaskType,
// if (mCleanSystemState == null) SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData() else mCleanSystemState
// )
presenter?.startNaviToStation(
true,
subTaskDetailBean.startSiteLat,
subTaskDetailBean.startSiteLon,
subTaskDetailBean.endSiteLat,
subTaskDetailBean.endSiteLon
)
}
})
endConfirmDialog?.show()
}
/**
* 是否第一个子任务
*/
fun isFirstSubTask(): Boolean {
return mCurrentSubPosition == 0
}
/**
* 是否第一个子任务
*/
fun isLastSubTask(): Boolean {
return mCurrentSubPosition == (mSubMutableList?.size ?: 0)
}
/**
* 当前位置经纬度
*/
fun setCurrentLocation(location: MogoLocation){
this.mLocation=location
fun setCurrentLocation(location: MogoLocation) {
this.mLocation = location
}
override fun refreshNavi(){
override fun refreshNavi() {
mSubTaskDetailBean?.apply {
mLocation?.let {
presenter?.startNaviToStation(true, it.longitude, it.latitude, endSiteLon, endSiteLat)

View File

@@ -3,6 +3,7 @@ package com.mogo.och.sweeper.model;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_SWEEPER;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -87,8 +88,10 @@ public class SweeperTaskModel {
private boolean isArriveSubTaskEndSite = false;
//当前子任务id
private int mSubTaskId = 0;
// //当前是否最后一个子任务
//当前是否最后一个子任务
private boolean mIsLastSubtask = false;
//当前任务是否是第一个
private boolean mIsFirstSubtask = false;
//0: 代表没有启动过 1代表是启动第一次当>=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<SweeperRoutePlanningUpdateReqBean.Result> 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<BaseResponse<Boolean>>() {
public void subTaskStart(boolean isFirst,boolean isEnd,int subTaskId, SubTaskTypeEnum subTaskType) {
SweeperServiceManager.subTaskStart(isFirst,isEnd,subTaskId, mContext, new OchCommonServiceCallback<BaseResponse<Boolean>>() {
@Override
public void onSuccess(BaseResponse<Boolean> 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<BaseResponse<Boolean>>() {
public void subTaskEnd(boolean isFirst,boolean isEnd,int subTaskId) {
SweeperServiceManager.subTaskEnd(isFirst,isEnd,subTaskId, mContext, new OchCommonServiceCallback<BaseResponse<Boolean>>() {
@Override
public void onSuccess(BaseResponse<Boolean> 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<BaseResponse<Boolean>>() {
public void subTaskSkip(boolean isFirst,boolean isEnd,int subTaskId) {
SweeperServiceManager.subTaskSkip(isFirst,isEnd,subTaskId, mContext, new OchCommonServiceCallback<BaseResponse<Boolean>>() {
@Override
public void onSuccess(BaseResponse<Boolean> 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);
}
}
}

View File

@@ -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<BaseResponse<List<SweeperMainTaskBean>>> 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<BaseResponse<Boolean>> mainTaskReset(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("taskId") int taskId);
Observable<BaseResponse<Boolean>> mainTaskReset(@Header ("appId") String appId, @Header("ticket") String ticket,@Query("carSn") String carSn, @Query("taskId") int taskId);
}

View File

@@ -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<BaseResponse<Boolean>>?) {
val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis())
fun subTaskStart(isFirst:Boolean,isEnd:Boolean,subTaskId: Int,context: Context, callback: OchCommonServiceCallback<BaseResponse<Boolean>>?) {
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<BaseResponse<Boolean>>?) {
val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis())
fun subTaskEnd(isFirst:Boolean,isEnd:Boolean,subTaskId: Int,context: Context, callback: OchCommonServiceCallback<BaseResponse<Boolean>>?) {
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<BaseResponse<Boolean>>?) {
val subStartRequest = SubStartRequest(MoGoAiCloudClientConfig.getInstance().sn, subTaskId, System.currentTimeMillis())
fun subTaskSkip(isFirst:Boolean,isEnd:Boolean,subTaskId: Int,context: Context, callback: OchCommonServiceCallback<BaseResponse<Boolean>>?) {
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()

View File

@@ -182,19 +182,12 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
}
/**
* 当前子任务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<SweeperFragment>
public void getCurrentTask() {
SweeperTaskModel.getInstance().getCurrentTask();
}
/**
* 获取主任务列表
*/
public void getMainTaskList() {
SweeperTaskModel.getInstance().getMainTaskList();
}
/**
* 获取子任务列表
*/
@@ -370,13 +368,13 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
/**
* 开始任务
*/
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<SweeperFragment>
/**
* 子任务结束上报
*/
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);
}
/**

View File

@@ -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<SweeperMainTaskBean>?,
) : RecyclerView.Adapter<TaskListAdapter.TaskViewHolder>() {
class TaskListAdapter() : RecyclerView.Adapter<TaskListAdapter.TaskViewHolder>() {
private var mItemClickListener: TaskItemClickListener? = null
private var mSelectPosition: Int = -1
private var data:MutableList<SweeperMainTaskBean>?=null
fun setOnTaskItemClickListener(itemClickListener: TaskItemClickListener?) {
mItemClickListener = itemClickListener
}
@@ -40,7 +37,7 @@ class TaskListAdapter(
this.mSelectPosition = position
notifyDataSetChanged()
}
fun setTaskListData(data: List<SweeperMainTaskBean>?){
fun setTaskListData(data: MutableList<SweeperMainTaskBean>?){
this.data=data
notifyDataSetChanged()
}

View File

@@ -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<SubInfo>?=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<SubInfo>? = 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

View File

@@ -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
}

View File

@@ -60,7 +60,7 @@
android:layout_marginTop="@dimen/dp_43"
/>
<ImageView
android:id="@+id/ivTaskRefresh"
android:id="@+id/ivTaskListRefresh"
android:layout_width="@dimen/dp_42"
android:layout_height="@dimen/dp_42"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -3,6 +3,7 @@
android:layout_width="@dimen/dp_560"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/bg_shape_work_mode">
<TextView
android:id="@+id/tvTaskName"
@@ -13,7 +14,7 @@
android:textSize="@dimen/dp_38"
android:textColor="@color/white"
android:layout_marginTop="@dimen/dp_21"
android:text="惠新西街南口地铁站公交站"
tools:text="惠新西街南口地铁站公交站"
android:layout_marginStart="@dimen/dp_28"
/>
<TextView
@@ -25,7 +26,7 @@
android:textSize="@dimen/dp_28"
android:textColor="@color/white"
android:layout_marginTop="@dimen/dp_21"
android:text="9:00"
tools:text="9:00"
android:layout_marginStart="@dimen/dp_28"
android:background="@drawable/bg_shape_clean_mode"
android:paddingStart="@dimen/dp_12"

View File

@@ -31,7 +31,7 @@
app:layout_constraintTop_toBottomOf="@+id/ivNoTaskData" />
<ImageView
android:id="@+id/ivTaskRefresh"
android:id="@+id/ivNoTaskRefresh"
android:layout_width="@dimen/dp_42"
android:layout_height="@dimen/dp_42"
android:layout_marginTop="@dimen/dp_39"

View File

@@ -74,7 +74,8 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="@dimen/dp_30"
android:src="@drawable/sweeper_clean_mode_icon"/>
android:src="@drawable/sweeper_clean_mode_icon"
android:visibility="gone"/>
<TextView
android:id="@+id/tvNoDataDesc"
android:layout_width="wrap_content"