[sweeper-cloud]大任务正常结束和提前结束逻辑处理

This commit is contained in:
bxb
2023-05-10 16:03:51 +08:00
parent b88a86d595
commit 29650a6051
12 changed files with 344 additions and 211 deletions

View File

@@ -36,8 +36,10 @@ import com.mogo.och.sweepercloud.bean.SweeperRoutePlanningUpdateReqBean;
import com.mogo.och.sweepercloud.callback.ISweeperTaskDataToFragmentCallback;
import com.mogo.och.sweepercloud.callback.IWeltMapSwitchToSmallCallback;
import com.mogo.och.sweepercloud.database.bean.WeltDataBean;
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils;
import com.mogo.och.sweepercloud.view.SweeperTrafficDataView;
import com.mogo.och.sweepercloud.view.WeltSmallMapView;
import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -119,25 +121,28 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
setMessageBox();
//设置左下角四个按钮监听事件
setBottomBtnListener();
// 模拟 不可自动驾驶目前场景是刚开机adas还未和工控机连接
findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
// 模拟 云端发送任务
findViewById(R.id.btnSendTask).setOnClickListener(view ->
mockSendCloudTaskInfo()
);
// 模拟 云端发送子任务确认
findViewById(R.id.btnSendSubTaskConfirm).setOnClickListener(view ->
mockSendCloudSubTaskConfirm()
);
// 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE)
// 模拟 云端请求结束大任务
findViewById(R.id.btnSendEndTask).setOnClickListener(view ->
mockSendCloudEndBigTask()
);
// 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
// 模拟 云端发送子任务状态
findViewById(R.id.btnSendSubtaskStatus).setOnClickListener(view ->
mockSendCloudSubTaskStatus()
);
// 模拟 结束子任务
findViewById(R.id.btnEndTask).setOnClickListener(view ->
debugEndSubTask()
// 模拟 云端发送大任务状态
findViewById(R.id.btnSendTaskStatus).setOnClickListener(view ->
mockSendCloudBigTaskStatus()
);
mTrafficDataView.setOnLongClickListener(new View.OnLongClickListener() {
mTrafficDataView.getSpeedImage().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
debugTestBar();
@@ -256,12 +261,6 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
*/
public abstract int getTaskListPanelViewId();
/**
* 模拟自动驾驶返回状态
*
* @param status
*/
public abstract void debugAutoPilotStatus(int status);
/**
* 迈速表实时更新
@@ -360,6 +359,7 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
CallerDevaToolsManager.INSTANCE.initAiCollect(mAICollectBtn);
}
}
/**
* 设置作业任务全览图隐藏或者显示
*
@@ -439,6 +439,7 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
/**
* 设置当前子任务终点
*
* @param subTaskCoordinate
*/
public void setCurrentTaskEndMarker(LatLng subTaskCoordinate) {
@@ -461,6 +462,7 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
mTaskDataToFragmentCallback.clearAllMarkerAndPolyline();
}
}
/**
* 设置任务轨迹点数据
*/
@@ -484,6 +486,40 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
this.mTaskDataToFragmentCallback = mTaskDataToFragmentCallback;
}
/**
* 模拟云端发送任务信息
*/
public void mockSendCloudTaskInfo() {
SweeperCloudTaskUtils.mockSendCloudTaskInfo(SweeperCloudTask.MessageType.CloudPushTask);
}
/**
* 模拟云端发送子任务确认
*/
public void mockSendCloudSubTaskConfirm() {
SweeperCloudTaskUtils.mockSendCloudSubTaskConfirm();
}
/**
* 模拟云端发送结束大任务
*/
public void mockSendCloudEndBigTask() {
SweeperCloudTaskUtils.mockSendCloudBigTaskEnd();
}
/**
* 模拟云端发送子任务状态
*/
public void mockSendCloudSubTaskStatus() {
SweeperCloudTaskUtils.mockSendCloudUpdateSubTaskStatus();
}
/**
* 模拟云端发送大任务状态
*/
public void mockSendCloudBigTaskStatus() {
}
/**
* 结束子任务
*/
@@ -491,16 +527,16 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
ArrayList<SweeperRoutePlanningUpdateReqBean.Result> resultArrayList = tempData();
setTaskRouteList(resultArrayList);
UiThreadHandler.postDelayed(() -> {
ArrayList<SweeperRoutePlanningUpdateReqBean.Result> routeList =tempData1();
ArrayList<SweeperRoutePlanningUpdateReqBean.Result> routeList = tempData1();
ArrayList<WeltDataBean> weltDataBeans = new ArrayList<>();
ArrayList<LatLng> subTaskCoordinates=new ArrayList<>();
ArrayList<LatLng> subTaskCoordinates = new ArrayList<>();
for (int i = 0; i < routeList.size(); i++) {
WeltDataBean weltDataBean = new WeltDataBean();
weltDataBean.setLocLon(routeList.get(i).longitude);
weltDataBean.setLocLat(routeList.get(i).latitude);
weltDataBean.setWeltDistance(Math.random() * 50);
weltDataBeans.add(weltDataBean);
subTaskCoordinates.add(new LatLng(routeList.get(i).latitude,routeList.get(i).longitude));
subTaskCoordinates.add(new LatLng(routeList.get(i).latitude, routeList.get(i).longitude));
}
setTaskListCoordinatesLatLng(subTaskCoordinates);
setWeltDataToMap(weltDataBeans, true, format(Math.random() * 50));
@@ -509,24 +545,26 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
private ArrayList<SweeperRoutePlanningUpdateReqBean.Result> tempData() {
ArrayList<SweeperRoutePlanningUpdateReqBean.Result> results = new ArrayList<>();
results.add(getRoute(116.41732262522,39.974576894194));
results.add(getRoute(116.43963532201855,39.9752190287537));
results.add(getRoute(116.4440910789222,39.96469276598098));
results.add(getRoute(116.45254030604285,39.958762580403544));
results.add(getRoute(116.46168616811329,39.94668171374373));
results.add(getRoute(116.41732262522, 39.974576894194));
results.add(getRoute(116.43963532201855, 39.9752190287537));
results.add(getRoute(116.4440910789222, 39.96469276598098));
results.add(getRoute(116.45254030604285, 39.958762580403544));
results.add(getRoute(116.46168616811329, 39.94668171374373));
return results;
}
private ArrayList<SweeperRoutePlanningUpdateReqBean.Result> tempData1() {
ArrayList<SweeperRoutePlanningUpdateReqBean.Result> results = new ArrayList<>();
results.add(getRoute(116.41732262522,39.974576894194));
results.add(getRoute(116.43963532201855,39.9752190287537));
results.add(getRoute(116.4440910789222,39.96469276598098));
results.add(getRoute(116.41732262522, 39.974576894194));
results.add(getRoute(116.43963532201855, 39.9752190287537));
results.add(getRoute(116.4440910789222, 39.96469276598098));
return results;
}
private SweeperRoutePlanningUpdateReqBean.Result getRoute(double longitude,double latitude){
private SweeperRoutePlanningUpdateReqBean.Result getRoute(double longitude, double latitude) {
SweeperRoutePlanningUpdateReqBean.Result result = new SweeperRoutePlanningUpdateReqBean.Result();
result.latitude = latitude;
result.longitude =longitude;
result.longitude = longitude;
return result;
}
}

View File

@@ -7,6 +7,7 @@ import chassis.ChassisStatesOuterClass
import com.amap.api.maps.model.LatLng
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.sweepercloud.R
import com.mogo.och.sweepercloud.bean.SweeperRoutePlanningUpdateReqBean
import com.mogo.och.sweepercloud.callback.SweeperCloudDialogClickListener
@@ -14,13 +15,15 @@ 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.mockSendCloudTaskInfo
import com.mogo.och.sweepercloud.util.SweeperCloudTaskUtils.createSweeperTaskEndDialog
import com.mogo.och.sweepercloud.view.SweeperCurrentTaskInfoView
import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.SubTaskInfo
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.TaskModel
import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm
import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop
import kotlinx.android.synthetic.main.fragment_och_sweeper.*
import kotlinx.android.synthetic.main.sweeper_no_data_common_view.*
import kotlinx.coroutines.Dispatchers
@@ -39,7 +42,7 @@ 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 = -1 //0:自动驾驶子任务 1:人工驾驶子任务 -1:未知任务类型
private var mSubTaskType: TaskModel = TaskModel.DEFAULT_MODEL //1:自动驾驶子任务 2:人工驾驶子任务 -1:未知任务类型
private var mCurrentSubTaskInfo: SubTaskInfo? = null//当前正在执行的子任务
private val mLoadingDialog: SweeperCloudLoadingDialog by lazy { SweeperCloudLoadingDialog(requireContext()) }
@@ -91,9 +94,6 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
}
fun hideOchSweeper() {}
override fun debugAutoPilotStatus(status: Int) {
mPresenter?.debugAutoPilotStatus(status)
}
/**
* 设置各种监听事件
@@ -160,13 +160,15 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
fun onSweeperCloudTask(messageType: SweeperCloudTask.MessageType, taskInfo: SweeperTask.TaskInfo?) {
this.mTaskInfo = taskInfo
this.mSubMutableList = taskInfo?.subListList
if (messageType == SweeperCloudTask.MessageType.PadSendGetTaskReq) {//主动拉取云端正在执行的任务,则直接在任务列表展示
//主动拉取云端正在执行的任务,则直接在任务列表展示
if (messageType == SweeperCloudTask.MessageType.PadSendGetTaskReq) {
if (taskInfo == null) {
setShowCurrentTaskPanelView(false)
} else {
getCurrentView().setData(taskInfo, getCurrentPosition())
setShowCurrentTaskPanelView(true)
return
}
getCurrentView().setData(taskInfo, getCurrentPosition())
setShowCurrentTaskPanelView(true)
addTaskData()
} else {//云端下发的任务信息需要弹窗接取
setShowCurrentTaskPanelView(true)
getCurrentView().setData(taskInfo)
@@ -195,9 +197,9 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
updateCurrentSubTaskInfo()
}
val builder = it.toBuilder()
builder.setSubList(index,subBuilder.build())
mTaskInfo=builder.build()
mSubMutableList=mTaskInfo?.subListList
builder.setSubList(index, subBuilder.build())
mTaskInfo = builder.build()
mSubMutableList = mTaskInfo?.subListList
getCurrentView().setData(mTaskInfo, index)
}
}
@@ -206,12 +208,42 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
}
}
//模拟结束子任务
override fun debugEndSubTask() {
//super.debugEndSubTask()
// TODO: 模拟云控获取任务
//mPresenter?.getCurrentTask()
mockSendCloudTaskInfo(SweeperCloudTask.MessageType.CloudPushTask)
/**
* 云端请求结束大任务
*/
fun onSweeperCloudTaskStop(taskId: String, stopTaskType: SweeperTaskStop.StopTaskType) {
mTaskInfo?.let {
//如果云端要更新的任务和本地缓存任务不是同一个,在无法结束任务
if (taskId != it.taskId) {
return
}
val timeout: String = getTimeSpent(it.taskEndTime)
val dialog = createSweeperTaskEndDialog(context, object : SweeperCloudDialogClickListener {
override fun onConfirm() {
mPresenter?.sendSweeperStopTaskResp(taskId, SweeperTaskStop.StopTaskCode.MANUAL_CONFIRM)
mLoadingDialog.showLoading()
ToastUtils.showLong("确认")
}
override fun onRefuseOrEnd() {
mPresenter?.sendSweeperStopTaskResp(taskId, SweeperTaskStop.StopTaskCode.MANUAL_REFUSE)
mLoadingDialog.showLoading()
ToastUtils.showLong("拒绝")
}
override fun onCountDownStop() {
mPresenter?.sendSweeperStopTaskResp(taskId, SweeperTaskStop.StopTaskCode.OVER_TIME)
mLoadingDialog.showLoading()
ToastUtils.showLong("倒计时")
}
override fun onNext() {
}
}, stopTaskType, timeout)
dialog?.show()
}
}
/**
@@ -251,8 +283,9 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
*/
private fun updateCurrentSubTaskInfo() {
mCurrentSubTaskInfo?.let {
mSubTaskType = it.taskModel.number
mPresenter?.setSubtask(it.subTaskId, it.taskModel.number, it.lineId)
mSubTaskType = it.taskModel
mPresenter?.setSubtask(it.subTaskId, it.taskModel, it.lineId)
setEndStationMarker()
}
}
@@ -315,6 +348,7 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
ToastUtils.showLong("确认")
mPresenter?.sendSweeperStartTaskResp(it.taskId, SweeperTask.StartTaskCode.MANUAL_CONFIRM)
mLoadingDialog.showLoading()
addTaskData()
}
override fun onRefuseOrEnd() {
@@ -340,4 +374,23 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
}
}
private fun getTimeSpent(taskEndTime: Long): String {
val timeLag: Long = System.currentTimeMillis() - taskEndTime
//天
val day: Long = timeLag / (24 * 60 * 60 * 1000)
//小时
val hour = (timeLag / (60 * 60 * 1000) - day * 24)
//分钟
val minute = ((timeLag / (60 * 1000)) - day * 24 * 60 - hour * 60)
if (day >= 1) {
return "${day}${hour}${minute}分钟"
}
if (hour >= 1) {
return "${hour}${minute}分钟"
}
return "${minute}分钟"
}
}

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 = -1; //1自动驾驶 2.人工驾驶 -1未知任务类型
private SweeperTask.TaskModel mSubTaskType = SweeperTask.TaskModel.DEFAULT_MODEL; //1自动驾驶 2.人工驾驶 0:无效值
private int mCurrentLineId = 0; //当前路线id
private int mLineId = 0;//上一次存储的路线id
//自动驾驶状态
@@ -196,7 +196,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
};
public void setSubtask(String subTaskId, int subTaskType, int currentLineId) {
public void setSubtask(String subTaskId, SweeperTask.TaskModel subTaskType, int currentLineId) {
this.mSubTaskId = subTaskId;
this.mSubTaskType = subTaskType;
this.mCurrentLineId = currentLineId;
@@ -207,7 +207,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
*/
public void clearRouteList() {
points.clear();
mSubTaskType = 0;
mSubTaskType = SweeperTask.TaskModel.UNRECOGNIZED;
}
/**
@@ -265,7 +265,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
if (mControllerStatusCallback != null) {
mControllerStatusCallback.onCarLocationChanged(gnssInfo);
}
if (mSubTaskType == 1) {//收集人工驾驶子任务坐标点
if (mSubTaskType == SweeperTask.TaskModel.MANUAL) {//收集人工驾驶子任务坐标点
addCoordinates(gnssInfo);
return;
}
@@ -472,10 +472,6 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTask.getNumber());
getAutoPilotControlManager().sendSweeperStartTaskResp(reqNo, startTaskResp);
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperStartTaskResp:" + printMessage(startTaskResp) + " reqNo:" + reqNo);
// TODO: 2023/5/5 模拟 当云控收到pad接取任务成功的指令时 云控下发子任务开始确认指令
if (code == SweeperTask.StartTaskCode.MANUAL_CONFIRM) {
SweeperCloudTaskUtils.mockSendCloudSubTaskConfirm();
}
}
/**
@@ -489,12 +485,8 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
builder.setCode(code);
SweeperTaskConfirm.TaskConfirmResp taskConfirmResp = builder.build();
String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTaskConfirm.getNumber());
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperStartTaskResp" + printMessage(taskConfirmResp) + " reqNo:" + reqNo);
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperTaskConfirmResp" + printMessage(taskConfirmResp) + " reqNo:" + reqNo);
getAutoPilotControlManager().sendSweeperTaskConfirmResp(reqNo, taskConfirmResp);
// TODO: 2023/5/8 模拟当云控收到pad子任务确认指令后。云控下发子任务状态更新指令
if (code == SweeperTaskConfirm.TaskConfirmCode.MANUAL_CONFIRM) {
SweeperCloudTaskUtils.mockSendCloudUpdateSubTaskStatus();
}
}
/**
@@ -510,7 +502,7 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM
builder.setCode(code);
SweeperTaskStop.StopTaskResp stopTaskResp = builder.build();
String reqNo = msgTypeAndReqNo.get(SweeperCloudTask.MessageType.CloudPushTaskStop.getNumber());
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperStartTaskResp" + printMessage(stopTaskResp) + " reqNo:" + reqNo);
CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendSweeperStopTaskResp" + printMessage(stopTaskResp) + " reqNo:" + reqNo);
getAutoPilotControlManager().sendSweeperStopTaskResp(reqNo, stopTaskResp);
}

View File

@@ -98,7 +98,7 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
/**
* 设置当前子任务信息
*/
public void setSubtask(String subTaskId, int subTaskType, int currentLineId) {
public void setSubtask(String subTaskId, SweeperTask.TaskModel subTaskType, int currentLineId) {
SweeperTaskModel.getInstance().setSubtask(subTaskId, subTaskType, currentLineId);
}
@@ -167,23 +167,23 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
}
@Override
public void onSweeperCloudTask(@NonNull SweeperCloudTask.MessageType messageType,SweeperTask.TaskInfo taskInfo) {
ThreadUtils.runOnUiThread(()-> mView.onSweeperCloudTask(messageType,taskInfo));
public void onSweeperCloudTask(@NonNull SweeperCloudTask.MessageType messageType, SweeperTask.TaskInfo taskInfo) {
ThreadUtils.runOnUiThread(() -> mView.onSweeperCloudTask(messageType, taskInfo));
}
@Override
public void onSweeperCloudTaskConfirm(@NonNull String taskId, @NonNull String subTaskId) {
ThreadUtils.runOnUiThread(()-> mView.showSubTaskInfoDialog(taskId,subTaskId));
ThreadUtils.runOnUiThread(() -> mView.showSubTaskInfoDialog(taskId, subTaskId));
}
@Override
public void onSweeperCloudTaskStatus(@NonNull String taskId, @NonNull String subTaskId, @NonNull SweeperCommon.TaskStatus subTaskStatus) {
ThreadUtils.runOnUiThread(()->mView.onSweeperUpdateSubTaskStatus(taskId,subTaskId,subTaskStatus));
ThreadUtils.runOnUiThread(() -> mView.onSweeperUpdateSubTaskStatus(taskId, subTaskId, subTaskStatus));
}
@Override
public void onSweeperCloudTaskStop(@NonNull String taskId, @NonNull SweeperTaskStop.StopTaskType stopTaskType) {
ThreadUtils.runOnUiThread(() -> mView.onSweeperCloudTaskStop(taskId, stopTaskType));
}
@Override
@@ -204,11 +204,11 @@ public class SweeperPresenter extends Presenter<SweeperFragment>
@Override
public void setWeltDataToMap(@NonNull ArrayList<WeltDataBean> weltDataBeans, boolean isWeltData, @NonNull String distance) {
ThreadUtils.runOnUiThread(()-> mView.setWeltDataToMap(weltDataBeans, isWeltData, distance));
ThreadUtils.runOnUiThread(() -> mView.setWeltDataToMap(weltDataBeans, isWeltData, distance));
}
@Override
public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) {
ThreadUtils.runOnUiThread(()-> mView.onSweeperFutianCleanSystemState(cleanSystemState));
ThreadUtils.runOnUiThread(() -> mView.onSweeperFutianCleanSystemState(cleanSystemState));
}
}

View File

@@ -33,9 +33,9 @@ class SweeperCloudLoadingDialog : BaseFloatDialog, LifecycleObserver {
* 开始旋转
*/
private fun startRotation() {
objectAnimator = ObjectAnimator.ofFloat(mLoadingView, "rotation", 0f, 360f)
objectAnimator = ObjectAnimator.ofFloat(mLoadingView, "rotation", 0f, 720f)
objectAnimator?.let {
it.duration = 1000
it.duration = 2000
it.repeatCount = -1
it.interpolator = LinearInterpolator()
it.start()

View File

@@ -4,7 +4,6 @@ import android.content.Context
import com.google.protobuf.MessageOrBuilder
import com.google.protobuf.TextFormat
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.sweepercloud.callback.SweeperCloudDialogClickListener
import com.mogo.och.sweepercloud.model.SweeperTaskModel
@@ -14,6 +13,7 @@ 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
import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop
object SweeperCloudTaskUtils {
/**
@@ -110,13 +110,12 @@ object SweeperCloudTaskUtils {
builder.sn = getDriverSn()
builder.taskId = "10"
builder.subTaskId = "1"
ThreadUtils.runOnUiThreadDelayed({
SweeperTaskModel.getInstance().onSweeperFutianCloudTaskConfirm(
MessageType.CloudPushTaskConfirm, "${System.currentTimeMillis()}",
System.currentTimeMillis(), builder.build()
)
}, 10000)
SweeperTaskModel.getInstance().onSweeperFutianCloudTaskConfirm(
MessageType.CloudPushTaskConfirm, "${System.currentTimeMillis()}",
System.currentTimeMillis(), builder.build()
)
}
/**
* 模拟下发更新子任务状态指令
*/
@@ -127,13 +126,27 @@ object SweeperCloudTaskUtils {
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)
SweeperTaskModel.getInstance().onSweeperFutianCloudTaskStatus(
MessageType.CloudPushTaskStatus, "${System.currentTimeMillis()}",
System.currentTimeMillis(), builder.build()
)
}
/**
* 模拟云端发送大任务结束
*/
@JvmStatic
fun mockSendCloudBigTaskEnd() {
val builder = SweeperTaskStop.StopTaskReq.newBuilder()
builder.sn = getDriverSn()
builder.taskId = "10"
builder.type = SweeperTaskStop.StopTaskType.TIMEOUT
SweeperTaskModel.getInstance().onSweeperFutianCloudTaskStop(
MessageType.CloudPushTaskStop, "${System.currentTimeMillis()}",
System.currentTimeMillis(), builder.build()
)
}
fun getDriverSn(): String? {
return MoGoAiCloudClientConfig.getInstance().sn
}
@@ -142,12 +155,12 @@ object SweeperCloudTaskUtils {
* 创建接收任务弹窗
*/
@JvmStatic
fun createReceivedTaskInfoDialog(context:Context?,listener: SweeperCloudDialogClickListener?,taskInfo: TaskInfo):SweeperCloudDialog?{
fun createReceivedTaskInfoDialog(context: Context?, listener: SweeperCloudDialogClickListener?, taskInfo: TaskInfo): SweeperCloudDialog? {
var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder()
val startCalendar = DateTimeUtil.formatLongToCalendar(taskInfo.taskStartTime)
val endCalendar = DateTimeUtil.formatLongToCalendar(taskInfo.taskEndTime)
builder.titleStr = "任务接取"
builder.contentStr = "请确认是否接取任务${taskInfo.taskName}"
builder.contentStr = "请确认是否接取${taskInfo.taskName}"
builder.tipStr = "(任务时间${DateTimeUtil.formatCalendarToString(startCalendar, DateTimeUtil.HH_mm)}-${
DateTimeUtil.formatCalendarToString(
endCalendar,
@@ -158,7 +171,7 @@ object SweeperCloudTaskUtils {
builder.middleStr = ""
builder.rightStr = "拒绝"
builder.countDownTime = 15
builder.listener=listener
builder.listener = listener
return context?.let { it1 -> builder.build(it1) }
}
@@ -166,18 +179,67 @@ object SweeperCloudTaskUtils {
* 创建确认开始子任务弹窗
*/
@JvmStatic
fun createConfirmStartSubTaskDialog(context:Context?,listener: SweeperCloudDialogClickListener?,subTaskInfo: SubTaskInfo):SweeperCloudDialog?{
fun createConfirmStartSubTaskDialog(
context: Context?,
listener: SweeperCloudDialogClickListener?,
subTaskInfo: SubTaskInfo
): SweeperCloudDialog? {
var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder()
builder.titleStr = "任务确认"
builder.contentStr = "请确认是否执行任务${subTaskInfo.subTaskName}"
builder.tipStr = if (subTaskInfo.taskModel.number == 1) "[需手动驾驶至终点${subTaskInfo.endLocation.siteName}]" else "[自动驾驶至终点${subTaskInfo.endLocation.siteName}]"
builder.contentStr = "请确认是否执行${subTaskInfo.subTaskName}"
builder.tipStr =
if (subTaskInfo.taskModel == TaskModel.MANUAL) "[需手动驾驶至终点${subTaskInfo.endLocation.siteName}]" else "[自动驾驶至终点${subTaskInfo.endLocation.siteName}]"
builder.leftStr = "确认"
builder.middleStr = "下一个"
builder.rightStr = "结束"
builder.countDownTime = 15
builder.listener =listener
builder.listener = listener
return context?.let { it1 -> builder.build(it1) }
}
/**
* 创建结束任务弹窗
*/
@JvmStatic
fun createSweeperTaskEndDialog(
context: Context?,
listener: SweeperCloudDialogClickListener?,
stopTaskType: SweeperTaskStop.StopTaskType,
timeoutStr: String
): SweeperCloudDialog? {
var builder: SweeperCloudDialog.Builder = SweeperCloudDialog.Builder()
builder.titleStr = "任务结束"
when (stopTaskType) {
//任务正常结束
SweeperTaskStop.StopTaskType.NORMAL -> {
builder.contentStr = "任务已完成,干的漂亮!"
builder.tipStr = ""
builder.leftStr = "确认"
builder.middleStr = ""
builder.rightStr = ""
}
//任务提前结束
SweeperTaskStop.StopTaskType.ADVANCE -> {
builder.contentStr = "云端请求终止任务,请确认"
builder.tipStr = "【确认后请接管停车】"
builder.leftStr = "确认"
builder.middleStr = ""
builder.rightStr = "拒绝"
}
//任务超时结束
SweeperTaskStop.StopTaskType.TIMEOUT -> {
builder.contentStr = "任务已超时${timeoutStr},请确认是否结束"
builder.tipStr = "【结束后请接管停车】"
builder.leftStr = "确认"
builder.middleStr = ""
builder.rightStr = "拒绝"
}
}
builder.countDownTime = 15
builder.listener = listener
return context?.let { it1 -> builder.build(it1) }
}
@JvmStatic
fun printMessage(message: MessageOrBuilder): String {
return TextFormat.printer().escapingNonAscii(false).printToString(message)

View File

@@ -9,6 +9,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.sweepercloud.R
import com.zhjt.mogo.adas.data.sweeper.common.SweeperCommon
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.SubTaskInfo
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.TaskModel
import kotlinx.android.synthetic.main.sweeper_subtask_view.view.*
/**
@@ -32,7 +33,7 @@ class SubTaskView : ConstraintLayout {
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) {//人工驾驶子任务
if (taskInfo.taskModel == TaskModel.MANUAL) {//人工驾驶子任务
ivManualDriving.visibility = View.VISIBLE
} else {
ivManualDriving.visibility = View.GONE

View File

@@ -158,7 +158,9 @@ class SweeperTrafficDataView : ConstraintLayout,
tapPositionView?.updateWithGear(gear)
}
}
fun getSpeedImage():ImageView?{
return speedImage
}
/**
* 速度设置
*/

View File

@@ -14,6 +14,7 @@ import com.mogo.och.sweepercloud.callback.ICleaningModeStateCallback
import com.mogo.och.sweepercloud.constant.OperateStateEnum
import com.mogo.och.sweepercloud.ui.popwindow.SweeperOperatePanelPopWindow
import com.mogo.och.sweepercloud.util.SweeperFutianCmdUtil
import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask.TaskModel
import kotlinx.android.synthetic.main.sweeper_work_mode.view.*
/**
@@ -67,7 +68,7 @@ class SweeperWorkModeView : ConstraintLayout,ICleaningModeStateCallback {
/**
* 设置清扫模式面板
*/
fun setSweeperFutianCleanSystemState(taskType: Int, cleanSystemState: SweeperFuTianTaskSystemStates?) {
fun setSweeperFutianCleanSystemState(taskType: TaskModel, cleanSystemState: SweeperFuTianTaskSystemStates?) {
// TODO:传递清扫车底盘数据给上装面板
//mOperatePanelPopWindow?.setCleanSystemState(cleanSystemState, this@SweeperWorkModeView)
if (this.operateState.code==OperateStateEnum.STARTING_STATUS.code){
@@ -79,7 +80,7 @@ class SweeperWorkModeView : ConstraintLayout,ICleaningModeStateCallback {
d(SceneConstant.M_SWEEPER + TAG, "SystemState operateState"+operateState.code)
}
//清扫车暂未选择清扫模式或者任务类型是人工驾驶子任务,则暂无清扫模式
if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState) || taskType==1||taskType==-1) {
if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState) || taskType==TaskModel.MANUAL||taskType==TaskModel.DEFAULT_MODEL) {
setShowOrHideCleanSystemState(OperateStateEnum.NO_STATUS, cleanSystemState)
} else {
setShowOrHideCleanSystemState(OperateStateEnum.SUCCESS_STATUS, cleanSystemState)

View File

@@ -4,31 +4,32 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/dp_800"
android:layout_height="@dimen/dp_560"
android:layout_gravity="center"
android:background="@drawable/bg_shape_dialog_cloud_view"
app:roundLayoutRadius="@dimen/dp_45"
android:layout_gravity="center">
app:roundLayoutRadius="@dimen/dp_45">
<ImageView
android:id="@+id/sweeper_cloud_imageview"
android:layout_width="@dimen/dp_75"
android:layout_height="@dimen/dp_75"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_30"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:src="@drawable/shape_sweeper_cloud_rotation"
/>
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.och.sweepercloud.view.CountDownView
android:id="@+id/sweeper_cloud_countdown"
android:layout_width="@dimen/dp_75"
android:layout_height="@dimen/dp_75"
tools:text="15"
android:gravity="center"
android:textColor="@color/white"
android:textSize="@dimen/dp_32"
app:layout_constraintBottom_toBottomOf="@+id/sweeper_cloud_imageview"
app:layout_constraintEnd_toEndOf="@+id/sweeper_cloud_imageview"
app:layout_constraintLeft_toLeftOf="@+id/sweeper_cloud_imageview"
app:layout_constraintTop_toTopOf="@+id/sweeper_cloud_imageview"
app:layout_constraintEnd_toEndOf="@+id/sweeper_cloud_imageview"
app:layout_constraintBottom_toBottomOf="@+id/sweeper_cloud_imageview"/>
tools:text="15" />
<TextView
android:id="@+id/sweeper_cloud_title"
@@ -36,42 +37,49 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_30"
android:gravity="center"
tools:text="任务领取"
android:textColor="@color/white"
android:textSize="@dimen/dp_56"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
tools:text="任务领取" />
<TextView
android:id="@+id/sweeper_cloud_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_49"
android:layout_marginEnd="@dimen/dp_30"
android:gravity="center"
tools:text="请确认是否接取任务AAAAAAA"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/dp_50"
app:layout_constraintTop_toBottomOf="@+id/sweeper_cloud_title"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<TextView
android:id="@+id/sweeper_cloud_tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_30"
android:gravity="center"
tools:text="任务时间09:00-12:00"
android:textColor="#A6CEFF"
android:textSize="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@+id/sweeper_cloud_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="center"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/llBottom"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/sweeper_cloud_title">
<TextView
android:id="@+id/sweeper_cloud_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginEnd="@dimen/dp_30"
android:gravity="center"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/dp_50"
tools:text="请确认是否接取任务AAAAAAA" />
<TextView
android:id="@+id/sweeper_cloud_tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_30"
android:gravity="center"
android:textColor="#A6CEFF"
android:textSize="@dimen/dp_40"
tools:text="任务时间09:00-12:00" />
</LinearLayout>
<LinearLayout
android:id="@+id/llBottom"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_134"
android:orientation="horizontal"
@@ -97,9 +105,9 @@
android:layout_weight="1"
android:background="#3769B5"
android:gravity="center"
tools:text="下一个"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/dp_50" />
android:textSize="@dimen/dp_50"
tools:text="下一个" />
<TextView
android:id="@+id/sweeper_cloud_right"
@@ -108,8 +116,8 @@
android:layout_weight="1"
android:background="@drawable/bg_shape_right_bottom_round"
android:gravity="center"
tools:text="拒绝"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/dp_50" />
android:textSize="@dimen/dp_50"
tools:text="拒绝" />
</LinearLayout>
</com.mogo.och.common.module.wigets.OCHRoundConstraintLayout>

View File

@@ -85,36 +85,37 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginLeft="@dimen/dp_13"
android:layout_marginTop="-20dp"
app:layout_constraintBottom_toTopOf="@+id/sweeper_switch_model_icon"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/sweeper_arc"
app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call"
android:layout_marginTop="-20dp"/>
app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call" />
<com.mogo.och.common.module.wigets.OCHRoundConstraintLayout
android:layout_width="@dimen/dp_711"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="@dimen/dp_36"
android:layout_marginTop="@dimen/dp_27"
app:roundLayoutRadius="@dimen/dp_16"
>
android:layout_marginEnd="@dimen/dp_36"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundLayoutRadius="@dimen/dp_16">
<com.mogo.eagle.core.function.hmi.ui.widget.SweeperVideoView
android:id="@+id/sweeper_video_view"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_401"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:src="#999999"
app:layout_constraintEnd_toEndOf="parent"
android:src="#999999"/>
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.och.sweepercloud.view.WeltSmallMapView
android:id="@+id/sweeper_task_welt_small_map"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_401"
app:layout_constraintTop_toBottomOf="@+id/sweeper_video_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
app:layout_constraintTop_toBottomOf="@+id/sweeper_video_view" />
</com.mogo.och.common.module.wigets.OCHRoundConstraintLayout>
<ImageView
@@ -185,36 +186,6 @@
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/viewDriverMsgBoxButton" />
<!--清扫手动驾驶路线导航-->
<FrameLayout
android:id="@+id/module_mogo_och_navi_panel_container"
android:layout_width="@dimen/dp_600"
android:layout_height="@dimen/dp_600"
android:layout_marginEnd="@dimen/module_mogo_och_margin_right"
android:layout_marginBottom="@dimen/module_mogo_och_margin_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<ImageView
android:id="@+id/sweeper_close_navi_icon"
android:layout_width="@dimen/dp_80"
android:layout_height="@dimen/dp_80"
android:layout_marginStart="@dimen/dp_24"
android:layout_marginTop="@dimen/dp_26"
android:src="@drawable/sweeper_close_navi_icon"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@+id/module_mogo_och_navi_panel_container"
app:layout_constraintTop_toTopOf="@+id/module_mogo_och_navi_panel_container" />
<ImageView
android:id="@+id/sweeper_refresh_navi"
android:layout_width="@dimen/dp_80"
android:layout_height="@dimen/dp_80"
android:layout_marginTop="@dimen/dp_26"
android:layout_marginEnd="@dimen/dp_24"
android:src="@drawable/sweeper_navi_refresh"
app:layout_constraintEnd_toEndOf="@+id/module_mogo_och_navi_panel_container"
app:layout_constraintTop_toTopOf="@+id/module_mogo_och_navi_panel_container" />
<FrameLayout
android:id="@+id/sweeper_welt_map_overview"
@@ -223,62 +194,66 @@
android:visibility="gone"
tools:visibility="visible" />
<androidx.constraintlayout.widget.Group
android:id="@+id/group_navi_panel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="module_mogo_och_navi_panel_container,sweeper_close_navi_icon
,sweeper_refresh_navi"
tools:visibility="visible" />
<Button
android:id="@+id/btnAutopilotDisable"
android:id="@+id/btnSendTask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#f00"
android:text="Disable"
android:text="发送任务"
android:textSize="30sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="@dimen/dp_200"/>
<Button
android:id="@+id/btnAutopilotEnable"
android:id="@+id/btnSendSubTaskConfirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0f0"
android:text="Enable"
android:text="子任务开始确认"
android:textSize="30sp"
app:layout_constraintRight_toRightOf="@id/btnAutopilotDisable"
app:layout_constraintTop_toBottomOf="@id/btnAutopilotDisable" />
app:layout_constraintRight_toRightOf="@id/btnSendTask"
app:layout_constraintTop_toBottomOf="@id/btnSendTask" />
<Button
android:id="@+id/btnAutopilotRunning"
android:id="@+id/btnSendEndTask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00f"
android:text="Running"
android:text="结束大任务"
android:textSize="30sp"
app:layout_constraintRight_toRightOf="@id/btnAutopilotDisable"
app:layout_constraintTop_toBottomOf="@id/btnAutopilotEnable" />
android:textColor="#fff"
app:layout_constraintRight_toRightOf="@id/btnSendTask"
app:layout_constraintTop_toBottomOf="@id/btnSendSubTaskConfirm" />
<Button
android:id="@+id/btnEndTask"
android:id="@+id/btnSendSubtaskStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ffffff"
android:text="结束子任务"
android:text="子任务状态"
android:textSize="30sp"
app:layout_constraintRight_toRightOf="@id/btnAutopilotRunning"
app:layout_constraintTop_toBottomOf="@id/btnAutopilotRunning" />
app:layout_constraintRight_toRightOf="@id/btnSendEndTask"
app:layout_constraintTop_toBottomOf="@id/btnSendEndTask" />
<Button
android:id="@+id/btnSendTaskStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#000000"
android:text="大任务状态"
android:textSize="30sp"
android:textColor="#fff"
app:layout_constraintRight_toRightOf="@id/btnSendSubtaskStatus"
app:layout_constraintTop_toBottomOf="@id/btnSendSubtaskStatus" />
<androidx.constraintlayout.widget.Group
android:id="@+id/groupTestPanel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="btnAutopilotDisable,btnAutopilotEnable
,btnAutopilotRunning,btnEndTask"
app:constraint_referenced_ids="btnSendTask,btnSendSubTaskConfirm,btnSendEndTask
,btnSendSubtaskStatus,btnSendTaskStatus"
tools:visibility="visible" />

View File

@@ -29,6 +29,7 @@
app:layout_constraintTop_toTopOf="parent"
android:layout_marginEnd="@dimen/dp_26"
android:layout_marginTop="@dimen/dp_20"
android:visibility="gone"
/>
<ImageView
android:id="@+id/ivSubTask"