From b76ae6fb1ad08b4ac94dac90f97b97b1204f91b9 Mon Sep 17 00:00:00 2001 From: bxb Date: Wed, 22 Feb 2023 18:02:33 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=85=E6=89=AB=E8=BD=A6]=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E8=B4=B4=E8=BE=B9=E6=95=B0=E6=8D=AE=E5=88=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-sweeper/build.gradle | 4 +- .../com/mogo/och/sweeper/bean/WeltDataBean.kt | 10 -- .../mogo/och/sweeper/constant/SweeperConst.kt | 3 +- .../mogo/och/sweeper/database/MyDataBase.java | 29 ++++ .../sweeper/database/bean/WeltDataBean.java | 125 ++++++++++++++++++ .../och/sweeper/database/dao/WeltDataDao.java | 27 ++++ .../fragment/BaseSweeperTabFragment.java | 91 +++++++++++-- .../och/sweeper/fragment/SweeperFragment.kt | 4 +- .../fragment/WeltMapOverViewFragment.kt | 43 +++--- .../sweeper/presenter/SweeperPresenter.java | 67 ++++++++-- .../mogo/och/sweeper/view/WeltMapOverView.kt | 30 ++--- .../mogo/och/sweeper/view/WeltSmallMapView.kt | 20 +-- .../res/drawable-xhdpi/sweeper_car_big.png | Bin 0 -> 45020 bytes 13 files changed, 369 insertions(+), 84 deletions(-) delete mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/MyDataBase.java create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/bean/WeltDataBean.java create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/dao/WeltDataDao.java create mode 100644 OCH/mogo-och-sweeper/src/main/res/drawable-xhdpi/sweeper_car_big.png diff --git a/OCH/mogo-och-sweeper/build.gradle b/OCH/mogo-och-sweeper/build.gradle index 51769361c2..a1aa90420b 100644 --- a/OCH/mogo-och-sweeper/build.gradle +++ b/OCH/mogo-och-sweeper/build.gradle @@ -18,7 +18,7 @@ android { javaCompileOptions { annotationProcessorOptions { - arguments = [AROUTER_MODULE_NAME: project.getName()] + arguments = [AROUTER_MODULE_NAME: project.getName(),"room.schemaLocation": "$projectDir/schemas".toString()] } } } @@ -53,6 +53,8 @@ dependencies { implementation rootProject.ext.dependencies.rxandroid implementation rootProject.ext.dependencies.androidxrecyclerview implementation rootProject.ext.dependencies.androidxcardview + implementation rootProject.ext.dependencies.androidxroomruntime + annotationProcessor rootProject.ext.dependencies.androidxroomcompiler implementation project(":OCH:mogo-och-common-module") compileOnly project(":libraries:mogo-map") diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt deleted file mode 100644 index c0f6809f37..0000000000 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/WeltDataBean.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.mogo.och.sweeper.bean - -data class WeltDataBean( - var locLon: Double,//经度 - var locLat: Double,//纬度 - var weltDistance: Double,//贴边距离 - var cleanMode: Int,//清扫模式 - var cleanDirection: Int,//清扫方向 - var cleanIntensity: Int,//作业强度 -) \ 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 ec51cbe709..9dbf2304af 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 @@ -9,7 +9,8 @@ class SweeperConst { companion object { private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com" - private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com" + //private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com" + private const val BASE_URL_OCH_QA = "http://sweep-dev.svc.zhidaoauto.com" private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com" @JvmStatic 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..8ca4a6d676 --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/bean/WeltDataBean.java @@ -0,0 +1,125 @@ +package com.mogo.och.sweeper.database.bean; + +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 { + + 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..097be3af3e --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/database/dao/WeltDataDao.java @@ -0,0 +1,27 @@ +package com.mogo.och.sweeper.database.dao; + +import com.mogo.och.sweeper.database.bean.WeltDataBean; + +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/fragment/BaseSweeperTabFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java index 1ca537c04e..87c5911065 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,12 +1,14 @@ package com.mogo.och.sweeper.fragment; import android.os.Bundle; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import com.amap.api.maps.model.LatLng; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; @@ -18,6 +20,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.view.MapBizView; import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; +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; @@ -26,7 +29,7 @@ import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.och.common.module.map.AmapNaviToDestinationModel; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.sweeper.R; -import com.mogo.och.sweeper.bean.WeltDataBean; +import com.mogo.och.sweeper.database.bean.WeltDataBean; import com.mogo.och.sweeper.callback.IWeltMapSwitchToSmallCallback; import com.mogo.och.sweeper.view.SweeperTrafficDataView; import com.mogo.och.sweeper.view.WeltSmallMapView; @@ -332,6 +335,7 @@ public abstract class BaseSweeperTabFragment weltDataBeans) { + if (mMapWeltView != null) { + mMapWeltView.setWeltData(weltDataBeans); + runOnUIThread(() -> { + mMapWeltView.drawablePolyline(); + }); + } + if (mWeltMapOverViewFragment != null && mWeltMapOverViewFragment.isVisible()) { + mWeltMapOverViewFragment.setWeltData(weltDataBeans); + runOnUIThread(() -> { + mWeltMapOverViewFragment.drawablePolyline(); + }); + } + } + + /** + * 添加起点和终点 + */ + public void addStartAndEndMarker(LatLng startPoint, LatLng endPoint) { + if (mMapWeltView != null) { + mMapWeltView.addStartAndEndMarker(startPoint, endPoint); + } + if (mWeltMapOverViewFragment != null && mWeltMapOverViewFragment.isVisible()) { + mWeltMapOverViewFragment.addStartAndEndMarker(startPoint, endPoint); + } + } + + /** + * 清除marker标记和任务路线数据 + */ + public void clearAllMarkerAndPolyline() { + if (mMapWeltView != null) { + mMapWeltView.clearAllMarkerAndPolyline(); + } + if (mWeltMapOverViewFragment != null) { + mWeltMapOverViewFragment.clearAllMarkerAndPolyline(); + } + } + + private void runOnUIThread(Runnable executor) { + if (executor == null) { + return; + } + if (Looper.myLooper() != Looper.getMainLooper()) { + UiThreadHandler.post(executor); + } else { + executor.run(); + } + } + /** * mock 贴边假数据 */ private void setWeltData() { List weltDataBean = new ArrayList<>(); - weltDataBean.add(new WeltDataBean(116.38851540542558, 39.97419244219622, -10, 1, 1, 1)); - weltDataBean.add(new WeltDataBean(116.38777443467706, 39.96694323029558, 8, 1, 1, 1)); - weltDataBean.add(new WeltDataBean(116.39311478161825, 39.967085313029074, 16, 1, 1, 1)); - weltDataBean.add(new WeltDataBean(116.40963237692603, 39.975055860562826, 30, 1, 1, 1)); - weltDataBean.add(new WeltDataBean(116.41146331146084, 39.97513910337909, -9999.0, 1, 1, 1)); - weltDataBean.add(new WeltDataBean(116.40748849300006, 39.96752223478818, -10000.0, 1, 1, 1)); - weltDataBean.add(new WeltDataBean(116.42670283855335, 39.97526250389533, 1000, 1, 1, 1)); - mMapWeltView.setWeltData(weltDataBean); - mMapWeltView.drawablePolyline(); + weltDataBean.add(getWeltDataBean(116.38851540542558, 39.97419244219622, -10.0)); + weltDataBean.add(getWeltDataBean(116.38777443467706, 39.96694323029558, 8.0)); + weltDataBean.add(getWeltDataBean(116.39311478161825, 39.967085313029074, 16.0)); + weltDataBean.add(getWeltDataBean(116.40963237692603, 39.975055860562826, 30.0)); + weltDataBean.add(getWeltDataBean(116.41146331146084, 39.97513910337909, -9999.0)); + weltDataBean.add(getWeltDataBean(116.40748849300006, 39.96752223478818, -10000.0)); + weltDataBean.add(getWeltDataBean(116.42670283855335, 39.97526250389533, 1000.0)); + setWeltDataToMap(weltDataBean); + addStartAndEndMarker(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(),116.38851540542558,39.97419244219622), + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(),116.42670283855335,39.97526250389533)); + } + + private WeltDataBean getWeltDataBean(Double locLon, Double locLat, Double weltDistance) { + //把wgs坐标系坐标转换成gcj坐标 + LatLng latLng= CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(),locLon,locLat); + WeltDataBean weltDataBean = new WeltDataBean(); + weltDataBean.setLocLon(latLng.longitude); + weltDataBean.setLocLat(latLng.latitude); + weltDataBean.setWeltDistance(weltDistance); + return weltDataBean; } } 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 index 06aa396ffa..6bc5c66ae4 100644 --- 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 @@ -2,6 +2,8 @@ package com.mogo.och.sweeper.fragment import android.os.Bundle import android.view.View +import androidx.annotation.MainThread +import androidx.annotation.UiThread import androidx.recyclerview.widget.LinearLayoutManager import chassis.ChassisStatesOuterClass import com.mogo.eagle.core.data.map.MogoLocation @@ -186,7 +188,7 @@ class SweeperFragment : BaseSweeperTabFragment = ArrayList() - weltDataBean.add(WeltDataBean(116.38851540542558, 39.97419244219622, -10.0, 1, 1, 1)) - weltDataBean.add(WeltDataBean(116.38777443467706, 39.96694323029558, 8.0, 1, 1, 1)) - weltDataBean.add(WeltDataBean(116.39311478161825, 39.967085313029074, 16.0, 1, 1, 1)) - weltDataBean.add(WeltDataBean(116.40963237692603, 39.975055860562826, 30.0, 1, 1, 1)) - weltDataBean.add(WeltDataBean(116.41146331146084, 39.97513910337909, -9999.0, 1, 1, 1)) - weltDataBean.add(WeltDataBean(116.40748849300006, 39.96752223478818, -10000.0, 1, 1, 1)) - weltDataBean.add(WeltDataBean(116.42670283855335, 39.97526250389533, 1000.0, 1, 1, 1)) - weltMapOverView.setWeltData(weltDataBean) - weltMapOverView.drawablePolyline() - weltMapOverView.addStartAndEndMarker( - CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(context, 116.38851540542558, 39.97419244219622), - CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( - context, 116.42670283855335, 39.97526250389533 - ) - ) + fun setWeltData(weltDatas:MutableList) { + weltMapOverView.setWeltData(weltDatas) } + /** + * 绘制任务路线数据 + */ + fun drawablePolyline(){ + weltMapOverView.drawablePolyline() + } + /** + * 添加起点和终点marker + */ + fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng){ + weltMapOverView.drawStartAndEndMarker(startPoint,endPoint) + } + + fun clearAllMarkerAndPolyline(){ + weltMapOverView.clearAllMarkerAndPolyline() + } /** * 设置图例数据 */ 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 36508c47a5..ff44ca41a0 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 @@ -2,6 +2,7 @@ package com.mogo.och.sweeper.presenter; import android.os.Looper; +import com.amap.api.maps.model.LatLng; import com.amap.api.navi.model.NaviLatLng; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; @@ -17,6 +18,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.common.module.map.AmapNaviToDestinationModel; +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.sweeper.bean.SweeperMainTaskBean; import com.mogo.och.sweeper.bean.SweeperSubTaskBean; import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean; @@ -25,6 +27,8 @@ 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.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.SweeperTaskModel; import com.mogo.och.sweeper.util.SweeperFutianCmdUtil; @@ -59,10 +63,15 @@ public class SweeperPresenter extends Presenter private int mSubTaskId = 0; //当前是否最后一个子任务 private boolean mIsLastSubtask = false; - // 底盘数据回调时间间隔 + // 清扫模式回调时间间隔 private static final long VEHICLE_STATE_INTERVAL_MILLIS = 500L; - // 当前时间戳 - private long mCurrentTimeMillis; + // 清扫模式当前时间戳 + private long mVehicleStateCurrentTimeMillis; + + // 贴边数据回调时间间隔 + private static final long WELT_DATA_INTERVAL_MILLIS = 2000L; + // 贴边数据当前时间戳 + private long mWeltDataCurrentTimeMillis; public SweeperPresenter(SweeperFragment view) { super(view); @@ -172,6 +181,10 @@ public class SweeperPresenter extends Presenter } + /** + * 当前子任务id + * @param mSubTaskId + */ public void setSubTaskId(int mSubTaskId) { this.mSubTaskId = mSubTaskId; SweeperTaskModel.getInstance().setSubTaskId(mSubTaskId); @@ -235,11 +248,14 @@ public class SweeperPresenter extends Presenter @Override public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { - long current = System.currentTimeMillis(); - if (current - mCurrentTimeMillis <= VEHICLE_STATE_INTERVAL_MILLIS) { + if (cleanSystemState==null){ return; } - mCurrentTimeMillis = current; + 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(); @@ -286,13 +302,46 @@ public class SweeperPresenter extends Presenter .append(clean_intensity_strong); CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onSweeperFutianCleanSystemState:"+stringBuilder); - runOnUIThread(() -> mView.onSweeperFutianCleanSystemState(cleanSystemState)); + mView.onSweeperFutianCleanSystemState(cleanSystemState); } @Override public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { - - + long current = System.currentTimeMillis(); + if (current - mWeltDataCurrentTimeMillis <= WELT_DATA_INTERVAL_MILLIS) { + return; + } + mWeltDataCurrentTimeMillis = current; + if (roboSweeperTaskIndex==null){ + return; + } + 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); + //保存贴边数据到数据库中 + WeltDataBean weltDataBean=new WeltDataBean(); + //把wgs坐标系坐标转换成gcj坐标 + LatLng latLng=CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(AbsMogoApplication.getApp(),roboSweeperTaskIndex.getLocLon(),roboSweeperTaskIndex.getLocLat()); + weltDataBean.setLocLon(latLng.longitude); + weltDataBean.setLocLat(latLng.latitude); + weltDataBean.setWeltDistance(roboSweeperTaskIndex.getDistToRefEdgePoint()); + weltDataBean.setCleanMode(roboSweeperTaskIndex.getCleanMode()); + weltDataBean.setCleanDirection(roboSweeperTaskIndex.getCleanDirection()); + weltDataBean.setCleanIntensity(roboSweeperTaskIndex.getCleanIntensity()); + weltDataBean.setSubTaskId(mSubTaskId); + MyDataBase.getInstance().getWeltDataDao().insert(weltDataBean); + mView.setWeltDataToMap(MyDataBase.getInstance().getWeltDataDao().loadAllWeltDataInfo()); } /** 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 index 749767df93..5d28df4ec5 100644 --- 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 @@ -15,9 +15,8 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Liste 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.och.common.module.utils.CoordinateCalculateRouteUtil import com.mogo.och.sweeper.R -import com.mogo.och.sweeper.bean.WeltDataBean +import com.mogo.och.sweeper.database.bean.WeltDataBean import kotlinx.android.synthetic.main.sweeper_welt_map_overview.view.* /** @@ -31,8 +30,10 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { private var mPolyline: Polyline? = null private var colorList: MutableList = mutableListOf() private val mLineMarkers: MutableList = mutableListOf() + //清扫车任务地图 private val TAG = "WeltMapOverView" + constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { initView(context) @@ -49,6 +50,7 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this) setLegendData() } + private fun initAMapView() { mAMap = sweeperTextureMapView.map // 地图文字标注 @@ -62,7 +64,7 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { // 设置 锚点 图标 mCarMarker = mAMap?.addMarker( MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_car_small)) + .icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_car_big)) .anchor(0.5f, 0.5f) ) // 设置地图的样式 @@ -99,6 +101,7 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { } } } + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { mogoLocation?.let { gnssInfo -> val currentLatLng = LatLng(gnssInfo.latitude, gnssInfo.longitude) @@ -118,6 +121,7 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { } } } + /** * 根据贴边数据绘制任务路线 */ @@ -140,9 +144,9 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { } /** - * 添加起点和终点的marker + * 绘制起点和终点的marker */ - fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { + fun drawStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { val startMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.start_maker_icon))) startMarker?.position = startPoint mLineMarkers.add(startMarker) @@ -152,32 +156,26 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { } /** - * 清除maker + * 清除所有标记和路线 */ - private fun clearMarkers() { + public fun clearAllMarkerAndPolyline() { + mPolyline?.remove() for (i in mLineMarkers.indices) { mLineMarkers[i]?.isVisible = false mLineMarkers[i]?.remove() } mLineMarkers.clear() } - - /** - * 清除任务路线 - */ - fun clearPolyline() { - mPolyline?.remove() - } - /** * 设置贴边数据 */ fun setWeltData(weltData: MutableList) { this.mWeltData = weltData for (i in mWeltData.indices) { - mCoordinatesLatLng.add(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(context, mWeltData[i].locLon, mWeltData[i].locLat)) + mCoordinatesLatLng.add(LatLng(mWeltData[i].locLat, mWeltData[i].locLon)) } } + /** * 设置图例数据 */ 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 index 0f0829095e..be0c79afc6 100644 --- 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 @@ -16,7 +16,7 @@ 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.utils.CoordinateCalculateRouteUtil import com.mogo.och.sweeper.R -import com.mogo.och.sweeper.bean.WeltDataBean +import com.mogo.och.sweeper.database.bean.WeltDataBean import kotlinx.android.synthetic.main.sweeper_welt_small_map_view.view.* /** @@ -104,7 +104,7 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { uiSettings?.setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可 mAMap?.setOnMapLoadedListener(AMap.OnMapLoadedListener { d(SceneConstant.M_SWEEPER + TAG, "WeltView---onMapLoaded") - //mAMap?.setPointToCenter(mAMapNaviView?.width?.div(2) ?: 0, mAMapNaviView?.height?.div(2) ?: 0) + mAMap?.setPointToCenter(sweeperSmallTextureMapView.width / 2, sweeperSmallTextureMapView.height / 2) }) } @@ -145,7 +145,6 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { polylineOptions.colorValues(colorList) // 绘制线 mPolyline = mAMap?.addPolyline(polylineOptions) - addStartAndEndMarker(mCoordinatesLatLng[0], mCoordinatesLatLng[mCoordinatesLatLng.size - 1]) } } } @@ -153,7 +152,7 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { /** * 添加起点和终点的marker */ - private fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { + fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { val startMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.start_maker_icon))) startMarker?.position = startPoint mLineMarkers.add(startMarker) @@ -163,23 +162,16 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { } /** - * 清除数据 + * 清除所有标记和路线 */ - private fun clearMarkers() { + fun clearAllMarkerAndPolyline() { + mPolyline?.remove() for (i in mLineMarkers.indices) { mLineMarkers[i]?.isVisible = false mLineMarkers[i]?.remove() } mLineMarkers.clear() } - - /** - * 清除任务路线 - */ - fun clearPolyline() { - mPolyline?.remove() - } - /** * 设置贴边数据 */ 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 0000000000000000000000000000000000000000..b30095f4c907d545c29a28f07174e081d64520f0 GIT binary patch literal 45020 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 literal 0 HcmV?d00001