Merge branch 'dev_sweeper-d_230423_3.1.0' of gitlab.zhidaoauto.com:SCA/L4HA/AndroidApp/MoGoEagleEye into dev_sweeper-d_230423_3.1.0

This commit is contained in:
xinfengkun
2023-05-09 15:33:36 +08:00
11 changed files with 108 additions and 30 deletions

View File

@@ -23,14 +23,29 @@ interface ISweeperCloudTaskCallback {
*/
fun onSweeperCloudTaskConfirm(taskId:String,subTaskId:String)
/**
* 云端下发子任务状态同步
*/
fun onSweeperCloudTaskStatus(taskId:String,subTaskId:String,subTaskStatus: SweeperCommon.TaskStatus)
/**
* 云端下发结束大任务指令
*/
fun onSweeperCloudTaskStop(taskId:String,stopTaskType: StopTaskType)
/**
* 挂起/恢复
*/
fun onSweeperCloudTaskSuspendResume(messageType: SweeperCloudTask.MessageType,taskId:String,subTaskId:String,code:Code)
/**
* pad请求云端进入自驾
*/
fun onSweeperCloudBootable(taskId:String,subTaskId:String,code:Code)
/**
* 云端同步大任务状态
*/
fun onSweeperCloudBigTaskStatus(taskId:String,subTaskStatus: SweeperBigTaskStatus.BigTaskStatus)
/**
* 设置轨迹坐标点集合

View File

@@ -14,7 +14,7 @@ import com.mogo.och.sweepercloud.presenter.SweeperPresenter
import com.mogo.och.sweepercloud.ui.dialog.SweeperCloudLoadingDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createConfirmStartSubTaskDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createReceivedTaskInfoDialog
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.sendCloudTaskInfo
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.mockSendCloudTaskInfo
import com.mogo.och.sweepercloud.view.SweeperCurrentTaskInfoView
import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
@@ -39,7 +39,8 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
private var mCleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates? = null
private var mLocation: MogoLocation? = null
private var mTaskInfo: SweeperTask.TaskInfo? = null
private var mSubTaskType: Int = 0 //0:自动驾驶子任务 1人工驾驶子任务
private var mSubTaskType: Int = -1 //0:自动驾驶子任务 1人工驾驶子任务 -1:未知任务类型
private var mCurrentSubTaskInfo: SubTaskInfo? = null//当前正在执行的子任务
private val mLoadingDialog: SweeperCloudLoadingDialog by lazy { SweeperCloudLoadingDialog(requireContext()) }
override fun getTagName(): String {
@@ -173,12 +174,44 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
}
}
/**
* 根据云端同步的子任务状态,更新列表中任务状态
*/
fun onSweeperUpdateSubTaskStatus(taskId: String, subTaskId: String, subTaskStatus: SweeperCommon.TaskStatus) {
mLoadingDialog.hideLoading()
mTaskInfo?.let {
//如果云端要更新的任务和本地缓存任务不是同一个,在无法更新子任务状态
if (taskId != it.taskId) {
return
}
mSubMutableList?.let { subTaskList ->
for (index in 0 until subTaskList.size) {
if (subTaskList[index].subTaskId == subTaskId) {
val subBuilder = subTaskList[index].toBuilder()
subBuilder.taskStatus = subTaskStatus
if (subTaskStatus == SweeperCommon.TaskStatus.RUNNING) {
mCurrentSubTaskInfo = subBuilder.build()
//更新当前正在执行的任务状态
updateCurrentSubTaskInfo()
}
val builder = it.toBuilder()
builder.setSubList(index,subBuilder.build())
mTaskInfo=builder.build()
mSubMutableList=mTaskInfo?.subListList
getCurrentView().setData(mTaskInfo, index)
}
}
}
}
}
//模拟结束子任务
override fun debugEndSubTask() {
//super.debugEndSubTask()
// TODO: 模拟云控获取任务
//mPresenter?.getCurrentTask()
sendCloudTaskInfo(SweeperCloudTask.MessageType.CloudPushTask)
mockSendCloudTaskInfo(SweeperCloudTask.MessageType.CloudPushTask)
}
/**
@@ -189,8 +222,8 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
mSubMutableList?.apply {
for (index in 0 until size) {
if (get(index).taskStatus == SweeperCommon.TaskStatus.RUNNING) {
mSubTaskType = get(index).taskModel.number
mPresenter?.setSubtask(get(index).subTaskId, get(index).taskModel.number, get(index).lineId)
mCurrentSubTaskInfo = get(index)
updateCurrentSubTaskInfo()
return index
}
}
@@ -206,8 +239,6 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
mSubMutableList?.apply {
for (index in 0 until size) {
if (get(index).subTaskId == subTaskId) {
mSubTaskType = get(index).taskModel.number
mPresenter?.setSubtask(get(index).subTaskId, get(index).taskModel.number, get(index).lineId)
return get(index)
}
}
@@ -215,6 +246,16 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
return null
}
/**
* 更新当前子任务信息
*/
private fun updateCurrentSubTaskInfo() {
mCurrentSubTaskInfo?.let {
mSubTaskType = it.taskModel.number
mPresenter?.setSubtask(it.subTaskId, it.taskModel.number, it.lineId)
}
}
/**
* 设置路线轨迹
*/

View File

@@ -78,7 +78,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
private ISweeperControllerStatusCallback mControllerStatusCallback; //Model->PresenterVR mode等
private ISweeperCloudTaskCallback mSweeperTaskCallback;
ArrayList<SweeperRoutePlanningUpdateReqBean.Result> points = new ArrayList<>();//全路径信息
private int mSubTaskType = 0; //1自动驾驶 2.人工驾驶
private int mSubTaskType = -1; //1自动驾驶 2.人工驾驶 -1未知任务类型
private int mCurrentLineId = 0; //当前路线id
private int mLineId = 0;//上一次存储的路线id
//自动驾驶状态
@@ -457,7 +457,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getCurrentTask:" + printMessage(getTaskReq) + " reqNo:" + reqNo);
getAutoPilotControlManager().sendSweeperGetTaskReq(reqNo, getTaskReq);
// TODO: 2023/5/5 模拟云控获取任务
SweeperCloudTaskUtils.sendCloudTaskInfo(SweeperCloudTask.MessageType.PadSendGetTaskReq);
SweeperCloudTaskUtils.mockSendCloudTaskInfo(SweeperCloudTask.MessageType.PadSendGetTaskReq);
}
/**
@@ -474,7 +474,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperStartTaskResp:" + printMessage(startTaskResp) + " reqNo:" + reqNo);
// TODO: 2023/5/5 模拟 当云控收到pad接取任务成功的指令时 云控下发子任务开始确认指令
if (code == SweeperTask.StartTaskCode.MANUAL_CONFIRM) {
SweeperCloudTaskUtils.sendCloudSubTaskConfirm();
SweeperCloudTaskUtils.mockSendCloudSubTaskConfirm();
}
}
@@ -491,6 +491,10 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTaskConfirm.getNumber());
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperStartTaskResp" + printMessage(taskConfirmResp) + " reqNo:" + reqNo);
getAutoPilotControlManager().sendSweeperTaskConfirmResp(reqNo, taskConfirmResp);
// TODO: 2023/5/8 模拟当云控收到pad子任务确认指令后。云控下发子任务状态更新指令
if (code == SweeperTaskConfirm.TaskConfirmCode.MANUAL_CONFIRM) {
SweeperCloudTaskUtils.mockSendCloudUpdateSubTaskStatus();
}
}
/**

View File

@@ -178,6 +178,7 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
@Override
public void onSweeperCloudTaskStatus(@NonNull String taskId, @NonNull String subTaskId, @NonNull SweeperCommon.TaskStatus subTaskStatus) {
ThreadUtils.runOnUiThread(()->mView.onSweeperUpdateSubTaskStatus(taskId,subTaskId,subTaskStatus));
}
@Override

View File

@@ -35,7 +35,7 @@ class SweeperCloudLoadingDialog : BaseFloatDialog, LifecycleObserver {
private fun startRotation() {
objectAnimator = ObjectAnimator.ofFloat(mLoadingView, "rotation", 0f, 360f)
objectAnimator?.let {
it.duration = 1500
it.duration = 1000
it.repeatCount = -1
it.interpolator = LinearInterpolator()
it.start()

View File

@@ -13,20 +13,21 @@ import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask.MessageType
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.*
import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm.TaskConfirm
import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus
object SweeperCloudTaskUtils {
/**
* 模拟云控发送任务给pad
*/
@JvmStatic
fun sendCloudTaskInfo(messageType: MessageType) {
fun mockSendCloudTaskInfo(messageType: MessageType) {
val builder = TaskInfo.newBuilder()
builder.sn = getDriverSn()
builder.taskId = "10"
builder.taskName = "烟台清扫车作业任务"
builder.currentTime = System.currentTimeMillis()
builder.taskStartTime = 1682664162000
builder.taskEndTime = 1682750562000
builder.taskStartTime = 1683507615000
builder.taskEndTime = 1683540015000
//第一个子任务
val subBuilder0 = SubTaskInfo.newBuilder()
subBuilder0.subTaskId = "1"
@@ -104,7 +105,7 @@ object SweeperCloudTaskUtils {
* 模拟云控发送子任务开始确认信息
*/
@JvmStatic
fun sendCloudSubTaskConfirm() {
fun mockSendCloudSubTaskConfirm() {
val builder = TaskConfirm.newBuilder()
builder.sn = getDriverSn()
builder.taskId = "10"
@@ -116,7 +117,23 @@ object SweeperCloudTaskUtils {
)
}, 10000)
}
/**
* 模拟下发更新子任务状态指令
*/
@JvmStatic
fun mockSendCloudUpdateSubTaskStatus() {
val builder = SweeperTaskStatus.TaskStatusPush.newBuilder()
builder.sn = getDriverSn()
builder.taskId = "10"
builder.subTaskId = "3"
builder.taskStatus = SweeperCommon.TaskStatus.RUNNING
ThreadUtils.runOnUiThreadDelayed({
SweeperTaskModel.getInstance().onSweeperFutianCloudTaskStatus(
MessageType.CloudPushTaskStatus, "${System.currentTimeMillis()}",
System.currentTimeMillis(), builder.build()
)
}, 10000)
}
fun getDriverSn(): String? {
return MoGoAiCloudClientConfig.getInstance().sn
}

View File

@@ -29,7 +29,7 @@ class SubTaskView : ConstraintLayout {
/**
* 设置子任务信息
*/
fun setData(taskInfo: SubTaskInfo, isLastTask: Boolean = false) {
fun setData(taskInfo: SubTaskInfo,isLastTask: Boolean = false) {
tvSubTaskName.text = taskInfo.subTaskName
tvSubTaskName.setTextColor(if (taskInfo.taskStatus==SweeperCommon.TaskStatus.RUNNING) Color.parseColor("#3BD2FF") else Color.parseColor("#FFFFFF"))
if (taskInfo.taskModel.number == 1) {//人工驾驶子任务

View File

@@ -39,24 +39,24 @@ class SweeperCurrentTaskInfoView : ConstraintLayout {
*/
fun setData(
subTaskBean: TaskInfo?,
currentPosition:Int=-1
currentPosition: Int = -1
) {
subTaskBean?.apply {
this@SweeperCurrentTaskInfoView.listTask = subListList
tvTaskName.text = taskName
val calendar = DateTimeUtil.formatLongToCalendar(taskStartTime)
tvTaskTime.text = DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm)
val calendarStart = DateTimeUtil.formatLongToCalendar(taskStartTime)
val calendarEnd = DateTimeUtil.formatLongToCalendar(taskEndTime)
tvTaskTime.text = "${DateTimeUtil.formatCalendarToString(calendarStart, DateTimeUtil.HH_mm)}-${DateTimeUtil.formatCalendarToString(calendarEnd, DateTimeUtil.HH_mm)}"
}
listTask?.let {
//特殊处理当前暂无执行中任务的情况
var position=currentPosition
if (position==-1){
position += 1
if (currentPosition == -1) {
setSubTaskState(false)
}else{
setSubTaskState(it[position].taskStatus==TaskStatus.RUNNING)
setCurrentData(currentPosition + 1)
} else {
setSubTaskState(it[currentPosition].taskStatus == TaskStatus.RUNNING)
setCurrentData(currentPosition)
}
setCurrentData(position)
}
}
@@ -76,7 +76,7 @@ class SweeperCurrentTaskInfoView : ConstraintLayout {
/**
* 填充数据
*/
private fun setCurrentData(currentPosition:Int) {
private fun setCurrentData(currentPosition: Int) {
listTask?.let {
if (it.size == 1) {
preSubTask.setData(it[currentPosition], isLastTask = true)

View File

@@ -79,7 +79,7 @@ class SweeperWorkModeView : ConstraintLayout,ICleaningModeStateCallback {
d(SceneConstant.M_SWEEPER + TAG, "SystemState operateState"+operateState.code)
}
//清扫车暂未选择清扫模式或者任务类型是人工驾驶子任务,则暂无清扫模式
if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState) || taskType==1) {
if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState) || taskType==1||taskType==-1) {
setShowOrHideCleanSystemState(OperateStateEnum.NO_STATUS, cleanSystemState)
} else {
setShowOrHideCleanSystemState(OperateStateEnum.SUCCESS_STATUS, cleanSystemState)

View File

@@ -77,7 +77,7 @@
android:id="@+id/preSubTask"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_50"
android:layout_marginTop="@dimen/dp_10"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/viewTaskInfoLine" />

View File

@@ -43,7 +43,7 @@
<ImageView
android:id="@+id/ivRightDownArrow"
android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_60"
android:layout_height="@dimen/dp_95"
android:src="@drawable/icon_right_down_arrow"
app:layout_constraintTop_toBottomOf="@+id/ivSubTask"
android:layout_marginTop="@dimen/dp_16"