endSitePoint;
- public String carNumber;
- public long createTime;
- public long startTime;
- public List< Double > startSiteGcjPoint;
- public List< Double > endSiteGcjPoint;
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SubStartRequest.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SubStartRequest.kt
new file mode 100644
index 0000000000..f0793a69a5
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SubStartRequest.kt
@@ -0,0 +1,11 @@
+package com.mogo.och.sweeper.bean
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig
+
+data class SubStartRequest(
+ var carSn:String=MoGoAiCloudClientConfig.getInstance().sn,
+ var taskId:Int,
+ var startTime:Long,
+ var isFirst:Boolean,
+ var isEnd:Boolean
+ )
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperMainTaskBean.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperMainTaskBean.kt
new file mode 100644
index 0000000000..ccb548653a
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperMainTaskBean.kt
@@ -0,0 +1,14 @@
+package com.mogo.och.sweeper.bean
+
+/**
+ *
+ * 清扫车任务信息
+ *
+ * @author tongchenfei
+ */
+data class SweeperMainTaskBean(
+ var mainTaskId:Int = 0,
+ var mainTaskName: String? = null,
+ var subTaskTotal:Int = 0,
+ var mainTaskStartTime: Long = 0
+ )
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOperationStatusRequest.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOperationStatusRequest.java
deleted file mode 100644
index c8b9995b24..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOperationStatusRequest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-
-public
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 小巴车运营状态请求参数
- */
-class SweeperOperationStatusRequest {
-
- private String sn;
- private double lat;
- private double lon;
- public SweeperOperationStatusRequest(double lon, double lat) {
- this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.lat = lat;
- this.lon = lon;
- }
- public void setLat(double lat) {
- this.lat = lat;
- }
-
- public void setLon(double lon) {
- this.lon = lon;
- }
-
- public String getSn() {
- return sn;
- }
-
- public double getLat() {
- return lat;
- }
-
- public double getLon() {
- return lon;
- }
-
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOperationStatusResponse.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOperationStatusResponse.java
deleted file mode 100644
index 664def47df..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOperationStatusResponse.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 小巴车运营状态返回参数
- */
-public class SweeperOperationStatusResponse extends BaseData {
-
- public Result data;
-
- public static class Result {
-
- public int serviceStatus;//0:已收车,1:已出车
-
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOrderBean.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOrderBean.java
deleted file mode 100644
index 14be117b5b..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOrderBean.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-/**
- * @author congtaowang
- * @since 2021/3/23
- *
- * 小巴订单
- */
-public class SweeperOrderBean {
-
- /**
- * orderNo number
- * passengerPhone string 下单用户电话
- * startStationId integer 开始站点
- * startStationName string
- * endStationId integer 结束站点
- * endStationName string
- */
-
- private String orderNo;
- private String passengerPhone;
- private int startStationId;//乘客上车点
- private String startStationName;
- private String endStationName;
- private int endStationId;//乘客下车点
-
- public void setOrderNo(String orderNo) {
- this.orderNo = orderNo;
- }
-
- public void setPassengerPhone(String passengerPhone) {
- this.passengerPhone = passengerPhone;
- }
-
- public void setStartStationId(int startStationId) {
- this.startStationId = startStationId;
- }
-
- public void setStartStationName(String startStationName) {
- this.startStationName = startStationName;
- }
-
- public void setEndStationName(String endStationName) {
- this.endStationName = endStationName;
- }
-
- public void setEndStationId(int endStationId) {
- this.endStationId = endStationId;
- }
-
- public String getOrderNo() {
- return orderNo;
- }
-
- public String getPassengerPhone() {
- return passengerPhone;
- }
-
- public int getStartStationId() {
- return startStationId;
- }
-
- public String getStartStationName() {
- return startStationName;
- }
-
- public String getEndStationName() {
- return endStationName;
- }
-
- public int getEndStationId() {
- return endStationId;
- }
-
- @Override
- public String toString() {
- return "BusOrderBean{" +
- "orderNo=" + orderNo +
- ", passengerPhone='" + passengerPhone + '\'' +
- ", startStationId=" + startStationId +
- ", startStationName='" + startStationName + '\'' +
- ", endStationName='" + endStationName + '\'' +
- ", endStationId=" + endStationId +
- '}';
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOrdersResponse.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOrdersResponse.java
deleted file mode 100644
index 38ab2a6e4e..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperOrdersResponse.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-import java.util.List;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/19
- */
-public class SweeperOrdersResponse extends BaseData {
- public Result data;
- public static class Result{
- public List orders;
- }
-
- @Override
- public String toString() {
- return "BusOrdersResponse{" +
- "data=" + data +
- '}';
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperQueryLineStationsRequest.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperQueryLineStationsRequest.java
deleted file mode 100644
index 2289886b1a..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperQueryLineStationsRequest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 根据车机行驶线路站点信息
- */
-public class SweeperQueryLineStationsRequest {
-
- private String sn;
- private double lat;
- private double lon;
- private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus
- // 0 - 关闭、1 - 启动
-// public String status;
- public SweeperQueryLineStationsRequest(double lon, double lat, boolean markDrivingStatus) {
- this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.lat = lat;
- this.lon = lon;
- this.markDrivingStatus = markDrivingStatus;
- }
-
- public boolean isMarkDrivingStatus() {
- return markDrivingStatus;
- }
-
- public void setMarkDrivingStatus(boolean markDrivingStatus) {
- this.markDrivingStatus = markDrivingStatus;
- }
-
- public void setLat(double lat) {
- this.lat = lat;
- }
-
- public void setLon(double lon) {
- this.lon = lon;
- }
-
- public String getSn() {
- return sn;
- }
-
- public double getLat() {
- return lat;
- }
-
- public double getLon() {
- return lon;
- }
- // public BusOperationStatusRequest shutdown() {
-// status = "0";
-// return this;
-// }
-//
-// public BusOperationStatusRequest launch() {
-// status = "1";
-// return this;
-// }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperQueryLinesResponse.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperQueryLinesResponse.java
deleted file mode 100644
index e1cf271b2d..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperQueryLinesResponse.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-import java.util.List;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public class SweeperQueryLinesResponse extends BaseData {
- public List data;
-
- public static class Result {
-
- public int lineId;//线路id
- public String name;//线路名字
- public int choose; // 1:绑定 2:未被绑定
- public String startSiteName;//始发站名称
- public String endSiteName;//终点名称
-
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperResetDrivingLineRequest.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperResetDrivingLineRequest.java
deleted file mode 100644
index 718ba66504..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperResetDrivingLineRequest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/18
- */
-public class SweeperResetDrivingLineRequest {
- public String sn;
- public int lineId; //切换到的线路id
-
- public SweeperResetDrivingLineRequest(int lineId) {
- sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.lineId = lineId;
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java
index 9d58dbb4c4..e3704e1db8 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java
@@ -1,5 +1,6 @@
package com.mogo.och.sweeper.bean;
+import java.io.Serializable;
import java.util.List;
/**
@@ -7,7 +8,7 @@ import java.util.List;
*
* 订单状态更新请求数据结构
*/
-public class SweeperRoutePlanningUpdateReqBean {
+public class SweeperRoutePlanningUpdateReqBean implements Serializable {
public String sn;
public int lineId;
public int startSiteId;
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutesResponse.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutesResponse.java
deleted file mode 100644
index 6779f61b80..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutesResponse.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * 网约车小巴路线接口请求响应结果
- *
- * @author tongchenfei
- */
-public class SweeperRoutesResponse extends BaseData {
- private SweeperRoutesResult data;
-
- public SweeperRoutesResult getResult() {
- return data;
- }
-
- public void setResult(SweeperRoutesResult data) {
- this.data = data;
- }
-
- @Override
- public String toString() {
- return "BusRoutesResponse{" +
- "data=" + data +
- '}';
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutesResult.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutesResult.java
deleted file mode 100644
index 545304b948..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutesResult.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import java.util.List;
-
-/**
- * 网约车小巴路线接口返回接口数据封装
- *
- * @author tongchenfei
- */
-public class SweeperRoutesResult {
- private List sites;
- private int lineId;
- private String name;
- private int lineType; //线路类型,0:环形
- private String description;
- private int status;
-
- //线路轨迹相关字段
- public String csvFileUrl = ""; //轨迹文件下载的cos url,默认“”
- public String csvFileMd5 = ""; //轨迹文件md5,默认“”
- public String txtFileUrl = ""; //打点文件下载的cos url,默认“”
- public String txtFileMd5 = ""; //轨迹文件md5,默认“”
- public long contrailSaveTime; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
- public String carModel = ""; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题
- public String csvFileUrlDPQP = ""; //轨迹文件下载的cos url,默认“”
- public String csvFileMd5DPQP = ""; //轨迹文件md5,默认“”
- public String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“”
- public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“”
- public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
-
- public int getLineId() {
- return lineId;
- }
-
- public String getName() {
- return name;
- }
-
- public List getSites() {
- return sites;
- }
-
- public void setSite(List site) {
- this.sites = sites;
- }
-
- @Override
- public String toString() {
- return "BusRoutesResult{" +
- "sites=" + sites +
- ", lineId=" + lineId +
- ", name='" + name + '\'' +
- ", lineType=" + lineType +
- ", description='" + description + '\'' +
- ", status=" + status +
- ", csvFileUrl='" + csvFileUrl + '\'' +
- ", csvFileMd5='" + csvFileMd5 + '\'' +
- ", txtFileUrl='" + txtFileUrl + '\'' +
- ", txtFileMd5='" + txtFileMd5 + '\'' +
- ", contrailSaveTime=" + contrailSaveTime +
- ", carModel='" + carModel + '\'' +
- ", csvFileUrlDPQP='" + csvFileUrlDPQP + '\'' +
- ", csvFileMd5DPQP='" + csvFileMd5DPQP + '\'' +
- ", txtFileUrlDPQP='" + txtFileUrlDPQP + '\'' +
- ", txtFileMd5DPQP='" + txtFileMd5DPQP + '\'' +
- ", contrailSaveTimeDPQP=" + contrailSaveTimeDPQP +
- '}';
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperStationBean.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperStationBean.java
deleted file mode 100644
index ad4fef2b65..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperStationBean.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-/**
- * 单个网约车小巴车站信息
- *
- * @author tongchenfei
- */
-public class SweeperStationBean {
-// private int lineId;
-// private int siteId;
-// private String siteName;
-// private String cityCode;
-// private String areaCode;
-// private String areaName;
-// private double lat;
-// private double lon;
-// private String siteDesc;
-// private int siteState;
-// private int isCurrentSite;// @see OchBusConst 是否是当前站 1:是 2:下一站 0:普通站
-// private int siteColor;
-// private String peoples;
-// private int ifStop; // 是否需要停靠、1需要、0不需要
-
-
- private String name;
- private String description;
- private String cityCode;
- private double lon; //高精坐标
- private double lat; //高精坐标
- private int businessType; //站点类型,9:taxi,10:bus
- private double gcjLon; //高德
- private double gcjLat; //高德
- private int status;
- private int siteId;
- private int seq;
- private int drivingStatus;//行驶信息,0初始值;1已经过;2当前站;3未到站
- private int ifStop = 1; // 是否需要停靠、1需要、0不需要 // TODO: 2021/10/19 原来站点里有设计是否需要停靠字段,现设计暂无,默认都需要停靠
- private boolean leaving;
-
- public double getGcjLon() {
- return gcjLon;
- }
-
- public double getGcjLat() {
- return gcjLat;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public void setCityCode(String cityCode) {
- this.cityCode = cityCode;
- }
-
- public void setLon(double lon) {
- this.lon = lon;
- }
-
- public void setLat(double lat) {
- this.lat = lat;
- }
-
- public void setBusinessType(int businessType) {
- this.businessType = businessType;
- }
-
- public void setStatus(int status) {
- this.status = status;
- }
-
- public void setSiteId(int siteId) {
- this.siteId = siteId;
- }
-
- public void setSeq(int seq) {
- this.seq = seq;
- }
-
- public void setDrivingStatus(int drivingStatus) {
- this.drivingStatus = drivingStatus;
- }
-
- public String getName() {
- return name;
- }
-
- public String getDescription() {
- return description;
- }
-
- public String getCityCode() {
- return cityCode;
- }
-
-
- public int getBusinessType() {
- return businessType;
- }
-
- public int getStatus() {
- return status;
- }
-
- public int getSiteId() {
- return siteId;
- }
-
- public int getSeq() {
- return seq;
- }
-
- public int getDrivingStatus() {
- return drivingStatus;
- }
-
- public double getLon() {
- return lon;
- }
-
- public double getLat() {
- return lat;
- }
-
- public void setIfStop(int ifStop) {
- this.ifStop = ifStop;
- }
-
- public int getIfStop() {
- return ifStop;
- }
-
- public void setLeaving(boolean leaving) {
- this.leaving = leaving;
- }
-
- public boolean isLeaving() {
- return leaving;
- }
-
- @Override
- public String toString() {
- return "BusStationBean{" +
- "name='" + name + '\'' +
- ", description='" + description + '\'' +
- ", cityCode='" + cityCode + '\'' +
- ", lon=" + lon +
- ", lat=" + lat +
- ", businessType=" + businessType +
- ", status=" + status +
- ", siteId=" + siteId +
- ", seq=" + seq +
- ", drivingStatus=" + drivingStatus +
- ", ifStop=" + ifStop +
- ", leaving=" + leaving +
- '}';
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskBean.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskBean.kt
new file mode 100644
index 0000000000..63ce688454
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskBean.kt
@@ -0,0 +1,28 @@
+package com.mogo.och.sweeper.bean
+
+/**
+ * 子任务信息
+ */
+data class SweeperSubTaskBean(
+ var taskId: Int = 0,
+ var taskName: String?,
+ var taskStartTime: Long = 0,
+ var sort: Int = 1,
+ var subList: MutableList?
+)
+
+data class SubInfo(
+ var taskId: Int = 0,
+ var taskName: String?,
+ var mileage: Int = 0,
+ var taskStatus: Int,// 状态1未执行 2执行中 3结束 4跳过
+ var taskType: Int,//1自动驾驶 2人工驾驶
+ var timeSpent: String,
+ var startSiteName: String,//起点名称
+ var startWgs84Lon: Double,//起点经度
+ var startWgs84Lat: Double,//起点纬度
+ var endSiteName: String,//终点名称
+ var endWgs84Lon: Double,//终点经度
+ var endWgs84Lat: Double,//终点纬度
+ var sort: Int = 0,
+)
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskDetailBean.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskDetailBean.java
new file mode 100644
index 0000000000..c21229a738
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperSubTaskDetailBean.java
@@ -0,0 +1,314 @@
+package com.mogo.och.sweeper.bean;
+
+public class SweeperSubTaskDetailBean {
+ private int id; //子任务id
+ private int lineId; //线路id
+ private String lineName;//线路名称
+ private int sort;
+ private int status;
+ private int startSiteId; //子任务起点id
+ private String startSiteName; //子任务起点名称
+ private double startSiteLon; //子任务起点高德经度
+ private double startSiteLat; //子任务起点高德纬度
+ private double startSiteWgs64Lon;//子任务起点高精经度
+ private double startSiteWgs64Lat;//子任务起点高精纬度
+ private int endSiteId;//子任务终点id
+ private String endSiteName;//子任务终点名称
+ private double endSiteLon; //子任务终点高德经度
+ private double endSiteLat;//子任务终点高德纬度
+ private double endSiteWgs64Lon;//子任务终点高精经度
+ private double endSiteWgs64Lat;//子任务终点高精纬度
+ private String brand; //品牌
+ private String carModel; //车辆型号
+ private String csvFileUrl = ""; //轨迹文件csv文件url地址
+ private String csvFileMd5 = ""; //轨迹文件csv md5
+ private String csvFileName = "";//轨迹文件cvs名称
+ private String txtFileUrl = ""; //轨迹文件txt url地址
+ private String txtFileMd5 = ""; //轨迹文件txt md5
+ private String txtFileName; //轨迹文件txt名称
+ private long publishTime;
+ private String contrailFileType; //轨迹文件类型
+ private String publishStatus;//发布状态 1发布 2未发布 3 发布中
+ private String csvFileUrlDPQP = ""; //轨迹文件下载的cos url,默认“”
+ private String csvFileMd5DPQP = ""; //轨迹文件md5,默认“”
+ private String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“”
+ private String txtFileMd5DPQP = ""; //轨迹文件md5,默认“”
+ private long publishTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
+ private long taskCreateTime;
+ private String brandDPQP;
+ private String carModelDPQP;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getLineId() {
+ return lineId;
+ }
+
+ public void setLineId(int lineId) {
+ this.lineId = lineId;
+ }
+
+ public String getLineName() {
+ return lineName;
+ }
+
+ public void setLineName(String lineName) {
+ this.lineName = lineName;
+ }
+
+ public int getSort() {
+ return sort;
+ }
+
+ public void setSort(int sort) {
+ this.sort = sort;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public int getStartSiteId() {
+ return startSiteId;
+ }
+
+ public void setStartSiteId(int startSiteId) {
+ this.startSiteId = startSiteId;
+ }
+
+ public String getStartSiteName() {
+ return startSiteName;
+ }
+
+ public void setStartSiteName(String startSiteName) {
+ this.startSiteName = startSiteName;
+ }
+
+ public double getStartSiteLon() {
+ return startSiteLon;
+ }
+
+ public void setStartSiteLon(double startSiteLon) {
+ this.startSiteLon = startSiteLon;
+ }
+
+ public double getStartSiteLat() {
+ return startSiteLat;
+ }
+
+ public void setStartSiteLat(double startSiteLat) {
+ this.startSiteLat = startSiteLat;
+ }
+
+ public double getStartSiteWgs64Lon() {
+ return startSiteWgs64Lon;
+ }
+
+ public void setStartSiteWgs64Lon(double startSiteWgs64Lon) {
+ this.startSiteWgs64Lon = startSiteWgs64Lon;
+ }
+
+ public double getStartSiteWgs64Lat() {
+ return startSiteWgs64Lat;
+ }
+
+ public void setStartSiteWgs64Lat(double startSiteWgs64Lat) {
+ this.startSiteWgs64Lat = startSiteWgs64Lat;
+ }
+
+ public int getEndSiteId() {
+ return endSiteId;
+ }
+
+ public void setEndSiteId(int endSiteId) {
+ this.endSiteId = endSiteId;
+ }
+
+ public String getEndSiteName() {
+ return endSiteName;
+ }
+
+ public void setEndSiteName(String endSiteName) {
+ this.endSiteName = endSiteName;
+ }
+
+ public double getEndSiteLon() {
+ return endSiteLon;
+ }
+
+ public void setEndSiteLon(double endSiteLon) {
+ this.endSiteLon = endSiteLon;
+ }
+
+ public double getEndSiteLat() {
+ return endSiteLat;
+ }
+
+ public void setEndSiteLat(double endSiteLat) {
+ this.endSiteLat = endSiteLat;
+ }
+
+ public double getEndSiteWgs64Lon() {
+ return endSiteWgs64Lon;
+ }
+
+ public void setEndSiteWgs64Lon(double endSiteWgs64Lon) {
+ this.endSiteWgs64Lon = endSiteWgs64Lon;
+ }
+
+ public double getEndSiteWgs64Lat() {
+ return endSiteWgs64Lat;
+ }
+
+ public void setEndSiteWgs64Lat(double endSiteWgs64Lat) {
+ this.endSiteWgs64Lat = endSiteWgs64Lat;
+ }
+
+ public long getTaskCreateTime() {
+ return taskCreateTime;
+ }
+
+ public void setTaskCreateTime(long taskCreateTime) {
+ this.taskCreateTime = taskCreateTime;
+ }
+
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public String getCarModel() {
+ return carModel;
+ }
+
+ public void setCarModel(String carModel) {
+ this.carModel = carModel;
+ }
+
+ public String getCsvFileUrl() {
+ return csvFileUrl;
+ }
+
+ public void setCsvFileUrl(String csvFileUrl) {
+ this.csvFileUrl = csvFileUrl;
+ }
+
+ public String getCsvFileMd5() {
+ return csvFileMd5;
+ }
+
+ public void setCsvFileMd5(String csvFileMd5) {
+ this.csvFileMd5 = csvFileMd5;
+ }
+
+ public String getCsvFileName() {
+ return csvFileName;
+ }
+
+ public void setCsvFileName(String csvFileName) {
+ this.csvFileName = csvFileName;
+ }
+
+ public String getTxtFileUrl() {
+ return txtFileUrl;
+ }
+
+ public void setTxtFileUrl(String txtFileUrl) {
+ this.txtFileUrl = txtFileUrl;
+ }
+
+ public String getTxtFileMd5() {
+ return txtFileMd5;
+ }
+
+ public void setTxtFileMd5(String txtFileMd5) {
+ this.txtFileMd5 = txtFileMd5;
+ }
+
+ public String getTxtFileName() {
+ return txtFileName;
+ }
+
+ public void setTxtFileName(String txtFileName) {
+ this.txtFileName = txtFileName;
+ }
+
+ public long getPublishTime() {
+ return publishTime;
+ }
+
+ public void setPublishTime(long publishTime) {
+ this.publishTime = publishTime;
+ }
+
+ public String getBrandDPQP() {
+ return brandDPQP;
+ }
+
+ public void setBrandDPQP(String brandDPQP) {
+ this.brandDPQP = brandDPQP;
+ }
+
+ public String getCarModelDPQP() {
+ return carModelDPQP;
+ }
+
+ public void setCarModelDPQP(String carModelDPQP) {
+ this.carModelDPQP = carModelDPQP;
+ }
+
+ public String getCsvFileUrlDPQP() {
+ return csvFileUrlDPQP;
+ }
+
+ public void setCsvFileUrlDPQP(String csvFileUrlDPQP) {
+ this.csvFileUrlDPQP = csvFileUrlDPQP;
+ }
+
+ public String getCsvFileMd5DPQP() {
+ return csvFileMd5DPQP;
+ }
+
+ public void setCsvFileMd5DPQP(String csvFileMd5DPQP) {
+ this.csvFileMd5DPQP = csvFileMd5DPQP;
+ }
+
+ public String getTxtFileUrlDPQP() {
+ return txtFileUrlDPQP;
+ }
+
+ public void setTxtFileUrlDPQP(String txtFileUrlDPQP) {
+ this.txtFileUrlDPQP = txtFileUrlDPQP;
+ }
+
+ public String getTxtFileMd5DPQP() {
+ return txtFileMd5DPQP;
+ }
+
+ public void setTxtFileMd5DPQP(String txtFileMd5DPQP) {
+ this.txtFileMd5DPQP = txtFileMd5DPQP;
+ }
+
+ public long getPublishTimeDPQP() {
+ return publishTimeDPQP;
+ }
+
+ public void setPublishTimeDPQP(long publishTimeDPQP) {
+ this.publishTimeDPQP = publishTimeDPQP;
+ }
+
+
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperUpdateSiteStatusRequest.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperUpdateSiteStatusRequest.java
deleted file mode 100644
index 422d5113fa..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperUpdateSiteStatusRequest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.mogo.och.sweeper.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 小巴车运营状态请求参数
- */
-public class SweeperUpdateSiteStatusRequest {
-
- public String sn;
- public int seq;//站点序号
- public int siteId;//站点id
- public double lon;
- public double lat;
-
- public SweeperUpdateSiteStatusRequest(int seq, int siteId, double lon, double lat) {
- this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.seq = seq;
- this.siteId = siteId;
- this.lon = lon;
- this.lat = lat;
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICarOperationStatusCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICarOperationStatusCallback.java
deleted file mode 100644
index cdd2a06f24..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICarOperationStatusCallback.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.mogo.och.sweeper.callback;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/22
- */
-public interface ICarOperationStatusCallback {
- void changeOperationStatus(boolean changeStatus);
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICleaningModeStateCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICleaningModeStateCallback.java
new file mode 100644
index 0000000000..df0ed8bc1d
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ICleaningModeStateCallback.java
@@ -0,0 +1,12 @@
+package com.mogo.och.sweeper.callback;
+
+import com.mogo.och.sweeper.constant.OperateStateEnum;
+
+import chassis.ChassisStatesOuterClass;
+
+/**
+ * 上装状态回调
+ */
+public interface ICleaningModeStateCallback {
+ void cleaningModeState(OperateStateEnum cleaningModeState, ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState,boolean isSelectPureSweepMode);
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IRefreshSweeperStationsCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IRefreshSweeperStationsCallback.java
deleted file mode 100644
index f6fd3ae0ab..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IRefreshSweeperStationsCallback.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.mogo.och.sweeper.callback;
-
-import com.mogo.och.sweeper.bean.SweeperStationBean;
-
-import java.util.List;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/22
- */
-public interface IRefreshSweeperStationsCallback {
- void refreshBusStations(String lineName, List stationList, int currentStation, int nextStation, boolean isArrived);
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISlidePannelHideCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISlidePannelHideCallback.java
deleted file mode 100644
index 246ccd2118..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISlidePannelHideCallback.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.mogo.och.sweeper.callback;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/22
- */
-public interface ISlidePannelHideCallback {
- void hideSlidePanel();
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperADASStatusCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperADASStatusCallback.java
new file mode 100644
index 0000000000..995e1723af
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperADASStatusCallback.java
@@ -0,0 +1,11 @@
+package com.mogo.och.sweeper.callback;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等)
+ */
+public interface ISweeperADASStatusCallback {
+ //自驾返回失败
+ void onStartAdasFailure();
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperLinesCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperLinesCallback.java
deleted file mode 100644
index 74e166b736..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperLinesCallback.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.mogo.och.sweeper.callback;
-
-import com.mogo.och.sweeper.bean.SweeperQueryLinesResponse;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public interface ISweeperLinesCallback {
- void onBusLinesChange(SweeperQueryLinesResponse lines);
- void onChangeLineIdSuccess();
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt
new file mode 100644
index 0000000000..182d0b9c4f
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt
@@ -0,0 +1,46 @@
+package com.mogo.och.sweeper.callback
+
+import com.mogo.och.sweeper.bean.SweeperMainTaskBean
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean
+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 java.util.ArrayList
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+interface ISweeperTaskCallback {
+ /**
+ * 获取主任务列表
+ */
+ fun setMainTaskList(mainTaskBeanList: MutableList?,refresh:Boolean)
+
+ /**
+ * 获取子任务列表
+ */
+ fun setSubTaskBean(subTaskBean: SweeperSubTaskBean,isWorkingSubTask:Boolean)
+
+ /**
+ * 更新子任务状态
+ */
+ fun updateSubTaskStatus(typeEnum: TaskStatusEnum, isLastSubTask: Boolean)
+
+ /**
+ * 主任务重置
+ */
+ fun setMainTaskReset(isSuccess: Boolean)
+
+ /**
+ * 获取子任务详情包括轨迹信息
+ */
+ fun setSubTakDetail(subTaskDetailBean: SweeperSubTaskDetailBean,subTaskTypeEnum: SubTaskTypeEnum)
+
+ /**
+ * 设置轨迹坐标点集合
+ */
+ fun setRouteList(routeList: ArrayList)
+
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskDataToFragmentCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskDataToFragmentCallback.kt
new file mode 100644
index 0000000000..2677042385
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskDataToFragmentCallback.kt
@@ -0,0 +1,15 @@
+package com.mogo.och.sweeper.callback
+
+import com.amap.api.maps.model.LatLng
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean
+import com.mogo.och.sweeper.database.bean.WeltDataBean
+import java.util.ArrayList
+
+interface ISweeperTaskDataToFragmentCallback {
+ fun setRouteList(routeList: ArrayList)
+ fun setWeltData(weltDatas: ArrayList?, distance: String)
+ fun clearAllMarkerAndPolyline()
+ fun setProgress(progress:String)
+ fun setTaskListCoordinatesLatLng(coordinatesLatLng: ArrayList)
+ fun setCurrentTaskCoordinatesLatLng(coordinatesLatLng: LatLng)
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskRouteCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskRouteCallback.kt
new file mode 100644
index 0000000000..5711c8e6ab
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskRouteCallback.kt
@@ -0,0 +1,8 @@
+package com.mogo.och.sweeper.callback
+
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean
+import java.util.ArrayList
+
+interface ISweeperTaskRouteCallback {
+ fun setRouteList(routeList:ArrayList)
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IWeltMapSwitchToSmallCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IWeltMapSwitchToSmallCallback.kt
new file mode 100644
index 0000000000..1b3e66bfe7
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/IWeltMapSwitchToSmallCallback.kt
@@ -0,0 +1,5 @@
+package com.mogo.och.sweeper.callback
+
+interface IWeltMapSwitchToSmallCallback {
+ fun onWeltMapSwitchToSmall()
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/OperateStateEnum.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/OperateStateEnum.kt
new file mode 100644
index 0000000000..fcb68755ba
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/OperateStateEnum.kt
@@ -0,0 +1,12 @@
+package com.mogo.och.sweeper.constant
+
+/**
+ * 上装面板操作状态
+ */
+enum class OperateStateEnum(val code: Int) {
+ SYNCING_STATUS( 1),//清扫车底盘状态同步中
+ STARTING_STATUS( 2),//上装中
+ FAIL_STATUS( 3),//上装失败
+ SUCCESS_STATUS(4),//上装成功
+ NO_STATUS(-1);//暂无模式
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SubTaskTypeEnum.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SubTaskTypeEnum.kt
new file mode 100644
index 0000000000..9946b8b2ef
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SubTaskTypeEnum.kt
@@ -0,0 +1,9 @@
+package com.mogo.och.sweeper.constant
+
+/**
+ * 任务类型
+ */
+enum class SubTaskTypeEnum(val code: Int) {
+ AUTOPILOT_SUBTYPE(1),//自动驾驶子任务
+ MANUAL_DRIVING_SUBTYPE(2),//人工驾驶
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt
index bd7be321eb..66b5ee3f23 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/SweeperConst.kt
@@ -13,34 +13,30 @@ class SweeperConst {
// 测试用的广播
const val BROADCAST_TEST_SWEEPER_CONTROL_TYPE_EXTRA_KEY = "sceneType"
- // 无状态
- const val STATION_STATUS_IDLE = 0
- // 已过站(历史站)
- const val STATION_STATUS_LEAVING = 1
- // 到站(当前站)
- const val STATION_STATUS_STOPPED = 2
- // 未到站(未到站)
- const val STATION_STATUS_ARRIVING = 3
// 上报心跳轮询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"
@@ -49,9 +45,15 @@ class SweeperConst {
const val EVENT_PARAM_END_NAME = "end_name"
const val EVENT_PARAM_LINE_ID = "line_id"
const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false
+ const val EVENT_PARAM_START_FAILURE_CODE = "start_autopilot_failure_code" // 启动自驾失败code
+ 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";
+
/**
* 订单起终点Marker类型
*/
@@ -61,5 +63,8 @@ class SweeperConst {
//围栏到站 暂定10米
const val ARRIVE_AT_END_STATION_DISTANCE = 10
+
+ //非贴边
+ const val NONWELT = -10000.0
}
}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/TaskStatusEnum.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/TaskStatusEnum.kt
new file mode 100644
index 0000000000..5d9fd9839a
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/constant/TaskStatusEnum.kt
@@ -0,0 +1,12 @@
+package com.mogo.och.sweeper.constant
+
+/**
+ * 当前任务操作菜单
+ */
+enum class TaskStatusEnum(val code: Int) {
+ JUMP_OVER_SUBTASK( 1),//跳过子任务
+ END_TASK( 2),//结束主任务
+ CANCEL_TASK( 3),//取消
+ START_SUBTASK(4),//开始子任务
+ END_SUBTASK(5),//结束子任务
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/MyDataBase.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/MyDataBase.java
new file mode 100644
index 0000000000..69b363a9b8
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/MyDataBase.java
@@ -0,0 +1,29 @@
+package com.mogo.och.sweeper.database;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.och.sweeper.database.bean.WeltDataBean;
+import com.mogo.och.sweeper.database.dao.WeltDataDao;
+
+import androidx.room.Database;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
+
+//注解Database告诉系统这是Room数据库对象
+//entities指定该数据库有哪些表,多张表就逗号分隔
+//version指定数据库版本号,升级时需要用到
+//数据库继承自RoomDatabase
+@Database(entities = {WeltDataBean.class}, version = 1)
+public abstract class MyDataBase extends RoomDatabase {
+ private static final String DATABASE_NAME = "weltData_db";
+
+ //结合单例模式完成数据库实例创建
+ public static MyDataBase getInstance() {
+ return SingleTon.instance;
+ }
+
+ private static class SingleTon {
+ private static final MyDataBase instance =
+ Room.databaseBuilder(AbsMogoApplication.getApp().getApplicationContext(), MyDataBase.class, DATABASE_NAME).build();
+ }
+ public abstract WeltDataDao getWeltDataDao();
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/bean/WeltDataBean.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/bean/WeltDataBean.java
new file mode 100644
index 0000000000..cee66c7e53
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/bean/WeltDataBean.java
@@ -0,0 +1,127 @@
+package com.mogo.och.sweeper.database.bean;
+
+import java.io.Serializable;
+
+import androidx.room.ColumnInfo;
+import androidx.room.Entity;
+import androidx.room.Index;
+import androidx.room.PrimaryKey;
+
+@Entity(tableName = WeltDataBean.WeltDataTable, indices = {@Index(value = "id", unique = true)})
+public class WeltDataBean implements Serializable {
+
+ public static final String WeltDataTable = "welt_data_table";
+ //ColumnInfo用于指定该字段存储在表中的名字,并指定类型
+
+ @PrimaryKey(autoGenerate = true)
+
+ @ColumnInfo(name = "id", typeAffinity = ColumnInfo.INTEGER)
+
+ private int id;
+
+ @ColumnInfo(name = "subTaskId", typeAffinity = ColumnInfo.INTEGER)//子任务id
+
+ private int subTaskId;
+
+ @ColumnInfo(name = "locLon", typeAffinity = ColumnInfo.REAL)
+
+ private double locLon;//自车RTK定位经度
+
+ @ColumnInfo(name = "locLat", typeAffinity = ColumnInfo.REAL)
+
+ private double locLat;//自车RTK定位纬度
+
+ @ColumnInfo(name = "weltDistance", typeAffinity = ColumnInfo.REAL)
+
+ private double weltDistance;//贴边距离
+
+ @ColumnInfo(name = "cleanMode", typeAffinity = ColumnInfo.INTEGER)
+
+ private int cleanMode;//清扫作业模式 1–纯扫 2--洗扫, 3--纯洗, 4--纯吸
+
+ @ColumnInfo(name = "cleanDirection", typeAffinity = ColumnInfo.INTEGER)
+
+ private int cleanDirection;//清扫方向 1--两侧, 2--左侧, 3--右侧
+
+ @ColumnInfo(name = "cleanIntensity", typeAffinity = ColumnInfo.INTEGER)
+
+ private int cleanIntensity;//清扫强度 1--两侧, 2--左侧, 3--右侧
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getSubTaskId() {
+ return subTaskId;
+ }
+
+ public void setSubTaskId(int subTaskId) {
+ this.subTaskId = subTaskId;
+ }
+
+ public double getLocLon() {
+ return locLon;
+ }
+
+ public void setLocLon(double locLon) {
+ this.locLon = locLon;
+ }
+
+ public double getLocLat() {
+ return locLat;
+ }
+
+ public void setLocLat(double locLat) {
+ this.locLat = locLat;
+ }
+
+ public double getWeltDistance() {
+ return weltDistance;
+ }
+
+ public void setWeltDistance(double weltDistance) {
+ this.weltDistance = weltDistance;
+ }
+
+ public int getCleanMode() {
+ return cleanMode;
+ }
+
+ public void setCleanMode(int cleanMode) {
+ this.cleanMode = cleanMode;
+ }
+
+ public int getCleanDirection() {
+ return cleanDirection;
+ }
+
+ public void setCleanDirection(int cleanDirection) {
+ this.cleanDirection = cleanDirection;
+ }
+
+ public int getCleanIntensity() {
+ return cleanIntensity;
+ }
+
+ public void setCleanIntensity(int cleanIntensity) {
+ this.cleanIntensity = cleanIntensity;
+ }
+
+ @Override
+ public String toString() {
+ return "WeltDataBean{" +
+ "id=" + id +
+ ", subTaskId='" + subTaskId + '\'' +
+ ", locLon=" + locLon +
+ ", locLat=" + locLat +
+ ", weltDistance=" + weltDistance +
+ ", cleanMode=" + cleanMode +
+ ", cleanDirection=" + cleanDirection +
+ ", cleanIntensity=" + cleanIntensity +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/dao/WeltDataDao.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/dao/WeltDataDao.java
new file mode 100644
index 0000000000..7647d29a08
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/dao/WeltDataDao.java
@@ -0,0 +1,28 @@
+package com.mogo.och.sweeper.database.dao;
+
+import com.mogo.och.sweeper.database.bean.WeltDataBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.room.Dao;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+
+import static com.mogo.och.sweeper.database.bean.WeltDataBean.WeltDataTable;
+
+@Dao
+public interface WeltDataDao {
+ //插入数据
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ void insert(WeltDataBean fileInfo);
+
+ //删除所有数据
+ @Query("DELETE FROM " + WeltDataTable)
+ int deleteAllWeltData();
+
+ //查询所有数据
+ @Query("SELECT * FROM " + WeltDataTable)
+ List loadAllWeltDataInfo();
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/event/WeltDataEvent.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/event/WeltDataEvent.java
new file mode 100644
index 0000000000..f294bae32a
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/event/WeltDataEvent.java
@@ -0,0 +1,58 @@
+package com.mogo.och.sweeper.event;
+
+import com.amap.api.maps.model.LatLng;
+import com.mogo.och.sweeper.database.bean.WeltDataBean;
+
+import java.util.ArrayList;
+
+public class WeltDataEvent{
+ private int type; //1.添加起点和终点 2.实时添加贴边数据 3.清除数据 4.任务进度 5:任务轨迹数据
+ private ArrayList weltDataBeanList;
+ private ArrayList markers;
+ private String distance;//贴边数据
+ private String progress;//任务进度
+
+ public WeltDataEvent(int type) {
+ this.type = type;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ public ArrayList getWeltDataBeanList() {
+ return weltDataBeanList;
+ }
+
+ public void setWeltDataBeanList(ArrayList weltDataBeanList) {
+ this.weltDataBeanList = weltDataBeanList;
+ }
+
+ public ArrayList getMarkers() {
+ return markers;
+ }
+
+ public void setMarkers(ArrayList markers) {
+ this.markers = markers;
+ }
+
+ public String getDistance() {
+ return distance;
+ }
+
+ public void setDistance(String distance) {
+ this.distance = distance;
+ }
+
+ public String getProgress() {
+ return progress;
+ }
+
+ public void setProgress(String progress) {
+ this.progress = progress;
+ }
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java
index 1abc7afcad..274f62d862 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java
@@ -1,58 +1,53 @@
package com.mogo.och.sweeper.fragment;
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-import static com.mogo.och.sweeper.constant.SweeperConst.TIMER_START_AUTOPILOT_INTERVAL;
-
-import android.animation.ObjectAnimator;
-import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
-import android.view.animation.LinearInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.constraintlayout.widget.Group;
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.navi.model.NaviLatLng;
import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.mvp.IView;
import com.mogo.commons.mvp.MvpFragment;
import com.mogo.commons.mvp.Presenter;
-import com.mogo.eagle.core.data.constants.DataTypes;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
-import com.mogo.eagle.core.function.smp.view.SmallMapView;
+import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView;
+import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView;
+import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView;
import com.mogo.eagle.core.function.view.MapBizView;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener;
+import com.mogo.eagle.core.utilcode.util.ThreadUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.map.listener.IMogoMapListener;
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.bean.SweeperRoutesResult;
-import com.mogo.och.sweeper.constant.SweeperConst;
-import com.mogo.och.sweeper.model.SweeperOrderModel;
-import com.mogo.och.sweeper.util.BDRouteDataTestUtils;
-import com.mogo.och.sweeper.view.SlidePanelView;
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean;
+import com.mogo.och.sweeper.callback.ISweeperTaskDataToFragmentCallback;
+import com.mogo.och.sweeper.callback.IWeltMapSwitchToSmallCallback;
+import com.mogo.och.sweeper.database.bean.WeltDataBean;
import com.mogo.och.sweeper.view.SweeperTrafficDataView;
+import com.mogo.och.sweeper.view.WeltSmallMapView;
-import bag_manager.BagManagerOuterClass;
-import mogo.telematics.pad.MessagePad;
-import record_cache.RecordPanelOuterClass;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.Group;
+import androidx.fragment.app.FragmentTransaction;
/**
* 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
@@ -61,47 +56,47 @@ import record_cache.RecordPanelOuterClass;
*
* @author tongchenfei
*/
-public abstract class BaseSweeperTabFragment> extends MvpFragment implements IMogoMapListener, IMoGoAutopilotRecordListener {
+public abstract class BaseSweeperTabFragment> extends MvpFragment implements IMogoMapListener,
+ View.OnClickListener, IWeltMapSwitchToSmallCallback, View.OnTouchListener {
private static final String TAG = "BaseSweeperTabFragment";
-
- protected SlidePanelView slidePanelView;
- private RelativeLayout ctvAutopilotStatus;
- private ImageView ctvAutopilotStatusIv;
- private TextView ctvAutopilotStatusTv;
- protected TextView tvOperationStatus;
- protected RelativeLayout mSettingBtn;
- protected RelativeLayout mBadcaseBtn;
- protected RelativeLayout mAICollectBtn;
- public boolean isOperationStatus;//false-收车,true-出车
- private FrameLayout flStationPanelContainer;
+ //地图放大缩小
+ private ImageView mSwitchMapModeImage;
+ //设置信息面板
+ protected ImageView mSettingBtn;
+ //安全员问题上报面板
+ protected ImageView mCardBtn;
+ //道路状况上报面板
+ protected ImageView mAICollectBtn;
+ //任务列表面板
+ private FrameLayout flTaskListPanelContainer;
private MapBizView mapBizView;
private Group groupTestPanel;
- private FrameLayout flSpeed;
- // private BusArcView mouduleArc;
+ //清扫车车辆基本信息 速度 档位 转向灯 红绿灯等
private SweeperTrafficDataView mTrafficDataView;
- private ImageView mUpgradeTipIv;
- // private BusTrafficLightView mTrafficLightView;
-
- //远景和中景的切换
- private ImageView mSwitchMapModeImage;
- private LinearLayout mSwitchMapModeLayout;
-
- private SmallMapView smallMapView;
-
- private ObjectAnimator autopilotLoadingAnimator;
-
- public boolean isAnimateRunning = false;
-
- /**
- * 滑动按钮触发的事件
- */
- private final SlidePanelView.OnSlidePanelMoveToEndListener onSlideToEndListener = () -> {
- // 此处做一个代理,处理一下共有情况
- if (getSlidePanelOnEndListener() != null) {
- getSlidePanelOnEndListener().moveToEnd();
- }
- };
+ //人工驾驶地图View组控制
+ private Group mGroupNaviPanel;
+ //人工驾驶地图Fragment
+ private SweeperAmapNaviFragment mOchAmapNaviFragment;
+ //关闭人工驾驶小地图
+ private ImageView mCloseNavIcon;
+ //刷新人工驾驶地图按钮
+ private ImageView mRefreshNavi;
+ //作业任务贴边数据展示图
+ private WeltSmallMapView mMapWeltView;
+ //任务作业全览图
+ private WeltMapOverViewFragment mWeltMapOverViewFragment;
+ private FrameLayout mFlWeltMapOverView;
+ private DriverMsgBoxButtonView mViewDriverMsgBoxButton;
+ private DriverMsgBoxListView mViewDriverMsgBoxList;
+ private DriverMsgBoxBubbleView mViewDriverMsgBoxBubble;
+ private ArrayList mWeltDataBeanList;//存储贴边数据
+ private ArrayList mSubTaskCoordinates;//存储当前大任务的所有子任务起点和终点
+ // 当前子任务的终点坐标
+ protected LatLng mCurrentTaskEndStation;
+ private ArrayList mRouteList;//存储任务的坐标轨迹
+ private String mProgress;
+ private ISweeperTaskDataToFragmentCallback mTaskDataToFragmentCallback;
@Override
protected int getLayoutId() {
@@ -110,75 +105,32 @@ public abstract class BaseSweeperTabFragment {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "长按显示状态工具栏");
- Intent intent = new Intent();
- intent.putExtra("oper", 52);
- return true;
- });
- }
+ mSettingBtn = findViewById(R.id.sweeper_setting_model_icon);
+ mCardBtn = findViewById(R.id.sweeper_card_model_icon);
+ mAICollectBtn = findViewById(R.id.sweeper_collect_model_icon);
+ mCloseNavIcon = findViewById(R.id.sweeper_close_navi_icon);
+ mRefreshNavi = findViewById(R.id.sweeper_refresh_navi);
+ mMapWeltView = findViewById(R.id.sweeper_task_welt_small_map);
+ mFlWeltMapOverView = findViewById(R.id.sweeper_welt_map_overview);
initListener();
- ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() {
-
- @Override
- public void onClickImpl(View v) {
-// if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){
- restartAutopilot();
-// }else {
-// ToastUtils.showShort(getResources().getString(R.string.sweeper_auto_disable_tip));
-// }
- }
- });
-
- setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+ //设置消息盒子
+ setMessageBox();
+ //设置左下角四个按钮监听事件
+ setBottomBtnListener();
// 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
@@ -193,76 +145,87 @@ public abstract class BaseSweeperTabFragment
debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
);
-
- // 模拟 自动驾驶网约车回调数据
- findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
- debugArrivedStation()
+ // 模拟 结束子任务
+ findViewById(R.id.btnEndTask).setOnClickListener(view ->
+ debugEndSubTask()
);
-
- findViewById(R.id.btnAutopilotRoute).setOnClickListener(view -> debugArrivedRoute());
-
- tvOperationStatus.setOnClickListener(view -> {
- onChangeOperationStatus();
+ mTrafficDataView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ debugTestBar();
+ return false;
+ }
});
-
- mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout);
- mSettingBtn.setOnClickListener(v -> {
- // TODO: 2021/12/9
- CallerHmiManager.INSTANCE.showToolsView();
- });
-
- // mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
- mBadcaseBtn = findViewById(R.id.module_mogo_och_badcase_rl);
-// CallerHmiManager.INSTANCE.registerBadCaseCallback(
-// () -> { // onShow()
-// return mBadcaseBtn; },
-// () -> { // onHide()
-// return null; });
-
- if (mBadcaseBtn != null) {
- CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn);
- CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this);
- }
-
- mAICollectBtn = findViewById(R.id.module_mogo_och_ai_collet_rl);
- if (mAICollectBtn != null) {
- CallerDevaToolsManager.INSTANCE.initAiCollect(mAICollectBtn);
- }
-
- smallMapView = findViewById(R.id.smallMapView);
}
private void updateSwitchMapIcon() {
IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
if (controller != null) {
if (controller.getCurrentMapVisualAngle().isLongSight()) {
- mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_long);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_big_selector);
} else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
- mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_medium);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_small_selector);
} else {
- mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_medium);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_small_selector);
}
}
}
+ /**
+ * 设置任务进度
+ *
+ * @param progress
+ */
+ protected void setTaskProgress(String progress) {
+ ThreadUtils.runOnUiThread(() -> {
+ mMapWeltView.setTaskProgress(progress);
+ mProgress = progress;
+ if (mTaskDataToFragmentCallback != null) {
+ mTaskDataToFragmentCallback.setProgress(progress);
+ }
+ });
+ }
+
@Override
protected void initViews(Bundle savedInstanceState) {
super.initViews(savedInstanceState);
mapBizView.onCreate(savedInstanceState);
- smallMapView.onCreateView(savedInstanceState);
+ mMapWeltView.onCreateView(savedInstanceState);
+ }
+
+ /**
+ * 消息盒子
+ */
+ private void setMessageBox() {
+ mViewDriverMsgBoxButton = findViewById(R.id.viewDriverMsgBoxButton);
+ mViewDriverMsgBoxList = findViewById(R.id.viewDriverMsgBoxList);
+ mViewDriverMsgBoxBubble = findViewById(R.id.viewDriverMsgBoxBubble);
+ //消息盒子
+ mViewDriverMsgBoxButton.setClickListener(show -> {
+ if (show) {
+ mViewDriverMsgBoxList.setVisibility(View.VISIBLE);
+ mViewDriverMsgBoxList.notifyData();
+ mViewDriverMsgBoxBubble.setVisibility(View.GONE);
+ mViewDriverMsgBoxBubble.isShowData(false);
+ } else {
+ mViewDriverMsgBoxList.setVisibility(View.GONE);
+ mViewDriverMsgBoxBubble.setVisibility(View.VISIBLE);
+ mViewDriverMsgBoxBubble.isShowData(true);
+ }
+ });
}
@Override
public void onPause() {
super.onPause();
- smallMapView.onPause();
+ mMapWeltView.onPause();
}
@Override
public void onResume() {
super.onResume();
mapBizView.onResume();
- smallMapView.onResume();
+ mMapWeltView.onResume();
}
@Override
@@ -277,10 +240,6 @@ public abstract class BaseSweeperTabFragment {
- slidePanelView.setText(text);
- slidePanelView.setVisibility(View.VISIBLE);
- });
- }
- }
-
- /**
- * 隐藏滑动按钮
- */
- public void hideSlidePanel() {
- getActivity().runOnUiThread(() -> {
- slidePanelView.setVisibility(View.GONE);
+ mCloseNavIcon.setOnClickListener(this);
+ mRefreshNavi.setOnClickListener(this);
+ mMapWeltView.getSwitchToBig().setOnClickListener((v) -> {
+ showOrHideOverMapViewFragment(true);
});
}
/**
- * 改变自动驾驶状态
- *
- * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
- */
- public void onAutopilotStatusChanged(int autopilotStatus) {
- getActivity().runOnUiThread(() -> {
- changeAutopilotBtnView(autopilotStatus, isAnimateRunning);
- });
- }
-
- public void setAutopilotBtnStatus(int autopilotStatus) {
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
- == autopilotStatus) {//0不可用
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweeper_autopilot_text_color_disable));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweeper_loading_autopilot_runnig_tv));
- ctvAutopilotStatusIv.setImageResource(R.drawable.sweeper_disable_autopilot_icon);
- ctvAutopilotStatus.setSelected(false);
- ctvAutopilotStatus.setFocusableInTouchMode(true);
-
- } else {
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweeper_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweeper_loading_autopilot_runnig_tv));
- ctvAutopilotStatusIv.setImageResource(R.drawable.sweeper_ic_autopilot);
- ctvAutopilotStatus.setFocusableInTouchMode(true);
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) {//1可用
- ctvAutopilotStatus.setSelected(false);
- } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus) {
- ctvAutopilotStatus.setSelected(true);
- }
- }
- }
-
- public void updateAutopilotStatus(int autopilotStatus) {
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
- == autopilotStatus) {//2 running
- ctvAutopilotStatusIv.setImageResource(R.drawable.sweeper_right_autopilot_icon);
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweeper_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweeper_loading_autopilot_success_tv));
- ctvAutopilotStatus.setSelected(false);
- ctvAutopilotStatus.setFocusableInTouchMode(false);
- } else {
- ctvAutopilotStatusIv.setImageResource(R.drawable.sweeper_wrong_autopilot_icon);
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweeper_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweeper_loading_autopilot_failure_tv));
- ctvAutopilotStatus.setFocusableInTouchMode(false);
- ctvAutopilotStatus.setSelected(false);
- }
- UiThreadHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- setAutopilotBtnStatus(autopilotStatus);
- }
- }, 1000);
- }
-
- private void changeAutopilotBtnView(int autopilotStatus, boolean isAnimateRunning) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChangeChangeAutopilotBtnView: "
- + autopilotStatus + "isAnimateRunning = " + isAnimateRunning);
- if (isAnimateRunning && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
- != autopilotStatus) {
- // 主动开启自动驾驶中,不为2(为0、1)则继续loading
- return;
- }
- if (isAnimateRunning) {
- stopAutopilotAnimation();
- updateAutopilotStatus(autopilotStatus);
- } else {
- setAutopilotBtnStatus(autopilotStatus);
- }
-
- }
-
- /**
- * 隐藏【自动驾驶】按钮
- */
- public void hideAutopilotBiz() {
- getActivity().runOnUiThread(() -> {
-// ctvAutopilotStatus.setVisibility(View.GONE);
-// slidePanelView.setVisibility(View.GONE);
- });
- }
-
- /**
- * 展示【自动驾驶】按钮
- */
- public void showAutopilotBiz() {
- getActivity().runOnUiThread(() -> {
- ctvAutopilotStatus.setVisibility(View.VISIBLE);
- });
- }
-
- public void hidPanel() {
- getActivity().runOnUiThread(() -> {
- flStationPanelContainer.setVisibility(View.GONE);
- });
- }
-
- public void showPanel() {
- getActivity().runOnUiThread(() -> {
- flStationPanelContainer.setVisibility(View.VISIBLE);
- });
- }
-
- public View getPanelView() {
- return panelView;
- }
-
- public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
- return null;
- }
-
- /**
- * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ * 清扫车任务列表面板view,在{@link #initViews()}时候添加到container中
*
* @return 站点面板view
*/
- public abstract int getStationPanelViewId();
-
- /**
- * 获取清扫车操作面板layout id
- *
- * @return
- */
- public abstract int getSweepOperatePanelViewId();
-
- /**
- * 重新开启自动驾驶
- */
- public abstract void restartAutopilot();
+ public abstract int getTaskListPanelViewId();
/**
* 模拟自动驾驶返回状态
@@ -477,54 +277,6 @@ public abstract class BaseSweeperTabFragment
- * START
+ * 底部四个按钮监听
+ * 1.地图放大缩小
+ * 2.设置面板
+ * 3.安全员问题上报面板
+ * 4.道路状况上报面板
*/
- private View busTestBar;
- private TextView lineIdTV;
- private TextView trajMd5TV;
- private TextView stopMd5TV;
- private TextView trajMd5DPQPTV;
- private TextView stopMd5DPQPTV;
-
- public void showHideTestBar() {
- if (busTestBar == null) {
- busTestBar = findViewById(R.id.module_mogo_och_sweeper_test_bar);
- lineIdTV = findViewById(R.id.sweeper_test_bar_current_line_id);
- trajMd5TV = findViewById(R.id.sweeper_test_bar_current_traj_md5);
- stopMd5TV = findViewById(R.id.sweeper_test_bar_current_stop_md5);
- trajMd5DPQPTV = findViewById(R.id.sweeper_test_bar_current_traj_md5_dpqp);
- stopMd5DPQPTV = findViewById(R.id.sweeper_test_bar_current_stop_md5_dpqp);
+ private void setBottomBtnListener() {
+ updateSwitchMapIcon();
+ mSwitchMapModeImage.setOnClickListener(new OnPreventFastClickListener() {
+ @Override
+ public void onClickImpl(View v) {
+ IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
+ IMogoMarkerManager markerManager = CallerMapUIServiceManager.INSTANCE.getMarkerManager(AbsMogoApplication.getApp());
+ if (controller != null && markerManager != null) {
+ //切换地图的远近视图
+ if (controller.getCurrentMapVisualAngle().isLongSight()) {
+ // 2.11.0去掉
+// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).visibleAllMarkers();
+ controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_small_selector);
+ } else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
+ // 2.11.0去掉
+// MogoMarkerManager.getInstance(AbsMogoApplication.getApp())
+// .inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS, BusConst.TYPE_MARKER_BUS_ORDER);
+ controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_big_selector);
+ } else {
+ // 2.11.0去掉
+// MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).visibleAllMarkers();
+ controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweeper_switch_map_big_selector);
+ }
+ }
+ }
+ });
+ mSettingBtn.setOnClickListener(v -> {
+ // TODO: 2021/12/9
+ CallerHmiManager.INSTANCE.showToolsView();
+ });
+ if (mCardBtn != null) {
+ CallerDevaToolsManager.INSTANCE.initBadCase(mCardBtn);
}
+ if (mAICollectBtn != null) {
+ CallerDevaToolsManager.INSTANCE.initAiCollect(mAICollectBtn);
+ }
+ }
- if (busTestBar.getVisibility() == View.VISIBLE) {
- busTestBar.setVisibility(View.GONE);
+
+ /**
+ * 展示人工驾驶地图导航
+ */
+ protected void showAmapNaviToStationFragment(boolean isShow) {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (isShow) {
+ mGroupNaviPanel.setVisibility(View.VISIBLE);
+ if (mOchAmapNaviFragment == null) {
+ mOchAmapNaviFragment=SweeperAmapNaviFragment.newInstance();
+ }
+ if (mOchAmapNaviFragment.isHidden()) {
+ transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .show(mOchAmapNaviFragment).commitAllowingStateLoss();
+ return;
+ }
+ if (mOchAmapNaviFragment.isAdded()) {
+ transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .show(mOchAmapNaviFragment).commitAllowingStateLoss();
+ return;
+ }
+ transaction
+ .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .add(R.id.module_mogo_och_navi_panel_container, mOchAmapNaviFragment)
+ .show(mOchAmapNaviFragment).commitAllowingStateLoss();
} else {
- SweeperRoutesResult routesResult = SweeperOrderModel.getInstance().getBusRoutesResult();
- lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId())));
- trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5));
- stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5));
- trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP));
- stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP));
- busTestBar.setVisibility(View.VISIBLE);
+ AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ if (mOchAmapNaviFragment != null) {
+ transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
+ .hide(mOchAmapNaviFragment).commitAllowingStateLoss();
+ }
+ mGroupNaviPanel.setVisibility(View.GONE);
}
}
- public void updateSweeperTestBarInfo() {
- if (busTestBar != null && busTestBar.getVisibility() == View.VISIBLE) {
- SweeperRoutesResult routesResult = SweeperOrderModel.getInstance().getBusRoutesResult();
- lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId())));
- trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5));
- stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5));
- trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP));
- stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP));
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.sweeper_close_navi_icon) {
+ showAmapNaviToStationFragment(false);
+ } else if (id == R.id.sweeper_refresh_navi) {
+ refreshNavi();
}
}
+ public abstract void refreshNavi();
+
+ /**
+ * 设置作业任务全览图隐藏或者显示
+ *
+ * @param isShow
+ */
+ public void showOrHideOverMapViewFragment(boolean isShow) {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (isShow) {
+ mFlWeltMapOverView.setVisibility(View.VISIBLE);
+ if (mWeltMapOverViewFragment == null) {
+ mWeltMapOverViewFragment = mWeltMapOverViewFragment.newInstance(
+ (IWeltMapSwitchToSmallCallback) this,
+ mCurrentTaskEndStation,
+ mWeltDataBeanList,
+ mSubTaskCoordinates,
+ mRouteList,
+ mProgress,
+ (SweeperFragment) this);
+ }
+ if (mWeltMapOverViewFragment.isHidden()) {
+ transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .show(mWeltMapOverViewFragment).commitAllowingStateLoss();
+ return;
+ }
+ if (mWeltMapOverViewFragment.isAdded()) {
+ transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .show(mWeltMapOverViewFragment).commitAllowingStateLoss();
+ return;
+ }
+ transaction
+ .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .add(R.id.sweeper_welt_map_overview, mWeltMapOverViewFragment)
+ .show(mWeltMapOverViewFragment).commitAllowingStateLoss();
+ } else {
+ mFlWeltMapOverView.setVisibility(View.GONE);
+ if (mWeltMapOverViewFragment != null) {
+ transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
+ .hide(mWeltMapOverViewFragment).commitAllowingStateLoss();
+ }
+ }
+ }
+
+ @Override
+ public void onWeltMapSwitchToSmall() {
+ showOrHideOverMapViewFragment(false);
+ }
+
+ /**
+ * 设置贴边数据到地图
+ *
+ * @param weltDataBeans
+ */
+ public void setWeltDataToMap(ArrayList weltDataBeans, Boolean isWeltData, String distance) {
+ mWeltDataBeanList = weltDataBeans;
+ ThreadUtils.getSinglePool().execute(new Runnable() {
+ @Override
+ public void run() {
+ if (mMapWeltView != null) {
+ mMapWeltView.setWeltData(weltDataBeans, isWeltData, distance);
+ }
+ if (mTaskDataToFragmentCallback != null) {
+ mTaskDataToFragmentCallback.setWeltData(weltDataBeans, distance);
+ }
+ }
+ });
+ }
+
+ public void setTaskListCoordinatesLatLng(ArrayList subTaskCoordinates) {
+ this.mSubTaskCoordinates = subTaskCoordinates;
+ if (mMapWeltView != null) {
+ mMapWeltView.setTaskListCoordinatesLatLng(subTaskCoordinates);
+ }
+ if (mTaskDataToFragmentCallback != null) {
+ mTaskDataToFragmentCallback.setTaskListCoordinatesLatLng(subTaskCoordinates);
+ }
+ }
+
+ public void setCurrentTaskEndMarker(LatLng subTaskCoordinate) {
+ if (mMapWeltView != null) {
+ mMapWeltView.setCurrentTaskCoordinatesLatLng(subTaskCoordinate);
+ }
+ if (mTaskDataToFragmentCallback != null) {
+ mTaskDataToFragmentCallback.setCurrentTaskCoordinatesLatLng(subTaskCoordinate);
+ }
+ }
+
+ /**
+ * 清除marker标记和任务路线数据
+ */
+ public void clearAllMarkerAndPolyline() {
+ if (mMapWeltView != null) {
+ mMapWeltView.clearAllMarkerAndPolyline();
+ }
+ if (mTaskDataToFragmentCallback != null) {
+ mTaskDataToFragmentCallback.clearAllMarkerAndPolyline();
+ }
+ }
+
+ /**
+ * 导航去目的地
+ */
+ 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);
+ }
+
+ /**
+ * 设置任务轨迹点数据
+ */
+ public void setTaskRouteList(ArrayList routeList) {
+ mRouteList = routeList;
+ ThreadUtils.getSinglePool().execute(new Runnable() {
+ @Override
+ public void run() {
+ mMapWeltView.setRouteList(routeList);
+ if (mTaskDataToFragmentCallback != null) {
+ mTaskDataToFragmentCallback.setRouteList(routeList);
+ }
+ }
+ });
+ }
+
+ public static String format(double value) {
+ BigDecimal bd = new BigDecimal(value);
+ bd = bd.setScale(2, RoundingMode.HALF_UP);
+ return bd.toString();
+ }
+
+ public void setTaskDataToFragmentCallback(ISweeperTaskDataToFragmentCallback mTaskDataToFragmentCallback) {
+ this.mTaskDataToFragmentCallback = mTaskDataToFragmentCallback;
+ }
+
+ /**
+ * 结束子任务
+ */
+ public void debugEndSubTask() {
+ ArrayList resultArrayList = tempData();
+ setTaskRouteList(resultArrayList);
+ UiThreadHandler.postDelayed(() -> {
+ ArrayList routeList =tempData1();
+ ArrayList weltDataBeans = new ArrayList<>();
+ ArrayList 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));
+ }
+ setTaskListCoordinatesLatLng(subTaskCoordinates);
+ setWeltDataToMap(weltDataBeans, true, format(Math.random() * 50));
+ }, 2000);
+ }
+
+ private ArrayList tempData() {
+ ArrayList 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));
+ return results;
+ }
+ private ArrayList tempData1() {
+ ArrayList results = new ArrayList<>();
+ 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){
+ SweeperRoutePlanningUpdateReqBean.Result result = new SweeperRoutePlanningUpdateReqBean.Result();
+ result.latitude = latitude;
+ result.longitude =longitude;
+ return result;
+ }
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperUIFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperUIFragment.java
new file mode 100644
index 0000000000..3ee40b9134
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperUIFragment.java
@@ -0,0 +1,50 @@
+package com.mogo.och.sweeper.fragment;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/9
+ */
+public abstract class BaseSweeperUIFragment extends Fragment {
+ private View mRootView;
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ if (mRootView == null) {
+ mRootView = inflater.inflate(getLayoutId(), container, false);
+ } else {
+ ViewGroup viewGroup = (ViewGroup) mRootView.getParent();
+ if (viewGroup != null) {
+ viewGroup.removeView(mRootView);
+ }
+ }
+ initViews(mRootView);
+ initViews(savedInstanceState);
+ return mRootView;
+ }
+ /**
+ * 布局资源
+ *
+ * @return
+ */
+ protected abstract int getLayoutId();
+
+ protected abstract void initViews(View view);
+
+ protected void initViews(Bundle savedInstanceState) {
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ mRootView = null;
+ }
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperAmapNaviFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperAmapNaviFragment.java
new file mode 100644
index 0000000000..a1460e31c7
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperAmapNaviFragment.java
@@ -0,0 +1,230 @@
+package com.mogo.och.sweeper.fragment;
+
+import android.os.Bundle;
+import android.view.View;
+
+import com.amap.api.navi.AMapNaviViewListener;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.common.module.map.AmapNaviToDestinationModel;
+import com.mogo.och.common.module.map.CommonAmapNaviVIew;
+import com.mogo.och.common.module.map.ICommonNaviChangedCallback;
+import com.mogo.och.sweeper.R;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/30
+ */
+public class SweeperAmapNaviFragment extends BaseSweeperUIFragment implements AMapNaviViewListener {
+
+ private CommonAmapNaviVIew mAMapNaviView;
+ private ICommonNaviChangedCallback mNaviToStartInfoCallback;
+ public static SweeperAmapNaviFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ SweeperAmapNaviFragment fragment = new SweeperAmapNaviFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.sweeper_amap_navi_view;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ mAMapNaviView = view.findViewById(R.id.navi_view);
+ }
+
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ if (mAMapNaviView != null)
+ mAMapNaviView.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mAMapNaviView != null)
+ mAMapNaviView.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (mAMapNaviView != null)
+ mAMapNaviView.onPause();
+ }
+
+ @Override
+ public void onHiddenChanged(boolean hidden) {
+ super.onHiddenChanged(hidden);
+ if (hidden) { //不在最前端界面显示
+ if (mAMapNaviView != null){
+ mAMapNaviView.onPause();
+ }
+ } else { //重新显示到最前端
+ if (mAMapNaviView != null){
+ mAMapNaviView.onResume();
+ }
+ }
+ }
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+ AmapNaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(false);
+ if (mAMapNaviView != null){
+ mAMapNaviView.onDestroy();
+ }
+
+ if (mNaviToStartInfoCallback != null){
+ mNaviToStartInfoCallback = null;
+ }
+ }
+
+ @Override
+ public void onNaviSetting() {
+ //底部导航设置点击回调
+ }
+
+ @Override
+ public void onNaviCancel() {
+ }
+
+ @Override
+ public void onNaviMapMode(int naviMode) {
+ //导航态车头模式,0:车头朝上状态;1:正北朝上模式。
+ }
+
+ @Override
+ public void onNaviTurnClick() {
+ //转弯view的点击回调
+ }
+
+ @Override
+ public void onNextRoadClick() {
+ //下一个道路View点击回调
+ }
+
+
+ @Override
+ public void onScanViewButtonClick() {
+ //全览按钮点击回调
+ }
+
+
+ @Override
+ public void onLockMap(boolean isLock) {
+ //锁地图状态发生变化时回调
+ }
+
+ @Override
+ public void onNaviViewLoaded() {
+ CallerLogger.INSTANCE.d(M_TAXI + "wlx", "导航页面加载成功");
+ CallerLogger.INSTANCE.d(M_TAXI + "wlx", "请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑");
+ }
+
+ @Override
+ public void onMapTypeChanged(int i) {
+
+ }
+
+ @Override
+ public void onNaviViewShowMode(int i) {
+
+ }
+
+ @Override
+ public boolean onNaviBackClick() {
+ return false;
+ }
+
+ /**
+ * 车道信息说明:
+ *
+ * 0xFF, 无对应车道
+ * 0, 直行
+ * 1, 左转
+ * 2, 直行+左转
+ * 3, 右转
+ * 4, 直行+右转
+ * 5, 左掉头
+ * 6, 左转+右转
+ * 7, 直行+左转+右转
+ * 8, 右掉头
+ * 9, 直行+左掉头
+ * 10, 直行+右掉头
+ * 11, 左转+左掉头
+ * 12, 右转+右掉头
+ * 13, 直行+扩展
+ * 14, 左转+左掉头+扩展
+ * 15, 保留
+ * 16, 直行+左转+左掉头
+ * 17, 右转+左掉头
+ * 18, 左转+右转+左掉头
+ * 19, 直行+右转+左掉头
+ * 20, 左转+右掉头
+ * 21, 公交车道
+ * 22, 空车道
+ * 23 可变车道
+ */
+
+ String[] array = {
+ "直行车道"
+ , "左转车道"
+ , "左转或直行车道"
+ , "右转车道"
+ , "右转或直行车道"
+ , "左掉头车道"
+ , "左转或者右转车道"
+ , " 左转或右转或直行车道"
+ , "右转掉头车道"
+ , "直行或左转掉头车道"
+ , "直行或右转掉头车道"
+ , "左转或左掉头车道"
+ , "右转或右掉头车道"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择该车道"
+ , "直行+左转+左掉头车道"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+
+ String[] actions = {
+ "直行"
+ , "左转"
+ , "左转或直行"
+ , "右转"
+ , "右转或这行"
+ , "左掉头"
+ , "左转或者右转"
+ , " 左转或右转或直行"
+ , "右转掉头"
+ , "直行或左转掉头"
+ , "直行或右转掉头"
+ , "左转或左掉头"
+ , "右转或右掉头"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择"
+ , "直行+左转+左掉头"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.java
deleted file mode 100644
index 606826fdb1..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.java
+++ /dev/null
@@ -1,398 +0,0 @@
-package com.mogo.och.sweeper.fragment;
-
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-
-import android.content.Intent;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.debug.DebugConfig;
-import com.mogo.commons.voice.AIAssist;
-import com.mogo.eagle.core.data.map.CenterLine;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
-import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.eagle.core.utilcode.util.ToastUtils;
-import com.mogo.map.marker.IMogoMarker;
-import com.mogo.map.marker.MogoMarkerOptions;
-import com.mogo.och.sweeper.R;
-import com.mogo.och.sweeper.bean.SweeperStationBean;
-import com.mogo.och.sweeper.constant.SweeperConst;
-import com.mogo.och.sweeper.presenter.SweeperPresenter;
-import com.mogo.och.sweeper.ui.SweeperSwitchLineActivity;
-import com.mogo.och.sweeper.view.SlidePanelView;
-import com.mogo.och.common.module.utils.OCHThreadPoolManager;
-
-import java.util.List;
-import java.util.Objects;
-
-
-/**
- * 网约车小巴界面
- *
- * @author tongchenfei
- */
-public class SweeperFragment extends BaseSweeperTabFragment
- implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener {
- private static final String TAG = "SweeperFragment";
-
- private TextView mCurrentStationName;
- private TextView mNextStationName;
- private TextView mCurrentTag;
- private TextView mNextTag;
- private TextView mSwitchLine; //切换路线
- private TextView mLineName;
- private int mCurrentStation = 0;
-
- private View mSweepers;
-
- private SweeperStationBean startStation = null;
- private SweeperStationBean endStation = null;
-
- @Override
- public String getTagName() {
- return "SweepersFragment";
- }
-
- @Override
- protected void initViews() {
- super.initViews();
- mSweepers = findViewById(R.id.module_och_sweeper_tag);
- mCurrentStationName = findViewById(R.id.module_och_sweeper_current_station);
- mCurrentTag = findViewById(R.id.module_och_sweeper_current_station_anchor);
- mNextStationName = findViewById(R.id.module_och_sweeper_order_end_station);
- mNextTag = findViewById(R.id.module_och_sweeper_next_station_anchor);
- mSwitchLine = findViewById(R.id.switch_line_btn);
- mLineName = findViewById(R.id.module_och_sweeper_line_name);
-
- if (DebugConfig.isDebug()) {
- mSweepers.setOnClickListener(view -> {
- ToastUtils.showShort("重置了车站状态");
- mPresenter.querySweepersRoutes();
- });
-
- //debug下调用测试面板
- mCurrentStationName.setOnLongClickListener(v -> {
- debugTestBar();
- showHideTestBar();
- return true;
- });
- }
-
- CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
- // 初始化的时候设置 UI 按钮状态
- switch (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) {
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
- hideAutopilotBiz();
- break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
- showAutopilotBiz();
- onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE);
- break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
- showAutopilotBiz();
- onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
- break;
- default:
- break;
- }
- mSwitchLine.setOnClickListener(this);
- }
-
- @Override
- protected void debugArrivedStation() {
- mPresenter.onAutopilotArriveAtStation(null);
- }
-
- @NonNull
- @Override
- protected SweeperPresenter createPresenter() {
- return new SweeperPresenter(this);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- }
-
- /**
- * 根据站点列表信息刷新车站面板,滑块面板
- *
- * @param stationList 车站列表信息
- * @param currentStation 当前站点
- * @param nextStation 下个站点
- * @param isArrived 是否都站
- */
- public void refreshSweeperStations(String lineName, List stationList
- , int currentStation, int nextStation, boolean isArrived) {
- mCurrentStation = currentStation;
- if (getActivity() == null) {
- return;
- }
- getActivity().runOnUiThread(() -> {
- if (stationList == null) {
- // 获取小巴数据失败
- return;
- }
-
- // 渲染小巴路线数据
- renderCurrentStationStatus(lineName, stationList, currentStation, nextStation, isArrived);
- });
- }
-
- /**
- * 重新刷新站点信息 isArrived 是否到站
- */
- private void renderCurrentStationStatus(String lineName, List stationList, int currentStation
- , int nextStation, boolean isArrived) {
- CallerLogger.INSTANCE.d(M_BUS + "MapMaker ", "currentStation=" + currentStation + ",nextStation=" + nextStation + "isArrived=" + isArrived);
- String currentStationName = null;
- String nextStationName = null;
-
- boolean isArriveEndStation = false;
- boolean isArriveAtStation = false;
- boolean isArriveAtStartStation = false;
-
- mLineName.setText(lineName);
-
- // 获取当前站点的名称
- currentStationName = stationList.get(currentStation).getName();
-
- startStation = stationList.get(0);
- endStation = stationList.get(stationList.size() - 1);
-
- // 是否到达起点
- if (currentStation == 0) {
- isArriveAtStartStation = true;
- mCurrentTag.setText(getResources().getString(R.string.sweeper_arrive_to_end_start));
-
- setOrRemoveMapMaker(true, SweeperConst.SWEEPER_START_MAP_MAKER, startStation.getLat()
- , startStation.getLon(), R.raw.star_marker);
- setOrRemoveMapMaker(true, SweeperConst.SWEEPER_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(), R.raw.end_marker);
- } else if (currentStation > 0 && currentStation < stationList.size() - 1) {// 是否到达站点
- isArriveAtStation = true;
- mCurrentTag.setText(getResources().getString(R.string.sweeper_arrive_to_current_tag));
- mNextTag.setText(getResources().getString(R.string.sweeper_arrive_to_next_tag));
-
- setOrRemoveMapMaker(false, SweeperConst.SWEEPER_START_MAP_MAKER, startStation.getLat()
- , startStation.getLon(), R.raw.star_marker);
- setOrRemoveMapMaker(true, SweeperConst.SWEEPER_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(), R.raw.end_marker);
- } else if (currentStation == stationList.size() - 1) {// 是否到达终点
- isArriveEndStation = true;
- nextStationName = "--";
- mNextTag.setText(getResources().getString(R.string.sweeper_arrive_to_end_end));
-
- setOrRemoveMapMaker(false, SweeperConst.SWEEPER_START_MAP_MAKER, startStation.getLat()
- , startStation.getLon(), R.raw.star_marker);
-
- if (isArrived) {
- setOrRemoveMapMaker(false, SweeperConst.SWEEPER_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(), R.raw.end_marker);
- } else {
- setOrRemoveMapMaker(true, SweeperConst.SWEEPER_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(), R.raw.end_marker);
- }
- }
-
- // 获取下一站点名称
- if (nextStation > currentStation && nextStation <= stationList.size() - 1) {
- nextStationName = stationList.get(nextStation).getName();
- }
-
- // 是否到达终点
- if (nextStation == stationList.size() - 1 || nextStation == -1) {
- mNextTag.setText(getResources().getString(R.string.sweeper_arrive_to_end_end));
- } else {
- mNextTag.setText(getResources().getString(R.string.sweeper_arrive_to_next_tag));
- }
-
- if (currentStation == 0 && isArrived) {
- showOrHideSwitchLineBtn(true);
- } else {
- showOrHideSwitchLineBtn(false);
- }
-
- // 重置滑动按钮文字
- if (isArriveEndStation) {
- showSlidePanle("单程结束");
- } else if (isArriveAtStartStation) {
- showSlidePanle("滑动出发");
- } else if (isArriveAtStation) {
- showSlidePanle("滑动出发");
- }
-
- mCurrentStationName.setText(currentStationName);
- mNextStationName.setText(nextStationName);
- updateSweeperTestBarInfo();
- }
-
- private void showOrHideSwitchLineBtn(boolean isShow) {
- if (isShow) {
- mSwitchLine.setVisibility(View.VISIBLE);
- } else {
- mSwitchLine.setVisibility(View.GONE);
- }
- }
-
- public void hideOchSweeper() {
-// tvNotice.setVisibility(View.GONE);
- }
-
- @Override
- public int getStationPanelViewId() {
- return R.layout.fragment_och_sweeper;
- }
-
- @Override
- public int getSweepOperatePanelViewId() {
- return R.layout.sweeper_operate_panel_view;
- }
-
- @Override
- public void restartAutopilot() {
- if (!isAnimateRunning) {
- mPresenter.restartAutopilot();
- }
- }
-
- @Override
- public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
- return this;
- }
-
- @Override
- public void moveToEnd() {
- // 开启自动驾驶到下一站
- if (isAnimateRunning) {
- stopAutopilotAnimation();
- }
- mPresenter.autoDriveToNextStation(false);
- }
-
- /**
- * 设置自动驾驶可用状态
- */
- public void onAutopilotEnableChange(boolean isEnable) {
- if (isEnable) {
- showAutopilotBiz();
- } else {
- hideAutopilotBiz();
- }
- }
-
- @Override
- protected void onChangeOperationStatus() {
- super.onChangeOperationStatus();
- mPresenter.onChangeOperationStatus();
- }
-
- /**
- * 修改经营状态
- *
- * @param launch true-收车,false-出车
- */
- public void changeOperationStatus(boolean launch) {
- isOperationStatus = launch;
- if (launch) {
- // 出车的时候重制站点状态
- mPresenter.querySweepersRoutes();
- tvOperationStatus.setText("收车");
- showPanel();
- } else {
- AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
- tvOperationStatus.setText("出车");
- hideSlidePanel();
- hidPanel();
-
- //移除起点终点
- if (null != startStation) {
- setOrRemoveMapMaker(false, SweeperConst.SWEEPER_START_MAP_MAKER, startStation.getLat()
- , startStation.getLon(), R.raw.star_marker);
- }
- if (null != endStation) {
- setOrRemoveMapMaker(false, SweeperConst.SWEEPER_END_MAP_MAKER, endStation.getLat()
- , endStation.getLon(), R.raw.end_marker);
- }
- }
- }
-
- /**
- * VR模式切换
- *
- * @param isVRMode
- */
- public void onVRModeChanged(boolean isVRMode) {
- if (mRootView != null) {
- mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
- }
- }
-
- /**
- * 绘制地图起点终点
- *
- * @param isAdd
- * @param uuid
- */
- private void setOrRemoveMapMaker(boolean isAdd, String uuid, double lat, double longi, int resourceId) {
- if (isAdd) {
- Runnable setMapMarkerRunnable = () -> {
- CallerLogger.INSTANCE.d(M_BUS + "setMapMaker= " + Thread.currentThread().getName(),
- uuid + "=latitude=" + lat + ",longitude=" + longi);
-
- MogoMarkerOptions options = new MogoMarkerOptions()
- .owner(SweeperConst.TYPE_MARKER_SWEEPER_ORDER)
- .anchor(0.5f, 0.5f)
- .set3DMode(true)
- .gps(true)
- .controlAngle(true)
- .icon3DRes(resourceId)
- .latitude(lat)
- .longitude(longi);
- IMogoMarker marker = Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerManager(AbsMogoApplication.getApp())).addMarker(uuid, options);
- CenterLine centerLine = CallerMapUIServiceManager.INSTANCE.getMapUIController().getCenterLineInfo(
- longi, lat, -1);
- if (null != centerLine) { // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致
- marker.setRotateAngle(centerLine.getAngle().floatValue());
- }
- };
- OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable);
- } else {
- Runnable removeMapMarkerRunnable = () -> {
- CallerLogger.INSTANCE.d(M_BUS + "RemoveMapMaker=" + Thread.currentThread().getName(),
- uuid + "=latitude=" + lat + ",longitude=" + longi);
- Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerManager(AbsMogoApplication.getApp())).removeMarkers(uuid);
- };
-
- OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable);
- }
- }
-
- @Override
- public void debugAutoPilotStatus(int status) {
- mPresenter.debugAutoPilotStatus(status);
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.switch_line_btn) {//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线
- //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线
- if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()
- == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
- ToastUtils.showLong(getResources().getString(R.string.sweeper_switch_line_btn_warning1));
- return;
- }
- if (mCurrentStation > 0) {
- ToastUtils.showLong(getResources().getString(R.string.sweeper_switch_line_btn_warning2));
- return;
- }
- Intent intent = new Intent(getContext(), SweeperSwitchLineActivity.class);
- startActivity(intent);
- }
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt
new file mode 100644
index 0000000000..facfdaf0f7
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt
@@ -0,0 +1,528 @@
+package com.mogo.och.sweeper.fragment
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.view.View.OnClickListener
+import androidx.lifecycle.lifecycleScope
+import androidx.recyclerview.widget.LinearLayoutManager
+import chassis.ChassisStatesOuterClass
+import com.amap.api.maps.model.LatLng
+import com.mogo.commons.AbsMogoApplication
+import com.mogo.eagle.core.data.map.MogoLocation
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
+import com.mogo.eagle.core.utilcode.util.ClickUtils
+import com.mogo.eagle.core.utilcode.util.ToastUtils
+import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.bean.*
+import com.mogo.och.sweeper.constant.SubTaskTypeEnum
+import com.mogo.och.sweeper.constant.TaskStatusEnum
+import com.mogo.och.sweeper.database.MyDataBase
+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 kotlinx.android.synthetic.main.fragment_och_sweeper.*
+import kotlinx.android.synthetic.main.sweeper_current_task_info.view.*
+import kotlinx.android.synthetic.main.sweeper_no_data_common_view.*
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlin.math.roundToInt
+
+/**
+ * 清扫车主界面
+ */
+class SweeperFragment : BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener {
+
+ companion object {
+ const val TAG = "SweeperFragment"
+ }
+
+ private var mAdapter: TaskListAdapter? = null
+ private var mCurrentSubPosition: Int = 0 //子任务下标
+ private var mSubMutableList: MutableList? = null
+ private var mSubTaskBean: SweeperSubTaskBean? = null
+ private var mSubTaskType: SubTaskTypeEnum = SubTaskTypeEnum.AUTOPILOT_SUBTYPE //1:自动驾驶子任务 2:人工驾驶子任务
+ private var mCleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates? = null
+ private var mMainTask: SweeperMainTaskBean? = null
+ private var mLocation: MogoLocation? = null
+ private var mSubInfo: SubInfo? = null
+
+ override fun getTagName(): String {
+ return "SweepersFragment"
+ }
+
+ override fun initViews() {
+ super.initViews()
+ mAdapter = context?.let { TaskListAdapter() }
+ val linearLayoutManager = LinearLayoutManager(context)
+ linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
+ rvTaskList?.layoutManager = linearLayoutManager
+ rvTaskList?.adapter = mAdapter
+ mAdapter?.setOnTaskItemClickListener(onTaskItemClickListener)
+ initListener()
+ sweeper_cl_work_mode.setTrafficDataView(trafficDataView)
+ sweeper_current_task_view.readyTaskBtn.setOnClickListener {
+ if (ClickUtils.isFastClick()) {//防止重复点击
+ if (mSubTaskType.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code) {
+ manualDriving(false)
+ } else {
+ //开始执行任务
+ mSubInfo?.apply {
+ presenter?.startTask(isFirstSubTask(), isLastSubTask(), taskId, mSubTaskType, taskStatus)
+ }
+ }
+ }
+ }
+ }
+
+ override fun createPresenter(): SweeperPresenter {
+ return SweeperPresenter(this)
+ }
+
+ override fun onActivityCreated(savedInstanceState: Bundle?) {
+ super.onActivityCreated(savedInstanceState)
+ mPresenter?.getCurrentTask()
+ }
+
+ override fun getTaskListPanelViewId(): Int {
+ return R.layout.fragment_och_sweeper
+ }
+
+ /**
+ * 任务列表面板隐藏或显示
+ *
+ * @return
+ */
+ private fun setShowTaskListPanelView(isShow: Boolean) {
+ tvTaskConfirm.setTextColor(Color.parseColor("#66FFFFFF"))
+ tvTaskConfirm.isSelected = false
+ if (isShow) {
+ sweeper_current_task_list_view.visibility = View.VISIBLE
+ } else {
+ sweeper_current_task_list_view.visibility = View.GONE
+ }
+ }
+
+ /**
+ * 当前任务面板隐藏或显示
+ *
+ * @return
+ */
+ private fun setShowCurrentTaskPanelView(isShow: Boolean) {
+ if (isShow) {
+ sweeper_current_task_view.visibility = View.VISIBLE
+ } else {
+ sweeper_current_task_view.visibility = View.GONE
+ }
+ }
+
+ /**
+ * VR模式切换
+ *
+ * @param isVRMode
+ */
+ fun onVRModeChanged(isVRMode: Boolean) {
+ if (mRootView != null) {
+ mRootView.visibility = if (isVRMode) View.VISIBLE else View.GONE
+ }
+ }
+
+ fun hideOchSweeper() {}
+ override fun debugAutoPilotStatus(status: Int) {
+ mPresenter?.debugAutoPilotStatus(status)
+ }
+
+ /**
+ * 根据自动驾驶状态更新按钮
+ */
+ fun startAutoBtn(autopilotState: Int) {
+ sweeper_current_task_view.setStartAutoBtn(autopilotState)
+ }
+
+ /**
+ * 任务按钮状态
+ */
+ fun setTaskBtn(isWorking: Boolean) {
+ sweeper_current_task_view.setEnableClickBtn(isWorking)
+ }
+
+ /**
+ * 设置各种监听事件
+ */
+ private fun initListener() {
+ tvTaskConfirm.setOnClickListener {
+ mMainTask?.let { task ->
+ mCurrentSubPosition = 0
+ mSubTaskBean = SweeperSubTaskBean(task.mainTaskId, task.mainTaskName, task.mainTaskStartTime, 1, mSubMutableList)
+ //获取当前子任务列表
+ presenter?.getSubTaskList(task.mainTaskId, mSubTaskBean)
+ mAdapter?.selectPosition(-1)
+ }
+ }
+ //列表任务刷新
+ ivTaskListRefresh.setOnClickListener {
+ mPresenter?.getMainTaskList(true)
+ }
+ //无任务时刷新
+ ivNoTaskRefresh.setOnClickListener {
+ mPresenter?.getMainTaskList(true)
+ }
+ }
+
+ private val onTaskItemClickListener = object : TaskListAdapter.TaskItemClickListener {
+ override fun onItemClick(position: Int, mainTask: SweeperMainTaskBean) {
+ mAdapter?.selectPosition(position)
+ tvTaskConfirm.isSelected = true
+ tvTaskConfirm.setTextColor(Color.parseColor("#FFFFFFFF"))
+ this@SweeperFragment.mMainTask = mainTask
+ }
+
+ }
+
+ override fun onMenuItemClick(itemType: TaskStatusEnum) {
+ when (itemType.code) {
+ TaskStatusEnum.JUMP_OVER_SUBTASK.code -> {//跳过任务
+ mSubInfo?.let {
+ //如果当前只有一个子任务,则isFirst设置为false
+ presenter?.subTaskSkip(if (mSubMutableList?.size == 1) false else isFirstSubTask(), isLastSubTask(), it.taskId)
+ }
+ }
+ TaskStatusEnum.END_TASK.code -> {//结束主任务
+ endMainTask()
+ }
+ }
+ }
+
+ fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) {
+ lifecycleScope.launch(Dispatchers.Main) {
+ mCleanSystemState = cleanSystemState
+ sweeper_cl_work_mode.setSweeperFutianCleanSystemState(mSubTaskType, cleanSystemState)
+ }
+ }
+
+ /**
+ * 设置当前主任务列表数据
+ */
+ fun setMainTaskList(mainTaskBeanList: MutableList?, refresh: Boolean) {
+ setShowCurrentTaskPanelView(false)
+ setShowTaskListPanelView(true)
+ sweeper_cl_work_mode.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
+ }
+ if (refresh) {
+ ToastUtils.showLong("已刷新")
+ }
+ }
+
+ /**
+ * 设置当前子任务列表数据
+ */
+ 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) {//如果是正在执行的子任务
+ it.sort - 1
+ } else {
+ 0
+ }
+ d(SceneConstant.M_SWEEPER + TAG, "setSubTaskBean mCurrentSubPosition:$mCurrentSubPosition")
+ sweeper_current_task_view.setData(sweeper_cl_work_mode, it, mCurrentSubPosition, this, presenter)
+ mSubMutableList = it.subList
+ setSubTaskData()
+ if (mSubTaskType.code == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) {//自动驾驶子任务需要调用详情
+ mSubInfo?.let { subInfo ->
+ presenter?.getSubTaskDetail(isFirstSubTask(), isLastSubTask(), subInfo.taskId, mSubTaskType, false)//加载子任务详情包括轨迹信息
+ }
+ }
+ mMainTask = SweeperMainTaskBean(it.taskId, it.taskName, 0, it.taskStartTime)
+ clearAllMarkerAndPolyline()
+ addWeltData()
+ }
+ }
+
+ /**
+ * 更新子任务状态
+ */
+ fun updateSubTaskStatus(typeEnum: TaskStatusEnum, isLastSubTask: Boolean) {
+ if (isLastSubTask) {
+ showAmapNaviToStationFragment(false)
+ clearAllMarkerAndPolyline()
+ //整个大任务结束,则删除它相关的贴边数据缓存
+ lifecycleScope.launch(Dispatchers.IO) {
+ MyDataBase.getInstance().weltDataDao.deleteAllWeltData()
+ mPresenter?.clearRouteList()
+ }
+ setTaskProgress("0")
+
+ val builder = SweeperManualDrivingDialog.Builder()
+ val endConfirmDialog = builder
+ .tips("任务已完成")
+ .confirmStr("确认")
+ .build(requireContext())
+ endConfirmDialog?.setClickListener(object: SweeperManualDrivingDialog.ClickListener{
+ override fun confirm() {
+ mPresenter?.getMainTaskList(false)
+ }
+ })
+ endConfirmDialog?.show()
+ return
+ }
+ when (typeEnum.code) {
+ TaskStatusEnum.END_SUBTASK.code -> {//子任务结束
+ mCurrentSubPosition++
+ setSubTaskData()
+ d(SceneConstant.M_SWEEPER + TAG, "END_SUBTASK mCurrentSubPosition:$mCurrentSubPosition")
+ if (mSubTaskType.code == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) {//自动驾驶子任务
+ //关闭人工驾驶导航
+ showAmapNaviToStationFragment(false)
+ mSubInfo?.apply {
+ presenter?.getSubTaskDetail(isFirstSubTask(), isLastSubTask(), taskId, mSubTaskType, true)
+ }
+ sweeper_current_task_view.setCurrentData(mCurrentSubPosition)
+ } else {
+ manualDriving(true)
+ }
+ }
+ TaskStatusEnum.JUMP_OVER_SUBTASK.code -> { //子任务跳过
+ //是否是最后一个子任务结束
+ mCurrentSubPosition++
+ setSubTaskData()
+ d(SceneConstant.M_SWEEPER + TAG, "JUMP_OVER_SUBTASK mCurrentSubPosition:$mCurrentSubPosition")
+ showAmapNaviToStationFragment(false)
+ if (mSubTaskType.code == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) {//自动驾驶子任务
+ //关闭人工驾驶导航
+ showAmapNaviToStationFragment(false)
+ mSubInfo?.apply {
+ presenter?.getSubTaskDetail(isFirstSubTask(), isLastSubTask(), taskId, mSubTaskType, true)
+ }
+ sweeper_current_task_view.setCurrentData(mCurrentSubPosition)
+ } else {
+ manualDriving(true)
+ }
+ }
+ TaskStatusEnum.START_SUBTASK.code -> { //子任务开始
+ setTaskBtn(true)
+ sweeper_current_task_view.setTaskStatus(2)
+ if (mSubTaskType == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE) {
+ sweeper_current_task_view.setCurrentData(mCurrentSubPosition)
+ }
+ }
+ }
+ setEndStationMarker()
+ }
+
+ /**
+ * 主任务重置
+ */
+ fun setMainTaskReset(isSuccess: Boolean) {
+ if (isSuccess) {
+ //任务重置后,重新拉取任务列表数据
+ mPresenter?.getMainTaskList(false)
+ //清除任务全览图的marker和路线
+ clearAllMarkerAndPolyline()
+ showAmapNaviToStationFragment(false)
+ setTaskProgress("0")
+ //整个大任务结束,则删除它相关的贴边数据缓存
+ lifecycleScope.launch(Dispatchers.IO) {
+ MyDataBase.getInstance().weltDataDao.deleteAllWeltData()
+ mPresenter?.clearRouteList()
+ }
+ }
+ }
+
+ /**
+ * 设置当前选中的子任务信息
+ */
+ private fun setSubTaskData() {
+ mSubMutableList?.let {
+ mSubInfo = it[mCurrentSubPosition]
+ mSubTaskType = if (it[mCurrentSubPosition].taskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code)
+ SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE
+ //设置当前子任务信息
+ presenter?.setSubtask(isFirstSubTask(), isLastSubTask(), it[mCurrentSubPosition].taskId, it[mCurrentSubPosition].taskType)
+ }
+ /**
+ * 计算任务的进度
+ */
+ lifecycleScope.launch(Dispatchers.IO) {
+ mSubMutableList?.let {
+ var sum: Double = 0.0
+ for (index in it.indices) {
+ sum += it[index].mileage
+ }
+ var completed: Double = 0.0
+ for (index in it.indices) {
+ if (index < mCurrentSubPosition) {
+ // 已完成的子任务记入完成度,进行中的不计入
+ completed += it[index].mileage
+ }
+ }
+ val progress = "${((completed / sum) * 100.0).roundToInt()}%"
+ setTaskProgress(progress)
+ }
+
+ }
+ }
+ /**
+ * 结束主任务
+ */
+ private fun endMainTask() {
+ //结束任务
+ 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)
+ }
+ }
+
+ override fun cancel() {
+ endConfirmDialog?.dismiss()
+ }
+ })
+ endConfirmDialog?.show()
+ }
+
+ /**
+ * 人工驾驶子任务
+ */
+ private fun manualDriving(isCancelAutoPoilot: Boolean) {
+ if (isCancelAutoPoilot) { // 人工子任务 先取消自动驾驶
+ CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null)
+ CallerAutoPilotControlManager.cancelAutoPilot()
+ }
+
+ mSubInfo?.apply {
+ val builder = SweeperManualDrivingDialog.Builder()
+ val endConfirmDialog = builder
+ .tips("前方子任务${taskName}请人工驾驶至(${endSiteName})")
+ .confirmStr("确认")
+ .build(requireContext())
+ endConfirmDialog?.setClickListener(object : SweeperManualDrivingDialog.ClickListener {
+ override fun confirm() {
+ presenter?.startTask(isFirstSubTask(), isLastSubTask(), taskId, mSubTaskType, taskStatus)
+ val startPoint =
+ CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(), startWgs84Lon, startWgs84Lat)
+ val endPoint = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(), endWgs84Lon, endWgs84Lat)
+ startNaviToStation(
+ true,
+ startPoint.latitude,
+ startPoint.longitude,
+ endPoint.latitude,
+ endPoint.longitude
+ )
+ showAmapNaviToStationFragment(true)
+ }
+ })
+ endConfirmDialog?.show()
+ }
+ }
+
+ /**
+ * 是否第一个子任务
+ */
+ fun isFirstSubTask(): Boolean {
+ return mCurrentSubPosition == 0
+ }
+
+ /**
+ * 是否最后一个子任务
+ */
+ fun isLastSubTask(): Boolean {
+ return mCurrentSubPosition == (mSubMutableList?.size?.minus(1))
+ }
+
+ /**
+ * 当前位置经纬度
+ */
+ fun setCurrentLocation(location: MogoLocation) {
+ this.mLocation = location
+ }
+
+ override fun refreshNavi() {
+ mSubInfo?.apply {
+ mLocation?.let {
+ val endPoint = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(), endWgs84Lon, endWgs84Lat)
+ startNaviToStation(true, it.latitude, it.longitude, endPoint.latitude, endPoint.longitude)
+ }
+ }
+ }
+
+ private fun addWeltData() {
+ lifecycleScope.launch(Dispatchers.IO) {
+ mSubMutableList?.let { subList ->
+ if (subList.size <= 0) {
+ return@launch
+ }
+ val dataList = ArrayList()
+ for (index in subList.indices) {
+ val startPoint = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(
+ AbsMogoApplication.getApp(),
+ subList[index].startWgs84Lon,
+ subList[index].startWgs84Lat
+ )
+ val startLatLng = LatLng(startPoint.latitude, startPoint.longitude)
+ dataList.add(index,startLatLng)
+ val endPoint = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(
+ AbsMogoApplication.getApp(),
+ subList[index].endWgs84Lon,
+ subList[index].endWgs84Lat
+ )
+ val endLatLng = LatLng(endPoint.latitude, endPoint.longitude)
+ dataList.add(index+1,endLatLng)
+ }
+ setTaskListCoordinatesLatLng(dataList)
+ setEndStationMarker()
+ }
+ }
+ }
+
+ private fun setEndStationMarker(){
+ lifecycleScope.launch(Dispatchers.IO) {
+ mSubInfo?.let {
+ val endPoint = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(
+ AbsMogoApplication.getApp(),
+ it.endWgs84Lon,
+ it.endWgs84Lat
+ )
+ super.mCurrentTaskEndStation = endPoint
+ setCurrentTaskEndMarker(endPoint)
+ }
+ }
+ }
+
+
+
+ //模拟结束子任务
+ override fun debugEndSubTask() {
+ //mPresenter?.onArriveTaskEnd(null)
+ super.debugEndSubTask()
+ }
+
+ /**
+ * 设置路线轨迹
+ */
+ override fun setTaskRouteList(routeList: ArrayList) {
+ super.setTaskRouteList(routeList)
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt
new file mode 100644
index 0000000000..1b160314b7
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt
@@ -0,0 +1,129 @@
+package com.mogo.och.sweeper.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.model.LatLng
+import com.mogo.commons.mvp.BaseFragment
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean
+import com.mogo.och.sweeper.callback.ISweeperTaskDataToFragmentCallback
+import com.mogo.och.sweeper.callback.IWeltMapSwitchToSmallCallback
+import com.mogo.och.sweeper.database.bean.WeltDataBean
+import kotlinx.android.synthetic.main.fragment_welt_map_overview.*
+import kotlinx.android.synthetic.main.sweeper_welt_map_overview.*
+
+/**
+ * 作业任务全览图
+ */
+class WeltMapOverViewFragment() : BaseFragment(), ISweeperTaskDataToFragmentCallback {
+ private var mIWeltMapSwitchToSmallCallBack: IWeltMapSwitchToSmallCallback? = null
+ private var mFragment: SweeperFragment? = null
+ override fun getLayoutId(): Int = R.layout.fragment_welt_map_overview
+ override fun getTagName(): String {
+ return "WeltMapOverViewFragment"
+ }
+
+ override fun initViews() {
+
+ }
+ fun setWeltMapSwitchToSmallCallBack(iWeltMapSwitchToSmallCallback: IWeltMapSwitchToSmallCallback){
+ this.mIWeltMapSwitchToSmallCallBack=iWeltMapSwitchToSmallCallback
+ }
+ fun setSweeperFragment(fragment: SweeperFragment){
+ this.mFragment=fragment
+ mFragment?.setTaskDataToFragmentCallback(this)
+ }
+ override fun initViews(savedInstanceState: Bundle?) {
+ super.initViews(savedInstanceState)
+ weltMapOverView.onCreateView(savedInstanceState)
+ sweeperSwitchToSmall.setOnClickListener {
+ mIWeltMapSwitchToSmallCallBack?.onWeltMapSwitchToSmall()
+ }
+ val bundle = arguments
+ if (bundle != null) {
+ val latLngs = bundle.getSerializable("subTaskCoordinates") as? ArrayList
+ val latLng = bundle.getParcelable("subTaskEndCoordinates")
+ val weltDataList = bundle.getSerializable("weltDataList") as? ArrayList
+ val routeList = bundle.getSerializable("routeList") as? ArrayList
+ val progress = bundle.getString("progress")
+ routeList?.let {
+ weltMapOverView.setRouteList(it)
+ }
+ latLng?.let {
+ setCurrentTaskCoordinatesLatLng(it)
+ }
+ latLngs?.let {
+ setTaskListCoordinatesLatLng(it)
+ }
+ weltDataList?.let {
+ setWeltData(it,"0.0")
+ }
+ progress?.let {
+ weltMapOverView.setProgress(progress)
+ }
+ }
+
+ }
+
+ companion object {
+ @JvmStatic
+ fun newInstance(
+ mIWeltMapSwitchToSmallCallBack: IWeltMapSwitchToSmallCallback,
+ mCurrentTaskEndStation:LatLng?,
+ weltDataList: ArrayList?,
+ latLngs: ArrayList?,
+ routeList: ArrayList?,
+ progress:String?,
+ sweeperFragment: SweeperFragment
+ ): WeltMapOverViewFragment {
+ val args = Bundle()
+ args.putSerializable("weltDataList", weltDataList)
+ args.putSerializable("subTaskCoordinates", latLngs)
+ args.putParcelable("subTaskEndCoordinates", mCurrentTaskEndStation)
+ args.putSerializable("routeList", routeList)
+ args.putString("progress", progress)
+ val fragment = WeltMapOverViewFragment()
+ fragment.setWeltMapSwitchToSmallCallBack(mIWeltMapSwitchToSmallCallBack)
+ fragment.setSweeperFragment(sweeperFragment)
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ override fun onPause() {
+ super.onPause()
+ weltMapOverView.onPause()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ weltMapOverView.onResume()
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ weltMapOverView.onDestroy()
+ }
+ override fun setTaskListCoordinatesLatLng(coordinatesLatLng: java.util.ArrayList) {
+ weltMapOverView.setTaskListCoordinatesLatLng(coordinatesLatLng)
+ }
+
+ override fun setCurrentTaskCoordinatesLatLng(coordinatesLatLng: LatLng) {
+ weltMapOverView.setCurrentTaskCoordinatesLatLng(coordinatesLatLng)
+ }
+
+ override fun clearAllMarkerAndPolyline() {
+ weltMapOverView.clearAllMarkerAndPolyline()
+ }
+
+ override fun setProgress(progress: String) {
+ weltMapOverView.setProgress(progress)
+ }
+
+ override fun setRouteList(routeList: java.util.ArrayList) {
+ weltMapOverView.setRouteList(routeList)
+ }
+
+ override fun setWeltData(weltDatas: java.util.ArrayList?, distance: String) {
+ weltMapOverView.setWeltData(weltDatas,true,distance)
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperLineModel.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperLineModel.java
deleted file mode 100644
index e297e5053e..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperLineModel.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.mogo.och.sweeper.model;
-
-import android.content.Context;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.eagle.core.utilcode.util.NetworkUtils;
-import com.mogo.eagle.core.utilcode.util.ToastUtils;
-import com.mogo.och.sweeper.bean.SweeperQueryLinesResponse;
-import com.mogo.och.sweeper.bean.SweeperRoutesResponse;
-import com.mogo.och.sweeper.callback.ISweeperLinesCallback;
-import com.mogo.och.sweeper.net.SweeperServiceManager;
-import com.mogo.och.sweeper.net.ISweeperServiceCallback;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public class SweeperLineModel {
- private static volatile SweeperLineModel sInstance;
- private Context mContext;
- private ISweeperLinesCallback mBusLinesCallback;
- public static SweeperLineModel getInstance() {
- if ( sInstance == null ) {
- synchronized ( SweeperLineModel.class ) {
- if ( sInstance == null ) {
- sInstance = new SweeperLineModel();
- }
- }
- }
- return sInstance;
- }
- private SweeperLineModel() {
-
- }
- public void init() {
- mContext = AbsMogoApplication.getApp();
- }
- public void setBusLinesCallback(ISweeperLinesCallback callback){
- mBusLinesCallback = callback;
- }
- public void queryBusLines(){
- SweeperServiceManager.getInstance().queryBusLines(mContext, new ISweeperServiceCallback() {
- @Override
- public void onSuccess(SweeperQueryLinesResponse data) {
- if (null == data && mBusLinesCallback != null) {
- mBusLinesCallback.onBusLinesChange(null);
- return;
- }
-
- if (mBusLinesCallback != null){
- mBusLinesCallback.onBusLinesChange(data);
- }
- }
-
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- ToastUtils.showShort("网络异常,请稍后重试");
- }else {
- ToastUtils.showShort("查询所有绑定路线失败:"+failMsg);
- }
- }
- });
- }
-
- public void commitSwitchLineId(int lineId){
- SweeperServiceManager.getInstance().resetStationStatus(mContext,lineId, new ISweeperServiceCallback() {
- @Override
- public void onSuccess(SweeperRoutesResponse o) {
- if (mBusLinesCallback != null){
- mBusLinesCallback.onChangeLineIdSuccess();
- }
- }
-
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- ToastUtils.showShort("网络异常,请稍后重试");
- }else {
- ToastUtils.showShort("切换路线失败:"+failMsg);
- }
- }
- });
- }
-
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java
deleted file mode 100644
index 2754b324a4..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java
+++ /dev/null
@@ -1,878 +0,0 @@
-package com.mogo.och.sweeper.model;
-
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-import static com.mogo.och.sweeper.constant.SweeperConst.STATION_STATUS_STOPPED;
-
-import android.content.Context;
-import android.os.Handler;
-
-import androidx.annotation.Nullable;
-
-import com.amap.api.maps.model.LatLng;
-import com.elegant.network.utils.GsonUtil;
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.module.status.IMogoStatusChangedListener;
-import com.mogo.commons.module.status.MogoStatusManager;
-import com.mogo.commons.module.status.StatusDescriptor;
-import com.mogo.commons.voice.AIAssist;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.data.map.MogoLocation;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.util.CoordinateUtils;
-import com.mogo.eagle.core.utilcode.util.NetworkUtils;
-import com.mogo.eagle.core.utilcode.util.ToastUtils;
-import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil;
-import com.mogo.och.sweeper.bean.QueryLeaveAwayPassengersResponse;
-import com.mogo.och.sweeper.bean.SweeperOperationStatusResponse;
-import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean;
-import com.mogo.och.sweeper.bean.SweeperRoutesResponse;
-import com.mogo.och.sweeper.bean.SweeperRoutesResult;
-import com.mogo.och.sweeper.bean.SweeperStationBean;
-import com.mogo.och.sweeper.callback.ICarOperationStatusCallback;
-import com.mogo.och.sweeper.callback.IRefreshSweeperStationsCallback;
-import com.mogo.och.sweeper.callback.ISlidePannelHideCallback;
-import com.mogo.och.sweeper.callback.ISweeperControllerStatusCallback;
-import com.mogo.och.sweeper.constant.SweeperConst;
-import com.mogo.och.sweeper.net.ISweeperServiceCallback;
-import com.mogo.och.sweeper.net.SweeperServiceManager;
-import com.mogo.och.sweeper.presenter.SweeperModelLoopManager;
-import com.mogo.och.sweeper.util.SweeperAnalyticsManager;
-import com.mogo.och.sweeper.util.SweeperTrajectoryManager;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import io.reactivex.exceptions.UndeliverableException;
-import io.reactivex.functions.Consumer;
-import io.reactivex.plugins.RxJavaPlugins;
-import mogo.telematics.pad.MessagePad;
-
-/**
- * @author congtaowang
- * @since 2021/3/23
- *
- * 小巴订单管理
- */
-public class SweeperOrderModel {
- private final String TAG = SweeperOrderModel.class.getSimpleName();
- private int currentLineId = -1;
- private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引
- /**
- * 运营状态、后端更具运营状态来判断车辆是否派单
- */
- private boolean mIsWorking = false;
- private static volatile SweeperOrderModel sInstance;
- public double mLongitude = 0;
- public double mLatitude = 0;
- private Context mContext;
- private final List stationList = new ArrayList<>();
- private SweeperRoutesResult sweeperRoutesResult = null;
- /**
- * 用来表示是否正在开往下一站
- */
- private boolean isGoingToNextStation = false;
- // 运营类型
- private static final int VEHICLE_TYPE = 10;
- private static final int MSG_QUERY_BUS_STATION = 1001;
- private static final long QUERY_BUS_STATION_DELAY = 5000;
-
- private ICarOperationStatusCallback carOperationStatusCallback;
- private IRefreshSweeperStationsCallback refreshBusStationsCallback;
- private ISlidePannelHideCallback slidePannelHideCallback;
- private ISweeperControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
-
- List points = new ArrayList<>();//全路径信息
-
- private boolean hadQueryLeaveAwayPassager = false;
-
- private volatile boolean isArrivedStation = false;
-
- private final Handler handler = new Handler(msg -> {
- if (msg.what == MSG_QUERY_BUS_STATION) {
- SweeperOrderModel.getInstance().querySweeperRoutes();
- return true;
- }
- return false;
- });
-
- public static SweeperOrderModel getInstance() {
- if (sInstance == null) {
- synchronized (SweeperOrderModel.class) {
- if (sInstance == null) {
- sInstance = new SweeperOrderModel();
- }
- }
- }
- return sInstance;
- }
-
- private SweeperOrderModel() {
-
- }
-
- public void init() {
- mContext = AbsMogoApplication.getApp();
- // 定位监听
- CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,mMapLocationListener);
-
- MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
-
- //自动驾驶路线规划接口
- CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener);
-
-
- //2022.1.28
- // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
- // The exception could not be delivered to the consumer because it has already canceled/disposed
- // the flow or the excTeption has nowhere to go to begin with
- RxJavaPlugins.setErrorHandler(new Consumer() {
- @Override
- public void accept(Throwable e) {
- if (e instanceof UndeliverableException) {
- e = e.getCause();
- CallerLogger.INSTANCE.d(M_BUS + TAG, "UndeliverableException");
- }
- if ((e instanceof IOException)) {//
- // fine, irrelevant network problem or API that throws on cancellation
- CallerLogger.INSTANCE.d(M_BUS + TAG, "IOException");
- return;
- }
- if (e instanceof InterruptedException) {
- // fine, some blocking code was interrupted by a dispose call
- CallerLogger.INSTANCE.d(M_BUS + TAG, "InterruptedException");
- return;
- }
- if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
- // that's likely a bug in the application
- CallerLogger.INSTANCE.d(M_BUS + TAG, "NullPointerException or IllegalArgumentException");
- Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
- return;
- }
- if (e instanceof IllegalStateException) {
- // that's a bug in RxJava or in a custom operator
- CallerLogger.INSTANCE.d(M_BUS + TAG, "IllegalStateException");
- Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
- return;
- }
- CallerLogger.INSTANCE.d(M_BUS + TAG, "Undeliverable exception");
- }
- });
-
- }
-
- public void setCarOperationStatusCallback(ICarOperationStatusCallback callback) {
- this.carOperationStatusCallback = callback;
- }
-
- public void setRefreshBusStationsCallback(IRefreshSweeperStationsCallback callback) {
- this.refreshBusStationsCallback = callback;
- }
-
- public void setSlidePannelHideCallback(ISlidePannelHideCallback callback) {
- this.slidePannelHideCallback = callback;
- }
-
- public void setControllerStatusCallback(ISweeperControllerStatusCallback callback) {
- this.mControllerStatusCallback = callback;
- }
-
- private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener() {
-
- @Override
- public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) {
- if (null != routeList && routeList.getWayPointsList().size() > 0) {
- points.clear();
- points.addAll(coordinateConverterWgsToGcjList(mContext, routeList.getWayPointsList()));
- updateOrderRoute();
- }
- }
-
- };
-
- public static List coordinateConverterWgsToGcjList(Context mContext, List mogoLatLngList) {
- List points = new ArrayList<>();
- for (MessagePad.Location m : mogoLatLngList) {
- LatLng mogoLatLng = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(mContext, m);
- SweeperRoutePlanningUpdateReqBean.Result result = new SweeperRoutePlanningUpdateReqBean.Result();
- result.latitude = mogoLatLng.latitude;
- result.longitude = mogoLatLng.longitude;
- points.add(result);
- }
- return points;
- }
-
- /**
- * 上报订单全路径规划数据
- */
- public void updateOrderRoute() {
- if (!isGoingToNextStation || backgroundCurrentStationIndex + 1 >= stationList.size() || points.size() == 0) {
- return;
- }
-
- SweeperStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
- SweeperStationBean nextStation = stationList.get(backgroundCurrentStationIndex + 1);
-
- SweeperServiceManager.getInstance().updateOrderRoute(mContext, currentLineId, currentStation.getSiteId()
- , nextStation.getSiteId(), points, new ISweeperServiceCallback() {
- @Override
- public void onSuccess(BaseData o) {
-
- }
-
- @Override
- public void onFail(String failMsg) {
- if (isGoingToNextStation) {//重试
- updateOrderRoute();
- }
- }
- });
- }
-
- public void debugUpdateOrderRoute(List list) {
- points.clear();
- points.addAll(coordinateConverterWgsToGcjList(mContext, list));
- updateOrderRoute();
- }
-
- public void release() {
- startOrStopOrderLoop(false);
- MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
- // 注销定位监听
- CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG);
-
- //自动驾驶路线规划接口
- CallerPlanningRottingListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
- }
-
- private Object readResolve() {
- // 阻止反序列化,必须实现 Serializable 接口
- return sInstance;
- }
-
- private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
- // VR mode变更回调
- @Override
- public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
- if (StatusDescriptor.VR_MODE == descriptor) {
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.onVRModeChanged(isTrue);
- }
- }
- }
- };
-
- // 自车定位
- private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() {
- @Override
- public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) {
- if (null == gnssInfo) return;
- mLongitude = gnssInfo.getLongitude();
- mLatitude = gnssInfo.getLatitude();
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.onCarLocationChanged(gnssInfo);
- }
-
- //是否到站的围栏判断 离站状态并且自动驾驶还未触发到站
- if (isGoingToNextStation && !isArrivedStation) {
- judgeStartStation(gnssInfo);
- }
- }
- };
-
- //根据围栏判断,是否到达起点
- private void judgeStartStation(MogoLocation location) {
-
- if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) {
- return;
- }
- SweeperStationBean upcomingStation = stationList.get(backgroundCurrentStationIndex + 1);
-
- double startLon = upcomingStation.getGcjLon();
- double startLat = upcomingStation.getGcjLat();
- double distance = CoordinateUtils.calculateLineDistance(
- startLon, startLat,
- location.getLongitude(), location.getLatitude());
-
- Logger.i(TAG, "judgeStartStation() distance = " + distance);
-
- if (distance > SweeperConst.ARRIVE_AT_END_STATION_DISTANCE) {
- distance = CoordinateUtils.calculateLineDistance(startLon, startLat,
- CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(),
- CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude());
- }
-
- if (distance <= SweeperConst.ARRIVE_AT_END_STATION_DISTANCE) {
- onArriveAt(null); //无自动驾驶到站信息传null
- return;
- }
- }
-
- /**
- * 查询小巴路线
- */
- public void querySweeperRoutes() {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "查询小巴路线");
- SweeperServiceManager.getInstance().queryBusRoutes(mContext, new ISweeperServiceCallback() {
- @Override
- public void onSuccess(SweeperRoutesResponse data) {
- if (data == null
- || data.getResult() == null
- || data.getResult().getSites() == null
- || data.getResult().getSites().isEmpty()) {
- return;
- }
- CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + data);
- renderBusStationsStatus(data.getResult());
- }
-
- @Override
- public void onFail(String failMsg) {
- // 重复请求小巴路线,直至成功
- queryBusStationDelay();
- }
- });
-
- }
-
- /**
- * 测试、重置站点状态
- */
- public void debugResetStationStatus() {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "测试、重置站点状态");
- SweeperServiceManager.getInstance().resetStationStatus(mContext, currentLineId
- , new ISweeperServiceCallback() {
- @Override
- public void onSuccess(SweeperRoutesResponse o) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + o);
- isGoingToNextStation = false;
- if (o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty()) {
- return;
- }
- renderBusStationsStatus(o.getResult());
- }
-
- @Override
- public void onFail(String failMsg) {
- // 重复请求小巴路线,直至成功
- queryBusStationDelay();
- }
- });
-
- }
-
- /**
- * 离站上报
- */
- public void leaveStation(boolean isOneWayOver, boolean isRestart) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "leaveStation-backgroundCurrentStationIndex = " + backgroundCurrentStationIndex);
- SweeperServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq()
- , stationList.get(backgroundCurrentStationIndex).getSiteId(), new ISweeperServiceCallback() {
- @Override
- public void onSuccess(SweeperRoutesResponse o) {
- if (o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty()) {
- return;
- }
- isArrivedStation = false;
- if (!isOneWayOver) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "自动驾驶开启开往下一站====");
- //需要更改当前站和下一站的状态 然后渲染
- leaveStationSuccess(o.getResult(), isRestart);
- } else {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "单程真的结束了====");
- isGoingToNextStation = false;
- backgroundCurrentStationIndex = 0;
- CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot();
- querySweeperRoutes();
- }
- }
-
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- ToastUtils.showShort("网络异常,请稍后重试");
- } else {
- ToastUtils.showShort("离站上报失败:" + failMsg);
- }
- }
- });
- }
-
- /**
- * 离站上报成功后渲染站点
- * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
- * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染
- */
- private void leaveStationSuccess(SweeperRoutesResult result, boolean isRestart) {
- renderBusStationsStatus(result);
- if (slidePannelHideCallback != null) {
- slidePannelHideCallback.hideSlidePanel();
- }
- //开启自动驾驶
- startAutopilot(isRestart);
- if (isGoingToNextStation) {
- // 为了避免恢复自动驾驶时重复的接口请求
- return;
- }
- isGoingToNextStation = true;
- AIAssist.getInstance(mContext).speakTTSVoice("欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始");
- }
-
- /**
- * 开启自动驾驶
- *
- * @param isRestart
- */
- private void startAutopilot(boolean isRestart) {
-
- triggerStartServiceEvent(isRestart, false);
-
- isArrivedStation = false;
-// SweeperStationBean currentStation = stationList.get( backgroundCurrentStationIndex);
-// SweeperStationBean nextStation = stationList.get( backgroundCurrentStationIndex + 1);
-
-// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
-// == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) {
-// ToastUtils.showShort("自动驾驶状态为不可用!");
-// }
- AutopilotControlParameters parameters = new AutopilotControlParameters();
-// parameters.isSpeakVoice = !isRestart;
-// parameters.routeID = sweeperRoutesResult.getLineId();
-// parameters.routeName = sweeperRoutesResult.getName();
-// parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName());
-// parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName());
-// parameters.startLatLon = new AutopilotControlParameters
-// .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() );
-// parameters.endLatLon = new AutopilotControlParameters
-// .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() );
-// parameters.vehicleType = VEHICLE_TYPE;
-// if (parameters.autoPilotLine == null) {
-// parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine(
-// sweeperRoutesResult.getLineId(),
-// sweeperRoutesResult.csvFileUrl, sweeperRoutesResult.csvFileMd5,
-// sweeperRoutesResult.txtFileUrl, sweeperRoutesResult.txtFileMd5,
-// sweeperRoutesResult.contrailSaveTime, sweeperRoutesResult.carModel,
-// sweeperRoutesResult.csvFileUrlDPQP, sweeperRoutesResult.csvFileMd5DPQP,
-// sweeperRoutesResult.txtFileUrlDPQP, sweeperRoutesResult.txtFileMd5DPQP,
-// sweeperRoutesResult.contrailSaveTimeDPQP);
-// }
-// CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters)
-// +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName());
- CallerLogger.INSTANCE.d(M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters));
- CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters);
-
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.startOpenAutopilot();
- }
- }
-
- /**
- * 到站后重置站点状态
- */
- private void arriveSiteStation(boolean isRestart) {
- if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) { //到站短时间内调用多次
- CallerLogger.INSTANCE.e(M_BUS + TAG, "数组越界");
- return;
- }
- int arrivedStationIndex = 0;
- if (!isRestart) {
- arrivedStationIndex = backgroundCurrentStationIndex + 1;
- }
- CallerLogger.INSTANCE.d(M_BUS + TAG, "arriveSiteStation-currentStationIndex = " + arrivedStationIndex);
-
- SweeperServiceManager.getInstance().arriveSiteStation(mContext
- , stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId()
- , new ISweeperServiceCallback() {
- @Override
- public void onSuccess(BaseData o) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "arriveSiteStation success");
- if (!isRestart) {
- renderArriveBusStation();
- }
- }
-
- @Override
- public void onFail(String failMsg) {
-// if (!NetworkUtils.isConnected(mContext)) {
-// ToastUtils.showShort("网络异常,请稍后重试");
-// }else {
-// ToastUtils.showShort("离站上报失败:"+failMsg);
-// }
-
- }
- });
- }
-
- private void renderArriveBusStation() {
- List site = sweeperRoutesResult.getSites();
- if (site != null && site.size() > 0) {
- backgroundCurrentStationIndex++;
- if (refreshBusStationsCallback != null) {
- refreshBusStationsCallback.refreshBusStations(sweeperRoutesResult.getName(), stationList, backgroundCurrentStationIndex
- , getNextStopStation(), true);
- }
- }
- }
-
- /**
- * 收车
- */
- public void stopTakeOrder() {
- SweeperServiceManager.getInstance().stopTakeOrder(mContext, new ISweeperServiceCallback() {
- @Override
- public void onSuccess(BaseData o) {
- mIsWorking = !mIsWorking;
- closeBeautificationMode();
- carOperationStatusCallback.changeOperationStatus(isWorking());
- startOrStopOrderLoop(mIsWorking);
- SweeperTrajectoryManager.getInstance().stopTrajReqLoop();
- }
-
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- ToastUtils.showShort("网络异常,请稍后重试");
- } else {
- ToastUtils.showShort("收车失败:" + failMsg);
- }
- }
- });
- }
-
- /**
- * 关闭美化模式
- */
- private void closeBeautificationMode() {
- if (FunctionBuildConfig.isDemoMode) {//收车结束美化
- FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
- CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);
- CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(收车)");
- }
- }
-
- /**
- * 出车
- */
- public void startTakeOrder() {
- SweeperServiceManager.getInstance().startTakeOrder(mContext, new ISweeperServiceCallback() {
- @Override
- public void onSuccess(BaseData o) {
- mIsWorking = !mIsWorking;
- startOrStopOrderLoop(mIsWorking);
- if (stationList != null && stationList.size() > 0) {
- AIAssist.getInstance(mContext).speakTTSVoice("车辆已整备完毕,请前往"
- + stationList.get(backgroundCurrentStationIndex).getName() + "站点");
- }
- carOperationStatusCallback.changeOperationStatus(isWorking());
- querySweeperRoutes();
- }
-
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- ToastUtils.showShort("网络异常,请稍后重试");
- } else {
- ToastUtils.showShort("出车失败:" + failMsg);
- }
- }
- });
- }
-
- /**
- * 查询运营状态
- */
- public void queryOperationStatus() {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "查询运营状态");
- SweeperServiceManager.getInstance().queryOperationStatus(mContext
- , new ISweeperServiceCallback() {
- @Override
- public void onSuccess(SweeperOperationStatusResponse o) {
- if (o.data != null) {
- mIsWorking = o.data.serviceStatus == 1;
- CallerLogger.INSTANCE.d(M_BUS + TAG, "查询运营状态 result.status: " + o.data.serviceStatus);
- startOrStopOrderLoop(mIsWorking);
- }
- carOperationStatusCallback.changeOperationStatus(isWorking());
- }
-
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- ToastUtils.showShort("网络异常,请稍后重试");
- } else {
- ToastUtils.showShort("出车收车状态查询:" + failMsg);
- }
-// queryOperationStatus();
- }
- });
- }
-
- /**
- * 开启自动驾驶到下一站
- */
- public void autoDriveToNextStation(boolean isRestart) {
-// if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) {
-// // 当前站是最后一站,结束当前行程
-// travelOver();
-// return;
-// }
-// leaveStation(false,isRestart);
- startAutopilot(isRestart);
- }
-
- /**
- * 渲染站点信息
- * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
- * 车机端展示 离开站为当前站点,前往站为下一站, 下一站到站后在置为当前站
- *
- * @param result
- */
- private void renderBusStationsStatus(SweeperRoutesResult result) {
- if (result == null) return;
- sweeperRoutesResult = result;
- List site = result.getSites();
- currentLineId = result.getLineId();
- stationList.clear();
- stationList.addAll(site);
- for (int i = 0; i < stationList.size(); i++) {
- SweeperStationBean s = stationList.get(i);
-
- CallerLogger.INSTANCE.d(M_BUS + "renderBusStationsStatus--",
- "Index=" + i + " ,name = " + s.getName() + " ," + s.isLeaving() + "," + s.getDrivingStatus());
-
- // 是否正在开往下一站
- if (s.isLeaving()) {
- isGoingToNextStation = true;
- }
- // 当前站点信息
- if (s.getDrivingStatus() == STATION_STATUS_STOPPED) {
- backgroundCurrentStationIndex = i;
- break;
- }
- }
-
- SweeperStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
-
- CallerLogger.INSTANCE.d(M_BUS + TAG,
- "渲染站点信息服务端currentStationIndex=" + backgroundCurrentStationIndex
- + " isLeaving()=" + currentStation.isLeaving());
-
- //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态
- // ,订单开始站下在始发站的状态流转有问题
- if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()) {
- arriveSiteStation(true);
- }
-
- // 美化是否开始
- if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0
- && backgroundCurrentStationIndex <= stationList.size() - 1)
- && stationList.get(backgroundCurrentStationIndex).isLeaving()) {//行驶过程中设置美化
- FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
- CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(true);
- CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)");
- }
-
- if (refreshBusStationsCallback != null) {
- refreshBusStationsCallback.refreshBusStations(result.getName(), stationList
- , backgroundCurrentStationIndex, getNextStopStation(), !currentStation.isLeaving());
- }
-
- if (currentStation.isLeaving() && slidePannelHideCallback != null) {
- slidePannelHideCallback.hideSlidePanel();
- }
-
- //需放在currentStationIndex赋值之后
- SweeperTrajectoryManager.getInstance().syncTrajectoryInfo();
- }
-
- /**
- * 根据订单状态、获取下一站靠站的的站点
- *
- * @return -1 当前已是最后一个站点
- */
- private int getNextStopStation() {
- if (backgroundCurrentStationIndex >= stationList.size() - 1) {
- return -1;
- }
- int nextStationIndex = backgroundCurrentStationIndex + 1;
- for (; nextStationIndex < stationList.size() - 1; nextStationIndex++) {
- if (stationList.get(nextStationIndex).getIfStop() == 1) {
- break;
- }
- break;
- }
- return nextStationIndex;
- }
-
- /**
- * 延时查询站点信心
- */
- private void queryBusStationDelay() {
- handler.sendEmptyMessageDelayed(MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY);
- }
-
- /**
- * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
- */
- public void restartAutopilot() {
-// CallerLogger.INSTANCE.d( M_BUS + TAG, "重启自动驾驶===" + isGoingToNextStation );
-// autoDriveToNextStation( true );
- //直接开启自动驾驶
- startAutopilot(true);
- }
-
- /**
- * 播报下车乘客信息
- *
- * @param awayPassengersResponse
- */
- private void playLeavePassengersMsg(QueryLeaveAwayPassengersResponse awayPassengersResponse) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "播报下车乘客信息currentStationIndex="
- + String.valueOf(backgroundCurrentStationIndex + 1));
-
- if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) {
- return;
- }
- String station = stationList.get(backgroundCurrentStationIndex + 1).getName();
- StringBuilder builder = new StringBuilder("已到达");
- builder.append(station);
- if (!station.endsWith("站")) {
- builder.append("站");
- }
- if (awayPassengersResponse == null || awayPassengersResponse.data == null
- || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty()) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "播报下车乘客信息为null");
- } else {
- builder.append(",请尾号为 ");
- for (QueryLeaveAwayPassengersResponse.LeaveAwayPassenger leaveAwayPassenger : awayPassengersResponse.data.orders) {
- if (leaveAwayPassenger == null) {
- continue;
- }
- String tailNum = null;
- try {
- tailNum = leaveAwayPassenger.passengerPhone.substring(leaveAwayPassenger.passengerPhone.length() - 4);
- } catch (Exception e) {
- e.printStackTrace();
- tailNum = leaveAwayPassenger.passengerPhone;
- }
- builder.append(tailNum).append("。");
- }
- builder.append("的乘客下车");
- }
- builder.append(",带好随身物品,下车请注意安全");
- CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + builder.toString());
- AIAssist.getInstance(mContext).speakTTSVoice(builder.toString());
- }
-
- /**
- * 修改小巴运营状态
- */
- public void onChangeOperationStatus() {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "修改小巴运营状态");
- if (isWorking()) {//收车
- stopTakeOrder();
- } else {//出车
- startTakeOrder();
- }
- }
-
- /**
- * 行程结束
- */
- private void travelOver() {
-
- if (backgroundCurrentStationIndex >= stationList.size()) {
- CallerLogger.INSTANCE.e(M_BUS + TAG, "travel over index out of station list");
- return;
- }
- CallerLogger.INSTANCE.d(M_BUS + TAG, "单程结束====");
- CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot();
- AIAssist.getInstance(mContext).speakTTSVoice("感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见");
- leaveStation(true, true);
- }
-
- public boolean isWorking() {
- return mIsWorking;
- }
-
- /**
- * 到站
- *
- * @param data
- */
- public void onArriveAt(MessagePad.ArrivalNotification data) {
-// if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) {
-// CallerLogger.INSTANCE.e( M_BUS + TAG, "到站异常,取消后续操作结束" );
-// return;
-// }
-
- if (isArrivedStation) return;
- isArrivedStation = true;
-
- if (FunctionBuildConfig.isDemoMode && backgroundCurrentStationIndex <= stationList.size() - 1) {//到达一站结束美化
- FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
- CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);
- CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(到最后一站)");
- }
- CallerLogger.INSTANCE.d(M_BUS + TAG, "到站====currentStationIndex=" + backgroundCurrentStationIndex);
- isGoingToNextStation = false;
-
-// arriveSiteStation(false);//到站上报
- }
-
- public boolean isGoingToNextStation() {
- return isGoingToNextStation;
- }
-
- // 车机端上传心跳数据(只在出车状态时上传)
- public void runCarHeartbeat() {
- SweeperServiceManager.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
- new ISweeperServiceCallback() {
- @Override
- public void onSuccess(BaseData data) {
-
- }
-
- @Override
- public void onFail(String failMsg) {
-
- }
- });
- }
-
- private void startOrStopOrderLoop(boolean start) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start);
- if (start) {
- SweeperModelLoopManager.getInstance().startHeartbeatLoop();
- } else {
- SweeperModelLoopManager.getInstance().stopHeartbeatLoop();
- }
- }
-
- public void triggerStartServiceEvent(boolean isRestart, boolean send) {
- if (stationList == null || backgroundCurrentStationIndex >= stationList.size() - 1) {
- return;
- }
- SweeperStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
- SweeperStationBean nextStation = stationList.get(backgroundCurrentStationIndex + 1);
- SweeperAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send,
- currentStation.getName(), nextStation.getName(), currentLineId);
- }
-
- public SweeperRoutesResult getBusRoutesResult() {
- return sweeperRoutesResult;
- }
-
- public int getCurrentStationIndex() {
- return backgroundCurrentStationIndex;
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperTaskModel.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperTaskModel.java
new file mode 100644
index 0000000000..12b9f07723
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperTaskModel.java
@@ -0,0 +1,903 @@
+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;
+
+import com.amap.api.maps.model.LatLng;
+import com.elegant.network.utils.GsonUtil;
+import com.mogo.aicloud.services.socket.IMogoOnMessageListener;
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.module.status.IMogoStatusChangedListener;
+import com.mogo.commons.module.status.MogoStatusManager;
+import com.mogo.commons.module.status.StatusDescriptor;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+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;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener;
+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.CallerChassisLocationGCJ02ListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.CoordinateUtils;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager;
+import com.mogo.och.common.module.biz.common.socketmessage.data.OCHOperationalMessage;
+import com.mogo.och.common.module.biz.network.OchCommonServiceCallback;
+import com.mogo.och.common.module.callback.OchAdasStartFailureCallback;
+import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
+import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil;
+import com.mogo.och.common.module.utils.NumberFormatUtil;
+import com.mogo.och.common.module.utils.PinYinUtil;
+import com.mogo.och.common.module.utils.ToastUtilsOch;
+import com.mogo.och.common.module.voice.VoiceNotice;
+import com.mogo.och.sweeper.R;
+import com.mogo.och.sweeper.bean.BaseResponse;
+import com.mogo.och.sweeper.bean.SubInfo;
+import com.mogo.och.sweeper.bean.SweeperMainTaskBean;
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean;
+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;
+import com.mogo.och.sweeper.constant.SubTaskTypeEnum;
+import com.mogo.och.sweeper.constant.SweeperConst;
+import com.mogo.och.sweeper.constant.TaskStatusEnum;
+import com.mogo.och.sweeper.net.SweeperServiceManager;
+import com.mogo.och.sweeper.util.SweeperAnalyticsManager;
+import com.mogo.och.sweeper.util.SweeperTrajectoryManager;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import io.reactivex.exceptions.UndeliverableException;
+import io.reactivex.functions.Consumer;
+import io.reactivex.plugins.RxJavaPlugins;
+import mogo.telematics.pad.MessagePad;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/23
+ *
+ * 清扫车任务管理
+ */
+public class SweeperTaskModel {
+ private final String TAG = SweeperTaskModel.class.getSimpleName();
+ private static volatile SweeperTaskModel sInstance;
+ public double mLongitude = 0;
+ public double mLatitude = 0;
+ private Context mContext;
+ // 运营类型
+ private static final int VEHICLE_TYPE = 10;
+ private ISweeperControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
+ private ISweeperADASStatusCallback mADASStatusCallback;
+ private ISweeperTaskCallback mSweeperTaskCallback;
+ ArrayList points = new ArrayList<>();//全路径信息
+ //当前子任务详情信息包括轨迹文件信息
+ private SweeperSubTaskDetailBean mCurrentSubTaskDetail;
+ //子任务是否正在进行中
+ private boolean mIsSubTaskWorking = false;
+ //自动驾驶是否到达子任务终点
+ private boolean isAutopilotSubTaskArriveEndSite = false;
+ //当前子任务id
+ private int mSubTaskId = 0;
+ //当前是否最后一个子任务
+ private boolean mIsLastSubtask = false;
+ //当前任务是否是第一个
+ private boolean mIsFirstSubtask = false;
+ //当前任务是否是第一个
+ private int mSubTaskType = 0; //1自动驾驶 2.人工驾驶
+ //0: 代表没有启动过 1代表是启动第一次,当>=1 代表是重试 每次子任务结束/主任务结束清空置为0
+ private volatile int firstStartAutopilot = 0;
+ private int mLineId;//路线id
+ //自动驾驶状态
+ private int mAutopilotState = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE;
+
+ public static SweeperTaskModel getInstance() {
+ if (sInstance == null) {
+ synchronized (SweeperTaskModel.class) {
+ if (sInstance == null) {
+ sInstance = new SweeperTaskModel();
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ private SweeperTaskModel() {
+
+ }
+
+ public void init() {
+ mContext = AbsMogoApplication.getApp();
+ // 定位监听
+ CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, mMapLocationListener);
+
+ MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ //自动驾驶路线规划接口
+ CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener);
+
+ //开启自驾后 异常信息返回
+ OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener);
+
+ OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(
+ OCHSocketMessageManager.msgMonitorType,
+ mMogoOnMessageListener);
+
+ //2022.1.28
+ // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
+ // The exception could not be delivered to the consumer because it has already canceled/disposed
+ // the flow or the excTeption has nowhere to go to begin with
+ RxJavaPlugins.setErrorHandler(new Consumer() {
+ @Override
+ public void accept(Throwable e) {
+ if (e instanceof UndeliverableException) {
+ e = e.getCause();
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "UndeliverableException");
+ }
+ if ((e instanceof IOException)) {//
+ // fine, irrelevant network problem or API that throws on cancellation
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "IOException");
+ return;
+ }
+ if (e instanceof InterruptedException) {
+ // fine, some blocking code was interrupted by a dispose call
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "InterruptedException");
+ return;
+ }
+ if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
+ // that's likely a bug in the application
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "NullPointerException or IllegalArgumentException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ if (e instanceof IllegalStateException) {
+ // that's a bug in RxJava or in a custom operator
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "IllegalStateException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "Undeliverable exception");
+ }
+ });
+ }
+
+ public void setAdasStatusCallback(ISweeperADASStatusCallback callback) {
+ this.mADASStatusCallback = callback;
+ }
+
+ public void setControllerStatusCallback(ISweeperControllerStatusCallback callback) {
+ this.mControllerStatusCallback = callback;
+ }
+
+ public void setSweeperTaskCallback(ISweeperTaskCallback callback) {
+ this.mSweeperTaskCallback = callback;
+ }
+
+ private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener() {
+
+ @Override
+ public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) {
+ if (null != routeList && routeList.getWayPointsList()!=null&&routeList.getWayPointsList().size() > 0) {
+ if (mCurrentSubTaskDetail.getLineId() != mLineId) {//判断是否同一条路线
+ mLineId = mCurrentSubTaskDetail.getLineId();
+ points.addAll(coordinateConverterWgsToGcjList(mContext, routeList.getWayPointsList()));
+ if (mSweeperTaskCallback != null) {
+ mSweeperTaskCallback.setRouteList(points);
+ }
+ }
+ }
+ }
+
+ };
+
+ public void setSubtask(boolean isFirstSubtask, boolean isLastSubtask, int subTaskId, int subTaskType) {
+ this.mIsLastSubtask = isLastSubtask;
+ this.mIsFirstSubtask = isFirstSubtask;
+ this.mSubTaskId = subTaskId;
+ this.mSubTaskType = subTaskType;
+ }
+
+ /**
+ * 清除路线缓存数据
+ */
+ public void clearRouteList() {
+ points.clear();
+ mSubTaskType=0;
+ }
+
+ /**
+ * 保存自动驾驶状态
+ *
+ * @param autopilotState
+ */
+ public void setAutopilotState(int autopilotState) {
+ this.mAutopilotState = autopilotState;
+ }
+
+ public static List coordinateConverterWgsToGcjList(Context mContext,
+ List mogoLatLngList) {
+ List points = new ArrayList<>();
+ for (MessagePad.Location m : mogoLatLngList) {
+ LatLng mogoLatLng = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(mContext, m);
+ SweeperRoutePlanningUpdateReqBean.Result result = new SweeperRoutePlanningUpdateReqBean.Result();
+ result.latitude = mogoLatLng.latitude;
+ result.longitude = mogoLatLng.longitude;
+ points.add(result);
+ }
+ return points;
+ }
+
+ public void release() {
+ MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+ // 注销定位监听
+ CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG);
+ //自动驾驶路线规划接口
+ CallerPlanningRottingListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
+ OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null);
+ }
+
+ private Object readResolve() {
+ // 阻止反序列化,必须实现 Serializable 接口
+ return sInstance;
+ }
+
+ private final IMogoOnMessageListener mMogoOnMessageListener =
+ new IMogoOnMessageListener() {
+ @Override
+ public Class target() {
+ return OCHOperationalMessage.class;
+ }
+
+ @Override
+ public void onMsgReceived(OCHOperationalMessage obj) {
+ if (obj == null) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onMsgReceived = null");
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onMsgReceived = " + obj.getMessage());
+ OCHSocketMessageManager.INSTANCE.pushAppOperationalMsgBox(obj.getPushTimeStamp(),
+ obj.getMessage());
+ }
+ };
+
+ private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
+ // VR mode变更回调
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (StatusDescriptor.VR_MODE == descriptor) {
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ };
+
+ private final OchAdasStartFailureCallback mAdasStartFailureListener = new OchAdasStartFailureCallback() {
+ @Override
+ public void onStartAutopilotFailure(@NotNull String startFailedCode, @NonNull String startFailedMessage) {
+ SweeperAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage);
+ if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode) {
+ CallerLogger.INSTANCE.e(M_SWEEPER + TAG, "mAdasStartFailureListener = " + startFailedMessage);
+ mADASStatusCallback.onStartAdasFailure();
+ }
+ }
+ };
+
+ // 自车定位
+ private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() {
+ @Override
+ public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) {
+ if (null == gnssInfo) return;
+ Log.d(M_SWEEPER + TAG, "高德定位到站:mLongitude = " + gnssInfo.getLongitude()
+ + ", mLatitude=" + gnssInfo.getLatitude() + ", mSubTaskType=" + mSubTaskType + ", mIsSubTaskWorking=" + mIsSubTaskWorking
+ + ", isAutopilotSubTaskArriveEndSite=" + isAutopilotSubTaskArriveEndSite
+ );
+ CallerLogger.INSTANCE.e(M_SWEEPER + TAG, "高德定位到站:mLongitude = " + gnssInfo.getLongitude()
+ + ", mLatitude=" + gnssInfo.getLatitude() + ", mSubTaskType=" + mSubTaskType +", mIsSubTaskWorking=" + mIsSubTaskWorking
+ + ", isAutopilotSubTaskArriveEndSite=" + isAutopilotSubTaskArriveEndSite
+ );
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onCarLocationChanged(gnssInfo);
+ }
+ if (SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.getCode() == mSubTaskType) {//人工驾驶子任务需要手动跳过,不能自动结束
+ addCoordinates(gnssInfo);
+ return;
+ }
+ //子任务完成的围栏判断 子任务正在执行中,还未到达子任务终点
+ if (mIsSubTaskWorking && !isAutopilotSubTaskArriveEndSite) {
+ judgeArrivedStation(gnssInfo);
+ }
+ }
+ };
+
+ /**
+ * 根据当前定位收集人工驾驶子任务轨迹点
+ *
+ * @param mogoLatLng
+ */
+ private void addCoordinates(MogoLocation mogoLatLng) {
+ String tempLongitude = NumberFormatUtil.cutOutNumber(mogoLatLng.getLongitude(), 5);
+ String tempLatitude = NumberFormatUtil.cutOutNumber(mogoLatLng.getLatitude(), 5);
+ //用于过滤车是否停在原地,经纬度相同的情况
+ if (!tempLongitude.equals(mLongitude) && !tempLatitude.equals(mLatitude)) {
+ mLongitude = mogoLatLng.getLongitude();
+ mLatitude = mogoLatLng.getLatitude();
+ SweeperRoutePlanningUpdateReqBean.Result result = new SweeperRoutePlanningUpdateReqBean.Result();
+ result.latitude = mogoLatLng.getLatitude();
+ result.longitude = mogoLatLng.getLongitude();
+ points.add(result);
+ if (mSweeperTaskCallback != null) {
+ mSweeperTaskCallback.setRouteList(points);
+ }
+ }
+ }
+
+ //根据围栏判断,是否到达子任务终点
+ private void judgeArrivedStation(MogoLocation location) {
+ if (mCurrentSubTaskDetail == null) {
+ Log.d(TAG, "行程日志-judgeArrivedStation() mCurrentSubTaskDetail is null");
+ CallerLogger.INSTANCE.d(TAG, "行程日志-judgeArrivedStation() mCurrentSubTaskDetail is null");
+ return;
+ }
+ double endSiteLon = mCurrentSubTaskDetail.getEndSiteLon();
+ double endSiteLat = mCurrentSubTaskDetail.getEndSiteLat();
+ double distance = CoordinateUtils.calculateLineDistance(
+ endSiteLon, endSiteLat,
+ location.getLongitude(), location.getLatitude());
+ if (distance <= SweeperConst.ARRIVE_AT_END_STATION_DISTANCE) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "行程日志-judgeArrivedStation() distance = " + distance
+ + " to " + mCurrentSubTaskDetail.getEndSiteName());
+ Log.d(TAG, "行程日志-judgeArrivedStation() distance = " + distance
+ + " to " + mCurrentSubTaskDetail.getEndSiteName());
+ isAutopilotSubTaskArriveEndSite = true;
+ //到达子任务终点 结束子任务
+ subTaskEnd(mIsFirstSubtask, mIsLastSubtask, mSubTaskId); //无自动驾驶到终点信息传null
+ return;
+ }
+ }
+
+ /**
+ * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
+ */
+ public void startAutopilot() {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "行程日志-重启自动驾驶===" + mIsSubTaskWorking);
+ //只去启动自动驾驶
+ startAutopilot(firstStartAutopilot >= 1);
+ }
+
+ /**
+ * 开启自动驾驶
+ *
+ * @param isRestart
+ */
+ private void startAutopilot(boolean isRestart) {
+ if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) {
+ ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() +
+ ", 请稍候重试");
+ triggerUnableStartAPReasonEvent();
+ return;
+ }
+ firstStartAutopilot++;
+ triggerStartServiceEvent(isRestart, false);
+ AutopilotControlParameters parameters = initAutopilotControlParameters();
+ if (null == parameters) {
+ CallerLogger.INSTANCE.e(M_SWEEPER + TAG, "行程日志-AutopilotControlParameters is empty.");
+ return;
+ }
+ CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters);
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters)
+ + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName +
+ "isRestart = " + isRestart);
+
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.startOpenAutopilot();
+ }
+ }
+
+ /**
+ * 获取任务子任务执行状态
+ */
+ public boolean getSubWorking() {
+ return mIsSubTaskWorking;
+ }
+
+ public void setWorking(Boolean isWorking) {
+ this.mIsSubTaskWorking = isWorking;
+ }
+
+ /**
+ * 关闭美化模式
+ */
+ public void closeBeautificationMode() {
+ if (FunctionBuildConfig.isDemoMode) {
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; //是否强制绘制引导线
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);//是否自动启动自驾
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "美化模式-ignore:置为false");
+ }
+ }
+
+ /**
+ * 开启美化模式
+ */
+ public void startBeautificationMode() {
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;//是否强制绘制引导线
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(true);//是否自动启动自驾
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "美化模式-ignore:置为true");
+ }
+
+ /**
+ * @param data
+ */
+ public void onArriveTaskEnd(MessagePad.ArrivalNotification data) {
+ //MAP 280 每隔100ms左右返回一次到站, 导致在到达中间站后再次滑动出发后会有时间差,收到一次到站,出现问题
+ //此处比对 自驾告诉的子任务终点坐标和本地应到子任务终点坐标, 一致时才表示子任务完成
+ if (data != null && data.getEndLocation() != null && mCurrentSubTaskDetail != null) {
+ Log.d(M_SWEEPER + TAG, "MAP到站通知:" + mCurrentSubTaskDetail.getEndSiteName() + " 经度:"
+ + data.getEndLocation().getLongitude() + " 纬度:" + data.getEndLocation().getLatitude());
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "MAP到站通知:" + mCurrentSubTaskDetail.getEndSiteName() + " 经度:"
+ + data.getEndLocation().getLongitude() + " 纬度:" + data.getEndLocation().getLatitude());
+ String latitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLatitude(), 5); //wgs
+ String longitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLongitude(), 5);
+ String arriveLat = NumberFormatUtil.cutOutNumber(mCurrentSubTaskDetail.getEndSiteWgs64Lat(), 5);
+ String arriveLon = NumberFormatUtil.cutOutNumber(mCurrentSubTaskDetail.getEndSiteWgs64Lon(), 5);
+ if (!latitude.equals(arriveLat) || !longitude.equals(arriveLon)) {
+ CallerLogger.INSTANCE.e(M_SWEEPER + TAG, "行程日志-子任务终点拦截,自动子任务终点与本地子任务终点不一致");
+ return;
+ }
+ }
+ Log.d(M_SWEEPER + TAG, "MAP到站通知:mSubTaskType=" + mSubTaskType + " isAutopilotSubTaskArriveEndSite="
+ + isAutopilotSubTaskArriveEndSite + " mSubTaskId=" + mSubTaskId);
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "MAP到站通知:mSubTaskType=" + mSubTaskType + " isAutopilotSubTaskArriveEndSite="
+ + isAutopilotSubTaskArriveEndSite + " mSubTaskId=" + mSubTaskId);
+ if (SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.getCode() == mSubTaskType) {//人工驾驶子任务需要手动跳过,不能自动结束
+ return;
+ }
+ if (isAutopilotSubTaskArriveEndSite) {
+ return;
+ }
+ isAutopilotSubTaskArriveEndSite = true;
+ //到达子任务终点 结束子任务
+ subTaskEnd(mIsFirstSubtask, mIsLastSubtask, mSubTaskId);
+ }
+
+ public void triggerStartServiceEvent(boolean isRestart, boolean send) {
+ if (mCurrentSubTaskDetail == null) {
+ return;
+ }
+ SweeperAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send,
+ mCurrentSubTaskDetail.getStartSiteName(), mCurrentSubTaskDetail.getEndSiteName(), mCurrentSubTaskDetail.getLineId());
+ }
+
+ public boolean isRestartAutopilot() {
+ return firstStartAutopilot > 1;
+ }
+
+ public void triggerUnableStartAPReasonEvent() {
+ if (mCurrentSubTaskDetail == null) {
+ return;
+ }
+ SweeperAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent(
+ mCurrentSubTaskDetail.getStartSiteName(), mCurrentSubTaskDetail.getEndSiteName(), mCurrentSubTaskDetail.getLineId(),
+ OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason());
+ }
+
+ /**
+ * 将轨迹文件信息同步到鹰眼
+ */
+ private void updateAutopilotControlParameters() {
+
+ AutopilotControlParameters parameters = initAutopilotControlParameters();
+ if (null == parameters) {
+ CallerLogger.INSTANCE.e(M_SWEEPER + TAG, "AutopilotControlParameters is empty.");
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "AutopilotControlParameters" + GsonUtil.jsonFromObject(parameters));
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "AutopilotControlParameters is update.");
+ CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters);
+ }
+
+ private void clearAutopilotControlParameters() {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "AutopilotControlParameters is clear.");
+ CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null);
+ }
+
+ private AutopilotControlParameters initAutopilotControlParameters() {
+ AutopilotControlParameters parameters = new AutopilotControlParameters();
+ if (mCurrentSubTaskDetail != null) {
+ parameters.routeID = mCurrentSubTaskDetail.getLineId();
+ parameters.routeName = mCurrentSubTaskDetail.getLineName();
+ parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentSubTaskDetail.getStartSiteName());
+ parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentSubTaskDetail.getEndSiteName());
+ parameters.startLatLon = new AutopilotControlParameters
+ .AutoPilotLonLat(mCurrentSubTaskDetail.getStartSiteWgs64Lat(), mCurrentSubTaskDetail.getStartSiteWgs64Lon());
+ parameters.endLatLon = new AutopilotControlParameters
+ .AutoPilotLonLat(mCurrentSubTaskDetail.getEndSiteWgs64Lat(), mCurrentSubTaskDetail.getEndSiteWgs64Lon());
+ parameters.vehicleType = VEHICLE_TYPE;
+ parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine(
+ mCurrentSubTaskDetail.getLineId(),
+ mCurrentSubTaskDetail.getCsvFileUrl(), mCurrentSubTaskDetail.getCsvFileMd5(),
+ mCurrentSubTaskDetail.getTxtFileUrl(), mCurrentSubTaskDetail.getTxtFileMd5(),
+ mCurrentSubTaskDetail.getPublishTime(), mCurrentSubTaskDetail.getCarModel(),
+ mCurrentSubTaskDetail.getCsvFileUrlDPQP(), mCurrentSubTaskDetail.getCsvFileMd5DPQP(),
+ mCurrentSubTaskDetail.getTxtFileUrlDPQP(), mCurrentSubTaskDetail.getTxtFileMd5DPQP(),
+ mCurrentSubTaskDetail.getPublishTimeDPQP());
+ }
+ return parameters;
+ }
+
+ /**
+ * 获取当前正在执行的任务
+ */
+ public void getCurrentTask() {
+ SweeperServiceManager.getCurrentTask(mContext, new OchCommonServiceCallback>() {
+ @Override
+ public void onSuccess(BaseResponse data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getCurrentTask:" + GsonUtil.jsonFromObject(data));
+ if (mSweeperTaskCallback != null && data != null) {
+ SweeperSubTaskBean sweeperSubTaskBean = data.getData();
+ if (sweeperSubTaskBean != null && sweeperSubTaskBean.getSubList() != null && sweeperSubTaskBean.getSubList().size() > 0) {
+ mSweeperTaskCallback.setSubTaskBean(sweeperSubTaskBean, true);
+ } else {
+ getMainTaskList(false);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * 获取主任务列表
+ */
+ public void getMainTaskList(boolean refresh) {
+ SweeperServiceManager.getMainTaskList(mContext, new OchCommonServiceCallback>>() {
+ @Override
+ public void onSuccess(BaseResponse> data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getMainTaskList:" + GsonUtil.jsonFromObject(data));
+ if (mSweeperTaskCallback != null && data != null && data.getCode() == 0) {
+ List list = data.getData();
+ mSweeperTaskCallback.setMainTaskList(list, refresh);
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+ });
+ }
+
+ /**
+ * 获取子任务列表
+ */
+ public void getSubTaskList(int taskId, SweeperSubTaskBean sweeperSubTaskBean) {
+ SweeperServiceManager.getSubTaskList(taskId, mContext, new OchCommonServiceCallback>>() {
+ @Override
+ public void onSuccess(BaseResponse> data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getSubTaskList:" + GsonUtil.jsonFromObject(data));
+ if (mSweeperTaskCallback != null && data != null && data.getCode() == 0) {
+ List list = data.getData();
+ if (list != null && list.size() > 0) {
+ sweeperSubTaskBean.setSubList(list);
+ mSweeperTaskCallback.setSubTaskBean(sweeperSubTaskBean, false);
+ } else {
+ getMainTaskList(false);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+ });
+ }
+
+ /**
+ * 获取子任务详情包括轨迹文件信息
+ */
+ public void getSubTaskDetail(boolean isFirst, boolean isEnd, int subTaskId, SubTaskTypeEnum subTaskType, boolean isStartSubtask) {
+ SweeperServiceManager.getSubTaskDetail(subTaskId, mContext, new OchCommonServiceCallback>() {
+ @Override
+ public void onSuccess(BaseResponse data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getSubTaskDetail:" + GsonUtil.jsonFromObject(data));
+ Log.d(M_SWEEPER + TAG, "getSubTaskDetail:" + GsonUtil.jsonFromObject(data));
+ if (data != null) {
+ mCurrentSubTaskDetail = data.getData();
+ if (mCurrentSubTaskDetail != null) {
+ mSweeperTaskCallback.setSubTakDetail(mCurrentSubTaskDetail, subTaskType);
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getSubTaskDetail:subTaskType=" + subTaskType
+ + ", isStartSubtask=" + isStartSubtask + ", mAutopilotState=" + mAutopilotState);
+ Log.d(M_SWEEPER + TAG, "getSubTaskDetail:subTaskType=" + subTaskType
+ + ", isStartSubtask=" + isStartSubtask + ", mAutopilotState=" + mAutopilotState);
+ if (subTaskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE) {//自动驾驶子任务
+ //向自动驾驶发送要下载文件轨迹路径
+ SweeperTrajectoryManager.getInstance().syncTrajectoryInfo(mCurrentSubTaskDetail);
+ updateAutopilotControlParameters();
+ // 不在启动驾驶状态也需要先开启子任务
+ if (isStartSubtask) {//是否需要自动开始执行任务
+ subTaskStart(isFirst, isEnd, subTaskId, subTaskType);
+ if (mAutopilotState == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ cancelAutoPilot();
+ startAutopilot();
+
+ //提示必须是N档,且拉起手刹 才能进入自动驾驶
+ VoiceNotice.showNotice(mContext.getString(R.string.sweeper_arrive_auto_start_next_subtask_tips));
+ ToastUtils.showLong(mContext.getString(R.string.sweeper_arrive_auto_start_next_subtask_tips));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+ });
+ }
+
+ /**
+ * 子任务开始上报
+ */
+ public void subTaskStart(boolean isFirst, boolean isEnd, int subTaskId, SubTaskTypeEnum subTaskType) {
+ SweeperServiceManager.subTaskStart(isFirst, isEnd, subTaskId, mContext, new OchCommonServiceCallback>() {
+ @Override
+ public void onSuccess(BaseResponse data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "subTaskStart:" + GsonUtil.jsonFromObject(data));
+ if (mSweeperTaskCallback != null && data != null) {
+ if (data.getData()) {
+ mIsSubTaskWorking = true;
+ isAutopilotSubTaskArriveEndSite = false;
+ mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.START_SUBTASK, false);
+ if (subTaskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE) {//如果是自动驾驶子任务子开启自驾
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ SweeperTaskModel.getInstance().startBeautificationMode();
+ }
+ //ÏstartAutopilot(false);
+ } else {
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;//是否强制绘制引导线
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);//是否自动启动自驾
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+ });
+ }
+
+ /**
+ * 子任务结束上报
+ */
+ public void subTaskEnd(boolean isFirst, boolean isEnd, int subTaskId) {
+ SweeperServiceManager.subTaskEnd(isFirst, isEnd, subTaskId, mContext, new OchCommonServiceCallback>() {
+ @Override
+ public void onSuccess(BaseResponse data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "subTaskEnd:" +
+ String.format("isFirst=%b; isEnd=%b; ", isFirst, isEnd) + GsonUtil.jsonFromObject(data));
+ if (data != null) {
+ if (data.getData()) {
+ mIsSubTaskWorking = false;
+ if (mSweeperTaskCallback != null) {
+ mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.END_SUBTASK, isEnd);
+ }
+ if (isEnd) {
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ SweeperTaskModel.getInstance().closeBeautificationMode();
+ }
+ clearAutopilotControlParameters();
+ //结束自动驾驶
+ cancelAutoPilot();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ if (isAutopilotSubTaskArriveEndSite) return;
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+
+ }
+ });
+ }
+
+ /**
+ * 子任务跳过上报
+ */
+ public void subTaskSkip(boolean isFirst, boolean isEnd, int subTaskId) {
+ SweeperServiceManager.subTaskSkip(isFirst, isEnd, subTaskId, mContext, new OchCommonServiceCallback>() {
+ @Override
+ public void onSuccess(BaseResponse data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "subTaskSkip:" +
+ String.format("isFirst=%b; isEnd=%b; ", isFirst, isEnd)+ GsonUtil.jsonFromObject(data));
+ if (mSweeperTaskCallback != null && data != null) {
+ if (data.getData()) {
+ mIsSubTaskWorking = false;
+ // 跳过子任务也相当于开始并结束一个子任务,相关变量状态需要重置
+ isAutopilotSubTaskArriveEndSite = false;
+ mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.JUMP_OVER_SUBTASK, isEnd);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+ });
+ }
+
+ /**
+ * 主任务重置
+ */
+ public void mainTaskReset(int taskId) {
+ SweeperServiceManager.mainTaskReset(taskId, mContext, new OchCommonServiceCallback>() {
+ @Override
+ public void onSuccess(BaseResponse data) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "mainTaskReset:" + GsonUtil.jsonFromObject(data));
+ // 主任务重置 当前子任务也需重置
+ mIsSubTaskWorking = false;
+ isAutopilotSubTaskArriveEndSite = false;
+ if (mSweeperTaskCallback != null && data != null) {
+ mSweeperTaskCallback.setMainTaskReset(data.getData());
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ if (ToastUtilsOch.isCustomFastClick(5000)) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ } else {
+ ToastUtils.showShort(msg);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+ });
+ }
+
+ //结束自动驾驶
+ public void cancelAutoPilot() {
+ CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot();
+ }
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java
index db8c6b3264..5522f00dae 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperApiService.java
@@ -1,14 +1,13 @@
package com.mogo.och.sweeper.net;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.och.sweeper.bean.SweeperOperationStatusRequest;
-import com.mogo.och.sweeper.bean.SweeperQueryLinesResponse;
-import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean;
-import com.mogo.och.sweeper.bean.SweeperRoutesResponse;
-import com.mogo.och.sweeper.bean.CarHeartbeatReqBean;
-import com.mogo.och.sweeper.bean.SweeperQueryLineStationsRequest;
-import com.mogo.och.sweeper.bean.SweeperOperationStatusResponse;
-import com.mogo.och.sweeper.bean.SweeperResetDrivingLineRequest;
-import com.mogo.och.sweeper.bean.SweeperUpdateSiteStatusRequest;
+import com.mogo.och.sweeper.bean.BaseResponse;
+import com.mogo.och.sweeper.bean.SubInfo;
+import com.mogo.och.sweeper.bean.SubStartRequest;
+import com.mogo.och.sweeper.bean.SweeperSubTaskBean;
+import com.mogo.och.sweeper.bean.SweeperMainTaskBean;
+import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean;
+
+import java.util.List;
+import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.Body;
@@ -17,101 +16,88 @@ import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
+import retrofit2.http.QueryMap;
/**
- * 小巴车相关接口
- *
- * @author tongchenfei
- *
- * wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072
+ * 清扫车相关接口
*/
public interface ISweeperApiService {
/**
- * 根据车机坐标获取所在区域全部站点信息
- *
- * @param request 请求参数
- * @return 接口返回数据
- */
- @Headers( {"Content-Type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/line/v2/driver/bus/lineDataWithDriver/query" )
- Observable querySiteByCoordinate(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweeperQueryLineStationsRequest request);
-
- /**
- * 重置巴士路线: 点击小巴车tab 或者出车后会使用
- *
- * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的
- * @return 返回值是重置后的车站列表
- */
- @Headers( {"Content-Type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/car/v2/driver/bus/drivingLine/reset" )
- Observable resetStationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweeperResetDrivingLineRequest request);
-
- /**
- * 离站,通知服务器
- * @param request
- * @return
- */
- @Headers({"Content-Type:application/json;charset=UTF-8"})
- @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away")
- Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweeperUpdateSiteStatusRequest request);
-
- /**
- * 到站 更新到站信息
- * @param request
- * @return
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
- @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/attachSite")
- Observable< BaseData > arriveSiteStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body SweeperUpdateSiteStatusRequest request);
-
- /**
- * 出车
- * @param request
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST("/autopilot-car-hailing/car/v2/driver/bus/startTakeOrder")
- Observable startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body SweeperOperationStatusRequest request);
-
- /**
- * 收车
- * @param request
- * @return
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
- @POST("/autopilot-car-hailing/car/v2/driver/bus/stopTakeOrder")
- Observable stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body SweeperOperationStatusRequest request);
-
- /**
- * 查询小巴出车/收车状态
- * @param sn
- * @return
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
- @GET("/autopilot-car-hailing/car/v2/driver/bus/takeOrderStatus/query")
- Observable queryOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
-
- /**
- * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/location/v2/driver/bus/heartbeat" )
- Observable runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket,@Body CarHeartbeatReqBean data);
-
- /**
- * 查询车辆配置的所有路线
+ * 获取当前正在执行的任务
* @param appId
* @param ticket
- * @param sn
+ * @param carSn
* @return
*/
- @GET("/autopilot-car-hailing/line/v2/driver/bus/bindLine/query")
- Observable queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
+ @GET("/och-sweep/api/task/v1/currentTask")
+ Observable> getCurrentTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("carSn") String carSn);
+ /**
+ * 清扫车任务列表
+ * @param appId
+ * @param ticket
+ * @param carSn
+ * @return
+ */
+ @GET("/och-sweep/api/task/v1/mainTaskList")
+ Observable>> getMainTaskList(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("carSn") String carSn);
+ /**
+ * 清扫车子任务列表
+ * @param appId
+ * @param ticket
+ * @param map
+ * @return
+ */
+ @GET("/och-sweep/api/task/v1/subTaskList")
+ Observable>> getSubTaskList(@Header ("appId") String appId, @Header("ticket") String ticket, @QueryMap Map map);
+ /**
+ * 子任务详情 包括子任务轨迹信息
+ * @param appId
+ * @param ticket
+ * @param map
+ * @return
+ */
+ @GET("/och-sweep/api/task/v1/subTaskInfo")
+ Observable> getSubTaskDetail(@Header ("appId") String appId, @Header("ticket") String ticket, @QueryMap Map map);
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" )
- Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweeperRoutePlanningUpdateReqBean data);
+ /**
+ * 子任务开始
+ * @param appId
+ * @param ticket
+ * @param subStartRequest
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/och-sweep/api/task/v1/subTaskStart")
+ Observable> subTaskStart(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SubStartRequest subStartRequest);
+
+ /**
+ * 子任务结束
+ * @param appId
+ * @param ticket
+ * @param subStartRequest
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/och-sweep/api/task/v1/subTaskEnd")
+ Observable> subTaskEnd(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SubStartRequest subStartRequest);
+ /**
+ * 子任务跳过
+ * @param appId
+ * @param ticket
+ * @param subStartRequest
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/och-sweep/api/task/v1/subTaskSkip")
+ Observable> subTaskSkip(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SubStartRequest subStartRequest);
+
+ /**
+ * 主任务重置
+ * @param appId
+ * @param ticket
+ * @return
+ */
+ @GET("/och-sweep/api/task/v1/mainTaskReset")
+ Observable> mainTaskReset(@Header ("appId") String appId, @Header("ticket") String ticket,@QueryMap Map map);
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperServiceCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperServiceCallback.java
deleted file mode 100644
index 0a57b49d1e..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/ISweeperServiceCallback.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.mogo.och.sweeper.net;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/20
- */
-public interface ISweeperServiceCallback< T >{
- void onSuccess(T o);
-
- void onFail(String failMsg);
-
- default void onError() {
-
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.java
deleted file mode 100644
index ca1bc2552f..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.java
+++ /dev/null
@@ -1,225 +0,0 @@
-package com.mogo.och.sweeper.net;
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-
-import android.content.Context;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.eagle.core.network.MoGoRetrofitFactory;
-import com.mogo.eagle.core.network.RequestOptions;
-import com.mogo.eagle.core.network.SubscribeImpl;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.och.common.module.biz.constant.OchCommonConst;
-import com.mogo.och.sweeper.bean.SweeperQueryLinesResponse;
-import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean;
-import com.mogo.och.sweeper.bean.SweeperRoutesResponse;
-import com.mogo.och.sweeper.bean.CarHeartbeatReqBean;
-import com.mogo.och.sweeper.bean.SweeperOperationStatusRequest;
-import com.mogo.och.sweeper.bean.SweeperOperationStatusResponse;
-import com.mogo.och.sweeper.bean.SweeperQueryLineStationsRequest;
-import com.mogo.och.sweeper.bean.SweeperResetDrivingLineRequest;
-import com.mogo.och.sweeper.bean.SweeperUpdateSiteStatusRequest;
-import com.mogo.och.sweeper.model.SweeperOrderModel;
-
-import java.util.List;
-
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/20
- */
-public class SweeperServiceManager {
-
- private static final String TAG = SweeperServiceManager.class.getSimpleName();
-
- private final ISweeperApiService mService;
-
- private static final class SingletonHolder {
- private static final SweeperServiceManager INSTANCE = new SweeperServiceManager();
- }
-
- public static SweeperServiceManager getInstance(){
- return SingletonHolder.INSTANCE;
- }
-
- private SweeperServiceManager(){
- mService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(ISweeperApiService.class);
- }
-
- /**
- * 查询小巴车线路
- * @param context
- * @param callback
- */
- public void queryBusRoutes(Context context, ISweeperServiceCallback callback) {
- //获取当前高德坐标
-
- mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- , new SweeperQueryLineStationsRequest(SweeperOrderModel.getInstance().mLongitude
- , SweeperOrderModel.getInstance().mLatitude,true))
- .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() )
- .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate"));
- }
-
- /**
- * 重置线路站点
- * @param context
- * @param lineId
- * @param callback
- */
- public void resetStationStatus(Context context, int lineId, ISweeperServiceCallback callback){
- mService.resetStationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),new SweeperResetDrivingLineRequest(lineId))
- .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus"));
- }
-
- /**
- * 离站上报
- * @param context
- * @param seq
- * @param siteId
- * @param callback
- */
- public void leaveStation(Context context, int seq, int siteId, ISweeperServiceCallback callback){
- mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new SweeperUpdateSiteStatusRequest(seq,siteId, SweeperOrderModel.getInstance().mLongitude
- , SweeperOrderModel.getInstance().mLatitude))
- .subscribeOn( Schedulers.io() )
- .observeOn( AndroidSchedulers.mainThread() )
- .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
- }
-
- /**
- * 到站更新站点状态
- * @param context
- * @param seq
- * @param siteId
- * @param callback
- */
- public void arriveSiteStation(Context context, int seq, int siteId, ISweeperServiceCallback callback){
- mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new SweeperUpdateSiteStatusRequest(seq,siteId
- , SweeperOrderModel.getInstance().mLongitude, SweeperOrderModel.getInstance().mLatitude))
- .subscribeOn( Schedulers.io() )
- .observeOn( AndroidSchedulers.mainThread() )
- .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
- }
-
- /**
- * 收车
- * @param context
- * @param callback
- */
- public void stopTakeOrder(Context context, ISweeperServiceCallback callback){
- mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new SweeperOperationStatusRequest(SweeperOrderModel.getInstance().mLongitude
- , SweeperOrderModel.getInstance().mLatitude))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder"));
- }
-
- /**
- * 出车
- * @param context
- * @param callback
- */
- public void startTakeOrder(Context context, ISweeperServiceCallback callback){
- mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new SweeperOperationStatusRequest(SweeperOrderModel.getInstance().mLongitude
- , SweeperOrderModel.getInstance().mLatitude))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"startTakeOrder"));
- }
-
- /**
- * 查询出车/收车状态
- * @param context
- * @param callback
- */
- public void queryOperationStatus(Context context, ISweeperServiceCallback callback){
- mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
- .subscribeOn( Schedulers.io() )
- .observeOn( AndroidSchedulers.mainThread() )
- .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus"));
- }
-
-
- public void queryBusLines(Context context, ISweeperServiceCallback callback){
- mService.queryBusLines(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"queryBusLines"));
- }
-
- public void updateOrderRoute(Context context,int lineId, int startSiteId, int endSiteId
- , List< SweeperRoutePlanningUpdateReqBean.Result > points
- , ISweeperServiceCallback callback){
- mService.updateOrderRoute(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new SweeperRoutePlanningUpdateReqBean(MoGoAiCloudClientConfig.getInstance().getSn()
- ,lineId,startSiteId,endSiteId, points))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"updateOrderRoute"));
- }
-
- /**
- * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
- * @param context
- * @param lon
- * @param lat
- * @param callback
- */
- public void runCarHeartbeat(Context context, double lon, double lat,
- ISweeperServiceCallback callback) {
- mService.runCarHeartbeat(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),new CarHeartbeatReqBean(
- MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
- }
-
- private SubscribeImpl getSubscribeImpl(Context context, ISweeperServiceCallback callback, String apiName){
- return new SubscribeImpl(RequestOptions.create(context)){
- @Override
- public void onSuccess(T o) {
- super.onSuccess(o);
- CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onSuccess() " + o.msg);
- if (callback != null) {
- callback.onSuccess(o);
- }
- }
-
- @Override
- public void onError(String message, int code) {
- super.onError(message, code);
- CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +"msg="+ message+" code="+code);
- if (callback != null) {
- callback.onFail("msg="+ message+" code="+code);
- }
- }
-
- @Override
- public void onError(Throwable e) {
- super.onError(e);
- CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +" e="+e.getMessage());
- if (callback != null) {
- callback.onFail(e.getMessage());
- }
- }
- };
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.kt
new file mode 100644
index 0000000000..47b5f6d498
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/net/SweeperServiceManager.kt
@@ -0,0 +1,173 @@
+package com.mogo.och.sweeper.net
+
+import android.content.Context
+import com.elegant.network.utils.GsonUtil
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig
+import com.mogo.eagle.core.network.MoGoRetrofitFactory
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
+import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
+import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl
+import com.mogo.och.common.module.biz.network.interceptor.transformTry
+import com.mogo.och.sweeper.bean.*
+import com.mogo.och.sweeper.constant.SweeperConst.Companion.getBaseUrl
+import com.mogo.och.sweeper.model.SweeperTaskModel
+
+object SweeperServiceManager {
+ private val TAG = SweeperTaskModel::class.java.simpleName
+ private val mService: ISweeperApiService = MoGoRetrofitFactory.getInstance(getBaseUrl()).create(
+ ISweeperApiService::class.java
+ )
+
+ /**
+ * 获取当前正在执行的任务
+ */
+ @JvmStatic
+ fun getCurrentTask(context: Context, callback: OchCommonServiceCallback>?) {
+ val map = hashMapOf()
+ map["serviceAppId"] = getServiceAppId()
+ map["token"] = getToken()
+ map["sn"] = getCarSN()
+ d(SceneConstant.M_SWEEPER + TAG, "getCurrentTask:" + GsonUtil.jsonFromObject(map))
+ mService.getCurrentTask(
+ getServiceAppId(),
+ getToken(),
+ getCarSN()
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "getCurrentTask"))
+ }
+
+ /**
+ * 获取主任务列表
+ */
+ @JvmStatic
+ fun getMainTaskList(context: Context, callback: OchCommonServiceCallback>>?) {
+ val map = hashMapOf()
+ map["serviceAppId"] = getServiceAppId()
+ map["token"] = getToken()
+ map["sn"] = getCarSN()
+ d(SceneConstant.M_SWEEPER + TAG, "getMainTaskList:" + GsonUtil.jsonFromObject(map))
+ mService.getMainTaskList(
+ getServiceAppId(),
+ getToken(),
+ getCarSN()
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "getMainTaskList"))
+ }
+
+ /**
+ * 获取子任务列表
+ */
+ @JvmStatic
+ fun getSubTaskList(taskId: Int, context: Context, callback: OchCommonServiceCallback>>?) {
+ val map = hashMapOf()
+ map["carSn"] = getCarSN()
+ map["taskId"] = taskId.toString()
+ d(SceneConstant.M_SWEEPER + TAG, "getSubTaskList:" + GsonUtil.jsonFromObject(map))
+ mService.getSubTaskList(
+ getServiceAppId(),
+ getToken(),
+ map
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "getSubTaskList"))
+ }
+
+ /**
+ * 获取子任务详情包括轨迹文件信息
+ */
+ @JvmStatic
+ fun getSubTaskDetail(subTaskId: Int, context: Context, callback: OchCommonServiceCallback>?) {
+ val map = hashMapOf()
+ map["carSn"] = getCarSN()
+ map["taskId"] = subTaskId.toString()
+ d(SceneConstant.M_SWEEPER + TAG, "getSubTaskDetail:" + GsonUtil.jsonFromObject(map))
+ mService.getSubTaskDetail(
+ getServiceAppId(),
+ getToken(),
+ map
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "getSubTaskList"))
+ }
+
+ /**
+ * 子任务开始上报
+ */
+ @JvmStatic
+ fun subTaskStart(isFirst: Boolean, isEnd: Boolean, subTaskId: Int, context: Context, callback: OchCommonServiceCallback>?) {
+ val subStartRequest = SubStartRequest(getCarSN(), subTaskId, System.currentTimeMillis(), isFirst, isEnd)
+ d(SceneConstant.M_SWEEPER + TAG, "subTaskStart:" + GsonUtil.jsonFromObject(subStartRequest))
+ mService.subTaskStart(
+ getServiceAppId(),
+ getToken(),
+ subStartRequest
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "subTaskStart"))
+ }
+
+ /**
+ * 子任务结束上报
+ */
+ @JvmStatic
+ fun subTaskEnd(isFirst: Boolean, isEnd: Boolean, subTaskId: Int, context: Context, callback: OchCommonServiceCallback>?) {
+ val subStartRequest = SubStartRequest(getCarSN(), subTaskId, System.currentTimeMillis(), isFirst, isEnd)
+ d(SceneConstant.M_SWEEPER + TAG, "subTaskEnd:" + GsonUtil.jsonFromObject(subStartRequest))
+ mService.subTaskEnd(
+ getServiceAppId(),
+ getToken(),
+ subStartRequest
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "subTaskEnd"))
+ }
+
+ /**
+ * 子任务跳过上报
+ */
+ @JvmStatic
+ fun subTaskSkip(isFirst: Boolean, isEnd: Boolean, subTaskId: Int, context: Context, callback: OchCommonServiceCallback>?) {
+ val subStartRequest = SubStartRequest(getCarSN(), subTaskId, System.currentTimeMillis(), isFirst, isEnd)
+ d(SceneConstant.M_SWEEPER + TAG, "subTaskSkip:" + GsonUtil.jsonFromObject(subStartRequest))
+ mService.subTaskSkip(
+ getServiceAppId(),
+ getToken(),
+ subStartRequest
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "subTaskSkip"))
+ }
+
+ /**
+ * 主任务重置
+ */
+ @JvmStatic
+ fun mainTaskReset(taskId: Int, context: Context, callback: OchCommonServiceCallback>?) {
+ val map = hashMapOf()
+ map["carSn"] = getCarSN()
+ map["taskId"] = taskId.toString()
+ d(SceneConstant.M_SWEEPER + TAG, "mainTaskReset:" + GsonUtil.jsonFromObject(map))
+ mService.mainTaskReset(
+ getServiceAppId(),
+ getToken(),
+ map
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "mainTaskReset"))
+ }
+
+ private fun getCarSN(): String {
+ return MoGoAiCloudClientConfig.getInstance().sn
+ }
+
+ private fun getServiceAppId(): String {
+ return MoGoAiCloudClientConfig.getInstance().serviceAppId
+ }
+
+ private fun getToken(): String {
+ return MoGoAiCloudClientConfig.getInstance().token
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperLinePresenter.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperLinePresenter.java
deleted file mode 100644
index 5cfb5b80f2..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperLinePresenter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.mogo.och.sweeper.presenter;
-
-import android.os.Looper;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.LifecycleOwner;
-
-import com.mogo.commons.mvp.Presenter;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.och.sweeper.bean.SweeperQueryLinesResponse;
-import com.mogo.och.sweeper.callback.ISweeperLinesCallback;
-import com.mogo.och.sweeper.model.SweeperLineModel;
-import com.mogo.och.sweeper.model.SweeperOrderModel;
-import com.mogo.och.sweeper.ui.SweeperSwitchLineView;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public class SweeperLinePresenter extends Presenter implements ISweeperLinesCallback {
-
- public SweeperLinePresenter(SweeperSwitchLineView view) {
- super(view);
- SweeperLineModel.getInstance().init();
- SweeperOrderModel.getInstance().init();
- }
-
- @Override
- public void onCreate(@NonNull LifecycleOwner owner) {
- super.onCreate(owner);
- initListener();
- }
-
- private void initListener() {
- SweeperLineModel.getInstance().setBusLinesCallback(this);
- }
-
- private void runOnUIThread( Runnable executor ) {
- if ( executor == null ) {
- return;
- }
- if ( Looper.myLooper() != Looper.getMainLooper() ) {
- UiThreadHandler.post( executor );
- } else {
- executor.run();
- }
- }
-
- @Override
- public void onBusLinesChange(SweeperQueryLinesResponse lines) {
- runOnUIThread(() -> mView.onBusLinesChange(lines));
- }
-
- @Override
- public void onChangeLineIdSuccess() {
- runOnUIThread(() -> mView.onChangeLineIdSuccess());
- }
-
- public void queryBusLines(){
- SweeperLineModel.getInstance().queryBusLines();
- }
-
- public void commitSwitchLineId(int lineId){
- SweeperLineModel.getInstance().commitSwitchLineId(lineId);
- }
-
- public void removeListener(){
- SweeperLineModel.getInstance().setBusLinesCallback(null);
- }
-
- public void queryBusRoutes(){
- SweeperOrderModel.getInstance().querySweeperRoutes();
- }
-
- @Override
- public void onDestroy(@NonNull LifecycleOwner owner) {
- super.onDestroy(owner);
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperModelLoopManager.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperModelLoopManager.java
deleted file mode 100644
index ac03cc4800..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperModelLoopManager.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.mogo.och.sweeper.presenter;
-
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.och.sweeper.constant.SweeperConst;
-import com.mogo.och.sweeper.model.SweeperOrderModel;
-
-import java.util.concurrent.TimeUnit;
-
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * Created on 2021/11/22
- *
- * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
- */
-public class SweeperModelLoopManager {
-
- private static final String TAG = SweeperModelLoopManager.class.getSimpleName();
-
- private static final class SingletonHolder {
- private static final SweeperModelLoopManager INSTANCE = new SweeperModelLoopManager();
- }
-
- public static SweeperModelLoopManager getInstance() {
- return SingletonHolder.INSTANCE;
- }
-
- private Disposable mHeartbeatDisposable; //心跳轮询
-
- public void startHeartbeatLoop() {
- if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
- return;
- }
- CallerLogger.INSTANCE.i(M_BUS + TAG, "startHeartbeatLoop()");
- mHeartbeatDisposable = Observable.interval(SweeperConst.LOOP_DELAY,
- SweeperConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
- .map((aLong -> aLong + 1))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(aLong -> SweeperOrderModel.getInstance().runCarHeartbeat());
- }
-
- public void stopHeartbeatLoop() {
- if (mHeartbeatDisposable != null) {
- CallerLogger.INSTANCE.i(M_BUS + TAG, "stopHeartbeatLoop()");
- mHeartbeatDisposable.dispose();
- mHeartbeatDisposable = null;
- }
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java
index 8ce4713150..62f18ec6e3 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java
@@ -1,37 +1,57 @@
package com.mogo.och.sweeper.presenter;
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
-import android.os.Looper;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_SWEEPER;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
+import com.amap.api.maps.model.LatLng;
+import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.mvp.Presenter;
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;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoSweeperFutianCleanSystemListener;
+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.sweeper.bean.SweeperStationBean;
-import com.mogo.och.sweeper.callback.ICarOperationStatusCallback;
-import com.mogo.och.sweeper.callback.IRefreshSweeperStationsCallback;
-import com.mogo.och.sweeper.callback.ISlidePannelHideCallback;
+import com.mogo.eagle.core.utilcode.util.ThreadUtils;
+import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
+import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil;
+import com.mogo.och.common.module.utils.NumberFormatUtil;
+import com.mogo.och.sweeper.bean.SweeperMainTaskBean;
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean;
+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;
+import com.mogo.och.sweeper.callback.ISweeperTaskRouteCallback;
+import com.mogo.och.sweeper.constant.SubTaskTypeEnum;
+import com.mogo.och.sweeper.constant.SweeperConst;
+import com.mogo.och.sweeper.constant.TaskStatusEnum;
+import com.mogo.och.sweeper.database.MyDataBase;
+import com.mogo.och.sweeper.database.bean.WeltDataBean;
import com.mogo.och.sweeper.fragment.SweeperFragment;
-import com.mogo.och.sweeper.model.SweeperOrderModel;
+import com.mogo.och.sweeper.model.SweeperTaskModel;
+import com.mogo.och.sweeper.util.SweeperFutianCmdUtil;
import com.mogo.och.sweeper.util.SweeperTrajectoryManager;
import org.jetbrains.annotations.NotNull;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
+import chassis.ChassisStatesOuterClass;
import mogo.telematics.pad.MessagePad;
import mogo_msg.MogoReportMsg;
+import planning.RoboSweeperTaskIndexOuterClass;
import system_master.SystemStatusInfo;
/**
@@ -40,125 +60,59 @@ import system_master.SystemStatusInfo;
* @author tongchenfei
*/
public class SweeperPresenter extends Presenter
- implements ICarOperationStatusCallback, IRefreshSweeperStationsCallback, ISlidePannelHideCallback
- , IMoGoAutopilotStatusListener, ISweeperControllerStatusCallback {
+ implements IMoGoAutopilotStatusListener, ISweeperControllerStatusCallback, ISweeperADASStatusCallback,
+ IMoGoSweeperFutianCleanSystemListener, ISweeperTaskCallback, ISweeperTaskRouteCallback {
- private static final String TAG = "BusPresenter";
+ private static final String TAG = "SweeperPresenter";
+ //当前子任务id
+ private int mSubTaskId = 0;
+ // 清扫模式回调时间间隔
+ private static final long VEHICLE_STATE_INTERVAL_MILLIS = 500L;
+ // 清扫模式当前时间戳
+ private long mVehicleStateCurrentTimeMillis;
- private int currentAutopilotStatus = -1;
- private List mStationList = new ArrayList<>();
- private int mCurrentStation = 0;
- private boolean isRestartAutopilot = false;
+ // 贴边数据回调时间间隔
+ private static final long WELT_DATA_INTERVAL_MILLIS = 1000L;
+ // 贴边数据当前时间戳
+ private long mWeltDataCurrentTimeMillis;
+
+ private String longitude;//经度
+ private String latitude;//纬度
public SweeperPresenter(SweeperFragment view) {
super(view);
//2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口
CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
- SweeperOrderModel.getInstance().init();
+ //清扫车模式和贴边数据回调监听
+ CallerSweeperFutianCleanSystemListenerManager.INSTANCE.addListener(TAG, this);
+ SweeperTaskModel.getInstance().init();
+ OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
}
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
super.onCreate(owner);
- SweeperOrderModel.getInstance().queryOperationStatus();
- SweeperOrderModel.getInstance().querySweeperRoutes();
initModelListener();
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
- SweeperOrderModel.getInstance().release();
+ SweeperTaskModel.getInstance().release();
releaseListener();
}
public void initModelListener() {
- SweeperOrderModel.getInstance().setCarOperationStatusCallback(this);
- SweeperOrderModel.getInstance().setRefreshBusStationsCallback(this);
- SweeperOrderModel.getInstance().setSlidePannelHideCallback(this);
- SweeperOrderModel.getInstance().setControllerStatusCallback(this);
+ SweeperTaskModel.getInstance().setControllerStatusCallback(this);
+ SweeperTaskModel.getInstance().setAdasStatusCallback(this);
+ SweeperTaskModel.getInstance().setSweeperTaskCallback(this);
}
public void releaseListener() {
- SweeperOrderModel.getInstance().setCarOperationStatusCallback(null);
- SweeperOrderModel.getInstance().setRefreshBusStationsCallback(null);
- SweeperOrderModel.getInstance().setSlidePannelHideCallback(null);
- SweeperOrderModel.getInstance().setControllerStatusCallback(null);
- }
-
- public void querySweepersRoutes() {
- SweeperOrderModel.getInstance().querySweeperRoutes();
- }
-
- public void debugResetStationStatus() {
- SweeperOrderModel.getInstance().debugResetStationStatus();
- }
-
- public void autoDriveToNextStation(boolean isRestart) {
- currentAutopilotStatus = -1;
- SweeperOrderModel.getInstance().autoDriveToNextStation(isRestart);
- isRestartAutopilot = false;
- }
-
- public void restartAutopilot() {
-// if (SweeperOrderModel.getInstance().isGoingToNextStation()){
- currentAutopilotStatus = -1;
- SweeperOrderModel.getInstance().restartAutopilot();
- isRestartAutopilot = true;
-// }
- }
-
- public void onChangeOperationStatus() {
- SweeperOrderModel.getInstance().onChangeOperationStatus();
- }
-
- @Override
- public void changeOperationStatus(boolean changeStatus) {
- if (mView != null) {
- runOnUIThread(() -> mView.changeOperationStatus(changeStatus));
- }
- }
-
- @Override
- public void refreshBusStations(String lineName,List stationList
- , int currentStation, int nextStation, boolean isArrived) {
- mStationList.clear();
- mStationList.addAll(stationList);
- mCurrentStation = currentStation;
-// functionDemoModeChange();
- CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation);
- if (mView != null) {
- runOnUIThread(() -> mView.refreshSweeperStations(lineName,
- stationList, currentStation, nextStation, isArrived));
- }
- }
-
- private void functionDemoModeChange() {
-// CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel ="," functionDemoModeChange ="+mCurrentStation);
- if (FunctionBuildConfig.isDemoMode
- && ((mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
- || ((mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
- && SweeperOrderModel.getInstance().isGoingToNextStation()))) {
- runOnUIThread(() -> mView.onAutopilotStatusChanged(
- IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING));
- }
- }
-
- @Override
- public void hideSlidePanel() {
- if (mView != null) {
- runOnUIThread(() -> mView.hideSlidePanel());
- }
- }
-
- @Override
- public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) {
- SweeperOrderModel.getInstance().onArriveAt(arrivalNotification);
- }
-
- @Override
- public void onAutopilotSNRequest() {
-
+ SweeperTaskModel.getInstance().setControllerStatusCallback(null);
+ SweeperTaskModel.getInstance().setAdasStatusCallback(null);
+ SweeperTaskModel.getInstance().setSweeperTaskCallback(null);
+ CallerSweeperFutianCleanSystemListenerManager.INSTANCE.removeListener(TAG);
}
@Override
@@ -169,103 +123,88 @@ public class SweeperPresenter extends Presenter
@Override
public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
if (autopilotStatusInfo == null) return;
- int state = autopilotStatusInfo.getState();
-// CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChange: " + state + "currentAutopilotStatus = " + currentAutopilotStatus);
- switch (state) {
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
- if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
- if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->1语音提示
-// AIAssist.getInstance( getContext() ).speakTTSVoice( "已进入人工驾驶模式" );
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotStatusResponse state:" + autopilotStatusInfo.getState());
+ SweeperTaskModel.getInstance().setAutopilotState(autopilotStatusInfo.getState());
+ ThreadUtils.runOnUiThread(() -> mView.startAutoBtn(autopilotStatusInfo.getState()));
+ switch (autopilotStatusInfo.getState()) {
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE://不可自动驾驶
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE://人工驾驶
+ if (SweeperTaskModel.getInstance().getSubWorking()) {
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ SweeperTaskModel.getInstance().startBeautificationMode();
}
- currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE;
- // 设置UI【自动驾驶】按钮是否展示
- runOnUIThread(() -> mView.onAutopilotEnableChange(true));
- if (SweeperOrderModel.getInstance().isGoingToNextStation()) {
- runOnUIThread(() -> mView.hideSlidePanel());
+ } else {
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ //关闭美化模式
+ SweeperTaskModel.getInstance().closeBeautificationMode();
}
- if (FunctionBuildConfig.isDemoMode
- && (
- (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
- || (
- (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
- && SweeperOrderModel.getInstance().isGoingToNextStation()
- )
- )
- ) {
- CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能");
- return;
- }
- // 改变UI自动驾驶状态
- runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus));
}
break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
- if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
- currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING;
- // 改变UI自动驾驶状态
- runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus));
- SweeperOrderModel.getInstance().triggerStartServiceEvent(
- isRestartAutopilot, true);
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING://自动驾驶中
+ SweeperTaskModel.getInstance().triggerStartServiceEvent(
+ SweeperTaskModel.getInstance().isRestartAutopilot(), true);
+ if (SweeperTaskModel.getInstance().getSubWorking()) {
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ SweeperTaskModel.getInstance().startBeautificationMode();
+ }
}
break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
- if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
- if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->0语音提示
-// AIAssist.getInstance( getContext() ).speakTTSVoice( "自动驾驶已停止,请人工接管" );
+ case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING://平行驾驶
+ if (SweeperTaskModel.getInstance().getSubWorking()) {
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;//是否强制绘制引导线
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);//是否自动启动自驾
}
- currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE;
- if (FunctionBuildConfig.isDemoMode
- && (
- (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
- || (
- (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
- && SweeperOrderModel.getInstance().isGoingToNextStation()
- )
- )
- ) {
- CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能");
- return;
+ } else {
+ if (FunctionBuildConfig.isDemoMode) {//美化模式开启时
+ //关闭美化模式
+ SweeperTaskModel.getInstance().closeBeautificationMode();
}
- runOnUIThread(() -> {
- mView.onAutopilotStatusChanged(currentAutopilotStatus);
- });
}
break;
default:
- runOnUIThread(() -> mView.onAutopilotEnableChange(false));
break;
}
}
@Override
public void onVRModeChanged(boolean isVRMode) {
- runOnUIThread(() -> mView.onVRModeChanged(isVRMode));
+ ThreadUtils.runOnUiThread(() -> mView.onVRModeChanged(isVRMode));
}
@Override
public void onCarLocationChanged(MogoLocation location) {
if (null != location) {
- runOnUIThread(() -> mView.updateSpeedView((float) location.getGnssSpeed()));
+ ThreadUtils.runOnUiThread(() -> mView.updateSpeedView((float) location.getGnssSpeed()));
+ ThreadUtils.runOnUiThread(() -> mView.setCurrentLocation(location));
}
}
@Override
public void startOpenAutopilot() {
- //非美化模式下启动动画
- runOnUIThread(() -> mView.startAutopilotAnimation());
+
+ }
+ /**
+ * 清除路线缓存数据
+ */
+ public void clearRouteList(){
+ SweeperTaskModel.getInstance().clearRouteList();
+ }
+ public void startAutopilot() {
+ SweeperTaskModel.getInstance().startAutopilot();
}
- private void runOnUIThread(Runnable executor) {
- if (executor == null) {
- return;
- }
- if (Looper.myLooper() != Looper.getMainLooper()) {
- UiThreadHandler.post(executor);
- } else {
- executor.run();
- }
+ /**
+ * 设置当前子任务信息
+ */
+ public void setSubtask(boolean isFirstSubtask, boolean isLastSubtask, int subTaskId,int subTaskType) {
+ this.mSubTaskId = subTaskId;
+ SweeperTaskModel.getInstance().setSubtask(isFirstSubtask, isLastSubtask, subTaskId,subTaskType);
+ }
+ public void setWorking(boolean isWorking){
+ SweeperTaskModel.getInstance().setWorking(isWorking);
}
-
/**
* 测试使用
*
@@ -290,4 +229,228 @@ public class SweeperPresenter extends Presenter
public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) {
}
+
+ @Override
+ public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) {
+ SweeperTaskModel.getInstance().onArriveTaskEnd(arrivalNotification);
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+
+ }
+
+ @Override
+ public void onStartAdasFailure() {
+
+ }
+
+ public void onArriveTaskEnd(@Nullable MessagePad.ArrivalNotification arrivalNotification) {
+ SweeperTaskModel.getInstance().onArriveTaskEnd(arrivalNotification);
+ }
+
+ @Override
+ public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) {
+ if (cleanSystemState == null) {
+ return;
+ }
+ long current = System.currentTimeMillis();
+ if (current - mVehicleStateCurrentTimeMillis <= VEHICLE_STATE_INTERVAL_MILLIS) {
+ return;
+ }
+ mVehicleStateCurrentTimeMillis = current;
+ boolean clean_open_requirement = cleanSystemState.getSecuMotWorkSts();
+ // 洗扫
+ boolean clean_mode_wash_sweep = cleanSystemState.getSecuModWashSweepSts();
+ // 纯洗
+ boolean clean_mode_pure_wash = cleanSystemState.getSecuModWashSts();
+ // 纯吸
+ boolean clean_mode_pure_draw = cleanSystemState.getSecuWorkTonSts();
+ // 左侧
+ boolean clean_direction_left_side = cleanSystemState.getSecuWorkLeftSts();
+ // 右侧
+ boolean clean_direction_right_side = cleanSystemState.getSecuWorkRightSts();
+ // 两侧
+ boolean clean_direction_both_side = cleanSystemState.getSecuWorkOnBothsidesSts();
+ // 作业强度状态
+ boolean clean_intensity_standard = cleanSystemState.getSecuWorkStandSts();
+ boolean clean_intensity_strong = cleanSystemState.getSecuWorkStrongSts();
+
+ // 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式
+ boolean clean_mode_pure_sweep = SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState);
+
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("开关:")
+ .append(clean_open_requirement)
+ .append("\n")
+ .append("纯扫:")
+ .append(clean_mode_wash_sweep)
+ .append("纯洗:")
+ .append(clean_mode_pure_wash)
+ .append("纯吸:")
+ .append(clean_mode_pure_draw)
+ .append("纯扫:")
+ .append("\n")
+ .append(clean_mode_pure_sweep)
+ .append("左侧:")
+ .append(clean_direction_left_side)
+ .append("右侧:")
+ .append(clean_direction_right_side)
+ .append("两侧:")
+ .append("\n")
+ .append(clean_direction_both_side)
+ .append("标准:")
+ .append(clean_intensity_standard)
+ .append("强力:")
+ .append(clean_intensity_strong);
+
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onSweeperFutianCleanSystemState:" + stringBuilder);
+ mView.onSweeperFutianCleanSystemState(cleanSystemState);
+ }
+
+ @Override
+ public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) {
+ if (roboSweeperTaskIndex == null) {
+ return;
+ }
+ long current = System.currentTimeMillis();
+ if (current - mWeltDataCurrentTimeMillis <= WELT_DATA_INTERVAL_MILLIS) {
+ return;
+ }
+ mWeltDataCurrentTimeMillis = current;
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("清扫模式:")
+ .append(roboSweeperTaskIndex.getCleanMode())
+ .append("清扫方向:")
+ .append(roboSweeperTaskIndex.getCleanDirection())
+ .append("清扫强度:")
+ .append(roboSweeperTaskIndex.getCleanIntensity())
+ .append("贴边距离:")
+ .append(roboSweeperTaskIndex.getDistToRefEdgePoint())
+ .append("经度:")
+ .append(roboSweeperTaskIndex.getLocLon())
+ .append("纬度:")
+ .append(roboSweeperTaskIndex.getLocLat());
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onSweeperFutianTaskIndexData:" + stringBuilder);
+ String tempLongitude=NumberFormatUtil.cutOutNumber(roboSweeperTaskIndex.getLocLon(), 6);
+ String tempLatitude=NumberFormatUtil.cutOutNumber(roboSweeperTaskIndex.getLocLat(), 6);
+ //用于过滤车是否停在原地,经纬度相同的情况
+ if (!tempLongitude.equals(longitude)&&!tempLatitude.equals(latitude)){
+ latitude = NumberFormatUtil.cutOutNumber(roboSweeperTaskIndex.getLocLat(), 6);
+ longitude = NumberFormatUtil.cutOutNumber(roboSweeperTaskIndex.getLocLon(), 6);
+ //保存贴边数据到数据库中
+ WeltDataBean weltDataBean = new WeltDataBean();
+ //把wgs坐标系坐标转换成gcj坐标
+ LatLng latLng = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(), roboSweeperTaskIndex.getLocLon(),
+ roboSweeperTaskIndex.getLocLat());
+ weltDataBean.setLocLon(latLng.longitude);
+ weltDataBean.setLocLat(latLng.latitude);
+ int edgeCleanState = roboSweeperTaskIndex.getEdgeCleanState();
+ if(edgeCleanState==0){
+ weltDataBean.setWeltDistance(SweeperConst.NONWELT);
+ }else {
+ weltDataBean.setWeltDistance(roboSweeperTaskIndex.getDistToRefEdgePoint());
+ }
+ weltDataBean.setCleanMode(roboSweeperTaskIndex.getCleanMode());
+ weltDataBean.setCleanDirection(roboSweeperTaskIndex.getCleanDirection());
+ weltDataBean.setCleanIntensity(roboSweeperTaskIndex.getCleanIntensity());
+ weltDataBean.setSubTaskId(mSubTaskId);
+ MyDataBase.getInstance().getWeltDataDao().insert(weltDataBean);
+ String distance = String.valueOf((Math.round(roboSweeperTaskIndex.getDistToRefEdgePoint() * 100)));//m->cm 四舍五入到整数
+ mView.setWeltDataToMap((ArrayList) MyDataBase.getInstance().getWeltDataDao().loadAllWeltDataInfo(), true, distance);
+ }
+ }
+
+ public static String format(double value) {
+ BigDecimal bd = new BigDecimal(value);
+ bd = bd.setScale(2, RoundingMode.HALF_UP);
+ return bd.toString();
+ }
+
+ /**
+ * 获取当前正在执行的任务
+ */
+ public void getCurrentTask() {
+ SweeperTaskModel.getInstance().getCurrentTask();
+ }
+
+ /**
+ * 获取主任务列表
+ */
+ public void getMainTaskList(boolean refresh) {
+ SweeperTaskModel.getInstance().getMainTaskList(refresh);
+ }
+
+ /**
+ * 获取子任务列表
+ */
+ public void getSubTaskList(int taskId, SweeperSubTaskBean sweeperSubTaskBean) {
+ SweeperTaskModel.getInstance().getSubTaskList(taskId, sweeperSubTaskBean);
+ }
+
+ /**
+ * 获取子任务详情包括轨迹文件信息
+ */
+ public void getSubTaskDetail(boolean isFirst, boolean isEnd, int subTaskId, SubTaskTypeEnum subTaskType, boolean isStartSubtask) {
+ SweeperTaskModel.getInstance().getSubTaskDetail(isFirst, isEnd, subTaskId, subTaskType, isStartSubtask);
+ }
+
+ /**
+ * 开始任务
+ */
+ public void startTask(boolean isFirst, boolean isEnd, int subTaskId, SubTaskTypeEnum subTaskType, int subTaskStatus) {
+ if (SubTaskTypeEnum.AUTOPILOT_SUBTYPE.getCode() == subTaskStatus) {
+ SweeperTaskModel.getInstance().subTaskStart(isFirst, isEnd, subTaskId, subTaskType);
+ }
+ }
+
+ /**
+ * 子任务结束上报
+ */
+ public void subTaskEnd(boolean isFirst, boolean isEnd, int subTaskId) {
+ SweeperTaskModel.getInstance().subTaskEnd(isFirst, isEnd, subTaskId);
+ }
+
+ /**
+ * 子任务跳过上报
+ */
+ public void subTaskSkip(boolean isFirst, boolean isEnd, int subTaskId) {
+ SweeperTaskModel.getInstance().subTaskSkip(isFirst, isEnd, subTaskId);
+ }
+
+ /**
+ * 主任务重置
+ */
+ public void mainTaskReset(int taskId) {
+ SweeperTaskModel.getInstance().mainTaskReset(taskId);
+ }
+
+ @Override
+ public void setMainTaskList(List mainTaskBeanList,boolean refresh) {
+ mView.setMainTaskList(mainTaskBeanList,refresh);
+ }
+
+ @Override
+ public void setSubTaskBean(SweeperSubTaskBean subTaskBean, boolean isWorkingSubTask) {
+ mView.setSubTaskBean(subTaskBean, isWorkingSubTask);
+ }
+
+ @Override
+ public void updateSubTaskStatus(TaskStatusEnum typeEnum, boolean isLastSubTask) {
+ mView.updateSubTaskStatus(typeEnum, isLastSubTask);
+ }
+
+ @Override
+ public void setMainTaskReset(boolean isSuccess) {
+ mView.setMainTaskReset(isSuccess);
+ }
+
+ @Override
+ public void setSubTakDetail(@NonNull SweeperSubTaskDetailBean subTaskDetailBean, SubTaskTypeEnum subTaskTypeEnum) {
+ }
+
+ @Override
+ public void setRouteList(@NonNull ArrayList routeList) {
+ mView.setTaskRouteList(routeList);
+ }
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java
index 372648e53a..934cc029de 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperOperatePanelView.java
@@ -10,30 +10,32 @@ import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_MODE_PURE_SWE
import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_MODE_PURE_WASH;
import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_MODE_WASH_SWEEP;
+import android.animation.ObjectAnimator;
import android.content.Context;
-import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.animation.LinearInterpolator;
import android.widget.CheckedTextView;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoSweeperFutianCleanSystemListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerSweeperFutianCleanSystemListenerManager;
import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener;
-import com.mogo.eagle.core.utilcode.util.ThreadUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.och.sweeper.R;
+import com.mogo.och.sweeper.callback.ICleaningModeStateCallback;
+import com.mogo.och.sweeper.constant.OperateStateEnum;
import com.mogo.och.sweeper.util.SweeperFutianCmdUtil;
+import com.mogo.och.sweeper.view.NoTouchConstraintLayout;
import java.util.Arrays;
import java.util.HashMap;
@@ -42,6 +44,11 @@ import java.util.List;
import chassis.ChassisStatesOuterClass;
import chassis.SpecialVehicleTaskCmdOuterClass;
+import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_DIRECTION_CLOSE;
+import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_MODE_CLOSE;
+import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_WORK_CLOSE;
+import static com.mogo.och.sweeper.util.SweeperFutianCmdUtil.CLEAN_WORK_OPEN;
+
/**
* 清扫车操作面板View
*/
@@ -50,6 +57,7 @@ public class SweeperOperatePanelView extends LinearLayout {
private static final String TAG = "SweeperOperatePanelView";
private static final int CMD_EXECUTE_TIMEOUT_SECONDS = 30;
private static final int CMD_EXECUTE_MOCK_SUCCESS_SECONDS = 3;
+ private boolean isFirst = false;
CheckedTextView mBtnCleanWorkOpenClose;//开关
CheckedTextView mBtnCleanModePureSweep;//纯扫
@@ -61,9 +69,10 @@ public class SweeperOperatePanelView extends LinearLayout {
CheckedTextView mBtnCleanDirectionBothSide;//两侧
CheckedTextView mBtnCleanIntensityStandard;//普通
CheckedTextView mBtnCleanIntensityStrong;//强力
- LinearLayout mLoadingContainer;//loading container
- TextView mLoadingHintTop;//loading 提示-上面
- TextView mLoadingHintBottom;//loading 提示-下面
+ FrameLayout mLoadingContainer;//loading container
+ TextView mLoadingHint;//loading 文本提示
+ ImageView mLoadingView;//loading 转圈动画
+ NoTouchConstraintLayout mWorkmodePanelRootView;
// 作业模式相关操作按钮的id
List cleanModeBtnViewIds = Arrays.asList(
@@ -109,6 +118,15 @@ public class SweeperOperatePanelView extends LinearLayout {
put(R.id.btn_clean_intensity_strong, CLEAN_INTENSITY_STRONG);
}
};
+ private boolean isSelectPureSweepMode = false;//用于标注是否选中纯扫
+
+ private ICleaningModeStateCallback cleaningModeStateCallback;
+
+ private OperateStateEnum operateStateEnum = OperateStateEnum.SYNCING_STATUS;
+
+ private ObjectAnimator objectAnimator;
+
+ private static ChassisStatesOuterClass.SweeperFuTianTaskSystemStates mCurrentCleanSystemState;//当前作业模式
public SweeperOperatePanelView(Context context) {
super(context);
@@ -132,6 +150,7 @@ public class SweeperOperatePanelView extends LinearLayout {
private void initView(Context context) {
LayoutInflater.from(context).inflate(R.layout.sweeper_operate_panel_view, this, true);
mBtnCleanWorkOpenClose = (CheckedTextView) findViewById(R.id.btn_clean_work_open_close);
+ mWorkmodePanelRootView = (NoTouchConstraintLayout) findViewById(R.id.work_mode_panel_root_view);
mBtnCleanModePureSweep = (CheckedTextView) findViewById(R.id.btn_clean_mode_pure_sweep);
mBtnCleanModePureWash = (CheckedTextView) findViewById(R.id.btn_clean_mode_pure_wash);
mBtnCleanModeSweepWash = (CheckedTextView) findViewById(R.id.btn_clean_mode_sweep_wash);
@@ -142,8 +161,8 @@ public class SweeperOperatePanelView extends LinearLayout {
mBtnCleanIntensityStandard = (CheckedTextView) findViewById(R.id.btn_clean_intensity_standard);
mBtnCleanIntensityStrong = (CheckedTextView) findViewById(R.id.btn_clean_intensity_strong);
mLoadingContainer = findViewById(R.id.loading_hint_container);
- mLoadingHintTop = findViewById(R.id.loading_hint_top);
- mLoadingHintBottom = findViewById(R.id.loading_hint_bottom);
+ mLoadingHint = findViewById(R.id.loading_hint);
+ mLoadingView = findViewById(R.id.loading_view);
initViewListener();
}
@@ -193,21 +212,19 @@ public class SweeperOperatePanelView extends LinearLayout {
@Override
public void onCmdSuccess() {
- runOnUIThread(() -> {
- if (isCloseAction) {
- mBtnCleanWorkOpenClose.setText("Open");
- mBtnCleanWorkOpenClose.setChecked(false);
- toggleCleanModeBtnsStatus(false);
- toggleCleanDirectionBtnsStatus(false);
- toggleCleanIntensityBtnsStatus(false);
- } else {
- mBtnCleanWorkOpenClose.setText("Close");
- mBtnCleanWorkOpenClose.setChecked(true);
- toggleCleanModeBtnsStatus(true);
- }
- hideLoadingMask();
- showCmdExecuteSuccessToast();
- });
+ if (isCloseAction) {
+ mBtnCleanWorkOpenClose.setText("打开");
+ mBtnCleanWorkOpenClose.setChecked(false);
+ toggleCleanModeBtnsStatus(false);
+ toggleCleanDirectionBtnsStatus(false);
+ toggleCleanIntensityBtnsStatus(false);
+ } else {
+ mBtnCleanWorkOpenClose.setText("关闭");
+ mBtnCleanWorkOpenClose.setChecked(true);
+ toggleCleanModeBtnsStatus(true);
+ }
+ hideLoadingMask();
+ showCmdExecuteSuccessToast();
}
@Override
@@ -217,27 +234,23 @@ public class SweeperOperatePanelView extends LinearLayout {
@Override
public void onCmdTimeout() {
//按钮样式恢复原样
- runOnUIThread(() -> {
- if (isCloseAction) {
- mBtnCleanWorkOpenClose.setText("Close");
- mBtnCleanWorkOpenClose.setChecked(true);
- } else {
- mBtnCleanWorkOpenClose.setText("Open");
- mBtnCleanWorkOpenClose.setChecked(false);
- }
- hideLoadingMask();
- showCmdExecuteTimeoutToast();
- });
+ if (isCloseAction) {
+ mBtnCleanWorkOpenClose.setText("关闭");
+ mBtnCleanWorkOpenClose.setChecked(true);
+ } else {
+ mBtnCleanWorkOpenClose.setText("打开");
+ mBtnCleanWorkOpenClose.setChecked(false);
+ }
+ hideLoadingMask();
+ showCmdExecuteTimeoutToast();
}
};
if (isCloseAction) {
//关闭操作,点击时需要弹框提示确认后,关闭
- showConfirmCleanWorkCloseDialog(() -> {
- sendSweeperCmd(
- SweeperFutianCmdUtil.buildCleanWorkStopCmd(),
- cmdRequestCallback
- , CMD_EXECUTE_TIMEOUT_SECONDS);
- });
+ sendSweeperCmd(
+ SweeperFutianCmdUtil.buildCleanWorkStopCmd(),
+ cmdRequestCallback
+ , CMD_EXECUTE_TIMEOUT_SECONDS);
} else {
//打开操作,点击时打开
sendSweeperCmd(
@@ -271,7 +284,6 @@ public class SweeperOperatePanelView extends LinearLayout {
boolean isPureSweepClick = currentClickView.getId() == R.id.btn_clean_mode_pure_sweep;
//是否洗扫View
boolean isWashSweepClick = currentClickView.getId() == R.id.btn_clean_mode_sweep_wash;
-
CmdRequestCallback cmdRequestCallback = new CmdRequestCallback() {
@Override
public void onSendCmd() {
@@ -296,7 +308,7 @@ public class SweeperOperatePanelView extends LinearLayout {
// 纯吸
boolean clean_mode_pure_draw = cleanSystemState.getSecuWorkTonSts();
// 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式
- boolean clean_mode_pure_sweep = checkIfCleanModePureSweep(cleanSystemState);
+ boolean clean_mode_pure_sweep = SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState);
// 关闭作业模式(实际执行了3个操作: 关闭作业模式 关闭清扫方向 切换标准强度,实际以关闭作业模式成功为准)
boolean clean_mode_close = !clean_mode_wash_sweep
&& !clean_mode_pure_wash
@@ -305,41 +317,44 @@ public class SweeperOperatePanelView extends LinearLayout {
if (isClickCurrentChoosedModeBtn && clean_mode_close) {// 关闭放第一判断
success = clean_mode_close;
+ isSelectPureSweepMode = false;
} else if (isPureSweepClick) {
//success = clean_mode_pure_sweep;
//纯扫 这个模式实际在福田清扫车上没有这个按钮,只是发送指令给特种车端,默认此命令肯定是正确的
success = true;
+ isSelectPureSweepMode = true;
} else if (isPureWashClick) {
success = clean_mode_pure_wash;
+ isSelectPureSweepMode = false;
} else if (isWashSweepClick) {
success = clean_mode_wash_sweep;
+ isSelectPureSweepMode = false;
} else if (isPureAbsorptionClick) {
success = clean_mode_pure_draw;
+ isSelectPureSweepMode = false;
}
return success;
}
@Override
public void onCmdSuccess() {
- runOnUIThread(() -> {
- ((CheckedTextView) currentClickView).setChecked(!isClickCurrentChoosedModeBtn);
- toggleCleanModeBtnsByChoosedViewId(currentClickView.getId(), isClickCurrentChoosedModeBtn);
- if (isClickCurrentChoosedModeBtn) {
+ ((CheckedTextView) currentClickView).setChecked(!isClickCurrentChoosedModeBtn);
+ toggleCleanModeBtnsByChoosedViewId(currentClickView.getId(), isClickCurrentChoosedModeBtn);
+ if (isClickCurrentChoosedModeBtn) {
+ toggleCleanDirectionBtnsStatus(false);
+ toggleCleanIntensityBtnsStatus(false);
+ } else {
+ // 如果是纯吸,没有设置清扫方向,同时自动设置作业强度为标准
+ if (isPureAbsorptionClick) {
toggleCleanDirectionBtnsStatus(false);
- toggleCleanIntensityBtnsStatus(false);
+ setCleanIntensityStandard();
} else {
- // 如果是纯吸,没有设置清扫方向,同时自动设置作业强度为标准
- if (isPureAbsorptionClick) {
- toggleCleanDirectionBtnsStatus(false);
- setCleanIntensityStandard();
- } else {
- toggleCleanDirectionBtnsStatus(true);
- toggleCleanIntensityBtnsStatus(false);
- }
+ toggleCleanDirectionBtnsStatus(true);
+ toggleCleanIntensityBtnsStatus(false);
}
- hideLoadingMask();
- showCmdExecuteSuccessToast();
- });
+ }
+ hideLoadingMask();
+ showCmdExecuteSuccessToast();
}
@Override
@@ -348,11 +363,9 @@ public class SweeperOperatePanelView extends LinearLayout {
@Override
public void onCmdTimeout() {
- runOnUIThread(() -> {
- ((CheckedTextView) currentClickView).setChecked(isClickCurrentChoosedModeBtn);
- hideLoadingMask();
- showCmdExecuteTimeoutToast();
- });
+ ((CheckedTextView) currentClickView).setChecked(isClickCurrentChoosedModeBtn);
+ hideLoadingMask();
+ showCmdExecuteTimeoutToast();
}
};
@@ -388,8 +401,6 @@ public class SweeperOperatePanelView extends LinearLayout {
boolean isLeftSide = currentClickView.getId() == R.id.btn_clean_direction_left_side;
boolean isRightSide = currentClickView.getId() == R.id.btn_clean_direction_right_side;
boolean isBothSide = currentClickView.getId() == R.id.btn_clean_direction_both_side;
-
-
CmdRequestCallback cmdRequestCallback = new CmdRequestCallback() {
@Override
public void onSendCmd() {
@@ -431,19 +442,17 @@ public class SweeperOperatePanelView extends LinearLayout {
@Override
public void onCmdSuccess() {
- runOnUIThread(() -> {
- ((CheckedTextView) currentClickView).setChecked(!isClickCurrentChoosedDirectionBtn);
- toggleCleanDirectionBtnsByChoosedViewId(currentClickView.getId(), isClickCurrentChoosedDirectionBtn);
- if (isClickCurrentChoosedDirectionBtn) {
- toggleCleanIntensityBtnsStatus(false);
- } else {
- toggleCleanIntensityBtnsStatus(true);
- // 一并设置作业强度为标准
- setCleanIntensityStandard();
- }
- hideLoadingMask();
- showCmdExecuteSuccessToast();
- });
+ ((CheckedTextView) currentClickView).setChecked(!isClickCurrentChoosedDirectionBtn);
+ toggleCleanDirectionBtnsByChoosedViewId(currentClickView.getId(), isClickCurrentChoosedDirectionBtn);
+ if (isClickCurrentChoosedDirectionBtn) {
+ toggleCleanIntensityBtnsStatus(false);
+ } else {
+ toggleCleanIntensityBtnsStatus(true);
+ // 一并设置作业强度为标准
+ setCleanIntensityStandard();
+ }
+ hideLoadingMask();
+ showCmdExecuteSuccessToast();
}
@Override
@@ -452,11 +461,9 @@ public class SweeperOperatePanelView extends LinearLayout {
@Override
public void onCmdTimeout() {
- runOnUIThread(() -> {
- ((CheckedTextView) currentClickView).setChecked(isClickCurrentChoosedDirectionBtn);
- hideLoadingMask();
- showCmdExecuteTimeoutToast();
- });
+ ((CheckedTextView) currentClickView).setChecked(isClickCurrentChoosedDirectionBtn);
+ hideLoadingMask();
+ showCmdExecuteTimeoutToast();
}
};
if (isClickCurrentChoosedDirectionBtn) {
@@ -476,6 +483,20 @@ public class SweeperOperatePanelView extends LinearLayout {
}
private void onCleanIntensityBtnClick(final View currentClickView) {
+ CheckedTextView currentChoosedModeBtnView = null;
+ for (Integer viewId : cleanIntensityBtnViewIds) {
+ CheckedTextView view = (CheckedTextView) findViewById(viewId);
+ if (view.isChecked()) {
+ currentChoosedModeBtnView = view;
+ break;
+ }
+ }
+ boolean isClickCurrentChoosedModeBtn = currentChoosedModeBtnView != null
+ && currentChoosedModeBtnView.getId() == currentClickView.getId();
+ //作业强度如果已经选中,则重复点击时不需要再重复发送指令
+ if (isClickCurrentChoosedModeBtn) {
+ return;
+ }
boolean isStandardBtnClick = currentClickView.getId() == R.id.btn_clean_intensity_standard;
boolean isStrongBtnClick = currentClickView.getId() == R.id.btn_clean_intensity_strong;
CmdRequestCallback cmdRequestCallback = new CmdRequestCallback() {
@@ -507,16 +528,14 @@ public class SweeperOperatePanelView extends LinearLayout {
@Override
public void onCmdSuccess() {
- runOnUIThread(() -> {
- ((CheckedTextView) currentClickView).setChecked(true);
- if (isStandardBtnClick) {
- setCleanIntensityStandard();
- } else {
- setCleanIntensityStrong();
- }
- hideLoadingMask();
- showCmdExecuteSuccessToast();
- });
+ ((CheckedTextView) currentClickView).setChecked(true);
+ if (isStandardBtnClick) {
+ setCleanIntensityStandard();
+ } else {
+ setCleanIntensityStrong();
+ }
+ hideLoadingMask();
+ showCmdExecuteSuccessToast();
}
@Override
@@ -525,11 +544,9 @@ public class SweeperOperatePanelView extends LinearLayout {
@Override
public void onCmdTimeout() {
- runOnUIThread(() -> {
- ((CheckedTextView) currentClickView).setChecked(false);
- hideLoadingMask();
- showCmdExecuteTimeoutToast();
- });
+ ((CheckedTextView) currentClickView).setChecked(false);
+ hideLoadingMask();
+ showCmdExecuteTimeoutToast();
}
};
int cmdValue = cleanIntensityBtnAndCmdValueMap.get(currentClickView.getId());
@@ -636,36 +653,29 @@ public class SweeperOperatePanelView extends LinearLayout {
* @param timeout
*/
private void showLoadingMask(int timeout) {
- showLoadingMask("执行中,请稍后。。。", timeout);
- }
-
- /**
- * 发送命令后等待时,展示loading
- *
- * @param hint
- * @param timeout
- */
- private void showLoadingMask(String hint, int timeout) {
- runOnUIThread(() -> {
- mLoadingContainer.setVisibility(View.VISIBLE);
- mLoadingHintTop.setText(hint);
- mLoadingHintBottom.setText(
- String.format(
- getContext().getApplicationContext().getString(R.string.sweeper_operate_panel_cmd_execute_timeout),
- timeout
- ));
- mLoadingHintBottom.setVisibility(timeout < 0 ? View.INVISIBLE : View.VISIBLE);
- });
+ mLoadingContainer.setVisibility(View.VISIBLE);
+ mWorkmodePanelRootView.setInterceptTouchEvent(true);
+ if (timeout < 0) {//状态同步中
+ mLoadingHint.setText("状态同步中,请稍后");
+ mLoadingView.setVisibility(View.GONE);
+ } else {
+ mLoadingHint.setText(timeout + "s");
+ mLoadingView.setVisibility(View.VISIBLE);
+ startRotation();
+ }
+ if (cleaningModeStateCallback != null && timeout > 0) {
+ operateStateEnum = OperateStateEnum.STARTING_STATUS;
+ cleaningModeStateCallback.cleaningModeState(operateStateEnum, mCurrentCleanSystemState, isSelectPureSweepMode);
+ }
}
/**
* 隐藏loading
*/
private void hideLoadingMask() {
- runOnUIThread(() -> {
- mSweeperOperateCmdHandler.removeMessages(MSG_CMD_EXECUTE_COUNT_DOWN);
- mLoadingContainer.setVisibility(View.GONE);
- });
+ mSweeperOperateCmdHandler.removeMessages(MSG_CMD_EXECUTE_COUNT_DOWN);
+ mLoadingContainer.setVisibility(View.GONE);
+ mWorkmodePanelRootView.setInterceptTouchEvent(false);
}
/**
@@ -674,19 +684,19 @@ public class SweeperOperatePanelView extends LinearLayout {
* @param timeout
*/
private void updateLoadingCountDown(int timeout) {
- runOnUIThread(() -> {
- mLoadingHintBottom.setText(
- String.format(
- getContext().getApplicationContext().getString(R.string.sweeper_operate_panel_cmd_execute_timeout),
- timeout
- ));
- });
+ mLoadingHint.setText(timeout + "s");
}
/**
* 命令执行成功toast
*/
private void showCmdExecuteSuccessToast() {
+ if (cleaningModeStateCallback != null) {
+ operateStateEnum = OperateStateEnum.SUCCESS_STATUS;
+ cleaningModeStateCallback.cleaningModeState(operateStateEnum, mCurrentCleanSystemState, isSelectPureSweepMode);
+ }
+ //停止旋转动画
+ stopRotation();
ToastUtils.showLong("设备已响应,操作成功");
}
@@ -694,51 +704,15 @@ public class SweeperOperatePanelView extends LinearLayout {
* 命令执行超时toast
*/
private void showCmdExecuteTimeoutToast() {
+ if (cleaningModeStateCallback != null) {
+ operateStateEnum = OperateStateEnum.FAIL_STATUS;
+ cleaningModeStateCallback.cleaningModeState(operateStateEnum, mCurrentCleanSystemState, isSelectPureSweepMode);
+ }
+ //停止旋转动画
+ stopRotation();
ToastUtils.showLong("超时未响应,操作失败");
}
- /**
- * 根据底盘数据恢复操作面板中相关按钮状态 成功toast
- */
- private void showRecoverPanelButtonStateSuccessToast() {
- ToastUtils.showLong("恢复操作面板状态成功");
- }
-
- /**
- * 关闭清扫作业时,确认操作的弹框
- *
- * @param runnable
- */
- private void showConfirmCleanWorkCloseDialog(Runnable runnable) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
- builder.setMessage("是否关闭清扫作业?");
- builder.setCancelable(true);
- builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- runnable.run();
- dialog.dismiss();
- }
- });
- builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- });
- AlertDialog dialog = builder.create();
- dialog.show();
- }
-
- private void runOnUIThread(Runnable runnable) {
- ThreadUtils.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- runnable.run();
- }
- });
- }
-
private void setClickListener(View view, OnClickListener listener) {
view.setOnClickListener(new OnPreventFastClickListener() {
@Override
@@ -748,57 +722,39 @@ public class SweeperOperatePanelView extends LinearLayout {
});
}
- // 当前时间戳
- private long mCurrentTimeMillis;
- // 底盘数据回调时间间隔
- private static final long VEHICLE_STATE_INTERVAL_MILLIS = 500L;
-
- /**
- * 底盘数据透传listener
- */
- private final IMoGoSweeperFutianCleanSystemListener mIMoGoAutopilotVehicleStateListener = new IMoGoSweeperFutianCleanSystemListener() {
-
- @Override
- public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) {
- long current = System.currentTimeMillis();
- if (current - mCurrentTimeMillis <= VEHICLE_STATE_INTERVAL_MILLIS) {
- return;
- }
- mCurrentTimeMillis = current;
-
- Log.d(TAG, "onSweeperFutianCleanSystemState");
- // 第一次进入时同步底盘状态,只拿第一次的数据
- if (mSyncingVehicleState) {
- onSyncVehicleStateCallBack(cleanSystemState);
- return;
- }
- // 有命令正在执行
- if (mCurrentCmdRequestCallback != null) {
- Log.d(TAG, "getSecuWorkLeftSts = " + cleanSystemState.getSecuWorkLeftSts());
- if (mCurrentCmdRequestCallback.onCheckIfCmdSuccess(cleanSystemState)) {
- mCurrentCmdRequestCallback.onCmdSuccess();
- mCurrentCmdRequestCallback = null;
- }
+ public void setSweeperFutianCleanSystemState(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState,
+ ICleaningModeStateCallback cleaningModeStateCallback) {
+ this.cleaningModeStateCallback = cleaningModeStateCallback;
+ // 有命令正在执行
+ if (mCurrentCmdRequestCallback != null) {
+ Log.d(TAG, "getSecuWorkLeftSts = " + cleanSystemState.getSecuWorkLeftSts());
+ if (mCurrentCmdRequestCallback.onCheckIfCmdSuccess(cleanSystemState)) {
+ mCurrentCmdRequestCallback.onCmdSuccess();
+ mCurrentCmdRequestCallback = null;
}
}
- };
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- CallerSweeperFutianCleanSystemListenerManager.INSTANCE.addListener(TAG, mIMoGoAutopilotVehicleStateListener);
- // 最终调试时需要打开
- syncVehicleStateAndRecoverOperatePanelStates();
- // Mock VehicleState 数据回调
- // UiThreadHandler.postDelayed(() -> {
- // onSyncVehicleStateCallBack(SweeperFutianCmdUtil.buildSweeperFuTionCleanSystemStateMockData());
- // }, 3000L);
+ //正在上装中或者上装失败,则不更新面板内容
+ if (operateStateEnum == OperateStateEnum.STARTING_STATUS) {
+ return;
+ }
+ if (!isFirst) {
+ isFirst = true;
+ onSyncVehicleStateCallBack(cleanSystemState);
+ }
}
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- CallerSweeperFutianCleanSystemListenerManager.INSTANCE.removeListener(TAG);
+ /**
+ * 设置是否展示状态同步中
+ *
+ * @param operateState
+ */
+ public void showSyncing(OperateStateEnum operateState) {
+ if (operateState == OperateStateEnum.SYNCING_STATUS) {
+ syncVehicleStateAndRecoverOperatePanelStates();
+ isFirst = false;
+ } else {
+ hideLoadingMask();
+ }
}
/**
@@ -806,13 +762,11 @@ public class SweeperOperatePanelView extends LinearLayout {
*/
private synchronized void syncVehicleStateAndRecoverOperatePanelStates() {
// show sync loading
- showLoadingMask("状态同步中,请稍后", -1);
- mSyncingVehicleState = true;
+ showLoadingMask(-1);
}
private synchronized void onSyncVehicleStateCallBack(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) {
if (cleanSystemState == null) return;
- mSyncingVehicleState = false;
// 清扫作业开启状态(以电机状态为true代表Open成功,实际控制端控制步骤为:1.发送远程控制上装指令 2.发送电机启动指令)
boolean clean_open_requirement = cleanSystemState.getSecuMotWorkSts();
// 作业模式状态
@@ -832,97 +786,64 @@ public class SweeperOperatePanelView extends LinearLayout {
boolean clean_direction_both_side = cleanSystemState.getSecuWorkOnBothsidesSts();
// 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式
- boolean clean_mode_pure_sweep = checkIfCleanModePureSweep(cleanSystemState);
+ boolean clean_mode_pure_sweep = SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState);
// 作业强度状态
boolean clean_intensity_standard = cleanSystemState.getSecuWorkStandSts();
boolean clean_intensity_strong = cleanSystemState.getSecuWorkStrongSts();
+ if (clean_open_requirement) {
+ // 打开状态
+ mBtnCleanWorkOpenClose.setText("关闭");
+ mBtnCleanWorkOpenClose.setChecked(true);
+ } else {
+ // 关闭状态
+ mBtnCleanWorkOpenClose.setText("打开");
+ mBtnCleanWorkOpenClose.setChecked(false);
+ }
+ if (clean_mode_pure_sweep) {
+ //纯扫
+ mBtnCleanModePureSweep.setChecked(true);
+ mBtnCleanModePureSweep.setEnabled(true);
+ toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_sweep, false);
+ } else if (clean_mode_pure_wash) {
+ //纯洗
+ mBtnCleanModePureWash.setChecked(true);
+ mBtnCleanModePureWash.setEnabled(true);
+ toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_wash, false);
+ } else if (clean_mode_wash_sweep) {
+ //洗扫
+ mBtnCleanModeSweepWash.setChecked(true);
+ mBtnCleanModeSweepWash.setEnabled(true);
+ toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_sweep_wash, false);
+ } else if (clean_mode_pure_draw) {
+ //纯吸,需要disable作业方向
+ mBtnCleanModePureAbsorption.setChecked(true);
+ mBtnCleanModePureAbsorption.setEnabled(true);
+ toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_absorption, false);
+ toggleCleanDirectionBtnsStatus(false);
+ }
- runOnUIThread(() -> {
- if (clean_open_requirement) {
- // 打开状态
- mBtnCleanWorkOpenClose.setText("Close");
- mBtnCleanWorkOpenClose.setChecked(true);
- } else {
- // 关闭状态
- mBtnCleanWorkOpenClose.setText("Open");
- mBtnCleanWorkOpenClose.setChecked(false);
+ if (!clean_mode_pure_draw) {// 非纯吸模式才有清扫方向
+ if (clean_direction_left_side) {
+ mBtnCleanDirectionLeftSide.setChecked(true);
+ mBtnCleanDirectionLeftSide.setEnabled(true);
+ toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_left_side, false);
+ } else if (clean_direction_right_side) {
+ mBtnCleanDirectionRightSide.setChecked(true);
+ mBtnCleanDirectionRightSide.setEnabled(true);
+ toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_right_side, false);
+ } else if (clean_direction_both_side) {
+ mBtnCleanDirectionBothSide.setChecked(true);
+ mBtnCleanDirectionBothSide.setEnabled(true);
+ toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_both_side, false);
}
- if (clean_mode_pure_sweep) {
- //纯扫
- mBtnCleanModePureSweep.setChecked(true);
- mBtnCleanModePureSweep.setEnabled(true);
- toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_sweep, false);
- } else if (clean_mode_pure_wash) {
- //纯洗
- mBtnCleanModePureWash.setChecked(true);
- mBtnCleanModePureWash.setEnabled(true);
- toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_wash, false);
- } else if (clean_mode_wash_sweep) {
- //洗扫
- mBtnCleanModeSweepWash.setChecked(true);
- mBtnCleanModeSweepWash.setEnabled(true);
- toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_sweep_wash, false);
- } else if (clean_mode_pure_draw) {
- //纯吸,需要disable作业方向
- mBtnCleanModePureAbsorption.setChecked(true);
- mBtnCleanModePureAbsorption.setEnabled(true);
- toggleCleanModeBtnsByChoosedViewId(R.id.btn_clean_mode_pure_absorption, false);
- toggleCleanDirectionBtnsStatus(false);
- }
-
- if (!clean_mode_pure_draw) {// 非纯吸模式才有清扫方向
- if (clean_direction_left_side) {
- mBtnCleanDirectionLeftSide.setChecked(true);
- mBtnCleanDirectionLeftSide.setEnabled(true);
- toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_left_side, false);
- } else if (clean_direction_right_side) {
- mBtnCleanDirectionRightSide.setChecked(true);
- mBtnCleanDirectionRightSide.setEnabled(true);
- toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_right_side, false);
- } else if (clean_direction_both_side) {
- mBtnCleanDirectionBothSide.setChecked(true);
- mBtnCleanDirectionBothSide.setEnabled(true);
- toggleCleanDirectionBtnsByChoosedViewId(R.id.btn_clean_direction_both_side, false);
- }
- }
- if (clean_intensity_standard) {
- setCleanIntensityStandard();
- } else if (clean_intensity_strong) {
- setCleanIntensityStrong();
- }
- hideLoadingMask();
- showRecoverPanelButtonStateSuccessToast();
- });
- }
-
- /**
- * 通过底盘数据判断是纯扫模式
- *
- * @param cleanSystemState
- * @return
- */
- private boolean checkIfCleanModePureSweep(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) {
- // 作业模式状态
- // 洗扫
- boolean clean_mode_wash_sweep = cleanSystemState.getSecuModWashSweepSts();
- // 纯洗
- boolean clean_mode_pure_wash = cleanSystemState.getSecuModWashSts();
- // 纯吸
- boolean clean_mode_pure_draw = cleanSystemState.getSecuWorkTonSts();
-
- // 清扫方向状态
- // 左侧
- boolean clean_direction_left_side = cleanSystemState.getSecuWorkLeftSts();
- // 右侧
- boolean clean_direction_right_side = cleanSystemState.getSecuWorkRightSts();
- // 两侧
- boolean clean_direction_both_side = cleanSystemState.getSecuWorkOnBothsidesSts();
-
- // 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式
- boolean clean_mode_pure_sweep = (clean_direction_left_side || clean_direction_right_side || clean_direction_both_side)
- && (!clean_mode_wash_sweep && !clean_mode_pure_wash && !clean_mode_pure_draw);
- return clean_mode_pure_sweep;
+ }
+ if (clean_intensity_standard) {
+ setCleanIntensityStandard();
+ } else if (clean_intensity_strong) {
+ setCleanIntensityStrong();
+ }
+ hideLoadingMask();
}
/**
@@ -950,7 +871,7 @@ public class SweeperOperatePanelView extends LinearLayout {
msg.obj = timeout;
mSweeperOperateCmdHandler.sendMessage(msg);
// Mock Cmd Success
-// mockSendCmdSuccess();
+ //mockCleanModeSuccess(fuTianCleanCmd);
}
private void mockSendCmdSuccess() {
@@ -975,7 +896,6 @@ public class SweeperOperatePanelView extends LinearLayout {
private final static SweeperOperateCmdHandler mSweeperOperateCmdHandler = new SweeperOperateCmdHandler();
private static CmdRequestCallback mCurrentCmdRequestCallback;//发送命令后的回调
- private boolean mSyncingVehicleState;//第一次进入页面时,同步底盘状态的标志位
private static final int MSG_CMD_EXECUTE_COUNT_DOWN = 10001;
private static final int MSG_CMD_EXECUTE_MOCK_SUCCESS = 10002;
@@ -1006,8 +926,10 @@ public class SweeperOperatePanelView extends LinearLayout {
}
} else if (msg.what == MSG_CMD_EXECUTE_MOCK_SUCCESS) {
if (mCurrentCmdRequestCallback != null) {
- mCurrentCmdRequestCallback.onCmdSuccess();
- mCurrentCmdRequestCallback = null;
+ if (mCurrentCmdRequestCallback.onCheckIfCmdSuccess(mCurrentCleanSystemState)) {
+ mCurrentCmdRequestCallback.onCmdSuccess();
+ mCurrentCmdRequestCallback = null;
+ }
}
removeMessages(MSG_CMD_EXECUTE_COUNT_DOWN);
}
@@ -1028,4 +950,145 @@ public class SweeperOperatePanelView extends LinearLayout {
void onCmdTimeout();
}
+ /**
+ * 开始旋转
+ */
+ private void startRotation() {
+ if (objectAnimator == null) {
+ objectAnimator = ObjectAnimator.ofFloat(mLoadingView, "rotation", 0, 360f);
+ objectAnimator.setDuration(1500);
+ objectAnimator.setRepeatCount(-1);
+ objectAnimator.setInterpolator(new LinearInterpolator());
+ objectAnimator.start();
+ }
+ }
+
+ /**
+ * 停止旋转
+ */
+ private void stopRotation() {
+ if (objectAnimator != null && objectAnimator.isRunning()) {
+ objectAnimator.end();
+ objectAnimator = null;
+ }
+ }
+
+ /**
+ * 模拟指令操作成功
+ */
+ private void mockCleanModeSuccess(SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd fuTianTaskCmd) {
+ ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.Builder builder = ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.newBuilder();
+ chassis.SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd fuTianCleanCmd = fuTianTaskCmd.getRoboSweeperFutianCleanCmd();
+ if (fuTianCleanCmd.getCleanOpenRequirement() == CLEAN_WORK_OPEN) {//打开
+ builder.setSecuMotWorkSts(true);
+ builder.setSecuModWashSweepSts(false);
+ builder.setSecuModWashSts(false);
+ builder.setSecuWorkTonSts(false);
+ builder.setSecuWorkOnBothsidesSts(false);
+ builder.setSecuWorkLeftSts(false);
+ builder.setSecuWorkRightSts(false);
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanOpenRequirement() == CLEAN_WORK_CLOSE) {//关闭
+ builder.setSecuModWashSweepSts(false);
+ builder.setSecuModWashSts(false);
+ builder.setSecuWorkTonSts(false);
+ builder.setSecuWorkOnBothsidesSts(false);
+ builder.setSecuWorkLeftSts(false);
+ builder.setSecuWorkRightSts(false);
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ builder.setSecuMotWorkSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ }
+ if (fuTianCleanCmd.getCleanModeRequirement() == CLEAN_MODE_PURE_SWEEP) {//纯扫
+ builder.setSecuModWashSweepSts(false);
+ builder.setSecuModWashSts(false);
+ builder.setSecuWorkTonSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanModeRequirement() == CLEAN_MODE_WASH_SWEEP) {//洗扫
+ builder.setSecuModWashSweepSts(!mCurrentCleanSystemState.getSecuModWashSweepSts());
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanModeRequirement() == CLEAN_MODE_PURE_WASH) {//纯洗
+ builder.setSecuModWashSts(!mCurrentCleanSystemState.getSecuModWashSts());
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanModeRequirement() == CLEAN_MODE_PURE_DRAW) {//纯吸
+ builder.setSecuWorkTonSts(!mCurrentCleanSystemState.getSecuWorkTonSts());
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkOnBothsidesSts(false);
+ builder.setSecuWorkLeftSts(false);
+ builder.setSecuWorkRightSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanModeRequirement() == CLEAN_MODE_CLOSE) {
+ builder.setSecuModWashSweepSts(false);
+ builder.setSecuModWashSts(false);
+ builder.setSecuWorkTonSts(false);
+ builder.setSecuWorkOnBothsidesSts(false);
+ builder.setSecuWorkLeftSts(false);
+ builder.setSecuWorkRightSts(false);
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ }
+ if (fuTianCleanCmd.getCleanDirectionRequirement() == CLEAN_DIRECTION_BOTH_SIDE) {//两侧
+ builder.setSecuWorkOnBothsidesSts(!mCurrentCleanSystemState.getSecuWorkOnBothsidesSts());
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanDirectionRequirement() == CLEAN_DIRECTION_LEFT_SIDE) {//左侧
+ builder.setSecuWorkLeftSts(!mCurrentCleanSystemState.getSecuWorkLeftSts());
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanDirectionRequirement() == CLEAN_DIRECTION_RIGHT_SIDE) {//右侧
+ builder.setSecuWorkRightSts(!mCurrentCleanSystemState.getSecuWorkRightSts());
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanDirectionRequirement() == CLEAN_DIRECTION_CLOSE) {
+ builder.setSecuWorkLeftSts(false);
+ builder.setSecuWorkRightSts(false);
+ builder.setSecuWorkOnBothsidesSts(false);
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ }
+ if (fuTianCleanCmd.getCleanIntensityRequirement() == CLEAN_INTENSITY_STRAND) {
+ builder.setSecuWorkStrongSts(true);
+ builder.setSecuWorkStandSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ return;
+ } else if (fuTianCleanCmd.getCleanIntensityRequirement() == CLEAN_INTENSITY_STRONG) {
+ builder.setSecuWorkStandSts(true);
+ builder.setSecuWorkStrongSts(false);
+ mCurrentCleanSystemState = builder.build();
+ mockSendCmdSuccess();
+ }
+
+ }
+
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperSwitchLineActivity.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperSwitchLineActivity.java
deleted file mode 100644
index dedd34cb21..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperSwitchLineActivity.java
+++ /dev/null
@@ -1,300 +0,0 @@
-package com.mogo.och.sweeper.ui;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.graphics.Point;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.constraintlayout.widget.ConstraintLayout;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.mogo.commons.mvp.MvpActivity;
-import com.mogo.eagle.core.utilcode.util.ToastUtils;
-import com.mogo.och.sweeper.R;
-import com.mogo.och.sweeper.bean.SweeperQueryLinesResponse;
-import com.mogo.och.sweeper.presenter.SweeperLinePresenter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/8
- */
-public class SweeperSwitchLineActivity extends MvpActivity
- implements View.OnClickListener, SweeperSwitchLineView {
-
- private ImageView mClose;
- private ConstraintLayout mNoDatasView;
- private RecyclerView mLinesListView;
- private TextView mLineCommitBtn;
- private SwitchLineAdapter mAdapter;
- private List mData = new ArrayList<>();
- private int mSelectLineId = -1;
-
- @Override
- protected int getLayoutId() {
- return R.layout.activity_sweeper_switch_line;
- }
-
- @NonNull
- @Override
- protected SweeperLinePresenter createPresenter() {
- return new SweeperLinePresenter(this);
- }
-
- @Override
- protected void initViews() {
- initWH();
- initView();
- }
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- initDatas();
- }
-
- /**
- * 初始化view
- */
- private void initView() {
- mClose = findViewById(R.id.switch_line_close);
- mClose.setOnClickListener(this);
- mNoDatasView = findViewById(R.id.no_order_data_view);
-
- mLineCommitBtn = findViewById(R.id.switch_line_btn_commit);
- mLineCommitBtn.setOnClickListener(this);
-
- mLinesListView = findViewById(R.id.switch_line_rv);
- mLinesListView.setLayoutManager(new LinearLayoutManager(this));
- mAdapter = new SwitchLineAdapter(getApplicationContext(),mData);
- mLinesListView.setAdapter(mAdapter);
- //设置item 点击事件
- mAdapter.setOnLineItemClickListener(new LineItemClickListener() {
- @Override
- public void onItemClick(int position) {
- if (mData.size() > position && !TextUtils.isEmpty(mData.get(position).startSiteName )
- && !TextUtils.isEmpty(mData.get(position).endSiteName)){
- mSelectLineId = mData.get(position).lineId;
- }else {
- mSelectLineId = -1;
- }
- }
- });
- }
-
- /**
- * 设置布局宽高
- */
- private void initWH() {
-
- Window window = getWindow();
-
- WindowManager.LayoutParams params = window.getAttributes();
- WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
- Point point = new Point();
- windowManager.getDefaultDisplay().getSize(point);//用于获取屏幕高度
-
- params.width = (int)(point.x * 0.375);
- params.height = ViewGroup.LayoutParams.MATCH_PARENT;
- window.setAttributes(params);
- window.setGravity(Gravity.LEFT|Gravity.BOTTOM);
- }
-
- /**
- * 初始化数据
- */
- private void initDatas() {
- mPresenter.queryBusLines();
- }
-
- /**
- * 查询返回绑定路线集合
- * @param data
- */
- @Override
- public void onBusLinesChange(SweeperQueryLinesResponse data){
- if (null == data){
- showNoData(true);
- return;
- }
- if (data.data != null && data.data.size() > 0){
- showNoData(false);
- mData.clear();
- mData.addAll(data.data);
- mAdapter.notifyDataSetChanged();
- changeCommitBtnBg();
- }else {
- showNoData(true);
- }
- }
-
- /**
- * 根据路线选中情况设置提交按钮样式
- */
- private void changeCommitBtnBg() {
- for (int i=0; i -1){
- mPresenter.commitSwitchLineId(mSelectLineId);
- }else {
- finish();
- }
- return;
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- }
-
- /**
- * 路线列表adapter
- */
- static class SwitchLineAdapter extends RecyclerView.Adapter{
-
- private Context mContext;
- private List mData;
- // RecyclerView设置点击事件
- private LineItemClickListener mItemClickListener ;
- private int clickPos = -1;
-
- public SwitchLineAdapter(Context context, List data){
- mContext = context;
- mData = data;
- }
-
- @NonNull
- @Override
- public SwitchLineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(mContext).inflate(R.layout.sweeper_switch_line_list_item
- ,parent,false);
- SwitchLineViewHolder viewHolder = new SwitchLineViewHolder(view);
- return viewHolder;
- }
-
- @Override
- public void onBindViewHolder(@NonNull SwitchLineViewHolder holder, @SuppressLint("RecyclerView") int position) {
- SweeperQueryLinesResponse.Result line = mData.get(position);
- holder.lineName.setText(mContext.getString(R.string.sweeper_switch_line_name)+" "+line.name);
- holder.lineStartName.setText(mContext.getString(R.string.sweeper_line_start)+" "+line.startSiteName);
- holder.lineEndName.setText(mContext.getString(R.string.sweeper_line_end)+" "+line.endSiteName);
-
- //设置item点击事件
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mItemClickListener != null){
- mItemClickListener.onItemClick(position);
- clickPos = position;
- notifyDataSetChanged();
- }
- }
- });
- //选中绑定
- if (clickPos > -1){
- if (clickPos == position){
- holder.selectIv.setImageResource(R.drawable.sweeper_selected_btn);
- }else {
- holder.selectIv.setImageResource(R.drawable.sweeper_unselect_btn);
- }
- }else {
- if (line.choose == 1){//1:绑定 2:未绑定 默认绑定
- if (mItemClickListener != null) {
- mItemClickListener.onItemClick(position);
- }
- holder.selectIv.setImageResource(R.drawable.sweeper_selected_btn);
- }else {
- holder.selectIv.setImageResource(R.drawable.sweeper_unselect_btn);
- }
- }
-
- }
-
- @Override
- public int getItemCount() {
- return mData.size();
- }
- public void setOnLineItemClickListener(LineItemClickListener itemClickListener){
- this.mItemClickListener = itemClickListener ;
-
- }
- }
-
- static class SwitchLineViewHolder extends RecyclerView.ViewHolder{
-
- private ImageView selectIv;
- private TextView lineName; //线路名称
- private TextView lineStartName; //起点
- private TextView lineEndName; //终点
-
- public SwitchLineViewHolder(@NonNull View itemView) {
- super(itemView);
- selectIv = itemView.findViewById(R.id.switch_line_item_select_iv);
- lineName = itemView.findViewById(R.id.switch_line_name);
- lineStartName = itemView.findViewById(R.id.switch_line_start_station);
- lineEndName = itemView.findViewById(R.id.switch_line_end_station);
- }
- }
-
- public interface LineItemClickListener {
- void onItemClick(int position) ;
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperSwitchLineView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperSwitchLineView.java
deleted file mode 100644
index 3cfdb9fdb9..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/SweeperSwitchLineView.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.mogo.och.sweeper.ui;
-
-import com.mogo.commons.mvp.IView;
-import com.mogo.och.sweeper.bean.SweeperQueryLinesResponse;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/10
- */
-public interface SweeperSwitchLineView extends IView {
-
- void onBusLinesChange(SweeperQueryLinesResponse data);
- void onChangeLineIdSuccess();
-}
-
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/adapter/TaskListAdapter.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/adapter/TaskListAdapter.kt
new file mode 100644
index 0000000000..08ed01f84a
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/adapter/TaskListAdapter.kt
@@ -0,0 +1,79 @@
+package com.mogo.och.sweeper.ui.adapter
+
+import android.graphics.Color
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.mogo.och.common.module.utils.DateTimeUtil
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.bean.SweeperMainTaskBean
+
+class TaskListAdapter() : RecyclerView.Adapter() {
+ private var mItemClickListener: TaskItemClickListener? = null
+ private var mSelectPosition: Int = -1
+ private var data:MutableList?=null
+ fun setOnTaskItemClickListener(itemClickListener: TaskItemClickListener?) {
+ mItemClickListener = itemClickListener
+ }
+
+ class TaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ val selectIv: ImageView
+ val taskName: TextView//任务名称
+ val taskDesc: TextView//任务描述
+ val tvTaskTime: TextView//任务时间
+
+ init {
+ selectIv = itemView.findViewById(R.id.ivTaskSelect)
+ taskName = itemView.findViewById(R.id.tvTaskName)
+ taskDesc = itemView.findViewById(R.id.tvTaskDesc)
+ tvTaskTime = itemView.findViewById(R.id.tvTaskTime)
+ }
+ }
+
+ fun selectPosition(position: Int) {
+ this.mSelectPosition = position
+ notifyDataSetChanged()
+ }
+ fun setTaskListData(data: MutableList?){
+ this.data=data
+ notifyDataSetChanged()
+ }
+ interface TaskItemClickListener {
+ fun onItemClick(position: Int,mainTask:SweeperMainTaskBean)
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskViewHolder {
+ val view = LayoutInflater.from(parent.context).inflate(
+ R.layout.sweeper_item_task_info, parent, false
+ )
+ return TaskViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: TaskViewHolder, position: Int) {
+ data?.let { mainTask->
+ holder.taskName.text= mainTask[position].mainTaskName
+ holder.taskDesc.text= "全程包含${mainTask[position].subTaskTotal}个子任务"
+ val calendar = DateTimeUtil.formatLongToCalendar(mainTask[position].mainTaskStartTime)
+ if (DateTimeUtil.compareDateIsCurrentDay(calendar)){
+ holder.tvTaskTime.text="今天${DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.TAXI_HH_mm)}"
+ }else{
+ holder.tvTaskTime.text=DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.TAXI_MM_dd_HH_mm)
+ }
+ holder.itemView.setOnClickListener {
+ mItemClickListener?.onItemClick(position,mainTask[position])
+ }
+ }
+ if (position == mSelectPosition) {
+ holder.selectIv.visibility = View.VISIBLE
+ holder.itemView.setBackgroundColor(Color.parseColor("#FF122B4E"))
+ } else {
+ holder.selectIv.visibility = View.GONE
+ holder.itemView.setBackgroundColor(Color.parseColor("#00000000"))
+ }
+ }
+
+ override fun getItemCount(): Int = data?.size ?: 0
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/dialog/SweeperManualDrivingDialog.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/dialog/SweeperManualDrivingDialog.kt
new file mode 100644
index 0000000000..788f2965e6
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/dialog/SweeperManualDrivingDialog.kt
@@ -0,0 +1,70 @@
+package com.mogo.och.sweeper.ui.dialog
+
+import android.content.Context
+import android.widget.TextView
+import androidx.lifecycle.LifecycleObserver
+import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
+import com.mogo.och.sweeper.R
+
+/**
+ * 不带带有title, tip,confirm,cancel的dialog
+ */
+class SweeperManualDrivingDialog: BaseFloatDialog, LifecycleObserver {
+
+ private var commonConfirm : TextView? = null
+ private var commonTips : TextView? = null
+
+ private var clickListener: ClickListener? = null
+
+ constructor(builder: Builder,context: Context) : super(context) {
+ commonTips?.text = builder.tipsStr
+ commonConfirm?.text = builder.confirmStr
+ }
+
+ init{
+ setContentView(R.layout.dialog_sweeper_manual_driving)
+
+ setCanceledOnTouchOutside(false)
+
+ commonConfirm = findViewById(R.id.sweeper_common_confirm)
+ commonTips = findViewById(R.id.sweeper_common_tips)
+
+ commonConfirm?.setOnClickListener{
+ clickListener?.confirm()
+ dismiss()
+ }
+ }
+
+ fun setClickListener(clickListener: ClickListener) {
+ this.clickListener = clickListener
+ }
+
+ fun showUpgradeDialog(){
+ if(isShowing){
+ return
+ }
+ show()
+ }
+
+ interface ClickListener{
+ fun confirm()
+ }
+
+ class Builder{
+ var tipsStr:String = ""
+ var confirmStr:String = ""
+ fun tips(tips: String) : Builder{
+ this.tipsStr = tips
+ return this
+ }
+
+ fun confirmStr(commit: String) : Builder{
+ this.confirmStr = commit
+ return this
+ }
+ fun build(context: Context): SweeperManualDrivingDialog? {
+ return SweeperManualDrivingDialog(this,context)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/dialog/SweeperNoTitleCommonDialog.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/dialog/SweeperNoTitleCommonDialog.kt
new file mode 100644
index 0000000000..4f05e7cee9
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/dialog/SweeperNoTitleCommonDialog.kt
@@ -0,0 +1,86 @@
+package com.mogo.och.sweeper.ui.dialog
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.widget.TextView
+import androidx.lifecycle.LifecycleObserver
+import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
+import com.mogo.och.sweeper.R
+
+/**
+ * 不带带有title, tip,confirm,cancel的dialog
+ */
+class SweeperNoTitleCommonDialog: BaseFloatDialog, LifecycleObserver {
+
+ private var commonConfirm : TextView? = null
+ private var commonCancel : TextView? = null
+ private var commonTips : TextView? = null
+
+ private var clickListener: ClickListener? = null
+
+ constructor(builder: Builder,context: Context) : super(context) {
+ commonTips?.text = builder.tipsStr
+ commonCancel?.text = builder.cancelStr
+ commonConfirm?.text = builder.confirmStr
+ }
+
+ init{
+ setContentView(R.layout.dialog_sweeper_no_title)
+
+ setCanceledOnTouchOutside(true)
+
+ commonConfirm = findViewById(R.id.sweeper_common_confirm)
+ commonCancel = findViewById(R.id.sweeper_common_cancel)
+ commonTips = findViewById(R.id.sweeper_common_tips)
+
+ commonConfirm?.setOnClickListener{
+ clickListener?.confirm()
+ dismiss()
+ }
+ commonCancel?.setOnClickListener {
+ clickListener?.cancel()
+ dismiss()
+ }
+ }
+
+ fun setClickListener(clickListener: ClickListener) {
+ this.clickListener = clickListener
+ }
+
+ fun showUpgradeDialog(){
+ if(isShowing){
+ return
+ }
+ show()
+ }
+
+ interface ClickListener{
+ fun confirm()
+ fun cancel()
+ }
+
+ class Builder{
+ var tipsStr:String = ""
+ var confirmStr:String = ""
+ var cancelStr:String = ""
+ fun tips(tips: String) : Builder{
+ this.tipsStr = tips
+ return this
+ }
+
+ fun confirmStr(commit: String) : Builder{
+ this.confirmStr = commit
+ return this
+ }
+
+ fun cancelStr(cancel: String) : Builder{
+ this.cancelStr = cancel
+ return this
+ }
+
+ fun build(context: Context): SweeperNoTitleCommonDialog? {
+ return SweeperNoTitleCommonDialog(this,context)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/MenuPopWindow.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/MenuPopWindow.kt
new file mode 100644
index 0000000000..1f2c5ad8f0
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/MenuPopWindow.kt
@@ -0,0 +1,91 @@
+package com.mogo.och.sweeper.ui.popwindow
+
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup.LayoutParams
+import android.widget.PopupWindow
+import android.widget.TextView
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.constant.TaskStatusEnum
+
+/**
+ * 当前任务操作菜单栏
+ */
+class MenuPopWindow : PopupWindow, View.OnClickListener{
+
+ private var mTvJumpOverTask: TextView? = null
+
+ private var mTaskJumpLineView: View? = null
+
+ private var mTvEndTask: TextView? = null
+
+ private var mTvCancelTask: TextView? = null
+
+ private var mMenuItemClickListener:OnMenuItemOnClickListener?=null
+
+ constructor(context: Context,menuItemClickListener:OnMenuItemOnClickListener) : super(context) {
+ init(context)
+ this.mMenuItemClickListener=menuItemClickListener
+ }
+
+ /**
+ * 初始化布局
+ */
+ private fun init(context: Context) {
+ setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+ var view: View = LayoutInflater.from(context).inflate(R.layout.sweeper_task_menu, null)
+ mTvJumpOverTask = view.findViewById(R.id.tvJumpOverTask)
+ mTaskJumpLineView = view.findViewById(R.id.taskJumpLineView)
+ mTvEndTask = view.findViewById(R.id.tvEndTask)
+ mTvCancelTask = view.findViewById(R.id.tvCancelTask)
+ mTvJumpOverTask?.setOnClickListener(this)
+ mTvEndTask?.setOnClickListener(this)
+ mTvCancelTask?.setOnClickListener(this)
+ width = context.resources.getDimension(R.dimen.dp_174).toInt()
+ height = LayoutParams.WRAP_CONTENT
+ contentView = view
+ isFocusable = true
+ isOutsideTouchable = true
+ }
+
+ /**
+ * 设置是否是手动任务
+ * 1:云端自动驾驶任务
+ * 2:云端手动驾驶任务
+ * 3: 运营任务
+ */
+ fun setMenuView(type: Int) {
+ if (type == 1) {
+ mTvJumpOverTask?.visibility = View.GONE
+ mTaskJumpLineView?.visibility = View.GONE
+ } else {
+ mTvJumpOverTask?.visibility = View.VISIBLE
+ mTaskJumpLineView?.visibility = View.VISIBLE
+ }
+ }
+
+ interface OnMenuItemOnClickListener {
+ fun onMenuItemClick(itemType: TaskStatusEnum)
+ }
+
+ override fun onClick(v: View) {
+ when(v.id){
+ R.id.tvJumpOverTask->{
+ mMenuItemClickListener?.onMenuItemClick(TaskStatusEnum.JUMP_OVER_SUBTASK)
+ dismiss()
+ }
+ R.id.tvEndTask->{
+ mMenuItemClickListener?.onMenuItemClick(TaskStatusEnum.END_TASK)
+ dismiss()
+ }
+ R.id.tvCancelTask->{
+ mMenuItemClickListener?.onMenuItemClick(TaskStatusEnum.CANCEL_TASK)
+ dismiss()
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt
new file mode 100644
index 0000000000..1004555886
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/ui/popwindow/SweeperOperatePanelPopWindow.kt
@@ -0,0 +1,59 @@
+package com.mogo.och.sweeper.ui.popwindow
+
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import android.widget.PopupWindow
+import chassis.ChassisStatesOuterClass
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.callback.ICleaningModeStateCallback
+import com.mogo.och.sweeper.constant.OperateStateEnum
+import com.mogo.och.sweeper.ui.SweeperOperatePanelView
+
+/**
+ * 清扫车面板浮窗
+ */
+class SweeperOperatePanelPopWindow : PopupWindow{
+
+ private var mOperatePanelView: SweeperOperatePanelView? = null
+
+ constructor(context: Context) : super(context) {
+ init(context)
+ }
+ private fun init(context: Context) {
+ setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+ mOperatePanelView = LayoutInflater.from(context).inflate(R.layout.sweeper_popwindow_operate_panel, null) as SweeperOperatePanelView?
+ width = ViewGroup.LayoutParams.WRAP_CONTENT
+ height = ViewGroup.LayoutParams.WRAP_CONTENT
+ contentView = mOperatePanelView
+ }
+
+ /**
+ * 设置清扫模式数据
+ */
+ fun setCleanSystemState(
+ cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates?,
+ cleaningModeStateCallback: ICleaningModeStateCallback
+ ) {
+ mOperatePanelView?.setSweeperFutianCleanSystemState(cleanSystemState, cleaningModeStateCallback)
+ }
+
+ /**.
+ *
+ * 设置是否让popWindow消失
+ */
+ fun setIsOutsideTouchable(isOutsideTouchable:Boolean){
+ this.isFocusable = isOutsideTouchable
+ this.isOutsideTouchable = isOutsideTouchable
+ this.isTouchable=isOutsideTouchable
+ }
+
+ /**
+ * 设置是否展示状态同步中
+ */
+ fun showSyncing(operateState: OperateStateEnum){
+ mOperatePanelView?.showSyncing(operateState)
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/BDRouteDataTestUtils.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/BDRouteDataTestUtils.java
deleted file mode 100644
index 85634178f1..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/BDRouteDataTestUtils.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.mogo.och.sweeper.util;
-
-import com.mogo.och.sweeper.model.SweeperOrderModel;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import mogo.telematics.pad.MessagePad;
-
-/**
- * @author: wangmingjun
- * @date: 2022/4/13
- */
-public class BDRouteDataTestUtils {
-
- static String jsonStr ="{\n" +
- " \"models\": [\n" +
- " {\n" +
- " \"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927760268911,\"lon\":116.73512607061035,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927736555187,\"lon\":116.73498243020299,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927135941599,\"lon\":116.73482951462647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199260672670036,\"lon\":116.73468429259535,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199251260349946,\"lon\":116.73453933465,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924691997577,\"lon\":116.7343756435551,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199247953493625,\"lon\":116.73421240809087,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924986849947,\"lon\":116.73400425509712,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199249431152175,\"lon\":116.73378579041055,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199248921305724,\"lon\":116.73357811807278,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925012387371,\"lon\":116.73337650020184,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252270195075,\"lon\":116.73318223781153,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992521615169,\"lon\":116.73298632625203,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925202633083,\"lon\":116.73279582043983,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199261230205735,\"lon\":116.73263403473568,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199327991681926,\"lon\":116.73251962434813,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19944850496711,\"lon\":116.73249661840195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199582026896415,\"lon\":116.73251038561487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199743326352014,\"lon\":116.73253087453938,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199908347167394,\"lon\":116.73255070500186,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200065950595445,\"lon\":116.7325720694418,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20022747460407,\"lon\":116.73259461416663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384057310536,\"lon\":116.73261575018056,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20053849777916,\"lon\":116.73263451936387,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200696919444624,\"lon\":116.7326540541723,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2008524952796,\"lon\":116.7326743511824,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20101429705625,\"lon\":116.73269393580199,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118279997041,\"lon\":116.73271564378308,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201342388452076,\"lon\":116.73273653366076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201476063822355,\"lon\":116.73275292393079,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163479199852,\"lon\":116.73277440686762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181243476041,\"lon\":116.7328052766508,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201991767093304,\"lon\":116.7328453845644,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20215573733484,\"lon\":116.73287624009339,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202313648759784,\"lon\":116.73289887933315,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434745374454,\"lon\":116.7329182210956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253164952098,\"lon\":116.73297539811277,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258043275509,\"lon\":116.73312335324984,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258233576585,\"lon\":116.73331077089557,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20257107560234,\"lon\":116.73351244039137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202561578580514,\"lon\":116.73370176209845,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20256256788661,\"lon\":116.73391325024126,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20255633158834,\"lon\":116.73413195000244,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202543311179575,\"lon\":116.73436614303907,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253067346457,\"lon\":116.73458032609663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20251776111356,\"lon\":116.73477082198242,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202503997557805,\"lon\":116.73498624001282,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20249129260376,\"lon\":116.73518976336872,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247877796589,\"lon\":116.73537786253135,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246651610268,\"lon\":116.73559239130266,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245754388014,\"lon\":116.73574239922202,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20244749208,\"lon\":116.73589674090469,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243806550113,\"lon\":116.73607057284322,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243550556816,\"lon\":116.73628106525871,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243654127756,\"lon\":116.7364949950665,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243738221016,\"lon\":116.7367061649993,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243672476754,\"lon\":116.73691115930336,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243590788176,\"lon\":116.73710722104272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202436434375336,\"lon\":116.73730688607075,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243749821501,\"lon\":116.73750140347998,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243625962803,\"lon\":116.73771330926793,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434515480725,\"lon\":116.73791895606205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024326561388,\"lon\":116.73815206945737,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243092086137,\"lon\":116.73838655528765,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202430876006126,\"lon\":116.73861890759498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242914053177,\"lon\":116.73882029918758,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242843336561,\"lon\":116.73904465495175,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242661219026,\"lon\":116.73922453252953,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426462811076,\"lon\":116.7393708046956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242687134937,\"lon\":116.73954685547025,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242694967377,\"lon\":116.73975021183773,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202424630601236,\"lon\":116.73999740812975,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202422502184625,\"lon\":116.74028266774337,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202419634158936,\"lon\":116.7405942561498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241975959762,\"lon\":116.7409069557092,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241920524113,\"lon\":116.74120156191647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241765540262,\"lon\":116.74149288504978,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241569149764,\"lon\":116.7418080096762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202414529497084,\"lon\":116.74210262897205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241419532155,\"lon\":116.74241767661879,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202413879360954,\"lon\":116.7427571218185,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241287045245,\"lon\":116.7431284691325,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241214965105,\"lon\":116.74343354359334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241141271715,\"lon\":116.7437220210538,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024080520075,\"lon\":116.74399113498052,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202391714280026,\"lon\":116.74427625698272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20238163805639,\"lon\":116.74452083315958,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379293010274,\"lon\":116.74475703837204,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379007817086,\"lon\":116.7449961645494,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20237814181231,\"lon\":116.7452036063558,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202375477619896,\"lon\":116.74539567654291,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2023632396621,\"lon\":116.74555457589031,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20229396554444,\"lon\":116.7456716047369,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20217800547467,\"lon\":116.74574081942625,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202047498095304,\"lon\":116.74573659255675,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20188573786706,\"lon\":116.74571018281719,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201738240263026,\"lon\":116.74568463148606,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20157507049073,\"lon\":116.74565525041498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20137985142042,\"lon\":116.745619970576,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201187335613575,\"lon\":116.74558631350607,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20098251429043,\"lon\":116.74555055587679,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2007748533628,\"lon\":116.74551426934663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20057082986032,\"lon\":116.74547749663195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20036944224329,\"lon\":116.74544156175533,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016365229035,\"lon\":116.74540577510051,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1999958572445,\"lon\":116.74537505807076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19984100521566,\"lon\":116.7453433678602,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1996863960282,\"lon\":116.74529675648621,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19953919567943,\"lon\":116.74525916493474,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19940587189373,\"lon\":116.74523402869453,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19929047792381,\"lon\":116.74518617038383,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922141745155,\"lon\":116.74506912884067,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920798885308,\"lon\":116.744896716334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920912644279,\"lon\":116.74467216715483,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199209186509314,\"lon\":116.74448257515108,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920910709997,\"lon\":116.74430613406223,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992100786082,\"lon\":116.74410888316238,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921081961254,\"lon\":116.74391968819582,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921040855518,\"lon\":116.7437082083402,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921085053439,\"lon\":116.74346931155634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921197237373,\"lon\":116.74325149697013,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921248248983,\"lon\":116.74301103786591,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992139724646,\"lon\":116.74277237066539,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215818352386,\"lon\":116.74253219408898,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216175018876,\"lon\":116.74228853120842,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215970354246,\"lon\":116.74204663206451,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216627492966,\"lon\":116.74183871233049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921789170398,\"lon\":116.74165788334192,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922000138535,\"lon\":116.74144512197054,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199221559127494,\"lon\":116.741249370491,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922287231889,\"lon\":116.7410525810756,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922229019589,\"lon\":116.74085266662037,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992216995901,\"lon\":116.74061957723823,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922263073874,\"lon\":116.74041638149129,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922478093337,\"lon\":116.7402123910757,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199227066091595,\"lon\":116.74003419421553,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199228634241756,\"lon\":116.73985841944678,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922951636012,\"lon\":116.7397079274105,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252095329484,\"lon\":116.73956265582487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199346162997905,\"lon\":116.73944690416265,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199470799628024,\"lon\":116.73941941053417,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19962513314346,\"lon\":116.7394280706812,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199780626058924,\"lon\":116.73944255215424,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199961525343376,\"lon\":116.73945856750177,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016196947193,\"lon\":116.73947572081121,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384479551936,\"lon\":116.7394949225795,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200595083817475,\"lon\":116.73951027963179,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200792203321086,\"lon\":116.73952526850614,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200985930701684,\"lon\":116.73954125209579,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20115978977055,\"lon\":116.73955610094161,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201321019536124,\"lon\":116.7395695239138,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20147117943043,\"lon\":116.7395823299481,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163699848565,\"lon\":116.73959633422596,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20178484338371,\"lon\":116.7396085776486,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201962185646316,\"lon\":116.73962351991214,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021018923927,\"lon\":116.7396354059821,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2022137620686,\"lon\":116.73964348380458,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20232600820075,\"lon\":116.73961190446633,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241090270993,\"lon\":116.73951649703137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245777783807,\"lon\":116.73937664238166,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246906634823,\"lon\":116.73920146119093,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470916682884,\"lon\":116.73898763065634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247034830421,\"lon\":116.73878158418357,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246978204673,\"lon\":116.73857680142473,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247082638905,\"lon\":116.73834517890637,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202471943178196,\"lon\":116.7381047689514,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247131648035,\"lon\":116.73787761484981,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470799473765,\"lon\":116.73766230702478,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247013054322,\"lon\":116.73743619407796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246999515433,\"lon\":116.73724916823292,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247199652478,\"lon\":116.73704888970806,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202473960263525,\"lon\":116.73684083235807,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202474504753205,\"lon\":116.73665462440796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247501354581,\"lon\":116.73650710371837,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246541231906,\"lon\":116.73635807696789,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426768984274,\"lon\":116.73622283382787,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20236638788854,\"lon\":116.73610589402243,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20227106919894,\"lon\":116.73600895001849,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021428343084,\"lon\":116.73596816020945,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20197815580698,\"lon\":116.73594623645097,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181789535303,\"lon\":116.73593148707488,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201667906886954,\"lon\":116.73591743008926,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201505897730755,\"lon\":116.7359002912543,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20135083580946,\"lon\":116.73588579696379,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118617904595,\"lon\":116.73586970398149,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20102374028594,\"lon\":116.73585314703226,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20085554043743,\"lon\":116.73583763953049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20069451888229,\"lon\":116.73582073901778,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200530837344964,\"lon\":116.73580314359012,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2003608457064,\"lon\":116.73578183888779,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20021770046798,\"lon\":116.73575292592922,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20003454701824,\"lon\":116.7357174959358,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19986125116602,\"lon\":116.73569499961796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19969408518737,\"lon\":116.73567725223492,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19955533048882,\"lon\":116.73566375985422,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19943174810538,\"lon\":116.73564927714162,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19933167546824,\"lon\":116.735595995086,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199280357603875,\"lon\":116.73546293260645,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927848361656,\"lon\":116.73531579486274,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19928127892504,\"lon\":116.73505848474375,\"speed\": 0.0\n" +
- " }\n" +
- " ]\n" +
- "}";
- public static void converToRouteData(){
- List list = new ArrayList<>();
-
- try {
- JSONObject jsonObject = new JSONObject(jsonStr);
- JSONArray jsonElements = jsonObject.getJSONArray("models");
- for (int i = 0; i < jsonElements.length(); i++) {
- JSONObject s = jsonElements.getJSONObject(i);
- MessagePad.Location.Builder builder = MessagePad.Location.newBuilder();
- builder.setLatitude(s.getDouble("lat"));
- builder.setLongitude(s.getDouble("lon"));
- list.add(builder.build());
- }
- SweeperOrderModel.getInstance().debugUpdateOrderRoute(list);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java
index b73559496e..4693fae7ed 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java
@@ -1,13 +1,17 @@
package com.mogo.och.sweeper.util;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_SWEEPER;
+
+import android.os.Build;
import android.text.TextUtils;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.utils.MogoAnalyticUtils;
import com.mogo.eagle.core.data.app.AppConfigInfo;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.commons.utils.MogoAnalyticUtils;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.sweeper.constant.SweeperConst;
@@ -29,18 +33,55 @@ public class SweeperAnalyticsManager {
return SweeperAnalyticsManager.SingletonHolder.INSTANCE;
}
-
-
private String mStartAutopilotKey;
private HashMap mStartAutopilotParams = new HashMap<>();
private Runnable startAutopilotRunnable = () -> {
// 15s内未开启,上报失败埋点
+ triggerStartAutopilotFailureEvent("", "15s后app等待超时");
+ };
+
+ public void triggerStartAutopilotFailureEventByAdas(String failCode, String failMsg){
+ removeWaitingCallback();
+ triggerStartAutopilotFailureEvent(failCode, failMsg);
+ }
+
+ private void triggerStartAutopilotFailureEvent(String failCode, String failMsg){
+ if (mStartAutopilotParams.isEmpty()) return;
+
+ CallerLogger.INSTANCE.e( M_SWEEPER + "triggerStartAutopilotFailureEvent", failMsg );
+
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() !=
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
+ mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_FAILURE_CODE, failCode);
+ mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_FAILURE_MSG, failMsg);
+ }
mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_RESULT
, CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() ==
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+
MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
- };
+
+ clearStartAutopilotParams();//清空参数数据,防止误传
+ }
+
+ private void removeWaitingCallback() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ if (startAutopilotRunnable != null &&
+ UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) {
+ UiThreadHandler.removeCallbacks(startAutopilotRunnable);
+ }
+ }
+ }
+
+ public void clearStartAutopilotFailureMSG(){
+ mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_FAILURE_CODE, "");
+ mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_FAILURE_MSG, "");
+ }
+
+ private void clearStartAutopilotParams(){
+ mStartAutopilotParams.clear();
+ }
/**
* 触发'开启自动驾驶'埋点流程
@@ -67,14 +108,43 @@ public class SweeperAnalyticsManager {
mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_LINE_ID, lineId);
if (send) {
+ if (mStartAutopilotParams.isEmpty()) return;
// 开启成功,上报埋点
- if (startAutopilotRunnable != null) {
- UiThreadHandler.removeCallbacks(startAutopilotRunnable);
- }
+ clearStartAutopilotFailureMSG();
+ removeWaitingCallback();
mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_RESULT, true);
MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
+
+ clearStartAutopilotParams();//清空参数数据,防止误传
} else {
UiThreadHandler.postDelayed(startAutopilotRunnable, SweeperConst.LOOP_PERIOD_15S);
}
}
+
+ /**
+ * 触发"无法开启自驾已知异常"埋点
+ * @param startName
+ * @param endName
+ * @param lineId
+ */
+ public void triggerUnableStartAPReasonEvent(String startName, String endName, int lineId,
+ String reason) {
+ String sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ String plateNum = AppConfigInfo.INSTANCE.getPlateNumber();
+ String dateTime = DateTimeUtils.getTimeText(
+ System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss);
+
+ HashMap params = new HashMap<>();
+
+ params.put(SweeperConst.EVENT_PARAM_SN, sn);
+ params.put(SweeperConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum);
+ params.put(SweeperConst.EVENT_PARAM_ENV_ONLINE,
+ DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false);
+ params.put(SweeperConst.EVENT_PARAM_TIME, dateTime);
+ params.put(SweeperConst.EVENT_PARAM_START_NAME, startName);
+ params.put(SweeperConst.EVENT_PARAM_END_NAME, endName);
+ params.put(SweeperConst.EVENT_PARAM_LINE_ID, lineId);
+ params.put(SweeperConst.EVENT_PARAM_UNABLE_START_REASON, reason);
+ MogoAnalyticUtils.INSTANCE.track(SweeperConst.EVENT_KEY_AP_UNABLE_START_REASON, params);
+ }
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java
index 969b0dbc34..79932ae4d2 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperFutianCmdUtil.java
@@ -1,23 +1,23 @@
package com.mogo.och.sweeper.util;
+import chassis.ChassisStatesOuterClass;
import chassis.SpecialVehicleTaskCmdOuterClass;
-import chassis.VehicleStateOuterClass;
/**
* 清扫车-福田,构建业务命令数据的工具类
*/
public class SweeperFutianCmdUtil {
- private static final int CLEAN_WORK_OPEN = 1; //清扫作业-开启
- private static final int CLEAN_WORK_CLOSE = 2;//清扫作业-关闭
+ public static final int CLEAN_WORK_OPEN = 1; //清扫作业-开启
+ public static final int CLEAN_WORK_CLOSE = 2;//清扫作业-关闭
public static final int CLEAN_MODE_PURE_SWEEP = 1;//作业模式-纯扫
public static final int CLEAN_MODE_WASH_SWEEP = 2;//作业模式-洗扫
public static final int CLEAN_MODE_PURE_WASH = 3;//作业模式-纯洗
public static final int CLEAN_MODE_PURE_DRAW = 4;//作业模式-纯吸
- private static final int CLEAN_MODE_CLOSE = 5;//作业模式-关闭
+ public static final int CLEAN_MODE_CLOSE = 5;//作业模式-关闭
public static final int CLEAN_DIRECTION_BOTH_SIDE = 1;//清扫方向-两侧
public static final int CLEAN_DIRECTION_LEFT_SIDE = 2;//清扫方向-左侧
public static final int CLEAN_DIRECTION_RIGHT_SIDE = 3;//清扫方向-右侧
- private static final int CLEAN_DIRECTION_CLOSE = 4;//清扫方向-关闭
+ public static final int CLEAN_DIRECTION_CLOSE = 4;//清扫方向-关闭
public static final int CLEAN_INTENSITY_STRAND = 1;//作业强度-标准
public static final int CLEAN_INTENSITY_STRONG = 2;//作业强度-加强
@@ -131,13 +131,67 @@ public class SweeperFutianCmdUtil {
.setRoboSweeperFutianCleanCmd(fuTianCleanCmd).build();
}
+ /**
+ * 判断是否有作业模式
+ * @param cleanSystemState
+ * @return true:没有作业模式 false:有作业模式
+ */
+ public static boolean checkIfCleanMode(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState){
+ return (!cleanSystemState.getSecuModWashSweepSts()&&!cleanSystemState.getSecuModWashSts()&&!cleanSystemState.getSecuWorkTonSts())&&
+ (!cleanSystemState.getSecuWorkLeftSts()&&!cleanSystemState.getSecuWorkRightSts()&&!cleanSystemState.getSecuWorkOnBothsidesSts());
+ }
+
+ /**
+ * 判断是否有清扫方向
+ * @param cleanSystemState
+ * @return true:没有清扫方向 false:有清扫方向
+ */
+ public static boolean checkIfCleanDirection(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState){
+ return !cleanSystemState.getSecuWorkLeftSts()&&!cleanSystemState.getSecuWorkRightSts()&&!cleanSystemState.getSecuWorkOnBothsidesSts();
+ }
+ /**
+ * 判断是否有作业强度
+ * @param cleanSystemState
+ * @return true:没有作业强度 false:有作业强度
+ */
+ public static boolean checkIfCleanIntensity(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState){
+ return !cleanSystemState.getSecuWorkStandSts()&&!cleanSystemState.getSecuWorkStrongSts();
+ }
+ /**
+ * 判断是否纯扫模式
+ *
+ * @param cleanSystemState
+ * @return
+ */
+ public static boolean checkIfCleanModePureSweep(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) {
+ // 作业模式状态
+ // 洗扫
+ boolean clean_mode_wash_sweep = cleanSystemState.getSecuModWashSweepSts();
+ // 纯洗
+ boolean clean_mode_pure_wash = cleanSystemState.getSecuModWashSts();
+ // 纯吸
+ boolean clean_mode_pure_draw = cleanSystemState.getSecuWorkTonSts();
+
+ // 清扫方向状态
+ // 左侧
+ boolean clean_direction_left_side = cleanSystemState.getSecuWorkLeftSts();
+ // 右侧
+ boolean clean_direction_right_side = cleanSystemState.getSecuWorkRightSts();
+ // 两侧
+ boolean clean_direction_both_side = cleanSystemState.getSecuWorkOnBothsidesSts();
+
+ // 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式
+ boolean clean_mode_pure_sweep = (clean_direction_left_side || clean_direction_right_side || clean_direction_both_side)
+ && (!clean_mode_wash_sweep && !clean_mode_pure_wash && !clean_mode_pure_draw);
+ return clean_mode_pure_sweep;
+ }
/**
* 构建底盘Mock数据
*
* @return
*/
- public static VehicleStateOuterClass.SweeperFuTianCleanSystemState buildSweeperFuTionCleanSystemStateMockData() {
- VehicleStateOuterClass.SweeperFuTianCleanSystemState.Builder builder = VehicleStateOuterClass.SweeperFuTianCleanSystemState.newBuilder();
+ public static ChassisStatesOuterClass.SweeperFuTianTaskSystemStates buildSweeperFuTionCleanSystemStateMockData() {
+ ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.Builder builder = ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.newBuilder();
builder.setSecuMotWorkSts(true);
builder.setSecuModWashSts(true);
builder.setSecuWorkOnBothsidesSts(true);
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperMapAssetStyleUtil.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperMapAssetStyleUtil.java
new file mode 100644
index 0000000000..5f9f1db28e
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperMapAssetStyleUtil.java
@@ -0,0 +1,61 @@
+package com.mogo.och.sweeper.util;
+
+
+import android.content.Context;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author donghongyu
+ * @date 12/18/20 5:37 PM
+ */
+public class SweeperMapAssetStyleUtil {
+
+ public static byte[] getAssetsStyle(Context context,String fileName) {
+ byte[] buffer1 = null;
+ InputStream is1 = null;
+ try {
+ is1 = context.getResources().getAssets().open(fileName); //eg. over_view_style.data
+ int lenght1 = is1.available();
+ buffer1 = new byte[lenght1];
+ is1.read(buffer1);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (is1 != null) {
+ is1.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer1;
+ }
+
+
+ public static byte[] getAssetsExtraStyle(Context context, String fileName) {
+ byte[] buffer1 = null;
+ InputStream is1 = null;
+ try {
+ is1 = context.getResources().getAssets().open(fileName); //eg. over_view_style_extra.data
+ int lenght1 = is1.available();
+ buffer1 = new byte[lenght1];
+ is1.read(buffer1);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (is1 != null) {
+ is1.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer1;
+ }
+
+
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperTrajectoryManager.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperTrajectoryManager.java
index a259d0348b..878cb08b78 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperTrajectoryManager.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperTrajectoryManager.java
@@ -1,24 +1,22 @@
package com.mogo.och.sweeper.util;
-import androidx.annotation.Nullable;
-
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.GsonUtils;
-import com.mogo.och.sweeper.bean.SweeperRoutesResult;
+import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean;
import com.mogo.och.sweeper.constant.SweeperConst;
-import com.mogo.och.sweeper.model.SweeperOrderModel;
import java.util.concurrent.TimeUnit;
+import androidx.annotation.Nullable;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import mogo_msg.MogoReportMsg;
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_SWEEPER;
/**
* Bus轨迹管理:给MEC下发用于轨迹下载的信息
@@ -47,82 +45,63 @@ public class SweeperTrajectoryManager {
/**
* 同步Bus路线信息
*/
- public void syncTrajectoryInfo() {
- SweeperRoutesResult routesResult = SweeperOrderModel.getInstance().getBusRoutesResult();
- if (SweeperOrderModel.getInstance().isWorking() && routesResult != null
- && SweeperOrderModel.getInstance().getCurrentStationIndex() == 0
- && !SweeperOrderModel.getInstance().isGoingToNextStation()) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "syncTrajectoryInfo() start.");
- startTrajReqLoop();
+ public void syncTrajectoryInfo(SweeperSubTaskDetailBean sweeperSubTaskDetailBean) {
+ if (sweeperSubTaskDetailBean != null) {
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "syncTrajectoryInfo() start.");
+ startTrajReqLoop(sweeperSubTaskDetailBean);
} else {
// 无路线信息or当前未在始发站
- CallerLogger.INSTANCE.d(M_BUS + TAG, "syncTrajectoryInfo() stop.");
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "syncTrajectoryInfo() stop.");
stopTrajReqLoop();
}
}
/**
* 接口MEC反馈的常规信息(MAP v2.5.0新增轨迹相关信息)
+ *
* @param guardianInfo
*/
public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) {
if (guardianInfo == null || !guardianInfo.hasCode()) return;
if ("ISYS_INIT_TRAJECTORY_START".equals(guardianInfo.getCode())) {
// 1. 轨迹管理_轨迹开始下载(本地已有对应轨迹也触发)
- CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹开始下载");
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotGuardian() 轨迹开始下载");
// ToastUtils.showShort("轨迹开始下载");
stopTrajReqLoop();
} else if ("ISYS_INIT_TRAJECTORY_SUCCESS".equals(guardianInfo.getCode())) {
// 2. 轨迹管理_轨迹下载成功(本地已有对应轨迹也触发)
- CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹下载成功");
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotGuardian() 轨迹下载成功");
// ToastUtils.showShort("轨迹下载成功");
stopTrajReqLoop();
} else if ("ISYS_INIT_TRAJECTORY_FAILURE".equals(guardianInfo.getCode())) {
// 3. 轨迹管理_轨迹下载失败,本地无对应轨迹
- CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() " +
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotGuardian() " +
"轨迹下载失败,本地无对应轨迹");
// ToastUtils.showShort("轨迹下载失败,本地无对应轨迹");
} else if ("ISYS_INIT_TRAJECTORY_WARNING".equals(guardianInfo.getCode())) {
// 4. 轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功
- CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() " +
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotGuardian() " +
"轨迹下载失败,本地有对应轨迹,认为成功");
// ToastUtils.showShort("轨迹下载失败,本地有对应轨迹,认为成功");
} else if ("ISYS_INIT_TRAJECTORY_TIMEOUT".equals(guardianInfo.getCode())) {
// 5. 轨迹管理_轨迹下载超时
- CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹下载超时");
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotGuardian() 轨迹下载超时");
// ToastUtils.showShort("轨迹下载超时");
}
}
- private void setupAutoPilotLine() {
- SweeperRoutesResult routesResult = SweeperOrderModel.getInstance().getBusRoutesResult();
- if (routesResult == null) {
- CallerLogger.INSTANCE.e(M_BUS + TAG,
- "setupAutoPilotLine(): routesResult is null.");
+ private void setupAutoPilotLine(SweeperSubTaskDetailBean subTaskDetail) {
+ if (subTaskDetail == null) {
+ CallerLogger.INSTANCE.e(M_SWEEPER + TAG, "setupAutoPilotLine(): routesResult is null.");
return;
} else {
- if (mAutoPilotLine == null) {
- mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(routesResult.getLineId(),
- routesResult.csvFileUrl, routesResult.csvFileMd5,
- routesResult.txtFileUrl, routesResult.txtFileMd5,
- routesResult.contrailSaveTime, routesResult.carModel,
- routesResult.csvFileUrlDPQP, routesResult.csvFileMd5DPQP,
- routesResult.txtFileUrlDPQP, routesResult.txtFileMd5DPQP,
- routesResult.contrailSaveTimeDPQP);
- } else {
- mAutoPilotLine.setLineId(routesResult.getLineId());
- mAutoPilotLine.setTrajUrl(routesResult.csvFileUrl);
- mAutoPilotLine.setTrajMd5(routesResult.csvFileMd5);
- mAutoPilotLine.setStopUrl(routesResult.txtFileUrl);
- mAutoPilotLine.setStopMd5(routesResult.txtFileMd5);
- mAutoPilotLine.setTimestamp(routesResult.contrailSaveTime);
- mAutoPilotLine.setVehicleModel(routesResult.carModel);
- mAutoPilotLine.setTrajUrl_dpqp(routesResult.csvFileUrlDPQP);
- mAutoPilotLine.setTrajMd5_dpqp(routesResult.csvFileMd5DPQP);
- mAutoPilotLine.setStopUrl_dpqp(routesResult.txtFileUrlDPQP);
- mAutoPilotLine.setStopMd5_dpqp(routesResult.txtFileMd5DPQP);
- mAutoPilotLine.setTimestamp_dpqp(routesResult.contrailSaveTimeDPQP);
- }
+ mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(subTaskDetail.getLineId(),
+ subTaskDetail.getCsvFileUrl(), subTaskDetail.getCsvFileMd5(),
+ subTaskDetail.getTxtFileUrl(), subTaskDetail.getTxtFileMd5(),
+ subTaskDetail.getPublishTime(), subTaskDetail.getCarModel(),
+ subTaskDetail.getCsvFileUrlDPQP(), subTaskDetail.getCsvFileMd5DPQP(),
+ subTaskDetail.getTxtFileUrlDPQP(), subTaskDetail.getTxtFileMd5DPQP(),
+ subTaskDetail.getPublishTimeDPQP());
}
}
@@ -142,14 +121,14 @@ public class SweeperTrajectoryManager {
mAutoPilotLine.setTimestamp_dpqp(0);
}
- private void startTrajReqLoop() {
+ private void startTrajReqLoop(SweeperSubTaskDetailBean sweeperSubTaskDetailBean) {
if (mSendReqDisposable != null && !mSendReqDisposable.isDisposed()) {
return;
}
- CallerLogger.INSTANCE.d(M_BUS + TAG, "startTrajReqLoop()");
- setupAutoPilotLine();
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "startTrajReqLoop()");
+ setupAutoPilotLine(sweeperSubTaskDetailBean);
mSendReqDisposable = Observable.interval(SweeperConst.LOOP_DELAY,
- SweeperConst.LOOP_PERIOD_10S, TimeUnit.MILLISECONDS)
+ SweeperConst.LOOP_PERIOD_10S, TimeUnit.MILLISECONDS)
.map((aLong -> aLong + 1))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
@@ -158,14 +137,14 @@ public class SweeperTrajectoryManager {
stopTrajReqLoop();
return;
}
- CallerLogger.INSTANCE.d(M_BUS + TAG, "loop sendTrajectoryReq: " + aLong);
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "loop sendTrajectoryReq: " + aLong);
sendTrajectoryReq();
});
}
public void stopTrajReqLoop() {
if (mSendReqDisposable != null) {
- CallerLogger.INSTANCE.d(M_BUS + TAG, "stopTrajReqLoop()");
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "stopTrajReqLoop()");
mSendReqDisposable.dispose();
mSendReqDisposable = null;
clearAutoPilotLine();
@@ -174,7 +153,7 @@ public class SweeperTrajectoryManager {
private void sendTrajectoryReq() {
if (mAutoPilotLine == null) {
- CallerLogger.INSTANCE.e(M_BUS + TAG, "sendTrajectoryReq(): mAutoPilotLine is null!!!");
+ CallerLogger.INSTANCE.e(M_SWEEPER + TAG, "sendTrajectoryReq(): mAutoPilotLine is null!!!");
return;
}
@@ -198,7 +177,7 @@ public class SweeperTrajectoryManager {
// mAutoPilotLine.setVehicleModel("红旗H9");
CallerAutoPilotControlManager.INSTANCE.sendTrajectoryDownloadReq(mAutoPilotLine);
- CallerLogger.INSTANCE.d(M_BUS + TAG, "sendTrajectoryReq(): "
+ CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "sendTrajectoryReq(): "
+ GsonUtils.toJson(mAutoPilotLine));
}
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/LegendItemView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/LegendItemView.kt
new file mode 100644
index 0000000000..9a6e360b14
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/LegendItemView.kt
@@ -0,0 +1,32 @@
+package com.mogo.och.sweeper.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.LinearLayout
+import com.mogo.och.sweeper.R
+import kotlinx.android.synthetic.main.sweeper_item_legend.view.*
+
+/**
+ * 任务路线全览图图例
+ */
+class LegendItemView:LinearLayout {
+ constructor(context: Context) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_item_legend, this)
+ }
+
+ /**
+ * 设置数据
+ */
+ fun setData(resId:Int,text:String){
+ sweeperLegendIcon.setImageResource(resId)
+ sweeperLegendText.text = text
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/NoTouchConstraintLayout.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/NoTouchConstraintLayout.java
index 6922b9596f..2bdbd938e0 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/NoTouchConstraintLayout.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/NoTouchConstraintLayout.java
@@ -6,14 +6,14 @@ import android.view.MotionEvent;
import androidx.constraintlayout.widget.ConstraintLayout;
-import com.mogo.commons.debug.DebugConfig;
-
/**
* 强制拦截所有touch时间的约束布局
*
* @author tongchenfei
*/
public class NoTouchConstraintLayout extends ConstraintLayout {
+ private boolean interceptTouchEvent = false;
+
public NoTouchConstraintLayout(Context context) {
super(context);
}
@@ -28,10 +28,18 @@ public class NoTouchConstraintLayout extends ConstraintLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- if(DebugConfig.isDebug()){
- return super.onInterceptTouchEvent(ev);
- }else {
+ if (interceptTouchEvent) {
return true;
}
+ return false;
+ }
+
+ /**
+ * 设置事件拦截
+ *
+ * @param interceptTouchEvent
+ */
+ public void setInterceptTouchEvent(boolean interceptTouchEvent) {
+ this.interceptTouchEvent = interceptTouchEvent;
}
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/NoTouchFrameLayout.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/NoTouchFrameLayout.java
new file mode 100644
index 0000000000..48b45b27af
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/NoTouchFrameLayout.java
@@ -0,0 +1,30 @@
+package com.mogo.och.sweeper.view;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.widget.FrameLayout;
+
+/**
+ * 强制拦截所有touch时间的约束布局
+ *
+ * @author tongchenfei
+ */
+public class NoTouchFrameLayout extends FrameLayout {
+ public NoTouchFrameLayout(Context context) {
+ super(context);
+ }
+
+ public NoTouchFrameLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public NoTouchFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ return false;
+ }
+}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SubTaskView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SubTaskView.kt
new file mode 100644
index 0000000000..a3d6374066
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SubTaskView.kt
@@ -0,0 +1,57 @@
+package com.mogo.och.sweeper.view
+
+import android.content.Context
+import android.graphics.Color
+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 kotlinx.android.synthetic.main.sweeper_subtask_view.view.*
+
+/**
+ * 子任务View
+ */
+class SubTaskView : ConstraintLayout {
+ constructor(context: Context) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_subtask_view, this)
+ }
+
+ /**
+ * 设置子任务信息
+ */
+ fun setData(taskInfo: SubInfo, isSelect: Boolean = false, isLastTask: Boolean = false) {
+ tvSubTaskName.text = taskInfo.taskName
+ var mileage: String = if (taskInfo.mileage < 1000) {
+ "${taskInfo.mileage}米"
+ } else {
+ "${taskInfo.mileage / 1000F}千米"
+ }
+ val time=taskInfo.timeSpent.toLong()
+ var timeSpent=if(DateTimeUtil.secondsToHourStr(time)!=""){
+ "${DateTimeUtil.secondsToHourStr(time)}小时${DateTimeUtil.secondsToMinuteStr(time)}分钟"
+ }else{
+ "${DateTimeUtil.secondsToMinuteStr(time)}分钟"
+ }
+ tvSubTaskDesc.text = "全程约${mileage},预计耗时$timeSpent"
+ tvSubTaskName.setTextColor(if (isSelect) Color.parseColor("#3BD2FF") else Color.parseColor("#FFFFFF"))
+ if (isSelect) {
+ ivSubTaskSelect.visibility = View.VISIBLE
+ ivSubTask.visibility = View.GONE
+ } else {
+ ivSubTaskSelect.visibility = View.GONE
+ ivSubTask.visibility = View.VISIBLE
+ }
+ ivRightDownArrow.visibility = if (isLastTask) View.GONE else View.VISIBLE
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt
new file mode 100644
index 0000000000..91b92d6653
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperCurrentTaskInfoView.kt
@@ -0,0 +1,233 @@
+package com.mogo.och.sweeper.view
+
+import android.content.Context
+import android.graphics.Color
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
+import com.mogo.eagle.core.utilcode.util.ClickUtils
+import com.mogo.eagle.core.utilcode.util.ToastUtils
+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
+import com.mogo.och.sweeper.constant.SubTaskTypeEnum
+import com.mogo.och.sweeper.presenter.SweeperPresenter
+import com.mogo.och.sweeper.ui.popwindow.MenuPopWindow
+import kotlinx.android.synthetic.main.sweeper_current_task_info.view.*
+
+/**
+ * 清扫车当前任务信息展示
+ */
+class SweeperCurrentTaskInfoView : ConstraintLayout {
+ private val TAG: String = "SweeperCurrentTaskInfoView"
+
+ //当前任务操作菜单
+ private var mTaskMenuPopWindow: MenuPopWindow? = null
+ private var presenter: SweeperPresenter? = null
+ private var mCurrentPosition = 0
+ private var listTask: List? = null
+ private var mSubTaskType: SubTaskTypeEnum = SubTaskTypeEnum.AUTOPILOT_SUBTYPE
+ private var mSubTaskStatus: Int = 1
+ //当前自动驾驶状态
+ private val mCurrentAutopilotStatus = 0
+
+ constructor(context: Context) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_current_task_info, this)
+ setEnableClickBtn(false)
+ tvStartAuto.setOnClickListener {
+ if (ClickUtils.isFastClick()){//防止重复点击
+ if (mSubTaskStatus==1){
+ ToastUtils.showLong("任务未开始无轨迹,无法启动自驾")
+ return@setOnClickListener
+ }
+ if (mSubTaskType==SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE){
+ ToastUtils.showLong("人工子任务无轨迹,无法启动自驾")
+ return@setOnClickListener
+ }
+ if (mCurrentAutopilotStatus!=IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING){
+ presenter?.startAutopilot()
+ }
+ }
+ }
+ }
+
+ /**
+ * 设置当前任务数据
+ */
+ fun setData(
+ workModePanelView: SweeperWorkModeView,
+ subTaskBean: SweeperSubTaskBean?,
+ currentPosition: Int,
+ menuItemClickListener: MenuPopWindow.OnMenuItemOnClickListener,
+ presenter: SweeperPresenter?
+ ) {
+ 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)
+ }
+ listTask?.let {
+ mSubTaskStatus=it[currentPosition].taskStatus
+ setEnableClickBtn(mSubTaskStatus==2)
+ }
+ setCurrentData(currentPosition)
+ //任务操作菜单打开关闭处理
+ ivMore.setOnClickListener {
+ if (mTaskMenuPopWindow?.isShowing != true) {
+ mTaskMenuPopWindow?.showAsDropDown(
+ workModePanelView,
+ resources.getDimension(R.dimen.dp_580).toInt(),
+ resources.getDimension(R.dimen.dp_36).toInt()
+ )
+ } else {
+ mTaskMenuPopWindow?.dismiss()
+ }
+ }
+
+ }
+
+ /**
+ * 设置准备就绪按钮时都可以点击
+ */
+ fun setEnableClickBtn(isWorking: Boolean) {
+ readyTaskBtn.isClickable=!isWorking
+ presenter?.setWorking(isWorking)
+ if (isWorking) {
+ tvTaskState.text = "正在作业"
+ readyTaskBtn.text="任务中"
+ readyTaskBtn.setTextColor(Color.parseColor("#FFFFFFFF"))
+ tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_working)
+ readyTaskBtn.setBackgroundResource(R.drawable.sweeper_task_working)
+ } else {
+ tvTaskState.text = "暂未准备"
+ readyTaskBtn.text="开始任务"
+ readyTaskBtn.setTextColor(Color.parseColor("#66FFFFFF"))
+ tvTaskState.setBackgroundResource(R.drawable.bg_shape_task_state_not_ready)
+ readyTaskBtn.setBackgroundResource(R.drawable.sweeper_task_not_working)
+ }
+ }
+
+ /**
+ * 设置准备就绪按钮时都可以点击
+ */
+ fun setStartAutoBtn(autopilotState: Int) {
+ when (autopilotState) {
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {
+ tvStartAuto.text="自动驾驶"
+ tvStartAuto.setTextColor(Color.parseColor("#66FFFFFF"))
+ tvStartAuto.setBackgroundResource(R.drawable.sweeper_start_auto_not_running)
+ }
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> {
+ tvStartAuto.text="自动驾驶"
+ tvStartAuto.setTextColor(Color.parseColor("#66FFFFFF"))
+ tvStartAuto.setBackgroundResource(R.drawable.sweeper_start_auto_not_running)
+ }
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> {
+ tvStartAuto.text="自动驾驶"
+ tvStartAuto.setTextColor(Color.parseColor("#FFFFFFFF"))
+ tvStartAuto.setBackgroundResource(R.drawable.sweeper_start_auto_running)
+ }
+ IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING -> {
+ tvStartAuto.text="平行驾驶"
+ tvStartAuto.setTextColor(Color.parseColor("#FFFFFFFF"))
+ tvStartAuto.setBackgroundResource(R.drawable.sweeper_start_auto_running)
+ }
+ }
+ }
+
+ /**
+ * 开始子任务
+ */
+ private fun startSubTask() {
+ listTask?.let {
+ presenter?.startTask(
+ isFirstSubTask(),
+ isLastSubTask(),
+ it[mCurrentPosition].taskId,
+ if (it[mCurrentPosition].taskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE.code) SubTaskTypeEnum.AUTOPILOT_SUBTYPE else SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE,
+ mSubTaskStatus
+ )
+ }
+ }
+
+ /**
+ * 是否第一个子任务
+ */
+ private fun isFirstSubTask(): Boolean {
+ return mCurrentPosition == 0
+ }
+
+ /**
+ * 是否第一个子任务
+ */
+ private fun isLastSubTask(): Boolean {
+ return mCurrentPosition == (listTask?.size?.minus(1))
+ }
+
+ /**
+ * 设置任务状态
+ */
+ fun setTaskStatus(status: Int) {
+ this.mSubTaskStatus = status
+ }
+
+ /**
+ * 填充数据
+ */
+ fun setCurrentData(mCurrentPosition: Int) {
+ listTask?.let {
+ 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
+ lastSubTask.visibility = View.INVISIBLE
+ } else if (it.size == 2) {
+ if (mCurrentPosition == 0) {
+ preSubTask.setData(it[mCurrentPosition], isSelect = true)
+ currentSubTask.setData(it[1], isLastTask = true)
+ } else {
+ preSubTask.setData(it[mCurrentPosition - 1])
+ currentSubTask.setData(it[mCurrentPosition], isSelect = true, isLastTask = true)
+ }
+ preSubTask.visibility=View.VISIBLE
+ currentSubTask.visibility=View.VISIBLE
+ lastSubTask.visibility=View.GONE
+ } else {
+ preSubTask.visibility=View.VISIBLE
+ currentSubTask.visibility=View.VISIBLE
+ lastSubTask.visibility=View.VISIBLE
+ //当前正在执行的任务是第一个子任务
+ if (mCurrentPosition == 0) {
+ preSubTask.setData(it[mCurrentPosition], isSelect = true)
+ currentSubTask.setData(it[1])
+ lastSubTask.setData(it[2], isLastTask = true)
+ //当前正在执行的任务是最后一个子任务
+ } else if (mCurrentPosition == it.size - 1) {
+ preSubTask.setData(it[mCurrentPosition - 2])
+ currentSubTask.setData(it[mCurrentPosition - 1])
+ lastSubTask.setData(it[mCurrentPosition], isSelect = true, isLastTask = true)
+ } else {
+ preSubTask.setData(it[mCurrentPosition - 1])
+ currentSubTask.setData(it[mCurrentPosition], isSelect = true)
+ lastSubTask.setData(it[mCurrentPosition + 1], isLastTask = true)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java
deleted file mode 100644
index 0fb7be8343..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package com.mogo.och.sweeper.view;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.constraintlayout.widget.ConstraintLayout;
-
-import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisGearStateListener;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLamplightListener;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisSteeringStateListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerChassisGearStateListenerManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerChassisLamplightListenerManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerChassisSteeringStateListenerManager;
-import com.mogo.eagle.core.function.hmi.ui.widget.TapPositionView;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.eagle.core.utilcode.util.ThreadUtils;
-import com.mogo.och.sweeper.R;
-
-import org.jetbrains.annotations.NotNull;
-
-import chassis.Chassis;
-import chassis.VehicleStateOuterClass;
-
-public class SweeperTrafficDataView extends ConstraintLayout
- implements IMoGoChassisLamplightListener,
- IMoGoChassisSteeringStateListener,
- IMoGoChassisGearStateListener {
- private static final String TAG = "SweeperTrafficDataView";
- private TapPositionView tapPositionView;//方向盘
- private ImageView speedImage;//速度图标
- private TextView speedTextView;//速度值
- private TurnSignalView sweeperTurnSignal;//转向灯
- private SweeperLimitingVelocityView sweeperLimitingVelocity;//限速
-
- public SweeperTrafficDataView(@NonNull Context context) {
- this(context,null);
- }
-
- public SweeperTrafficDataView(@NonNull Context context, @Nullable AttributeSet attrs) {
- this(context, attrs,0);
- }
-
- public SweeperTrafficDataView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr,0);
- }
-
- public SweeperTrafficDataView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- initView(context);
- }
- private void initView(@NonNull Context context) {
- LayoutInflater.from(context).inflate(R.layout.sweeper_traffic_data, this,true);
- tapPositionView = findViewById(R.id.sweeperTrafficPosition);
- speedImage = findViewById(R.id.sweeperSpeedImage);
- speedTextView = findViewById(R.id.sweeperSpeedText);
- sweeperTurnSignal = findViewById(R.id.sweeperTurnSignal);
- sweeperLimitingVelocity = findViewById(R.id.sweeperLimitingVelocity);
- }
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- //添加 底盘灯光数据 监听
- CallerChassisLamplightListenerManager.INSTANCE.addListener(TAG, this);
- CallerChassisSteeringStateListenerManager.INSTANCE.addListener(TAG, this);
- CallerChassisGearStateListenerManager.INSTANCE.addListener(TAG, this);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- // 移除 底盘灯光数据 监听
- CallerChassisLamplightListenerManager.INSTANCE.removeListener(TAG);
- CallerChassisSteeringStateListenerManager.INSTANCE.removeListener(TAG);
- CallerChassisGearStateListenerManager.INSTANCE.removeListener(TAG);
- }
-
- /**
- * 车辆转向灯
- * @param lightSwitch
- */
- @Override
- public void onAutopilotLightSwitchData(@org.jetbrains.annotations.Nullable Chassis.LightSwitch lightSwitch) {
- ThreadUtils.runOnUiThread(() -> {
- //转向灯状态 0是正常 1是左转 2是右转
- if (lightSwitch != null) {
- CallerLogger.INSTANCE.d(TAG, "车辆转向灯:" + lightSwitch.toString());
- if (lightSwitch.getNumber()==1){
- sweeperTurnSignal.showLeftSignal();
- }else if(lightSwitch.getNumber()==2){
- sweeperTurnSignal.showRightSignal();
- }else{
- sweeperTurnSignal.showDirection();
- }
- }
- });
- }
-
- /**
- * 刹车灯
- * @param brakeLight
- */
- @Override
- public void onAutopilotBrakeLightData(boolean brakeLight) {
- CallerLogger.INSTANCE.d(TAG, "刹车灯:" + brakeLight);
- }
-
- /**
- * 方向盘转向角 左+右-
- * @param steering
- */
- @Override
- public void onAutopilotSteeringData(float steering) {
- CallerLogger.INSTANCE.d(TAG, "steering原始值====" + steering);
- if (Math.abs(steering) < 1) {
- steering = 0;
- }
- CallerLogger.INSTANCE.d(TAG, "steering忽略小数点后====" + (int) steering);
- }
-
- /**
- * 档位
- * @param gear
- */
- @Override
- public void onAutopilotGearData(@NotNull Chassis.GearPosition gear) {
- CallerLogger.INSTANCE.d(TAG, "司机屏档位" + gear.toString());
- ThreadUtils.runOnUiThread(() -> {
- if (tapPositionView != null) {
- tapPositionView.updateWithGear(gear);
- }
- });
- }
-
- /**
- * 速度设置
- */
- public void updateSpeedWithValue(int newSpeed) {
- if (speedTextView != null) {
- speedTextView.setText(String.valueOf(newSpeed));
- }
- if (speedImage != null) {
- speedImage.setBackgroundResource(newSpeed > 60 ? R.drawable.sweeper_traffic_data_speed_warning :R.drawable.sweeper_bg_traffic_data_speed);
- }
- }
-
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.kt
new file mode 100644
index 0000000000..e50f631b9a
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.kt
@@ -0,0 +1,169 @@
+package com.mogo.och.sweeper.view
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.constraintlayout.widget.ConstraintLayout
+import chassis.Chassis.GearPosition
+import chassis.Chassis.LightSwitch
+import chassis.ChassisStatesOuterClass.BMSSystemStates
+import chassis.ChassisStatesOuterClass.SweeperFuTianTaskSystemStates
+import com.elegant.utils.UiThreadHandler
+import com.mogo.eagle.core.function.api.autopilot.IMoGoBatteryManagementSystemListener
+import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisGearStateListener
+import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLamplightListener
+import com.mogo.eagle.core.function.api.autopilot.IMoGoSweeperFutianCleanSystemListener
+import com.mogo.eagle.core.function.call.autopilot.*
+import com.mogo.eagle.core.function.hmi.ui.widget.TapPositionView
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
+import com.mogo.eagle.core.utilcode.util.ThreadUtils
+import com.mogo.och.sweeper.R
+import planning.RoboSweeperTaskIndexOuterClass
+import kotlin.math.roundToInt
+
+/**
+ * 车辆基本信息:方向盘下方的档位 转向灯 限速 速度 电量 水量
+ */
+class SweeperTrafficDataView : ConstraintLayout,
+ IMoGoBatteryManagementSystemListener,
+ IMoGoChassisLamplightListener,
+ IMoGoChassisGearStateListener,
+ IMoGoSweeperFutianCleanSystemListener
+{
+ private var tapPositionView //方向盘下方的档位
+ : TapPositionView? = null
+ private var speedImage //速度图标
+ : ImageView? = null
+ private var speedTextView //速度值
+ : TextView? = null
+ private var sweeperTurnSignal //转向灯
+ : TurnSignalView? = null
+ private var tvBattery //电量百分比展示
+ : TextView? = null
+ private var ivBgWaterWarning //水位预警背景图
+ : ImageView? = null
+ private var ivWater //水位图标
+ : ImageView? = null
+
+ private val TAG = "SweeperTrafficDataView"
+
+ // 底盘数据回调时间间隔
+ private val VEHICLE_STATE_INTERVAL_MILLIS = 500L
+
+ // 当前时间戳
+ private var mCurrentTimeWaterMillis: Long = 0
+
+ private var mCurrentTimeBatteryMillis: Long = 0
+
+ constructor(context: Context) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_traffic_data, this)
+ tapPositionView = findViewById(R.id.sweeperTrafficPosition)
+ speedImage = findViewById(R.id.sweeperSpeedImage)
+ speedTextView = findViewById(R.id.sweeperSpeedText)
+ sweeperTurnSignal = findViewById(R.id.sweeperTurnSignal)
+ tvBattery = findViewById(R.id.tvBattery)
+ ivBgWaterWarning = findViewById(R.id.sweeperIvBgWaterWarning)
+ ivWater = findViewById(R.id.sweeperIvWater)
+ }
+
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+ //电量
+ CallerBatteryManagementSystemListenerManager.addListener(TAG, this)
+ //转向灯
+ CallerChassisLamplightListenerManager.addListener(TAG, this)
+ //档位
+ CallerChassisGearStateListenerManager.addListener(TAG, this)
+ //清扫车相关数据接口
+ CallerSweeperFutianCleanSystemListenerManager.addListener(TAG, this)
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ CallerBatteryManagementSystemListenerManager.removeListener(TAG )
+ CallerChassisLamplightListenerManager.removeListener(TAG)
+ CallerChassisGearStateListenerManager.removeListener(TAG)
+ CallerSweeperFutianCleanSystemListenerManager.removeListener(TAG)
+ }
+
+ override fun onSweeperFutianTaskIndexData(roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex) {}
+ override fun onSweeperFutianCleanSystemState(cleanSystemState: SweeperFuTianTaskSystemStates) {
+ val current = System.currentTimeMillis()
+ if (current - mCurrentTimeWaterMillis <=VEHICLE_STATE_INTERVAL_MILLIS) {
+ return
+ }
+ mCurrentTimeWaterMillis = current
+ d(SceneConstant.M_SWEEPER + TAG, "水位:${cleanSystemState.hasSecuCleanWaterTankLow()}")
+ UiThreadHandler.post {
+ if (cleanSystemState.hasSecuCleanWaterTankLow()) { //清水箱水位低不能清洗作业报警信号
+ ivBgWaterWarning?.visibility = VISIBLE
+ ivWater?.isSelected = true
+ } else {
+ ivBgWaterWarning?.visibility = GONE
+ ivWater?.isSelected = false
+ }
+ }
+
+ }
+
+ @SuppressLint("SetTextI18n")
+ override fun onBatteryManagementSystemStates(states: BMSSystemStates) {
+ val current = System.currentTimeMillis()
+ if (current - mCurrentTimeBatteryMillis <=VEHICLE_STATE_INTERVAL_MILLIS) {
+ return
+ }
+ mCurrentTimeBatteryMillis = current
+ d(SceneConstant.M_SWEEPER + TAG, "电量:${states.bmsSoc}")
+ UiThreadHandler.post{
+ tvBattery?.text = "${states.bmsSoc.roundToInt()}%"
+ }
+ }
+ /**
+ * 车辆转向灯
+ * @param directionLight
+ */
+ override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) {
+ //转向灯状态 0是正常 1是左转 2是右转
+ if (lightSwitch != null) {
+ sweeperTurnSignal?.setTurnLight(lightSwitch)
+ }
+ }
+
+ /**
+ * 刹车灯
+ * @param brakeLight
+ */
+ override fun onAutopilotBrakeLightData(brakeLight: Boolean) {
+ d(TAG, "刹车灯:$brakeLight")
+ }
+ /**
+ * 方向盘下方的档位
+ * @param gear
+ */
+ override fun onAutopilotGearData(gear: GearPosition) {
+ d(TAG, "司机屏档位$gear")
+ ThreadUtils.runOnUiThread {
+ tapPositionView?.updateWithGear(gear)
+ }
+ }
+
+ /**
+ * 速度设置
+ */
+ fun updateSpeedWithValue(newSpeed: Int) {
+ speedTextView?.text = newSpeed.toString()
+ speedImage?.setBackgroundResource(if (newSpeed > 60) R.drawable.sweeper_traffic_data_speed_warning else R.drawable.sweeper_bg_traffic_data_speed)
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt
index 19a7a466bd..18ae4794f1 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficLightView.kt
@@ -64,7 +64,9 @@ class SweeperTrafficLightView @JvmOverloads constructor(
override fun disableTrafficLight() {
UiThreadHandler.post {
mCurrentLightId = TrafficLightEnum.BLACK
- this@SweeperTrafficLightView.visibility = GONE
+ sweeper_traffic_light_iv.setImageResource(R.drawable.sweeper_light_gay_nor)
+ sweeper_traffic_light_time_tv.text = ""
+ this@SweeperTrafficLightView.visibility = VISIBLE
}
}
@@ -121,18 +123,21 @@ class SweeperTrafficLightView @JvmOverloads constructor(
UiThreadHandler.post {
when (lightId) {
TrafficLightEnum.RED -> {
- sweeper_traffic_light_iv.setBackgroundResource(R.drawable.sweeper_light_red_nor)
+ sweeper_traffic_light_iv.setImageResource(R.drawable.sweeper_light_red_nor)
this@SweeperTrafficLightView.visibility = VISIBLE
}
TrafficLightEnum.YELLOW -> {
- sweeper_traffic_light_iv.setBackgroundResource(R.drawable.sweeper_lightyellow_nor)
+ sweeper_traffic_light_iv.setImageResource(R.drawable.sweeper_lightyellow_nor)
this@SweeperTrafficLightView.visibility = VISIBLE
}
TrafficLightEnum.GREEN -> {
- sweeper_traffic_light_iv.setBackgroundResource(R.drawable.sweeper_light_green_nor)
+ sweeper_traffic_light_iv.setImageResource(R.drawable.sweeper_light_green_nor)
+ this@SweeperTrafficLightView.visibility = VISIBLE
+ }
+ else -> {
+ sweeper_traffic_light_iv.setImageResource(R.drawable.sweeper_light_gay_nor)
this@SweeperTrafficLightView.visibility = VISIBLE
}
- else -> this@SweeperTrafficLightView.visibility = GONE
}
}
}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt
new file mode 100644
index 0000000000..eb90c33411
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperWorkModeView.kt
@@ -0,0 +1,180 @@
+package com.mogo.och.sweeper.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import chassis.ChassisStatesOuterClass.SweeperFuTianTaskSystemStates
+import com.elegant.utils.UiThreadHandler
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.callback.ICleaningModeStateCallback
+import com.mogo.och.sweeper.constant.OperateStateEnum
+import com.mogo.och.sweeper.constant.SubTaskTypeEnum
+import com.mogo.och.sweeper.ui.popwindow.SweeperOperatePanelPopWindow
+import com.mogo.och.sweeper.util.SweeperFutianCmdUtil
+import kotlinx.android.synthetic.main.sweeper_work_mode.view.*
+
+/**
+ * 清扫车模式信息展示
+ */
+class SweeperWorkModeView : ConstraintLayout, ICleaningModeStateCallback {
+
+ private var isSelectPureSweepMode: Boolean = false
+ private val TAG = "SweeperWorkModeView"
+ //清扫模式选择面板
+ private var mOperatePanelPopWindow: SweeperOperatePanelPopWindow? = null
+
+ private var operateState: OperateStateEnum=OperateStateEnum.SYNCING_STATUS
+
+ constructor(context: Context) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_work_mode, this)
+ mOperatePanelPopWindow = SweeperOperatePanelPopWindow(context)
+ setShowOrHideCleanSystemState(OperateStateEnum.SYNCING_STATUS,null)
+ }
+
+ /**
+ * 设置view
+ */
+ fun setTrafficDataView(trafficDataView: SweeperTrafficDataView){
+ //清扫模式选择面板打开关闭处理
+ ivOpenOperatePanel.setOnClickListener {
+ if (mOperatePanelPopWindow?.isShowing != true) {
+ mOperatePanelPopWindow?.showAsDropDown(
+ trafficDataView,
+ resources.getDimension(R.dimen.dp_600).toInt(),
+ 0
+ )
+ UiThreadHandler.postDelayed({
+ d(SceneConstant.M_SWEEPER + TAG, "operateState:"+operateState.code)
+ mOperatePanelPopWindow?.showSyncing(operateState)
+
+ },300)
+ } else {
+ mOperatePanelPopWindow?.dismiss()
+ }
+ }
+ }
+ /**
+ * 设置清扫模式面板
+ */
+ fun setSweeperFutianCleanSystemState(taskType: SubTaskTypeEnum, cleanSystemState: SweeperFuTianTaskSystemStates?) {
+ // TODO:传递清扫车底盘数据给上装面板
+ //mOperatePanelPopWindow?.setCleanSystemState(cleanSystemState, this@SweeperWorkModeView)
+ if (this.operateState.code==OperateStateEnum.STARTING_STATUS.code){
+ return
+ }
+ //如果状态是同步中,在底盘首次回调时把状态强制修改成成功
+ if (this.operateState.code==OperateStateEnum.SYNCING_STATUS.code){
+ this.operateState=OperateStateEnum.SUCCESS_STATUS
+ d(SceneConstant.M_SWEEPER + TAG, "SystemState operateState:"+operateState.code)
+ }
+ //清扫车暂未选择清扫模式或者任务类型是人工驾驶子任务,则暂无清扫模式
+ if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState) || taskType.code == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE.code) {
+ setShowOrHideCleanSystemState(OperateStateEnum.NO_STATUS, cleanSystemState)
+ } else {
+ setShowOrHideCleanSystemState(OperateStateEnum.SUCCESS_STATUS, cleanSystemState)
+ }
+ }
+
+ /**
+ * 设置清扫模式状态显示和隐藏
+ */
+ private fun setShowOrHideCleanSystemState(operateState: OperateStateEnum, cleanSystemState: SweeperFuTianTaskSystemStates?) {
+ when (operateState.code) {
+ OperateStateEnum.SYNCING_STATUS.code -> {
+ groupWorkModelPanel?.visibility = View.GONE
+ tvNoDataDesc?.visibility = View.VISIBLE
+ tvNoDataDesc?.text = "状态同步中,请稍后"
+ mOperatePanelPopWindow?.setIsOutsideTouchable(true)
+ }
+ OperateStateEnum.FAIL_STATUS.code -> {
+ groupWorkModelPanel?.visibility = View.GONE
+ tvNoDataDesc?.visibility = View.VISIBLE
+ tvNoDataDesc?.text = "上装启动失败"
+ mOperatePanelPopWindow?.setIsOutsideTouchable(true)
+ }
+ OperateStateEnum.STARTING_STATUS.code -> {
+ groupWorkModelPanel?.visibility = View.GONE
+ tvNoDataDesc?.visibility = View.VISIBLE
+ tvNoDataDesc?.text = "上装启动中..."
+ mOperatePanelPopWindow?.setIsOutsideTouchable(false)
+ }
+ OperateStateEnum.NO_STATUS.code -> {
+ groupWorkModelPanel?.visibility = View.GONE
+ tvNoDataDesc?.visibility = View.VISIBLE
+ tvNoDataDesc?.text = "暂无"
+ mOperatePanelPopWindow?.setIsOutsideTouchable(true)
+ }
+ else -> {
+ groupWorkModelPanel?.visibility = View.VISIBLE
+ tvNoDataDesc?.visibility = View.GONE
+ setCleanModeData(cleanSystemState)
+ mOperatePanelPopWindow?.setIsOutsideTouchable(true)
+ }
+
+ }
+ }
+
+ override fun cleaningModeState(operateState: OperateStateEnum, cleanSystemState: SweeperFuTianTaskSystemStates?, isSelectPureSweepMode: Boolean) {
+ this.isSelectPureSweepMode = isSelectPureSweepMode
+ this.operateState=operateState
+ setShowOrHideCleanSystemState(operateState, cleanSystemState)
+ }
+
+ /**
+ * 设置清扫模式数据
+ */
+ private fun setCleanModeData(cleanSystemState: SweeperFuTianTaskSystemStates?) {
+ if (isSelectPureSweepMode) {
+ tvCleaningMode?.text = "纯扫模式"
+ groupWorkModelPanel?.visibility = View.VISIBLE
+ tvNoDataDesc?.visibility = View.GONE
+ } else {
+ if (SweeperFutianCmdUtil.checkIfCleanMode(cleanSystemState)) {
+ groupWorkModelPanel?.visibility = View.GONE
+ tvNoDataDesc?.visibility = View.VISIBLE
+ tvNoDataDesc?.text = "暂无"
+ return
+ } else {
+ groupWorkModelPanel?.visibility = View.VISIBLE
+ tvNoDataDesc?.visibility = View.GONE
+ // 作业模式
+ if (cleanSystemState?.secuModWashSweepSts == true) tvCleaningMode?.text = "洗扫模式"
+ if (cleanSystemState?.secuModWashSts == true) tvCleaningMode?.text = "纯洗模式"
+ if (cleanSystemState?.secuWorkTonSts == true) tvCleaningMode?.text = "纯吸模式"
+ if (SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState)) tvCleaningMode?.text = "纯扫模式"
+ }
+ }
+ //清扫方向
+ if (SweeperFutianCmdUtil.checkIfCleanDirection(cleanSystemState)) {
+ tvCleaningDirection.visibility = View.GONE
+ } else {
+ tvCleaningDirection.visibility = View.VISIBLE
+ // 左侧
+ if (cleanSystemState?.secuWorkLeftSts == true) tvCleaningDirection?.text = "左侧"
+ // 右侧
+ if (cleanSystemState?.secuWorkRightSts == true) tvCleaningDirection?.text = "右侧"
+ // 两侧
+ if (cleanSystemState?.secuWorkOnBothsidesSts == true) tvCleaningDirection?.text = "两侧"
+ }
+ if (SweeperFutianCmdUtil.checkIfCleanIntensity(cleanSystemState)) {
+ tvCleaningIntensity.visibility = View.GONE
+ } else {
+ tvCleaningIntensity.visibility = View.VISIBLE
+ // 作业强度
+ if (cleanSystemState?.secuWorkStandSts == true) tvCleaningIntensity?.text = "标准"
+ if (cleanSystemState?.secuWorkStrongSts == true) tvCleaningIntensity?.text = "强力"
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/TurnSignalView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/TurnSignalView.java
deleted file mode 100644
index 9ad5640dca..0000000000
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/TurnSignalView.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.mogo.och.sweeper.view;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.mogo.och.sweeper.R;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-public class TurnSignalView extends LinearLayout {
- private ImageView turnLeftView;
- private ImageView turnRightView;
- public TurnSignalView(Context context) {
- super(context);
- }
-
- public TurnSignalView(Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
- initView(context);
- }
-
- public TurnSignalView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public TurnSignalView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
- private void initView(@NonNull Context context) {
- LayoutInflater.from(context).inflate(R.layout.sweeper_turn_signal, this);
- turnLeftView = findViewById(R.id.turnLeftView);
- turnRightView = findViewById(R.id.turnRightView);
- }
-
- /**
- * 展示左转向灯
- */
- public void showLeftSignal(){
- turnLeftView.setSelected(true);
- turnRightView.setSelected(false);
- }
-
- /**
- * 展示右转向灯
- */
- public void showRightSignal(){
- turnLeftView.setSelected(false);
- turnRightView.setSelected(true);
- }
-
- /**
- * 默认情况及其直行时
- */
- public void showDirection(){
- turnLeftView.setSelected(false);
- turnRightView.setSelected(false);
- }
-}
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/TurnSignalView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/TurnSignalView.kt
new file mode 100644
index 0000000000..57394c2ce8
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/TurnSignalView.kt
@@ -0,0 +1,90 @@
+package com.mogo.och.sweeper.view
+
+import android.animation.AnimatorSet
+import android.animation.ObjectAnimator
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import android.widget.LinearLayout
+import chassis.Chassis
+import com.mogo.och.sweeper.R
+import kotlinx.android.synthetic.main.sweeper_turn_signal.view.*
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+
+class TurnSignalView : LinearLayout {
+ constructor(context: Context?) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+
+ private var init: Boolean = false
+
+ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
+ context,
+ attrs,
+ defStyleAttr
+ ) {
+ }
+
+ constructor(
+ context: Context?,
+ attrs: AttributeSet?,
+ defStyleAttr: Int,
+ defStyleRes: Int
+ ) : super(context, attrs, defStyleAttr, defStyleRes) {
+ }
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_turn_signal, this)
+ init = true
+ }
+
+ /**
+ * 转向灯动画
+ */
+ fun setTurnLight(directionLight: Chassis.LightSwitch?) {
+ GlobalScope.launch(Dispatchers.Main) {
+ if (!init) {
+ return@launch
+ }
+ //根据左右进行显示和隐藏,实际要判断每个来的时间和频度
+ when (directionLight) {
+ Chassis.LightSwitch.LIGHT_LEFT -> { //左转向
+ leftSelectImage.visibility = View.VISIBLE
+ rightSelectImage.visibility = View.GONE
+ rightSelectImage.clearAnimation()
+ setAnimation(leftSelectImage)
+ }
+ Chassis.LightSwitch.LIGHT_RIGHT -> { //右转向
+ leftSelectImage.visibility = View.GONE
+ rightSelectImage.visibility = View.VISIBLE
+ leftSelectImage.clearAnimation()
+ setAnimation(rightSelectImage)
+ }
+ else -> { //消失
+ leftSelectImage.clearAnimation()
+ rightSelectImage.clearAnimation()
+ leftSelectImage.visibility = View.GONE
+ rightSelectImage.visibility = View.GONE
+ }
+ }
+ }
+ }
+
+ //实现图片闪烁效果
+ private fun setAnimation(imageView: ImageView) {
+ val animationSet = AnimatorSet()
+ val valueAnimator = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1.0f)
+ val valueAnimatorDisappare = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0f)
+ valueAnimator.duration = 1000
+ valueAnimatorDisappare.duration = 800
+ valueAnimator.repeatCount = -1
+ valueAnimatorDisappare.repeatCount = -1
+ animationSet.playTogether(valueAnimatorDisappare, valueAnimator)
+ animationSet.start()
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt
new file mode 100644
index 0000000000..0bcd0f5d1b
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt
@@ -0,0 +1,342 @@
+package com.mogo.och.sweeper.view
+
+import android.content.Context
+import android.graphics.Color
+import android.os.Bundle
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.content.ContextCompat
+import com.amap.api.maps.AMap
+import com.amap.api.maps.CameraUpdateFactory
+import com.amap.api.maps.model.*
+import com.mogo.eagle.core.data.map.MogoLocation
+import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
+import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
+import com.mogo.eagle.core.utilcode.util.CoordinateUtils
+import com.mogo.eagle.core.utilcode.util.ThreadUtils
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean
+import com.mogo.och.sweeper.constant.SweeperConst
+import com.mogo.och.sweeper.database.bean.WeltDataBean
+import com.mogo.och.sweeper.util.SweeperMapAssetStyleUtil
+import kotlinx.android.synthetic.main.sweeper_welt_map_overview.view.*
+
+/**
+ * 作业任务全览图
+ */
+class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener {
+ private var mTaskCoordinatesLatLng: MutableList = mutableListOf() //当前大任务的所有起终点集合
+ private var mCarMarker: Marker? = null
+ private var mAMap: AMap? = null
+ private var mWeltPolylines: Polyline? = null
+ private var mRoutePolylines: Polyline?=null
+// private val mLineMarkers: MutableList = mutableListOf()
+ private var mEndStationMarker: Marker? = null
+ private var mFirst: Boolean = false
+
+ //清扫车任务地图
+ private val TAG = "WeltMapOverView"
+
+ constructor(context: Context) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_welt_map_overview, this)
+ initAMapView()
+ // 注册定位监听
+ CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this)
+ CallerChassisLocationGCJ02ListenerManager.setListenerHz(TAG,5)
+ }
+
+ private fun initAMapView() {
+ mAMap = sweeperTextureMapView.map
+ // 地图文字标注
+ mAMap?.showMapText(true)
+ //显示3D建筑物
+ mAMap?.showBuildings(true)
+ // 设置导航地图模式,aMap是地图控制器对象。
+ mAMap?.mapType = AMap.MAP_TYPE_NIGHT
+ // 关闭显示实时路况图层,aMap是地图控制器对象。
+ mAMap?.isTrafficEnabled = false
+ // 设置 锚点 图标
+ mCarMarker = mAMap?.addMarker(
+ MarkerOptions()
+ .icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_car_big))
+ .anchor(0.5f, 0.5f)
+ )
+ // 设置地图的样式
+ val uiSettings = mAMap?.uiSettings
+ uiSettings?.isZoomControlsEnabled = false // 地图缩放级别的交换按钮
+ uiSettings?.setAllGesturesEnabled(false) // 所有手势
+ uiSettings?.isMyLocationButtonEnabled = false // 显示默认的定位按钮
+ uiSettings?.setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可
+ // 加载自定义样式
+ val customMapStyleOptions = CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(SweeperMapAssetStyleUtil.getAssetsStyle(context, "map_style.data"))
+ .setStyleExtraData(SweeperMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data"))
+ // 设置自定义样式
+ mAMap?.setCustomMapStyle(customMapStyleOptions)
+ //mAMap?.moveCamera(CameraUpdateFactory.zoomTo(15f))
+ mAMap?.setOnMapLoadedListener(AMap.OnMapLoadedListener {
+ //mAMap?.moveCamera(CameraUpdateFactory.zoomTo(15f))
+ CallerLogger.d(SceneConstant.M_SWEEPER + TAG, "WeltView---onMapLoaded")
+ // 加载自定义样式
+ val customMapStyleOptions = CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(SweeperMapAssetStyleUtil.getAssetsStyle(context, "map_style.data"))
+ .setStyleExtraData(SweeperMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data"))
+ // 设置自定义样式
+ mAMap?.setCustomMapStyle(customMapStyleOptions)
+ // 实时路况图层关闭,必须添加在loaded结束之后,其他位置不生效
+ mAMap?.isTrafficEnabled = false
+ mAMap?.showBuildings(true)
+ })
+ }
+
+ /**
+ * 添加画线颜色值
+ */
+ private fun getRouteColorList(weltData: MutableList):MutableList {
+ val colorList= mutableListOf()
+ var nextWeltDataBean:WeltDataBean?=null
+ for (i in weltData.indices) {
+ val weltDataBean = weltData[i]
+ if(i+110){
+ colorList.add(Color.TRANSPARENT)
+ continue
+ }
+ }
+ if (weltDataBean.weltDistance == SweeperConst.NONWELT) {//非贴边
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_236299))
+ } else if (weltDataBean.weltDistance < 0) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_c22101))
+ } else if (weltDataBean.weltDistance >= 0 && weltDataBean.weltDistance < 0.1) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_4dffa4))
+ } else if (weltDataBean.weltDistance >= 0.1 && weltDataBean.weltDistance < 0.2) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_ffdd4d))
+ } else if (weltDataBean.weltDistance >= 0.2) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_ff912b))
+ }
+ }
+ return colorList
+ }
+
+ override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
+ ThreadUtils.getSinglePool().run {
+ mogoLocation?.let { gnssInfo ->
+ val currentLatLng = LatLng(gnssInfo.latitude, gnssInfo.longitude)
+ //更新车辆位置
+ mCarMarker?.rotateAngle = (360 - gnssInfo.heading).toFloat()
+ mCarMarker?.position = currentLatLng
+ mCarMarker?.setToTop()
+ //圈定地图显示范围
+ val boundsBuilder = LatLngBounds.Builder()
+ if (mTaskCoordinatesLatLng.size > 0) {
+ //存放经纬度
+ for (i in mTaskCoordinatesLatLng.indices) {
+ val latLng = mTaskCoordinatesLatLng[i]
+ boundsBuilder.include(latLng)
+ }
+ }
+ mRoutePolylines?.points?.forEach {latLng->
+ boundsBuilder.include(latLng)
+ }
+ boundsBuilder.include(currentLatLng)
+ mAMap?.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100))
+
+ }
+ }
+ }
+
+ /**
+ * 根据贴边数据绘制任务路线
+ */
+ fun drawablePolyline(weltDatas: MutableList?) {
+ weltDatas?.let {
+ val colorList=getRouteColorList(it)
+ val coordinatesLatLngs= mutableListOf()
+ for (i in it.indices) {
+ coordinatesLatLngs.add(LatLng(it[i].locLat,it[i].locLon))
+ }
+ if (coordinatesLatLngs.size > 2) {
+ //设置线段纹理
+ mWeltPolylines?.remove()
+ val polylineOptions = PolylineOptions()
+ polylineOptions.addAll(coordinatesLatLngs)
+ polylineOptions.width(14f) //线段宽度
+ polylineOptions.isUseTexture = false
+ polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare)
+ polylineOptions.colorValues(colorList)
+ polylineOptions.visible(true)
+ // 绘制线
+ mWeltPolylines = mAMap?.addPolyline(polylineOptions)
+ }
+ }
+ }
+
+ /**
+ * 绘制起点和终点的marker
+ */
+ private fun drawStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) {
+// val startMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_big_start_maker_icon)))
+// startMarker?.position = startPoint
+// mLineMarkers.add(startMarker)
+// val endMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_big_end_maker_icon)))
+// endMarker?.position = endPoint
+// mLineMarkers.add(endMarker)
+ }
+
+ private fun drawEndMarker(endPoint: LatLng){
+ mEndStationMarker?.remove()
+ mEndStationMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_big_end_maker_icon)))
+ mEndStationMarker?.position = endPoint
+ }
+
+ /**
+ * 清除所有标记和路线
+ */
+ fun clearAllMarkerAndPolyline() {
+// for (i in mLineMarkers.indices) {
+// mLineMarkers[i]?.isVisible = false
+// mLineMarkers[i]?.remove()
+// }
+ mEndStationMarker?.remove()
+ mWeltPolylines?.remove()
+ mRoutePolylines?.remove()
+// mLineMarkers.clear()
+ //mFirst = false
+ //showOrHiddenLegendData(false)
+ }
+
+ /**
+ * 设置贴边数据
+ */
+ fun setWeltData(weltDatas: MutableList?, isWeltData: Boolean, distance: String?) {
+ drawablePolyline(weltDatas)
+ ThreadUtils.runOnUiThread {
+ distance?.let {
+ setDistance(it)
+ }
+ }
+ //if (!mFirst && isWeltData) {
+ // mFirst = true
+ // showOrHiddenLegendData(true)
+ //}
+ }
+
+ /**
+ * 任务轨迹数据
+ */
+ fun setRouteList(routeList: ArrayList) {
+ val routeCoordinatesLatLngs= mutableListOf()
+ for (i in routeList.indices) {
+ routeCoordinatesLatLngs.add(LatLng(routeList[i].latitude,routeList[i].longitude))
+ }
+ ThreadUtils.runOnUiThread {
+ drawRouteListPolyline(routeCoordinatesLatLngs)
+ }
+ }
+
+ private fun drawRouteListPolyline(routeList: MutableList) {
+ mRoutePolylines?.remove()
+ val polylineOptions = PolylineOptions()
+ polylineOptions.width(14f) //线段宽度
+ polylineOptions.isUseTexture = false
+ polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare)
+ polylineOptions.color(ContextCompat.getColor(context,R.color.sweeper_3ba1cc))
+ polylineOptions.addAll(routeList)
+ polylineOptions.visible(true)
+ mRoutePolylines=mAMap?.addPolyline(polylineOptions)
+ }
+
+ /**
+ * 设置当前大任务的所有子任务起终点集合
+ */
+ fun setTaskListCoordinatesLatLng(coordinatesLatLng: MutableList) {
+ ThreadUtils.runOnUiThread {
+ this.mTaskCoordinatesLatLng = coordinatesLatLng
+ if (mTaskCoordinatesLatLng.size > 0) {
+ drawStartAndEndMarker(mTaskCoordinatesLatLng[0], mTaskCoordinatesLatLng[mTaskCoordinatesLatLng.size - 1])
+ }
+ }
+ }
+ /**
+ * 设置当前大任务的所有子任务起终点集合
+ */
+ fun setCurrentTaskCoordinatesLatLng(coordinatesLatLng: LatLng) {
+ ThreadUtils.runOnUiThread {
+ drawEndMarker(coordinatesLatLng)
+ }
+ }
+
+ /**
+ * 设置图例数据
+ */
+ private fun showOrHiddenLegendData(isShow: Boolean) {
+ groupLegend.visibility = if (isShow) View.VISIBLE else View.GONE
+ sweeperLegend1.setData(R.drawable.sweeper_legend1, "a<0")
+ sweeperLegend2.setData(R.drawable.sweeper_legend2, "0≤a<10")
+ sweeperLegend3.setData(R.drawable.sweeper_legend3, "10≤a<20")
+ sweeperLegend4.setData(R.drawable.sweeper_legend4, "a≥20")
+ sweeperLegend5.setData(R.drawable.sweeper_legend5, "非贴边")
+ sweeperLegend6.setData(R.drawable.sweeper_legend6, "未经过")
+ }
+
+ private fun setDistance(distance: String) {
+ taskWeltDistanceTv.text = "贴边:${distance}cm"
+ }
+
+ fun setProgress(progress: String?) {
+ progress?.let {
+ if ("0" == progress) {
+ taskProgressTv.visibility = View.GONE
+ taskWeltDistanceTv.visibility = View.GONE
+ showOrHiddenLegendData(false)
+ } else {
+ taskProgressTv.visibility = View.VISIBLE
+ taskWeltDistanceTv.visibility = View.VISIBLE
+ taskProgressTv.text = it
+ showOrHiddenLegendData(true)
+ }
+ }
+ }
+
+ fun onCreateView(savedInstanceState: Bundle?) {
+ sweeperTextureMapView.onCreate(savedInstanceState)
+ }
+
+ fun onResume() {
+ sweeperTextureMapView.onResume()
+ }
+
+ fun onPause() {
+ sweeperTextureMapView.onPause()
+ }
+
+ fun onDestroy() {
+ sweeperTextureMapView.onDestroy()
+ }
+
+ fun getSweeperSwitchToSmall(): ImageView {
+ return sweeperSwitchToSmall
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt
new file mode 100644
index 0000000000..fccf64bcc5
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt
@@ -0,0 +1,344 @@
+package com.mogo.och.sweeper.view
+
+import android.content.Context
+import android.graphics.Color
+import android.os.Bundle
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.content.ContextCompat
+import com.amap.api.maps.AMap
+import com.amap.api.maps.CameraUpdateFactory
+import com.amap.api.maps.model.*
+import com.mogo.eagle.core.data.map.MogoLocation
+import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
+import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
+import com.mogo.eagle.core.utilcode.util.CoordinateUtils
+import com.mogo.eagle.core.utilcode.util.ThreadUtils
+import com.mogo.och.sweeper.R
+import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean
+import com.mogo.och.sweeper.constant.SweeperConst
+import com.mogo.och.sweeper.database.bean.WeltDataBean
+import com.mogo.och.sweeper.util.SweeperMapAssetStyleUtil
+import kotlinx.android.synthetic.main.sweeper_welt_small_map_view.view.*
+
+
+/**
+ * 作业任务小地图
+ */
+class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener {
+ private var mTaskCoordinatesLatLng: MutableList = mutableListOf() //当前大任务的所有起终点集合
+ private var mCarMarker: Marker? = null
+ private var mAMap: AMap? = null
+ private var mWeltPolylines: Polyline? = null
+ private var mRoutePolylines: Polyline?=null
+// private val mLineMarkers: MutableList = mutableListOf()
+ private var endStationMarker:Marker? = null
+
+ //清扫车任务地图
+ private val TAG = "WeltMapView"
+
+ constructor(context: Context) : super(context) {}
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+ initView(context)
+ }
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {}
+
+ private fun initView(context: Context) {
+ LayoutInflater.from(context).inflate(R.layout.sweeper_welt_small_map_view, this)
+ initAMapView()
+ // 注册定位监听
+ CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this)
+ CallerChassisLocationGCJ02ListenerManager.setListenerHz(TAG,5)
+ }
+
+ override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
+ d(SceneConstant.M_SWEEPER + TAG, "mogoLocation:$mogoLocation")
+ ThreadUtils.getSinglePool().run {
+ mogoLocation?.let {
+ val currentLatLng = LatLng(it.latitude, it.longitude)
+ drawCarMarker(mogoLocation)
+ //圈定地图显示范围
+ val boundsBuilder = LatLngBounds.Builder()
+ if (mTaskCoordinatesLatLng.size > 0) {
+ //存放经纬度
+ for (i in mTaskCoordinatesLatLng.indices) {
+ boundsBuilder.include(mTaskCoordinatesLatLng[i])
+ }
+ }
+ mRoutePolylines?.points?.forEach {latLng->
+ boundsBuilder.include(latLng)
+ }
+ boundsBuilder.include(currentLatLng)
+ mAMap!!.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100))
+ }
+ }
+ }
+
+ /**
+ * 绘制自车
+ *
+ * @param location
+ */
+ private fun drawCarMarker(location: MogoLocation?) {
+ if (location == null) return
+ val currentLatLng = LatLng(location.latitude, location.longitude)
+ //更新车辆位置
+ if (mCarMarker != null) {
+ mCarMarker!!.rotateAngle = (360 - location.heading).toFloat()
+ mCarMarker!!.position = currentLatLng
+ mCarMarker!!.setToTop()
+ }
+ }
+
+ private fun initAMapView() {
+ mAMap = sweeperSmallTextureMapView?.map
+ // 地图文字标注
+ mAMap?.showMapText(true)
+ // 设置导航地图模式,aMap是地图控制器对象。
+ mAMap?.mapType = AMap.MAP_TYPE_NIGHT
+ // 关闭显示实时路况图层,aMap是地图控制器对象。
+ mAMap?.isTrafficEnabled = false
+ // 设置 锚点 图标
+ mCarMarker = mAMap?.addMarker(
+ MarkerOptions()
+ .icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_car_small))
+ .anchor(0.5f, 0.5f)
+ )
+ // 设置地图的样式
+ val uiSettings = mAMap?.uiSettings
+ uiSettings?.isZoomControlsEnabled = false // 地图缩放级别的交换按钮
+ uiSettings?.setAllGesturesEnabled(false) // 所有手势
+ uiSettings?.isMyLocationButtonEnabled = false // 显示默认的定位按钮
+ uiSettings?.setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可
+ // 加载自定义样式
+ val customMapStyleOptions = CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(SweeperMapAssetStyleUtil.getAssetsStyle(context, "map_style.data"))
+ .setStyleExtraData(SweeperMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data"))
+ // 设置自定义样式
+ mAMap?.setCustomMapStyle(customMapStyleOptions)
+ mAMap?.setOnMapLoadedListener(AMap.OnMapLoadedListener {
+ d(SceneConstant.M_SWEEPER + TAG, "WeltView---onMapLoaded")
+ // 加载自定义样式
+ val customMapStyleOptions = CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(SweeperMapAssetStyleUtil.getAssetsStyle(context, "map_style.data"))
+ .setStyleExtraData(SweeperMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data"))
+ // 设置自定义样式
+ mAMap?.setCustomMapStyle(customMapStyleOptions)
+ mAMap?.setPointToCenter(sweeperSmallTextureMapView.width / 2, sweeperSmallTextureMapView.height / 2)
+ })
+ }
+
+ /**
+ * 根据贴边数据绘制任务路线
+ */
+ private fun drawablePolyline(weltDatas: MutableList?) {
+ weltDatas?.let {
+ val colorList = getRouteColorList(it)
+ val coordinatesLatLngs = mutableListOf()
+ for (i in it.indices) {
+ coordinatesLatLngs.add(LatLng(it[i].locLat,it[i].locLon))
+ }
+ if (coordinatesLatLngs.size > 2) {
+ //设置线段纹理
+ mWeltPolylines?.remove()
+ val polylineOptions = PolylineOptions()
+ polylineOptions.addAll(coordinatesLatLngs)
+ polylineOptions.width(14f) //线段宽度
+ polylineOptions.isUseTexture = false
+ polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare)
+ polylineOptions.colorValues(colorList)
+ polylineOptions.visible(true)
+ // 绘制线
+ mWeltPolylines = mAMap?.addPolyline(polylineOptions)
+ }
+ }
+ }
+
+ /**
+ * 添加画线颜色值
+ */
+ private fun getRouteColorList(weltData: MutableList): MutableList {
+ val colorList = mutableListOf()
+ var nextWeltDataBean:WeltDataBean?=null
+ for (i in weltData.indices) {
+ val weltDataBean = weltData[i]
+ if(i+110){
+ colorList.add(Color.TRANSPARENT)
+ continue
+ }
+ }
+
+ if (weltDataBean.weltDistance == SweeperConst.NONWELT) {//非贴边
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_236299))
+ } else if (weltDataBean.weltDistance < 0) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_c22101))
+ } else if (weltDataBean.weltDistance >= 0 && weltDataBean.weltDistance < 0.1) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_4dffa4))
+ } else if (weltDataBean.weltDistance >= 0.1 && weltDataBean.weltDistance < 0.2) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_ffdd4d))
+ } else if (weltDataBean.weltDistance >= 0.2) {
+ colorList.add(ContextCompat.getColor(context,R.color.sweeper_ff912b))
+ }
+ }
+ return colorList
+ }
+
+ /**
+ * 添加起点和终点的marker
+ */
+ private fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) {
+// for (i in mLineMarkers.indices) {
+// mLineMarkers[i]?.isVisible = false
+// mLineMarkers[i]?.remove()
+// }
+// mLineMarkers.clear()
+// val startMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_small_start_marker_icon)))
+// startMarker?.position = startPoint
+// mLineMarkers.add(startMarker)
+// val endMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_small_end_marker_icon)))
+// endMarker?.position = endPoint
+// mLineMarkers.add(endMarker)
+ }
+
+ /**
+ * 设置当前大任务的所有子任务起终点集合
+ */
+ fun setTaskListCoordinatesLatLng(coordinatesLatLng: MutableList) {
+ this.mTaskCoordinatesLatLng = coordinatesLatLng
+// if (mTaskCoordinatesLatLng.size > 0) {
+// d(
+// SceneConstant.M_SWEEPER + TAG,
+// "startPoint:${mTaskCoordinatesLatLng[0]} endPoint:${mTaskCoordinatesLatLng[mTaskCoordinatesLatLng.size - 1]}"
+// )
+// addStartAndEndMarker(mTaskCoordinatesLatLng[0], mTaskCoordinatesLatLng[mTaskCoordinatesLatLng.size - 1])
+// }
+ }
+
+ /**
+ * 设置当前大任务的所有子任务起终点集合
+ */
+ fun setCurrentTaskCoordinatesLatLng(coordinatesLatLng: LatLng) {
+ endStationMarker?.remove()
+ endStationMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_small_end_marker_icon)))
+ endStationMarker?.position = coordinatesLatLng
+ }
+
+ /**
+ * 清除所有标记和路线
+ */
+ fun clearAllMarkerAndPolyline() {
+// for (i in mLineMarkers.indices) {
+// mLineMarkers[i]?.isVisible = false
+// mLineMarkers[i]?.remove()
+// }
+ endStationMarker?.remove()
+ mWeltPolylines?.remove()
+// mLineMarkers.clear()
+ mRoutePolylines?.remove()
+ //mFirst = false
+ //showOrHiddenWelt(false)
+ }
+
+ fun getSwitchToBig(): ImageView = sweeperSwitchToBig
+
+ /**
+ * 显示或隐藏贴边
+ */
+ private fun showOrHiddenWelt(isShow: Boolean) {
+ taskProgressTv.visibility = if (isShow) View.VISIBLE else View.GONE
+ taskWeltDistanceTv.visibility = if (isShow) View.VISIBLE else View.GONE
+ }
+
+ /**
+ * 设置贴边数据
+ */
+ fun setWeltData(weltDatas: MutableList, isWeltData: Boolean, distance: String) {
+ drawablePolyline(weltDatas)
+ ThreadUtils.runOnUiThread {
+ setWeltDistance(distance)
+ }
+ //if (!mFirst&&isWeltData) {
+ // showOrHiddenWelt(true)
+ // mFirst = true
+ //}
+ }
+
+ /**
+ * 设置贴边距离
+ */
+ private fun setWeltDistance(distance: String) {
+ taskWeltDistanceTv.text = "贴边:${distance}cm"
+ }
+
+ /**
+ * 设置任务轨迹数据
+ */
+ fun setRouteList(routeList: ArrayList) {
+ val routeCoordinatesLatLngs = mutableListOf()
+ for (i in routeList.indices) {
+ routeCoordinatesLatLngs.add(LatLng(routeList[i].latitude, routeList[i].longitude))
+ }
+ ThreadUtils.runOnUiThread {
+ drawRouteListPolyline(routeCoordinatesLatLngs)
+ }
+ }
+
+ private fun drawRouteListPolyline(routeList: MutableList) {
+ mRoutePolylines?.remove()
+ val polylineOptions = PolylineOptions()
+ polylineOptions.addAll(routeList)
+ polylineOptions.width(14f) //线段宽度
+ polylineOptions.isUseTexture = false
+ polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare)
+ polylineOptions.color(ContextCompat.getColor(context,R.color.sweeper_3ba1cc))
+ polylineOptions.visible(true)
+ mRoutePolylines=mAMap?.addPolyline(polylineOptions)
+ }
+
+ /**
+ * 设置任务进度
+ */
+ fun setTaskProgress(progress: String?) {
+ if (progress == "0") {
+ taskWeltDistanceTv.visibility = View.GONE
+ taskProgressTv.visibility = View.GONE
+ } else {
+ taskWeltDistanceTv.visibility = View.VISIBLE
+ taskProgressTv.visibility = View.VISIBLE
+ taskProgressTv.text = progress
+ }
+
+ }
+
+ fun onCreateView(savedInstanceState: Bundle?) {
+ sweeperSmallTextureMapView?.onCreate(savedInstanceState)
+ }
+
+ fun onResume() {
+ sweeperSmallTextureMapView?.onResume()
+ }
+
+ fun onPause() {
+ sweeperSmallTextureMapView?.onPause()
+ }
+
+ fun onDestroy() {
+ sweeperSmallTextureMapView?.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/color/sweeper_autopilot_text_color_selector.xml b/OCH/mogo-och-sweeper/src/main/res/color/sweeper_autopilot_text_color_selector.xml
deleted file mode 100644
index afd0b1f78c..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/color/sweeper_autopilot_text_color_selector.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/bg_shape_work_mode.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/bg_shape_work_mode.png
new file mode 100644
index 0000000000..1140726f3f
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/bg_shape_work_mode.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/bg_sweeper_operate_panel.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/bg_sweeper_operate_panel.png
new file mode 100644
index 0000000000..943c88912d
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/bg_sweeper_operate_panel.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/end_maker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/end_maker_icon.png
deleted file mode 100755
index 8acf113151..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/end_maker_icon.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_ai_select.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_ai_select.png
deleted file mode 100755
index d3e0107c02..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_ai_select.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_bad_case_select.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_bad_case_select.png
deleted file mode 100755
index ebacf3a11a..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_bad_case_select.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_battery.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_battery.png
new file mode 100644
index 0000000000..5fee53445e
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_battery.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_message_box.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_message_box.png
new file mode 100644
index 0000000000..eaf471cf4c
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_message_box.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_message_box_pressed.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_message_box_pressed.png
new file mode 100644
index 0000000000..fd84812942
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_message_box_pressed.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_right_down_arrow.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_right_down_arrow.png
new file mode 100644
index 0000000000..4939b986fe
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_right_down_arrow.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_station_start_end.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_station_start_end.png
deleted file mode 100644
index 04580a8f0d..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_station_start_end.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_level_warning.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_level_warning.png
new file mode 100644
index 0000000000..96bf7d213a
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_level_warning.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_nor.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_nor.png
new file mode 100644
index 0000000000..75dc6a3497
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_nor.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_select.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_select.png
new file mode 100644
index 0000000000..026549d193
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_water_select.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/img_sweeper_status_bg.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/img_sweeper_status_bg.png
deleted file mode 100644
index 27cb9285d3..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/img_sweeper_status_bg.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/no_order_data.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/no_order_data.png
deleted file mode 100644
index 0e61996d3f..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/no_order_data.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/no_task_data.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/no_task_data.png
new file mode 100644
index 0000000000..3a30c8efe8
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/no_task_data.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/press_start_status.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/press_start_status.png
deleted file mode 100755
index af32c20cb5..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/press_start_status.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_failure.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_failure.png
deleted file mode 100755
index 5737f93ad8..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_failure.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_maker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_maker_icon.png
deleted file mode 100644
index 9eca61e199..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_maker_icon.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_success.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_success.png
deleted file mode 100755
index 84246fd323..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/start_success.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_icon_in_autopilot.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_icon_in_autopilot.png
deleted file mode 100644
index 75c26c3d71..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_icon_in_autopilot.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_icon_not_in_autopilot.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_icon_not_in_autopilot.png
deleted file mode 100644
index 927296d690..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_icon_not_in_autopilot.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_notice_box_bg.9.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_notice_box_bg.9.png
deleted file mode 100644
index 8b4b579b56..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_base_notice_box_bg.9.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_big_end_maker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_big_end_maker_icon.png
new file mode 100644
index 0000000000..438ee2136a
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_big_end_maker_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_big_start_maker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_big_start_maker_icon.png
new file mode 100644
index 0000000000..ba3747994c
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_big_start_maker_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_big.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_big.png
new file mode 100644
index 0000000000..b30095f4c9
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_big.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_small.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_small.png
new file mode 100644
index 0000000000..c3762f55bb
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_small.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_card_normal.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_card_normal.png
new file mode 100755
index 0000000000..ac5d521078
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_card_normal.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_card_pressed.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_card_pressed.png
new file mode 100755
index 0000000000..34456d135f
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_card_pressed.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_clean_mode_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_clean_mode_icon.png
new file mode 100644
index 0000000000..cd3c35fe82
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_clean_mode_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_close_navi_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_close_navi_icon.png
new file mode 100644
index 0000000000..56525e7ed2
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_close_navi_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_collect_normal.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_collect_normal.png
new file mode 100755
index 0000000000..2b220e1513
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_collect_normal.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_collect_pressed.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_collect_pressed.png
new file mode 100755
index 0000000000..3ceca7609c
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_collect_pressed.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_disable_autopilot_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_disable_autopilot_icon.png
deleted file mode 100644
index 170f254cd1..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_disable_autopilot_icon.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_dot_line.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_dot_line.png
deleted file mode 100644
index 186001352c..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_dot_line.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_full_screen_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_full_screen_icon.png
new file mode 100644
index 0000000000..f39894922d
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_full_screen_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_ic_autopilot.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_ic_autopilot.png
deleted file mode 100644
index be978145dc..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_ic_autopilot.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_ai_select.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_ai_select.png
new file mode 100755
index 0000000000..6da7b81fe4
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_ai_select.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_arrived_station.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_arrived_station.png
deleted file mode 100644
index 8a065b66dd..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_arrived_station.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_arriving_station.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_arriving_station.png
deleted file mode 100644
index 4ed57a0e30..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_arriving_station.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_bad_case_normal.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_bad_case_normal.png
similarity index 100%
rename from OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/icon_bad_case_normal.png
rename to OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_bad_case_normal.png
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_bad_case_select.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_bad_case_select.png
new file mode 100755
index 0000000000..22f88301f9
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_bad_case_select.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_msg_box_close.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_msg_box_close.png
new file mode 100755
index 0000000000..d17834748b
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_msg_box_close.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_msg_box_open.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_msg_box_open.png
new file mode 100755
index 0000000000..73b03bc1f3
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_msg_box_open.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_not_arrive_station.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_not_arrive_station.png
deleted file mode 100644
index e0bb24c526..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_not_arrive_station.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_not_select_subtask.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_not_select_subtask.png
new file mode 100755
index 0000000000..dc4c4f6f0d
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_not_select_subtask.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_select_subtask.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_select_subtask.png
new file mode 100755
index 0000000000..ed3b871338
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_icon_select_subtask.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_light_gay_nor.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_light_gay_nor.png
new file mode 100644
index 0000000000..2b677df25f
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_light_gay_nor.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line.png
new file mode 100755
index 0000000000..570b54f1be
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line_panel_bg.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line_panel_bg.png
deleted file mode 100755
index 3166d20e37..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line_panel_bg.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line_panel_bg_1.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line_panel_bg_1.png
deleted file mode 100755
index 09a9c252da..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_line_panel_bg_1.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_loading_autopilot_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_loading_autopilot_icon.png
deleted file mode 100644
index f21a1081f1..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_loading_autopilot_icon.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_loading_nor.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_loading_nor.png
new file mode 100644
index 0000000000..0ff5309fab
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_loading_nor.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_navi_refresh.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_navi_refresh.png
new file mode 100644
index 0000000000..a3c3c32558
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_navi_refresh.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_right_autopilot_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_right_autopilot_icon.png
deleted file mode 100644
index cc2b18083d..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_right_autopilot_icon.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_selected_btn.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_selected_btn.png
deleted file mode 100644
index 3f05565483..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_selected_btn.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_setting_normal.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_setting_normal.png
new file mode 100755
index 0000000000..72a8664bef
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_setting_normal.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_setting_pressed.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_setting_pressed.png
new file mode 100755
index 0000000000..a765e75a41
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_setting_pressed.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_small_end_marker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_small_end_marker_icon.png
new file mode 100644
index 0000000000..44eeb23a8f
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_small_end_marker_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_small_start_marker_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_small_start_marker_icon.png
new file mode 100644
index 0000000000..b7cbac3f43
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_small_start_marker_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_start_auto_not_running.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_start_auto_not_running.png
new file mode 100755
index 0000000000..76efae02cf
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_start_auto_not_running.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_start_auto_running.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_start_auto_running.png
new file mode 100755
index 0000000000..bef6342f64
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_start_auto_running.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_line_close.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_line_close.png
deleted file mode 100644
index 370b61de38..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_line_close.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_big_normal.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_big_normal.png
new file mode 100644
index 0000000000..67c4ded462
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_big_normal.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_big_pressed.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_big_pressed.png
new file mode 100755
index 0000000000..dbeae7fe2e
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_big_pressed.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_small_normal.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_small_normal.png
new file mode 100755
index 0000000000..4ce0d75174
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_small_normal.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_small_pressed.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_small_pressed.png
new file mode 100755
index 0000000000..7c75d1e495
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_switch_map_small_pressed.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_list_left_select_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_list_left_select_icon.png
new file mode 100644
index 0000000000..14a358eb90
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_list_left_select_icon.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_not_working.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_not_working.png
new file mode 100755
index 0000000000..45af8b7997
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_not_working.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_working.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_working.png
new file mode 100755
index 0000000000..f5bd232a66
Binary files /dev/null and b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_task_working.png differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_wrong_autopilot_icon.png b/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_wrong_autopilot_icon.png
deleted file mode 100644
index 0c8988acb3..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_wrong_autopilot_icon.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/ai_collect_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/ai_collect_selector.xml
deleted file mode 100755
index a1211f3c47..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/ai_collect_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bad_case_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bad_case_selector.xml
deleted file mode 100755
index bc47ce95d7..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/bad_case_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_bubble.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_bubble.xml
new file mode 100644
index 0000000000..9533060ae5
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_bubble.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_clean_mode.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_clean_mode.xml
new file mode 100644
index 0000000000..57588e065f
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_clean_mode.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_dialog_no_title.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_dialog_no_title.xml
new file mode 100644
index 0000000000..e6970921d5
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_dialog_no_title.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_left_bottom_round.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_left_bottom_round.xml
new file mode 100644
index 0000000000..76e59781e4
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_left_bottom_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_left_right_bottom_round.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_left_right_bottom_round.xml
new file mode 100644
index 0000000000..bd0ab9d1e1
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_left_right_bottom_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_right_bottom_round.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_right_bottom_round.xml
new file mode 100644
index 0000000000..7fc3db37cc
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_right_bottom_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_traffic_light_background.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_panel.xml
similarity index 51%
rename from OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_traffic_light_background.xml
rename to OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_panel.xml
index a74b1ff75f..3a6f72848e 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_traffic_light_background.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_panel.xml
@@ -1,7 +1,6 @@
-
-
-
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_state_not_ready.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_state_not_ready.xml
new file mode 100644
index 0000000000..c808b231e8
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_state_not_ready.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_state_working.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_state_working.xml
new file mode 100644
index 0000000000..ad4e25124f
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_task_state_working.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_welt_panel.xml
similarity index 55%
rename from OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel.xml
rename to OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_welt_panel.xml
index c9f7378baa..a6c900aa78 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_shape_welt_panel.xml
@@ -1,6 +1,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_default.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_default.xml
index 84464f5307..3de0910dcd 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_default.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_default.xml
@@ -3,5 +3,4 @@
android:shape="rectangle">
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_disabled.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_disabled.xml
index a5cb095bc8..16e880f1a2 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_disabled.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_disabled.xml
@@ -3,5 +3,4 @@
android:shape="rectangle">
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_pressed.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_pressed.xml
index 8d7970361a..4e57ba75b0 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_pressed.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_sweeper_operate_panel_btn_pressed.xml
@@ -1,7 +1,6 @@
-
+
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/bg_task_menu.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_task_menu.xml
new file mode 100644
index 0000000000..1df3248028
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/bg_task_menu.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/icon_more.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/icon_more.xml
new file mode 100644
index 0000000000..3d348cf41a
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/icon_more.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/img_sweeper_status_bg.9.png b/OCH/mogo-och-sweeper/src/main/res/drawable/img_sweeper_status_bg.9.png
deleted file mode 100644
index 0af2b9db73..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable/img_sweeper_status_bg.9.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_ai_collect_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_ai_collect_selector.xml
new file mode 100755
index 0000000000..b0d14bd0c6
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_ai_collect_selector.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg.xml
deleted file mode 100644
index ad57da1c3a..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- -
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg_check.png b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg_check.png
deleted file mode 100644
index 28857974b5..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg_check.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg_nor.png b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg_nor.png
deleted file mode 100644
index f7d4f92c4b..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_autopilot_status_bg_nor.png and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_bad_case_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_bad_case_selector.xml
new file mode 100755
index 0000000000..0ad963da07
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_bad_case_selector.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_base_autopilot_status_icon_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_base_autopilot_status_icon_selector.xml
deleted file mode 100644
index 6b646eac98..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_base_autopilot_status_icon_selector.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_bg_waring_limiting_velocity.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_bg_waring_limiting_velocity.xml
index aea70cad45..fe190c59ee 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_bg_waring_limiting_velocity.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_bg_waring_limiting_velocity.xml
@@ -3,18 +3,16 @@
-
-
-
+ android:width="52dp"
+ android:height="52dp" />
-
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_checkbox_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_checkbox_selector.xml
deleted file mode 100644
index 191827e786..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_checkbox_selector.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_collect_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_collect_selector.xml
new file mode 100644
index 0000000000..8ed41c58fb
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_collect_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend1.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend1.xml
new file mode 100644
index 0000000000..3698943bc9
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend2.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend2.xml
new file mode 100644
index 0000000000..d521b0a45d
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend2.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend3.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend3.xml
new file mode 100644
index 0000000000..59edb172fa
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend4.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend4.xml
new file mode 100644
index 0000000000..2a4efb7072
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend4.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend5.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend5.xml
new file mode 100644
index 0000000000..c3ac48e545
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend5.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend6.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend6.xml
new file mode 100644
index 0000000000..a8b8ac1b06
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_legend6.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_list_left_top_line.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_list_left_top_line.xml
new file mode 100644
index 0000000000..9d92ddd223
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_list_left_top_line.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_message_box.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_message_box.xml
new file mode 100644
index 0000000000..64c1e9d72e
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_message_box.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_operation_status_select_bg.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_operation_status_select_bg.xml
index f617cd9fce..647222f919 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_operation_status_select_bg.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_operation_status_select_bg.xml
@@ -3,9 +3,9 @@
android:shape="oval">
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_oprate_panel_reset_btn.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_oprate_panel_reset_btn.xml
new file mode 100644
index 0000000000..a0be0f0b9e
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_oprate_panel_reset_btn.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_refresh.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_refresh.xml
new file mode 100644
index 0000000000..58e3089f6f
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_refresh.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_selector_msg_box.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_selector_msg_box.xml
new file mode 100644
index 0000000000..142a5bc514
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_selector_msg_box.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_setting_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_setting_selector.xml
new file mode 100644
index 0000000000..a6d5c8df82
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_setting_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_setting_tip_red_cir_bg.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_setting_tip_red_cir_bg.xml
deleted file mode 100644
index 203971340e..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_setting_tip_red_cir_bg.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_card_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_card_selector.xml
new file mode 100644
index 0000000000..70950d6361
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_card_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn.xml
deleted file mode 100644
index 8b066b0ce8..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn_commit.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn_commit.xml
deleted file mode 100644
index b345195ce7..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn_commit.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn_un_commit.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn_un_commit.xml
deleted file mode 100644
index c17c5a4798..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_line_btn_un_commit.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_map_big_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_map_big_selector.xml
new file mode 100644
index 0000000000..9acad62868
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_map_big_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_map_small_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_map_small_selector.xml
new file mode 100644
index 0000000000..3a4b699d93
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_switch_map_small_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_line_dividing_line1_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_dividing_line1_selector.xml
similarity index 100%
rename from OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_line_dividing_line1_selector.xml
rename to OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_dividing_line1_selector.xml
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_line_dividing_line2_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_dividing_line2_selector.xml
similarity index 66%
rename from OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_line_dividing_line2_selector.xml
rename to OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_dividing_line2_selector.xml
index ee555aae15..55353f3ca8 100644
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_line_dividing_line2_selector.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_dividing_line2_selector.xml
@@ -2,7 +2,7 @@
-
-
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_btn.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_btn.xml
new file mode 100644
index 0000000000..9307ba16bd
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_btn.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_not_selected.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_not_selected.xml
new file mode 100644
index 0000000000..11995408cb
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_not_selected.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_selected.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_selected.xml
new file mode 100644
index 0000000000..6d189929bc
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_task_list_selected.xml
@@ -0,0 +1,10 @@
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_water_selector.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_water_selector.xml
new file mode 100755
index 0000000000..9c959df076
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_water_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_yi_biao_pan_bg_nor.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_yi_biao_pan_bg_nor.xml
deleted file mode 100644
index 2ef90e60f7..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_yi_biao_pan_bg_nor.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_yi_biao_pan_bg_speeding.xml b/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_yi_biao_pan_bg_speeding.xml
deleted file mode 100644
index dea7a88bb6..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_yi_biao_pan_bg_speeding.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/activity_sweeper_switch_line.xml b/OCH/mogo-och-sweeper/src/main/res/layout/activity_sweeper_switch_line.xml
deleted file mode 100644
index 83f6208652..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/layout/activity_sweeper_switch_line.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/dialog_sweeper_manual_driving.xml b/OCH/mogo-och-sweeper/src/main/res/layout/dialog_sweeper_manual_driving.xml
new file mode 100644
index 0000000000..c6fca84ec2
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/dialog_sweeper_manual_driving.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/dialog_sweeper_no_title.xml b/OCH/mogo-och-sweeper/src/main/res/layout/dialog_sweeper_no_title.xml
new file mode 100644
index 0000000000..4ed2048fdd
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/dialog_sweeper_no_title.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml
index 851bfa744d..5f11cfe729 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_och_sweeper.xml
@@ -1,176 +1,126 @@
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+
+ app:bgColor="#00000000"
+ app:blurRadius="@dimen/dp_28"
+ app:shadowColor="#80121526"
+ app:shadowRadius="@dimen/dp_30"
+ app:shadow_position="outer"
+ app:xOffset="0dp"
+ app:yOffset="0dp">
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/fragment_welt_map_overview.xml b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_welt_map_overview.xml
new file mode 100644
index 0000000000..e5655ea229
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/fragment_welt_map_overview.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/item_och_sweeper_station.xml b/OCH/mogo-och-sweeper/src/main/res/layout/item_och_sweeper_station.xml
deleted file mode 100644
index 03d3e20c4b..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/layout/item_och_sweeper_station.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_amap_navi_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_amap_navi_view.xml
new file mode 100644
index 0000000000..4653dc9dcf
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_amap_navi_view.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml
index 68a291869d..1039ecdcc6 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_base_fragment.xml
@@ -2,31 +2,25 @@
+ android:layout_marginTop="@dimen/dp_72"
+ android:clickable="true">
+ android:layout_height="match_parent" />
-
+
-
-
-
-
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="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"/>
-
-
-
+
+ android:layout_height="wrap_content" />
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_current_task_info.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_current_task_info.xml
new file mode 100644
index 0000000000..1b0482afa6
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_current_task_info.xml
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_item_legend.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_item_legend.xml
new file mode 100644
index 0000000000..cb9c40f195
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_item_legend.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_item_task_info.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_item_task_info.xml
new file mode 100644
index 0000000000..69ec1c1128
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_item_task_info.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_limiting_speed.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_limiting_speed.xml
index 8021736131..1938d21ff5 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_limiting_speed.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_limiting_speed.xml
@@ -2,14 +2,15 @@
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_no_data_common_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_no_data_common_view.xml
index f2bdf5c425..2532275d52 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_no_data_common_view.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_no_data_common_view.xml
@@ -1,31 +1,43 @@
-
+ android:id="@+id/noTaskDataView"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="visible"
+ android:background="@drawable/bg_shape_task_panel">
-
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"/>
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_operate_panel_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_operate_panel_view.xml
index 790a01dffa..5c4e019611 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_operate_panel_view.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_operate_panel_view.xml
@@ -1,143 +1,131 @@
-
+ android:id="@+id/work_mode_panel_root_view">
-
-
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_open" />
+ app:layout_constraintTop_toBottomOf="@+id/btn_clean_work_open_close" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_mode" />
+ app:layout_constraintStart_toEndOf="@+id/btn_clean_mode_pure_sweep"
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_mode" />
+ app:layout_constraintStart_toEndOf="@+id/btn_clean_mode_pure_wash"
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_mode" />
+ app:layout_constraintStart_toEndOf="@+id/btn_clean_mode_sweep_wash"
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_mode" />
@@ -167,55 +151,58 @@
android:id="@+id/btn_clean_direction_left_side"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/dp_28"
+ android:layout_marginStart="@dimen/dp_90"
+ android:layout_marginTop="@dimen/dp_17"
android:background="@drawable/sweeper_operate_panel_btn2_bg_selector"
android:enabled="false"
android:gravity="center"
- android:paddingStart="@dimen/dp_32"
+ android:paddingStart="@dimen/dp_48"
android:paddingTop="@dimen/dp_12"
- android:paddingEnd="@dimen/dp_32"
+ android:paddingEnd="@dimen/dp_48"
android:paddingBottom="@dimen/dp_12"
android:text="左侧"
- android:textColor="#000000"
+ android:textColor="@color/white"
android:textSize="@dimen/sweeper_operate_panel_btn_text_size"
- app:layout_constraintLeft_toRightOf="@id/hint_clean_direction"
- app:layout_constraintTop_toTopOf="@id/hint_clean_direction" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/hint_clean_direction" />
+ app:layout_constraintStart_toEndOf="@+id/btn_clean_direction_left_side"
+ app:layout_constraintTop_toBottomOf="@+id/hint_clean_direction" />
+ app:layout_constraintStart_toEndOf="@+id/btn_clean_direction_right_side"
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_direction" />
@@ -245,66 +228,71 @@
android:id="@+id/btn_clean_intensity_standard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/dp_28"
+ android:layout_marginStart="@dimen/dp_90"
+ android:layout_marginTop="@dimen/dp_17"
android:background="@drawable/sweeper_operate_panel_btn2_bg_selector"
android:enabled="false"
android:gravity="center"
- android:paddingStart="@dimen/dp_32"
+ android:paddingStart="@dimen/dp_48"
android:paddingTop="@dimen/dp_12"
- android:paddingEnd="@dimen/dp_32"
+ android:paddingEnd="@dimen/dp_48"
android:paddingBottom="@dimen/dp_12"
android:text="标准"
- android:textColor="#000000"
+ android:textColor="@color/white"
android:textSize="@dimen/sweeper_operate_panel_btn_text_size"
- app:layout_constraintLeft_toRightOf="@id/hint_clean_intensity"
- app:layout_constraintTop_toTopOf="@id/hint_clean_intensity" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_intensity" />
+ app:layout_constraintTop_toBottomOf="@id/hint_clean_intensity" />
-
-
+
-
-
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_popwindow_operate_panel.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_popwindow_operate_panel.xml
new file mode 100644
index 0000000000..2c4a7c470e
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_popwindow_operate_panel.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_subtask_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_subtask_view.xml
new file mode 100644
index 0000000000..25964e716b
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_subtask_view.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_switch_line_list_item.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_switch_line_list_item.xml
deleted file mode 100644
index 2372df7638..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_switch_line_list_item.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_task_menu.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_task_menu.xml
new file mode 100644
index 0000000000..f62a58d93c
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_task_menu.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_data.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_data.xml
index 70cf4a311c..7c71a6b184 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_data.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_data.xml
@@ -3,17 +3,18 @@
android:layout_width="@dimen/dp_616"
android:layout_height="@dimen/dp_320"
xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/sweeper_bg_traffic_data"
android:paddingStart="@dimen/dp_47"
android:paddingTop="@dimen/dp_22">
@@ -37,7 +38,6 @@
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="@dimen/dp_23"
- android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="@+id/sweeperSpeedImage"
app:layout_constraintRight_toRightOf="@+id/sweeperSpeedImage"
app:layout_constraintTop_toBottomOf="@+id/sweeperSpeedText"/>
@@ -45,12 +45,11 @@
android:id="@+id/sweeperTrafficPosition"
android:layout_width="@dimen/dp_200"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/dp_30"
app:defaultColor="@color/acc_default_txt_color"
app:layout_constraintLeft_toRightOf="@+id/sweeperSpeedImage"
app:layout_constraintTop_toTopOf="parent"
app:selectColor="@color/dark_mode_select_txt_color"
- android:layout_marginTop="@dimen/dp_35"/>
+ android:layout_marginTop="@dimen/dp_30"/>
+ android:layout_marginTop="@dimen/dp_10"/>
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_light_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_light_view.xml
index f7c111451a..dd319f141c 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_light_view.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_traffic_light_view.xml
@@ -1,14 +1,16 @@
-
+
+ android:src="@drawable/sweeper_light_gay_nor"
+ android:scaleType="fitXY"/>
+ tools:text="10"
+ android:textColor="@color/white"
+ android:background="#00000000"/>
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_turn_signal.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_turn_signal.xml
index 7dd5225a35..6ad67d647f 100644
--- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_turn_signal.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_turn_signal.xml
@@ -1,19 +1,36 @@
-
+ android:layout_height="match_parent">
+ android:id="@+id/leftNorImage"
+ android:layout_width="@dimen/dp_80"
+ android:layout_height="@dimen/dp_80"
+ android:layout_gravity="left|center_vertical"
+ android:src="@drawable/turn_signal_left_nor" />
+
-
\ No newline at end of file
+ android:id="@+id/rightNorImage"
+ android:layout_width="@dimen/dp_80"
+ android:layout_height="@dimen/dp_80"
+ android:layout_gravity="right|center_vertical"
+ android:src="@drawable/turn_signal_right_nor" />
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_map_overview.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_map_overview.xml
new file mode 100644
index 0000000000..16a9957c97
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_map_overview.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml
new file mode 100644
index 0000000000..515958f87d
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_work_mode.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_work_mode.xml
new file mode 100644
index 0000000000..f2e743be58
--- /dev/null
+++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_work_mode.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/raw/end_marker.nt3d b/OCH/mogo-och-sweeper/src/main/res/raw/end_marker.nt3d
deleted file mode 100644
index be6057c547..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/raw/end_marker.nt3d and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/raw/star_marker.nt3d b/OCH/mogo-och-sweeper/src/main/res/raw/star_marker.nt3d
deleted file mode 100644
index c6e546fc31..0000000000
Binary files a/OCH/mogo-och-sweeper/src/main/res/raw/star_marker.nt3d and /dev/null differ
diff --git a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_away_passengers.json b/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_away_passengers.json
deleted file mode 100644
index e76436f2dc..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_away_passengers.json
+++ /dev/null
@@ -1,184 +0,0 @@
-{
- "code": 0,
- "msg": "",
- "detailMsg": "",
- "result": {
- "info": [
- {
- "_id": "cee57b3ae07c4486b0357319368487d7",
- "orderNo": "XB20210422000002",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-22 16:31:58",
- "orderEndTime": "2021-04-26 10:38:13",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-22 16:31:58",
- "updateTime": "2021-04-26 10:38:13",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "ce69b1bcfb9840c6a4563bc6ef947caf",
- "orderNo": "XB20210426000000",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 10:38:48",
- "orderEndTime": "2021-04-26 10:46:16",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 10:38:48",
- "updateTime": "2021-04-26 10:46:16",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "cae07b56f41c4e0fa60ab3543ffc258e",
- "orderNo": "XB20210426000001",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 10:47:05",
- "orderEndTime": "2021-04-26 10:48:07",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 10:47:05",
- "updateTime": "2021-04-26 10:48:07",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "62bc84afbc434d01b644c74ee406e772",
- "orderNo": "XB20210426000002",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 10:48:22",
- "orderEndTime": "2021-04-26 10:50:32",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 10:48:22",
- "updateTime": "2021-04-26 10:50:32",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- },
- {
- "_id": "fa3214c7a6ec411bb3d6edbc98907423",
- "orderNo": "XB20210426000009",
- "orderType": 10,
- "userName": "董QAD",
- "userPhone": "15631204018",
- "startStationId": 1,
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "endStationId": 2,
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "orderDispatchType": 7,
- "carNum": "京NB010",
- "sn": "F803EB2046PZD00149",
- "orderStartTime": "2021-04-26 19:26:05",
- "orderEndTime": "2021-04-27 14:35:50",
- "arrivedStartStationTime": null,
- "arrivedEndStationTime": null,
- "cityCode": "010",
- "areaCode": "1001",
- "createTime": "2021-04-26 19:26:05",
- "updateTime": "2021-04-27 14:35:50",
- "personNum": 1,
- "travelDistance": 1.2,
- "vehicleColour": null,
- "lastBrandName": null,
- "headImgUrl": null
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_order_1.json b/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_order_1.json
deleted file mode 100644
index 050b67447d..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_order_1.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "_id": "62bc84afbc434d01b644c74ee406e772",
- "areaCode": "1001",
- "carNum": "京NB010",
- "cityCode": "010",
- "createTime": "Apr 26, 2021 10:48:22 AM",
- "endStation": "顺密路口站",
- "endStationCoordinate": [
- 116.721520973,
- 40.1940181096
- ],
- "endStationId": 2,
- "orderDispatchType": 1,
- "orderNo": "XB20210426000002",
- "orderStartTime": "Apr 26, 2021 10:48:22 AM",
- "orderType": 10,
- "sn": "F803EB2046PZD00149",
- "startStation": "万集东门站",
- "startStationCoordinate": [
- 116.7354579447,
- 40.1974932972
- ],
- "startStationId": 1,
- "travelDistance": 1.2,
- "updateTime": "Apr 26, 2021 10:48:23 AM",
- "userName": "董QAD",
- "userPhone": "15631204018"
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_station_list1.json b/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_station_list1.json
deleted file mode 100644
index c74daa1174..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_station_list1.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
- "code": 0,
- "msg": "",
- "detailMsg": "",
- "result": {
- "site": [
- {
- "lineId": 1.0,
- "siteId": 1.0,
- "siteName": "万集东门站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.7354579447,
- 40.1974932972
- ],
- "lon": 116.7354579447,
- "lat": 40.1974932972,
- "siteDesc": "万集东门站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 2.0,
- "siteName": "市政府前街18号",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.729134342,
- 40.1953113732
- ],
- "lon": 116.729134342,
- "lat": 40.1953113732,
- "siteDesc": "市政府前街18号",
- "siteState": 1.0,
- "isCurrentSite": 3.0,
- "siteColor": 2.0,
- "peoples": "0",
- "ifStop": 0.0
- },
- {
- "lineId": 1.0,
- "siteId": 3.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.721520973,
- 40.1940181096
- ],
- "lon": 116.721520973,
- "lat": 40.1940181096,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 0.0,
- "siteColor": 0.0,
- "peoples": "0",
- "ifStop": 1.0
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_station_list2.json b/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_station_list2.json
deleted file mode 100644
index 48d6782cc3..0000000000
--- a/OCH/mogo-och-sweeper/src/main/res/raw/sweeper_station_list2.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
- "code": 0,
- "msg": "",
- "detailMsg": "",
- "result": {
- "site": [
- {
- "lineId": 1.0,
- "siteId": 1.0,
- "siteName": "万集东门站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.7354579447,
- 40.1974932972
- ],
- "lon": 116.7354579447,
- "lat": 40.1974932972,
- "siteDesc": "万集东门站",
- "siteState": 1.0,
- "isCurrentSite": 0.0,
- "siteColor": 0.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 1.0,
- "siteName": "万集东门站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.7374429112,
- 40.2023987087
- ],
- "lon": 116.7374429112,
- "lat": 40.2023987087,
- "siteDesc": "万集东门站",
- "siteState": 1.0,
- "isCurrentSite": 0.0,
- "siteColor": 0.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 2.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.721520973,
- 40.1940181096
- ],
- "lon": 116.721520973,
- "lat": 40.1940181096,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 1.0,
- "siteId": 2.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.723146,
- 40.179637
- ],
- "lon": 116.723146,
- "lat": 40.179637,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- },
- {
- "lineId": 2.0,
- "siteId": 2.0,
- "siteName": "顺密路口站",
- "cityCode": "010",
- "areaCode": "1001",
- "areaName": "顺义区",
- "currentLocation": [
- 116.738835502,
- 40.2023958306
- ],
- "lon": 116.738835502,
- "lat": 40.2023958306,
- "siteDesc": "顺密路口站",
- "siteState": 1.0,
- "isCurrentSite": 1.0,
- "siteColor": 1.0,
- "peoples": "0",
- "ifStop": 1.0
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/values/colors.xml b/OCH/mogo-och-sweeper/src/main/res/values/colors.xml
index 855ffb1a50..996be7663a 100644
--- a/OCH/mogo-och-sweeper/src/main/res/values/colors.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/values/colors.xml
@@ -32,9 +32,6 @@
#3E77F6
#323C6F
- #2966EC
- #F0151D41
-
#19FFFFFF
#FFFFFF
@@ -48,9 +45,21 @@
#7DE261
#f00
#BF30334C
- #ffffff
+ #548DB8
#1FA7FF
- #80ffffff
+ #3769B5
#BF30334C
+
+ #C22101
+
+ #4DFFA4
+
+ #FFDD4D
+
+ #FF912B
+
+ #3BA1CC
+
+ #236299
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/values/dimens.xml b/OCH/mogo-och-sweeper/src/main/res/values/dimens.xml
index f70fac49fa..8cc4e2b53a 100644
--- a/OCH/mogo-och-sweeper/src/main/res/values/dimens.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/values/dimens.xml
@@ -14,7 +14,7 @@
32dp
20dp
26dp
- 20dp
+ 42dp
15dp
@@ -149,6 +149,6 @@
130dp
60dp
- 16dp
- 36dp
+ 13dp
+ 32dp
\ No newline at end of file
diff --git a/OCH/mogo-och-sweeper/src/main/res/values/strings.xml b/OCH/mogo-och-sweeper/src/main/res/values/strings.xml
index 95a71366f9..825239b64f 100644
--- a/OCH/mogo-och-sweeper/src/main/res/values/strings.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/values/strings.xml
@@ -10,20 +10,19 @@
起点:
终点:
确认
- 切换路线
+ 准备出发
自动驾驶中,不可切换路线
当前行程未完成,不可切换路线
- 当前车辆无路线\n请联系运营人员绑定
+ 当前暂无任务
起点:
终点:
更换路线成功
更换路线失败
-
起点:
终点:
当前站点:
下一站:
自动驾驶状态为0不可用
-
预计等待%d秒
+ 请保持档位在N档并拉起手刹后启动自动驾驶
diff --git a/OCH/mogo-och-sweeper/src/main/res/values/style.xml b/OCH/mogo-och-sweeper/src/main/res/values/style.xml
index 36d7ef0d93..1f8f971a41 100644
--- a/OCH/mogo-och-sweeper/src/main/res/values/style.xml
+++ b/OCH/mogo-och-sweeper/src/main/res/values/style.xml
@@ -1,23 +1,3 @@
-
-
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java
index 9d1de00f4f..c40834776b 100644
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java
@@ -367,19 +367,19 @@ public class TaxiPassengerServingOrderFragment extends
private void updateSpeedView(float newSpeed) {
int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"mLimitingVelocity = "+mLimitingVelocity);
- if (mLimitingVelocity > 0 && speed >= mLimitingVelocity) {
- mTPSpeedTv.setmColorList(new int[]{getResources().getColor(R.color.taxi_p_speed_warn_color1),getResources().getColor(R.color.taxi_p_speed_warn_color2)});
- mTPSpeedTv.setText(String.valueOf(speed));
- mTPSpeedTvShadowBg.setText(String.valueOf(speed));
-
- mSpeedLayoutBg.setImageResource(R.drawable.taxi_p_speed_light_red_bg);
- } else {
+// if (mLimitingVelocity > 0 && speed >= mLimitingVelocity) {
+// mTPSpeedTv.setmColorList(new int[]{getResources().getColor(R.color.taxi_p_speed_warn_color1),getResources().getColor(R.color.taxi_p_speed_warn_color2)});
+// mTPSpeedTv.setText(String.valueOf(speed));
+// mTPSpeedTvShadowBg.setText(String.valueOf(speed));
+//
+// mSpeedLayoutBg.setImageResource(R.drawable.taxi_p_speed_light_red_bg);
+// } else {
mTPSpeedTv.setmColorList(new int[]{getResources().getColor(R.color.taxi_p_speed_normal_color1),getResources().getColor(R.color.taxi_p_speed_normal_color2)});
mTPSpeedTv.setText(String.valueOf(speed));
mTPSpeedTvShadowBg.setText(String.valueOf(speed));
mSpeedLayoutBg.setImageResource(R.drawable.taxi_p_speed_light_green_bg);
- }
+// }
}
private void runOnUIThread(Runnable executor) {
diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java
index 49d225165e..0f4edc2f79 100644
--- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java
+++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java
@@ -10,6 +10,16 @@ import com.zhidao.adas.client.bean.ObuRsi;
import com.zhidao.adas.client.bean.ObuRsm;
import com.zhidao.adas.client.bean.ObuSpat;
import com.zhidao.adas.client.bean.PerceptionTrafficLight;
+import com.zhidao.adas.client.bean.PlanningDecisionState;
+import com.zhidao.adas.client.bean.PlanningObjects;
+import com.zhidao.adas.client.bean.PredictionObstacleTrajectory;
+import com.zhidao.adas.client.bean.RecordDataConfig;
+import com.zhidao.adas.client.bean.RecordPanel;
+import com.zhidao.adas.client.bean.RoboSweeperTaskIndex;
+import com.zhidao.adas.client.bean.StatusInfo;
+import com.zhidao.adas.client.bean.TrackedObjects;
+import com.zhidao.adas.client.bean.Trajectory;
+import com.zhidao.adas.client.bean.Warn;
import com.zhidao.adas.client.log.LogSave;
import com.zhidao.adas.client.utils.Constants;
import com.zhidao.support.adas.high.common.ThreadPoolManager;
@@ -185,6 +195,227 @@ public class DataDistribution {
private String onTransmit(String time, BaseInfo data) {
String temp = data.toString();
String str = cutDown(temp);
+ if (data instanceof Trajectory) {
+ listTrajectory.add(0, new DataShow(listTrajectorySize++, time + str));
+ if (listTrajectory.size() > LIST_SIZE) {
+ listTrajectory.remove(listTrajectory.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_TRAJECTORY.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof TrackedObjects) {
+ listTrackedObjects.add(0, new DataShow(listTrackedObjectsSize++, time + str));
+ if (listTrackedObjects.size() > LIST_SIZE) {
+ listTrackedObjects.remove(listTrackedObjects.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_TRACKED_OBJECTS.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof OriginalPointCloudData) {
+ listOriginalPointCloud.add(0, new DataShow(listOriginalPointCloudSize++, time + str));
+ if (listOriginalPointCloud.size() > LIST_SIZE) {
+ listOriginalPointCloud.remove(listOriginalPointCloud.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_POINT_CLOUD_ORIGINAL.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof PlanningObjects) {
+ listPlanningObjects.add(0, new DataShow(listPlanningObjectsSize++, time + str));
+ if (listPlanningObjects.size() > LIST_SIZE) {
+ listPlanningObjects.remove(listPlanningObjects.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_PLANNING_OBJECTS.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof PlanningDecisionState) {
+ listPlanningDecisionState.add(0, new DataShow(listPlanningDecisionStateSize++, time + str));
+ if (listPlanningDecisionState.size() > LIST_SIZE) {
+ listPlanningDecisionState.remove(listPlanningDecisionState.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_PLANNING_DECISION_STATE.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof ObuSpat) {
+ listObuSpat.add(0, new DataShow(listObuSpatSize++, time + str));
+ if (listObuSpat.size() > LIST_SIZE) {
+ listObuSpat.remove(listObuSpat.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_OBU_SPAT.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof ObuRsi) {
+ listObuRsi.add(0, new DataShow(listObuRsiSize++, time + str));
+ if (listObuRsi.size() > LIST_SIZE) {
+ listObuRsi.remove(listObuRsi.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_OBU_RSI.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof ObuRsm) {
+ listObuRsm.add(0, new DataShow(listObuRsmSize++, time + str));
+ if (listObuRsm.size() > LIST_SIZE) {
+ listObuRsm.remove(listObuRsm.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_OBU_RSM.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof ObuMap) {
+ listObuMap.add(0, new DataShow(listObuMapSize++, time + str));
+ if (listObuMap.size() > LIST_SIZE) {
+ listObuMap.remove(listObuMap.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_OBU_MAP.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof GnssInfo) {
+ listGnssInfo.add(0, new DataShow(listGnssInfoSize++, time + str));
+ if (listGnssInfo.size() > LIST_SIZE) {
+ listGnssInfo.remove(listGnssInfo.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_GNSS_INFO.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof VehicleState) {
+ listVehicleState.add(0, new DataShow(listVehicleStateSize++, time + str));
+ if (listVehicleState.size() > LIST_SIZE) {
+ listVehicleState.remove(listVehicleState.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_VEHICLE_STATE.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof ChassisStates) {
+ listChassisStates.add(0, new DataShow(listChassisStatesSize++, time + str));
+ if (listChassisStates.size() > LIST_SIZE) {
+ listChassisStates.remove(listChassisStates.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_CHASSIS_STATES.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof AutopilotState) {
+ listAutopilotState.add(0, new DataShow(listAutopilotStateSize++, time + str));
+ if (listAutopilotState.size() > LIST_SIZE) {
+ listAutopilotState.remove(listAutopilotState.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_AUTOPILOT_STATE.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof MogoReportMessage) {
+ listMogoReportMessage.add(0, new DataShow(listMogoReportMessageSize++, time + str));
+ if (listMogoReportMessage.size() > LIST_SIZE) {
+ listMogoReportMessage.remove(listMogoReportMessage.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_REPORT_MESSAGE.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof PerceptionTrafficLight) {
+ listPerceptionTrafficLight.add(0, new DataShow(listPerceptionTrafficLightSize++, time + str));
+ if (listPerceptionTrafficLight.size() > LIST_SIZE) {
+ listPerceptionTrafficLight.remove(listPerceptionTrafficLight.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT.equals(listener.first)) {
+ listener.second.onPerceptionTrafficLight((PerceptionTrafficLight) data);
+ }
+ } else if (data instanceof PredictionObstacleTrajectory) {
+ listPredictionObstacleTrajectory.add(0, new DataShow(listPredictionObstacleTrajectorySize++, time + str));
+ if (listPredictionObstacleTrajectory.size() > LIST_SIZE) {
+ listPredictionObstacleTrajectory.remove(listPredictionObstacleTrajectory.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof BasicInfoReq) {
+
+ } else if (data instanceof CarConfigResp) {
+ if (listener != null && Constants.TITLE.TITLE_CAR_CONFIG_RESP.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof RecordPanel) {
+ listRecordPanel.add(0, new DataShow(listRecordPanelSize++, time + str));
+ if (listRecordPanel.size() > LIST_SIZE) {
+ listRecordPanel.remove(listRecordPanel.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_RECORD_RESULT.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof BagManagerCmd) {
+ listBagManagerCmd.add(0, new DataShow(listBagManagerCmdSize++, time + str));
+ if (listBagManagerCmd.size() > LIST_SIZE) {
+ listBagManagerCmd.remove(listBagManagerCmd.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_BAG_MANAGER_CMD.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof GlobalPathResp) {
+ listGlobalPathResp.add(0, new DataShow(listGlobalPathRespSize++, time + str));
+ if (listGlobalPathResp.size() > LIST_SIZE) {
+ listGlobalPathResp.remove(listGlobalPathResp.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_GLOBAL_PATH_RESP.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof Warn) {
+ listWarn.add(0, new DataShow(listWarnSize++, time + str));
+ if (listWarn.size() > LIST_SIZE) {
+ listWarn.remove(listWarn.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_WARN.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof ArrivalNotification) {
+ listArrivalNotification.add(0, new DataShow(listArrivalNotificationSize++, time + str));
+ if (listArrivalNotification.size() > LIST_SIZE) {
+ listArrivalNotification.remove(listArrivalNotification.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_ARRIVAL_NOTIFICATION.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof StatusInfo) {
+ listStatusInfo.add(0, new DataShow(listStatusInfoSize++, time + str));
+ if (listStatusInfo.size() > LIST_SIZE) {
+ listStatusInfo.remove(listStatusInfo.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_STATUS_QUERY_RESP.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof RecordDataConfig) {
+ listRecordDataConfig.add(0, new DataShow(listRecordDataConfigSize++, time + str));
+ if (listRecordDataConfig.size() > LIST_SIZE) {
+ listRecordDataConfig.remove(listRecordDataConfig.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_RECORD_DATA_CONFIG_RESP.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof RoboSweeperTaskIndex) {
+ listRoboSweeperTaskIndex.add(0, time + str);
+ if (listRoboSweeperTaskIndex.size() > LIST_SIZE) {
+ listRoboSweeperTaskIndex.remove(listRoboSweeperTaskIndex.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_SWEEPER_TASK_INDEX_DATA.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof RoboSweeperTaskIndex) {
+ listRoboSweeperTaskIndex.add(0, new DataShow(listRoboSweeperTaskIndexSize++, time + str));
+ if (listRoboSweeperTaskIndex.size() > LIST_SIZE) {
+ listRoboSweeperTaskIndex.remove(listRoboSweeperTaskIndex.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_SWEEPER_TASK_INDEX_DATA.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof FSMFunctionStates) {
+ listFSMFunctionStates.add(0, new DataShow(listFSMFunctionStatesSize++, time + str));
+ if (listFSMFunctionStates.size() > LIST_SIZE) {
+ listFSMFunctionStates.remove(listFSMFunctionStates.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_FUNCTION_STATES.equals(listener.first)) {
+ listener.second.onRefresh();
+ }
+ } else if (data instanceof ErrorData) {
+ listErrorData.add(0, new DataShow(listErrorDataSize++, time + str));
+ if (listErrorData.size() > 100) {
+ listErrorData.remove(listErrorData.size() - 1);
+ }
+ if (listener != null && Constants.TITLE.RECEIVE_ERROR.equals(listener.first)) {
+ listener.second.onRefresh();
if (data.header == null) {
if (data instanceof ErrorData) {
listErrorData.add(0, new DataShow(listErrorDataSize++, time + str));
diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java
index 254347a1db..9d29c6f204 100644
--- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java
+++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java
@@ -157,8 +157,6 @@ public class InfoFragment extends BaseFragment {
private void setData() {
if (Constants.TITLE.RECEIVE_GNSS_INFO.equals(title)) {
adapter.setData(DataDistribution.getInstance().listGnssInfo);
- } else if (Constants.TITLE.RECEIVE_VEHICLE_STATE.equals(title)) {
- adapter.setData(DataDistribution.getInstance().listVehicleState);
} else if (Constants.TITLE.RECEIVE_CHASSIS_STATES.equals(title)) {
adapter.setData(DataDistribution.getInstance().listChassisStates);
} else if (Constants.TITLE.RECEIVE_TRACKED_OBJECTS.equals(title)) {
diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java
index ff9b538ff3..0a6ab82bdd 100644
--- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java
+++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java
@@ -61,6 +61,10 @@ import com.zhidao.adas.client.bean.PerceptionTrafficLight;
import com.zhidao.adas.client.bean.ReceiveBytesData;
import com.zhidao.adas.client.bean.ReceiveData;
import com.zhidao.adas.client.bean.SpecialVehicleBean;
+import com.zhidao.adas.client.bean.StatusInfo;
+import com.zhidao.adas.client.bean.TrackedObjects;
+import com.zhidao.adas.client.bean.Trajectory;
+import com.zhidao.adas.client.bean.Warn;
import com.zhidao.adas.client.log.ConnectStatusSave;
import com.zhidao.adas.client.log.LogSave;
import com.zhidao.adas.client.other.permission.BackgrounderPermission;
@@ -97,7 +101,6 @@ import java.util.concurrent.ScheduledExecutorService;
import bag_manager.BagManagerOuterClass;
import chassis.ChassisStatesOuterClass;
-import chassis.VehicleStateOuterClass;
import function_state_management.FunctionStates;
import mogo.telematics.pad.MessagePad;
import mogo_msg.MogoReportMsg;
@@ -622,7 +625,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
titleFragmentData.add(Constants.TITLE.RECEIVE_GNSS_INFO);
titleFragmentData.add(Constants.TITLE.RECEIVE_TRAJECTORY);
titleFragmentData.add(Constants.TITLE.RECEIVE_TRACKED_OBJECTS);
- titleFragmentData.add(Constants.TITLE.RECEIVE_VEHICLE_STATE);
titleFragmentData.add(Constants.TITLE.RECEIVE_CHASSIS_STATES);
titleFragmentData.add(Constants.TITLE.RECEIVE_AUTOPILOT_STATE);
titleFragmentData.add(Constants.TITLE.RECEIVE_FUNCTION_STATES);
diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java
index 29c5db7fcb..1f19125e06 100644
--- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java
+++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java
@@ -150,7 +150,6 @@ public class Constants {
String RECEIVE_TRAJECTORY = MessageType.TYPE_RECEIVE_TRAJECTORY.desc;
String RECEIVE_TRACKED_OBJECTS = MessageType.TYPE_RECEIVE_TRACKED_OBJECTS.desc;
String RECEIVE_GNSS_INFO = MessageType.TYPE_RECEIVE_GNSS_INFO.desc;
- String RECEIVE_VEHICLE_STATE = MessageType.TYPE_RECEIVE_VEHICLE_STATE.desc;
String RECEIVE_CHASSIS_STATES = MessageType.TYPE_RECEIVE_CHASSIS_STATES.desc;
String RECEIVE_AUTOPILOT_STATE = MessageType.TYPE_RECEIVE_AUTOPILOT_STATE.desc;
String RECEIVE_FUNCTION_STATES = MessageType.TYPE_RECEIVE_FUNCTION_STATES.desc;
diff --git a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java
index 2cd3783eb5..6ba404fbea 100644
--- a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java
+++ b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java
@@ -67,6 +67,8 @@ import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
+import chassis.ChassisStatesOuterClass;
+import function_state_management.FunctionStates;
import bag_manager.BagManagerOuterClass;
import chassis.ChassisStatesOuterClass;
import chassis.VehicleStateOuterClass;
diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt
index bc791705a3..06c400a20a 100644
--- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt
+++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt
@@ -592,7 +592,6 @@ class MoGoAdasListenerImpl : OnAdasListener {
) {
}
-
/**
* 清扫车后部摄像头视频 10Hz
*
@@ -609,11 +608,11 @@ class MoGoAdasListenerImpl : OnAdasListener {
* @param header 头
* @param roboSweeperTaskIndex 数据
*/
- override fun onSweeperTaskIndexData(
- header: MessagePad.Header?,
- roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex?
- ) {
-
+ override fun onSweeperTaskIndexData(header: MessagePad.Header?, roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex?) {
+ roboSweeperTaskIndex?.let {
+ //清扫车(福田)清扫控制系统状态
+ CallerSweeperFutianCleanSystemListenerManager.invokeSweeperFutianCleanTaskIndexData(it)
+ }
}
/**
diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt
index aa995725a5..a2931a6574 100644
--- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt
+++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt
@@ -10,7 +10,6 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
-import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import mogo_msg.MogoReportMsg
@@ -70,30 +69,29 @@ class IPCReportManager : IMoGoAutopilotStatusListener {
*工控机监控节点上报
*/
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
- ThreadUtils.runOnUiThread {
- guardianInfo?.let{
- if(it.resultList.contains(RESULT_AUTOPILOT_DISABLE)
- || it.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED)
- || it.resultList.contains(RESULT_REMOTEPILOT_DISABLE)
- || it.resultList.contains(RESULT_AUTOPILOT_INFERIOR)
- || it.resultList.contains(RESULT_SHOW_WARNING)
- || it.resultList.contains(RESULT_REMOTEPILOT_INFERIOR)){
- val reportEntity = ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()),
- it.src,it.level,it.msg,it.code,it.resultList,it.actionsList,false)
- CallerMsgBoxManager.saveMsgBox(MsgBoxBean(MsgBoxType.REPORT, reportEntity))
- }
+ guardianInfo?.let{
+ if(it.resultList.contains(RESULT_AUTOPILOT_DISABLE)
+ || it.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED)
+ || it.resultList.contains(RESULT_REMOTEPILOT_DISABLE)
+ || it.resultList.contains(RESULT_AUTOPILOT_INFERIOR)
+ || it.resultList.contains(RESULT_SHOW_WARNING)
+ || it.resultList.contains(RESULT_REMOTEPILOT_INFERIOR)){
+ val reportEntity = ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()),
+ it.src,it.level,it.msg,it.code,it.resultList,it.actionsList,false)
+ CallerMsgBoxManager.saveMsgBox(MsgBoxBean(MsgBoxType.REPORT, reportEntity))
+ }
- if (reportList.size > 49) {
- reportList.removeLast()
- }
- reportList.add(
- 0,
- ReportEntity(
- TimeUtils.millis2String(System.currentTimeMillis()),
- it.src, it.level, it.msg, it.code, it.resultList, it.actionsList
- ,false)
- )
- reportListFloatWindow?.refreshData(reportList)
+ if (reportList.size > 49) {
+ reportList.removeLast()
+ }
+ reportList.add(
+ 0,
+ ReportEntity(
+ TimeUtils.millis2String(System.currentTimeMillis()),
+ it.src, it.level, it.msg, it.code, it.resultList, it.actionsList
+ ,false)
+ )
+ reportListFloatWindow?.refreshData(reportList)
// //Error 弹窗并有提示音
// if(it.resultList.contains(RESULT_AUTOPILOT_DISABLE)
@@ -130,7 +128,6 @@ class IPCReportManager : IMoGoAutopilotStatusListener {
// }
// }
// }
- }
}
}
diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt
index 0355ebb2b9..01044b7daa 100644
--- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt
+++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt
@@ -12,6 +12,7 @@ import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus
import com.zhjt.mogo_core_function_devatools.status.flow.IFlow
import kotlinx.coroutines.Job
import mogo_msg.MogoReportMsg.MogoReportMessage
+import planning.RoboSweeperTaskIndexOuterClass
import system_master.SystemStatusInfo.StatusInfo
import java.util.concurrent.atomic.AtomicInteger
@@ -94,10 +95,13 @@ internal class CanImpl(ctx: Context) :
send(CanStatus(isCanEnabled()))
}
+
override fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) {
send(CanStatus(isCanEnabled()))
}
+ override fun onSweeperFutianTaskIndexData(roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex) {
+ }
override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) {
super.onAutopilotGuardian(guardianInfo)
send(CanStatus(isCanEnabled()))
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxButtonView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxButtonView.kt
index 1bda3f2e9b..cdeb0b48cc 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxButtonView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxButtonView.kt
@@ -4,12 +4,14 @@ import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
+import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.hmi.R
-import kotlinx.android.synthetic.main.view_driver_msg_box_button.view.*
+import kotlinx.android.synthetic.main.view_driver_msg_box_button.view.cbMsgBoxDriver
+import kotlinx.android.synthetic.main.view_driver_msg_box_button.view.msgBoxTipView
/**
* @author XuXinChao
@@ -20,7 +22,7 @@ class DriverMsgBoxButtonView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
-):ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxEventListener {
+) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxEventListener {
companion object {
const val TAG = "DriverMsgBoxButtonView"
@@ -28,21 +30,35 @@ class DriverMsgBoxButtonView @JvmOverloads constructor(
private var clickListener: ClickListener? = null
- init{
+ private val bgResources: Int
+
+ init {
LayoutInflater.from(context).inflate(R.layout.view_driver_msg_box_button, this, true)
+ val a = context.obtainStyledAttributes(
+ attrs,
+ R.styleable.DriverMsgBoxButtonView,
+ defStyleAttr,
+ 0
+ )
+ bgResources = a.getResourceId(
+ R.styleable.DriverMsgBoxButtonView_bgDrawable,
+ R.drawable.selector_msg_box
+ )
initView()
}
- private fun initView(){
+ private fun initView() {
cbMsgBoxDriver.setOnCheckedChangeListener { _, isChecked ->
clickListener?.showMsgBoxList(isChecked)
msgBoxTipView.visibility = View.GONE
}
+
+ cbMsgBoxDriver.background = AppCompatResources.getDrawable(context, bgResources)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
- CallerMsgBoxEventListenerManager.addListener(TAG,this)
+ CallerMsgBoxEventListenerManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
@@ -59,9 +75,9 @@ class DriverMsgBoxButtonView @JvmOverloads constructor(
* @param isShow true:展示;false:不展示
*/
override fun onUpdateTipEvent(isShow: Boolean) {
- if(isShow){
+ if (isShow) {
msgBoxTipView.visibility = View.VISIBLE
- }else{
+ } else {
msgBoxTipView.visibility = View.GONE
}
}
@@ -82,7 +98,7 @@ class DriverMsgBoxButtonView @JvmOverloads constructor(
this.clickListener = clickListener
}
- interface ClickListener{
+ interface ClickListener {
fun showMsgBoxList(show: Boolean)
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt
index 7486d917f1..2f7af24a3c 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt
@@ -27,7 +27,7 @@ import com.mogo.commons.constants.SharedPrefsConstants
import com.mogo.commons.debug.DebugConfig
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.eagle.core.data.app.AppConfigInfo
-import com.mogo.eagle.core.data.autopilot.*
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.constants.MoGoConfig
@@ -83,8 +83,14 @@ import kotlinx.android.synthetic.main.view_sop_setting.view.*
import kotlinx.coroutines.*
import mogo.telematics.pad.MessagePad
import mogo_msg.MogoReportMsg
+import planning.RoboSweeperTaskIndexOuterClass
import java.text.SimpleDateFormat
import java.util.*
+import kotlin.collections.component1
+import kotlin.collections.component2
+import kotlin.collections.component3
+import kotlin.collections.component4
+import kotlin.collections.set
import kotlin.math.abs
@@ -1984,7 +1990,9 @@ internal class DebugSettingView @JvmOverloads constructor(
override fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) {
}
+ override fun onSweeperFutianTaskIndexData(roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex) {
+ }
/**
* 吐司提示
*/
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt
index f89fe8f773..ebee55d1ee 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/SteeringBrakeView.kt
@@ -12,7 +12,6 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLamplightListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLamplightListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
-import com.mogo.eagle.core.function.call.map.*
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java
index 60cc5b0106..f93762168e 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java
@@ -39,7 +39,7 @@ public class TapPositionView extends ConstraintLayout {
tabN = findViewById(R.id.tap_n);
tabD = findViewById(R.id.tap_d);
typedArray = context.obtainStyledAttributes(attrs, R.styleable.TapPositionView);
- if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)){
+ if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)||AppIdentityModeUtils.isSweeper(FunctionBuildConfig.appIdentityMode)){
tabP.setVisibility(View.GONE);
}
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java
index d206c9a477..b074fff41c 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java
@@ -34,6 +34,8 @@ import org.jetbrains.annotations.NotNull;
import chassis.Chassis;
import mogo.telematics.pad.MessagePad;
+import chassis.ChassisStatesOuterClass;
+import planning.RoboSweeperTaskIndexOuterClass;
/**
* @author Jing
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml
index 4e1a2e3835..7887eb5c78 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml
+++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml
@@ -80,4 +80,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt
index 3d771e7acd..dffc550030 100644
--- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotVehicleStateListener.kt
@@ -10,5 +10,4 @@ interface IMoGoAutopilotVehicleStateListener {
* 没有自车状态数据
*/
fun onAutopilotDataException(timestamp: Long) {}
-
}
\ No newline at end of file
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoSweeperFutianCleanSystemListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoSweeperFutianCleanSystemListener.kt
index e255f5a660..b4a3bf9093 100644
--- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoSweeperFutianCleanSystemListener.kt
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoSweeperFutianCleanSystemListener.kt
@@ -1,6 +1,7 @@
package com.mogo.eagle.core.function.api.autopilot
import chassis.ChassisStatesOuterClass
+import planning.RoboSweeperTaskIndexOuterClass
/**
* 清扫车(福田)清扫控制系统状态
@@ -10,4 +11,10 @@ interface IMoGoSweeperFutianCleanSystemListener {
* 清扫车(福田)清扫控制系统状态
*/
fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates)
+
+
+ /**
+ * 清扫车(福田)指标数据 贴边数据
+ */
+ fun onSweeperFutianTaskIndexData(roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex)
}
\ No newline at end of file
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt
index f8c96434ee..0b846cdd23 100644
--- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotVehicleStateListenerManager.kt
@@ -2,6 +2,8 @@ package com.mogo.eagle.core.function.call.autopilot
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotVehicleStateListener
import com.mogo.eagle.core.function.call.base.CallerBase
+import planning.RoboSweeperTaskIndexOuterClass
+import java.util.concurrent.ConcurrentHashMap
/**
* 车辆底盘数据 回调监听
@@ -31,4 +33,5 @@ object CallerAutopilotVehicleStateListenerManager : CallerBase 2
isBus(appIdentityMode) && isPassenger(appIdentityMode) -> 3
isBus(appIdentityMode) && isDriver(appIdentityMode) -> 4
+ isSweeper(appIdentityMode) -> 6
else -> 0
}
}
diff --git a/gradle.properties b/gradle.properties
index db8144bdb9..b0d479bb7f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -93,8 +93,8 @@ WEBSOCKET_VERSION=1.1.7
applicationId=com.mogo.launcer
applicationName=IntelligentPilot
# RoboBus司机端:2.5.1;RoboTaxi司机端:2.5.1;RoboTaxi乘客端:1.0.0
-versionCode=1002000
-versionName=1.0.2
+versionCode=3000000
+versionName=3.0.0
################# 新架构模块Maven版本管理 #################
MOGO_CORE_FUNCTION_HMI_VERSION=0.0.58.10
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java
index dd1733a2d5..e10fc5f345 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java
@@ -1,6 +1,7 @@
package com.zhidao.support.adas.high.msg;
import android.os.SystemClock;
+import android.util.Log;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.AdasChannel;
@@ -26,7 +27,7 @@ public class ArrivalNotificationMessage extends MyAbstractMessageHandler {
adasListener.onArrivalNotification(raw.getHeader(), arrivalNotification);
}
AdasChannel.calculateTimeConsumingBusiness("到站提醒", nowTime);
-// CupidLogUtils.e("到站提醒--->" + arrivalNotification.toString());
+ Log.d("ArrivalNotificationMessage","到站提醒--->" + arrivalNotification.toString());
}
}