diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java index 0b04bef6b9..60f7798a05 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -119,11 +119,11 @@ public class BusLineModel { } public void commitSwitchLineId(int taskId,int lineId){ - OchChainLogManager.writeChainLog("选择线路","taskId:"+taskId+"--lineId:"+lineId,true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("选择线路","taskId:"+taskId+"--lineId:"+lineId); OrderServiceManager.switchLine(mContext,taskId, new OchCommonServiceCallback() { @Override public void onSuccess(BusRoutesResponse o) { - OchChainLogManager.writeChainLog("选择线路成功","taskId:"+taskId+"--lineId:"+lineId,true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("选择线路成功","taskId:"+taskId+"--lineId:"+lineId); SharedPrefsMgr.getInstance().putInt(BusSwitchLineActivity.LASTCOMMITLINEID,lineId); if (mBusLinesCallback != null){ mBusLinesCallback.onChangeLineIdSuccess(); @@ -133,7 +133,7 @@ public class BusLineModel { @Override public void onError() { if (!NetworkUtils.isConnected(mContext)) { - OchChainLogManager.writeChainLog("选择线路失败","taskId:"+taskId+"--lineId:"+lineId,true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("选择线路失败","taskId:"+taskId+"--lineId:"+lineId); ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java index 41484f0972..0c1e4f6e40 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java @@ -22,10 +22,8 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; 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.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.CoordinateUtils; -import com.mogo.eagle.core.utilcode.util.DateTimeUtils; import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; import com.mogo.eagle.core.utilcode.util.GsonUtils; import com.mogo.eagle.core.utilcode.util.NetworkUtils; @@ -48,6 +46,7 @@ import com.mogo.och.bus.util.BusSendTripInfoManager; import com.mogo.och.bus.util.BusTrajectoryManager; import com.mogo.och.bus.util.BusVoiceManager; import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager; +import com.mogo.och.common.module.manager.autopilot.line.LineManager; import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener; import com.mogo.och.common.module.manager.socket.lan.LanSocketManager; import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg; @@ -80,6 +79,7 @@ import com.mogo.och.data.bean.BusRoutesResult; import com.mogo.och.data.bean.BusStationBean; import com.mogo.och.data.bean.BusTransferData; import com.mogo.och.data.manager.cache.CacheDataManager; +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager; import org.jetbrains.annotations.NotNull; @@ -142,7 +142,7 @@ public class OrderModel { public void init() { mContext = AbsMogoApplication.getApp(); // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,5, mMapLocationListener); + OchLocationManager.addGCJ02Listener(TAG,5, mMapLocationListener); TrajectoryManager.INSTANCE.addTrajectoryListListenerr(TAG,iTrajectoryListener); @@ -197,6 +197,8 @@ public class OrderModel { }); } + // 初始化调用 + // 登录状态发生变化调用 public void queryBusCacheRoutes(){ String loginStr = CacheDataManager.Companion.getInstance().getCacheData( @@ -392,7 +394,7 @@ public class OrderModel { startOrStopOrderLoop(false); // 注销定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); + OchLocationManager.removeGCJ02Listener(TAG); TrajectoryManager.INSTANCE.addTrajectoryListListenerr(TAG,null); @@ -500,7 +502,7 @@ public class OrderModel { closeBeautificationMode(); clearStartAutopilotTag(); removeTipRunnables(); - + updateBusStatus(null); CacheDataManager.Companion.getInstance().clearCacheData(mContext, BusCacheKey.BUS_LINE_CACHE); return; } @@ -720,7 +722,7 @@ public class OrderModel { FunctionBuildConfig.isPassStartAutopilotCommand); //3、距离轨迹15m计算 - String resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot((long)busRoutesResult.getLineId()); + String resion = OchAutoPilotManager.canStartAutoPilot(busRoutesResult.getLineId()); if(TrajectoryAndDistanceManager.errorTypeNoneLineId.equals(resion)){ MogoLocation nextStationPoint = new MogoLocation(); if (backgroundCurrentStationIndex < stationList.size() - 1) { @@ -733,7 +735,7 @@ public class OrderModel { currentStationPoint.setLongitude(busStationBean.getGcjLon()); currentStationPoint.setLatitude(busStationBean.getGcjLat()); setTrajectoryStation(currentStationPoint,nextStationPoint, (long)busRoutesResult.getLineId()); - resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot((long)busRoutesResult.getLineId()); + resion = OchAutoPilotManager.canStartAutoPilot(busRoutesResult.getLineId()); } if(!StringUtils.isEmpty(resion)){ ToastUtils.showShort(resion); @@ -742,9 +744,7 @@ public class OrderModel { } //4、ssm 给出数据 - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { - ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + - ", 请稍候重试"); + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { triggerUnableStartAPReasonEvent(); return; } @@ -779,8 +779,7 @@ public class OrderModel { * 到站后重置站点状态 */ private void arriveSiteStation(String changeInfo) { - OchChainLogManager.writeChainLog("触发进站", changeInfo, - true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("触发进站", changeInfo); if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { //到站短时间内调用多次 CallerLogger.e( M_BUS + TAG, "数组越界" ); return; @@ -890,8 +889,7 @@ public class OrderModel { String changeInfo = "taskId:" + currentTaskId + "--lineId:" + currentLineId + "--currentStationName:"+currentStationName+"--finalNextStationName:"+finalNextStationName; - OchChainLogManager.writeChainLog("滑动出发", changeInfo, - true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("滑动出发", changeInfo); OrderServiceManager.leaveStation(mContext, busStationBean.getSeq(), busStationBean.getSiteId(), @@ -899,8 +897,7 @@ public class OrderModel { new OchCommonServiceCallback() { @Override public void onSuccess(BaseData o) { - OchChainLogManager.writeChainLog("滑动出发成功", changeInfo, - true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("滑动出发成功", changeInfo); } @@ -962,11 +959,15 @@ public class OrderModel { * @param result */ private void updateBusStatus(BusRoutesResult result) { - if (result == null) return; + if (result == null) { + LineManager.setLineId(-1); + return; + } busRoutesResult = result; List site = result.getSites(); currentTaskId = result.getTaskId(); currentLineId = result.getLineId(); + LineManager.setLineId(currentLineId); stationList.clear(); stationList.addAll(site); @@ -1234,8 +1235,9 @@ public class OrderModel { // 车机端上传心跳数据(只在出车状态时上传) public void runCarHeartbeat() { - double mLatitude = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLatitude(); - double mLongitude =CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLongitude(); + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + double mLatitude = gcj02Location.getLatitude(); + double mLongitude = gcj02Location.getLongitude(); OrderServiceManager.runCarHeartbeat(mContext, mLongitude, mLatitude, new OchCommonServiceCallback() { @Override @@ -1261,9 +1263,7 @@ public class OrderModel { // 登出 public void logout() { - double mLatitude = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLatitude(); - double mLongitude =CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLongitude(); - LoginStatusManager.loginOut(mLatitude, mLongitude); + LoginStatusManager.loginOut(); } public void triggerStartServiceEvent(boolean isRestart, boolean send) { diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt b/OCH/bus/driver/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt index 663fdb4406..92884c272b 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt @@ -324,7 +324,7 @@ object OrderServiceManager { ) ) .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat")) + .subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat",false)) } } diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/util/BusVoiceManager.kt b/OCH/bus/driver/src/main/java/com/mogo/och/bus/util/BusVoiceManager.kt index 999aaa4f7a..b012ede9f4 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/util/BusVoiceManager.kt +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/util/BusVoiceManager.kt @@ -21,9 +21,6 @@ object BusVoiceManager { } fun arrivedStationBus(siteNameCN: String?, siteNameKR: String?) { - if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { - return - } val context = AbsMogoApplication.getApp() val list: MutableList = ArrayList() siteNameCN?.let { @@ -33,7 +30,7 @@ object BusVoiceManager { ) val engTTS = LangTtsEntity( context.getString(R.string.bus_arrived_station_english_tip, it), - LanguageType.CHINESE + LanguageType.ENGLISH ) val koreanTTS = LangTtsEntity( context.getString(R.string.bus_arrived_station_korean_tip, siteNameKR?:it), @@ -57,7 +54,7 @@ object BusVoiceManager { ) val engTTS = LangTtsEntity( context.getString(R.string.bus_leave_station_english_tip, it), - LanguageType.CHINESE + LanguageType.ENGLISH ) list.add(chineseTTS) list.add(engTTS) diff --git a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml index a32dea82da..ef1063f4fc 100644 --- a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml +++ b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml @@ -28,7 +28,7 @@ android:layout_height="@dimen/dp_269" android:layout_marginStart="@dimen/dp_10" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintEnd_toEndOf="@+id/viewLimitingVelocity" + app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity" + app:layout_goneMarginEnd="40dp" + app:layout_goneMarginTop="@dimen/dp_236" /> + + + + + @@ -200,8 +220,16 @@ android:layout_marginLeft="@dimen/dp_10" android:layout_marginTop="-24dp" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintTop_toBottomOf="@id/module_mogo_och_autopilot_status" - /> + app:layout_constraintTop_toBottomOf="@id/module_mogo_och_autopilot_status" /> + + + + - - - + app:layout_constraintLeft_toRightOf="@id/module_mogo_och_arrived_tv" /> - - + + + + + android:layout_height="match_parent" /> + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/model/OrderModel.kt b/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/model/OrderModel.kt index 99200a7896..16bca227b5 100644 --- a/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/model/OrderModel.kt +++ b/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/model/OrderModel.kt @@ -8,7 +8,6 @@ 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.call.autopilot.CallerAutoPilotStatusListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -29,8 +28,10 @@ import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.distance.IDistanceListener import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager @@ -79,7 +80,7 @@ object OrderModel { //自动驾驶状态监听 OchAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) // 定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 3, mMapLocationListener) + OchLocationManager.addGCJ02Listener(TAG, 3, mMapLocationListener) // 距离终点站距离监听 TrajectoryAndDistanceManager.addDistanceListener(TAG, trajectoryListener) AbnormalFactorsLoopManager.startLoopAbnormalFactors(mContext!!) @@ -93,7 +94,7 @@ object OrderModel { //自动驾驶状态监听 OchAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener) // 注销定位监听 - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) // 距离终点站距离监听 TrajectoryAndDistanceManager.removeListener(TAG) @@ -261,6 +262,7 @@ object OrderModel { ) return } + OchChainLogManager.writeChainLog("订单信息流转","$data"); if (routesResult != null && routesResult!!.writeVersion < data.result.writeVersion diff --git a/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.kt b/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.kt index 4b34f2936e..f7f2644a68 100644 --- a/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.kt +++ b/OCH/bus/passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.kt @@ -41,14 +41,14 @@ object BusPassengerServiceManager { SharedPrefsMgr.getInstance().token, LoginLanPassengerSocket.driverSn ).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate")) + .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate",false)) }else{ mBusPassengerServiceApi.queryDriverSiteByCoordinate( MoGoAiCloudClientConfig.getInstance().serviceAppId, SharedPrefsMgr.getInstance().token, BusPassengerQueryLineRequest(LoginLanPassengerSocket.driverSn) ).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate")) + .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverSiteByCoordinate",false)) } } diff --git a/OCH/bus/passenger/src/main/java/m2/com/mogo/och/bus/passenger/passenger/ui/PM2HPMapFragment.kt b/OCH/bus/passenger/src/main/java/m2/com/mogo/och/bus/passenger/passenger/ui/PM2HPMapFragment.kt index 5138cd0cee..a3c9cc0390 100644 --- a/OCH/bus/passenger/src/main/java/m2/com/mogo/och/bus/passenger/passenger/ui/PM2HPMapFragment.kt +++ b/OCH/bus/passenger/src/main/java/m2/com/mogo/och/bus/passenger/passenger/ui/PM2HPMapFragment.kt @@ -110,9 +110,9 @@ class PM2HPMapFragment : it?.let{ builder.rotate(it.angle.toFloat()) } + val overlayManager = getOverlayManager() + overlayManager?.showOrUpdatePoint(builder.build()) } - val overlayManager = getOverlayManager() - overlayManager?.showOrUpdatePoint(builder.build()) } OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable) } diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index 0c15df4cd3..0323fc8f35 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -29,7 +29,6 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Liste import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener 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.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -46,8 +45,11 @@ import com.mogo.och.common.module.manager.CharterSendTripInfoManager.END_TRIP import com.mogo.och.common.module.manager.CharterSendTripInfoManager.START_TRIP import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager +import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.manager.device.LightAirconditionDoorManager import com.mogo.och.common.module.manager.device.LightAirconditionDoorStatusManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager.startLoopAbnormalFactors import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager.stopLoopAbnormalFactors import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager @@ -75,8 +77,6 @@ import com.mogo.och.data.bean.* */ class DriverM1Model { - var mLongitude = 0.0 - var mLatitude = 0.0 private var mContext: Context? = null private var isArrivedStation: Boolean = false @@ -117,7 +117,7 @@ class DriverM1Model { fun init(context: Context) { mContext = context // 定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 5, mMapLocationListener) + OchLocationManager.addGCJ02Listener(TAG, 5, mMapLocationListener) //开启自驾后 异常信息返回 OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener) @@ -173,7 +173,7 @@ class DriverM1Model { fun release() { // 注销定位监听 - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null) releaseSocketMessageListener( @@ -362,8 +362,6 @@ class DriverM1Model { object : IMoGoChassisLocationGCJ02Listener { override fun onChassisLocationGCJ02(gnssInfo: MogoLocation?) { if (null == gnssInfo) return - mLongitude = gnssInfo.longitude - mLatitude = gnssInfo.latitude //是否到站的围栏判断 自动驾驶还未触发到站 if (!isArrivedStation) { @@ -502,14 +500,10 @@ class DriverM1Model { if (!CallerAutoPilotControlManager.isCanStartAutopilot(true)) { return } - // ssm 给出数据 - if (!OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { - ToastUtils.showLong( - OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + - ", 请稍候重试" - ) - triggerUnableStartAPReasonEvent() - return + //4、ssm 给出数据 + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { + triggerUnableStartAPReasonEvent(); + return; } triggerStartServiceEvent(false, false) @@ -546,7 +540,7 @@ class DriverM1Model { // 登出 fun logout() { - LoginStatusManager.loginOut(mLatitude, mLongitude) + LoginStatusManager.loginOut() } fun triggerStartServiceEvent(isRestart: Boolean, send: Boolean) { @@ -609,9 +603,10 @@ class DriverM1Model { parameters.routeName = mCurrentOrder?.lineName!! parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOrder?.startSiteName) parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOrder?.siteName) + val gcJ02Location = OchLocationManager.getGCJ02Location() parameters.startLatLon = AutopilotControlParameters.AutoPilotLonLat( - mLatitude, - mLongitude + gcJ02Location.latitude, + gcJ02Location.longitude ) parameters.endLatLon = AutopilotControlParameters.AutoPilotLonLat(mCurrentOrder?.wgs84Lat!!, mCurrentOrder?.wgs84Lon!!) @@ -697,6 +692,7 @@ class DriverM1Model { if (TextUtils.isEmpty(data.data.orderNo)){//还未换车,显示还车状态 mOrderCallback?.updateReturnCarStatus(false) mCurrentOrder = null + LineManager.setLineId(-1) currentChangeDestMsg = null sendCharterEndTripInfo() startOrStopCheckCountDown(false) @@ -710,6 +706,7 @@ class DriverM1Model { mOrderCallback?.updateReturnCarStatus(true) clearAutopilotControlParameters() mCurrentOrder = null + LineManager.setLineId(-1) currentChangeDestMsg = null isArrivedStation = false startOrStopCheckCountDown(false) @@ -736,6 +733,7 @@ class DriverM1Model { d(SceneConstant.M_CHARTER_D + TAG, "data.data is null") isArrivedStation = false mCurrentOrder = null + LineManager.setLineId(-1) queryCurrentServiceStatus() return } @@ -746,9 +744,19 @@ class DriverM1Model { d(SceneConstant.M_CHARTER_D + TAG, "queryCurrentOrder order =" + GsonUtils.toJson(data.data)) + OchChainLogManager.writeChainLog("订单信息流转","$data"); + mCurrentOrder = data.data + mCurrentOrder?.lineId.let { + if (it == null || it < 0) { + LineManager.setLineId(-1) + } else { + LineManager.setLineId(it) + } + } + updateToClientData() mOrderCallback?.updateOrderUI(data.data) diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt index 46c8ca5959..8d7aa4630d 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/net/DriverM1ServiceManager.kt @@ -59,7 +59,7 @@ object DriverM1ServiceManager { SharedPrefsMgr.getInstance().token, SharedPrefsMgr.getInstance().sn )?.transformTry() - ?.subscribe(OchCommonSubscribeImpl(context!!, callback, "queryCurrentOrder")) + ?.subscribe(OchCommonSubscribeImpl(context!!, callback, "queryCurrentOrder",false)) } fun checkOrderCountDown(context: Context?, diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusViewModel.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusViewModel.kt index b1599270e4..6257bd4812 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusViewModel.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/view/carstatus/CarStatusViewModel.kt @@ -5,8 +5,8 @@ import com.magic.mogo.och.charter.model.DriverM1Model 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.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import kotlin.math.abs class CarStatusViewModel: ViewModel(), IMoGoAutopilotStatusListener, @@ -24,12 +24,12 @@ class CarStatusViewModel: ViewModel(), IMoGoAutopilotStatusListener, override fun onCleared() { super.onCleared() this.viewCallback = null - CallerChassisLocationGCJ02ListenerManager.removeListener(DriverM1Model.TAG) + OchLocationManager.removeGCJ02Listener(DriverM1Model.TAG) } fun setAutopilotStatusCallback(viewCallback:ICarStatusCallback){ this.viewCallback = viewCallback - CallerChassisLocationGCJ02ListenerManager.addListener(DriverM1Model.TAG, 3, this) + OchLocationManager.addGCJ02Listener(DriverM1Model.TAG, 3, this) } interface ICarStatusCallback{ diff --git a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml index daa6f3b6e1..dd34a3e11b 100644 --- a/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml +++ b/OCH/charter/driver/src/main/res/layout/charter_base_fragment.xml @@ -114,6 +114,16 @@ android:visibility="invisible" app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity"/> + + + + - - - + + @@ -349,7 +364,7 @@ + OchLocationManager.getGCJ02Location().let { currentInfo -> // 两点之间的距离 val calculateLineDistance = CoordinateUtils.calculateLineDistance( currentInfo.longitude, @@ -644,7 +645,7 @@ object CharterPassengerModel { */ private fun calculateDistance() { //mLocation gcj坐标 - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { + OchLocationManager.getGCJ02Location().let { orderInfo?.let { order -> d(M_BUS_P + "calculateDistance", "订单信息:$order") if (order.siteId == null || order.siteId == 0L || @@ -734,7 +735,7 @@ object CharterPassengerModel { private fun setOrderStatus(orderStatus: OrderStatusEnum) { if (this.orderStatus != orderStatus) { d(M_BUS_P + TAG, "${this.orderInfo?.orderNo}新的状态:$orderStatus") - OchChainLogManager.writeChainLog(this.orderInfo.toString(),"新的状态:$orderStatus") + OchChainLogManager.writeChainLog(this.orderStatus.name,"新的状态:${this.orderInfo}") this.orderStatus = orderStatus BeautifyManager.notifyViewChange(BeautifyManager.ChangeTypeEnum.ORDER_STATU_CHANGE) for (callback in orderStatusChangeListeners.values) { @@ -758,7 +759,7 @@ object CharterPassengerModel { val distanceMap: MutableMap = TreeMap() // 计算所有点的距离 data.forEachIndexed { index, siteInfo -> - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { currentInfo -> + OchLocationManager.getGCJ02Location().let { currentInfo -> // 两点之间的距离 val calculateLineDistance = CoordinateUtils.calculateLineDistance( currentInfo.longitude, @@ -806,7 +807,7 @@ object CharterPassengerModel { if (middle == 0) { return Pair(1, false) } - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { + OchLocationManager.getGCJ02Location().let { // 仅计算 距离最近的站点middle 附近5个坐标的夹角 // middle middle-1 @@ -1146,13 +1147,9 @@ object CharterPassengerModel { if (!CallerAutoPilotControlManager.isCanStartAutopilot(true)) { return } - // 4、ssm 给出数据 - if (!OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { - ToastCharterUtils.showToastLong( - OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + - ", 请稍候重试" - ) - return + //4、ssm 给出数据 + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { + return; } val parameters = initAutopilotControlParameters() if (null == parameters) { @@ -1184,7 +1181,7 @@ object CharterPassengerModel { } val parameters = AutopilotControlParameters() orderInfo?.let { orderInfo -> - CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().let { startPoint -> + OchLocationManager.getWgs02Location().let { startPoint -> val startWgsLon: Double = startPoint.longitude val startWgsLat: Double = startPoint.latitude val endWgsLon: Double = orderInfo.wgs84Lon!! diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/net/BusPassengerServiceManager.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/net/BusPassengerServiceManager.kt index c5bb0bef1a..2e1035b131 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/net/BusPassengerServiceManager.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/net/BusPassengerServiceManager.kt @@ -64,7 +64,7 @@ object BusPassengerServiceManager { return } mBusPassengerServiceApi.queryOrderInfo().transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "order")) + .subscribe(OchCommonSubscribeImpl(context, callback, "order",false)) } @JvmStatic @@ -93,7 +93,7 @@ object BusPassengerServiceManager { return } mBusPassengerServiceApi.queryBusinessStatus().transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "businessStatus")) + .subscribe(OchCommonSubscribeImpl(context, callback, "businessStatus",false)) } @@ -138,7 +138,7 @@ object BusPassengerServiceManager { return } mBusPassengerServiceApi.queryBusinessTime().transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "queryBusinessTime")) + .subscribe(OchCommonSubscribeImpl(context, callback, "queryBusinessTime",false)) } @JvmStatic diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/itinerary/ItineraryViewModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/itinerary/ItineraryViewModel.kt index 3f74a4c6cb..574f1f704b 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/itinerary/ItineraryViewModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/itinerary/ItineraryViewModel.kt @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModel import com.mogo.commons.AbsMogoApplication 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.util.UiThreadHandler import com.mogo.och.charter.passenger.R import com.mogo.och.charter.passenger.callback.IDistanceCallback import com.mogo.och.charter.passenger.model.CharterPassengerModel import com.mogo.och.charter.passenger.model.IOrderStatusChangeListener import com.mogo.och.charter.passenger.model.OrderStatusEnum +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.NumberFormatUtil import kotlin.math.abs @@ -24,7 +24,7 @@ class ItineraryViewModel : ViewModel(), IMoGoChassisLocationGCJ02Listener, IDist private var viewCallback: ItineraryViewCallback? = null init { - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 3, this) + OchLocationManager.addGCJ02Listener(TAG, 3, this) CharterPassengerModel.setStationDistanceListener(TAG, this) CharterPassengerModel.setStatusChangeListener(TAG, this) } @@ -32,7 +32,7 @@ class ItineraryViewModel : ViewModel(), IMoGoChassisLocationGCJ02Listener, IDist override fun onCleared() { super.onCleared() this.viewCallback = null - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) CharterPassengerModel.setStationDistanceListener(TAG, null) CharterPassengerModel.setStatusChangeListener(TAG, null) } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineViewModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineViewModel.kt index 329a55d96a..67bce3e451 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineViewModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineViewModel.kt @@ -6,7 +6,6 @@ import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener 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.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -26,6 +25,7 @@ import com.mogo.och.common.module.manager.socket.lan.bean.ChangeDestMsg import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.LineSite import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.manager.stopside.StopSideManager import com.mogo.och.common.module.manager.loop.BizLoopManager @@ -366,8 +366,7 @@ class SelectLineViewModel : ViewModel(), IOrderStatusChangeListener { } fun canSwitchLine(): Boolean { - val gnssSpeed = - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().gnssSpeed + val gnssSpeed = OchLocationManager.getGCJ02Location().gnssSpeed if (gnssSpeed < 0.5) { when (CallerAutoPilotStatusListenerManager.getState()) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt index 1d32c87c93..e9109401a5 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt @@ -21,7 +21,7 @@ object CharterVoiceManager { ) val engTTS = LangTtsEntity( contenxt.getString(R.string.charter_arrived_station_en, it), - LanguageType.CHINESE + LanguageType.ENGLISH ) val koreanTTS = LangTtsEntity( contenxt.getString(R.string.charter_arrived_station_ko, siteNameKR?:it), @@ -45,7 +45,7 @@ object CharterVoiceManager { ) val engTTS = LangTtsEntity( contenxt.getString(R.string.charter_leave_station_en, it), - LanguageType.CHINESE + LanguageType.ENGLISH ) list.add(chineseTTS) list.add(engTTS) diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt index 41db86def2..fadcaedac6 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/LoginProvider.kt @@ -20,6 +20,7 @@ import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.login.RoleEnum import com.mogo.och.common.module.biz.login.LoginStatusEnum import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType import com.mogo.och.common.module.manager.socket.lan.bean.EnvType import com.mogo.och.common.module.manager.socket.lan.bean.ProjectType @@ -97,9 +98,9 @@ class LoginProvider : LoginService { LoginModel.queryCarStatus() } - override fun loginOut(mLatitude: Double, mLongitude: Double) { - CallerLogger.d(tag, "loginOut mLatitude:${mLatitude}--mLongitude:${mLongitude}") - LoginModel.logout(mLatitude, mLongitude) + override fun loginOut() { + CallerLogger.d(tag, "loginOut ") + LoginModel.logout() } override fun checkBusiness(businessType: Int): Boolean { @@ -145,7 +146,9 @@ class LoginProvider : LoginService { override fun setLoginInfo(loginInfo: LoginInfo) { CallerLogger.d(tag, "setLoginInfo:${loginInfo}") - this.loginInfo = loginInfo + if(this.loginInfo!=loginInfo){ + this.loginInfo = loginInfo + } } override fun getLoginInfo(): LoginInfo? { @@ -172,6 +175,7 @@ class LoginProvider : LoginService { override fun setLoginStatus(loginStatus: LoginStatusEnum) { CallerLogger.d(tag, "setLoginStatus:${loginStatus}----old${this.loginStatus}") if (loginStatus != this.loginStatus) { + OchChainLogManager.writeChainLog("登录状态变化","${this.loginStatus}-->${loginStatus}"); this.loginStatus = loginStatus LoginStatusManager.invokeLoginStatusChange(loginStatus) } @@ -194,6 +198,7 @@ class LoginProvider : LoginService { override fun setOpenOrderStatusType(type: Int) { CallerLogger.d(tag, "setOpenOrderStatusType:${type}") if (openOrderStatusEnum.code != type) { + OchChainLogManager.writeChainLog("接单状态变化","${this.openOrderStatusEnum}-->${OpenOrderStatusEnum.valueOf(type)}"); this.openOrderStatusEnum = OpenOrderStatusEnum.valueOf(type) LoginStatusManager.invokeLOpenOrderStatusChange(this.openOrderStatusEnum) } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/TaxiLogoutReqBean.java b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/TaxiLogoutReqBean.java index e152ea2ce9..54b084208e 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/TaxiLogoutReqBean.java +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/bean/TaxiLogoutReqBean.java @@ -1,5 +1,8 @@ package com.mogo.och.biz.login.bean; +import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager; + /** * Created by yyk on 2021/8/19 * 登出请求参数 @@ -17,9 +20,10 @@ public class TaxiLogoutReqBean { public double lat; public double lon; - public Location4Login(double lat, double lon) { - this.lat = lat; - this.lon = lon; + public Location4Login() { + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + this.lat = gcj02Location.getLatitude(); + this.lon = gcj02Location.getLongitude(); } } } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt index 91f646502d..f97a8f88c0 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/model/LoginModel.kt @@ -8,8 +8,6 @@ import com.mogo.commons.module.intent.IMogoIntentListener import com.mogo.commons.module.intent.IntentManager import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.BaseData -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02 import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant @@ -27,7 +25,7 @@ import com.mogo.och.common.module.biz.login.BusinessEnum import com.mogo.och.common.module.biz.login.LoginStatusEnum import com.mogo.och.common.module.biz.login.LoginStatusEnum.Companion.valueOf import com.mogo.och.common.module.biz.login.LoginStatusManager -import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.socket.lan.bean.BusCacheKey import com.mogo.och.common.module.manager.socket.lan.bean.LoginCacheStatus import com.mogo.och.common.module.network.OchCommonServiceCallback @@ -125,7 +123,7 @@ object LoginModel { fun gotoLogin(phone: String, code: String) { mContext?.let { - val location = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val location = OchLocationManager.getGCJ02Location() val location4Login = TaxiLoginReqBean.Location4Login(location.latitude, location.longitude) OchCommonServiceManager.gotoLoginBycode(it, phone, code, location4Login, object : OchCommonServiceCallback { @@ -179,9 +177,7 @@ object LoginModel { if (valueOf(data.data.driverStatus) == LoginStatusEnum.Login) { // 业务不支持 去退出登录 if (!LoginStatusManager.checkBusiness(data.data.businessType)) { - val mLatitude = getChassisLocationGCJ02().latitude - val mLongitude = getChassisLocationGCJ02().longitude - LoginStatusManager.loginOut(mLatitude, mLongitude) + LoginStatusManager.loginOut() return } } @@ -220,8 +216,8 @@ object LoginModel { } // 登出 - fun logout(mLatitude: Double, mLongitude: Double) { - val location4Login = TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude) + fun logout() { + val location4Login = TaxiLogoutReqBean.Location4Login() OchCommonServiceManager.logout( mContext!!, location4Login, object : OchCommonServiceCallback { diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt index 3d7ecef812..4670b0d98e 100644 --- a/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/login/net/OchCommonServiceManager.kt @@ -152,14 +152,14 @@ object OchCommonServiceManager { SharedPrefsMgr.getInstance().token, sn ).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "loginStatus")) + .subscribe(OchCommonSubscribeImpl(context, callback, "loginStatus",false)) }else{ ochLoginServiceSaasEh.queryDriverServiceStatusAndLoginStatus( MoGoAiCloudClientConfig.getInstance().serviceAppId, SharedPrefsMgr.getInstance().token, sn ).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "loginStatus")) + .subscribe(OchCommonSubscribeImpl(context, callback, "loginStatus",false)) } } diff --git a/OCH/common/common/build.gradle b/OCH/common/common/build.gradle index 1279256a45..8dae7850b8 100644 --- a/OCH/common/common/build.gradle +++ b/OCH/common/common/build.gradle @@ -69,6 +69,7 @@ dependencies { implementation rootProject.ext.dependencies.litezxing + api rootProject.ext.dependencies.flexbox api project(":OCH:common:data") if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { diff --git a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt index 73fdd2c46e..4927f3b3ee 100644 --- a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt +++ b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt @@ -11,6 +11,9 @@ import com.google.gson.reflect.TypeToken import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.angle.scenes.CrossRoad +import com.mogo.eagle.core.function.angle.scenes.Default +import com.mogo.eagle.core.function.angle.scenes.LongSight import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.V2N import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager @@ -23,6 +26,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListener import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapRomaListener +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager 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.ActivityUtils @@ -57,6 +61,7 @@ object DebugDataDispatch { const val stopSite = "stopSite" const val v2N = "xiaozhiV2N" const val romal = "romal" + const val visualView = "visual" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "location" --es path "1111/11111" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "globalPath" --es path "sy73.json" @@ -69,6 +74,7 @@ object DebugDataDispatch { // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "stopSite" --ei state 6 --ei action 1 // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "xiaozhiV2N" --es poiType "10002" --ei state 0 // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "romal" --ei show 0 +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "visual" --ei show 0 val ROOT_PATH = @@ -170,6 +176,22 @@ object DebugDataDispatch { pncAction.parkScenarioAction = planningaction.build() CallerPlanningActionsListenerManager.invokePNCActions(pncAction.build()) } + visualView ->{ + val state = intent.getIntExtra("show", 0) + when (state) { + 0 -> { + CallerVisualAngleManager.changeScene(LongSight()) + } + 1 -> { + CallerVisualAngleManager.changeScene(Default()) + } + 2 -> { + CallerVisualAngleManager.changeScene(CrossRoad()) + } + else -> {} + } + + } romal ->{ val state = intent.getIntExtra("show", 0) CallerMapRomaListener.invokeMapRomaRange(state==0) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginInfo.java b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginInfo.java index 2fa411d9dd..735913ec26 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginInfo.java +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginInfo.java @@ -1,5 +1,7 @@ package com.mogo.och.common.module.biz.login; +import java.util.Objects; + public class LoginInfo { private int driverStatus; //1登录,0登出 private int servingStatus;//1接单中,0暂停接单 @@ -157,4 +159,54 @@ public class LoginInfo { ", photos='" + photos + '\'' + '}'; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + LoginInfo loginInfo = (LoginInfo) o; + + if (driverStatus != loginInfo.driverStatus) return false; + if (servingStatus != loginInfo.servingStatus) return false; + if (businessType != loginInfo.businessType) return false; + if (purpose != loginInfo.purpose) return false; + if (!Objects.equals(orderNo, loginInfo.orderNo)) + return false; + if (!Objects.equals(sn, loginInfo.sn)) return false; + if (!Objects.equals(plateNumber, loginInfo.plateNumber)) + return false; + if (!Objects.equals(phone, loginInfo.phone)) return false; + if (!Objects.equals(lineId, loginInfo.lineId)) + return false; + if (!Objects.equals(taskId, loginInfo.taskId)) + return false; + if (!Objects.equals(vin, loginInfo.vin)) return false; + if (!Objects.equals(cityCode, loginInfo.cityCode)) + return false; + if (!Objects.equals(brand, loginInfo.brand)) return false; + if (!Objects.equals(carModel, loginInfo.carModel)) + return false; + return Objects.equals(photos, loginInfo.photos); + } + + @Override + public int hashCode() { + int result = driverStatus; + result = 31 * result + servingStatus; + result = 31 * result + businessType; + result = 31 * result + (orderNo != null ? orderNo.hashCode() : 0); + result = 31 * result + purpose; + result = 31 * result + (sn != null ? sn.hashCode() : 0); + result = 31 * result + (plateNumber != null ? plateNumber.hashCode() : 0); + result = 31 * result + (phone != null ? phone.hashCode() : 0); + result = 31 * result + (lineId != null ? lineId.hashCode() : 0); + result = 31 * result + (taskId != null ? taskId.hashCode() : 0); + result = 31 * result + (vin != null ? vin.hashCode() : 0); + result = 31 * result + (cityCode != null ? cityCode.hashCode() : 0); + result = 31 * result + (brand != null ? brand.hashCode() : 0); + result = 31 * result + (carModel != null ? carModel.hashCode() : 0); + result = 31 * result + (photos != null ? photos.hashCode() : 0); + return result; + } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginService.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginService.kt index d7e53c0832..5fde505b65 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginService.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginService.kt @@ -25,7 +25,7 @@ interface LoginService :CommonService { /** * 登出 */ - fun loginOut(mLatitude:Double,mLongitude:Double) + fun loginOut() fun checkBusiness(businessType: Int): Boolean fun checkAllEnv( projectType: ProjectType, diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginStatusManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginStatusManager.kt index 4acc1d99f0..8a6efe6128 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginStatusManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/login/LoginStatusManager.kt @@ -36,8 +36,8 @@ object LoginStatusManager : CallerBase() { } @JvmStatic - fun loginOut(mLatitude: Double, mLongitude: Double) { - loginService?.loginOut(mLatitude, mLongitude) + fun loginOut() { + loginService?.loginOut() } @JvmStatic diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/OrderListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/OrderListener.kt similarity index 65% rename from OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/OrderListener.kt rename to OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/OrderListener.kt index 6ecf8a741b..be6e91fc07 100644 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/OrderListener.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/OrderListener.kt @@ -1,4 +1,6 @@ -package com.mogo.och.taxi.passenger.ui.model.order +package com.mogo.och.common.module.biz.order + +import com.mogo.och.data.taxi.BaseOrderBean interface OrderListener { // 当前进行单状态变更:新到进行中订单、进行中单状态变更 diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/OrderModel.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/OrderModel.kt new file mode 100644 index 0000000000..5a88421ccd --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/OrderModel.kt @@ -0,0 +1,56 @@ +package com.mogo.och.common.module.biz.order + +import com.mogo.och.data.taxi.BaseOrderBean +import java.util.concurrent.ConcurrentHashMap + +object OrderModel { + private val mOrderStatusCallbackMap: MutableMap = ConcurrentHashMap() + + var orderBean: BaseOrderBean?=null + var preOrderBean: BaseOrderBean?=null + + init { + + } + + fun setOrderStatusCallback(tag: String?, callback: OrderListener?) { + if (tag == null || "" == tag) return + if (callback == null) { + mOrderStatusCallbackMap.remove(tag) + return + } + mOrderStatusCallbackMap[tag] = callback + } + + fun invokeListener(newOrderBean: T?){ + preOrderBean?.let { + if(newOrderBean!=null){ + if(it.orderNo==newOrderBean.orderNo){ + return + } + } + } + if(this.orderBean==null){ + this.orderBean = newOrderBean + }else { + if(newOrderBean==null){ + this.preOrderBean = this.orderBean + this.orderBean = null + }else{ + if(this.orderBean!!.orderNo == newOrderBean.orderNo){ + if(this.orderBean!!.orderStatus >= newOrderBean.orderStatus){ + return + }else{ + this.orderBean = newOrderBean + } + }else{ + this.orderBean = newOrderBean + } + } + } + + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderStatusChanged(newOrderBean) + } + } +} \ No newline at end of file diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/constant/TaxiOrderStatusEnum.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/TaxiOrderStatusEnum.kt similarity index 96% rename from OCH/taxi/driver/src/main/java/com/mogo/och/taxi/constant/TaxiOrderStatusEnum.kt rename to OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/TaxiOrderStatusEnum.kt index ca487e1b5e..3cc82e47de 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/constant/TaxiOrderStatusEnum.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/order/TaxiOrderStatusEnum.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.constant +package com.mogo.och.common.module.biz.order /** * Created on 2021/12/7 diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java index cb43850345..0335b46428 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java @@ -59,9 +59,18 @@ public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMo return isAutopilotAbility; } + public String getAbilityVersion() { + return launchConditionData == null ? "" : launchConditionData.abilityVersion; + } + public String getOriginalData() { return launchConditionData == null ? "" : launchConditionData.getJson(); } + + public ArrayList getUnableAutopilotReasons() { + return unableAutopilotReasons; + } + public String getAutopilotUnAbilityReason(){ try { if(unableAutopilotReasons==null||unableAutopilotReasons.isEmpty()){ diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt index b7769f9dd3..e71a17dbea 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt @@ -1,9 +1,18 @@ package com.mogo.och.common.module.manager.autopilot.autopilot import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.msgbox.AutopilotMsg +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.function.api.autopilot.IMoGoReceiveReceivedAckListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerReceiveReceivedAckListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager +import com.mogo.och.common.module.manager.autopilot.line.LineManager +import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager import com.zhjt.mogo.adas.common.MessageType import com.zhjt.mogo.adas.data.bean.ReceivedAck import com.zhjt.mogo.adas.data.bean.ReceivedAck.Status @@ -15,6 +24,42 @@ object OchAutoPilotManager : IMoGoReceiveReceivedAckListener { CallerReceiveReceivedAckListenerManager.addListener(TAG,this) } + @JvmStatic + fun canStartAutoPilot(lineId: Number?): String { + return TrajectoryAndDistanceManager.canStartAutopilot(lineId).apply { + if (!isNullOrBlank()) { + // 去启动绘制高精地图上的轨迹 + val drawGlobalTrajectory = LineManager.drawGlobalTrajectory() + if (!drawGlobalTrajectory.first) { + ToastUtils.showLong(drawGlobalTrajectory.second) + } + } + } + } + + @JvmStatic + fun canStartAutoPilotSSM(): Boolean { + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { + val reasons = OCHAdasAbilityManager.getInstance().unableAutopilotReasons + if ("AutopilotAbility440" == OCHAdasAbilityManager.getInstance().abilityVersion && !reasons.isNullOrEmpty()) { + val msg = reasons[0].unableLaunchReason + " 来源:" + reasons[0].source + CallerMsgBoxManager.saveMsgBox( + MsgBoxBean( + MsgBoxType.AUTOPILOT, + AutopilotMsg(0, "自动驾驶启动失败", msg, System.currentTimeMillis()) + ) + ) + } else { + ToastUtils.showLong( + OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + + ", 请稍候重试" + ); + } + return false + } + return true + } + @JvmStatic fun startAutoPilot(controlParameters: AutopilotControlParameters?) { OchAutopilotAnalytics.triggerStartAutopilotParameters(controlParameters) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/ILineCallback.java b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/ILineCallback.java new file mode 100644 index 0000000000..2bdb1e5b9a --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/ILineCallback.java @@ -0,0 +1,9 @@ +package com.mogo.och.common.module.manager.autopilot.line; + + +public interface ILineCallback { + default void clearLineSuccess(){} + default void drawLineSuccess(){} + + default void drawLineFail(){} +} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt new file mode 100644 index 0000000000..21fd6df0d2 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt @@ -0,0 +1,75 @@ +package com.mogo.och.common.module.manager.autopilot.line + +import com.mogo.eagle.core.function.call.map.CallerMapGlobalTrajectoryDrawManager +import com.mogo.och.common.module.utils.CallerBase + +/** + * 订单中 + */ +object LineManager : CallerBase() { + private var lineId: Int = -1 + @JvmStatic + fun setLineId(value: Int) { + lineId = if (value < 0) { + clearGlobalTrajectory(true) + -1 + } else { + value + } + } + @JvmStatic + fun setLineId(value: Long) { + lineId = if (value < 0) { + clearGlobalTrajectory(true) + -1 + } else { + value.toInt() + } + } + + @JvmStatic + fun getLineId():Int{ + return lineId + } + + override fun doSomeAfterAddListener(tag: String, listener: ILineCallback) { + super.doSomeAfterAddListener(tag, listener) + if (hasDrawnGlobalTrajectory()) { + listener.drawLineSuccess() + }else{ + listener.drawLineFail() + } + } + + fun hasDrawnGlobalTrajectory(): Boolean { + return CallerMapGlobalTrajectoryDrawManager.hasDrawnGlobalTrajectory() + } + + fun clearGlobalTrajectory(isClearData: Boolean) { + CallerMapGlobalTrajectoryDrawManager.clearGlobalTrajectory(isClearData) + if (!hasDrawnGlobalTrajectory()){ + M_LISTENERS.forEach { + it.value.clearLineSuccess() + } + } + } + + fun drawGlobalTrajectory(): Pair { + if(lineId<0){ + return Pair(false,"请设置正确线路或订单") + } + return CallerMapGlobalTrajectoryDrawManager.drawGlobalTrajectory().apply { + if(first){ + M_LISTENERS.forEach { + it.value.drawLineSuccess() + } + }else{ + M_LISTENERS.forEach { + it.value.drawLineFail() + } + } + } + } + + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/location/LocationManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/location/LocationManager.kt new file mode 100644 index 0000000000..27fa0eea15 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/location/LocationManager.kt @@ -0,0 +1,47 @@ +package com.mogo.och.common.module.manager.autopilot.location + +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.IMoGoChassisLocationWGS84Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager + +object OchLocationManager { + + @JvmStatic + fun getGCJ02Location(): MogoLocation { + return CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + } + + @JvmStatic + fun getWgs02Location():MogoLocation { + return CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + } + + @JvmStatic + fun addGCJ02Listener(tag:String,callBackHz:Int,listener: IMoGoChassisLocationGCJ02Listener){ + CallerChassisLocationGCJ02ListenerManager.addListener(tag, callBackHz, listener) + } + @JvmStatic + fun removeGCJ02Listener(tag:String){ + CallerChassisLocationGCJ02ListenerManager.removeListener(tag) + } + @JvmStatic + fun removeGCJ02Listener(listener: IMoGoChassisLocationGCJ02Listener){ + CallerChassisLocationGCJ02ListenerManager.removeListener(listener) + } + @JvmStatic + fun addWgs02Listener(tag:String,callBackHz:Int,listener: IMoGoChassisLocationWGS84Listener){ + CallerChassisLocationWGS84ListenerManager.addListener(tag, callBackHz, listener) + } + @JvmStatic + fun removeWgs02Listener(tag:String){ + CallerChassisLocationWGS84ListenerManager.removeListener(tag) + } + @JvmStatic + fun removeWgs02Listener(listener: IMoGoChassisLocationWGS84Listener){ + CallerChassisLocationWGS84ListenerManager.removeListener(listener) + } + + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/trajectory/TrajectoryManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/trajectory/TrajectoryManager.kt index df85819e93..f65a14e55d 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/trajectory/TrajectoryManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/trajectory/TrajectoryManager.kt @@ -8,7 +8,6 @@ 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.och.common.module.manager.logchainanalytic.OchChainLogManager -import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager.writeChainLog import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil import mogo.telematics.pad.MessagePad import java.util.concurrent.ConcurrentHashMap @@ -105,7 +104,7 @@ object TrajectoryManager : IMoGoPlanningRottingListener { fun addDownLoadSuccessLine(lineId:Long){ if(lineId>0){ - writeChainLog("轨迹监控", "onAutopilotGuardian() 轨迹下载成功${lineId}", true, OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY) + OchChainLogManager.writeChainLog("轨迹监控", "onAutopilotGuardian() 轨迹下载成功${lineId}", true, OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY) downLoadSuccessLineIds.add(lineId) } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/LightAirconditionDoorManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/LightAirconditionDoorManager.kt index 784ffddf91..ddfabbd9d6 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/LightAirconditionDoorManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/device/LightAirconditionDoorManager.kt @@ -1,7 +1,7 @@ package com.mogo.och.common.module.manager.device import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.wigets.toast.ToastCharterUtils import io.reactivex.disposables.Disposable @@ -35,7 +35,7 @@ object LightAirconditionDoorManager { } private fun canOpenOrCloseDoor(): String? { - val location = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val location = OchLocationManager.getGCJ02Location() return if(location.gnssSpeed<0.3){ null }else{ diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt index d5b067bbab..1a81404c10 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt @@ -4,7 +4,6 @@ import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener 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.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e @@ -13,6 +12,7 @@ import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.LocationUtils import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutopilotAnalytics +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.autopilot.trajectory.TrajectoryCache import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo @@ -270,7 +270,7 @@ object TrajectoryAndDistanceManager : IMoGoPlanningRottingListener { */ private fun calculateDistance() { //mLocation gcj坐标 - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { + OchLocationManager.getGCJ02Location().let { if (mRoutePoints.isNullOrEmpty() || endStationInfo.stationPoint == null) { d(M_OCHCOMMON + TAG, "没有轨迹或站点坐标停止计算") //结束距离计算 @@ -660,13 +660,13 @@ object TrajectoryAndDistanceManager : IMoGoPlanningRottingListener { * 返回空为可启动自驾 * 返回其他不可启动自驾 返回为原因 */ - fun canStartAutopilot(lineId: Long?): String { + fun canStartAutopilot(lineId: Number?): String { if (lineId == null) { OchAutopilotAnalytics.triggerDistance2LineorStation("未传轨迹ID") return "请确认线路ID" } - OchAutopilotAnalytics.triggerDistance2LineorStation("条件记录:lineId:${lineId}----this.lineId:${this.lineId}") + OchAutopilotAnalytics.triggerDistance2LineorStation("条件记录:lineId:${lineId}----this.lineId:${this.lineId}、mRoutePoints情况:${mRoutePoints?.size}") try { if (mRoutePoints.isNullOrEmpty()) { @@ -677,23 +677,20 @@ object TrajectoryAndDistanceManager : IMoGoPlanningRottingListener { return if (redCatche.isNullOrEmpty()) { distanceWithStartStation() } else { - val currentPoint = - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val currentPoint = OchLocationManager.getGCJ02Location() distanceWithTrajectory(redCatche,currentPoint) } } else { return if (this.lineId == 0L || this.lineId == null) { - val currentPoint = - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val currentPoint = OchLocationManager.getGCJ02Location() distanceWithTrajectory(mRoutePoints!!,currentPoint) } else { - if (lineId != this.lineId) { + if (lineId.toLong() != this.lineId) { // 判断距离起始站的距离 distanceWithStartStation() } else { - val currentPoint = - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val currentPoint = OchLocationManager.getGCJ02Location() distanceWithTrajectory(mRoutePoints!!,currentPoint) } } @@ -712,7 +709,7 @@ object TrajectoryAndDistanceManager : IMoGoPlanningRottingListener { if (startStationInfo.stationPoint == null) { return errorTypeNoneLineId } - val currentPoint = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val currentPoint = OchLocationManager.getGCJ02Location() val distance = CoordinateUtils.calculateLineDistance( currentPoint.longitude, currentPoint.latitude, diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt index 4d6b642322..b6456d7d02 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt @@ -16,22 +16,32 @@ import com.zhjt.service.chain.ChainLog object OchChainLogManager { private val TAG = OchChainLogManager::class.java.simpleName - + // 通用 title changeinfo 日志 const val EVENT_KEY_INFE_WITH_CHANGE = "event_key_och_common_info_and_changeinfo" + // 轨迹信息监控 const val EVENT_KEY_INFE_WITH_TRAJECTORY = "event_key_och_trajectory_info" + // 音乐播放日志 const val EVENT_KEY_INFE_WITH_MUSIC = "event_key_och_music_info" - const val EVENT_KEY_INFE_WITH_BUS = "event_key_och_bus_info" + // 需要举行观察的 const val EVENT_KEY_INFE_ERROR = "event_key_och_error" + // 网络接口 const val EVENT_KEY_INFO_Net = "event_key_och_net" + // 初始化信息 const val EVENT_KEY_INFO_INIT = "event_key_och_init" + // 局域网内socket 通讯 const val EVENT_KEY_INFO_SOCKET = "analytics_event_och_track_screen_msg" + // 局域网内socket 连接状态流转 const val EVENT_KEY_INFO_SOCKET_CONNECT = "analytics_event_och_track_screen_connect" - fun writeChainLogNet(title: String, info: String){ - writeChainLog(title,info,true,EVENT_KEY_INFO_Net) + fun writeChainLogNet(mustUpdate: Boolean, title: String, info: String) { + if(mustUpdate){ + writeChainLog(title, info, true, EVENT_KEY_INFO_Net) + }else { + writeChainLog(title, info, DebugConfig.isDebug(), EVENT_KEY_INFO_Net) + } } fun writeChainLogInit(title: String, info: String) { writeChainLog(title,info,true,EVENT_KEY_INFO_INIT) @@ -39,13 +49,17 @@ object OchChainLogManager { fun writeChainLogNetLanSocketConnect(title: String, info: String){ writeChainLog(title,info,true,EVENT_KEY_INFO_SOCKET_CONNECT) } + @JvmStatic fun writeChainLogLanSocket(title: String, info: String, action:String){ val map = hashMapOf() map["action"] = action writeChainLog(title,info,true,EVENT_KEY_INFO_SOCKET, map) } - + @JvmStatic + fun writeChainLog(title: String, info: String){ + writeChainLog(title,info,true,EVENT_KEY_INFE_WITH_CHANGE) + } @JvmStatic fun writeChainLog(title: String, info: String, upload:Boolean = true, eventID:String=EVENT_KEY_INFE_WITH_CHANGE) { writeChainLog(title,info,upload,eventID,null) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt index 43937e2a18..f9798da81e 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt @@ -18,6 +18,7 @@ import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg import com.mogo.och.common.module.manager.socket.lan.bean.BaseDPMsg import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.voice.VoiceNotice object LanSocketManager : LanSocketManagerJava() { @@ -89,7 +90,7 @@ object LanSocketManager : LanSocketManagerJava() { .build() mAudioManager.requestAudioFocus(mAudioFocusRequest) //抢占焦点 - AIAssist.getInstance(mContext) + VoiceNotice .speakTTSVoiceWithLevel(msg, AIAssist.LEVEL0, object : IMogoVoiceCmdCallBack { override fun onSpeakEnd(speakText: String?) { mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/xiaozhi/ZhiV2NManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/xiaozhi/ZhiV2NManager.kt index ff37f33553..3e693f487e 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/xiaozhi/ZhiV2NManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/xiaozhi/ZhiV2NManager.kt @@ -6,7 +6,9 @@ import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.V2N import com.mogo.eagle.core.function.api.hmi.xiaozhi.listener.OnXiaoZhiStateChangeListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.R +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager object ZhiV2NManager : OnXiaoZhiStateChangeListener { init { @@ -14,6 +16,7 @@ object ZhiV2NManager : OnXiaoZhiStateChangeListener { } override fun onChanged(event: Event, state: State) { + OchChainLogManager.writeChainLog("小智脸部消息","event:${event}-----state${state}") if (event is V2N) { var drawable: Int? = null when (event.type) { @@ -322,12 +325,14 @@ object ZhiV2NManager : OnXiaoZhiStateChangeListener { } } if (drawable != null) { - if(state==State.START){ - ZhiViewmanager.warnAni.drawable = drawable - ZhiViewmanager.showListeningAni(ZhiViewmanager.warnAni,true) - }else if(state==State.STOP){ - ZhiViewmanager.stopWarnAni() - } + UiThreadHandler.post({ + if(state==State.START){ + ZhiViewmanager.warnAni.drawable = drawable + ZhiViewmanager.showListeningAni(ZhiViewmanager.warnAni,true) + }else if(state==State.STOP){ + ZhiViewmanager.stopWarnAni() + } + },UiThreadHandler.MODE.QUEUE) } } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/network/OchCommonSubscribeImpl.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/network/OchCommonSubscribeImpl.kt index f656eb1d1b..37d8e2a0b9 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/network/OchCommonSubscribeImpl.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/network/OchCommonSubscribeImpl.kt @@ -1,5 +1,6 @@ package com.mogo.och.common.module.network +import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.network.RequestOptions import com.mogo.eagle.core.network.SubscribeImpl @@ -23,7 +24,7 @@ class OchCommonSubscribeImpl( init { CallerLogger.e("$flavorTag$TAG", "$apiName: 去请求()") if(writeLog) { - OchChainLogManager.writeChainLogNet("接口:${apiName}_${tag}", "去请求") + OchChainLogManager.writeChainLogNet(false,"接口:${apiName}", "去请求_${tag}") } } @@ -31,7 +32,7 @@ class OchCommonSubscribeImpl( super.onSuccess(o) CallerLogger.d("$flavorTag$TAG", "$apiName: onSuccess() ${o.msg}") if(writeLog) { - OchChainLogManager.writeChainLogNet("接口:${apiName}_${tag}", "请求成功:${o}") + OchChainLogManager.writeChainLogNet(false,"接口:${apiName}", "请求成功:${o}_${tag}") } callback?.onSuccess(o) } @@ -40,7 +41,7 @@ class OchCommonSubscribeImpl( super.onError(e) CallerLogger.e("$flavorTag$TAG", "$apiName: onError() ${e.message}") if(writeLog) { - OchChainLogManager.writeChainLogNet("接口:${apiName}_${tag}", "请求失败:${e.message}") + OchChainLogManager.writeChainLogNet(false,"接口:${apiName}", "请求失败:${e.message}_${tag}") } callback?.onError("$apiName: onError() ${e.message}") callback?.onError() @@ -51,8 +52,9 @@ class OchCommonSubscribeImpl( CallerLogger.e("$flavorTag$TAG", "$apiName: onError() code = $code; message = $message") if(writeLog) { OchChainLogManager.writeChainLogNet( - "接口:${apiName}_${tag}", - "请求失败: onError() code = $code; message = $message\"" + true, + "接口:${apiName}", + "请求失败: onError() code = $code; message = $message\" _${tag}" ) } callback?.onFail(code, message) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.kt index e119eed607..dfca958168 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.kt @@ -578,6 +578,20 @@ object CoordinateCalculateRouteUtil { return 360-bearing } + fun getHeadingAngleTemp(locationLongitude: Double, locationLatitude: Double, + nextPointLongitude: Double, nextPointLatitude: Double): Double { + val lat1Rad = Math.toRadians(locationLatitude) + val lat2Rad = Math.toRadians(nextPointLatitude) + val lon1Rad = Math.toRadians(locationLongitude) + val lon2Rad = Math.toRadians(nextPointLongitude) + + val y = sin(lon2Rad - lon1Rad) * cos(lat2Rad) + val x = cos(lat1Rad) * sin(lat2Rad) - sin(lat1Rad) * cos(lat2Rad) * cos(lon2Rad - lon1Rad) + + val bearing = Math.toDegrees(atan2(y, x)) + return (bearing + 360) % 360 + } + /** diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt index 09021ada3f..3c2325da3b 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt @@ -2,13 +2,19 @@ package com.mogo.och.common.module.voice import com.mogo.commons.AbsMogoApplication import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager import com.mogo.tts.base.IMogoTTSCallback import com.mogo.tts.base.LangTtsEntity +import com.mogo.tts.base.LanguageType import com.mogo.tts.base.MultiLangTtsEntity object VoiceNotice { + + const val onlyChinese = 1 //中文 + const val chineseEnglishKorean = 1 shl 1 // 左移一位 中英韩 + @JvmStatic fun showNotice(notice: String?) { showNotice(notice, AIAssist.LEVEL0) @@ -59,11 +65,27 @@ object VoiceNotice { @JvmStatic fun showNotice(listTTS: MutableList, level: Int,callBack: IMogoTTSCallback?=null) { + if(FunctionBuildConfig.ttsLanguage and onlyChinese>0){ + val tempList = mutableListOf() + listTTS.forEach { + if(it.language != LanguageType.CHINESE){ + tempList.add(it) + } + } + listTTS.removeAll(tempList) + } AIAssist.getInstance(AbsMogoApplication.getApp()) .speakMultiLangTTSWithLevel(MultiLangTtsEntity(listTTS), level,callCallBack(callBack)) } + fun speakTTSVoiceWithLevel(text:String, level:Int, callBack:IMogoTTSCallback){ + AIAssist.getInstance(AbsMogoApplication.getApp()).speakTTSVoiceWithLevel(text,level,callBack) + } + + + + private fun callCallBack(callBack: IMogoTTSCallback?):IMogoTTSCallback{ return object :IMogoTTSCallback{ override fun onSpeakStart(speakText: String?) { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt similarity index 56% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualView.kt rename to OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt index f0fca59d4f..d7f9262861 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt @@ -1,19 +1,21 @@ -package com.mogo.och.common.module.wigets.map.switchvisual +package com.mogo.och.common.module.wigets.map.drawline + import android.content.Context import android.util.AttributeSet -import android.view.View import androidx.appcompat.widget.AppCompatImageView import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.R +import com.mogo.och.common.module.manager.autopilot.line.LineManager + /** * */ -class VisualView : AppCompatImageView, VisualViewModel.IVisualCallback { +class LineView : AppCompatImageView, LineViewModel.ILineViewCallback { - private val TAG = "VisualView" + private val TAG = "LineView" constructor(context: Context) : super(context) @@ -26,21 +28,28 @@ class VisualView : AppCompatImageView, VisualViewModel.IVisualCallback { ) private fun initView() { - setImageResource(R.drawable.common_visual_medium) + setImageResource(R.drawable.common_map_line_close) } override fun onAttachedToWindow() { super.onAttachedToWindow() - val viewModel = findViewTreeViewModelStoreOwner()?.let { - ViewModelProvider(it).get(VisualViewModel::class.java) + onClick { + if (LineManager.hasDrawnGlobalTrajectory()) { + LineManager.clearGlobalTrajectory(false) + } else { + val drawGlobalTrajectory = LineManager.drawGlobalTrajectory() + if (!drawGlobalTrajectory.first) { + ToastUtils.showLong(drawGlobalTrajectory.second) + } + } } + val viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(LineViewModel::class.java) + } viewModel?.setDistanceCallback(this) - onClick { - viewModel?.changeVisualView() - } } @@ -52,20 +61,8 @@ class VisualView : AppCompatImageView, VisualViewModel.IVisualCallback { } } - override fun setViewShow(boolean: Boolean) { - UiThreadHandler.post({ - if (boolean) { - visibility = View.VISIBLE - } else { - visibility = View.GONE - } - }, UiThreadHandler.MODE.QUEUE) - } - - override fun setViewResource(resource: Int) { - UiThreadHandler.post({ - setImageResource(resource) - }, UiThreadHandler.MODE.QUEUE) + override fun setImageViewResource(name: Int) { + setImageResource(name) } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineViewModel.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineViewModel.kt new file mode 100644 index 0000000000..d16d17d0ae --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineViewModel.kt @@ -0,0 +1,46 @@ +package com.mogo.och.common.module.wigets.map.drawline + +import androidx.annotation.DrawableRes +import androidx.lifecycle.ViewModel +import com.mogo.och.common.module.R +import com.mogo.och.common.module.manager.autopilot.line.ILineCallback +import com.mogo.och.common.module.manager.autopilot.line.LineManager + +class LineViewModel : ViewModel(), ILineCallback { + + private val TAG = LineViewModel::class.java.simpleName + + private var viewCallback: ILineViewCallback? = null + + init { + + } + + override fun onCleared() { + super.onCleared() + LineManager.removeListener(TAG) + this.viewCallback = null + } + + fun setDistanceCallback(viewCallback: ILineViewCallback) { + LineManager.addListener(TAG,this) + this.viewCallback = viewCallback + } + + override fun clearLineSuccess() { + this.viewCallback?.setImageViewResource(R.drawable.common_map_line_close) + } + + override fun drawLineSuccess() { + this.viewCallback?.setImageViewResource(R.drawable.common_map_line_open) + } + + override fun drawLineFail() { + this.viewCallback?.setImageViewResource(R.drawable.common_map_line_close) + } + + interface ILineViewCallback { + fun setImageViewResource(@DrawableRes name: Int) + + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt index 86f43bff3b..22a28ddd8c 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt @@ -25,7 +25,7 @@ class OrderStatusView : AppCompatImageView, OrderStatusViewModel.IVisualCallback ) private fun initView() { - setImageResource(R.drawable.common_visual_medium) + setImageResource(R.drawable.common_status_unorder) } override fun onAttachedToWindow() { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/IconListItemAdapter.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/IconListItemAdapter.kt new file mode 100644 index 0000000000..4340c95073 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/IconListItemAdapter.kt @@ -0,0 +1,83 @@ +package com.mogo.och.common.module.wigets.map.overmapview + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.function.business.travelreality.EventDrawBean +import androidx.recyclerview.widget.DiffUtil.Callback +import com.mogo.och.common.module.R + +/** + * Created by yangyakun on 06/06/17. + */ +class IconListItemAdapter( + private val context: Context, + private val dataList: MutableList +) : RecyclerView.Adapter() { + + fun setDataList(dataList: List) { + if (this.dataList == dataList) { + // 如果新旧列表一致,则直接返回 + return + } + + val diffResult = DiffUtil.calculateDiff(MyDiffCallback(this.dataList, dataList)) + this.dataList.clear() + this.dataList.addAll(dataList) + diffResult.dispatchUpdatesTo(this) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextVH { + val view: View + val inflater = LayoutInflater.from(context) + view = inflater.inflate(R.layout.taxt_d_icon_item, parent, false) + return TextVH(view) + } + + override fun onBindViewHolder(holder: TextVH, position: Int) { + val errorInfo = dataList[holder.bindingAdapterPosition] + holder.acivQuanxilukValue.text = errorInfo.title + holder.acivQuanxiluk.setImageResource(errorInfo.resId) + } + + override fun getItemCount(): Int { + return dataList.size + } + + inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) { + var acivQuanxiluk: AppCompatImageView + var acivQuanxilukValue: AppCompatTextView + init { + acivQuanxiluk = itemView.findViewById(R.id.aciv_quanxiluk) + acivQuanxilukValue = itemView.findViewById(R.id.aciv_quanxiluk_value) + } + } + + inner class MyDiffCallback(val oldData:List,val newData:List):Callback(){ + override fun getOldListSize(): Int { + return oldData.size + } + + override fun getNewListSize(): Int { + return newData.size + } + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val oldItem = oldData[oldItemPosition] + val newItem = newData[newItemPosition] + return oldItem.resId == newItem.resId + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val oldItem = oldData[oldItemPosition] + val newItem = newData[newItemPosition] + return oldItem.resId == newItem.resId + } + + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapBottomView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapBottomView.kt new file mode 100644 index 0000000000..e96b8fb287 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapBottomView.kt @@ -0,0 +1,30 @@ +package com.mogo.och.common.module.wigets.map.overmapview + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.common.module.R + +class OverMapBottomView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr){ + + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.common_overmap_bottom, this, true) + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapDialog.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapDialog.kt new file mode 100644 index 0000000000..280dc1e256 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapDialog.kt @@ -0,0 +1,66 @@ +package com.mogo.och.common.module.wigets.map.overmapview + +import android.content.Context +import android.os.Bundle +import android.view.View +import androidx.lifecycle.LifecycleObserver +import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider +import com.mogo.och.common.module.R +import kotlinx.android.synthetic.main.common_overmap_dialog.aciv_close_map +import kotlinx.android.synthetic.main.common_overmap_dialog.repvErrorPointReason +import me.jessyan.autosize.utils.AutoSizeUtils + +class OverMapDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver { + + init { + setContentView(R.layout.common_overmap_dialog) + setCanceledOnTouchOutside(true) + aciv_close_map.onClick { + hideDialog() + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + repvErrorPointReason?.let { + it.onCreateView(savedInstanceState) + val radius = AutoSizeUtils.dp2px(context, 16f) + it.outlineProvider = TextureVideoViewOutlineProvider(radius.toFloat()) + it.clipToOutline = true + } + } + + + override fun onStart() { + super.onStart() + repvErrorPointReason.onResume() + } + + override fun onStop() { + super.onStop() + repvErrorPointReason.onResume() + } + + + + fun showDialog() { + if (isShowing) { + return + } + show() + } + + fun hideDialog() { + if (isShowing) { + dismiss() + } + } + + fun destory(){ + repvErrorPointReason.onDestroy() + } + + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapView.kt new file mode 100644 index 0000000000..b5cc5f1afd --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/overmapview/OverMapView.kt @@ -0,0 +1,119 @@ +package com.mogo.och.common.module.wigets.map.overmapview + +import android.content.Context +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.RelativeLayout +import com.google.android.flexbox.AlignItems +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager +import com.google.android.flexbox.JustifyContent +import com.mogo.eagle.core.function.business.travelreality.EventDrawBean +import com.mogo.eagle.core.function.view.TravelRealityView +import com.mogo.och.common.module.R +import kotlinx.android.synthetic.main.common_overmap_view.view.ovbv_bottom_icons +import kotlinx.android.synthetic.main.common_overmap_view.view.ovbv_bottom_icons_cl +import kotlinx.android.synthetic.main.common_overmap_view.view.travelRealityView +import kotlinx.android.synthetic.main.common_overmap_view.view.tv_add_false +import kotlinx.android.synthetic.main.common_overmap_view.view.tv_add_true + +class OverMapView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr){ + + private var iconListItemAdapter:IconListItemAdapter?=null + + private val eventDrawBeansTrue = mutableListOf() + private val eventDrawBeansFalse = mutableListOf() + + private val listener = object : TravelRealityView.OnDrawListener{ + override fun onDraw(eventList: List, isEvent: Boolean) { +// if(isEvent){ +// eventDrawBeansTrue.clear() +// eventDrawBeansTrue.addAll(eventList) +// }else{ +// eventDrawBeansFalse.clear() +// eventDrawBeansFalse.addAll(eventList) +// } +// iconListItemAdapter?.let { +// it.setDataList(eventDrawBeansTrue+eventDrawBeansFalse) +// if(it.itemCount==0){ +// ovbv_bottom_icons_cl.visibility = GONE +// }else{ +// ovbv_bottom_icons_cl.visibility = VISIBLE +// } +// } + } + + } + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.common_overmap_view, this, true) + + + + val flexboxLayoutManager = FlexboxLayoutManager(context) + flexboxLayoutManager.flexDirection = FlexDirection.ROW; + flexboxLayoutManager.alignItems = AlignItems.CENTER + flexboxLayoutManager.flexWrap = FlexWrap.WRAP + flexboxLayoutManager.justifyContent = JustifyContent.CENTER + + ovbv_bottom_icons?.layoutManager = flexboxLayoutManager + //ovbv_bottom_icons?.setHasFixedSize(true) + iconListItemAdapter = IconListItemAdapter( + context, mutableListOf( + EventDrawBean(R.drawable.mogo_quanxi_lukou, "全息路口"), + EventDrawBean(R.drawable.mogo_jingzhi_nor, "静止事件"), + EventDrawBean(R.drawable.mogo_shigong_image, "道路施工"), + EventDrawBean(R.drawable.mogo_shigu_nor, "交通事故") + ) + ) + + ovbv_bottom_icons?.adapter = iconListItemAdapter + + travelRealityView.setOnDrawListener(listener) + + tv_add_true.setOnClickListener { + listener.onDraw(mutableListOf( + EventDrawBean(R.drawable.mogo_jingzhi_nor,"全息路口"), + EventDrawBean(R.drawable.mogo_shigong_image,"静止事件"), + ),true) + } + + tv_add_false.setOnClickListener { + listener.onDraw(mutableListOf( + EventDrawBean(R.drawable.mogo_quanxi_lukou,"全息路口"), + ),false) + } + + } + + fun onCreateView(savedInstanceState: Bundle?) { + travelRealityView.onCreateView(savedInstanceState) + } + + fun onResume() { + travelRealityView.onResume() + } + + fun onPause() { + travelRealityView.onPause() + } + + fun onDestroy() { + travelRealityView.onDestroy() + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt new file mode 100644 index 0000000000..eb947263f0 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt @@ -0,0 +1,256 @@ +package com.mogo.och.common.module.wigets.map.switchvisual + +import android.animation.ObjectAnimator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.LinearGradient +import android.graphics.Paint +import android.graphics.Shader +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.widget.ImageView +import androidx.annotation.DrawableRes +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.R +import kotlinx.android.synthetic.main.taxi_p_seekbar_visualangle.view.iv_visualangle_bg +import kotlinx.android.synthetic.main.taxi_p_seekbar_visualangle.view.iv_visualangle_value +import kotlinx.android.synthetic.main.taxi_seekbar_visualangle.view.iv_visualangle_bg_dark +import kotlinx.android.synthetic.main.taxi_seekbar_visualangle.view.iv_visualangle_value_dark +import kotlin.properties.Delegates + + +class SeekBarView : ConstraintLayout, VisualViewModel.IVisualCallback { + + //定义、并创建画笔 + var p = Paint().apply { + strokeWidth = 1f + style = Paint.Style.STROKE + isAntiAlias = true + shader = LinearGradient( + 0f, 0f, 600f, 600f, intArrayOf(Color.RED, Color.BLUE, Color.BLACK), + null, Shader.TileMode.CLAMP + ) + } + + private val TAG = "SeekBarView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + private var viewModel: VisualViewModel? = null + + var enableCallback:EnableCallback?=null + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + } + + private var initialX = 0f + private var initialY = 0f + private val tempSet = ConstraintSet() + + /** + * 为该组件的触碰事件重写事件处理方法 + */ + override fun onTouchEvent(event: MotionEvent?): Boolean { + if(value==VisualViewModel.Visualangle.UnChange){ + return true + } + when (event?.action) { + MotionEvent.ACTION_DOWN -> { + initialX = event.rawX; + initialY = event.rawY; + } + MotionEvent.ACTION_MOVE -> { + + if(draggableButton.translationY<-draggableButton.height){ + tempSet.clone(this) + tempSet.setTranslationY(draggableButton.id,-draggableButton.height.toFloat()) + tempSet.applyTo(this) + return true + }else if (draggableButton.translationY>(height)){ + tempSet.clone(this) + tempSet.setTranslationY(draggableButton.id,(height).toFloat()) + tempSet.applyTo(this) + return true + } + + val dx = event.rawX - initialX; + val dy = event.rawY - initialY; + initialX = event.rawX; + initialY = event.rawY; + + tempSet.clone(this) + tempSet.setTranslationY(draggableButton.id,draggableButton.translationY+dy) + tempSet.applyTo(this) + } + MotionEvent.ACTION_UP -> { + if(draggableButton.translationY<0){ + translationByValue(VisualViewModel.Visualangle.Long) + }else if (draggableButton.translationY>(height-draggableButton.height)){ + translationByValue(VisualViewModel.Visualangle.Middle) + }else{ + val marginTop = draggableButton.translationY + val split = (height - draggableButton.height) / 2 + +// if(marginTop>0&&marginTopsplit&&marginTopsplit&&marginTop<(height - draggableButton.height)){ +// translationByValue(Visualangle.Long) +// } + + if(marginTop>0&&marginTopsplit&&marginTop<(height - draggableButton.height)){ + translationByValue(VisualViewModel.Visualangle.Middle) + } + + } + } + else -> {} + } + return true + } + + private var value: VisualViewModel.Visualangle by Delegates.observable(VisualViewModel.Visualangle.None) { _, oldValue, newValue -> + CallerLogger.d(TAG,"oldValue:${oldValue}____newValue:${newValue}") + if (oldValue != newValue) { + viewModel?.changeVisualView(newValue) + if(newValue==VisualViewModel.Visualangle.UnChange){ + this.enableCallback?.enableChangeListener(false) + }else{ + if (oldValue==VisualViewModel.Visualangle.UnChange) { + this.enableCallback?.enableChangeListener(true) + } + } + } + } + + fun translationByValue(visualangle: VisualViewModel.Visualangle){ + value = visualangle + when (visualangle) { + VisualViewModel.Visualangle.Middle -> { + ObjectAnimator.ofFloat( + draggableButton, "translationY", draggableButton.translationY, + (height - draggableButton.height).toFloat() + ).apply { + duration = 100 + }.start() + } + VisualViewModel.Visualangle.Long -> { + ObjectAnimator.ofFloat( + draggableButton, "translationY", draggableButton.translationY, + 0f + ).apply { + duration = 100 + }.start() + } + VisualViewModel.Visualangle.UnChange -> { + ObjectAnimator.ofFloat( + draggableButton, "translationY", draggableButton.translationY, + (height - draggableButton.height) / 2f + ).apply { + duration = 100 + }.start() + } + } + } + + private lateinit var draggableButton:ImageView + + private fun initView() { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LayoutInflater.from(context).inflate(R.layout.taxi_seekbar_visualangle, this, true) + draggableButton = findViewById(R.id.iv_visualangle_value_dark) + }else{ + LayoutInflater.from(context).inflate(R.layout.taxi_p_seekbar_visualangle, this, true) + draggableButton = findViewById(R.id.iv_visualangle_value) + } + } + + fun setBgResource(@DrawableRes resource:Int){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + iv_visualangle_bg_dark.setImageResource(resource) + }else{ + iv_visualangle_bg.setImageResource(resource) + } + } + fun setHumbResource(@DrawableRes resource:Int){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + iv_visualangle_value_dark.setImageResource(resource) + }else{ + iv_visualangle_value.setImageResource(resource) + } + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(VisualViewModel::class.java) + } + + viewModel?.setDistanceCallback(this) + + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun setMiddleAngle() { + UiThreadHandler.post({ + translationByValue(VisualViewModel.Visualangle.Middle) + }, UiThreadHandler.MODE.QUEUE) + + } + + override fun setLongAngle() { + UiThreadHandler.post({ + translationByValue(VisualViewModel.Visualangle.Long) + }, UiThreadHandler.MODE.QUEUE) + + } + + override fun setUnableChange() { + UiThreadHandler.post({ + translationByValue(VisualViewModel.Visualangle.UnChange) + }, UiThreadHandler.MODE.QUEUE) + } + + override fun setSkyboxAngle() { + UiThreadHandler.post({ + translationByValue(VisualViewModel.Visualangle.Middle) + }, UiThreadHandler.MODE.QUEUE) + } + + interface EnableCallback{ + fun enableChangeListener(enable:Boolean) + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewDirver.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewDirver.kt new file mode 100644 index 0000000000..0d5646283f --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewDirver.kt @@ -0,0 +1,80 @@ +package com.mogo.och.common.module.wigets.map.switchvisual + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.common.module.R +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_center_location_bg +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_visual_angle_title_bottom +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_visual_angle_title_head +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_visual_angle_title_value_bg + + +class VisualViewDirver : ConstraintLayout { + + private val TAG = "LeftBarView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) + + init { + } + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.common_visualangle_black, this, true) + + iv_visual_angle_title_value_bg.enableCallback = object :SeekBarView.EnableCallback{ + override fun enableChangeListener(enable: Boolean) { + if(enable){ + iv_visual_angle_title_head.alpha = 1f + iv_visual_angle_title_head.alpha = 1f + iv_visual_angle_title_bottom.alpha = 1f + iv_visual_angle_title_value_bg.alpha = 1f + iv_visual_angle_title_value_bg.alpha = 1f + iv_center_location_bg.alpha = 1f + +// iv_visual_angle_title_head.setImageResource(R.drawable.commont_visual_head) +// iv_visual_angle_title_bottom.setImageResource(R.drawable.common_visual_bottom) +// iv_visual_angle_title_value_bg.setBgResource(R.drawable.common_visual_angle_bg) +// iv_visual_angle_title_value_bg.setHumbResource(R.drawable.common_visual_angle) + iv_center_location_bg.setImageResource(R.drawable.common_visualangle_bg) + }else{ + iv_visual_angle_title_head.alpha = 0.5f + iv_visual_angle_title_bottom.alpha = 0.5f + iv_visual_angle_title_value_bg.alpha = 0.5f + iv_visual_angle_title_value_bg.alpha = 0.5f + iv_center_location_bg.alpha = 0.5f + +// iv_visual_angle_title_head.setImageResource(R.drawable.commont_visual_head_unable) +// iv_visual_angle_title_bottom.setImageResource(R.drawable.common_visual_bottom_unenable) +// iv_visual_angle_title_value_bg.setBgResource(R.drawable.common_visual_angle_bg_unenable) +// iv_visual_angle_title_value_bg.setHumbResource(R.drawable.common_visual_angle_unenable) +// iv_center_location_bg.setImageResource(R.drawable.common_visualangle_bg_unenable) + } + } + } + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt index e29c4df39b..8ab46c8ee7 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewModel.kt @@ -1,14 +1,16 @@ package com.mogo.och.common.module.wigets.map.switchvisual import androidx.lifecycle.ViewModel -import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.map.listener.IMogoMapListener -import com.mogo.map.listener.MogoMapListenerHandler +import com.mogo.eagle.core.function.angle.scenes.LongSight +import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider +import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.map.uicontroller.VisualAngleMode -import com.mogo.och.common.module.R +import com.mogo.eagle.core.function.angle.scenes.Default +import com.mogo.eagle.core.utilcode.util.UiThreadHandler -class VisualViewModel : ViewModel(), IMogoMapListener { +class VisualViewModel : ViewModel(), + IMoGoVisualAngleChangeProvider.OnMoGoVisualAngleSceneChangeListener { private val TAG = VisualViewModel::class.java.simpleName @@ -20,72 +22,89 @@ class VisualViewModel : ViewModel(), IMogoMapListener { override fun onCleared() { super.onCleared() - MogoMapListenerHandler.mogoMapListenerHandler.unregisterHostMapListener(TAG) + CallerVisualAngleManager.removeListener(TAG) this.viewCallback = null } fun setDistanceCallback(viewCallback: IVisualCallback) { - MogoMapListenerHandler.mogoMapListenerHandler.registerHostMapListener(TAG, this) + CallerVisualAngleManager.addListener(TAG, this) this.viewCallback = viewCallback } - override fun onMapVisualAngleChanged(visualAngleMode: VisualAngleMode?) { - CallerLogger.d(TAG,"视角切换成功${visualAngleMode}") - visualAngleMode?.let { - if (visualAngleMode.isMediumSight) { - this.viewCallback?.setViewShow(true) - this.viewCallback?.setViewResource(R.drawable.common_visual_medium) - } else if (visualAngleMode.isLongSight) { - this.viewCallback?.setViewShow(true) - this.viewCallback?.setViewResource(R.drawable.common_visual_long) - } else if (visualAngleMode.isCloseSight) { - this.viewCallback?.setViewShow(false) - } else{ - this.viewCallback?.setViewShow(false) + override fun onSceneChanged(scene: Scene) { + if (scene.isCanSwitch) {// 可切换 + when (scene.angle) { + VisualAngleMode.MODE_MEDIUM_SIGHT -> { + UiThreadHandler.post({ + this.viewCallback?.setViewShow(true) + this.viewCallback?.setMiddleAngle() + }, UiThreadHandler.MODE.QUEUE) + } + + VisualAngleMode.MODE_LONG_SIGHT -> { + UiThreadHandler.post({ + this.viewCallback?.setViewShow(true) + this.viewCallback?.setLongAngle() + }, UiThreadHandler.MODE.QUEUE) + + } + + VisualAngleMode.MAP_STYLE_VR_SKY_BOX -> { + UiThreadHandler.post({ + this.viewCallback?.setViewShow(true) + this.viewCallback?.setSkyboxAngle() + }, UiThreadHandler.MODE.QUEUE) + } + + else -> { + // 不可切换 + UiThreadHandler.post({ + this.viewCallback?.setViewShow(false) + this.viewCallback?.setUnableChange() + }, UiThreadHandler.MODE.QUEUE) + } } + } else {// 不可切换 + UiThreadHandler.post({ + this.viewCallback?.setViewShow(false) + this.viewCallback?.setUnableChange() + }, UiThreadHandler.MODE.QUEUE) } } - override fun onMapLoaded() { - super.onMapLoaded() - CallerLogger.d(TAG,"地图加载成功 onMapLoaded") - val mapUIController = CallerMapUIServiceManager.getMapUIController() - mapUIController?.let { - val visualAngleMode = mapUIController.currentMapVisualAngle - if (visualAngleMode.isMediumSight) { - this.viewCallback?.setViewShow(true) - this.viewCallback?.setViewResource(R.drawable.common_visual_medium) - } else if (visualAngleMode.isLongSight) { - this.viewCallback?.setViewShow(true) - this.viewCallback?.setViewResource(R.drawable.common_visual_long) - } else if (visualAngleMode.isCloseSight) { - this.viewCallback?.setViewShow(false) - } else{ - this.viewCallback?.setViewShow(false) + fun changeVisualView(angle: Visualangle) { + + when (angle) { + Visualangle.Middle -> { + CallerVisualAngleManager.changeScene(Default(forceClosePrev = true)) + } + + Visualangle.Long -> { + CallerVisualAngleManager.changeScene(LongSight()) + } + + Visualangle.UnChange -> { + viewCallback?.setUnableChange() } } + } - fun changeVisualView() { - val mapUIController = CallerMapUIServiceManager.getMapUIController() - mapUIController?.currentMapVisualAngle?.let { - CallerLogger.d(TAG,"切换视角:${it}") - if (it.isLongSight) { - mapUIController.setLockMode(true); - mapUIController.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); - } else if (it.isMediumSight) { - mapUIController.setLockMode(false); - mapUIController.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null); - } else { - mapUIController.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); - } - } + enum class Visualangle { + Middle, Long, UnChange,None } interface IVisualCallback { - fun setViewShow(boolean: Boolean) + fun setViewShow(boolean: Boolean) {} - fun setViewResource(resource: Int) + fun setMiddleAngle() {} + + fun setLongAngle() {} + + fun setSkyboxAngle() {} + + fun setUnableChange() {} } + } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/mapdirectionview/MapDirectionView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/mapdirectionview/MapDirectionView.kt index 9f809d75e1..42ba30dda7 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/mapdirectionview/MapDirectionView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/mapdirectionview/MapDirectionView.kt @@ -23,12 +23,12 @@ import com.amap.api.maps.model.Polyline import com.amap.api.maps.model.PolylineOptions 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.MapAssetStyleUtils 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.UiThreadHandler import com.mogo.och.common.module.R +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.shuttle.passenger.ui.mapdirectionview.MapDirectionViewModel import me.jessyan.autosize.utils.AutoSizeUtils @@ -128,13 +128,13 @@ class MapDirectionView @JvmOverloads constructor( initAMapView() // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 1, this) + OchLocationManager.addGCJ02Listener(TAG, 1, this) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) } private fun initAMapView() { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/rodedata/OchAutomaticExplorationView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/rodedata/OchAutomaticExplorationView.kt new file mode 100644 index 0000000000..8853435036 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/rodedata/OchAutomaticExplorationView.kt @@ -0,0 +1,77 @@ +package com.mogo.och.common.module.wigets.rodedata + +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import com.mogo.eagle.core.function.hmi.ui.notice.exploration.AutomaticExplorationView +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum + +class OchAutomaticExplorationView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AutomaticExplorationView(context, attrs, defStyleAttr), OrderListener { + private val TAG = "OchAutomaticExplorationView" + init { + OrderModel.setOrderStatusCallback(TAG,this) + } + + override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { + if(order==null){ + cancelTimer() + currentOrderStatus(false) + Log.i(TAG,"onCurrentOrderStatusChanged order 为空") + }else { + when (order.orderStatus) { + TaxiOrderStatusEnum.None.code -> { + cancelTimer() + currentOrderStatus(false) + Log.i(TAG,"TaxiOrderStatusEnum.None.code") + } + TaxiOrderStatusEnum.OnTheWayToStart.code -> { + startShowTimer() + currentOrderStatus(true) + Log.i(TAG,"TaxiOrderStatusEnum.OnTheWayToStart.code") + } + TaxiOrderStatusEnum.ArriveAtStart.code -> { + startShowTimer() + currentOrderStatus(true) + Log.i(TAG,"TaxiOrderStatusEnum.ArriveAtStart.code") + } + TaxiOrderStatusEnum.UserArriveAtStart.code -> { + startShowTimer() + currentOrderStatus(true) + Log.i(TAG,"TaxiOrderStatusEnum.UserArriveAtStart.code") + } + TaxiOrderStatusEnum.OnTheWayToEnd.code -> { + startShowTimer() + currentOrderStatus(true) + Log.i(TAG,"TaxiOrderStatusEnum.OnTheWayToEnd.code") + } + TaxiOrderStatusEnum.ArriveAtEnd.code -> { + startShowTimer() + currentOrderStatus(true) + Log.i(TAG,"TaxiOrderStatusEnum.ArriveAtEnd.code") + } + TaxiOrderStatusEnum.JourneyCompleted.code -> { + cancelTimer() + currentOrderStatus(false) + Log.i(TAG,"TaxiOrderStatusEnum.JourneyCompleted.code") + } + TaxiOrderStatusEnum.Cancel.code -> { + cancelTimer() + currentOrderStatus(false) + Log.i(TAG,"TaxiOrderStatusEnum.Cancel.code") + } + else -> { + cancelTimer() + currentOrderStatus(false) + Log.i(TAG,"else") + } + } + } + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_close_100x100.png b/OCH/common/common/src/main/res/drawable-nodpi/common_close_100x100.png new file mode 100755 index 0000000000..24c435a8fb Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_close_100x100.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png new file mode 100644 index 0000000000..4187e3ddbd Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png new file mode 100644 index 0000000000..8bfc10bae6 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle.png new file mode 100755 index 0000000000..f2ea150dff Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg.png new file mode 100755 index 0000000000..386839b12e Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg_unenable.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg_unenable.png new file mode 100644 index 0000000000..80df6287df Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg_unenable.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_unenable.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_unenable.png new file mode 100644 index 0000000000..c80017aeed Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_unenable.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom.png new file mode 100755 index 0000000000..13076e27b6 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom_unenable.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom_unenable.png new file mode 100644 index 0000000000..de0caf66ae Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom_unenable.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg.png new file mode 100644 index 0000000000..aa30746eb0 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg_unenable.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg_unenable.png new file mode 100644 index 0000000000..e7421ad3db Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg_unenable.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head.png b/OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head.png new file mode 100755 index 0000000000..fa95919a55 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head_unable.png b/OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head_unable.png new file mode 100644 index 0000000000..ffac29ef2c Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head_unable.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/taxi_orvermap_road_trajectory.png b/OCH/common/common/src/main/res/drawable-nodpi/taxi_orvermap_road_trajectory.png new file mode 100644 index 0000000000..97d6b8470a Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/taxi_orvermap_road_trajectory.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/taxi_overmap_endpoint.png b/OCH/common/common/src/main/res/drawable-nodpi/taxi_overmap_endpoint.png new file mode 100644 index 0000000000..61527f37c1 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/taxi_overmap_endpoint.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/taxi_overmap_road_range.png b/OCH/common/common/src/main/res/drawable-nodpi/taxi_overmap_road_range.png new file mode 100644 index 0000000000..a6b03d50c6 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/taxi_overmap_road_range.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/taxi_p_visual_angle.png b/OCH/common/common/src/main/res/drawable-nodpi/taxi_p_visual_angle.png new file mode 100644 index 0000000000..bab0ca819c Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/taxi_p_visual_angle.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/taxi_p_visual_angle_bg.png b/OCH/common/common/src/main/res/drawable-nodpi/taxi_p_visual_angle_bg.png new file mode 100644 index 0000000000..22d2276ab8 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/taxi_p_visual_angle_bg.png differ diff --git a/OCH/common/common/src/main/res/layout/common_overmap_bottom.xml b/OCH/common/common/src/main/res/layout/common_overmap_bottom.xml new file mode 100644 index 0000000000..902462b008 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/common_overmap_bottom.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/common_overmap_dialog.xml b/OCH/common/common/src/main/res/layout/common_overmap_dialog.xml new file mode 100644 index 0000000000..23a73abea6 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/common_overmap_dialog.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/common_overmap_view.xml b/OCH/common/common/src/main/res/layout/common_overmap_view.xml new file mode 100644 index 0000000000..c487ceac0f --- /dev/null +++ b/OCH/common/common/src/main/res/layout/common_overmap_view.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/common_visualangle_black.xml b/OCH/common/common/src/main/res/layout/common_visualangle_black.xml new file mode 100644 index 0000000000..1ceaa73199 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/common_visualangle_black.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/taxi_p_seekbar_visualangle.xml b/OCH/common/common/src/main/res/layout/taxi_p_seekbar_visualangle.xml new file mode 100644 index 0000000000..55f173c633 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/taxi_p_seekbar_visualangle.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/taxi_seekbar_visualangle.xml b/OCH/common/common/src/main/res/layout/taxi_seekbar_visualangle.xml new file mode 100644 index 0000000000..456da864d2 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/taxi_seekbar_visualangle.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/taxt_d_icon_item.xml b/OCH/common/common/src/main/res/layout/taxt_d_icon_item.xml new file mode 100644 index 0000000000..c14c670d3b --- /dev/null +++ b/OCH/common/common/src/main/res/layout/taxt_d_icon_item.xml @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/values/colors.xml b/OCH/common/common/src/main/res/values/colors.xml index 35e75072f4..5917e77527 100644 --- a/OCH/common/common/src/main/res/values/colors.xml +++ b/OCH/common/common/src/main/res/values/colors.xml @@ -27,4 +27,6 @@ #A0B3DA #3B4577 + #232A3F + #39BA90 \ No newline at end of file diff --git a/OCH/common/data/build.gradle b/OCH/common/data/build.gradle index 91ba454fa1..c106019e8c 100644 --- a/OCH/common/data/build.gradle +++ b/OCH/common/data/build.gradle @@ -41,7 +41,9 @@ dependencies { if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { api rootProject.ext.dependencies.mogoutils + api rootProject.ext.dependencies.mogo_core_data }else { api project(":core:mogo-core-utils") + api project(':core:mogo-core-data') } } \ No newline at end of file diff --git a/OCH/common/data/src/main/java/com/mogo/och/data/taxi/BaseOrderBean.java b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/BaseOrderBean.java new file mode 100644 index 0000000000..b9ac4f853d --- /dev/null +++ b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/BaseOrderBean.java @@ -0,0 +1,18 @@ +package com.mogo.och.data.taxi; + +public class BaseOrderBean { + public String orderNo;// 订单号 + public int orderStatus;//订单状态 + + public String getEndSiteAddr() { + return ""; + } + + @Override + public String toString() { + return "BaseOrderBean{" + + "orderNo='" + orderNo + '\'' + + ", orderStatus=" + orderStatus + + '}'; + } +} diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/OrderQueryRouteInfoReqBean.java similarity index 58% rename from OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java rename to OCH/common/data/src/main/java/com/mogo/och/data/taxi/OrderQueryRouteInfoReqBean.java index caa2be9c66..25a797173c 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java +++ b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/OrderQueryRouteInfoReqBean.java @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.data.taxi; /** * Created on 2021/9/7 @@ -9,6 +9,14 @@ public class OrderQueryRouteInfoReqBean { public String sn; public String orderNo; + @Override + public String toString() { + return "OrderQueryRouteInfoReqBean{" + + "sn='" + sn + '\'' + + ", orderNo='" + orderNo + '\'' + + '}'; + } + public OrderQueryRouteInfoReqBean(String sn, String orderNo) { this.sn = sn; this.orderNo = orderNo; diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/OrderQueryRouteInfoRespBean.java similarity index 65% rename from OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java rename to OCH/common/data/src/main/java/com/mogo/och/data/taxi/OrderQueryRouteInfoRespBean.java index 02cc314c59..66b18ee055 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java +++ b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/OrderQueryRouteInfoRespBean.java @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.data.taxi; import com.mogo.eagle.core.data.BaseData; @@ -18,5 +18,15 @@ public class OrderQueryRouteInfoRespBean extends BaseData { // 起点至终点 public long durationToEnd; //订单上车点到目的地的时长,单位:秒 public long distanceToEnd; //订单上车点到目的地的距离,单位:米 + + @Override + public String toString() { + return "Result{" + + "durationToStart=" + durationToStart + + ", distanceToStart=" + distanceToStart + + ", durationToEnd=" + durationToEnd + + ", distanceToEnd=" + distanceToEnd + + '}'; + } } } diff --git a/OCH/common/data/src/main/java/com/mogo/och/data/taxi/QueryCarOrderByNoReqBean.kt b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/QueryCarOrderByNoReqBean.kt new file mode 100644 index 0000000000..5467ec2706 --- /dev/null +++ b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/QueryCarOrderByNoReqBean.kt @@ -0,0 +1,5 @@ +package com.mogo.och.data.taxi + +data class QueryCarOrderByNoReqBean( + var sn: String, var orderNo: String +) \ No newline at end of file diff --git a/OCH/common/data/src/main/java/com/mogo/och/data/taxi/QueryCarOrderByNoRespBean.kt b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/QueryCarOrderByNoRespBean.kt new file mode 100644 index 0000000000..d57d09f3a0 --- /dev/null +++ b/OCH/common/data/src/main/java/com/mogo/och/data/taxi/QueryCarOrderByNoRespBean.kt @@ -0,0 +1,14 @@ +package com.mogo.och.data.taxi + +import com.mogo.eagle.core.data.BaseData + +data class QueryCarOrderByNoRespBean(var data: Result) : BaseData() { + data class Result( + var sn: String, + var bookingUserPhone: String, + var businessType: String, + var mileage: Float, + var duration: Float, + var passengerSize: Int + ):BaseOrderBean() +} diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt index 35ad76da5a..49a6ed1442 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt @@ -1,6 +1,7 @@ package com.mogo.och.facade.route import android.content.Context +import android.media.AudioManager import android.view.Gravity import android.view.View import android.view.ViewGroup @@ -18,7 +19,9 @@ import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.core.utilcode.util.VolumeUtils import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.biz.login.BusinessEnum import com.mogo.och.common.module.biz.login.ILoginCallback @@ -76,6 +79,15 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback { } private fun getFragment(): Fragment { + if(DeviceUtils.isEB5Model()&&AppIdentityModeUtils.isCharterPassenger(FunctionBuildConfig.appIdentityMode)){ + val maxVolume = VolumeUtils.getMaxVolume(AudioManager.STREAM_MUSIC) + val volume = VolumeUtils.getVolume(AudioManager.STREAM_MUSIC) + val tartgetVolume = (maxVolume * 0.8).toInt() + OchChainLogManager.writeChainLog("音量","最大声音量:${maxVolume}------当前音量:${volume}----目的音量:${tartgetVolume}") + if(volume stationList.size() - 1 ) { //到站短时间内调用多次 CallerLogger.e( M_BUS + TAG, "数组越界" ); return; @@ -856,8 +855,7 @@ public class OrderModel { String changeInfo = "taskId:" + busRoutesResult.getTaskId() + "--lineId:" + busRoutesResult.getLineId() + "--currentStationName:"+currentStationName+"--finalNextStationName:"+finalNextStationName; - OchChainLogManager.writeChainLog("滑动出发", changeInfo, - true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("滑动出发", changeInfo); OrderServiceManager.leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq(), stationList.get(backgroundCurrentStationIndex).getSiteId(), @@ -865,8 +863,7 @@ public class OrderModel { new OchCommonServiceCallback() { @Override public void onSuccess(BaseData o) { - OchChainLogManager.writeChainLog("滑动出发成功", changeInfo, - true,OchChainLogManager.EVENT_KEY_INFE_WITH_BUS); + OchChainLogManager.writeChainLog("滑动出发成功", changeInfo); } @@ -923,8 +920,12 @@ public class OrderModel { * @param result */ private void updateBusStatus(BusRoutesResult result) { - if (result == null) return; + if (result == null) { + LineManager.setLineId(-1); + return; + } busRoutesResult = result; + LineManager.setLineId(busRoutesResult.getLineId()); stationList.clear(); stationList.addAll(result.getSites()); for (int i = 0; i < stationList.size(); i++) { @@ -1188,8 +1189,7 @@ public class OrderModel { // 登出 public void logout() { - MogoLocation gcj02 = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02(); - LoginStatusManager.loginOut(gcj02.getLatitude(), gcj02.getLongitude()); + LoginStatusManager.loginOut(); } public void triggerStartServiceEvent(boolean isRestart, boolean send) { diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/shuttle/util/ShuttleVoiceManager.kt b/OCH/shuttle/driver/src/main/java/com/mogo/och/shuttle/util/ShuttleVoiceManager.kt index 76198fdd0f..854c739097 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/shuttle/util/ShuttleVoiceManager.kt +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/shuttle/util/ShuttleVoiceManager.kt @@ -13,9 +13,6 @@ import java.util.ArrayList object ShuttleVoiceManager { fun arrivedStationBus(siteNameCN: String?, siteNameKR: String?) { - if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { - return - } val context = AbsMogoApplication.getApp() val list: MutableList = ArrayList() siteNameCN?.let { @@ -25,7 +22,7 @@ object ShuttleVoiceManager { ) val engTTS = LangTtsEntity( context.getString(R.string.bus_arrived_station_english_tip, it), - LanguageType.CHINESE + LanguageType.ENGLISH ) val koreanTTS = LangTtsEntity( context.getString(R.string.bus_arrived_station_korean_tip, siteNameKR?:it), @@ -49,7 +46,7 @@ object ShuttleVoiceManager { ) val engTTS = LangTtsEntity( context.getString(R.string.bus_leave_station_english_tip, it), - LanguageType.CHINESE + LanguageType.ENGLISH ) list.add(chineseTTS) list.add(engTTS) diff --git a/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml b/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml index 4e8489372e..159ebca0d0 100644 --- a/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml +++ b/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml @@ -104,6 +104,16 @@ android:visibility="invisible" app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity"/> + + + + + - - - - + + @@ -355,7 +370,7 @@ @Override public void onAutopilotTrajectoryDownloadReq(@NonNull AutopilotControlParameters.AutoPilotLine autoPilotLine, int downloadType) { } + + @Override + public void onFsmReceiveTimeout(boolean isTimeout) { + + } } diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java index 2d879dc63a..eb21df6157 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java @@ -1,6 +1,7 @@ package com.mogo.och.taxi.bean; import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.data.taxi.BaseOrderBean; import java.util.List; import java.util.Objects; @@ -13,13 +14,11 @@ import java.util.Objects; public class OrderQueryRespBean extends BaseData { public Result data; - public static class Result implements Comparable{ - // 订单no - public String orderNo; + public static class Result extends BaseOrderBean implements Comparable{ + // 订单类型 public int orderType; //1即时单 2预约单 - // 订单状态 - public int orderStatus; + // 订单运营类型 (9出租车,10小巴) public int businessType; // 起始站点id @@ -68,6 +67,11 @@ public class OrderQueryRespBean extends BaseData { // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km public double travelDistance; + @Override + public String getEndSiteAddr() { + return endSiteAddr; + } + /** * @param distance */ diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java index 6061dfa8bb..4ced7e787a 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java @@ -3,7 +3,7 @@ package com.mogo.och.taxi.callback; import androidx.annotation.NonNull; import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean; import java.util.List; diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index a0a733feaa..4a588a6c16 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -29,12 +29,10 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Liste 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.commons.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.CoordinateUtils; -import com.mogo.eagle.core.utilcode.util.DateTimeUtils; import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.StringUtils; @@ -44,6 +42,8 @@ import com.mogo.och.common.module.manager.autopilot.autopilot.ArrivedStation; import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener; import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager; import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager; +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager; +import com.mogo.och.common.module.manager.autopilot.line.LineManager; import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager; import com.mogo.och.common.module.manager.socket.cloud.data.OCHOperationalMessage; import com.mogo.och.common.module.biz.login.LoginStatusManager; @@ -65,7 +65,7 @@ import com.mogo.och.taxi.bean.DriverServiceDataRespBean; import com.mogo.och.taxi.bean.OrderGrabRespBean; import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean; import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean; import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean; import com.mogo.och.taxi.bean.OrdersListQueryRespBean; @@ -79,7 +79,7 @@ import com.mogo.och.taxi.callback.ITaxiCarOperationalCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; import com.mogo.och.taxi.constant.TaxiConst; -import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum; import com.mogo.och.taxi.constant.TaxiOrderTypeEnum; import com.mogo.och.taxi.network.TaxiServiceManager; import com.mogo.och.taxi.utils.OrderUtil; @@ -134,8 +134,6 @@ public class TaxiModel { private final List mRoutePoints = new ArrayList<>(); private final int mPreRouteIndex = 0; - private double mLongitude, mLatitude; - private MogoLocation mLocation = null; private TaxiModel() { } @@ -217,7 +215,7 @@ public class TaxiModel { IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener); //定位监听, 传false是高德坐标系 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,5, mMapLocationListener); + OchLocationManager.addGCJ02Listener(TAG,5, mMapLocationListener); //2021.11.1 自动驾驶路线规划接口 CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); @@ -258,7 +256,7 @@ public class TaxiModel { private void releaseListeners() { // 注销地图监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); + OchLocationManager.removeGCJ02Listener(TAG); OCHSocketMessageManager.INSTANCE.releaseSocketMessageListener(OCHSocketMessageManager.msgMonitorType); @@ -449,6 +447,7 @@ public class TaxiModel { if (mOrderStatusCallback != null) { mOrderStatusCallback.onCurrentOrderCancelDone(); } + LineManager.setLineId(-1); clearCurrentOCHOrder(); cancelAutopilot(); } @@ -696,7 +695,9 @@ public class TaxiModel { // 车机端上传心跳数据(只在出车状态时上传) public void runCarHeartbeat() { - TaxiServiceManager.runCarHeartbeat(mContext, mLongitude, mLatitude, + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + TaxiServiceManager.runCarHeartbeat(mContext, + gcj02Location.getLongitude(), gcj02Location.getLatitude(), new OchCommonServiceCallback() { @Override public void onSuccess(BaseData data) { @@ -747,8 +748,6 @@ public class TaxiModel { public void confirmAutopilotConditionByDriver() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); -// result.lat = mLatitude; -// result.lon = mLongitude; TaxiServiceManager.confirmAutopilotConditionByDriver(mContext, mCurrentOCHOrder.orderNo, result, @@ -944,10 +943,10 @@ public class TaxiModel { } //3、距离轨迹15m计算 - String resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot(mCurrentOCHOrder.lineId); + String resion = OchAutoPilotManager.canStartAutoPilot(mCurrentOCHOrder.lineId); if(TrajectoryAndDistanceManager.errorTypeNoneLineId.equals(resion)){ setStation(); - resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot(mCurrentOCHOrder.lineId); + resion = OchAutoPilotManager.canStartAutoPilot(mCurrentOCHOrder.lineId); } if(!StringUtils.isEmpty(resion)){ ToastUtils.showShort(resion); @@ -958,9 +957,7 @@ public class TaxiModel { CallerLogger.e(M_TAXI + TAG, "isPassStartAutopilotCommand = " + FunctionBuildConfig.isPassStartAutopilotCommand); //4、ssm 给出数据 - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { - ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + - ", 请稍候重试"); + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { TaxiAnalyticsManager.INSTANCE.triggerUnableStartAPReasonEvent( mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, String.valueOf(mCurrentOCHOrder.lineId),mCurrentOCHOrder.orderNo, @@ -1117,10 +1114,6 @@ public class TaxiModel { judgeEndStation(gnssInfo); } } - - mLongitude = gnssInfo.getLongitude(); - mLatitude = gnssInfo.getLatitude(); - mLocation = gnssInfo; } }); } @@ -1489,31 +1482,6 @@ public class TaxiModel { reportOrderRemain((long) lastSumLength, (long) lastTime); } - private void routeAndWipe() { - if (mRoutePoints != null && mRoutePoints.size() > 0 && mLocation != null) { - int haveArrivedIndex = CoordinateCalculateRouteUtil - .getArrivedPointIndexNew(mPreRouteIndex, - mRoutePoints, - mLocation.getLongitude(), - mLocation.getLatitude()); - List routePoints = CoordinateCalculateRouteUtil - .coordinateConverterLocationToLatLng(mContext, mRoutePoints); - List routeArrivied = new ArrayList<>(); - List routeArriving = new ArrayList<>(); - for (int i = 0; i < routePoints.size(); i++){ - if (i <= haveArrivedIndex){ - routeArrivied.add(routePoints.get(i)); - }else { - routeArriving.add(routePoints.get(i)); - } - } - if (mAutopilotPlanningCallback != null) { - mAutopilotPlanningCallback.routeResult(routeArrivied,routeArriving, mLocation); - } - setRouteLineMarker(); - } - } - private final IDistanceListener distanceListener = new IDistanceListener() { @Override public void distanceCallback(float distance) { @@ -1621,8 +1589,9 @@ public class TaxiModel { return; } TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); - result.lat = mLatitude; - result.lon = mLongitude; + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + result.lat = gcj02Location.getLatitude(); + result.lon = gcj02Location.getLongitude(); TaxiServiceManager.updatePassengerHasBoardedStatus(mContext , mCurrentOCHOrder.orderNo , result @@ -1643,8 +1612,9 @@ public class TaxiModel { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); - result.lat = mLatitude; - result.lon = mLongitude; + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + result.lat = gcj02Location.getLatitude(); + result.lon = gcj02Location.getLongitude(); TaxiServiceManager.startServicePilotDone(mContext , mCurrentOCHOrder.orderNo , result @@ -1663,8 +1633,9 @@ public class TaxiModel { public void arrivedStartPoint() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); - result.lat = mLatitude; - result.lon = mLongitude; + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + result.lat = gcj02Location.getLatitude(); + result.lon = gcj02Location.getLongitude(); TaxiServiceManager.arrivedStartPoint(mContext , mCurrentOCHOrder.orderNo , result @@ -1684,8 +1655,9 @@ public class TaxiModel { public void arriveTerminal() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); - result.lat = mLatitude; - result.lon = mLongitude; + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + result.lat = gcj02Location.getLatitude(); + result.lon = gcj02Location.getLongitude(); TaxiServiceManager.arriveTerminal(mContext , mCurrentOCHOrder.orderNo , result @@ -1705,8 +1677,9 @@ public class TaxiModel { public void orderCompleted() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); - result.lat = mLatitude; - result.lon = mLongitude; + MogoLocation gcj02Location = OchLocationManager.getGCJ02Location(); + result.lat = gcj02Location.getLatitude(); + result.lon = gcj02Location.getLongitude(); TaxiServiceManager.orderCompleted(mContext , mCurrentOCHOrder.orderNo , result @@ -1724,7 +1697,7 @@ public class TaxiModel { // 登出 public void logout() { - LoginStatusManager.loginOut(mLatitude, mLongitude); + LoginStatusManager.loginOut(); } //导航去订单终点目的地 diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java index cbb3885cf6..d94db25dfe 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java @@ -9,8 +9,8 @@ import com.mogo.och.taxi.bean.OrderGrabRespBean; import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryReqBean; import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoReqBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; +import com.mogo.och.data.taxi.OrderQueryRouteInfoReqBean; +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean; import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean; import com.mogo.och.taxi.bean.OrderStatusUpdateReqBean; import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean; diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt index d709d0088f..49524e0060 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt @@ -9,6 +9,8 @@ import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformTry +import com.mogo.och.data.taxi.OrderQueryRouteInfoReqBean +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean import com.mogo.och.taxi.bean.* import io.reactivex.Observable @@ -39,7 +41,7 @@ object TaxiServiceManager { SharedPrefsMgr.getInstance().sn ) .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersInAndWaitService")) + .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersInAndWaitService",false)) } /** @@ -102,7 +104,7 @@ object TaxiServiceManager { ) ) .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderGrabStatus")) + .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderGrabStatus",false)) } /** @@ -292,7 +294,7 @@ object TaxiServiceManager { ) ) .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat")) + .subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat",false)) } /** diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java index 3eefaf7863..a5b5053315 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java @@ -43,6 +43,7 @@ public class NaviPresenter extends Presenter implements @Override public void onDestroy( @NonNull LifecycleOwner owner ) { + releaseListeners(); super.onDestroy( owner ); } @@ -54,24 +55,22 @@ public class NaviPresenter extends Presenter implements TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null); } - private void runOnUIThread( Runnable executor ) { - if ( executor == null ) { - return; - } - if ( Looper.myLooper() != Looper.getMainLooper() ) { - UiThreadHandler.post( executor ); - } else { - executor.run(); - } - } - @Override public void setLineMarker(LatLng startStation, LatLng endStation) { - runOnUIThread(() -> mView.setLineMarker(startStation,endStation)); + UiThreadHandler.post(new Runnable() { + @Override + public void run() { + if(mView!=null) { + mView.setLineMarker(startStation, endStation); + } + } + },UiThreadHandler.MODE.QUEUE); } @Override public void routeResult(List routeArrivied, List routeArriving, MogoLocation location) { - mView.routeResult(routeArrivied,routeArriving,location); + if(mView!=null) { + mView.routeResult(routeArrivied, routeArriving, location); + } } } diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index c4e69dd216..bf5dfe18db 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -20,16 +20,18 @@ import com.mogo.och.common.module.biz.login.ILoginCallback; import com.mogo.och.common.module.biz.login.LoginStatusEnum; import com.mogo.och.common.module.biz.login.LoginStatusManager; import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum; -import com.mogo.och.common.module.biz.login.RoleEnum; +import com.mogo.och.common.module.biz.order.OrderModel; import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager; +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager; +import com.mogo.och.common.module.manager.autopilot.line.LineManager; import com.mogo.och.common.module.voice.VoiceNotice; import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean; import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; import com.mogo.och.taxi.constant.TaxiConst; -import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum; import com.mogo.och.taxi.model.TaxiModel; import com.mogo.och.taxi.ui.TaxiFragment; @@ -284,10 +286,21 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS @RequiresApi(api = Build.VERSION_CODES.P) @Override public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) { + OchChainLogManager.writeChainLog("订单信息变化",order.toString()); + OrderModel.INSTANCE.invokeListener(order); CallerLogger.d(M_TAXI + TAG, "order = " + order.toString()); + LineManager.setLineId(order.lineId); if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus) { TaxiModel.getInstance().queryAutopilotStatus(true); TaxiModel.getInstance().setStation(); + UiThreadHandler.post(new Runnable() { + @Override + public void run() { + if(mView!=null) { + mView.setGuidShow(); + } + } + }, UiThreadHandler.MODE.QUEUE); } if (TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus) { @@ -299,6 +312,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS if(mView!=null) { mView.updateCtvAutopilotStatusTag(true); CallerOrderListenerManager.INSTANCE.invokeOrderStatus(true); + mView.setGuidHide(); } } }, UiThreadHandler.MODE.QUEUE); @@ -311,6 +325,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().startOrStopCalculateRouteInfo(false); TaxiModel.getInstance().cleanLineMarker(); TaxiModel.getInstance().cleanStation(); + LineManager.setLineId(-1); UiThreadHandler.post(new Runnable() { @Override public void run() { @@ -370,6 +385,10 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS @Override public void run() { if(mView!=null) { + OchChainLogManager.writeChainLog( + "到达目的地计算距离和时间", + "距离:"+routeInfo.distanceToEnd+" 时间:"+routeInfo.durationToEnd + ); mView.onCurrentOrderRouteInfoGot(routeInfo); } } diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index 54049cdb98..f370397d2b 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -8,6 +8,7 @@ import android.os.Handler; import android.os.Looper; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; @@ -15,6 +16,8 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.FragmentTransaction; @@ -31,14 +34,20 @@ 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.function.smp.view.SmallMapView; +import com.mogo.eagle.core.function.view.MapRoamView; import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.listener.IMogoMapListener; import com.mogo.och.common.module.utils.ResourcesUtils; import com.mogo.och.common.module.wigets.map.orderstatus.OrderStatusView; +import com.mogo.och.common.module.wigets.map.overmapview.OverMapDialog; +import com.mogo.och.common.module.wigets.map.switchvisual.VisualViewDirver; +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager; import com.mogo.och.taxi.R; +import me.jessyan.autosize.utils.AutoSizeUtils; + /** * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况 @@ -56,6 +65,7 @@ public abstract class BaseTaxiTabFragment全程 " + "" + dis + "" + " 公里" + ",总用时 " + "" + (int)Math.ceil( (double) duration/ 60) + "" + " 分钟"; @@ -498,6 +505,10 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment TaxiOrderStatusEnum ochStatus = TaxiOrderStatusEnum.valueOf(status); switch (ochStatus) { case OnTheWayToStart: + if(dialog!=null&&dialog.isShowing()) { + dialog.dismiss(); + } + dialog = null; mOrderCancel.setVisibility(View.VISIBLE); VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_new_order)); mTtsLessThan200Tip = 0; @@ -509,6 +520,10 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment setOrRemoveMapMaker(true, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker); break; case Cancel: + if(dialog!=null&&dialog.isShowing()) { + dialog.dismiss(); + } + dialog = null; mCurrentOrder = null; mTtsLessThan200Tip = 0; isFirstStartAutopilotDone = true; @@ -520,6 +535,10 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment break; case ArriveAtStart: case UserArriveAtStart: + if(dialog!=null&&dialog.isShowing()) { + dialog.dismiss(); + } + dialog = null; mTtsLessThan200Tip = 0; isFirstStartAutopilotDone = true; mOrderCancel.setVisibility(View.VISIBLE); @@ -533,6 +552,10 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment setOrRemoveMapMaker(true, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker); break; case OnTheWayToEnd: + if(dialog!=null&&dialog.isShowing()) { + dialog.dismiss(); + } + dialog = null; mOrderCancel.setVisibility(View.VISIBLE); if (mTaxiFragment != null) { showNaviToEndStationFragment(false); @@ -541,6 +564,12 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment setOrRemoveMapMaker(true, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker); break; case ArriveAtEnd: + if(dialog==null){ + dialog = new ItinerarySummaryDialog(getContext(),true,R.style.summary_dialog); + } + if(!dialog.isShowing()) { + dialog.show(); + } mTtsLessThan200Tip = 0; mOrderCancel.setVisibility(View.GONE); //VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_order_auto_arrive_end_tip)); @@ -549,6 +578,10 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment setOrRemoveMapMaker(false, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker); break; case JourneyCompleted: + if(dialog!=null&&dialog.isShowing()) { + dialog.dismiss(); + } + dialog = null; mCurrentOrder = null; mTtsLessThan200Tip = 0; isFirstStartAutopilotDone = true; diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index dc46c9fc7f..b837a3510f 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -15,7 +15,6 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.fragment.app.FragmentTransaction; -import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -23,9 +22,9 @@ import com.mogo.map.overlay.IMoGoOverlayManager; import com.mogo.och.common.module.biz.login.LoginStatusManager; import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum; import com.mogo.och.taxi.R; -import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean; import com.mogo.och.taxi.model.TaxiModel; import com.mogo.och.taxi.presenter.TaxiPresenter; import com.mogo.och.taxi.utils.TPRouteDataTestUtils; diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt index 421c233e39..8225b2891f 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt @@ -21,9 +21,9 @@ import com.amap.api.maps.model.Polyline import com.amap.api.maps.model.PolylineOptions 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.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.taxi.R import com.mogo.och.taxi.utils.TaxiMapAssetStyleUtil @@ -68,13 +68,13 @@ class TaxiMapDirectionView @JvmOverloads constructor( initAMapView() // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 3, this) + OchLocationManager.addGCJ02Listener(TAG, 3, this) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) } private fun initAMapView() { diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiOrderCancelDialog.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiOrderCancelDialog.java index 8acfaee0be..43ba8495ed 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiOrderCancelDialog.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiOrderCancelDialog.java @@ -25,7 +25,7 @@ import androidx.annotation.RequiresApi; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum; import com.mogo.och.taxi.R; import com.mogo.och.taxi.constant.TaxiOrderCancelReasons; diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java index 467b7ffd03..a948351547 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java @@ -35,7 +35,7 @@ import com.google.android.material.tabs.TabLayout; import com.mogo.commons.mvp.MvpDialogFragment; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.common.module.utils.DateTimeUtil; -import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum; import com.mogo.och.taxi.R; import com.mogo.och.taxi.bean.OrderQueryRespBean; import com.mogo.och.taxi.constant.TaxiOrderTypeEnum; diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java index 25e5d02ec1..c006376d84 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java @@ -23,12 +23,11 @@ import com.google.android.material.tabs.TabLayout; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.taxi.R; import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean; import java.util.ArrayList; import java.util.List; -import me.jessyan.autosize.AutoSize; import me.jessyan.autosize.utils.AutoSizeUtils; /** diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java index e48c6c56c3..29057170d9 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java @@ -9,7 +9,7 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils; import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager; import com.mogo.och.taxi.bean.OrderQueryRespBean; import com.mogo.och.taxi.constant.TaxiConst; -import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum; import com.mogo.och.taxi.model.TaxiModel; import java.util.concurrent.TimeUnit; diff --git a/OCH/taxi/driver/src/main/res/drawable-nodpi/taxi_overmap_tag.png b/OCH/taxi/driver/src/main/res/drawable-nodpi/taxi_overmap_tag.png new file mode 100644 index 0000000000..b0bcc4fc03 Binary files /dev/null and b/OCH/taxi/driver/src/main/res/drawable-nodpi/taxi_overmap_tag.png differ diff --git a/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml b/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml index 4ec79eb3f4..bbf42529ab 100644 --- a/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml +++ b/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml @@ -27,7 +27,7 @@ android:layout_height="@dimen/dp_269" android:layout_marginStart="@dimen/dp_10" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/taxi_speed_contain"> + app:layout_constraintEnd_toEndOf="@+id/viewLimitingVelocity" + app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity" + app:layout_goneMarginEnd="40dp" + app:layout_goneMarginTop="@dimen/dp_236" /> + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="@dimen/dp_144" + android:layout_marginStart="@dimen/dp_19" + android:layout_marginBottom="@dimen/dp_16" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" /> - - - + app:layout_constraintLeft_toRightOf="@id/module_mogo_och_operation_status" /> - - + + + + + + + android:layout_height="match_parent" /> + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/OCH/taxi/driver/src/main/res/layout/taxi_being_order.xml b/OCH/taxi/driver/src/main/res/layout/taxi_being_order.xml index 76cd62f84a..b5de2ba236 100644 --- a/OCH/taxi/driver/src/main/res/layout/taxi_being_order.xml +++ b/OCH/taxi/driver/src/main/res/layout/taxi_being_order.xml @@ -47,7 +47,7 @@ android:id="@+id/module_och_taxi_order_status_station_2" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="gone" + android:paddingLeft="40dp" android:paddingRight="40dp" app:layout_constraintBottom_toTopOf="@+id/module_och_taxi_order_server_status_tv"> diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java index e4721b1e37..4e1f5ce7b8 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java @@ -1,7 +1,7 @@ package com.mogo.och.taxi.passenger.bean; import com.mogo.eagle.core.data.BaseData; -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean; +import com.mogo.och.data.taxi.BaseOrderBean; import java.util.List; import java.util.Objects; @@ -61,6 +61,11 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData { public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“” public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 + @Override + public String getEndSiteAddr() { + return endSiteAddr; + } + @Override public int compareTo(Result o) { boolean isEqual = this.orderNo.equals(o.orderNo); diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt index 43f917bf55..5b036a05ed 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt @@ -16,4 +16,5 @@ interface IOCHTaxiPassengerOrderStatusCallback { fun onDriverHasCheckedPilotCondition(isBoarded: Boolean){} fun onMessageGo2OverMapview(){} + fun onCurrentOrderDistAndduration(distanceToEnd: Long, durationToEnd: Long){} } \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/AutopilotManager.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/AutopilotManager.kt index 02494c6afb..48cd54da14 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/AutopilotManager.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/AutopilotManager.kt @@ -8,7 +8,6 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener 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.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.StringUtils @@ -18,15 +17,15 @@ import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.utils.PinYinUtil import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager -import java.lang.StringBuilder object AutopilotManager : IOchAutopilotStatusListener { @@ -53,7 +52,7 @@ object AutopilotManager : IOchAutopilotStatusListener { ToastUtils.showShort("当前订单不存在或异常!") return "当前订单不存在或异常!" } - if (TaxiPassengerModel.currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.code) { + if (TaxiPassengerModel.currentOCHOrder!!.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code) { startServicePilotDone() } //1、判断轨迹Id是否可用 @@ -77,10 +76,10 @@ object AutopilotManager : IOchAutopilotStatusListener { return "启动自动驾驶不满足条件" } //3、距离轨迹15m计算 - var resion = TrajectoryAndDistanceManager.canStartAutopilot(TaxiPassengerModel.currentOCHOrder!!.lineId) + var resion = OchAutoPilotManager.canStartAutoPilot(TaxiPassengerModel.currentOCHOrder!!.lineId) if(TrajectoryAndDistanceManager.errorTypeNoneLineId.equals(resion)){ TaxiPassengerModel.setStation(); - resion = TrajectoryAndDistanceManager.canStartAutopilot(TaxiPassengerModel.currentOCHOrder!!.lineId); + resion = OchAutoPilotManager.canStartAutoPilot(TaxiPassengerModel.currentOCHOrder!!.lineId); } if (!StringUtils.isEmpty(resion)) { ToastUtils.showShort(resion) @@ -88,11 +87,7 @@ object AutopilotManager : IOchAutopilotStatusListener { return resion } // 4、ssm 给出数据 - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { - ToastUtils.showLong( - OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + - ", 请稍候重试" - ) + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { TaxiPassengerAnalyticsManager.triggerUnableStartAPReasonEvent( TaxiPassengerModel.currentOCHOrder!!.startSiteAddr, TaxiPassengerModel.currentOCHOrder!!.endSiteAddr, @@ -129,8 +124,8 @@ object AutopilotManager : IOchAutopilotStatusListener { false, TaxiPassengerModel.currentOCHOrder!!.startSiteAddr, TaxiPassengerModel.currentOCHOrder!!.endSiteAddr, - TaxiPassengerModel.currentOCHOrder!!.orderNo.toInt(), - TaxiPassengerModel.currentOCHOrder!!.lineId.toString(), + TaxiPassengerModel.currentOCHOrder!!.lineId.toInt(), + TaxiPassengerModel.currentOCHOrder!!.orderNo, System.currentTimeMillis() ) return "" @@ -209,14 +204,14 @@ object AutopilotManager : IOchAutopilotStatusListener { // 启动自驾成功 when (state) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { - if (TaxiPassengerModel.currentOCHOrder != null && TaxiPassengerModel.curOrderStatus === TaxiPassengerOrderStatusEnum.UserArriveAtStart) { + if (TaxiPassengerModel.currentOCHOrder != null && TaxiPassengerModel.curOrderStatus === TaxiOrderStatusEnum.UserArriveAtStart) { TaxiPassengerAnalyticsManager.triggerStartAutopilotEvent( false, true, TaxiPassengerModel.currentOCHOrder!!.startSiteAddr, TaxiPassengerModel.currentOCHOrder!!.endSiteAddr, - TaxiPassengerModel.currentOCHOrder!!.orderNo.toInt(), - TaxiPassengerModel.currentOCHOrder!!.lineId.toString(), + TaxiPassengerModel.currentOCHOrder!!.lineId.toInt(), + TaxiPassengerModel.currentOCHOrder!!.orderNo, System.currentTimeMillis() ) //startServicePilotDone() @@ -232,7 +227,7 @@ object AutopilotManager : IOchAutopilotStatusListener { fun startServicePilotDone() { if (TaxiPassengerModel.currentOCHOrder == null) return val result = TaxiPassengerStartReqBean.Result() - val currentLocation = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val currentLocation = OchLocationManager.getGCJ02Location() result.lat = currentLocation.latitude result.lon = currentLocation.longitude TaxiPassengerServiceManager.startServicePilotDone( diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt index 0c41cbf42e..7c7022e5f0 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt @@ -33,10 +33,11 @@ import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum.Companion.valueOf +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum.Companion.valueOf import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.common.module.biz.order.OrderModel +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager import java.util.concurrent.ConcurrentHashMap @@ -91,7 +92,6 @@ object TaxiPassengerModel { */ fun release() { startOrStopOrderLoop(false) - //startOrStopQueryOrderRemaining(false) releaseListeners() } @@ -180,7 +180,7 @@ object TaxiPassengerModel { object : OchCommonServiceCallback { override fun onSuccess(data: TaxiPassengerOrderQueryRespBean) { if (data.data != null && currentOCHOrder != null && currentOCHOrder!!.orderNo == data.data.orderNo) { - if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.code) { + if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code || data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code || data.data.orderStatus == TaxiOrderStatusEnum.None.code) { currentOCHOrder = data.data orderStatusChange() currentOCHOrder = null @@ -197,11 +197,11 @@ object TaxiPassengerModel { } // 获取当前订单状态 - val curOrderStatus: TaxiPassengerOrderStatusEnum + val curOrderStatus: TaxiOrderStatusEnum get() { val order: TaxiPassengerOrderQueryRespBean.Result = currentOCHOrder - ?: return TaxiPassengerOrderStatusEnum.None + ?: return TaxiOrderStatusEnum.None return valueOf(order.orderStatus) } @@ -259,7 +259,7 @@ object TaxiPassengerModel { phoneTail, object : OchCommonServiceCallback { override fun onSuccess(data: TaxiPassengerBaseRespBean) { if (data.code == 0 && currentOCHOrder != null) { - currentOCHOrder!!.orderStatus = TaxiPassengerOrderStatusEnum.UserArriveAtStart.code + currentOCHOrder!!.orderStatus = TaxiOrderStatusEnum.UserArriveAtStart.code //乘客验证成功,更新订单状态为 "乘客已上车", 立马弹出乘客开始行程页面,不再等待轮询 orderStatusChange() VoiceNotice.showNotice("验证成功!关闭车门并佩戴安全带后开启行程吧!", AIAssist.LEVEL2) @@ -284,15 +284,15 @@ object TaxiPassengerModel { private fun orderStatusChangeInner() { when (curOrderStatus) { - TaxiPassengerOrderStatusEnum.OnTheWayToStart -> { + TaxiOrderStatusEnum.OnTheWayToStart -> { } - TaxiPassengerOrderStatusEnum.ArriveAtStart -> { + TaxiOrderStatusEnum.ArriveAtStart -> { } - TaxiPassengerOrderStatusEnum.UserArriveAtStart -> { + TaxiOrderStatusEnum.UserArriveAtStart -> { //开启轮询司机是否已准备好开启自动驾驶的环境 setStation() } - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> { + TaxiOrderStatusEnum.OnTheWayToEnd -> { CallerFuncBizManager.bizProvider.queryV2XEvents() //全览模式的V2X事件轮询开始 //startOrStopQueryOrderRemaining(true) AutopilotManager.updateAutopilotControlParameters() @@ -300,24 +300,24 @@ object TaxiPassengerModel { setStation() CallerOrderListenerManager.invokeOrderStatus(true) } - TaxiPassengerOrderStatusEnum.ArriveAtEnd -> { + TaxiOrderStatusEnum.ArriveAtEnd -> { AutopilotManager.clearAutopilotControlParameters() //startOrStopQueryOrderRemaining(false) CallerOrderListenerManager.invokeOrderStatus(false) cleanStation() } - TaxiPassengerOrderStatusEnum.JourneyCompleted -> { + TaxiOrderStatusEnum.JourneyCompleted -> { AutopilotManager.clearAutopilotControlParameters() //startOrStopQueryOrderRemaining(false) cleanStation() } - TaxiPassengerOrderStatusEnum.Cancel -> { + TaxiOrderStatusEnum.Cancel -> { AutopilotManager.clearAutopilotControlParameters() //startOrStopQueryOrderRemaining(false) startOrStopReadyToAutopilotLoop(false) cleanStation() } - TaxiPassengerOrderStatusEnum.None -> TODO() + TaxiOrderStatusEnum.None -> TODO() } } @@ -376,4 +376,23 @@ object TaxiPassengerModel { TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) } + fun queryOrderRouteInfo() { + if (currentOCHOrder == null) return + TaxiPassengerServiceManager.queryOrderRouteInfo( + currentOCHOrder!!.orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: OrderQueryRouteInfoRespBean) { + if (data.data != null && currentOCHOrder != null ) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderDistAndduration(data.data.distanceToEnd,data.data.durationToEnd) + } + } + } + + override fun onFail(code: Int, msg: String) {} + } + + ) + } + } \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.kt index e5953babe4..1c9fdbdf4b 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.kt @@ -2,6 +2,8 @@ package com.mogo.och.taxi.passenger.network import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.och.data.taxi.OrderQueryRouteInfoReqBean +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean @@ -90,4 +92,18 @@ internal interface TaxiPassengerServiceApi { @Header("ticket") ticket: String= SharedPrefsMgr.getInstance().token, @Body data: TaxiPassengerStartReqBean ): Observable + + /** + * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间) + * @param data + * @return + */ + @Headers("Content-type:application/json;charset=UTF-8") // @POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" ) + @POST("/autopilot-car-hailing/order/v2/driver/taxi/routeInfo/query") + fun queryOrderRouteInfo( + @Header("appId") appId: String?, + @Header("ticket") ticket: String?, + @Body data: OrderQueryRouteInfoReqBean? + ): Observable + } \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.kt index c9a850c025..6e95ef73de 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.kt @@ -1,8 +1,10 @@ package com.mogo.och.taxi.passenger.network import android.content.Context +import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean @@ -14,6 +16,8 @@ import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformTry +import com.mogo.och.data.taxi.OrderQueryRouteInfoReqBean +import com.mogo.och.data.taxi.OrderQueryRouteInfoRespBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean @@ -124,5 +128,27 @@ object TaxiPassengerServiceManager { .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderById")) } + /** + * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间) + * @param context + * @param orderNo + * @param callback + */ + @JvmStatic + fun queryOrderRouteInfo(orderNo: String?, + callback: OchCommonServiceCallback? + ) { + mOCHTaxiServiceApi.queryOrderRouteInfo( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + OrderQueryRouteInfoReqBean( + SharedPrefsMgr.getInstance().sn, orderNo + ) + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRouteInfo")) + } + + } \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.kt index 2253f7aeb1..f2239cc4a5 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.kt @@ -10,13 +10,14 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.taxi.passenger.model.AutopilotManager import com.mogo.och.taxi.passenger.model.TaxiPassengerModel import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean -import com.mogo.och.taxi.passenger.ui.model.order.OrderListener -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager /** * @author: wangmingjun @@ -65,7 +66,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : order?.let { setItineraryVisibility() when (TaxiPassengerModel.curOrderStatus) { - TaxiPassengerOrderStatusEnum.OnTheWayToStart -> { + TaxiOrderStatusEnum.OnTheWayToStart -> { // 10 接驾中 mView?.showOrHideCheckAndStartAutopilotView(3) @@ -73,19 +74,19 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : overMapViewClear() } - TaxiPassengerOrderStatusEnum.ArriveAtStart -> { + TaxiOrderStatusEnum.ArriveAtStart -> { // 20 司机到达上车点 mView?.showOrHideCheckAndStartAutopilotView(0) overMapViewClear() } - TaxiPassengerOrderStatusEnum.UserArriveAtStart -> { + TaxiOrderStatusEnum.UserArriveAtStart -> { // 30 乘客到达上车点 mView?.showOrHideCheckAndStartAutopilotView(1) overMapViewClear() } - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> { + TaxiOrderStatusEnum.OnTheWayToEnd -> { // 服务中(去往目的地) mView?.showOrHideArrivedEndLayout(isShow = false) mView?.showOrHideCheckAndStartAutopilotView(2) @@ -93,18 +94,18 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : overMapViewShow() } - TaxiPassengerOrderStatusEnum.ArriveAtEnd -> { + TaxiOrderStatusEnum.ArriveAtEnd -> { // 50 到达终点 乘客可以评价 mView?.showOrHideArrivedEndLayout(true) - overMapViewClear() + getOrderRouteInfo() } - TaxiPassengerOrderStatusEnum.JourneyCompleted -> { + TaxiOrderStatusEnum.JourneyCompleted -> { // 60 行程完成 mView?.showOrHideCheckAndStartAutopilotView(3) mView?.showOrHideArrivedEndLayout(false) overMapViewClear() } - TaxiPassengerOrderStatusEnum.Cancel -> { + TaxiOrderStatusEnum.Cancel -> { // 70 取消订单 mView?.showOrHideCheckAndStartAutopilotView(3) mView?.showOrHideArrivedEndLayout(isShow = false) @@ -115,6 +116,10 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : } } + fun getOrderRouteInfo() { + TaxiPassengerModel.queryOrderRouteInfo() + } + private fun overMapViewShow(){ CallerFuncBizManager.bizProvider.getAllV2XEvents() } @@ -133,14 +138,14 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : fun setItineraryVisibility() { UiThreadHandler.post { when (TaxiPassengerModel.curOrderStatus) { - TaxiPassengerOrderStatusEnum.None, - TaxiPassengerOrderStatusEnum.OnTheWayToStart, - TaxiPassengerOrderStatusEnum.ArriveAtStart, - TaxiPassengerOrderStatusEnum.JourneyCompleted, - TaxiPassengerOrderStatusEnum.ArriveAtEnd, - TaxiPassengerOrderStatusEnum.Cancel -> mView?.showOrHideServingOrderFragment(false) - TaxiPassengerOrderStatusEnum.UserArriveAtStart, - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> mView?.showOrHideServingOrderFragment(true) + TaxiOrderStatusEnum.None, + TaxiOrderStatusEnum.OnTheWayToStart, + TaxiOrderStatusEnum.ArriveAtStart, + TaxiOrderStatusEnum.JourneyCompleted, + TaxiOrderStatusEnum.ArriveAtEnd, + TaxiOrderStatusEnum.Cancel -> mView?.showOrHideServingOrderFragment(false) + TaxiOrderStatusEnum.UserArriveAtStart, + TaxiOrderStatusEnum.OnTheWayToEnd -> mView?.showOrHideServingOrderFragment(true) } } } @@ -149,6 +154,14 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : mView?.showOverMapView() } + override fun onCurrentOrderDistAndduration(distanceToEnd: Long, durationToEnd: Long) { + OchChainLogManager.writeChainLog( + "到达目的地计算距离和时间", + "距离:${distanceToEnd} 时间:${durationToEnd}" + ) + mView?.showDuringAndDistance(distanceToEnd.toFloat(),durationToEnd.toFloat()) + } + companion object { private val TAG = BaseTaxiPassengerPresenter::class.java.simpleName } diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt index f7123f20e0..51661ea8b8 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.kt @@ -9,9 +9,8 @@ import android.view.View import com.alibaba.android.arouter.launcher.ARouter import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.voice.AIAssist -import com.mogo.eagle.core.data.constants.MogoServicePaths -import com.mogo.eagle.core.function.api.hmi.view.IStatusViewLayout import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P @@ -30,6 +29,7 @@ import com.mogo.och.taxi.passenger.ui.bar.LeftBarView import com.mogo.och.taxi.passenger.ui.bottom.BottomBar import com.mogo.och.taxi.passenger.ui.checkstartautopilot.ChekAndStartAutopilotView import com.mogo.och.taxi.passenger.ui.bar.RightBarView +import com.mogo.och.taxi.passenger.ui.debug.DebugCallback import com.mogo.och.taxi.passenger.ui.statusview.StatusBarView import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.taxi_p_base_fragment.* @@ -44,7 +44,7 @@ import kotlinx.android.synthetic.main.taxi_p_base_fragment.* */ class TaxiPassengerBaseFragment() : MvpFragment(), IMogoMapListener, - TaxiPassengerTaxiView { + TaxiPassengerTaxiView, DebugCallback { private var statusBarView: StatusBarView? = null @@ -66,7 +66,7 @@ class TaxiPassengerBaseFragment() : super.initViews(savedInstanceState) mapBizView!!.onCreate(savedInstanceState) overMapView.onCreateView(savedInstanceState) - overMapView.hideResetView() + //overMapView.hideResetView() val commonService = ARouter.getInstance().build(OchCommonConst.TAXI_PASSENGER).navigation(); if(commonService is CommonService){ @@ -87,7 +87,7 @@ class TaxiPassengerBaseFragment() : } }) - lbv_go2_center.setOrderIdCallback(object :LeftBarView.LeftBarCallback{ + lbv_go2_center.setOrderIdCallback(object : LeftBarView.LeftBarCallback{ override fun setGo2CenterClick() { when (bottom.getCurrentPage()) { BottomBar.SelectView.PRECISIONMAP -> { @@ -97,7 +97,7 @@ class TaxiPassengerBaseFragment() : } } BottomBar.SelectView.OVERMAPVIEW -> { - overMapView.displayCustomOverView() + //overMapView.displayCustomOverView() } else -> {} @@ -113,6 +113,7 @@ class TaxiPassengerBaseFragment() : override fun onApplyClick(selectItem: BottomBar.SelectView) { when (selectItem) { BottomBar.SelectView.PRECISIONMAP -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.VISIBLE) overMapView.visibility = View.GONE mapBizView.visibility = View.VISIBLE presenter?.setItineraryVisibility() @@ -126,12 +127,14 @@ class TaxiPassengerBaseFragment() : } rbv_setting_music.setShowOnlySetting(0) lbv_go2_center.visibility = View.VISIBLE + lbv_go2_center.showAngle() pcnActionView.visibility = View.VISIBLE CallerHmiManager.showTrafficLightView() infoVideoView.visibility = View.GONE CallerHmiManager.showTurnLightView() } BottomBar.SelectView.OVERMAPVIEW -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) overMapView.visibility = View.VISIBLE mapBizView.visibility = View.GONE presenter?.setItineraryVisibility() @@ -139,13 +142,15 @@ class TaxiPassengerBaseFragment() : romaPView.updateVisible(false) romaDistanceView.visibility = View.GONE rbv_setting_music.setShowOnlySetting(0) - lbv_go2_center.visibility = View.VISIBLE + lbv_go2_center.visibility = View.GONE + //lbv_go2_center.showOnlyCenter() pcnActionView.visibility = View.VISIBLE CallerHmiManager.showTrafficLightView() infoVideoView.visibility = View.GONE CallerHmiManager.showTurnLightView() } BottomBar.SelectView.VIDEO -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) overMapView.visibility = View.GONE mapBizView.visibility = View.GONE presenter?.setItineraryVisibility() @@ -166,7 +171,7 @@ class TaxiPassengerBaseFragment() : } }) - arrivedView.arrivedVisilityChangeListenr = object :ArrivedView.ArrivedVisilityChangeListenr{ + arrivedView.arrivedVisilityChangeListenr = object : ArrivedView.ArrivedVisilityChangeListenr{ override fun isShow(show: Boolean) { CallerLogger.d(M_TAXI_P + TAG, "arrived ${show}") if(arrivedView.visibility==View.GONE&&chekAndStartAutopilotView.visibility==View.GONE){ @@ -236,7 +241,7 @@ class TaxiPassengerBaseFragment() : * * @param isShow */ - fun showOrHideServingOrderFragment(isShow: Boolean) { + override fun showOrHideServingOrderFragment(isShow: Boolean) { when (bottom.getCurrentPage()) { BottomBar.SelectView.OVERMAPVIEW, BottomBar.SelectView.PRECISIONMAP -> { if (isShow) { @@ -259,7 +264,7 @@ class TaxiPassengerBaseFragment() : - fun showOrHideCheckAndStartAutopilotView(status:Int){ + override fun showOrHideCheckAndStartAutopilotView(status:Int){ UiThreadHandler.post { arrivedView.visibility = View.GONE when (status) { @@ -267,19 +272,32 @@ class TaxiPassengerBaseFragment() : if(chekAndStartAutopilotView.visibility == View.GONE){ showOrHide(false,"显示手机号check") } + bottom.setBagVisable(BottomBar.SelectView.OVERMAPVIEW,View.VISIBLE) chekAndStartAutopilotView.aniCheckAndStartAutopilot(true,0) + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) } 1 -> { if(chekAndStartAutopilotView.visibility == View.GONE){ showOrHide(false,"显示启动自动驾驶") } chekAndStartAutopilotView.aniCheckAndStartAutopilot(true,1) + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) } 2 -> { chekAndStartAutopilotView.aniCheckAndStartAutopilot(false,2) + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) } 3 -> { chekAndStartAutopilotView.visibility = View.GONE + when (bottom.getCurrentPage()) { + BottomBar.SelectView.PRECISIONMAP -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.VISIBLE) + } + else ->{ + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) + } + } + } else -> {} } @@ -305,7 +323,7 @@ class TaxiPassengerBaseFragment() : * * @param isShow true 展示 false 隐藏 */ - fun showOrHideArrivedEndLayout(isShow: Boolean) { + override fun showOrHideArrivedEndLayout(isShow: Boolean) { // chekAndStartAutopilotView.visibility = View.GONE evaluate.visibility = View.GONE if (isShow) { @@ -316,6 +334,7 @@ class TaxiPassengerBaseFragment() : arrivedView.setDataAndStartAnimation() VoiceNotice.showNotice("已到达目的地,带好随身物品,右侧下车更安全!期待下次再见", AIAssist.LEVEL2) } + bottom.setBagVisable(BottomBar.SelectView.OVERMAPVIEW,View.GONE) } else { if(arrivedView.visibility!=View.GONE) { showOrHide(true, "隐藏到达目的地") @@ -329,8 +348,8 @@ class TaxiPassengerBaseFragment() : } fun showOrHideOverMapView() { - overMapView?.clearV2XMarkers() - overMapView?.clearCustomPolyline() +// overMapView?.clearV2XMarkers() + overMapView?.clearAllMarkersAndPolyline() } @@ -467,10 +486,14 @@ class TaxiPassengerBaseFragment() : arrivedView.preLoadImages() } - fun setEvaluateView(){ + override fun setEvaluateView(){ evaluate.visibility = View.VISIBLE } + fun showDuringAndDistance(distanceToEnd: Float, durationToEnd: Float) { + arrivedView.setMileageAndDuration(distanceToEnd,durationToEnd) + } + companion object { @JvmField diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt index bd995ffa64..0185ce5052 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt @@ -1,10 +1,10 @@ package com.mogo.och.taxi.passenger.ui.checkstartautopilot import androidx.lifecycle.ViewModel -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean -import com.mogo.och.taxi.passenger.ui.model.order.OrderListener -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel class ChekAndStartAutopilotViewModel : ViewModel(), OrderListener { @@ -33,10 +33,10 @@ class ChekAndStartAutopilotViewModel : ViewModel(), OrderListener { override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { when (order?.orderStatus) { - TaxiPassengerOrderStatusEnum.ArriveAtStart.code -> { + TaxiOrderStatusEnum.ArriveAtStart.code -> { // 显示手机号验证 } - TaxiPassengerOrderStatusEnum.UserArriveAtStart.code -> { + TaxiOrderStatusEnum.UserArriveAtStart.code -> { // 显示启动自驾 } else -> { diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugView.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugView.kt deleted file mode 100644 index 6e6846488e..0000000000 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugView.kt +++ /dev/null @@ -1,103 +0,0 @@ -package com.mogo.och.taxi.passenger.ui.debug - -import android.content.Context -import android.os.SystemClock -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.fragment.app.FragmentActivity -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.devatools.CallerDevaToolsManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager -import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager -import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.util.ActivityUtils -import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment -import com.mogo.och.taxi.passenger.R -import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment -import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_arrive -import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_evaluate -import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_order_info -import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_phone_check -import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_start_autopilot -import kotlinx.android.synthetic.main.taxi_p_debug.view.tv_show_start_autopilot_success -import kotlinx.android.synthetic.main.taxi_p_statusview.view.iv_biz_icon -import me.jessyan.autosize.utils.AutoSizeUtils -import org.greenrobot.eventbus.EventBus -import org.greenrobot.eventbus.Subscribe -import org.greenrobot.eventbus.ThreadMode -import java.lang.ref.WeakReference - -class DebugView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener { - - companion object { - const val TAG = "DebugView" - } - - init { - LayoutInflater.from(context).inflate(R.layout.taxi_p_debug, this, true) - visibility = GONE - } - - private var fragment:TaxiPassengerBaseFragment?=null - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - - EventBus.getDefault().register(this) - - val activityByContext = ActivityUtils.getActivityByContext(context) - if(activityByContext is FragmentActivity){ - val fragment = - activityByContext.supportFragmentManager.findFragmentByTag(TaxiPassengerBaseFragment.TAG) - if(fragment is TaxiPassengerBaseFragment){ - this.fragment = fragment - } - } - - tv_show_arrive.onClick { - fragment?.showOrHideArrivedEndLayout(true) - } - tv_show_phone_check.onClick { - fragment?.showOrHideCheckAndStartAutopilotView(0) - } - tv_show_start_autopilot.onClick { - fragment?.showOrHideCheckAndStartAutopilotView(1) - } - tv_show_start_autopilot_success.onClick { - fragment?.showOrHideCheckAndStartAutopilotView(2) - } - tv_show_order_info.onClick { - fragment?.showOrHideServingOrderFragment(true) - fragment?.preLoadArrivedImages() - } - tv_show_evaluate.onClick { - fragment?.setEvaluateView() - } - } - @Subscribe(threadMode = ThreadMode.MAIN) - fun changeOverview(debugEvent: DebugEvent) { - if(visibility== VISIBLE){ - visibility = GONE - }else{ - visibility = VISIBLE - } - } - - - - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - EventBus.getDefault().unregister(this) - } - -} - diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/OrderInfoViewModel.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/OrderInfoViewModel.kt index b6185f3725..8fdaa1aa27 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/OrderInfoViewModel.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/OrderInfoViewModel.kt @@ -7,11 +7,11 @@ import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.NumberFormatUtil import com.mogo.och.taxi.passenger.R import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.taxi.passenger.model.TaxiPassengerModel -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean -import com.mogo.och.taxi.passenger.ui.model.order.OrderListener -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel import kotlin.math.ceil class OrderInfoViewModel: ViewModel(), IOCHTaxiPassengerOrderStatusCallback, OrderListener { @@ -78,7 +78,7 @@ class OrderInfoViewModel: ViewModel(), IOCHTaxiPassengerOrderStatusCallback, Ord } } when (TaxiPassengerModel.curOrderStatus) { - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> { + TaxiOrderStatusEnum.OnTheWayToEnd -> { } else ->{ diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/speed/SpeedView.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/speed/SpeedView.kt index 76d85e8510..19075351a9 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/speed/SpeedView.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/speed/SpeedView.kt @@ -7,8 +7,8 @@ import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout 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.util.UiThreadHandler +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.taxi.passenger.R import kotlinx.android.synthetic.main.taxt_p_speed.view.actv_speed_value import kotlin.math.abs @@ -32,9 +32,9 @@ class SpeedView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { override fun onVisibilityAggregated(isVisible: Boolean) { super.onVisibilityAggregated(isVisible) if(isVisible){ - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 3, this) + OchLocationManager.addGCJ02Listener(TAG, 3, this) }else{ - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) } } diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/StatusBarView.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/StatusBarView.kt deleted file mode 100644 index c56795f23f..0000000000 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/StatusBarView.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.mogo.och.taxi.passenger.ui.statusview - -import android.content.Context -import android.os.SystemClock -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.fragment.app.FragmentActivity -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.devatools.CallerDevaToolsManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager -import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager -import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.util.ActivityUtils -import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener -import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager -import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment -import com.mogo.och.taxi.passenger.R -import com.mogo.och.taxi.passenger.ui.debug.DebugEvent -import kotlinx.android.synthetic.main.taxi_p_statusview.view.iv_biz_icon -import kotlinx.android.synthetic.main.taxi_p_statusview.view.vShowDebugView -import me.jessyan.autosize.utils.AutoSizeUtils -import org.greenrobot.eventbus.EventBus -import java.lang.ref.WeakReference - -class StatusBarView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IOchAutopilotStatusListener { - - companion object { - const val TAG = "StatusBarView" - private const val COUNTS = 4 // 点击次数 - private const val DURATION: Long = 1000 // 规定有效时间 - const val bizz = "bizz" // 业务debug - const val debugView = "debugView" // 业务debug - } - - private var debugViewWatchDogFragment: WeakReference? = null - - private var mHits = LongArray(COUNTS) - - private fun continuousClick(type:String) { - if (ToggleDebugView.toggleDebugView.isShowIng()) { - ToggleDebugView.toggleDebugView.dismiss() - return - } - //每次点击时,数组向前移动一位 - System.arraycopy(mHits, 1, mHits, 0, mHits.size - 1) - //为数组最后一位赋值 - mHits[mHits.size - 1] = SystemClock.uptimeMillis() - if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) { - mHits = LongArray(COUNTS) //重新初始化数组 - showDebugView() - } - } - - init { - LayoutInflater.from(context).inflate(R.layout.taxi_p_statusview, this, true) - setBackgroundResource(R.drawable.taxi_p_status_bg) - isClickable = true - isFocusable = true - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - post { - val params: ViewGroup.LayoutParams = layoutParams - params.height = AutoSizeUtils.dp2px(context,120f) - layoutParams = params - } - - OchAutoPilotStatusListenerManager.addListener(TAG, this) - - iv_biz_icon.setOnClickListener { continuousClick(debugView) } - vShowDebugView.setOnLongClickListener { - EventBus.getDefault().post(DebugEvent()) - false - } - - } - - private fun showDebugView() { - if (debugViewWatchDogFragment?.get() == null) { - debugViewWatchDogFragment = WeakReference(DebugViewWatchDogFragment.newInstance()) - } - val debugViewFragment = debugViewWatchDogFragment?.get() - if (ActivityUtils.getTopActivity() is FragmentActivity) { - val fragmentActivity = ActivityUtils.getTopActivity() as FragmentActivity - DebugViewWatchDogFragment.showDebugView(fragmentActivity.supportFragmentManager,fragmentActivity.supportFragmentManager,debugViewFragment) - } - - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - CallerHmiViewControlListenerManager.removeListener(TAG) - CallerSkinModeListenerManager.removeListener(TAG) - CallerDevaToolsManager.hideStatusBar() - } - -} - diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/TaxiPBlueToothView.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/TaxiPBlueToothView.kt deleted file mode 100644 index b27eeb0c21..0000000000 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/TaxiPBlueToothView.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.mogo.och.taxi.passenger.ui.statusview - -import android.annotation.SuppressLint -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.RelativeLayout -import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager -import com.mogo.och.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_blue_tooth.view.mofangView - -/** - * 魔戒蓝牙控件 - * 放置于StatusBar右侧位置 - * todo arrow - */ -class TaxiPBlueToothView : RelativeLayout, IMoGoMoFangProvider.OnMoFangStatusListener { - - companion object{ - const val TAG = "TaxiPBlueToothView" - } - - - constructor(context: Context) : this(context, null) - constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr, 0) - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) - - init { - LayoutInflater.from(context).inflate(R.layout.taxi_p_blue_tooth, this, true) - } - - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - CallerDevaToolsManager.mofang()?.registerMoFangStatusListener(TAG, this) - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this) - } - - override fun onMoFangConnected() { - mofangView.setImageResource(R.drawable.taxi_p_blue_tooth_close) - } - - override fun onMoFangDisconnected() { - mofangView.setImageResource(R.drawable.taxi_p_blue_tooth_open) - } - - @SuppressLint("SetTextI18n") - override fun onMoFangBatteryChanged(battery: Int) { - - } - - override fun onMoFangClicked(keyCode: Int) {} - - override fun onMoFangLongClicked(keyCode: Int) {} - - override fun onMoFangCombineClicked(vararg keyCodes: Int) {} - - override fun onMoFangStatusError(msg: String) {} - -} \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_blue_tooth_close.png b/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_blue_tooth_close.png deleted file mode 100644 index f114ddbb67..0000000000 Binary files a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_blue_tooth_close.png and /dev/null differ diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_blue_tooth_open.png b/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_blue_tooth_open.png deleted file mode 100644 index 55896f8433..0000000000 Binary files a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_blue_tooth_open.png and /dev/null differ diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_front_left_door_bg.9.png b/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_front_left_door_bg.9.png deleted file mode 100644 index e01d4466ab..0000000000 Binary files a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_front_left_door_bg.9.png and /dev/null differ diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_front_right_door_bg.9.png b/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_front_right_door_bg.9.png deleted file mode 100644 index 6287301731..0000000000 Binary files a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_front_right_door_bg.9.png and /dev/null differ diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_rear_left_door_bg.9.png b/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_rear_left_door_bg.9.png deleted file mode 100644 index 0e42e0df05..0000000000 Binary files a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_rear_left_door_bg.9.png and /dev/null differ diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_rear_right_door_bg.9.png b/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_rear_right_door_bg.9.png deleted file mode 100644 index eaf66675de..0000000000 Binary files a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_rear_right_door_bg.9.png and /dev/null differ diff --git a/OCH/taxi/passenger/src/main/res/layout/taxi_p_base_fragment.xml b/OCH/taxi/passenger/src/main/res/layout/taxi_p_base_fragment.xml index 40da52ec4b..b28c81d8cf 100644 --- a/OCH/taxi/passenger/src/main/res/layout/taxi_p_base_fragment.xml +++ b/OCH/taxi/passenger/src/main/res/layout/taxi_p_base_fragment.xml @@ -5,23 +5,10 @@ android:layout_height="match_parent"> - + android:layout_height="match_parent" /> @@ -66,7 +53,7 @@ android:layout_width="@dimen/dp_120" android:layout_height="@dimen/dp_120" android:layout_marginStart="@dimen/dp_60" - android:layout_marginTop="100dp" + android:layout_marginTop="110dp" android:background="@drawable/taxi_p_bg_roma_selector" app:layout_constraintStart_toEndOf="@+id/speedView" app:layout_constraintTop_toTopOf="parent" @@ -78,33 +65,71 @@ android:layout_width="@dimen/dp_334" android:layout_height="@dimen/dp_120" android:layout_marginStart="@dimen/dp_50" - android:layout_marginTop="100dp" + android:layout_marginTop="110dp" app:roma_distance_bg="@drawable/taxi_p_roma_distance_bg" app:layout_constraintLeft_toRightOf="@+id/romaPView" app:layout_constraintTop_toTopOf="parent" app:roma_change_dis_color="true" /> + + + + + + + + + + + android:layout_height="wrap_content"/> + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> - - - - - - - @@ -190,6 +193,58 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> + + + + + + + + + + + + + + + - + diff --git a/OCH/taxi/passenger/src/main/res/layout/taxi_p_blue_tooth.xml b/OCH/taxi/passenger/src/main/res/layout/taxi_p_blue_tooth.xml deleted file mode 100644 index ae7dafde3a..0000000000 --- a/OCH/taxi/passenger/src/main/res/layout/taxi_p_blue_tooth.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/res/layout/taxi_p_bottom_check.xml b/OCH/taxi/passenger/src/main/res/layout/taxi_p_bottom_check.xml deleted file mode 100644 index d2841dbbd4..0000000000 --- a/OCH/taxi/passenger/src/main/res/layout/taxi_p_bottom_check.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/res/layout/taxi_p_statusview.xml b/OCH/taxi/passenger/src/main/res/layout/taxi_p_statusview.xml deleted file mode 100644 index c377a4756a..0000000000 --- a/OCH/taxi/passenger/src/main/res/layout/taxi_p_statusview.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/res/values/colors.xml b/OCH/taxi/passenger/src/main/res/values/colors.xml index f5b78bbda6..a1b49650db 100644 --- a/OCH/taxi/passenger/src/main/res/values/colors.xml +++ b/OCH/taxi/passenger/src/main/res/values/colors.xml @@ -34,7 +34,6 @@ - #76D7FF #255BAA #80F8FF #A0B3DA @@ -56,7 +55,7 @@ #876E788B #333333 - #373B46 + #80E5F0FF #E6E5F0FF #4D7985A7 diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedView.kt similarity index 88% rename from OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedView.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedView.kt index 5a327a89fc..a08a393697 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedView.kt @@ -9,14 +9,15 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import androidx.lifecycle.ViewModelProvider +import com.mogo.eagle.core.function.hmi.ui.widget.ItinerarySummaryDialog import com.mogo.eagle.core.utilcode.kotlin.onClick 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.manager.xiaozhi.ZhiViewmanager import com.mogo.och.common.module.utils.BigFrameAnimatorContainer import com.mogo.och.common.module.utils.RxUtils -import com.mogo.och.taxi.passenger.R -import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout +import com.mogo.och.common.module.wigets.WindowRelativeLayout +import com.mogo.och.taxi.passenger.common.R import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.aciv_bg import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.aciv_close @@ -48,6 +49,11 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { private lateinit var viewModel: ArrivedViewModel + var dialog:ItinerarySummaryDialog? = null + + private var mileage:Float = 0f + private var duration:Float = 0f + private fun initView() { d(SceneConstant.M_TAXI_P + TAG, "initView") @@ -71,6 +77,11 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { aniSpeedSettingRow() viewModel.setEndInfo() ZhiViewmanager.showListeningAni(ZhiViewmanager.loveAni) + if(dialog==null) { + dialog = ItinerarySummaryDialog(context, false, R.style.summary_dialog_p) + dialog?.setOrderMileage(mileage) + } + dialog?.show() } else { v_video_right_rear_view.resetView() taxiPxiaozhiLove?.stop() @@ -78,6 +89,9 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { taxiPxiaozhiLove = null RxUtils.disposeSubscribe(subscribe) ZhiViewmanager.showListeningAni(ZhiViewmanager.normalAni) + dialog?.dismiss() + dialog = null + mileage = 0f } arrivedVisilityChangeListenr?.isShow(isVisible) } @@ -171,6 +185,12 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { animatorSet.start() } + fun setMileageAndDuration(mileage: Float, duration: Float) { + this.mileage = mileage + this.duration = duration + dialog?.setOrderMileage(mileage) + } + interface ArrivedVisilityChangeListenr{ fun isShow(show: Boolean) } diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedViewModel.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedViewModel.kt similarity index 87% rename from OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedViewModel.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedViewModel.kt index aee5276433..20e512983a 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedViewModel.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/ArrivedViewModel.kt @@ -3,7 +3,7 @@ package com.mogo.och.taxi.passenger.ui.arrived import androidx.lifecycle.ViewModel import com.mogo.och.common.module.manager.distance.IDistanceListener import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager -import com.mogo.och.taxi.passenger.model.TaxiPassengerModel +import com.mogo.och.common.module.biz.order.OrderModel class ArrivedViewModel : ViewModel(), IDistanceListener { @@ -22,14 +22,14 @@ class ArrivedViewModel : ViewModel(), IDistanceListener { } fun setEndInfo() { - TaxiPassengerModel.currentOCHOrder?.endSiteAddr?.let { + OrderModel.orderBean?.endSiteAddr?.let { this.viewCallback?.setEndStation(it) } } override fun distanceCallback(distance: Float) { if (distance <= 50) { - TaxiPassengerModel.currentOCHOrder?.orderNo?.let { + OrderModel.orderBean?.orderNo?.let { if (it != havePreLoadOrderNum) { this.viewCallback?.preLoadImages() havePreLoadOrderNum = it diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt similarity index 94% rename from OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt index aa86218a01..96460652e2 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/arrived/RightRearCamView.kt @@ -16,9 +16,9 @@ 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.UiThreadHandler import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider -import com.mogo.och.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_right_rear_cam.view.actv_cam_position_group -import kotlinx.android.synthetic.main.taxi_p_right_rear_cam.view.v_video_right_rear +import com.mogo.och.taxi.passenger.common.R +import kotlinx.android.synthetic.main.taxt_p_right_rear_cam.view.actv_cam_position_group +import kotlinx.android.synthetic.main.taxt_p_right_rear_cam.view.v_video_right_rear /** * @@ -43,7 +43,7 @@ class RightRearCamView : ConstraintLayout , IMoGoBackCameraVideoListener, private fun initView() { d(SceneConstant.M_TAXI_P + TAG, "initView") - LayoutInflater.from(context).inflate(R.layout.taxi_p_right_rear_cam, this, true) + LayoutInflater.from(context).inflate(R.layout.taxt_p_right_rear_cam, this, true) } override fun onAttachedToWindow() { @@ -51,7 +51,7 @@ class RightRearCamView : ConstraintLayout , IMoGoBackCameraVideoListener, } override fun onDetachedFromWindow() { - super.onDetachedFromWindow() + super.onDetachedFromWindow() } override fun onVisibilityAggregated(isVisible: Boolean) { @@ -84,7 +84,7 @@ class RightRearCamView : ConstraintLayout , IMoGoBackCameraVideoListener, fun resetView(){ actv_cam_position_group.visibility = GONE - v_video_right_rear.setImageResource(R.drawable.taxi_p_right_rear_cam) + v_video_right_rear.setImageResource(R.drawable.taxt_p_right_rear_cam) } override fun onBackCameraVideo(data: ByteArray) { diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt index 561e51ef2e..eab1bc98b9 100644 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt @@ -6,9 +6,15 @@ import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.och.common.module.wigets.map.switchvisual.SeekBarView import com.mogo.och.taxi.passenger.common.R +import kotlinx.android.synthetic.main.taxi_p_leftbar.view.aciv_only_center +import kotlinx.android.synthetic.main.taxi_p_leftbar.view.clgroup_self_map +import kotlinx.android.synthetic.main.taxi_p_leftbar.view.clgroup_self_only_map import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_center_location -import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_center_location_bg +import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_visual_angle_title_bottom +import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_visual_angle_title_head +import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_visual_angle_title_value_bg class LeftBarView : ConstraintLayout { @@ -31,9 +37,37 @@ class LeftBarView : ConstraintLayout { private fun initView() { LayoutInflater.from(context).inflate(R.layout.taxi_p_leftbar, this, true) - iv_center_location_bg.onClick { + iv_center_location.onClick { this.rightBarCallback?.setGo2CenterClick() } + aciv_only_center.onClick { + this.rightBarCallback?.setGo2CenterClick() + } + + iv_visual_angle_title_value_bg.enableCallback = object :SeekBarView.EnableCallback{ + override fun enableChangeListener(enable: Boolean) { + if (enable){ + iv_visual_angle_title_head.alpha = 1f + iv_visual_angle_title_bottom.alpha = 1f + iv_visual_angle_title_value_bg.alpha = 1f + }else{ + iv_visual_angle_title_head.alpha = 0.5f + iv_visual_angle_title_bottom.alpha = 0.5f + iv_visual_angle_title_value_bg.alpha = 0.5f + } + } + + } + } + + fun showAngle(){ + clgroup_self_map.visibility = VISIBLE + clgroup_self_only_map.visibility = GONE + } + + fun showOnlyCenter(){ + clgroup_self_map.visibility = GONE + clgroup_self_only_map.visibility = VISIBLE } override fun onVisibilityAggregated(isVisible: Boolean) { diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt similarity index 64% rename from OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt index 49681bafa2..9c0f7c5bbf 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt @@ -4,10 +4,10 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout -import com.mogo.och.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_overmap -import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_precisionmap -import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_video +import com.mogo.och.taxi.passenger.common.R +import kotlinx.android.synthetic.main.taxt_p_bottom_bar.view.actv_overmap +import kotlinx.android.synthetic.main.taxt_p_bottom_bar.view.actv_precisionmap +import kotlinx.android.synthetic.main.taxt_p_bottom_bar.view.actv_video class BottomBar @JvmOverloads constructor( context: Context, @@ -16,12 +16,12 @@ class BottomBar @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr) { private var checkIndex = SelectView.NONE - private var overMapViewApply:ApplyClickLintener?=null + private var overMapViewApply: ApplyClickLintener?=null init { isClickable = true - LayoutInflater.from(context).inflate(R.layout.taxi_p_bottom_bar, this, true) - setBackgroundResource(R.drawable.taxi_p_bottom_bar_bg) + LayoutInflater.from(context).inflate(R.layout.taxt_p_bottom_bar, this, true) + setBackgroundResource(R.drawable.taxt_p_bottom_bar_bg) actv_precisionmap.setOnClickListener { setCheckIndex(SelectView.PRECISIONMAP) } @@ -33,7 +33,7 @@ class BottomBar @JvmOverloads constructor( } } - fun getCurrentPage():SelectView{ + fun getCurrentPage(): SelectView { return checkIndex } @@ -42,10 +42,24 @@ class BottomBar @JvmOverloads constructor( setCheckIndex(SelectView.PRECISIONMAP) } - fun setOverMapApplyClick(overMapViewApply:ApplyClickLintener){ + fun setOverMapApplyClick(overMapViewApply: ApplyClickLintener){ this.overMapViewApply = overMapViewApply } + fun setBagVisable(selectItem:SelectView,visibility:Int){ + when (selectItem) { + SelectView.PRECISIONMAP -> { + actv_precisionmap.setBagVisable(visibility) + } + SelectView.OVERMAPVIEW -> { + actv_overmap.setBagVisable(visibility) + } + SelectView.VIDEO -> { + actv_video.setBagVisable(visibility) + } + } + } + fun setCheckIndex(index: SelectView){ if(checkIndex==index){ return @@ -75,7 +89,7 @@ class BottomBar @JvmOverloads constructor( } interface ApplyClickLintener{ - fun onApplyClick(selectItem:SelectView) + fun onApplyClick(selectItem: SelectView) } } \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt similarity index 82% rename from OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt index a0535a3b29..b7baf6c5b9 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt @@ -6,9 +6,10 @@ import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat -import com.mogo.och.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_bottom_check.view.aciv_center_image -import kotlinx.android.synthetic.main.taxi_p_bottom_check.view.actv_title +import com.mogo.och.taxi.passenger.common.R +import kotlinx.android.synthetic.main.taxt_p_bottom_check.view.aciv_bag +import kotlinx.android.synthetic.main.taxt_p_bottom_check.view.aciv_center_image +import kotlinx.android.synthetic.main.taxt_p_bottom_check.view.actv_title open class BottomCheckView @JvmOverloads constructor( context: Context, @@ -26,12 +27,13 @@ open class BottomCheckView @JvmOverloads constructor( private var normalDrawable: Int = -1 private var bottomTitleNormalColor:Int = -1 private var bottomTitleCheckedColor:Int = -1 + private var bottomShowIcon:Boolean = false private var backageView: View? = null private var isCheck = false init { - LayoutInflater.from(context).inflate(R.layout.taxi_p_bottom_check, this, true) + LayoutInflater.from(context).inflate(R.layout.taxt_p_bottom_check, this, true) try { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BottomSelectView) backageViewId = typedArray.getResourceId(R.styleable.BottomSelectView_backageViewId, -1) @@ -42,6 +44,7 @@ open class BottomCheckView @JvmOverloads constructor( ContextCompat.getColor(context,R.color.white)) bottomTitleCheckedColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleCheckedColor, ContextCompat.getColor(context,R.color.white)) + bottomShowIcon = typedArray.getBoolean(R.styleable.BottomSelectView_bottomShowIcon, false) typedArray.recycle() initView(context) } catch (e: Exception) { @@ -55,6 +58,13 @@ open class BottomCheckView @JvmOverloads constructor( aciv_center_image.setImageResource(normalDrawable) } actv_title.text = bottomTitle + if(bottomShowIcon){ + aciv_bag.visibility = View.VISIBLE + } + } + + fun setBagVisable(visibility:Int){ + aciv_bag.visibility = visibility } fun setCheckItem(isCheck: Boolean) { @@ -69,6 +79,7 @@ open class BottomCheckView @JvmOverloads constructor( backageView?.visibility = View.VISIBLE aciv_center_image.setImageResource(selectedDrawable) actv_title.setTextColor(bottomTitleCheckedColor) + setBagVisable(GONE) } else { backageView?.visibility = View.GONE aciv_center_image.setImageResource(normalDrawable) diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugCallback.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugCallback.kt new file mode 100644 index 0000000000..8b6e4fb07c --- /dev/null +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugCallback.kt @@ -0,0 +1,11 @@ +package com.mogo.och.taxi.passenger.ui.debug + +interface DebugCallback { + fun showOrHideArrivedEndLayout(isShow: Boolean) + + fun showOrHideCheckAndStartAutopilotView(status:Int) + + fun showOrHideServingOrderFragment(isShow: Boolean) + + fun setEvaluateView() +} \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugEvent.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugEvent.kt similarity index 100% rename from OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugEvent.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugEvent.kt diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugView.kt new file mode 100644 index 0000000000..eb1fd52eb5 --- /dev/null +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugView.kt @@ -0,0 +1,135 @@ +package com.mogo.och.taxi.passenger.ui.debug + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.och.common.module.biz.provider.CommonService +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.utils.ProjectUtils +import com.mogo.och.taxi.passenger.common.R +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_map_visual +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_map_visual_cro +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_arrive +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_evaluate +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_order_info +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_phone_check +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_start_autopilot +import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_start_autopilot_success +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +class DebugView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener, + DebugViewModel.IVisualCallback { + + companion object { + const val TAG = "DebugView" + } + + init { + LayoutInflater.from(context).inflate(R.layout.taxt_u_p_debug, this, true) + visibility = GONE + } + + private var debugCallback: DebugCallback?=null + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + EventBus.getDefault().register(this) + + val activityByContext = ActivityUtils.getActivityByContext(context) + if(activityByContext is FragmentActivity){ + val path = if (ProjectUtils.isSaas()) { + OchCommonConst.TAXI_UNMANNED_PASSENGER + }else if(ProjectUtils.isMogo()){ + OchCommonConst.TAXI_PASSENGER + }else{ + OchCommonConst.TAXI_PASSENGER + } + val commonService = ARouter.getInstance().build(path).navigation() as CommonService? + commonService?.let { + val fragment = it.getFragment() + if(fragment is DebugCallback){ + this.debugCallback = fragment + } + } + } + + val viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(DebugViewModel::class.java) + } + + viewModel?.setDistanceCallback(this) + + tv_show_arrive.onClick { + debugCallback?.showOrHideArrivedEndLayout(true) + } + tv_show_phone_check.onClick { + debugCallback?.showOrHideCheckAndStartAutopilotView(0) + } + tv_show_start_autopilot.onClick { + debugCallback?.showOrHideCheckAndStartAutopilotView(1) + } + tv_show_order_info.onClick { + debugCallback?.showOrHideServingOrderFragment(true) + } + tv_show_start_autopilot_success.onClick { + debugCallback?.showOrHideCheckAndStartAutopilotView(2) + } + tv_show_evaluate.onClick { + debugCallback?.setEvaluateView() + } + tv_map_visual.onClick { + viewModel?.changeVisualView() + } + tv_map_visual_cro.onClick { + viewModel?.changeVisualView2Cro() + } + } + @Subscribe(threadMode = ThreadMode.MAIN) + fun changeOverview(debugEvent: DebugEvent) { + if(visibility== VISIBLE){ + visibility = GONE + }else{ + visibility = VISIBLE + } + } + + + + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + EventBus.getDefault().unregister(this) + } + + override fun setMiddleAngle() { + tv_map_visual.text = "中视角" + } + + override fun setLongAngle() { + tv_map_visual.text = "远视角" + } + + override fun setUnableChange() { + tv_map_visual.text = "路口视角" + } + + override fun setSkyboxAngle() { + tv_map_visual.text = "天空盒子视角" + } +} + diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugViewModel.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugViewModel.kt new file mode 100644 index 0000000000..74a1a957b9 --- /dev/null +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/debug/DebugViewModel.kt @@ -0,0 +1,118 @@ +package com.mogo.och.taxi.passenger.ui.debug + +import androidx.lifecycle.ViewModel +import com.mogo.eagle.core.function.angle.scenes.CrossRoad +import com.mogo.eagle.core.function.angle.scenes.LongSight +import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider +import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager +import com.mogo.map.uicontroller.VisualAngleMode +import com.mogo.eagle.core.function.angle.scenes.Default +import com.mogo.eagle.core.utilcode.util.UiThreadHandler + +class DebugViewModel : ViewModel(), + IMoGoVisualAngleChangeProvider.OnMoGoVisualAngleSceneChangeListener { + + private val TAG = DebugViewModel::class.java.simpleName + + private var viewCallback: IVisualCallback? = null + + init { + + } + + override fun onCleared() { + super.onCleared() + CallerVisualAngleManager.removeListener(TAG) + this.viewCallback = null + } + + fun setDistanceCallback(viewCallback: IVisualCallback) { + CallerVisualAngleManager.addListener(TAG, this) + this.viewCallback = viewCallback + } + + override fun onSceneChanged(scene: Scene) { + if (scene.isCanSwitch) {// 可切换 + when (scene.angle) { + VisualAngleMode.MODE_MEDIUM_SIGHT -> { + UiThreadHandler.post({ + this.viewCallback?.setViewShow(true) + this.viewCallback?.setMiddleAngle() + }, UiThreadHandler.MODE.QUEUE) + } + + VisualAngleMode.MODE_LONG_SIGHT -> { + UiThreadHandler.post({ + this.viewCallback?.setViewShow(true) + this.viewCallback?.setLongAngle() + }, UiThreadHandler.MODE.QUEUE) + } + + VisualAngleMode.MAP_STYLE_VR_SKY_BOX -> { + UiThreadHandler.post({ + this.viewCallback?.setViewShow(true) + this.viewCallback?.setSkyboxAngle() + }, UiThreadHandler.MODE.QUEUE) + } + + else -> { + // 不可切换 + UiThreadHandler.post({ + this.viewCallback?.setViewShow(false) + this.viewCallback?.setUnableChange() + }, UiThreadHandler.MODE.QUEUE) + } + } + } else {// 不可切换 + UiThreadHandler.post({ + this.viewCallback?.setViewShow(false) + this.viewCallback?.setUnableChange() + }, UiThreadHandler.MODE.QUEUE) + } + } + + fun changeVisualView() { + CallerVisualAngleManager.getCurrentScene().let { + val default = Default() + + when (it.angle) { + VisualAngleMode.MODE_MEDIUM_SIGHT -> { + if(default.angle==VisualAngleMode.MODE_MEDIUM_SIGHT){ + CallerVisualAngleManager.changeScene(LongSight()) + } + } + + VisualAngleMode.MODE_LONG_SIGHT -> { + CallerVisualAngleManager.changeScene(Default()) + } + VisualAngleMode.MAP_STYLE_VR_SKY_BOX -> { + if(default.angle==VisualAngleMode.MAP_STYLE_VR_SKY_BOX){ + CallerVisualAngleManager.changeScene(LongSight()) + } + } + + else -> { + CallerVisualAngleManager.changeScene(Default()) + } + } + } + } + + fun changeVisualView2Cro() { + CallerVisualAngleManager.changeScene(CrossRoad()) + } + + interface IVisualCallback { + fun setViewShow(boolean: Boolean) {} + + fun setMiddleAngle() {} + + fun setLongAngle() {} + + fun setSkyboxAngle() {} + + fun setUnableChange() {} + } + +} \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/evaluate/EvaluateViewModel.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/evaluate/EvaluateViewModel.kt index 966a3c9954..9cc51c5388 100644 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/evaluate/EvaluateViewModel.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/evaluate/EvaluateViewModel.kt @@ -6,7 +6,7 @@ import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.manager.distance.IDistanceListener import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.common.module.biz.order.OrderModel class EvaluateViewModel : ViewModel(), IDistanceListener { diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/music/MusicModel.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/music/MusicModel.kt index 8cff801ca8..f483176e79 100644 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/music/MusicModel.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/music/MusicModel.kt @@ -2,16 +2,15 @@ package com.mogo.och.taxi.passenger.ui.model.music import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.utilcode.util.TAG import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager import com.mogo.och.common.module.utils.RxUtils -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean -import com.mogo.och.taxi.passenger.ui.model.order.OrderListener -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import io.reactivex.disposables.Disposable object MusicModel : OrderListener, IOchAutopilotStatusListener { @@ -22,33 +21,33 @@ object MusicModel : OrderListener, IOchAutopilotStatusListener { } private var stopMusicDisposable: Disposable? = null - private var orderInfo:BaseOrderBean? = null + private var orderInfo: BaseOrderBean? = null private const val startMusicWithOrderKey = "STARTMUSICWITHORDER" override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { this.orderInfo = order order?.orderStatus?.let { - when (TaxiPassengerOrderStatusEnum.valueOf(it)) { - TaxiPassengerOrderStatusEnum.None -> { + when (TaxiOrderStatusEnum.valueOf(it)) { + TaxiOrderStatusEnum.None -> { cancelStopMusicDisposable() } - TaxiPassengerOrderStatusEnum.OnTheWayToStart -> { + TaxiOrderStatusEnum.OnTheWayToStart -> { cancelStopMusicDisposable() } - TaxiPassengerOrderStatusEnum.ArriveAtStart -> { + TaxiOrderStatusEnum.ArriveAtStart -> { cancelStopMusicDisposable() } - TaxiPassengerOrderStatusEnum.UserArriveAtStart -> {} - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> {} - TaxiPassengerOrderStatusEnum.ArriveAtEnd -> {} - TaxiPassengerOrderStatusEnum.JourneyCompleted -> { + TaxiOrderStatusEnum.UserArriveAtStart -> {} + TaxiOrderStatusEnum.OnTheWayToEnd -> {} + TaxiOrderStatusEnum.ArriveAtEnd -> {} + TaxiOrderStatusEnum.JourneyCompleted -> { cancelStopMusicDisposable() stopMusicDisposable = RxUtils.createSubscribe(60_000) { AuditionManager.stop() } } - TaxiPassengerOrderStatusEnum.Cancel -> { + TaxiOrderStatusEnum.Cancel -> { cancelStopMusicDisposable() stopMusicDisposable = RxUtils.createSubscribe(60_000) { AuditionManager.stop() diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/BaseOrderBean.java b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/BaseOrderBean.java deleted file mode 100644 index 9274120846..0000000000 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/BaseOrderBean.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.mogo.och.taxi.passenger.ui.model.order; - -public class BaseOrderBean { - public String orderNo;// 订单号 - public int orderStatus;//订单状态 -} diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/OrderModel.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/OrderModel.kt deleted file mode 100644 index 58ddeded67..0000000000 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/OrderModel.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.mogo.och.taxi.passenger.ui.model.order - -import com.mogo.och.taxi.passenger.ui.model.music.MusicModel -import java.util.concurrent.ConcurrentHashMap - -object OrderModel { - private val mOrderStatusCallbackMap: MutableMap = ConcurrentHashMap() - - var orderBean:BaseOrderBean?=null - - init { - MusicModel.load() - } - - fun setOrderStatusCallback(tag: String?, callback: OrderListener?) { - if (tag == null || "" == tag) return - if (callback == null) { - mOrderStatusCallbackMap.remove(tag) - return - } - mOrderStatusCallbackMap[tag] = callback - } - - fun invokeListener(orderBean: T?){ - this.orderBean = orderBean - for (callback in mOrderStatusCallbackMap.values) { - callback.onCurrentOrderStatusChanged(orderBean) - } - } -} \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/TaxiPassengerOrderStatusEnum.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/TaxiPassengerOrderStatusEnum.kt deleted file mode 100644 index 1445172de8..0000000000 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/model/order/TaxiPassengerOrderStatusEnum.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.mogo.och.taxi.passenger.ui.model.order - -/** - * Created on 2021/12/7 - * - * * Old code:START - * 未派单 0 - * 去往上车站点 1 - * 车辆已到达上车站点 2 - * 乘客已到达上车站点 3 - * 去往下车站点 4 - * 到达下车站点 5 - * 已完成 6 - * 已取消 7 - * Old code:END - * - * 0 订单创建(为派单), - * 10 已派上司机(司机去往上车点), - * 20 司机到达上车点, - * 30 乘客到达上车点, - * 40 服务中(去往目的地), - * 50 到达目的地, - * 60 已完成, - * 70 已取消 - */ -enum class TaxiPassengerOrderStatusEnum(val code: Int) { - None( 0 ), - OnTheWayToStart( 10), - ArriveAtStart( 20), - UserArriveAtStart( 30), - OnTheWayToEnd( 40), - ArriveAtEnd( 50), - JourneyCompleted(60),//行程完成 - Cancel( 70); - - companion object { - @JvmStatic - fun valueOf(code: Int): TaxiPassengerOrderStatusEnum { - for (value in values()) { - if (value.code == code) { - return value - } - } - return None - } - } -} \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/music/MusicViewModel.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/music/MusicViewModel.kt index c1a1823423..622faefd98 100644 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/music/MusicViewModel.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/music/MusicViewModel.kt @@ -1,6 +1,7 @@ package com.mogo.och.taxi.passenger.ui.music import androidx.lifecycle.ViewModel +import com.mogo.och.taxi.passenger.ui.model.music.MusicModel class MusicViewModel: ViewModel() { @@ -9,7 +10,7 @@ class MusicViewModel: ViewModel() { private var viewCallback: IMusicViewCallback?=null init { - + MusicModel.load() } fun setDistanceCallback(viewCallback: IMusicViewCallback){ diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/overmapview/IconListItemAdapter.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/overmapview/IconListItemAdapter.kt new file mode 100644 index 0000000000..a7324cd5df --- /dev/null +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/overmapview/IconListItemAdapter.kt @@ -0,0 +1,83 @@ +package com.mogo.och.taxi.passenger.ui.overmapview + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.function.business.travelreality.EventDrawBean +import com.mogo.och.taxi.passenger.common.R +import androidx.recyclerview.widget.DiffUtil.Callback + +/** + * Created by yangyakun on 06/06/17. + */ +class IconListItemAdapter( + private val context: Context, + private val dataList: MutableList +) : RecyclerView.Adapter() { + + fun setDataList(dataList: List) { + if (this.dataList == dataList) { + // 如果新旧列表一致,则直接返回 + return + } + + val diffResult = DiffUtil.calculateDiff(MyDiffCallback(this.dataList, dataList)) + this.dataList.clear() + this.dataList.addAll(dataList) + diffResult.dispatchUpdatesTo(this) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextVH { + val view: View + val inflater = LayoutInflater.from(context) + view = inflater.inflate(R.layout.taxt_p_icon_item, parent, false) + return TextVH(view) + } + + override fun onBindViewHolder(holder: TextVH, position: Int) { + val errorInfo = dataList[holder.bindingAdapterPosition] + holder.acivQuanxilukValue.text = errorInfo.title + holder.acivQuanxiluk.setImageResource(errorInfo.resId) + } + + override fun getItemCount(): Int { + return dataList.size + } + + inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) { + var acivQuanxiluk: AppCompatImageView + var acivQuanxilukValue: AppCompatTextView + init { + acivQuanxiluk = itemView.findViewById(R.id.aciv_quanxiluk) + acivQuanxilukValue = itemView.findViewById(R.id.aciv_quanxiluk_value) + } + } + + inner class MyDiffCallback(val oldData:List,val newData:List):Callback(){ + override fun getOldListSize(): Int { + return oldData.size + } + + override fun getNewListSize(): Int { + return newData.size + } + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val oldItem = oldData[oldItemPosition] + val newItem = newData[newItemPosition] + return oldItem.resId == newItem.resId + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val oldItem = oldData[oldItemPosition] + val newItem = newData[newItemPosition] + return oldItem.resId == newItem.resId + } + + } +} \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/overmapview/OverMapView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/overmapview/OverMapView.kt new file mode 100644 index 0000000000..d62a9c0e14 --- /dev/null +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/overmapview/OverMapView.kt @@ -0,0 +1,133 @@ +package com.mogo.och.taxi.passenger.ui.overmapview + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.RelativeLayout +import com.google.android.flexbox.AlignItems +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager +import com.google.android.flexbox.JustifyContent +import com.mogo.eagle.core.function.business.travelreality.EventDrawBean +import com.mogo.eagle.core.function.view.TravelRealityView +import com.mogo.och.taxi.passenger.common.R +import kotlinx.android.synthetic.main.taxi_p_overmap.view.ovbv_bottom_icons +import kotlinx.android.synthetic.main.taxi_p_overmap.view.travelRealityView +import kotlinx.android.synthetic.main.taxi_p_overmap.view.tv_add_false +import kotlinx.android.synthetic.main.taxi_p_overmap.view.tv_add_true + +class OverMapView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr){ + + private var iconListItemAdapter:IconListItemAdapter?=null + + private val eventDrawBeansTrue = mutableListOf() + private val eventDrawBeansFalse = mutableListOf() + + private val listener = object :TravelRealityView.OnDrawListener{ + override fun onDraw(eventList: List, isEvent: Boolean) { +// if(isEvent){ +// eventDrawBeansTrue.clear() +// eventDrawBeansTrue.addAll(eventList) +// }else{ +// eventDrawBeansFalse.clear() +// eventDrawBeansFalse.addAll(eventList) +// } +// iconListItemAdapter?.let { +// it.setDataList(eventDrawBeansTrue+eventDrawBeansFalse) +// if(it.itemCount==0){ +// ovbv_bottom_icons.visibility = GONE +// }else{ +// ovbv_bottom_icons.visibility = VISIBLE +// } +// } + } + + } + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.taxi_p_overmap, this, true) + // 定义渐变的方向 + // 定义渐变的方向 + val orientation = GradientDrawable.Orientation.LEFT_RIGHT + val temp01 = GradientDrawable(orientation, intArrayOf( + Color.parseColor("#33D7E5FF"), + Color.parseColor("#E6EFFF"), + Color.parseColor("#E6EFFF"), + Color.parseColor("#E6EFFF"), + Color.parseColor("#33D7E5FF"), + )) + ovbv_bottom_icons.background = temp01 + + + val flexboxLayoutManager = FlexboxLayoutManager(context) + flexboxLayoutManager.flexDirection = FlexDirection.ROW; + flexboxLayoutManager.alignItems = AlignItems.CENTER + flexboxLayoutManager.flexWrap = FlexWrap.WRAP + flexboxLayoutManager.justifyContent = JustifyContent.CENTER + + ovbv_bottom_icons?.layoutManager = flexboxLayoutManager + //ovbv_bottom_icons?.setHasFixedSize(true) + iconListItemAdapter = IconListItemAdapter( + context, mutableListOf( + EventDrawBean(R.drawable.mogo_quanxi_lukou, "全息路口"), + EventDrawBean(R.drawable.mogo_jingzhi_nor, "静止事件"), + EventDrawBean(R.drawable.mogo_shigong_image, "道路施工"), + EventDrawBean(R.drawable.mogo_shigu_nor, "交通事故") + ) + ) + + ovbv_bottom_icons?.adapter = iconListItemAdapter + + travelRealityView.setOnDrawListener(listener) + + tv_add_true.setOnClickListener { + listener.onDraw(mutableListOf( + EventDrawBean(R.drawable.mogo_jingzhi_nor,"全息路口"), + EventDrawBean(R.drawable.mogo_shigong_image,"静止事件"), + ),true) + } + + tv_add_false.setOnClickListener { + listener.onDraw(mutableListOf( + EventDrawBean(R.drawable.mogo_quanxi_lukou,"全息路口"), + ),false) + } + } + + fun clearAllMarkersAndPolyline(){ + travelRealityView.clearAllMarkersAndPolyline() + } + + fun onCreateView(savedInstanceState: Bundle?) { + travelRealityView.onCreateView(savedInstanceState) + } + + fun onResume() { + travelRealityView.onResume() + } + + fun onPause() { + travelRealityView.onPause() + } + + fun onDestroy() { + travelRealityView.onDestroy() + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/simplemap/SimpleMapView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/simplemap/SimpleMapView.kt index 2dfb06723c..32d0ddd34c 100644 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/simplemap/SimpleMapView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/simplemap/SimpleMapView.kt @@ -420,7 +420,7 @@ class SimpleMapView : View, SimpleMapViewModel.SimpleMapCallback { val nextPointList = mutableListOf() nextLineData.clear() nextList.forEachIndexed { index, currentPoint -> - val headingAngle = CoordinateCalculateRouteUtil.getHeadingAngle( + val headingAngle = CoordinateCalculateRouteUtil.getHeadingAngleTemp( carLocation.longitude, carLocation.latitude, currentPoint.location.longitude, @@ -492,7 +492,7 @@ class SimpleMapView : View, SimpleMapViewModel.SimpleMapCallback { val prePointList = mutableListOf() preLineData.clear() preList.forEachIndexed { index, currentPoint -> - val headingAngle = CoordinateCalculateRouteUtil.getHeadingAngle( + val headingAngle = CoordinateCalculateRouteUtil.getHeadingAngleTemp( carLocation.longitude, carLocation.latitude, currentPoint.location.longitude, diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/StatusBarView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/StatusBarView.kt similarity index 96% rename from OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/StatusBarView.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/StatusBarView.kt index 8376b60a2f..101bd64887 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/StatusBarView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/StatusBarView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.passenger.ui.statusview +package com.mogo.och.taxi.passenger.ui.statusview import android.content.Context import android.os.SystemClock @@ -15,8 +15,8 @@ import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager import com.mogo.och.common.module.manager.debug.DebugViewWatchDogFragment -import com.mogo.och.unmanned.passenger.ui.debug.DebugEvent -import com.mogo.och.unmanned.taxi.passenger.R +import com.mogo.och.taxi.passenger.common.R +import com.mogo.och.taxi.passenger.ui.debug.DebugEvent import kotlinx.android.synthetic.main.taxt_u_p_statusview.view.vShowDebugView import kotlinx.android.synthetic.main.taxt_u_p_statusview.view.iv_biz_icon import me.jessyan.autosize.utils.AutoSizeUtils diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/TaxiPBlueToothView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/TaxiPBlueToothView.kt similarity index 95% rename from OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/TaxiPBlueToothView.kt rename to OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/TaxiPBlueToothView.kt index 9e80940f8c..9f4218aa35 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/statusview/TaxiPBlueToothView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/statusview/TaxiPBlueToothView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.passenger.ui.statusview +package com.mogo.och.taxi.passenger.ui.statusview import android.annotation.SuppressLint import android.content.Context @@ -7,7 +7,7 @@ import android.view.LayoutInflater import android.widget.RelativeLayout import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager -import com.mogo.och.unmanned.taxi.passenger.R +import com.mogo.och.taxi.passenger.common.R import kotlinx.android.synthetic.main.taxt_u_p_blue_tooth.view.mofangView /** diff --git a/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_bottom_overmap.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_bottom_overmap.png new file mode 100644 index 0000000000..4f6ab95de0 Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_bottom_overmap.png differ diff --git a/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_left_bar_bg.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_left_bar_bg.png new file mode 100644 index 0000000000..5bb011c8d2 Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_left_bar_bg.png differ diff --git a/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_only_center_bg.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_only_center_bg.png new file mode 100644 index 0000000000..b27a38babd Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_only_center_bg.png differ diff --git a/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_passenger_arrived_close.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_passenger_arrived_close.png new file mode 100644 index 0000000000..77bac9388b Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_passenger_arrived_close.png differ diff --git a/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_station_end.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_station_end.png new file mode 100644 index 0000000000..1b85a15a48 Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_station_end.png differ diff --git a/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_title_bottom.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_title_bottom.png new file mode 100644 index 0000000000..dff99356c1 Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_title_bottom.png differ diff --git a/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_title_head.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_title_head.png new file mode 100644 index 0000000000..fa6f5c25e1 Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxi_p_title_head.png differ diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_arrived_glide.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_arrived_glide.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_arrived_glide.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_arrived_glide.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_bar_bg.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_bar_bg.png old mode 100644 new mode 100755 similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_bar_bg.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_bar_bg.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_bar_select_bg.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_bar_select_bg.png old mode 100644 new mode 100755 similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_bar_select_bg.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_bar_select_bg.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_overmap_normal.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_normal.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_overmap_normal.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_normal.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_overmap_press.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_press.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_overmap_press.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_overmap_press.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_precisionmap_normal.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_normal.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_precisionmap_normal.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_normal.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_precisionmap_press.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_press.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_precisionmap_press.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_precisionmap_press.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_video_normal.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_video_normal.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_video_normal.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_video_normal.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_video_press.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_video_press.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_bottom_video_press.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_bottom_video_press.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_right_rear_cam.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_right_rear_cam.png old mode 100644 new mode 100755 similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_right_rear_cam.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_p_right_rear_cam.png diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_close.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_close.png similarity index 100% rename from OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_close.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_close.png diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_open.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_open.png similarity index 100% rename from OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_open.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_blue_tooth_open.png diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_map_car_light.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_map_car_light.png similarity index 100% rename from OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_map_car_light.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_map_car_light.png diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_end.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_end.png similarity index 100% rename from OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_end.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_end.png diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_start.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_start.png similarity index 100% rename from OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_start.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_start.png diff --git a/OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_status_bg.png b/OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_status_bg.png similarity index 100% rename from OCH/taxi/passenger/src/main/res/drawable-nodpi/taxi_p_status_bg.png rename to OCH/taxi/pcommon/src/main/res/drawable-nodpi/taxt_u_p_status_bg.png diff --git a/OCH/taxi/pcommon/src/main/res/drawable/taxi_p_left_bar_split.xml b/OCH/taxi/pcommon/src/main/res/drawable/taxi_p_left_bar_split.xml new file mode 100644 index 0000000000..7bedff4f74 --- /dev/null +++ b/OCH/taxi/pcommon/src/main/res/drawable/taxi_p_left_bar_split.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/font/taxt_u_p_din.ttf b/OCH/taxi/pcommon/src/main/res/font/taxt_u_p_din.ttf new file mode 100644 index 0000000000..60e06cb75f Binary files /dev/null and b/OCH/taxi/pcommon/src/main/res/font/taxt_u_p_din.ttf differ diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_arrived_end_panel.xml b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_arrived_end_panel.xml new file mode 100644 index 0000000000..ce5089b957 --- /dev/null +++ b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_arrived_end_panel.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_leftbar.xml b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_leftbar.xml index 3c0c76456f..f08843282f 100644 --- a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_leftbar.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_leftbar.xml @@ -2,28 +2,105 @@ - + app:layout_constraintTop_toTopOf="parent" /> + + + + + app:layout_constraintBottom_toBottomOf="@+id/iv_center_location_bg" + app:layout_constraintEnd_toEndOf="@+id/iv_center_location_bg" + app:layout_constraintStart_toStartOf="@+id/iv_center_location_bg" /> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_overmap.xml b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_overmap.xml new file mode 100644 index 0000000000..86e07653c9 --- /dev/null +++ b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_overmap.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml index 36e55e319b..b12099d8b8 100644 --- a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml @@ -58,13 +58,13 @@ + app:layout_constraintBottom_toBottomOf="@+id/iv_visualangle_bg" + app:layout_constraintStart_toStartOf="@+id/iv_visualangle_bg" + app:layout_constraintEnd_toEndOf="@+id/iv_visualangle_bg" + app:layout_constraintTop_toTopOf="@+id/iv_visualangle_bg" /> \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_seekbar_.xml b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_seekbar_.xml new file mode 100644 index 0000000000..cf8aac9f7d --- /dev/null +++ b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_seekbar_.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/res/layout/taxi_p_bottom_bar.xml b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_bottom_bar.xml similarity index 80% rename from OCH/taxi/passenger/src/main/res/layout/taxi_p_bottom_bar.xml rename to OCH/taxi/pcommon/src/main/res/layout/taxt_p_bottom_bar.xml index 5e6c2ec57b..f9238f26a6 100644 --- a/OCH/taxi/passenger/src/main/res/layout/taxi_p_bottom_bar.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_bottom_bar.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/dp_160" xmlns:app="http://schemas.android.com/apk/res-auto" - tools:background="@drawable/taxi_p_bottom_bar_bg" + tools:background="@drawable/taxt_p_bottom_bar_bg" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" tools:ignore="MissingDefaultResource"> @@ -13,11 +13,11 @@ android:format12Hour="M月d日 " android:format24Hour="M月d日 " android:gravity="center" - android:fontFamily="@font/din" + android:fontFamily="@font/taxt_u_p_din" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:textColor="@color/taxi_p_111D2F" + android:textColor="@color/taxi_cp_111D2F" android:textSize="@dimen/dp_52" android:layout_marginStart="@dimen/dp_92" android:layout_width="wrap_content" @@ -28,11 +28,11 @@ android:format12Hour="HH:mm" android:format24Hour="HH:mm" android:gravity="center" - android:fontFamily="@font/din" + android:fontFamily="@font/taxt_u_p_din" app:layout_constraintStart_toEndOf="@+id/cl_order_time" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:textColor="@color/taxi_p_111D2F" + android:textColor="@color/taxi_cp_111D2F" android:letterSpacing="0.1" android:textSize="@dimen/dp_52" android:layout_width="wrap_content" @@ -42,7 +42,7 @@ android:id="@+id/actv_precisionmap_press" android:visibility="gone" android:layout_marginTop="@dimen/dp_2" - android:src="@drawable/taxi_p_bottom_bar_select_bg" + android:src="@drawable/taxt_p_bottom_bar_select_bg" app:layout_constraintStart_toStartOf="@+id/actv_precisionmap" app:layout_constraintEnd_toEndOf="@+id/actv_precisionmap" android:layout_width="@dimen/dp_420" @@ -52,15 +52,16 @@ android:id="@+id/actv_precisionmap" app:backageViewId="@+id/actv_precisionmap_press" app:layout_constraintHorizontal_chainStyle="packed" - app:selectedDrawable="@drawable/taxi_p_bottom_precisionmap_press" - app:normalDrawable="@drawable/taxi_p_bottom_precisionmap_normal" + app:selectedDrawable="@drawable/taxt_p_bottom_precisionmap_press" + app:normalDrawable="@drawable/taxt_p_bottom_precisionmap_normal" android:layout_marginEnd="@dimen/dp_107" app:bottomTitle="行车实况" app:bottomTitleCheckedColor="@color/white" - app:bottomTitleNormalColor="@color/taxi_p_41444D" + app:bottomTitleNormalColor="@color/taxi_cp_41444D" app:layout_constraintEnd_toStartOf="@+id/actv_overmap" app:layout_constraintStart_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" + app:bottomShowIcon = "false" app:layout_constraintBottom_toBottomOf="parent" android:layout_width="wrap_content" android:layout_height="match_parent"/> @@ -72,7 +73,7 @@ android:id="@+id/actv_overmap_press" android:visibility="gone" android:layout_marginTop="@dimen/dp_2" - android:src="@drawable/taxi_p_bottom_bar_select_bg" + android:src="@drawable/taxt_p_bottom_bar_select_bg" app:layout_constraintStart_toStartOf="@+id/actv_overmap" app:layout_constraintEnd_toEndOf="@+id/actv_overmap" android:layout_width="@dimen/dp_420" @@ -81,13 +82,14 @@ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_bottom_check.xml b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_bottom_check.xml similarity index 76% rename from OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_bottom_check.xml rename to OCH/taxi/pcommon/src/main/res/layout/taxt_p_bottom_check.xml index d2841dbbd4..0db8c6d706 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_bottom_check.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_bottom_check.xml @@ -26,4 +26,13 @@ android:text="靠边停车" android:layout_width="wrap_content" android:layout_height="wrap_content"/> + + \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxt_p_icon_item.xml b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_icon_item.xml new file mode 100644 index 0000000000..c96f711884 --- /dev/null +++ b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_icon_item.xml @@ -0,0 +1,33 @@ + + + + + + \ No newline at end of file diff --git a/OCH/taxi/passenger/src/main/res/layout/taxi_p_right_rear_cam.xml b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_right_rear_cam.xml similarity index 91% rename from OCH/taxi/passenger/src/main/res/layout/taxi_p_right_rear_cam.xml rename to OCH/taxi/pcommon/src/main/res/layout/taxt_p_right_rear_cam.xml index d5c147cb67..b9b8986477 100644 --- a/OCH/taxi/passenger/src/main/res/layout/taxi_p_right_rear_cam.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxt_p_right_rear_cam.xml @@ -10,13 +10,13 @@ android:id="@+id/v_video_right_rear" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - android:src="@drawable/taxi_p_right_rear_cam" + android:src="@drawable/taxt_p_right_rear_cam" android:layout_width="@dimen/dp_900" android:layout_height="@dimen/dp_506"/> diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_blue_tooth.xml b/OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_blue_tooth.xml similarity index 100% rename from OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_blue_tooth.xml rename to OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_blue_tooth.xml diff --git a/OCH/taxi/passenger/src/main/res/layout/taxi_p_debug.xml b/OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_debug.xml similarity index 72% rename from OCH/taxi/passenger/src/main/res/layout/taxi_p_debug.xml rename to OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_debug.xml index a3eea40080..d91de2aa8b 100644 --- a/OCH/taxi/passenger/src/main/res/layout/taxi_p_debug.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_debug.xml @@ -25,6 +25,7 @@ android:text="启动自驾页面" android:layout_width="wrap_content" android:layout_height="wrap_content"/> + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_statusview.xml b/OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_statusview.xml similarity index 95% rename from OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_statusview.xml rename to OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_statusview.xml index 95cf3634c6..c786a40c48 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_statusview.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxt_u_p_statusview.xml @@ -12,7 +12,7 @@ app:layout_constraintTop_toTopOf="@+id/vShowDebugView" app:layout_constraintBottom_toBottomOf="@+id/gl_horizontal" app:layout_constraintEnd_toEndOf="parent" - android:layout_marginEnd="@dimen/dp_381" + app:layout_constraintEnd_toStartOf="@+id/wifiStateView" android:layout_width="@dimen/dp_41" android:layout_height="@dimen/dp_41"/> @@ -29,7 +29,7 @@ android:layout_gravity="center" /> - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/values/colors.xml b/OCH/taxi/pcommon/src/main/res/values/colors.xml index e6f45a4f3b..f4d2515e6e 100644 --- a/OCH/taxi/pcommon/src/main/res/values/colors.xml +++ b/OCH/taxi/pcommon/src/main/res/values/colors.xml @@ -15,5 +15,13 @@ #374968 #131415 #80FFFFFF + #76D7FF + #373B46 + + #111D2F + #41444D + + #9EB0D3 + #009EB0D3 \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt index e6f292801c..71d49da0cd 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt @@ -1,8 +1,9 @@ package com.mogo.och.unmanned.taxi.bean import com.mogo.eagle.core.data.BaseData +import com.mogo.och.data.taxi.BaseOrderBean import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum -import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum /** * @author: wangmingjun @@ -10,8 +11,6 @@ import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum */ data class OrderDetail( - var orderNo: String, - var orderStatus: Int, var orderStartSite: Site?, var orderEndSite: Site?, var planningLines: Array, //返回的是接驾任务的id集合 @@ -20,7 +19,7 @@ data class OrderDetail( var fullMinutes: Int, //到站后返回的总里程 /公里 var fullMileage: Float, // 到站后返回的总用时 /分钟 var orderLine: Long // 订单路线id -) { +): BaseOrderBean() { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false @@ -231,23 +230,6 @@ data class OrderCompletedReqBean( var sn: String, var orderNo: String ) -data class QueryCarOrderByNoReqBean( - var sn: String, var orderNo: String -) - -data class QueryCarOrderByNoRespBean(var data: Result) : BaseData() { - data class Result( - var sn: String, - var orderNo: String, - var orderStatus: Int, - var bookingUserPhone: String, - var businessType: String, - var mileage: Float, - var duration: Float, - var passengerSize: Int - ) -} - /** * 轨迹路线 */ diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiRoutingBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiRoutingBean.kt index 26eff72bf6..e13446132e 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiRoutingBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiRoutingBean.kt @@ -2,6 +2,9 @@ package com.mogo.och.unmanned.taxi.bean import com.mogo.eagle.core.data.BaseData +/** + * 灰度路线信息 + */ data class GrayLineBean( var lineId: Long?, //线路id var lineName: String?, //线路名称 @@ -11,18 +14,30 @@ data class GrayLineBean( var lineFailCount: Int?, //线路累计反馈不可用次数 var isChoosed: Boolean = false, //当前是否选中 var startSite: RoutingSite?, - var endSite: RoutingSite? + var endSite: RoutingSite?, + var hdMapDBVersionCode: String?,// Routing 运营平台通过算路引擎算这条路时候使用的对应高精地图版本号 + var hdMapDBVersionName: String?,// Routing 运营平台通过算路引擎算这条路时候使用的对应高精地图版本名 + var routingEnginVersionCode: String?,// Routing 运营平台当前的算路引擎版本号码 + var routingEnginVersionName: String?,// Routing 运营平台当前的算路引擎版本名称 + var wayPoints: MutableList?,// Routing 给算路引擎使用的经停点列表,不是真正的要停车 + var blackPoints: MutableList?// Routing 给算路引擎使用的黑名单点,目的是不参与算路 ) +/** + * 站点信息 + */ data class RoutingSite( - var siteId: Long, - var siteName: String, - var gcjLat: Double, - var gcjLon: Double, - var wgs84Lon: Double, - var wgs84Lat: Double + var siteId: Long,// 站点ID + var siteName: String,// 站点名称 + var gcjLat: Double,// 高德坐标 + var gcjLon: Double,// 高德坐标 + var wgs84Lon: Double,//高精坐标 + var wgs84Lat: Double//高精坐标 ) +/** + * 轨迹信息 + */ data class ContrailBean( var lineId: Long = -1L, var lineName: String = "", @@ -37,32 +52,74 @@ data class ContrailBean( var txtFileUrlDPQP: String = "", var txtFileMd5DPQP: String = "", var contrailSaveTimeDPQP: Long = -1L, - var version: Long = -1L + var version: Long = -1L, + var passPoints: MutableList?, // 用于算路的经停点 ) +/** + * 查询灰度线路列表 + */ data class QueryGrayContrailListRsp(var data: MutableList?) : BaseData() + +/** + * 通过id查询轨迹详情 + */ data class StartGrayContrailTaskReq(var sn: String, var contrailId: Long) + +/** + * 开始一个路线的灰度任务,对服务端的路线标记 + */ data class StartGrayContrailTaskRsp(var data: Long?) : BaseData() + +/** + * 根据id查询灰度轨迹详情 + */ data class QueryRoutingContrailByIdRsp(var data: ContrailBean?) : BaseData() + +/** + * 上报路线打点 + */ data class SubmitGrayLineIssueLocationReq(var grayId: Long, var gcjLon: Double, var gcjLat: Double) -data class EndGrayContrailTaskReq(var grayId: Long, var feedback: Int,var occurrenceTime:Long) //feedback 1:成功 2:失败 + +/** + * 结束一个路线的灰度任务 + */ +data class EndGrayContrailTaskReq( + var grayId: Long, + var feedback: Int, + var occurrenceTime: Long +) //feedback 1:成功 2:失败 + + +/** + * 灰度任务&查询轨迹详情 + */ data class StartGrayAndQueryContrailRsp( var taskId: Long?, var contrail: ContrailBean?, var grayLineBean: GrayLineBean ) : BaseData() -data class PointError(var code:String,var name:String,var isCheck:Boolean = false) +data class PointError(var code: String, var name: String, var isCheck: Boolean = false) + +/** + * 获取打点问题字典 + */ data class QueryPointErrorReasonsRsp(var data: MutableList?) : BaseData() + +/** + * 结束一个路线的灰度任务,并上报灰度路线测试情况 + */ data class SaveGrayContrailErrorReasons( var grayId: Long, var gcjLon: Double, var gcjLat: Double, var wgs84Lon: Double, var wgs84Lat: Double, - var occurrenceTime:Long, + var occurrenceTime: Long, var noteCodes: MutableList, ) //feedback 1:成功 2:失败 + enum class EndGrayTaskFeedbackType(var type: Int) { USABLE_YES(1), USABLE_NO(2) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiRoutingCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiRoutingCallback.kt index aa61832b16..639dc98d64 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiRoutingCallback.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiRoutingCallback.kt @@ -4,14 +4,59 @@ import com.mogo.och.unmanned.taxi.bean.GrayLineBean import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp interface ITaxiRoutingCallback { + /** + * 查询灰度路线列表--成功✅ + */ fun onQueryRoutingGrayLineListSuccess(data: MutableList) + + /** + * 查询灰度路线列表--失败❌ + * @param errorStr 错误信息 + */ fun onQueryRoutingGrayLineListFailed(errorStr: String) + + /** + * 灰度任务&查询轨迹详情--成功✅ + */ fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) + + /** + * 灰度任务&查询轨迹详情--失败❌ + * @param errorStr 错误信息 + */ fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) + + /** + * 灰度任务过程中,上报问题打点--成功✅ + */ fun onSubmitGrayLineIssueLocationSuccess() + + /** + * 灰度任务过程中,上报问题打点--失败❌ + * @param errorStr 错误信息 + */ fun onSubmitGrayLineIssueLocationFailed(errorStr: String) + + /** + * 结束灰度任务--成功✅ + */ fun onSubmitEndTaskSuccess() + + /** + * 结束灰度任务--成功❌ + * @param errorStr 错误信息 + */ fun onSubmitEndTaskFailed(errorStr: String) + + /** + * MAP到站通知 + * @param grayId 灰度路线ID + */ fun onAutoPilotArriveAtEndStation(grayId: Long?) + + /** + * 自车定位围栏 + * @param grayId 灰度路线ID + */ fun onGDMapArriveAtEndStation(grayId: Long?) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/constant/TaxiOrderStatusEnum.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/constant/TaxiOrderStatusEnum.kt deleted file mode 100644 index cbe2724f4d..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/constant/TaxiOrderStatusEnum.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.mogo.och.unmanned.taxi.constant - -/** - * Created on 2021/12/7 - * - * * Old code:START - * 未派单 0 - * 去往上车站点 1 - * 车辆已到达上车站点 2 - * 乘客已到达上车站点 3 - * 去往下车站点 4 - * 到达下车站点 5 - * 已完成 6 - * 已取消 7 - * Old code:END - * - * 0 订单创建(为派单), - * 10 已派上司机(司机去往上车点), - * 20 司机到达上车点, - * 30 乘客到达上车点, - * 40 服务中(去往目的地), - * 50 到达目的地, - * 60 已完成, - * 70 已取消 - */ -enum class TaxiOrderStatusEnum(val code: Int) { - None( 0 ), - OnTheWayToStart( 10), - ArriveAtStart( 20), - UserArriveAtStart( 30), - OnTheWayToEnd( 40), - ArriveAtEnd( 50), - JourneyCompleted(60),//行程完成 - Cancel( 70); - - companion object { - @JvmStatic - fun valueOf(code: Int): TaxiOrderStatusEnum? { - for (value in values()) { - if (value.code == code) { - return value - } - } - return None - } - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceManager.kt index 440de1898e..d7be74f6e9 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceManager.kt @@ -105,6 +105,9 @@ object TaxiRoutingServiceManager { .subscribe(OchCommonSubscribeImpl(context, callback, "dot/list")) } + /** + * 标记灰度任务被启动验证 + */ fun startGrayTaskAndQueryRoutingContrail( context: Context, sn: String, diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceApi.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceApi.kt index 41b0622477..5324ae986e 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceApi.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceApi.kt @@ -3,6 +3,8 @@ package com.mogo.och.unmanned.taxi.network import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.BaseData +import com.mogo.och.data.taxi.QueryCarOrderByNoReqBean +import com.mogo.och.data.taxi.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.taxi.bean.ArriveSiteReqBean import com.mogo.och.unmanned.taxi.bean.CancelOrderReqBean import com.mogo.och.unmanned.taxi.bean.TrajectoryListRespBean @@ -10,8 +12,6 @@ import com.mogo.och.unmanned.taxi.bean.JumpPassengerCheckReqBean import com.mogo.och.unmanned.taxi.bean.OrderCompletedReqBean import com.mogo.och.unmanned.taxi.bean.PrepareTaskReqBean import com.mogo.och.unmanned.taxi.bean.PrepareTaskRespBean -import com.mogo.och.unmanned.taxi.bean.QueryCarOrderByNoReqBean -import com.mogo.och.unmanned.taxi.bean.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.unmanned.taxi.bean.StartServiceReqBean import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt index 99cc3a930e..cd79b5555a 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiTaskWithOrderServiceManager.kt @@ -8,14 +8,14 @@ import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformTry +import com.mogo.och.data.taxi.QueryCarOrderByNoReqBean +import com.mogo.och.data.taxi.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.taxi.bean.ArriveSiteReqBean import com.mogo.och.unmanned.taxi.bean.CancelOrderReqBean import com.mogo.och.unmanned.taxi.bean.JumpPassengerCheckReqBean import com.mogo.och.unmanned.taxi.bean.OrderCompletedReqBean import com.mogo.och.unmanned.taxi.bean.PrepareTaskReqBean import com.mogo.och.unmanned.taxi.bean.PrepareTaskRespBean -import com.mogo.och.unmanned.taxi.bean.QueryCarOrderByNoReqBean -import com.mogo.och.unmanned.taxi.bean.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.unmanned.taxi.bean.StartServiceReqBean import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt index 131b6a204b..6a84d3dbeb 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/BaseTaxiTabFragment.kt @@ -20,20 +20,24 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState 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.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView import com.mogo.eagle.core.function.hmi.ui.widget.ParallelDriveView +import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.map.listener.IMogoMapListener import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.och.common.module.wigets.StartAutopilotAnimationView +import com.mogo.och.common.module.wigets.map.overmapview.OverMapDialog import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.START_AUTOPILOT_ANIMATION_INTERVAL import com.mogo.och.unmanned.taxi.ui.debug.DebugView import com.mogo.och.unmanned.taxi.ui.navi.amap.TaxiAmapNaviFragment import com.mogo.och.unmanned.taxi.ui.navi.auto.TaxiRoutingNaviFragment +import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.aciv_show_guid import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.groupTestPanel import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.mapBizView import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.module_mogo_och_autopilot_status @@ -70,6 +74,8 @@ abstract class BaseTaxiTabFragment> : MvpFragment> : MvpFragment(R.id.btnOpenDebugView)?.setOnClickListener { val intent = Intent() @@ -187,6 +195,15 @@ abstract class BaseTaxiTabFragment> : MvpFragment> : MvpFragment> : MvpFragment implements ITaxiADASStatusCallback, - ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback { + ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback, OrderListener { private static final String TAG = TaxiPresenter.class.getSimpleName(); @@ -61,6 +64,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiRoutingModel.INSTANCE.setControllerStatusCallback(this); TaxiRoutingModel.INSTANCE.setOrderStatusCallback(this); LoginStatusManager.INSTANCE.addListener(TAG,this); + OrderModel.INSTANCE.setOrderStatusCallback(TAG,this); } private void releaseListeners() { @@ -76,9 +80,12 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS * 开启自动驾驶 自驾模式 */ public void startAutoPilot() { + // 这里区分是订单还是灰度测试 if (MogoStatusManager.getInstance().isTaxiUnmanedDriverLineRoutingVerifyMode()) { + // 灰度测试 TaxiRoutingModel.INSTANCE.startAutoPilotByClick(); } else { + // 订单 TaxiTaskModel.INSTANCE.startAutopilotByClick(); } } @@ -93,9 +100,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiTaskModel.INSTANCE.startNaviToEndStation(isShow); } - public void reportToEndDisAndTime(long lastSumLength, long duration) {//米/秒 -// TaxiModel.INSTANCE.reportOrderRemain(lastSumLength,duration); - } @Override public void onAutopilotArriveEnd() { @@ -182,7 +186,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS @Override public void run() { if(mView!=null) { - onNaviToEnd(isAmap, isShow); + mView.onNaviToEnd(isAmap, isShow); } } }, UiThreadHandler.MODE.QUEUE); @@ -329,4 +333,29 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS public void resumeStartAutopilot(long remainingTime) { TaxiTaskModel.INSTANCE.resumeStartAutopilot(remainingTime); } + + @Override + public void onCurrentOrderStatusChanged(@Nullable BaseOrderBean order) { + if(order!=null){ + if (order.orderStatus == TaxiOrderStatusEnum.ArriveAtStart.getCode()) { + UiThreadHandler.post(new Runnable() { + @Override + public void run() { + if(mView!=null) { + mView.setGuidShow(); + } + } + }, UiThreadHandler.MODE.QUEUE); + }else if(order.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.getCode()){ + UiThreadHandler.post(new Runnable() { + @Override + public void run() { + if(mView!=null) { + mView.setGuidHide(); + } + } + }, UiThreadHandler.MODE.QUEUE); + } + } + } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt index bcf01580af..d002438123 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt @@ -32,7 +32,7 @@ import com.mogo.och.unmanned.taxi.bean.TrajectoryListRespBean import com.mogo.och.unmanned.taxi.callback.ITaxiTaskWithOrderCallback import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum -import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel import kotlinx.android.synthetic.main.unmanned_taxi_debug_order.view.btnContainer import kotlinx.android.synthetic.main.unmanned_taxi_debug_order.view.currentBusinessModeTextView diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/errorpoint/ReportErrorPointViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/errorpoint/ReportErrorPointViewModel.kt index 3e241f04f0..fa16a3d897 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/errorpoint/ReportErrorPointViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/errorpoint/ReportErrorPointViewModel.kt @@ -3,10 +3,9 @@ package com.mogo.och.unmanned.taxi.ui.errorpoint import androidx.lifecycle.ViewModel import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.BaseData -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.unmanned.taxi.bean.PointError import com.mogo.och.unmanned.taxi.bean.QueryPointErrorReasonsRsp @@ -65,8 +64,8 @@ class ReportErrorPointViewModel : ViewModel() { return } grayId?.let { - val gcj02 = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() - val wgs84 = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val gcj02 = OchLocationManager.getGCJ02Location() + val wgs84 = OchLocationManager.getWgs02Location() val errorReasonCodes = mutableListOf() checkDataList.forEach {pointError-> errorReasonCodes.add(pointError.code) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/navi/auto/TaxiMapDirectionView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/navi/auto/TaxiMapDirectionView.kt index 1abfd67797..ecbe51ebe0 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/navi/auto/TaxiMapDirectionView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/navi/auto/TaxiMapDirectionView.kt @@ -21,9 +21,9 @@ import com.amap.api.maps.model.Polyline import com.amap.api.maps.model.PolylineOptions 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.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.utils.TaxiMapAssetStyleUtil @@ -68,14 +68,14 @@ class TaxiMapDirectionView @JvmOverloads constructor( initAMapView() // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 3, this) + OchLocationManager.addGCJ02Listener(TAG, 3, this) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() // 注册定位监听 clearPolyline() - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) } private fun initAMapView() { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaskOrOrderAdapter.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaskOrOrderAdapter.kt index 7dd0678120..9246cd0ebf 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaskOrOrderAdapter.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaskOrOrderAdapter.kt @@ -20,7 +20,7 @@ import com.mogo.och.unmanned.taxi.bean.QueryOrdersRespBean import com.mogo.och.unmanned.taxi.bean.QueryTaskRespBean import com.mogo.och.unmanned.taxi.constant.OperationalOrderStatusEnum import com.mogo.och.unmanned.taxi.constant.StationTypeEnum -import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum /** * @author: wangmingjun diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt index 6b2d3310d6..b603912edf 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt @@ -90,6 +90,8 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { btnClose.setOnClickListener { finish() } + + // 选择路线后,「确认」按钮 btnChooseLineSubmit.setOnClickListener { if (mCurrentChosenPosition == -1) { ToastUtils.showLong("请先选择任务") @@ -99,11 +101,15 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { mLoadingDialog.showLoading() val chosenItem = mRoutingLineList[mCurrentChosenPosition] mViewModel.sendUiIntent( + // 调用查询接口获取路线详情 TaxiRoutingUiIntent.StartTaskAndQueryContrail(chosenItem) ) } } + /** + * 初始化UI观察者 + */ private fun initViewModelObserver() { lifecycleScope.launchWhenStarted { mViewModel.uiStateFlow.map { it.routingUiState }.collect { routingUiState -> @@ -111,6 +117,7 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { TAG, "uiStateFlow-initViewModelObserver: $routingUiState" ) + // 分发处理具体UI更新 when (routingUiState) { is RoutingUIState.Init -> { showEmptyView() @@ -128,6 +135,7 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { } } + // 将结果同步更新到UI is RoutingUIState.PostRoutingTaskResult -> { FlowBus.with(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK) .post(this, RoutingUIState.RoutingTask( diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt index 97eb4bf2b5..43d87d496f 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt @@ -32,6 +32,7 @@ class TaxiRoutingChooseLineAdapter( override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { val currentPosition = holder.bindingAdapterPosition val data = mData[currentPosition] + holder.lineNameTextView.text = data.lineName holder.todayVerifyNumTextView.text = "本车今日已验证:${data.carVerificationCount}次" holder.historyVerifyNumTextView.text = diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt index 62869d5bf7..777c04dc31 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt @@ -56,6 +56,9 @@ class TaxiRoutingChooseLineViewModel : BaseViewModel { DebugView.printInfoMsg("[开始任务] 准备开始任务") val grayLineBean = intent.routingTask.grayLineBean @@ -89,8 +94,7 @@ class TaxiRoutingFragmentViewModel : BaseViewModel { DebugView.printInfoMsg("[上报打点] 准备上报打点") val grayId = intent.grayId - val currentLocation = - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val currentLocation = OchLocationManager.getGCJ02Location() TaxiRoutingModel.submitGrayLineIssueLocation( grayId, currentLocation.longitude, @@ -147,6 +151,7 @@ class TaxiRoutingFragmentViewModel : BaseViewModel 100ms一次 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 5, mMapLocationListener) + OchLocationManager.addGCJ02Listener(TAG, 5, mMapLocationListener) } fun removeGDMapCurrentLocationListener() { - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) } + /** + * 查询灰度路线 + */ fun queryRoutingGrayLineList() { DebugView.printInfoMsg("[查询灰度路线] 准备发送请求,sn=${SharedPrefsMgr.getInstance().sn}") TaxiRoutingServiceManager.queryRoutingGrayLineList(mContext, @@ -255,6 +260,9 @@ object TaxiRoutingModel { }) } + /** + * 开始灰度任务&查询轨迹详情 + */ fun startGrayTaskAndQueryRoutingContrail(contrailId: Long, grayLineBean: GrayLineBean) { DebugView.printInfoMsg("[开始灰度任务&查询轨迹详情] 准备发送请求,contrailId=${contrailId}, lineId=${grayLineBean.lineId}") TaxiRoutingServiceManager.startGrayTaskAndQueryRoutingContrail( @@ -276,6 +284,9 @@ object TaxiRoutingModel { mTaxiRoutingCallbackMap.forEach { val listener = it.value listener.onStartGrayTaskAndQueryContrailSuccess(data) + + // Routing 从这里解析出经停信息,轨迹信息,并调用下载轨迹接口 + sendTrajectoryReq(data) } } @@ -315,6 +326,9 @@ object TaxiRoutingModel { ) } + /** + * 灰度任务过程中,上报问题打点 + */ fun submitGrayLineIssueLocation(grayId: Long, gcjLon: Double, gcjLat: Double) { DebugView.printInfoMsg("[上报打点] 准备发送请求,grayId=$grayId, gcjLon=$gcjLon, gcjLat=$gcjLat") val submit = SubmitGrayLineIssueLocationReq(grayId, gcjLon, gcjLat) @@ -374,9 +388,12 @@ object TaxiRoutingModel { ) } - fun endGrayTask(grayId: Long, type: EndGrayTaskFeedbackType, occurrenceTime:Long,) { + /** + * 结束灰度任务 + */ + fun endGrayTask(grayId: Long, type: EndGrayTaskFeedbackType, occurrenceTime: Long) { DebugView.printInfoMsg("[结束灰度任务] 准备发送请求,grayId=$grayId, type=${type.type}, typeName=${type.name}") - val submit = EndGrayContrailTaskReq(grayId, type.type,occurrenceTime) + val submit = EndGrayContrailTaskReq(grayId, type.type, occurrenceTime) TaxiRoutingServiceManager.endGrayTask( mContext, submit, @@ -432,6 +449,42 @@ object TaxiRoutingModel { }) } + /** + * 下载路线请求 + */ + fun sendTrajectoryReq(startGrayAndQueryContrailRsp: StartGrayAndQueryContrailRsp) { + startGrayAndQueryContrailRsp.contrail?.let { contrail -> + // 初始化自动驾驶需要的参数 + val parameters = initAutopilotControlParameters( + startGrayAndQueryContrailRsp.grayLineBean, + contrail + ) + + if (parameters!!.autoPilotLine == null) { + CallerLogger.e( + SceneConstant.M_BUS + TAG, + "sendTrajectoryReq(): mAutoPilotLine is null!!!" + ) + return + } + writeChainLog( + "轨迹监控", + "sendTrajectoryReq() 下发轨迹 轨迹id" + parameters.autoPilotLine!!.lineId, + true, + OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY + ) + CallerAutoPilotControlManager.sendTrajectoryDownloadReq(parameters) + CallerLogger.d( + SceneConstant.M_BUS + TAG, + "sendTrajectoryReq(): " + + GsonUtils.toJson(parameters) + ) + } + } + + /** + * 更新灰度路线信息 + */ fun updateCurrentGrayLineAndContrail( grayLineBean: GrayLineBean?, contrailBean: ContrailBean?, @@ -442,6 +495,9 @@ object TaxiRoutingModel { currentGrayId = grayId } + /** + * 灰度测试路线,启动自动驾驶 + */ fun startAutoPilotByClick() { if (currentGrayLineBean == null || currentContrailBean == null) { CallerLogger.e( @@ -454,6 +510,9 @@ object TaxiRoutingModel { startAutoPilot(currentGrayLineBean!!, currentContrailBean!!) } + /** + * 启动自动驾驶 + */ fun startAutoPilot(grayLineBean: GrayLineBean, contrailBean: ContrailBean) { if (grayLineBean.startSite == null || grayLineBean.endSite == null) { CallerLogger.e(TAG, "start site or end site is null") @@ -478,22 +537,21 @@ object TaxiRoutingModel { if (!CallerAutoPilotControlManager.isCanStartAutopilot(true)) { return } - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { + //4、ssm 给出数据 + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { DebugView.printErrorMsg("[启自驾] ${OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason}") - ToastUtils.showLong( - OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + - ", 请稍候重试" - ) return } + // 初始化自动驾驶需要的参数 val parameters = initAutopilotControlParameters(grayLineBean, contrailBean) if (null == parameters) { CallerLogger.e(TAG, "AutopilotControlParameters is empty.") return } - OchAutoPilotManager.startAutoPilot(parameters); + // 开启自动驾驶 + OchAutoPilotManager.startAutoPilot(parameters) DebugView.printInfoMsg("[启自驾] 调用成功") CallerLogger.d( @@ -503,6 +561,9 @@ object TaxiRoutingModel { mControllerStatusCallback?.startOpenAutopilot() } + /** + * 初始化自动驾驶控制参数 + */ private fun initAutopilotControlParameters( grayLineBean: GrayLineBean, contrailBean: ContrailBean @@ -520,6 +581,36 @@ object TaxiRoutingModel { parameters.startLatLon = AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon) parameters.endLatLon = AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon) + + // Routing 给算路引擎使用的:经停点列表、黑名单 + val wayLatLons: MutableList = ArrayList() + val blackLatLons: MutableList = ArrayList() + + if (!contrailBean.passPoints.isNullOrEmpty()) { + for (mogoLatLng in contrailBean.passPoints!!) { + wayLatLons.add( + AutopilotControlParameters.AutoPilotLonLat( + mogoLatLng.wgs84Lat, + mogoLatLng.wgs84Lon + ) + ) + } + } + + if (!grayLineBean.blackPoints.isNullOrEmpty()) { + for (mogoLatLng in grayLineBean.blackPoints!!) { + wayLatLons.add( + AutopilotControlParameters.AutoPilotLonLat( + mogoLatLng.wgs84Lat, + mogoLatLng.wgs84Lon + ) + ) + } + } + + parameters.wayLatLons = wayLatLons + parameters.blackLatLons = blackLatLons + if (parameters.autoPilotLine == null) { parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine( contrailBean.lineId, @@ -530,11 +621,11 @@ object TaxiRoutingModel { contrailBean.txtFileMd5, contrailBean.contrailSaveTime, TaxiUnmannedConst.BUSINESSTYPE.toString(), - contrailBean.csvFileUrlDPQP, - contrailBean.csvFileMd5DPQP, - contrailBean.txtFileUrlDPQP, - contrailBean.txtFileMd5DPQP, - contrailBean.contrailSaveTimeDPQP + "", + "", + "", + "", + -1L ) } return parameters diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiState.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiState.kt index c455353503..6797e281f2 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiState.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingUiState.kt @@ -6,6 +6,9 @@ import com.mogo.och.unmanned.taxi.bean.GrayLineBean data class TaxiRoutingUiState(val routingUiState: RoutingUIState) : IUiState +/** + * 算路UI状态 + */ sealed class RoutingUIState { object Init : RoutingUIState() diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskFragment.kt index dd6dfc911f..2e264384f8 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskFragment.kt @@ -13,7 +13,7 @@ import com.amap.api.navi.model.NaviLatLng import com.mogo.commons.mvp.BaseFragment import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02 +import com.mogo.eagle.core.function.hmi.ui.widget.ItinerarySummaryDialog import com.mogo.eagle.core.function.main.MainMoGoApplication import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -23,6 +23,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.util.ClickUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.map.ICommonNaviChangedCallback import com.mogo.och.common.module.utils.DateTimeUtil @@ -36,7 +38,6 @@ import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst -import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TAXI_END_MAP_MAKER import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TAXI_START_MAP_MAKER import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TYPE_MARKER_TAXI_ORDER @@ -73,6 +74,8 @@ class TaxiCurrentTaskFragment : BaseFragment(), private var mPrepareTasCountDownTimer: CountDownTimer? = null + private var dialog:ItinerarySummaryDialog? = null + companion object { const val TAG = M_TAXI + "TaxiCurrentTaskFragment" @@ -179,6 +182,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } is TaskWithOrderUIState.UpdateOrderTripInfo -> { + dialog?.setOrderMileage(taskAndOrderUiState.mileage*1000) taskOtherInfo.text = TaskUtils.getCurrentTaskTotalAndDurationHtml( taskAndOrderUiState.mileage, @@ -548,12 +552,14 @@ class TaxiCurrentTaskFragment : BaseFragment(), when (order.orderStatus) { TaxiOrderStatusEnum.None.code -> { //无 + dismissDialog() initContainerView(false) removeAllMapMarker() } TaxiOrderStatusEnum.ArriveAtEnd.code -> { //到达目的地 taskStatus.text = resources.getString(R.string.task_start_end_site) + showDialog() updateStartAndEndStationPointByStatus(true) updateTaskContainerBottomBtn( getString(R.string.module_och_taxi_order_server_end), @@ -565,6 +571,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } TaxiOrderStatusEnum.OnTheWayToEnd.code -> { //送驾中 + dismissDialog() taskStatus.text = resources.getString(R.string.task_start_end_site) updateStartAndEndStationPointByStatus(true) updateTaskContainerBottomBtn( @@ -577,6 +584,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), TaxiOrderStatusEnum.UserArriveAtStart.code, TaxiOrderStatusEnum.ArriveAtStart.code -> { //乘客到达上车点, 验证成功 ; 到达乘客上车点 + dismissDialog() taskStatus.text = resources.getString(R.string.arrived_start_site) updateStartAndEndStationPointByStatus(false) updateTaskContainerBottomBtn( @@ -592,6 +600,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } TaxiOrderStatusEnum.OnTheWayToStart.code -> { //前往上车地点 + dismissDialog() taskStatus.text = resources.getString(R.string.task_start_start_site) updateStartAndEndStationPointByStatus(false) updateTaskContainerBottomBtn( @@ -617,12 +626,10 @@ class TaxiCurrentTaskFragment : BaseFragment(), private fun startNaviToStation(isVoicePlay: Boolean, stationLat: Double, stationLng: Double) { AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() - val mCurLatitude = getChassisLocationGCJ02().latitude - val mCurLongitude = getChassisLocationGCJ02().longitude - d( - TAG, - "currentLatLng=$mCurLatitude $mCurLongitude" - ) + val gcJ02Location = OchLocationManager.getGCJ02Location() + val mCurLatitude = gcJ02Location.latitude + val mCurLongitude = gcJ02Location.longitude + d(TAG, "currentLatLng=$mCurLatitude $mCurLongitude") val startNaviLatLng = NaviLatLng(mCurLatitude, mCurLongitude) val endNaviLatLng = NaviLatLng(stationLat, stationLng) AmapNaviToDestinationModel.getInstance(context).initAMapNavi(startNaviLatLng, endNaviLatLng) @@ -830,4 +837,29 @@ class TaxiCurrentTaskFragment : BaseFragment(), mViewModel.startOrStopCurrentTaskWithOrderLoop(false) super.onDestroy() } + + private fun showDialog(){ + if(dialog==null&&context!=null){ + + } + context?.let { + if(dialog==null) { + dialog = ItinerarySummaryDialog(it, true, R.style.summary_dialog) + } + dialog?.let { dialogInner -> + if(!dialogInner.isShowing){ + dialogInner.show() + } + } + } + + } + private fun dismissDialog(){ + dialog?.let { + if(it.isShowing){ + it.dismiss() + } + } + dialog = null + } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskViewModel.kt index 818fca55e1..852c2fab6b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiCurrentTaskViewModel.kt @@ -7,7 +7,6 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig 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.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -16,8 +15,12 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager +import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.ToastUtilsOch import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.unmanned.taxi.R @@ -30,7 +33,6 @@ import com.mogo.och.unmanned.taxi.callback.ITaxiCarServiceCallback import com.mogo.och.unmanned.taxi.callback.ITaxiTaskWithOrderCallback import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum -import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst import com.mogo.och.unmanned.taxi.network.TaxiTaskWithOrderServiceManager import com.mogo.och.unmanned.taxi.ui.debug.DebugView @@ -212,6 +214,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), private fun updateOrderTripInfoUI(mileage: Float, duration: Int) { d(TAG, "updateOrderTripInfoUI") + OchChainLogManager.writeChainLog("到达目的地计算距离和时间", "距离:${mileage} 时间:${duration}") sendUiState { copy( taskWithOrderUIState = TaskWithOrderUIState.UpdateOrderTripInfo( @@ -242,6 +245,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), // 设置task执行相关状态,切换模式时判断使用 if (result == null || result.taskType == TaskTypeEnum.None.code) { MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) + LineManager.setLineId(-1) } else { MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, true) } @@ -269,6 +273,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), val endStation = MogoLocation() endStation.longitude = curTaskAndOrder.endSite!!.gcjLon endStation.latitude = curTaskAndOrder.endSite!!.gcjLat + LineManager.setLineId(result.lineId) TrajectoryAndDistanceManager.setStationPoint( startStation, endStation, @@ -336,6 +341,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), TaxiTaskModel.cancelAutopilot() // 设置task执行相关状态,切换模式时判断使用 MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) + LineManager.setLineId(-1) } override fun onOrderArriveAtEnd(orderNo: String) { @@ -359,6 +365,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), } // 设置task执行相关状态,切换模式时判断使用 MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) + LineManager.setLineId(-1) } override fun onStartAutopilot(postDelayTime: Long) { @@ -439,9 +446,10 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), } override fun onCarStartServiceFailed(code: Int, msg: String) { + val gcJ02Location = OchLocationManager.getGCJ02Location() ToastUtilsOch.showWithCodeMessage( code, - "$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" + " curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}" + "$msg curLatitude = ${gcJ02Location.latitude}" + " curLongitude = ${gcJ02Location.longitude}" ) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiOrderCancelDialog.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiOrderCancelDialog.java index 58fdc7d207..ddd170a5f3 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiOrderCancelDialog.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiOrderCancelDialog.java @@ -24,7 +24,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.och.unmanned.taxi.R; import com.mogo.och.unmanned.taxi.constant.TaxiOrderCancelReasons; -import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum; +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum; import java.lang.ref.WeakReference; diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt index c732001b8f..89a58a8d80 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt @@ -21,10 +21,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Liste import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener import com.mogo.eagle.core.function.api.unmanned.IUnmannedListener 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.CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02 import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager import com.mogo.eagle.core.network.utils.GsonUtil @@ -33,34 +30,37 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i 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.DateTimeUtils import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager -import com.mogo.och.common.module.manager.socket.cloud.data.OCHOperationalMessage -import com.mogo.och.common.module.biz.login.LoginStatusManager -import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.biz.login.LoginService +import com.mogo.och.common.module.biz.login.LoginStatusManager +import com.mogo.och.common.module.biz.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.common.module.callback.OchAdasStartFailureCallback -import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager import com.mogo.och.common.module.manager.autopilot.autopilot.ArrivedStation import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager +import com.mogo.och.common.module.manager.autopilot.line.LineManager +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.distance.IDistanceListener import com.mogo.och.common.module.manager.distance.ITrajectoryListener import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager -import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager.setStationPoint +import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager +import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager +import com.mogo.och.common.module.manager.socket.cloud.data.OCHOperationalMessage import com.mogo.och.common.module.map.AmapNaviToDestinationModel +import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations import com.mogo.och.common.module.utils.OCHThreadPoolManager import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.data.bean.BusStationBean +import com.mogo.och.data.taxi.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.taxi.bean.PrepareTaskRespBean -import com.mogo.och.unmanned.taxi.bean.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean import com.mogo.och.unmanned.taxi.bean.TrajectoryListRespBean @@ -72,7 +72,6 @@ import com.mogo.och.unmanned.taxi.callback.ITaxiOrderStatusCallback import com.mogo.och.unmanned.taxi.callback.ITaxiTaskWithOrderCallback import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum -import com.mogo.och.unmanned.taxi.constant.TaxiOrderStatusEnum import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.BUSINESSTYPE import com.mogo.och.unmanned.taxi.network.TaxiTaskWithOrderServiceManager @@ -215,7 +214,7 @@ object TaxiTaskModel { // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 OchAutoPilotStatusListenerManager.addListener(TAG, mMogoAutopilotStatusListener) //定位监听, 传false是高德坐标系 10 -> 100ms一次 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 5, mMapLocationListener) + OchLocationManager.addGCJ02Listener(TAG, 5, mMapLocationListener) //2021.11.1 自动驾驶路线规划接口 CallerPlanningRottingListenerManager.addListener(TAG, mMogoAutopilotPlanningListener) //开启自驾后 异常信息返回 @@ -246,7 +245,7 @@ object TaxiTaskModel { ) // 注销地图监听 - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) OCHSocketMessageManager.releaseSocketMessageListener(OCHSocketMessageManager.msgMonitorType) OchAutoPilotStatusListenerManager.removeListener(mMogoAutopilotStatusListener) CallerPlanningRottingListenerManager.removeListener(mMogoAutopilotPlanningListener) @@ -644,6 +643,7 @@ object TaxiTaskModel { DebugView.printInfoMsg("[上报ArriveSite] success siteId=$siteId, isArriveAtEndSite=$isArriveAtEndSite") d(TAG, "submitArriveSite-onSuccess data=" + GsonUtil.jsonFromObject(data)) mDriveToNearestStationTask = null + LineManager.setLineId(-1) if (isArrivedNearestStation) {// 播报提醒 VoiceNotice.showNotice("已到达出车点") } @@ -774,6 +774,7 @@ object TaxiTaskModel { if (newOrderStatus!=mCurrentTaskWithOrder?.order?.orderStatus) { // 订单状态发生改变 orderStatusChange = true + OrderModel.invokeListener(mCurrentTaskWithOrder?.order) } } //订单或者伪任务更新, 都去刷新下界面 @@ -824,7 +825,8 @@ object TaxiTaskModel { d(TAG, "queryCurrentTaskOnce ArriveAtEnd") //订单到站结束轨迹剩余里程就算和高德计算, 防止到站查询订单全程的显示被覆盖 - setStationPoint(null, null, -1L) + LineManager.setLineId(-1) + TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) destroyAmapNavi() mTaxiTaskWithOrderCallbackMap.forEach { @@ -898,7 +900,8 @@ object TaxiTaskModel { if (mDriveToNearestStationTask == null){ destroyAmapNavi() } - setStationPoint(null, null, -1L) + LineManager.setLineId(-1) + TrajectoryAndDistanceManager.setStationPoint(null, null, -1L) } fun queryOrderByOrderNo(orderNo: String) { @@ -911,6 +914,7 @@ object TaxiTaskModel { TaxiOrderStatusEnum.Cancel.code -> { //更新本地标志位 mCurrentTaskWithOrder = null + OrderModel.invokeListener(data.data) mTaxiTaskWithOrderCallbackMap.forEach { val listener = it.value listener.onOrderCancel() @@ -918,6 +922,7 @@ object TaxiTaskModel { } TaxiOrderStatusEnum.ArriveAtEnd.code -> { + OrderModel.invokeListener(data.data) mTaxiTaskWithOrderCallbackMap.forEach { val listener = it.value listener.onOrderTripInfoChanged( @@ -930,6 +935,7 @@ object TaxiTaskModel { TaxiOrderStatusEnum.JourneyCompleted.code -> { //更新本地标志位 mCurrentTaskWithOrder = null + OrderModel.invokeListener(data.data) mTaxiTaskWithOrderCallbackMap.forEach { val listener = it.value listener.onOrderJourneyCompleted() @@ -1142,9 +1148,9 @@ object TaxiTaskModel { } else { //暂停接单状态下,去接单 DebugView.printInfoMsg("[开始接单] 准备发送请求") + val gcJ02Location = OchLocationManager.getGCJ02Location() TaxiTaskWithOrderServiceManager.startService(mContext, - getChassisLocationGCJ02().latitude, - getChassisLocationGCJ02().longitude, + gcJ02Location.latitude, gcJ02Location.longitude, object : OchCommonServiceCallback { override fun onSuccess(data: StartServiceRespBean?) { if (data == null) return @@ -1250,7 +1256,27 @@ object TaxiTaskModel { } // 3、距离轨迹15m计算 mCurrentTaskWithOrder?.let { - val resion = TrajectoryAndDistanceManager.canStartAutopilot(it.lineId) + var resion = OchAutoPilotManager.canStartAutoPilot(it.lineId) + if (TrajectoryAndDistanceManager.errorTypeNoneLineId == resion) { + val curTaskAndOrder = getCurrentTaskWithOrder() + if (curTaskAndOrder!=null) { + if (curTaskAndOrder.startSite != null && curTaskAndOrder.endSite != null) { + val startStation = MogoLocation() + startStation.longitude = curTaskAndOrder.startSite!!.gcjLon + startStation.latitude = curTaskAndOrder.startSite!!.gcjLat + val endStation = MogoLocation() + endStation.longitude = curTaskAndOrder.endSite!!.gcjLon + endStation.latitude = curTaskAndOrder.endSite!!.gcjLat + LineManager.setLineId(curTaskAndOrder.lineId) + TrajectoryAndDistanceManager.setStationPoint( + startStation, + endStation, + curTaskAndOrder.lineId + ) + } + } + resion = OchAutoPilotManager.canStartAutoPilot(it.lineId) + } if(!StringUtils.isEmpty(resion)){ ToastUtils.showShort(resion); VoiceNotice.showNotice(resion); @@ -1258,11 +1284,7 @@ object TaxiTaskModel { } } // 4、ssm 给出数据 - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { - ToastUtils.showLong( - OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + - ", 请稍候重试" - ) + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { DebugView.printErrorMsg("[启自驾] ${OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason}") val orderNo = mCurrentTaskWithOrder?.order?.orderNo TaxiAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent( @@ -1473,13 +1495,11 @@ object TaxiTaskModel { // 登出 fun logout() { - LoginStatusManager.loginOut( - getChassisLocationGCJ02().latitude, - getChassisLocationGCJ02().longitude - ) + LoginStatusManager.loginOut() mCurrentTaskWithOrder = null mDriveToNearestStationTask = null DebugView.printInfoMsg("[登出] 退出登陆") + LineManager.setLineId(-1) MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) MogoStatusManager.getInstance().setTaxiUnmanedDriverTakingOrders(TAG, false) MogoStatusManager.getInstance().setTaxiUnmanedDriverLineRoutingPerformTask(TAG, false) diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable-nodpi/taxi_overmap_tag.png b/OCH/taxi/unmanned-driver/src/main/res/drawable-nodpi/taxi_overmap_tag.png new file mode 100644 index 0000000000..b0bcc4fc03 Binary files /dev/null and b/OCH/taxi/unmanned-driver/src/main/res/drawable-nodpi/taxi_overmap_tag.png differ diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml index c0c197cf4f..1a78cd4b71 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml @@ -138,6 +138,15 @@ android:visibility="invisible" app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity"/> + +,. + + + + + + + + + + + + + + + + + + + + + - - + + + + data; + @Override + public String toString() { + return "TaxiPassengerGetTrajectoryByLineIdRespBean{" + + "data=" + data + + ", code=" + code + + ", msg='" + msg + '\'' + + '}'; + } + public static class TrajectoryInfo { public long lineId; // line id public String lineName; // line name @@ -21,6 +30,25 @@ public class TaxiPassengerGetTrajectoryByLineIdRespBean extends BaseData { public String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“” public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“” public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 + + @Override + public String toString() { + return "TrajectoryInfo{" + + "lineId=" + lineId + + ", lineName='" + lineName + '\'' + + ", csvFileUrl='" + csvFileUrl + '\'' + + ", csvFileMd5='" + csvFileMd5 + '\'' + + ", txtFileUrl='" + txtFileUrl + '\'' + + ", txtFileMd5='" + txtFileMd5 + '\'' + + ", contrailSaveTime=" + contrailSaveTime + + ", carModel='" + carModel + '\'' + + ", csvFileUrlDPQP='" + csvFileUrlDPQP + '\'' + + ", csvFileMd5DPQP='" + csvFileMd5DPQP + '\'' + + ", txtFileUrlDPQP='" + txtFileUrlDPQP + '\'' + + ", txtFileMd5DPQP='" + txtFileMd5DPQP + '\'' + + ", contrailSaveTimeDPQP=" + contrailSaveTimeDPQP + + '}'; + } } public TrajectoryInfo getTrajectoryInfoByLineId(long lineId) { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java index f38755a0c2..7a4918cf1b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java @@ -1,7 +1,7 @@ package com.mogo.och.unmanned.passenger.bean; import com.mogo.eagle.core.data.BaseData; -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean; +import com.mogo.och.data.taxi.BaseOrderBean; import java.util.List; import java.util.Objects; @@ -13,6 +13,15 @@ import java.util.Objects; public class TaxiPassengerOrdersInServiceQueryRespBean extends BaseData { public Result data; + @Override + public String toString() { + return "TaxiPassengerOrdersInServiceQueryRespBean{" + + "data=" + data + + ", code=" + code + + ", msg='" + msg + '\'' + + '}'; + } + public static class Result { public String sn; // sn public long lineId = -1; //路线id,默认-1 @@ -23,6 +32,20 @@ public class TaxiPassengerOrdersInServiceQueryRespBean extends BaseData { public OrderBean order; public TaxiPassengerGetTrajectoryByLineIdRespBean.TrajectoryInfo trajectoryInfoByQuery;//通过line id查询的详细信息 + + @Override + public String toString() { + return "Result{" + + "sn='" + sn + '\'' + + ", lineId=" + lineId + + ", servingStatus=" + servingStatus + + ", currentStatus=" + currentStatus + + ", taskType=" + taskType + + ", endSite=" + endSite + + ", order=" + order + + ", trajectoryInfoByQuery=" + trajectoryInfoByQuery + + '}'; + } } public static class SiteBean { @@ -33,6 +56,18 @@ public class TaxiPassengerOrdersInServiceQueryRespBean extends BaseData { public Double wgs84Lon;// wgs84 经度 public Double wgs84Lat;// wgs84 纬度 + @Override + public String toString() { + return "SiteBean{" + + "siteId=" + siteId + + ", siteName='" + siteName + '\'' + + ", gcjLon=" + gcjLon + + ", gcjLat=" + gcjLat + + ", wgs84Lon=" + wgs84Lon + + ", wgs84Lat=" + wgs84Lat + + '}'; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -56,6 +91,11 @@ public class TaxiPassengerOrdersInServiceQueryRespBean extends BaseData { public Long orderLine;//送驾的lineId + @Override + public String getEndSiteAddr() { + return orderEndSite.siteName; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt index 6821f3cf27..81fafca75b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.kt @@ -11,4 +11,5 @@ interface IOCHTaxiPassengerOrderStatusCallback { fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long,stationDistance:Int){} fun onMessageGo2OverMapview(){} + fun onCurrentOrderDistAndduration(mileage: Float, duration: Float){} } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt index 98c7c67ffb..7e01039091 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/AutopilotManager.kt @@ -18,7 +18,7 @@ import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManage import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.voice.VoiceNotice -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.unmanned.passenger.bean.TaxiPassengerBaseRespBean import com.mogo.och.unmanned.passenger.constant.TaxiPassengerConst import com.mogo.och.unmanned.passenger.network.TaxiPassengerServiceManager @@ -52,7 +52,7 @@ object AutopilotManager : IOchAutopilotStatusListener { ToastUtils.showShort("当前订单不存在或异常!") return "当前订单不存在或异常!" } - if (TaxiPassengerModel.currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.code) { + if (TaxiPassengerModel.currentOCHOrder!!.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code) { startAutoPilotServiceByPassenger() } TaxiPassengerModel.currentTrajectoryInfo?.let { @@ -80,11 +80,8 @@ object AutopilotManager : IOchAutopilotStatusListener { if (!CallerAutoPilotControlManager.isCanStartAutopilot(false)) { return "启动自动驾驶不满足条件" } - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { - ToastUtils.showLong( - OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + - ", 请稍候重试" - ) + // 4、ssm 给出数据 + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { TaxiPassengerAnalyticsManager.triggerUnableStartAPReasonEvent( TaxiPassengerModel.currentOCHOrder!!.orderStartSite.siteName, TaxiPassengerModel.currentOCHOrder!!.orderEndSite.siteName, @@ -110,13 +107,14 @@ object AutopilotManager : IOchAutopilotStatusListener { + " ,startSiteName=" + TaxiPassengerModel.currentOCHOrder!!.orderStartSite.siteName + " ,endSiteName=" + TaxiPassengerModel.currentOCHOrder!!.orderEndSite.siteName ) + val lineId = TaxiPassengerModel.currentLineId?:-1 TaxiPassengerAnalyticsManager.triggerStartAutopilotEvent( false, false, TaxiPassengerModel.currentOCHOrder!!.orderStartSite.siteName, TaxiPassengerModel.currentOCHOrder!!.orderEndSite.siteName, - TaxiPassengerModel.currentOCHOrder!!.orderNo.toInt(), - TaxiPassengerModel.currentLineId.toString(), + lineId.toInt(), + TaxiPassengerModel.currentOCHOrder!!.orderNo, System.currentTimeMillis() ) needSpeakByStartAutopilot = true @@ -200,7 +198,7 @@ object AutopilotManager : IOchAutopilotStatusListener { // 启动自驾成功 when (state) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { - if (TaxiPassengerModel.currentOCHOrder != null && TaxiPassengerModel.curOrderStatus === TaxiPassengerOrderStatusEnum.UserArriveAtStart) { + if (TaxiPassengerModel.currentOCHOrder != null && TaxiPassengerModel.curOrderStatus === TaxiOrderStatusEnum.UserArriveAtStart) { TaxiPassengerAnalyticsManager.triggerStartAutopilotEvent( false, true, diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt index b8280ede11..b0460b5f58 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt @@ -29,9 +29,10 @@ import com.mogo.och.common.module.manager.loop.LoopInfo import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceNotice -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum.Companion.valueOf -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum.Companion.valueOf +import com.mogo.och.common.module.biz.order.OrderModel +import com.mogo.och.data.taxi.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerBaseRespBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerGetTrajectoryByLineIdRespBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerOrderQueryRespBean @@ -216,8 +217,8 @@ object TaxiPassengerModel { currentOCHOrder = currentOrder orderStatusChange() } else if (currentOCHOrder?.orderStatus != currentOrder.orderStatus) { - if (currentOCHOrder?.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.code - && currentOrder.orderStatus < TaxiPassengerOrderStatusEnum.UserArriveAtStart.code + if (currentOCHOrder?.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code + && currentOrder.orderStatus < TaxiOrderStatusEnum.UserArriveAtStart.code ) { // 0830 UserArriveAtStart 状态是乘客屏本地在用户验证后本地设置,而且因为后端查询数据有延迟 // 这里过下过滤,如果当前是UserArriveAtStart 且后端返回是之前状态,不更新数据 @@ -275,9 +276,9 @@ object TaxiPassengerModel { && currentOCHOrder != null && currentOCHOrder!!.orderNo == data.data.orderNo ) { - if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.code - || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.code - || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.code + if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code + || data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code + || data.data.orderStatus == TaxiOrderStatusEnum.None.code ) { currentOCHOrder = data.data orderStatusChange() @@ -298,11 +299,11 @@ object TaxiPassengerModel { } // 获取当前订单状态 - val curOrderStatus: TaxiPassengerOrderStatusEnum + val curOrderStatus: TaxiOrderStatusEnum get() { val order: TaxiPassengerOrdersInServiceQueryRespBean.OrderBean = currentOCHOrder - ?: return TaxiPassengerOrderStatusEnum.None + ?: return TaxiOrderStatusEnum.None return valueOf(order.orderStatus) } @@ -376,7 +377,7 @@ object TaxiPassengerModel { override fun onSuccess(data: TaxiPassengerBaseRespBean) { if (data.code == 0 && currentOCHOrder != null) { currentOCHOrder!!.orderStatus = - TaxiPassengerOrderStatusEnum.UserArriveAtStart.code + TaxiOrderStatusEnum.UserArriveAtStart.code //乘客验证成功,更新订单状态为 "乘客已上车", 立马弹出乘客开始行程页面,不再等待轮询 orderStatusChange() VoiceNotice.showNotice( @@ -405,18 +406,18 @@ object TaxiPassengerModel { private fun orderStatusChangeInner() { when (curOrderStatus) { - TaxiPassengerOrderStatusEnum.OnTheWayToStart -> { + TaxiOrderStatusEnum.OnTheWayToStart -> { } - TaxiPassengerOrderStatusEnum.ArriveAtStart -> { + TaxiOrderStatusEnum.ArriveAtStart -> { } - TaxiPassengerOrderStatusEnum.UserArriveAtStart -> { + TaxiOrderStatusEnum.UserArriveAtStart -> { //开启轮询司机是否已准备好开启自动驾驶的环境 setStation() } - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> { + TaxiOrderStatusEnum.OnTheWayToEnd -> { CallerFuncBizManager.bizProvider.queryV2XEvents() //全览模式的V2X事件轮询开始 //startOrStopQueryOrderRemaining(true) AutopilotManager.updateAutopilotControlParameters() @@ -424,26 +425,27 @@ object TaxiPassengerModel { CallerOrderListenerManager.invokeOrderStatus(true) } - TaxiPassengerOrderStatusEnum.ArriveAtEnd -> { + TaxiOrderStatusEnum.ArriveAtEnd -> { AutopilotManager.clearAutopilotControlParameters() + queryOrderRouteInfo() //startOrStopQueryOrderRemaining(false) CallerOrderListenerManager.invokeOrderStatus(false) clearStation() } - TaxiPassengerOrderStatusEnum.JourneyCompleted -> { + TaxiOrderStatusEnum.JourneyCompleted -> { AutopilotManager.clearAutopilotControlParameters() //startOrStopQueryOrderRemaining(false) clearStation() } - TaxiPassengerOrderStatusEnum.Cancel -> { + TaxiOrderStatusEnum.Cancel -> { AutopilotManager.clearAutopilotControlParameters() //startOrStopQueryOrderRemaining(false) clearStation() } - TaxiPassengerOrderStatusEnum.None -> { + TaxiOrderStatusEnum.None -> { //AutopilotManager.clearAutopilotControlParameters() //startOrStopQueryOrderRemaining(false) clearStation() @@ -451,6 +453,23 @@ object TaxiPassengerModel { } } + fun queryOrderRouteInfo() { + if (currentOCHOrder == null) return + TaxiPassengerServiceManager.queryOrderRouteInfo( + currentOCHOrder!!.orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryCarOrderByNoRespBean) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderDistAndduration(data.data.mileage,data.data.duration) + } + } + + override fun onFail(code: Int, msg: String) {} + } + + ) + } + private fun setStation() { if (currentOCHOrder != null && currentLineId != null) { val startStation = MogoLocation() diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceApi.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceApi.kt index 4fc66c9f4a..edee8fb524 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceApi.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceApi.kt @@ -2,6 +2,8 @@ package com.mogo.och.unmanned.passenger.network import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.och.data.taxi.QueryCarOrderByNoReqBean +import com.mogo.och.data.taxi.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerBaseRespBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerGetTrajectoryByLineIdRespBean @@ -88,4 +90,12 @@ internal interface TaxiPassengerServiceApi { @Header("ticket") ticket: String= SharedPrefsMgr.getInstance().token, @Body data: TaxiPassengerStartReqBean ): Observable + + @Headers("Content-type:application/json;charset=UTF-8") + @POST("/och-taxi-cabin/api/business/v1/queryCarOrder") + fun queryOrderRouteInfo( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, + @Body data: QueryCarOrderByNoReqBean? + ): Observable } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceManager.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceManager.kt index 2139fe50c0..31174aae06 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceManager.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/network/TaxiPassengerServiceManager.kt @@ -2,6 +2,7 @@ package com.mogo.och.unmanned.passenger.network import android.content.Context import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -10,6 +11,8 @@ import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformTry +import com.mogo.och.data.taxi.QueryCarOrderByNoReqBean +import com.mogo.och.data.taxi.QueryCarOrderByNoRespBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerBaseRespBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerCheckPhoneUpdateOrderReqBean import com.mogo.och.unmanned.passenger.bean.TaxiPassengerGetTrajectoryByLineIdRespBean @@ -152,6 +155,22 @@ object TaxiPassengerServiceManager { .transformTry() .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderById")) } + /** + * 根据订单号查询订单, 主要是拿完成或者被乘客取消的订单状态 + */ + @JvmStatic + fun queryOrderRouteInfo( + orderNo: String, + callback: OchCommonServiceCallback? + ) { + if (beforeNet()) { + return + } + mOCHTaxiServiceApi.queryOrderRouteInfo( + data = QueryCarOrderByNoReqBean(SharedPrefsMgr.getInstance().sn, orderNo) + ).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryCarOrderByOrderNo")) + } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt index 0753d362b2..285cf4109f 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt @@ -9,10 +9,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager import com.mogo.och.unmanned.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean -import com.mogo.och.taxi.passenger.ui.model.order.OrderListener -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.unmanned.passenger.callback.IOCHTaxiPassengerOrderStatusCallback import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel import com.mogo.och.unmanned.passenger.ui.TaxiPassengerBaseFragment @@ -56,7 +57,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : private fun updateOrderView(order: TaxiPassengerOrdersInServiceQueryRespBean.OrderBean?) { setItineraryVisibility() when (TaxiPassengerModel.curOrderStatus) { - TaxiPassengerOrderStatusEnum.OnTheWayToStart -> { + TaxiOrderStatusEnum.OnTheWayToStart -> { // 10 接驾中 mView?.showOrHideCheckAndStartAutopilotView(3) @@ -64,19 +65,19 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : overMapViewClear() } - TaxiPassengerOrderStatusEnum.ArriveAtStart -> { + TaxiOrderStatusEnum.ArriveAtStart -> { // 20 司机到达上车点 mView?.showOrHideCheckAndStartAutopilotView(0) overMapViewClear() } - TaxiPassengerOrderStatusEnum.UserArriveAtStart -> { + TaxiOrderStatusEnum.UserArriveAtStart -> { // 30 乘客到达上车点 mView?.showOrHideCheckAndStartAutopilotView(1) overMapViewClear() } - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> { + TaxiOrderStatusEnum.OnTheWayToEnd -> { // 服务中(去往目的地) mView?.showOrHideArrivedEndLayout(isShow = false) @@ -85,13 +86,12 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : overMapViewShow() } - TaxiPassengerOrderStatusEnum.ArriveAtEnd -> { + TaxiOrderStatusEnum.ArriveAtEnd -> { // 50 到达终点 乘客可以评价 mView?.showOrHideArrivedEndLayout(true) - overMapViewClear() } - TaxiPassengerOrderStatusEnum.JourneyCompleted -> { + TaxiOrderStatusEnum.JourneyCompleted -> { // 60 行程完成 mView?.showOrHideCheckAndStartAutopilotView(3) @@ -99,7 +99,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : overMapViewClear() } - TaxiPassengerOrderStatusEnum.Cancel -> { + TaxiOrderStatusEnum.Cancel -> { // 70 取消订单 mView?.showOrHideCheckAndStartAutopilotView(3) @@ -107,7 +107,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : overMapViewClear() } - TaxiPassengerOrderStatusEnum.None -> { + TaxiOrderStatusEnum.None -> { // 00 默认状态,在不同任务之间切换时使用 mView?.showOrHideCheckAndStartAutopilotView(3) @@ -129,14 +129,14 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : fun setItineraryVisibility() { UiThreadHandler.post { when (TaxiPassengerModel.curOrderStatus) { - TaxiPassengerOrderStatusEnum.None, - TaxiPassengerOrderStatusEnum.OnTheWayToStart, - TaxiPassengerOrderStatusEnum.ArriveAtStart, - TaxiPassengerOrderStatusEnum.JourneyCompleted, - TaxiPassengerOrderStatusEnum.ArriveAtEnd, - TaxiPassengerOrderStatusEnum.Cancel -> mView?.showOrHideServingOrderFragment(false) - TaxiPassengerOrderStatusEnum.UserArriveAtStart, - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> mView?.showOrHideServingOrderFragment(true) + TaxiOrderStatusEnum.None, + TaxiOrderStatusEnum.OnTheWayToStart, + TaxiOrderStatusEnum.ArriveAtStart, + TaxiOrderStatusEnum.JourneyCompleted, + TaxiOrderStatusEnum.ArriveAtEnd, + TaxiOrderStatusEnum.Cancel -> mView?.showOrHideServingOrderFragment(false) + TaxiOrderStatusEnum.UserArriveAtStart, + TaxiOrderStatusEnum.OnTheWayToEnd -> mView?.showOrHideServingOrderFragment(true) } } } @@ -145,6 +145,13 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : mView?.showOverMapView() } + override fun onCurrentOrderDistAndduration(mileage: Float, duration: Float) { + UiThreadHandler.post({ + OchChainLogManager.writeChainLog("到达目的地计算距离和时间","距离:${mileage} 时间:${duration}") + mView?.showDuringAndDistance(mileage*1000,duration) + },UiThreadHandler.MODE.QUEUE) + } + companion object { private val TAG = BaseTaxiPassengerPresenter::class.java.simpleName } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt index e7f94b5c94..d39945ec74 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt @@ -9,7 +9,9 @@ import android.view.View import com.alibaba.android.arouter.launcher.ARouter import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P @@ -18,17 +20,19 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.map.listener.IMogoMapListener import com.mogo.och.common.module.biz.provider.CommonService import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.xiaozhi.ZhiStateManager import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.taxi.passenger.ui.arrived.ArrivedView import com.mogo.och.unmanned.taxi.passenger.R import com.mogo.och.taxi.passenger.ui.bar.LeftBarView import com.mogo.och.taxi.passenger.ui.bar.RightBarView import com.mogo.och.unmanned.passenger.presenter.BaseTaxiPassengerPresenter -import com.mogo.och.unmanned.passenger.ui.arrived.ArrivedView -import com.mogo.och.unmanned.passenger.ui.bottom.BottomBar +import com.mogo.och.taxi.passenger.ui.bottom.BottomBar +import com.mogo.och.taxi.passenger.ui.debug.DebugCallback import com.mogo.och.unmanned.passenger.ui.checkstartautopilot.ChekAndStartAutopilotView -import com.mogo.och.unmanned.passenger.ui.statusview.StatusBarView +import com.mogo.och.taxi.passenger.ui.statusview.StatusBarView import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.arrivedView import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.bottom @@ -57,7 +61,7 @@ import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.speedView */ class TaxiPassengerBaseFragment() : MvpFragment(), IMogoMapListener, - TaxiPassengerTaxiView { + TaxiPassengerTaxiView, DebugCallback { private var statusBarView: StatusBarView? = null @@ -79,7 +83,7 @@ class TaxiPassengerBaseFragment() : super.initViews(savedInstanceState) mapBizView!!.onCreate(savedInstanceState) overMapView.onCreateView(savedInstanceState) - overMapView.hideResetView() + //overMapView.hideResetView() val commonService = ARouter.getInstance().build(OchCommonConst.TAXI_UNMANNED_PASSENGER).navigation(); if(commonService is CommonService){ @@ -107,11 +111,12 @@ class TaxiPassengerBaseFragment() : BottomBar.SelectView.PRECISIONMAP -> { //切换到地图中间 mapBizView.getUI()?.let { - it.changeMapVisualAngle(it.getVrAngleDefaultMode(), null) + val wgs02Location = OchLocationManager.getWgs02Location() + it.moveToCenter(MogoLatLng(wgs02Location.latitude,wgs02Location.longitude)) } } BottomBar.SelectView.OVERMAPVIEW -> { - overMapView.displayCustomOverView() + //overMapView.displayCustomOverView() } else -> {} @@ -127,6 +132,7 @@ class TaxiPassengerBaseFragment() : override fun onApplyClick(selectItem: BottomBar.SelectView) { when (selectItem) { BottomBar.SelectView.PRECISIONMAP -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.VISIBLE) overMapView.visibility = View.GONE mapBizView.visibility = View.VISIBLE presenter?.setItineraryVisibility() @@ -140,12 +146,14 @@ class TaxiPassengerBaseFragment() : } rbv_setting_music.setShowOnlySetting(0) lbv_go2_center.visibility = View.VISIBLE + lbv_go2_center.showAngle() pcnActionView.visibility = View.VISIBLE CallerHmiManager.showTrafficLightView() infoVideoView.visibility = View.GONE CallerHmiManager.showTurnLightView() } BottomBar.SelectView.OVERMAPVIEW -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) overMapView.visibility = View.VISIBLE mapBizView.visibility = View.GONE presenter?.setItineraryVisibility() @@ -153,13 +161,15 @@ class TaxiPassengerBaseFragment() : romaPView.updateVisible(false) romaDistanceView.visibility = View.GONE rbv_setting_music.setShowOnlySetting(0) - lbv_go2_center.visibility = View.VISIBLE + lbv_go2_center.visibility = View.GONE + //lbv_go2_center.showOnlyCenter() pcnActionView.visibility = View.VISIBLE CallerHmiManager.showTrafficLightView() infoVideoView.visibility = View.GONE CallerHmiManager.showTurnLightView() } BottomBar.SelectView.VIDEO -> { + CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.GONE) overMapView.visibility = View.GONE mapBizView.visibility = View.GONE presenter?.setItineraryVisibility() @@ -247,9 +257,9 @@ class TaxiPassengerBaseFragment() : * * @param isShow */ - fun showOrHideServingOrderFragment(isShow: Boolean) { + override fun showOrHideServingOrderFragment(isShow: Boolean) { when (bottom.getCurrentPage()) { - BottomBar.SelectView.OVERMAPVIEW,BottomBar.SelectView.PRECISIONMAP -> { + BottomBar.SelectView.OVERMAPVIEW, BottomBar.SelectView.PRECISIONMAP -> { if (isShow) { if(itinerary.visibility!=View.VISIBLE) { itinerary.visibility = View.VISIBLE @@ -260,7 +270,7 @@ class TaxiPassengerBaseFragment() : } } } - BottomBar.SelectView.VIDEO,BottomBar.SelectView.NONE -> { + BottomBar.SelectView.VIDEO, BottomBar.SelectView.NONE -> { if(itinerary.visibility!=View.GONE) { itinerary.visibility = View.GONE } @@ -270,7 +280,7 @@ class TaxiPassengerBaseFragment() : - fun showOrHideCheckAndStartAutopilotView(status:Int){ + override fun showOrHideCheckAndStartAutopilotView(status:Int){ UiThreadHandler.post { arrivedView.visibility = View.GONE when (status) { @@ -278,6 +288,7 @@ class TaxiPassengerBaseFragment() : if (chekAndStartAutopilotView.visibility == View.GONE) { showOrHide(false,"显示手机号check") } + bottom.setBagVisable(BottomBar.SelectView.OVERMAPVIEW,View.VISIBLE) chekAndStartAutopilotView.aniCheckAndStartAutopilot(true, 0) } 1 -> { @@ -309,10 +320,10 @@ class TaxiPassengerBaseFragment() : fun setOverMapDebug(){ - overMapView.setDebugMode(true) + //overMapView.setDebugMode(true) showOrHide(true,"Debug 按钮") } - fun setEvaluateView(){ + override fun setEvaluateView(){ evaluate.visibility = View.VISIBLE } @@ -325,13 +336,14 @@ class TaxiPassengerBaseFragment() : * * @param isShow true 展示 false 隐藏 */ - fun showOrHideArrivedEndLayout(isShow: Boolean) { + override fun showOrHideArrivedEndLayout(isShow: Boolean) { //chekAndStartAutopilotView.visibility = View.GONE evaluate.visibility = View.GONE if (isShow) { exitFullVideoScreen(true) arrivedView.aniArrived(true) showOrHide(false,"显示到达目的地") + bottom.setBagVisable(BottomBar.SelectView.OVERMAPVIEW,View.GONE) RxUtils.createSubscribe(500) { arrivedView.setDataAndStartAnimation() VoiceNotice.showNotice("已到达目的地,带好随身物品,右侧下车更安全!期待下次再见", AIAssist.LEVEL2) @@ -350,8 +362,8 @@ class TaxiPassengerBaseFragment() : fun showOrHideOverMapView() { CallerLogger.d(M_TAXI_P + TAG, "showOrHideOverMapView 清理轨迹和站点") - overMapView?.clearV2XMarkers() - overMapView?.clearCustomPolyline() + //overMapView?.clearV2XMarkers() + overMapView?.clearAllMarkersAndPolyline() } fun showOverMapView() { @@ -486,6 +498,10 @@ class TaxiPassengerBaseFragment() : arrivedView.preLoadImages() } + fun showDuringAndDistance(mileage: Float, duration: Float) { + arrivedView.setMileageAndDuration(mileage,duration) + } + companion object { @JvmField diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedView.kt deleted file mode 100644 index 5428217cec..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedView.kt +++ /dev/null @@ -1,179 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.arrived - -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -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 androidx.lifecycle.ViewModelProvider -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -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.manager.xiaozhi.ZhiViewmanager -import com.mogo.och.common.module.utils.BigFrameAnimatorContainer -import com.mogo.och.common.module.utils.RxUtils -import com.mogo.och.unmanned.passenger.ui.TaxiPassengerBaseFragment -import com.mogo.och.common.module.wigets.WindowRelativeLayout -import com.mogo.och.unmanned.taxi.passenger.R -import io.reactivex.disposables.Disposable -import kotlinx.android.synthetic.main.taxt_u_p_arrived_end_panel.view.aciv_bg -import kotlinx.android.synthetic.main.taxt_u_p_arrived_end_panel.view.aciv_close -import kotlinx.android.synthetic.main.taxt_u_p_arrived_end_panel.view.actv_endstation -import kotlinx.android.synthetic.main.taxt_u_p_arrived_end_panel.view.v_video_right_rear_view -import me.jessyan.autosize.utils.AutoSizeUtils - -/** - * - * 评价View - * Created on 2022/5/16 - */ -class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { - - constructor(context: Context?) : super(context) - - constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet) - - constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) - - constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) - - private var subscribe: Disposable?=null - - private var taxiPxiaozhiLove: BigFrameAnimatorContainer?=null - - var arrivedVisilityChangeListenr:ArrivedVisilityChangeListenr?=null - - private lateinit var viewModel: ArrivedViewModel - - - private fun initView() { - d(SceneConstant.M_TAXI_P + TAG, "initView") - LayoutInflater.from(context).inflate(R.layout.taxt_u_p_arrived_end_panel, this, true) - - aciv_close.onClick { - visibility = View.GONE - } - } - - override fun onVisibilityAggregated(isVisible: Boolean) { - super.onVisibilityAggregated(isVisible) - d(SceneConstant.M_TAXI_P + TAG, "展示---:${isVisible}") - if (isVisible) { - if(taxiPxiaozhiLove==null) { - taxiPxiaozhiLove = - BigFrameAnimatorContainer(R.array.arrived_dest, 31, aciv_bg, isOnce = true) - } - taxiPxiaozhiLove?.start() - v_video_right_rear_view.resetView() - aniSpeedSettingRow() - viewModel.setEndInfo() - ZhiViewmanager.showListeningAni(ZhiViewmanager.loveAni) - } else { - v_video_right_rear_view.resetView() - taxiPxiaozhiLove = null - RxUtils.disposeSubscribe(subscribe) - ZhiViewmanager.showListeningAni(ZhiViewmanager.normalAni) - } - arrivedVisilityChangeListenr?.isShow(isVisible) - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - viewModel = ViewModelProvider(this).get(ArrivedViewModel::class.java) - viewModel.setViewCallback(this) - } - - /** - * 设置目的地重置星星状态 - */ - fun setDataAndStartAnimation() { - subscribe = RxUtils.createSubscribe(60_000) { - visibility = View.GONE - } - } - - companion object { - const val TAG = "TaxiPassengerArrivedView" - } - - init { - try { - initView() - } catch (e: Exception) { - e.printStackTrace() - } - } - - override fun setEndStation(stationName: String) { - actv_endstation.text = stationName - } - - - override fun preLoadImages() { - if (taxiPxiaozhiLove==null) { - taxiPxiaozhiLove = BigFrameAnimatorContainer(R.array.arrived_dest, 31,aciv_bg,isOnce = true) - } - } - - - fun aniArrived(show:Boolean){ - RxUtils.createSubscribe(500) { - val alphaStart: Float - val alphaEnd: Float - if(show){ - alphaStart = 0.0f - alphaEnd = 1f - visibility = View.VISIBLE - }else{ - alphaStart = 1f - alphaEnd = 0.0f - visibility = View.GONE - } - ObjectAnimator.ofFloat(this@ArrivedView, "alpha", alphaStart, alphaEnd).apply { - duration = 500 - addListener(object :AnimatorListenerAdapter(){ - override fun onAnimationEnd(animation: Animator) { - CallerLogger.d(TaxiPassengerBaseFragment.TAG,"onAnimationEndcarrivedView") - if(show){ - visibility = View.VISIBLE - }else{ - visibility = View.GONE - } - } - }) - }.start() - } - } - - private fun aniSpeedSettingRow(){ - val translationYStart = - AutoSizeUtils.dp2px(context,180f).toFloat() - val translationYEnd: Float = 0f - val alphaStart: Float = 0f - val alphaEnd: Float = 1f - - val translationX = ObjectAnimator.ofFloat( - v_video_right_rear_view, - "translationX", - translationYStart, - translationYEnd - ).apply { - duration = 1000 - } - val alpha = - ObjectAnimator.ofFloat(v_video_right_rear_view, "alpha", alphaStart, alphaEnd).apply { - duration = 1000 - } - val animatorSet = AnimatorSet() - animatorSet.playTogether(mutableListOf(translationX,alpha)) - animatorSet.start() - } - - interface ArrivedVisilityChangeListenr{ - fun isShow(show: Boolean) - } - -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedViewModel.kt deleted file mode 100644 index ac1994c46b..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedViewModel.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.arrived - -import androidx.lifecycle.ViewModel -import com.mogo.och.common.module.manager.distance.IDistanceListener -import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager -import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel - -class ArrivedViewModel : ViewModel(), IDistanceListener { - - private val TAG = ArrivedViewModel::class.java.simpleName - - private var viewCallback: ArrivedViewCallback? = null - - private var havePreLoadOrderNum: String? = null - - init { - TrajectoryAndDistanceManager.addDistanceListener(TAG, this) - } - - fun setViewCallback(viewCallback: ArrivedViewCallback) { - this.viewCallback = viewCallback - - } - - fun setEndInfo() { - TaxiPassengerModel.currentOCHOrder?.orderEndSite?.let { - this.viewCallback?.setEndStation(it.siteName) - } - } - - override fun distanceCallback(distance: Float) { - if (distance <= 50) { - TaxiPassengerModel.currentOCHOrder?.orderNo?.let { - if (it != havePreLoadOrderNum) { - this.viewCallback?.preLoadImages() - havePreLoadOrderNum = it - } - } - } - } - - override fun onCleared() { - super.onCleared() - this.viewCallback = null - } - - - interface ArrivedViewCallback { - fun setEndStation(stationName: String) - fun preLoadImages() - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/RightRearCamView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/RightRearCamView.kt deleted file mode 100644 index e56952e288..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/RightRearCamView.kt +++ /dev/null @@ -1,172 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.arrived - -import android.content.Context -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.graphics.drawable.BitmapDrawable -import android.util.AttributeSet -import android.view.LayoutInflater -import androidx.constraintlayout.widget.ConstraintLayout -import com.mogo.eagle.core.function.api.autopilot.IMoGoBackCameraVideoListener -import com.mogo.eagle.core.function.api.autopilot.IMoGoRoboBusJinlvM1StitchedVideoListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager -import com.mogo.eagle.core.function.call.autopilot.CallerBackCameraVideoListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerRoboBusJinlvM1StitchedVideoListenerManager -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.UiThreadHandler -import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider -import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxt_u_p_right_rear_cam.view.actv_cam_position_group -import kotlinx.android.synthetic.main.taxt_u_p_right_rear_cam.view.v_video_right_rear - -/** - * - * 评价View - * Created on 2022/5/16 - */ -class RightRearCamView : ConstraintLayout , IMoGoBackCameraVideoListener, - IMoGoRoboBusJinlvM1StitchedVideoListener,Runnable { - - constructor(context: Context) : super(context) - - constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) - - constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) - - constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) - - private var mBitmap: Bitmap? = null - - private var mBitmapOptions: BitmapFactory.Options? = null //Bitmap管理类,可有效减少Bitmap的OOM问题 - - - private fun initView() { - d(SceneConstant.M_TAXI_P + TAG, "initView") - LayoutInflater.from(context).inflate(R.layout.taxt_u_p_right_rear_cam, this, true) - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - } - - override fun onVisibilityAggregated(isVisible: Boolean) { - super.onVisibilityAggregated(isVisible) - if(isVisible){ - d(SceneConstant.M_TAXI_P + TAG, "展示--可见") - CallerAutoPilotControlManager.setIsSubscribeBackCameraVideoVideo(1, true) - CallerBackCameraVideoListenerManager.addListener(TAG, this) - CallerRoboBusJinlvM1StitchedVideoListenerManager.addListener(TAG, this) - }else{ - d(SceneConstant.M_TAXI_P + TAG, "展示--不可见") - CallerAutoPilotControlManager.setIsSubscribeBackCameraVideoVideo(1, false) - CallerBackCameraVideoListenerManager.removeListener(this) - CallerRoboBusJinlvM1StitchedVideoListenerManager.removeListener(this) - } - } - - - companion object { - const val TAG = "RightRearCamView" - } - - init { - try { - initView() - } catch (e: Exception) { - e.printStackTrace() - } - } - - fun resetView(){ - actv_cam_position_group.visibility = GONE - v_video_right_rear.setImageResource(R.drawable.taxt_u_p_right_rear_cam) - } - - override fun onBackCameraVideo(data: ByteArray) { - decodeData(data) - } - - override fun onRoboBusJinlvM1StitchedVideo(data: ByteArray) { - decodeData(data) - } - - var preTime :Long=System.currentTimeMillis() - - @Synchronized - private fun decodeData(data: ByteArray){ - val currentTimeMillis = System.currentTimeMillis() - val dexTime = currentTimeMillis - preTime - preTime = currentTimeMillis - if(dexTime<20){ - return - } - d(SceneConstant.M_TAXI_P + TAG, "图片频率:$dexTime") - if (mBitmapOptions == null) { - val bmp = (v_video_right_rear.drawable as BitmapDrawable).bitmap - val width = bmp.width - val height = bmp.height - val config = bmp.config - mBitmap = Bitmap.createBitmap(width, height, config) - mBitmapOptions = BitmapFactory.Options() - //设置Bitmap内存复用 - mBitmapOptions!!.inBitmap = mBitmap //Bitmap复用内存块,类似对象池,避免不必要的内存分配和回收 - mBitmapOptions!!.inMutable = true //解码时返回可变Bitmap - - val options = BitmapFactory.Options() - options.inJustDecodeBounds = true - BitmapFactory.decodeByteArray(data, 0, data.size, options) - mBitmapOptions!!.inSampleSize = calculateInSampleSize(options, width, height) - } - mBitmapOptions?.let { - try { - val preTime = System.currentTimeMillis() - BitmapFactory.decodeByteArray(data, 0, data.size, mBitmapOptions) - d(SceneConstant.M_TAXI_P + TAG, "decode时间:${System.currentTimeMillis()-preTime}") - UiThreadHandler.post(this) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int { - val width = options.outWidth - val height = options.outHeight - d(SceneConstant.M_TAXI_P + TAG, "calculateInSampleSize: out width and height is $width height $height") - var inSampleWidth = 1 - if (height > reqHeight || width > reqWidth) { - val halfHeight = height / 2 - val halfWidth = width / 2 - // 采样率设置为2的指数 - while (halfHeight / inSampleWidth >= reqHeight && halfWidth / inSampleWidth >= reqWidth) { - inSampleWidth *= 2 - } - } - - while (width/inSampleWidth>reqWidth||height/inSampleWidth>reqHeight){ - inSampleWidth++ - } - - return inSampleWidth - } - - - override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { - super.onSizeChanged(w, h, oldw, oldh) - outlineProvider = TextureVideoViewOutlineProvider(36f) - clipToOutline = true - } - - override fun run() { - if(actv_cam_position_group?.visibility == GONE) { - actv_cam_position_group?.visibility = VISIBLE - } - v_video_right_rear?.setImageBitmap(mBitmap) - v_video_right_rear?.scaleX = -1f - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomBar.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomBar.kt deleted file mode 100644 index fff921dc45..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomBar.kt +++ /dev/null @@ -1,81 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.bottom - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import androidx.constraintlayout.widget.ConstraintLayout -import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxt_u_p_bottom_bar.view.actv_overmap -import kotlinx.android.synthetic.main.taxt_u_p_bottom_bar.view.actv_video -import kotlinx.android.synthetic.main.taxt_u_p_bottom_bar.view.actv_precisionmap - -class BottomBar @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr) { - - private var checkIndex = SelectView.NONE - private var overMapViewApply:ApplyClickLintener?=null - - init { - isClickable = true - LayoutInflater.from(context).inflate(R.layout.taxt_u_p_bottom_bar, this, true) - setBackgroundResource(R.drawable.taxt_u_p_bottom_bar_bg) - actv_precisionmap.setOnClickListener { - setCheckIndex(SelectView.PRECISIONMAP) - } - actv_overmap.setOnClickListener { - setCheckIndex(SelectView.OVERMAPVIEW) - } - actv_video.setOnClickListener { - setCheckIndex(SelectView.VIDEO) - } - } - - fun getCurrentPage():SelectView{ - return checkIndex - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - setCheckIndex(SelectView.PRECISIONMAP) - } - - fun setOverMapApplyClick(overMapViewApply:ApplyClickLintener){ - this.overMapViewApply = overMapViewApply - } - - fun setCheckIndex(index: SelectView){ - if(checkIndex==index){ - return - }else{ - checkIndex = index - } - overMapViewApply?.onApplyClick(checkIndex) - if(checkIndex == SelectView.OVERMAPVIEW){ - actv_overmap.setCheckItem(true) - }else{ - actv_overmap.setCheckItem(false) - } - if(checkIndex == SelectView.VIDEO){ - actv_video.setCheckItem(true) - }else{ - actv_video.setCheckItem(false) - } - if(checkIndex == SelectView.PRECISIONMAP){ - actv_precisionmap.setCheckItem(true) - }else{ - actv_precisionmap.setCheckItem(false) - } - } - - enum class SelectView{ - NONE,PRECISIONMAP,OVERMAPVIEW,VIDEO - } - - interface ApplyClickLintener{ - fun onApplyClick(selectItem:SelectView) - } - -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomCheckView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomCheckView.kt deleted file mode 100644 index 7a5b5258ad..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bottom/BottomCheckView.kt +++ /dev/null @@ -1,92 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.bottom - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxt_u_p_bottom_check.view.aciv_center_image -import kotlinx.android.synthetic.main.taxt_u_p_bottom_check.view.actv_title - -open class BottomCheckView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr) { - - companion object { - private const val TAG = "StopSiteView" - } - - private var backageViewId: Int = -1 - private var bottomTitle: String = "" - private var selectedDrawable: Int = -1 - private var normalDrawable: Int = -1 - private var bottomTitleNormalColor:Int = -1 - private var bottomTitleCheckedColor:Int = -1 - private var backageView: View? = null - - private var isCheck = false - - init { - LayoutInflater.from(context).inflate(R.layout.taxt_u_p_bottom_check, this, true) - try { - val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BottomSelectView) - backageViewId = typedArray.getResourceId(R.styleable.BottomSelectView_backageViewId, -1) - bottomTitle = typedArray.getString(R.styleable.BottomSelectView_bottomTitle) ?: "" - selectedDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_selectedDrawable, -1) - normalDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_normalDrawable, -1) - bottomTitleNormalColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleNormalColor, - ContextCompat.getColor(context,R.color.white)) - bottomTitleCheckedColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleCheckedColor, - ContextCompat.getColor(context,R.color.white)) - typedArray.recycle() - initView(context) - } catch (e: Exception) { - e.printStackTrace() - } - - } - - private fun initView(context: Context) { - if (selectedDrawable > 0) { - aciv_center_image.setImageResource(normalDrawable) - } - actv_title.text = bottomTitle - } - - fun setCheckItem(isCheck: Boolean) { - if (isCheck != this.isCheck) { - this.isCheck = isCheck - notifiBackageView() - } - } - - private fun notifiBackageView() { - if (isCheck) { - backageView?.visibility = View.VISIBLE - aciv_center_image.setImageResource(selectedDrawable) - actv_title.setTextColor(bottomTitleCheckedColor) - } else { - backageView?.visibility = View.GONE - aciv_center_image.setImageResource(normalDrawable) - actv_title.setTextColor(bottomTitleNormalColor) - } - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - parent?.let { - if (parent is ConstraintLayout) { - if (backageViewId > 0) { - backageView = (parent as ConstraintLayout).findViewById(backageViewId) - } - } - } - if (isCheck) { - backageView?.visibility = View.VISIBLE - } - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt index ae6f91ec18..2b82b384cf 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/ChekAndStartAutopilotViewModel.kt @@ -1,10 +1,10 @@ package com.mogo.och.unmanned.passenger.ui.checkstartautopilot import androidx.lifecycle.ViewModel -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean -import com.mogo.och.taxi.passenger.ui.model.order.OrderListener -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel class ChekAndStartAutopilotViewModel : ViewModel(), OrderListener { @@ -32,10 +32,10 @@ class ChekAndStartAutopilotViewModel : ViewModel(), OrderListener { override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { when (order?.orderStatus) { - TaxiPassengerOrderStatusEnum.ArriveAtStart.code -> { + TaxiOrderStatusEnum.ArriveAtStart.code -> { // 显示手机号验证 } - TaxiPassengerOrderStatusEnum.UserArriveAtStart.code -> { + TaxiOrderStatusEnum.UserArriveAtStart.code -> { // 显示启动自驾 } else -> { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/debug/DebugEvent.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/debug/DebugEvent.kt deleted file mode 100644 index c3819fc803..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/debug/DebugEvent.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.debug - -class DebugEvent { -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/debug/DebugView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/debug/DebugView.kt deleted file mode 100644 index cb207abd34..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/debug/DebugView.kt +++ /dev/null @@ -1,91 +0,0 @@ -package com.mogo.och.unmanned.passenger.ui.debug - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.fragment.app.FragmentActivity -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.util.ActivityUtils -import com.mogo.och.unmanned.passenger.ui.TaxiPassengerBaseFragment -import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_arrive -import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_evaluate -import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_order_info -import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_phone_check -import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_start_autopilot -import kotlinx.android.synthetic.main.taxt_u_p_debug.view.tv_show_start_autopilot_success -import org.greenrobot.eventbus.EventBus -import org.greenrobot.eventbus.Subscribe -import org.greenrobot.eventbus.ThreadMode - -class DebugView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener { - - companion object { - const val TAG = "DebugView" - } - - init { - LayoutInflater.from(context).inflate(R.layout.taxt_u_p_debug, this, true) - visibility = GONE - } - - private var fragment: TaxiPassengerBaseFragment?=null - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - - EventBus.getDefault().register(this) - - val activityByContext = ActivityUtils.getActivityByContext(context) - if(activityByContext is FragmentActivity){ - val fragment = - activityByContext.supportFragmentManager.findFragmentByTag(TaxiPassengerBaseFragment.TAG) - if(fragment is TaxiPassengerBaseFragment){ - this.fragment = fragment - } - } - - tv_show_arrive.onClick { - fragment?.showOrHideArrivedEndLayout(true) - } - tv_show_phone_check.onClick { - fragment?.showOrHideCheckAndStartAutopilotView(0) - } - tv_show_start_autopilot.onClick { - fragment?.showOrHideCheckAndStartAutopilotView(1) - } - tv_show_order_info.onClick { - fragment?.showOrHideServingOrderFragment(true) - } - tv_show_start_autopilot_success.onClick { - fragment?.showOrHideCheckAndStartAutopilotView(2) - } - tv_show_evaluate.onClick { - fragment?.setEvaluateView() - } - } - @Subscribe(threadMode = ThreadMode.MAIN) - fun changeOverview(debugEvent: DebugEvent) { - if(visibility== VISIBLE){ - visibility = GONE - }else{ - visibility = VISIBLE - } - } - - - - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - EventBus.getDefault().unregister(this) - } - -} - diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/OrderInfoViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/OrderInfoViewModel.kt index 511e20ff62..5b954c0329 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/OrderInfoViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/orderinfo/OrderInfoViewModel.kt @@ -6,10 +6,10 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.NumberFormatUtil import com.mogo.och.unmanned.taxi.passenger.R -import com.mogo.och.taxi.passenger.ui.model.order.TaxiPassengerOrderStatusEnum -import com.mogo.och.taxi.passenger.ui.model.order.BaseOrderBean -import com.mogo.och.taxi.passenger.ui.model.order.OrderListener -import com.mogo.och.taxi.passenger.ui.model.order.OrderModel +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.data.taxi.BaseOrderBean +import com.mogo.och.common.module.biz.order.OrderListener +import com.mogo.och.common.module.biz.order.OrderModel import com.mogo.och.unmanned.passenger.callback.IOCHTaxiPassengerOrderStatusCallback import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel import kotlin.math.ceil @@ -82,7 +82,7 @@ class OrderInfoViewModel: ViewModel(), IOCHTaxiPassengerOrderStatusCallback, Ord } } when (TaxiPassengerModel.curOrderStatus) { - TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> { + TaxiOrderStatusEnum.OnTheWayToEnd -> { } else ->{ diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt index 939ae142c8..c846111779 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/speed/SpeedView.kt @@ -7,8 +7,8 @@ import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout 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.util.UiThreadHandler +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxt_u_p_speed.view.actv_speed_value import kotlin.math.abs @@ -32,9 +32,9 @@ class SpeedView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { override fun onVisibilityAggregated(isVisible: Boolean) { super.onVisibilityAggregated(isVisible) if(isVisible){ - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 3, this) + OchLocationManager.addGCJ02Listener(TAG, 3, this) }else{ - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + OchLocationManager.removeGCJ02Listener(TAG) } } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt index c0ac16b9e8..cb2f1ddd09 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt @@ -23,7 +23,7 @@ import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager import com.mogo.och.common.module.wigets.media.MediaItem import com.mogo.och.unmanned.taxi.passenger.R -import com.mogo.och.unmanned.passenger.ui.statusview.StatusBarView +import com.mogo.och.taxi.passenger.ui.statusview.StatusBarView import com.mogo.och.unmanned.passenger.ui.video.FullVideoUtils import com.mogo.och.unmanned.passenger.utils.ZoomDrawable import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_arrived_glide.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_arrived_glide.png deleted file mode 100644 index adc24a4587..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_arrived_glide.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_bar_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_bar_bg.png deleted file mode 100755 index b05a7024f3..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_bar_bg.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_bar_select_bg.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_bar_select_bg.png deleted file mode 100755 index 4b60612ea3..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_bar_select_bg.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_overmap_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_overmap_normal.png deleted file mode 100644 index 039096dd66..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_overmap_normal.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_overmap_press.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_overmap_press.png deleted file mode 100644 index 5996ff1b61..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_overmap_press.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_precisionmap_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_precisionmap_normal.png deleted file mode 100644 index ebc9258cb7..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_precisionmap_normal.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_precisionmap_press.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_precisionmap_press.png deleted file mode 100644 index 1406939d8e..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_precisionmap_press.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_video_normal.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_video_normal.png deleted file mode 100644 index 92ed61f399..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_video_normal.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_video_press.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_video_press.png deleted file mode 100644 index 22f03e303b..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_bottom_video_press.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_right_rear_cam.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_right_rear_cam.png deleted file mode 100755 index cc4cdceca5..0000000000 Binary files a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxt_u_p_right_rear_cam.png and /dev/null differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_arrived_end_panel.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_arrived_end_panel.xml index c9c81e493d..fa8a889dc4 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_arrived_end_panel.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_arrived_end_panel.xml @@ -50,7 +50,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content"/> - - + android:layout_height="match_parent" /> @@ -66,7 +53,7 @@ android:layout_width="@dimen/dp_120" android:layout_height="@dimen/dp_120" android:layout_marginStart="@dimen/dp_60" - android:layout_marginTop="100dp" + android:layout_marginTop="110dp" android:background="@drawable/taxt_u_p_roma_bg_selector" app:layout_constraintStart_toEndOf="@+id/speedView" app:layout_constraintTop_toTopOf="parent" @@ -78,35 +65,116 @@ android:layout_width="@dimen/dp_334" android:layout_height="@dimen/dp_120" android:layout_marginStart="@dimen/dp_50" - android:layout_marginTop="100dp" + android:layout_marginTop="110dp" app:roma_distance_bg="@drawable/taxi_u_p_roma_distance_bg" app:layout_constraintLeft_toRightOf="@+id/romaPView" app:layout_constraintTop_toTopOf="parent" app:roma_change_dis_color="true" /> + + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="wrap_content"/> + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> - - - - - @@ -162,13 +210,13 @@ app:layout_constraintStart_toStartOf="parent" /> - - + + + + - diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_bottom_bar.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_bottom_bar.xml deleted file mode 100644 index 006138b112..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_bottom_bar.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_debug.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_debug.xml index 2fb8e73431..d91de2aa8b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_debug.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_debug.xml @@ -39,13 +39,25 @@ + + + + diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_right_rear_cam.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_right_rear_cam.xml deleted file mode 100644 index c75298b211..0000000000 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_right_rear_cam.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml b/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml index 0b76883ce1..76d73b23dc 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/values/colors.xml @@ -42,7 +42,6 @@ #2CBFFC #1060ff #96a5c2 - #76D7FF #255BAA #80F8FF #464646 diff --git a/app/build.gradle b/app/build.gradle index 0cdd1b7736..101a12d2e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -216,6 +216,7 @@ dependencies { implementation project(':core:mogo-core-function-call') implementation project(':core:mogo-core-utils') implementation project(':core:mogo-core-res') + implementation project(':tts:tts-iflytek') androidTestImplementation project(':core:mogo-core-function-call') androidTestImplementation project(':core:mogo-core-res') @@ -230,6 +231,8 @@ dependencies { androidTestImplementation rootProject.ext.dependencies.androidx_espresso_core androidTestImplementation rootProject.ext.dependencies.localbroadcastmanager androidTestImplementation rootProject.ext.dependencies.downloader + androidTestImplementation project(":libraries:mogo-map") + androidTestImplementation rootProject.ext.dependencies.jts_core } @@ -315,28 +318,28 @@ def variantName() { if(gradle.startParameter.taskNames.size()>0) { for (String taskName : gradle.startParameter.taskNames) { println "对比结果----------${taskName}" - if (taskName.contains("Yantai")) { - project.dependencies.add('implementation', project.project(':tts:tts-iflytek')) - }else if (taskName.contains("Mogo")) { - if(taskName.contains("Passenger")&&taskName.contains("T1T2")) { - println "Mogo环境T1T2车 引入小智----------${taskName}" - project.dependencies.add('implementation', project.project(':tts:tts-zhi')) - }else { - project.dependencies.add('implementation', project.project(':tts:tts-pad')) - } - }else if (taskName.contains("Dali")) { - project.dependencies.add('implementation', project.project(':tts:tts-pad')) - }else if (taskName.contains("Saas")) { - if(taskName.contains("Passenger")&&taskName.contains("T1T2")) { - println "Saas环境T1T2车 引入小智----------${taskName}" - project.dependencies.add('implementation', project.project(':tts:tts-zhi')) - }else { - project.dependencies.add('implementation', project.project(':tts:tts-pad')) - } - }else { - // 不能再else 加任何逻辑 是android dlc的特效 - println("-----------$taskName") - } +// if (taskName.contains("Yantai")) { +// project.dependencies.add('implementation', project.project(':tts:tts-iflytek')) +// }else if (taskName.contains("Mogo")) { +// if(taskName.contains("Passenger")&&taskName.contains("T1T2")) { +// println "Mogo环境T1T2车 引入小智----------${taskName}" +// project.dependencies.add('implementation', project.project(':tts:tts-zhi')) +// }else { +// project.dependencies.add('implementation', project.project(':tts:tts-pad')) +// } +// }else if (taskName.contains("Dali")) { +// project.dependencies.add('implementation', project.project(':tts:tts-pad')) +// }else if (taskName.contains("Saas")) { +// if(taskName.contains("Passenger")&&taskName.contains("T1T2")) { +// println "Saas环境T1T2车 引入小智----------${taskName}" +// project.dependencies.add('implementation', project.project(':tts:tts-zhi')) +// }else { +// project.dependencies.add('implementation', project.project(':tts:tts-pad')) +// } +// }else { +// // 不能再else 加任何逻辑 是android dlc的特效 +// println("-----------$taskName") +// } taskName = taskName.replace("Debug", "") taskName = taskName.replace("Release", "") diff --git a/app/script/projectFlavors/project.gradle b/app/script/projectFlavors/project.gradle index 90771ca079..6739f8e53d 100644 --- a/app/script/projectFlavors/project.gradle +++ b/app/script/projectFlavors/project.gradle @@ -5,6 +5,7 @@ project.android.productFlavors { mogo { dimension "project" buildConfigField 'boolean', 'secure', "true" + buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 buildConfigField 'String', 'URLs', "\"${readFileToJson("mogo").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("mogo").replace("\"", "\\\"")}\"" buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("mogo").replace("\"", "\\\"")}\"" @@ -13,6 +14,7 @@ project.android.productFlavors { yantai { dimension "project" buildConfigField 'boolean', 'secure', "false" + buildConfigField 'int', 'ttsLanguage', "1 << 1" // 中英韩 buildConfigField 'String', 'URLs', "\"${readFileToJson("yantai").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("yantai").replace("\"", "\\\"")}\"" buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("yantai").replace("\"", "\\\"")}\"" @@ -22,6 +24,7 @@ project.android.productFlavors { dali { dimension "project" buildConfigField 'boolean', 'secure', "true" + buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 buildConfigField 'String', 'URLs', "\"${readFileToJson("dali").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("dali").replace("\"", "\\\"")}\"" buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("dali").replace("\"", "\\\"")}\"" @@ -30,6 +33,7 @@ project.android.productFlavors { saas { dimension "project" buildConfigField 'boolean', 'secure', "true" + buildConfigField 'int', 'ttsLanguage', "1" // 仅中文 buildConfigField 'String', 'URLs', "\"${readFileToJson("saas").replace("\"", "\\\"")}\"" buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("saas").replace("\"", "\\\"")}\"" buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("saas").replace("\"", "\\\"")}\"" diff --git a/app/src/androidTest/assets/polygon.txt b/app/src/androidTest/assets/polygon.txt new file mode 100644 index 0000000000..a935bc5e02 --- /dev/null +++ b/app/src/androidTest/assets/polygon.txt @@ -0,0 +1 @@ +112.57337137520945,26.822950000610152,112.5733703998375,26.82294943400411,112.57336923793872,26.82294944578748,112.57336827709125,26.82295003202963,112.57336786590433,26.822950822795498,112.57332583348149,26.823144415135413,112.57332583904886,26.823145130116597,112.57332615359141,26.82314578706645,112.57332672775591,26.823146282906478,112.57332747145331,26.823146539837108,112.57332807078356,26.823146549872188,112.57332882464814,26.82314631801647,112.57332941903356,26.823145841742402,112.57332970267485,26.82314536795171,112.57339652767452,26.82297757920771,112.57339644737766,26.82297673161999,112.57339607387638,26.822976136665098,112.57337137520945,26.822950000610152 \ No newline at end of file diff --git a/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt b/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt index 9c8abe8e7d..28484dd9e8 100644 --- a/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt +++ b/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt @@ -1,180 +1,180 @@ -//package com.mogo.functions.test -// -//import android.os.* -//import androidx.test.core.app.* -//import androidx.test.ext.junit.runners.* -//import androidx.test.filters.* -//import com.mogo.eagle.core.data.v2x.V2XEvent -//import com.mogo.eagle.core.function.hmi.ui.* -//import com.mogo.eagle.core.function.main.* -//import com.mogo.eagle.core.data.v2x.V2XRoadXData -//import com.mogo.eagle.core.utilcode.util.GsonUtils -//import com.mogo.eagle.function.biz.v2x.v2n.V2XEventManager -//import kotlinx.coroutines.* -//import org.junit.* -//import org.junit.runner.* -//import roadwork.Road.* -//import java.util.concurrent.* -//import java.util.concurrent.TimeUnit.MILLISECONDS -//import java.util.concurrent.TimeUnit.SECONDS -//import kotlin.Result -// -//@RunWith(AndroidJUnit4::class) -//@LargeTest -//class RoadAITest { -// -// lateinit var launch: ActivityScenario -// -// @Before -// fun before() { -// launch = ActivityScenario.launch(MainLauncherActivity::class.java) -// } -// -// @Test -// fun test() = runBlocking(Dispatchers.Default) { -// // ensureMoGoHmiFragmentShow() -// val nanos = System.nanoTime() -// val child = -// RW_PB -// .newBuilder() -// .setHeader( -// Header -// .newBuilder() -// .setFrameId("rw") -// .setModuleName("ai_cloud") -// .setStamp(Time.newBuilder() -// .setSec(TimeUnit.NANOSECONDS.convert(nanos, SECONDS).toInt()) -// .setNsec(180000000) -// .build()) -// .build()) -// .setRoadwork( -// Roadwork_PB -// .newBuilder() -// .setId("4e47e17d-4950-4c80-9b02-29a450e54b50") -// .setScore(95) -// .setDetectTime(nanos) -// .setPoiType(100061) -// .setType(1006) -// .setCenter( -// Center_PB -// .newBuilder() -// .setRoad(Road_PB -// .newBuilder() -// .setRoadId("200091") -// .setLaneNo("-2") -// .setTileId("556834853") -// .setBearing(90) -// .build()) -// .setPoint(GPSPoint_PB -// .newBuilder() -// .setLat(40.20313763799314) -// .setLon(116.72844402744953) -// .build()) -// .build()) -// .addPolygon(0, GPSPoint_PB +package com.mogo.functions.test + +import android.os.* +import androidx.test.core.app.* +import androidx.test.ext.junit.runners.* +import androidx.test.filters.* +import com.mogo.eagle.core.data.v2x.V2XEvent +import com.mogo.eagle.core.function.hmi.ui.* +import com.mogo.eagle.core.function.main.* +import com.mogo.eagle.core.data.v2x.V2XRoadXData +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.function.biz.v2x.v2n.V2XEventManager +import kotlinx.coroutines.* +import org.junit.* +import org.junit.runner.* +import roadwork.Road.* +import java.util.concurrent.* +import java.util.concurrent.TimeUnit.MILLISECONDS +import java.util.concurrent.TimeUnit.SECONDS +import kotlin.Result + +@RunWith(AndroidJUnit4::class) +@LargeTest +class RoadAITest { + + lateinit var launch: ActivityScenario + + @Before + fun before() { + launch = ActivityScenario.launch(MainLauncherActivity::class.java) + } + + @Test + fun test() = runBlocking(Dispatchers.Default) { + // ensureMoGoHmiFragmentShow() + val nanos = System.nanoTime() + val child = + RW_PB + .newBuilder() + .setHeader( + Header + .newBuilder() + .setFrameId("rw") + .setModuleName("ai_cloud") + .setStamp(Time.newBuilder() + .setSec(TimeUnit.NANOSECONDS.convert(nanos, SECONDS).toInt()) + .setNsec(180000000) + .build()) + .build()) + .setRoadwork( + Roadwork_PB + .newBuilder() + .setId("4e47e17d-4950-4c80-9b02-29a450e54b50") + .setScore(95) + .setDetectTime(nanos) + .setPoiType(100061) + .setType(1006) + .setCenter( + Center_PB + .newBuilder() + .setRoad(Road_PB + .newBuilder() + .setRoadId("200091") + .setLaneNo("-2") + .setTileId("556834853") + .setBearing(90) + .build()) + .setPoint(GPSPoint_PB + .newBuilder() + .setLat(40.20313763799314) + .setLon(116.72844402744953) + .build()) + .build()) + .addPolygon(0, GPSPoint_PB + .newBuilder() + .setLat(40.20314863899314) + .setLon(116.72844412744953) + .build()) + .addPolygon(1, GPSPoint_PB + .newBuilder() + .setLat(40.20314563819314) + .setLon(116.72844412744953) + .build()) + .addPolygon(2, GPSPoint_PB + .newBuilder() + .setLat(40.20312263869314) + .setLon(116.72844401744953) + .build()) + .addPolygon(3, GPSPoint_PB + .newBuilder() + .setLat(40.20322763889314) + .setLon(116.7284381644953) + .build()) +// .addPolygon(4, GPSPoint_PB // .newBuilder() -// .setLat(40.20314863899314) -// .setLon(116.72844412744953) +// .setLat(26.819521911807858) +// .setLon(112.57508983920647) // .build()) -// .addPolygon(1, GPSPoint_PB +// .addPolygon(5, GPSPoint_PB // .newBuilder() -// .setLat(40.20314563819314) -// .setLon(116.72844412744953) +// .setLat(26.819535210732194) +// .setLon(112.57509174248064) // .build()) -// .addPolygon(2, GPSPoint_PB +// .addPolygon(6, GPSPoint_PB // .newBuilder() -// .setLat(40.20312263869314) -// .setLon(116.72844401744953) +// .setLat(26.81954428950259) +// .setLon(112.5750796303722) // .build()) -// .addPolygon(3, GPSPoint_PB +// .addPolygon(7, GPSPoint_PB // .newBuilder() -// .setLat(40.20322763889314) -// .setLon(116.7284381644953) +// .setLat(26.819549148117684) +// .setLon(112.57505350287552) // .build()) -//// .addPolygon(4, GPSPoint_PB -//// .newBuilder() -//// .setLat(26.819521911807858) -//// .setLon(112.57508983920647) -//// .build()) -//// .addPolygon(5, GPSPoint_PB -//// .newBuilder() -//// .setLat(26.819535210732194) -//// .setLon(112.57509174248064) -//// .build()) -//// .addPolygon(6, GPSPoint_PB -//// .newBuilder() -//// .setLat(26.81954428950259) -//// .setLon(112.5750796303722) -//// .build()) -//// .addPolygon(7, GPSPoint_PB -//// .newBuilder() -//// .setLat(26.819549148117684) -//// .setLon(112.57505350287552) -//// .build()) -// .addRoad(0, Road_PB -// .newBuilder() -// .setRoadId("200090") -// .setLaneNo("-2") -// .setTileId("556834853") -// .setBearing(154) -// .build()) -// .addRoad(1, Road_PB -// .newBuilder() -// .setRoadId("200091") -// .setLaneNo("-2") -// .setTileId("556834853") -// .setBearing(156) -// .build()) -// .build()) -// .build() -// val event = V2XEvent.RoadAI(data = child) -// while (true) { -// delay(1000) -// V2XEventManager.onAck(event) -// } -// -// } -// -//// private suspend fun ensureMoGoHmiFragmentShow(): MoGoHmiProvider = suspendCancellableCoroutine { -//// launch.onActivity { itx -> -//// val executor = Executors.newSingleThreadScheduledExecutor() -//// executor.scheduleAtFixedRate({ -//// var find = -//// itx.supportFragmentManager.fragments.find { it is MoGoHmiProvider } as? MoGoHmiProvider -//// while (find == null) { -//// find = -//// itx.supportFragmentManager.fragments.find { it is MoGoHmiProvider } as? MoGoHmiProvider -//// } -//// while (!find.isResumed) { -//// Thread.sleep(500) -//// } -//// it.resumeWith(Result.success(find)) -//// try { -//// Thread.sleep(500) -//// executor.shutdownNow() -//// } catch (e: Throwable) { -//// e.printStackTrace() -//// } -//// }, 50, 500, MILLISECONDS) -//// } -//// } -// -// -// @Test -// fun testRoadAI() = runBlocking { -// //ensureMoGoHmiFragmentShow() -// val shigu = "{\"poiType\":\"100321\",\"receiveTime\":1673506266967,\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[{\"lon\":112.57321291454436,\"lat\":26.823070465392494},{\"lon\":112.573215006931,\"lat\":26.8230675990919},{\"lon\":112.573219106955,\"lat\":26.823061914715},{\"lon\":112.573223182233,\"lat\":26.8230562153801},{\"lon\":112.573227231639,\"lat\":26.8230505007471},{\"lon\":112.573231254048,\"lat\":26.8230447704754},{\"lon\":112.573235248336,\"lat\":26.8230390242245},{\"lon\":112.573239213377,\"lat\":26.8230332616541},{\"lon\":112.573243148045,\"lat\":26.8230274824236},{\"lon\":112.573247051217,\"lat\":26.8230216861928},{\"lon\":112.573250921765,\"lat\":26.823015872621},{\"lon\":112.573254758566,\"lat\":26.823010041368},{\"lon\":112.573258560494,\"lat\":26.8230041920932},{\"lon\":112.573262326424,\"lat\":26.8229983244562},{\"lon\":112.573266055231,\"lat\":26.8229924381166},{\"lon\":112.573269779025,\"lat\":26.8229864802436},{\"lon\":112.573273466,\"lat\":26.8229805039295},{\"lon\":112.573277118207,\"lat\":26.8229745102999},{\"lon\":112.573280737695,\"lat\":26.8229685004807},{\"lon\":112.573284326516,\"lat\":26.8229624755973},{\"lon\":112.57328788672,\"lat\":26.8229564367755},{\"lon\":112.573291420358,\"lat\":26.822950385141},{\"lon\":112.573294929481,\"lat\":26.8229443218192},{\"lon\":112.573298416139,\"lat\":26.822938247936},{\"lon\":112.573301882384,\"lat\":26.822932164617},{\"lon\":112.573305330265,\"lat\":26.8229260729878},{\"lon\":112.573308761833,\"lat\":26.8229199741741},{\"lon\":112.57331217914,\"lat\":26.8229138693015},{\"lon\":112.573315584235,\"lat\":26.8229077594956},{\"lon\":112.573318940869,\"lat\":26.8229017005891},{\"lon\":112.57332227685,\"lat\":26.8228956326057},{\"lon\":112.573325593901,\"lat\":26.8228895563037},{\"lon\":112.573328893742,\"lat\":26.8228834724414},{\"lon\":112.573332178097,\"lat\":26.8228773817772},{\"lon\":112.573335448685,\"lat\":26.8228712850694},{\"lon\":112.573338707228,\"lat\":26.8228651830762},{\"lon\":112.573341955449,\"lat\":26.822859076556},{\"lon\":112.573345195068,\"lat\":26.8228529662671},{\"lon\":112.573348427807,\"lat\":26.8228468529679},{\"lon\":112.573351655387,\"lat\":26.8228407374165},{\"lon\":112.57335487953,\"lat\":26.8228346203714},{\"lon\":112.573358101958,\"lat\":26.8228285025908},{\"lon\":112.573361324391,\"lat\":26.8228223848331},{\"lon\":112.573364548551,\"lat\":26.8228162678566},{\"lon\":112.573367776161,\"lat\":26.8228101524196},{\"lon\":112.57337100894,\"lat\":26.8228040392803},{\"lon\":112.573374248612,\"lat\":26.8227979291972},{\"lon\":112.573377570805,\"lat\":26.8227916708447},{\"lon\":112.573380890942,\"lat\":26.8227854119249},{\"lon\":112.573384209049,\"lat\":26.8227791523835},{\"lon\":112.573387525157,\"lat\":26.8227728921664},{\"lon\":112.573390839291,\"lat\":26.8227666312191},{\"lon\":112.573394151482,\"lat\":26.8227603694874},{\"lon\":112.573397461756,\"lat\":26.8227541069172},{\"lon\":112.573400770143,\"lat\":26.822747843454},{\"lon\":112.573404076669,\"lat\":26.8227415790437},{\"lon\":112.573407381363,\"lat\":26.822735313632},{\"lon\":112.573410684254,\"lat\":26.8227290471645},{\"lon\":112.57341398537,\"lat\":26.8227227795872},{\"lon\":112.573417284738,\"lat\":26.8227165108456},{\"lon\":112.573420582386,\"lat\":26.8227102408855},{\"lon\":112.573423878344,\"lat\":26.8227039696526},{\"lon\":112.573427172639,\"lat\":26.8226976970928},{\"lon\":112.573430465298,\"lat\":26.8226914231516},{\"lon\":112.5736541921437,\"lat\":26.822260937315143},{\"lon\":112.57362367177457,\"lat\":26.822244991227713},{\"lon\":112.573399937477,\"lat\":26.822675492918},{\"lon\":112.573396691977,\"lat\":26.8226816946351},{\"lon\":112.573393403264,\"lat\":26.8226879586397},{\"lon\":112.573390112889,\"lat\":26.8226942213535},{\"lon\":112.573386820836,\"lat\":26.8227004828209},{\"lon\":112.573383527072,\"lat\":26.822706742987},{\"lon\":112.573380231507,\"lat\":26.8227130021005},{\"lon\":112.573376934206,\"lat\":26.8227192599775},{\"lon\":112.573373635113,\"lat\":26.8227255169308},{\"lon\":112.573370334197,\"lat\":26.8227317727439},{\"lon\":112.573367031403,\"lat\":26.8227380276418},{\"lon\":112.573363726739,\"lat\":26.822744281759},{\"lon\":112.573360420141,\"lat\":26.8227505349933},{\"lon\":112.573357111541,\"lat\":26.8227567875221},{\"lon\":112.573353801054,\"lat\":26.8227630392523},{\"lon\":112.573350488563,\"lat\":26.8227692902611},{\"lon\":112.573347174021,\"lat\":26.8227755406808},{\"lon\":112.573343849991,\"lat\":26.8227818018286},{\"lon\":112.57334059532,\"lat\":26.8227879346295},{\"lon\":112.573337344447,\"lat\":26.8227940752481},{\"lon\":112.57333410391,\"lat\":26.8228002103548},{\"lon\":112.573330872,\"lat\":26.8228063391622},{\"lon\":112.573327646909,\"lat\":26.8228124609577},{\"lon\":112.573324426983,\"lat\":26.8228185749099},{\"lon\":112.573321210588,\"lat\":26.8228246801823},{\"lon\":112.573317995803,\"lat\":26.8228307762173},{\"lon\":112.573314781099,\"lat\":26.8228368621259},{\"lon\":112.573311564666,\"lat\":26.8228429372788},{\"lon\":112.573308344862,\"lat\":26.822849000878},{\"lon\":112.573305119998,\"lat\":26.8228550522037},{\"lon\":112.573301888377,\"lat\":26.8228610905445},{\"lon\":112.573298648327,\"lat\":26.8228671151949},{\"lon\":112.573295398165,\"lat\":26.8228731254473},{\"lon\":112.573292136233,\"lat\":26.822879120603},{\"lon\":112.573288860863,\"lat\":26.8228850999821},{\"lon\":112.573285560822,\"lat\":26.8228910767817},{\"lon\":112.573282199005,\"lat\":26.822897124157},{\"lon\":112.573278821808,\"lat\":26.8229031714324},{\"lon\":112.573275437073,\"lat\":26.8229092033326},{\"lon\":112.573272042813,\"lat\":26.8229152188038},{\"lon\":112.573268637042,\"lat\":26.8229212167948},{\"lon\":112.573265217788,\"lat\":26.8229271962611},{\"lon\":112.573261783086,\"lat\":26.8229331561851},{\"lon\":112.573258330982,\"lat\":26.8229390955283},{\"lon\":112.573254859519,\"lat\":26.8229450132931},{\"lon\":112.573251366753,\"lat\":26.8229509084733},{\"lon\":112.573247850743,\"lat\":26.8229567800818},{\"lon\":112.57324430955,\"lat\":26.8229626271411},{\"lon\":112.573240741245,\"lat\":26.8229684486883},{\"lon\":112.573237142704,\"lat\":26.8229742453022},{\"lon\":112.573233541124,\"lat\":26.8229799700034},{\"lon\":112.573229900299,\"lat\":26.8229856807403},{\"lon\":112.573226220729,\"lat\":26.8229913784753},{\"lon\":112.573222503466,\"lat\":26.8229970634612},{\"lon\":112.573218749581,\"lat\":26.8230027359391},{\"lon\":112.573214960128,\"lat\":26.8230083961865},{\"lon\":112.573211136192,\"lat\":26.8230140444302},{\"lon\":112.573207278832,\"lat\":26.8230196809522},{\"lon\":112.573203389132,\"lat\":26.8230253060135},{\"lon\":112.573199468169,\"lat\":26.8230309198603},{\"lon\":112.573195517033,\"lat\":26.8230365227693},{\"lon\":112.573191536797,\"lat\":26.8230421150085},{\"lon\":112.573187548559,\"lat\":26.8230476745161},{\"lon\":112.57318546455338,\"lat\":26.823050549063097}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-1,\"bearing\":152,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-2,\"bearing\":152,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-3,\"bearing\":152,\"roadName\":\"雁鸣路\"}],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-2,\"bearing\":152,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":95,\"polygon\":[{\"lon\":112.57321361221982,\"lat\":26.823054701276522},{\"lon\":112.57321254435868,\"lat\":26.823070134384093},{\"lon\":112.57320704440468,\"lat\":26.823066238995114},{\"lon\":112.57320772757787,\"lat\":26.823050237509577}],\"boundBox\":[{\"x\":2979.852783203125,\"y\":929.4248657226562},{\"x\":3031.54296875,\"y\":929.4248657226562},{\"x\":3031.54296875,\"y\":977.5980834960938},{\"x\":2979.852783203125,\"y\":977.5980834960938}],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/f7b1df85-895a-41c1-b05d-7356955c1c91_172_18_24_62.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673506267%3B1673513467%26q-key-time%3D1673506267%3B1673513467%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3Db6b2911110c9941471cfc447d7704b9caa57a0e1\",\"ip\":\"172.18.24.62\",\"score\":95,\"radius\":0,\"type\":2,\"trianglePolygon\":[[{\"lon\":112.57321291454436,\"lat\":26.823070465392494},{\"lon\":112.573215006931,\"lat\":26.8230675990919},{\"lon\":112.573219106955,\"lat\":26.823061914715},{\"lon\":112.573223182233,\"lat\":26.8230562153801},{\"lon\":112.573227231639,\"lat\":26.8230505007471},{\"lon\":112.573231254048,\"lat\":26.8230447704754},{\"lon\":112.573235248336,\"lat\":26.8230390242245},{\"lon\":112.573239213377,\"lat\":26.8230332616541},{\"lon\":112.573243148045,\"lat\":26.8230274824236},{\"lon\":112.573247051217,\"lat\":26.8230216861928},{\"lon\":112.573250921765,\"lat\":26.823015872621},{\"lon\":112.573254758566,\"lat\":26.823010041368},{\"lon\":112.573258560494,\"lat\":26.8230041920932},{\"lon\":112.573262326424,\"lat\":26.8229983244562},{\"lon\":112.573266055231,\"lat\":26.8229924381166},{\"lon\":112.573269779025,\"lat\":26.8229864802436},{\"lon\":112.573273466,\"lat\":26.8229805039295},{\"lon\":112.573277118207,\"lat\":26.8229745102999},{\"lon\":112.573280737695,\"lat\":26.8229685004807},{\"lon\":112.573284326516,\"lat\":26.8229624755973},{\"lon\":112.57328788672,\"lat\":26.8229564367755},{\"lon\":112.573291420358,\"lat\":26.822950385141},{\"lon\":112.573294929481,\"lat\":26.8229443218192},{\"lon\":112.573298416139,\"lat\":26.822938247936},{\"lon\":112.573301882384,\"lat\":26.822932164617},{\"lon\":112.573305330265,\"lat\":26.8229260729878},{\"lon\":112.573308761833,\"lat\":26.8229199741741},{\"lon\":112.57331217914,\"lat\":26.8229138693015},{\"lon\":112.573315584235,\"lat\":26.8229077594956},{\"lon\":112.573318940869,\"lat\":26.8229017005891},{\"lon\":112.57332227685,\"lat\":26.8228956326057},{\"lon\":112.573325593901,\"lat\":26.8228895563037},{\"lon\":112.573328893742,\"lat\":26.8228834724414},{\"lon\":112.573332178097,\"lat\":26.8228773817772},{\"lon\":112.573335448685,\"lat\":26.8228712850694},{\"lon\":112.573338707228,\"lat\":26.8228651830762},{\"lon\":112.573341955449,\"lat\":26.822859076556},{\"lon\":112.573345195068,\"lat\":26.8228529662671},{\"lon\":112.573348427807,\"lat\":26.8228468529679},{\"lon\":112.573351655387,\"lat\":26.8228407374165},{\"lon\":112.57335487953,\"lat\":26.8228346203714},{\"lon\":112.573358101958,\"lat\":26.8228285025908},{\"lon\":112.573361324391,\"lat\":26.8228223848331},{\"lon\":112.573364548551,\"lat\":26.8228162678566},{\"lon\":112.573367776161,\"lat\":26.8228101524196},{\"lon\":112.57337100894,\"lat\":26.8228040392803},{\"lon\":112.573374248612,\"lat\":26.8227979291972},{\"lon\":112.573377570805,\"lat\":26.8227916708447},{\"lon\":112.573380890942,\"lat\":26.8227854119249},{\"lon\":112.573384209049,\"lat\":26.8227791523835},{\"lon\":112.573387525157,\"lat\":26.8227728921664},{\"lon\":112.573390839291,\"lat\":26.8227666312191},{\"lon\":112.573394151482,\"lat\":26.8227603694874},{\"lon\":112.573397461756,\"lat\":26.8227541069172},{\"lon\":112.573400770143,\"lat\":26.822747843454},{\"lon\":112.573404076669,\"lat\":26.8227415790437},{\"lon\":112.573407381363,\"lat\":26.822735313632},{\"lon\":112.573410684254,\"lat\":26.8227290471645},{\"lon\":112.57341398537,\"lat\":26.8227227795872},{\"lon\":112.573417284738,\"lat\":26.8227165108456},{\"lon\":112.573420582386,\"lat\":26.8227102408855},{\"lon\":112.573423878344,\"lat\":26.8227039696526},{\"lon\":112.573427172639,\"lat\":26.8226976970928},{\"lon\":112.573430465298,\"lat\":26.8226914231516},{\"lon\":112.5736541921437,\"lat\":26.822260937315143},{\"lon\":112.57362367177457,\"lat\":26.822244991227713},{\"lon\":112.573399937477,\"lat\":26.822675492918},{\"lon\":112.573396691977,\"lat\":26.8226816946351},{\"lon\":112.573393403264,\"lat\":26.8226879586397},{\"lon\":112.573390112889,\"lat\":26.8226942213535},{\"lon\":112.573386820836,\"lat\":26.8227004828209},{\"lon\":112.573383527072,\"lat\":26.822706742987},{\"lon\":112.573380231507,\"lat\":26.8227130021005},{\"lon\":112.573376934206,\"lat\":26.8227192599775},{\"lon\":112.573373635113,\"lat\":26.8227255169308},{\"lon\":112.573370334197,\"lat\":26.8227317727439},{\"lon\":112.573367031403,\"lat\":26.8227380276418},{\"lon\":112.573363726739,\"lat\":26.822744281759},{\"lon\":112.573360420141,\"lat\":26.8227505349933},{\"lon\":112.573357111541,\"lat\":26.8227567875221},{\"lon\":112.573353801054,\"lat\":26.8227630392523},{\"lon\":112.573350488563,\"lat\":26.8227692902611},{\"lon\":112.573347174021,\"lat\":26.8227755406808},{\"lon\":112.573343849991,\"lat\":26.8227818018286},{\"lon\":112.57334059532,\"lat\":26.8227879346295},{\"lon\":112.573337344447,\"lat\":26.8227940752481},{\"lon\":112.57333410391,\"lat\":26.8228002103548},{\"lon\":112.573330872,\"lat\":26.8228063391622},{\"lon\":112.573327646909,\"lat\":26.8228124609577},{\"lon\":112.573324426983,\"lat\":26.8228185749099},{\"lon\":112.573321210588,\"lat\":26.8228246801823},{\"lon\":112.573317995803,\"lat\":26.8228307762173},{\"lon\":112.573314781099,\"lat\":26.8228368621259},{\"lon\":112.573311564666,\"lat\":26.8228429372788},{\"lon\":112.573308344862,\"lat\":26.822849000878},{\"lon\":112.573305119998,\"lat\":26.8228550522037},{\"lon\":112.573301888377,\"lat\":26.8228610905445},{\"lon\":112.573298648327,\"lat\":26.8228671151949},{\"lon\":112.573295398165,\"lat\":26.8228731254473},{\"lon\":112.573292136233,\"lat\":26.822879120603},{\"lon\":112.573288860863,\"lat\":26.8228850999821},{\"lon\":112.573285560822,\"lat\":26.8228910767817},{\"lon\":112.573282199005,\"lat\":26.822897124157},{\"lon\":112.573278821808,\"lat\":26.8229031714324},{\"lon\":112.573275437073,\"lat\":26.8229092033326},{\"lon\":112.573272042813,\"lat\":26.8229152188038},{\"lon\":112.573268637042,\"lat\":26.8229212167948},{\"lon\":112.573265217788,\"lat\":26.8229271962611},{\"lon\":112.573261783086,\"lat\":26.8229331561851},{\"lon\":112.573258330982,\"lat\":26.8229390955283},{\"lon\":112.573254859519,\"lat\":26.8229450132931},{\"lon\":112.573251366753,\"lat\":26.8229509084733},{\"lon\":112.573247850743,\"lat\":26.8229567800818},{\"lon\":112.57324430955,\"lat\":26.8229626271411},{\"lon\":112.573240741245,\"lat\":26.8229684486883},{\"lon\":112.573237142704,\"lat\":26.8229742453022},{\"lon\":112.573233541124,\"lat\":26.8229799700034},{\"lon\":112.573229900299,\"lat\":26.8229856807403},{\"lon\":112.573226220729,\"lat\":26.8229913784753},{\"lon\":112.573222503466,\"lat\":26.8229970634612},{\"lon\":112.573218749581,\"lat\":26.8230027359391},{\"lon\":112.573214960128,\"lat\":26.8230083961865},{\"lon\":112.573211136192,\"lat\":26.8230140444302},{\"lon\":112.573207278832,\"lat\":26.8230196809522},{\"lon\":112.573203389132,\"lat\":26.8230253060135},{\"lon\":112.573199468169,\"lat\":26.8230309198603},{\"lon\":112.573195517033,\"lat\":26.8230365227693},{\"lon\":112.573191536797,\"lat\":26.8230421150085},{\"lon\":112.573187548559,\"lat\":26.8230476745161},{\"lon\":112.57318546455338,\"lat\":26.823050549063097}]],\"obstaclePoint\":[{\"lon\":112.573443,\"lat\":26.822538},{\"lon\":112.573691,\"lat\":26.822676},{\"lon\":112.573021,\"lat\":26.823149},{\"lon\":112.572974,\"lat\":26.823199}],\"createTime\":1673506267760,\"createTimeStr\":\"2023-01-12 14:51:07\"}" -// val road1 = "{\"poiType\":\"100061\",\"receiveTime\":1673509755649,\"detectTime\":1673509755637,\"id\":\"86447e30-2dfc-4a27-8d01-41ffe9a9a7fe\",\"index\":\"636136931493457343\",\"polygon\":[{\"lon\":112.57337137520945,\"lat\":26.822950000610152},{\"lon\":112.5733703998375,\"lat\":26.82294943400411},{\"lon\":112.57336923793872,\"lat\":26.82294944578748},{\"lon\":112.57336827709125,\"lat\":26.82295003202963},{\"lon\":112.57336786590433,\"lat\":26.822950822795498},{\"lon\":112.57332583348149,\"lat\":26.823144415135413},{\"lon\":112.57332583904886,\"lat\":26.823145130116597},{\"lon\":112.57332615359141,\"lat\":26.82314578706645},{\"lon\":112.57332672775591,\"lat\":26.823146282906478},{\"lon\":112.57332747145331,\"lat\":26.823146539837108},{\"lon\":112.57332807078356,\"lat\":26.823146549872188},{\"lon\":112.57332882464814,\"lat\":26.82314631801647},{\"lon\":112.57332941903356,\"lat\":26.823145841742402},{\"lon\":112.57332970267485,\"lat\":26.82314536795171},{\"lon\":112.57339652767452,\"lat\":26.82297757920771},{\"lon\":112.57339644737766,\"lat\":26.82297673161999},{\"lon\":112.57339607387638,\"lat\":26.822976136665098},{\"lon\":112.57337137520945,\"lat\":26.822950000610152}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-1,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-2,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-3,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130583\",\"laneNo\":-1,\"bearing\":278}],\"center\":{\"lon\":112.57336404707121,\"lat\":26.823024407262803},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-2,\"bearing\":330,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":88,\"polygon\":[{\"lon\":112.57334137965555,\"lat\":26.82313245733589},{\"lon\":112.573329020958,\"lat\":26.823145531571242},{\"lon\":112.57332663570918,\"lat\":26.823144025991855},{\"lon\":112.57333875695714,\"lat\":26.823130823353114}],\"boundBox\":[{\"x\":1439.8624267578125,\"y\":893.4229736328125},{\"x\":1474.45361328125,\"y\":893.4229736328125},{\"x\":1474.45361328125,\"y\":966.433837890625},{\"x\":1439.8624267578125,\"y\":966.433837890625}],\"center\":{\"lon\":112.57332779256919,\"lat\":26.823144756804734}},{\"id\":1,\"type\":1,\"score\":87,\"polygon\":[{\"lon\":112.57339986657128,\"lat\":26.822898951544797},{\"lon\":112.5733716620538,\"lat\":26.822952992001163},{\"lon\":112.57336786188131,\"lat\":26.822949186370185},{\"lon\":112.57339561566401,\"lat\":26.822894141465785}],\"boundBox\":[{\"x\":2085.054443359375,\"y\":503.0662841796875},{\"x\":2116.11865234375,\"y\":503.0662841796875},{\"x\":2116.11865234375,\"y\":559.9113159179688},{\"x\":2085.054443359375,\"y\":559.9113159179688}],\"center\":{\"lon\":112.5733698249888,\"lat\":26.822951164464232}},{\"id\":2,\"type\":1,\"score\":71,\"polygon\":[{\"lon\":112.57342641528835,\"lat\":26.82293191667262},{\"lon\":112.57339610867105,\"lat\":26.82297860774548},{\"lon\":112.5733928192764,\"lat\":26.822975877911627},{\"lon\":112.57342270277888,\"lat\":26.822928610829003}],\"boundBox\":[{\"x\":1873.2490234375,\"y\":507.2391357421875},{\"x\":1900.5283203125,\"y\":507.2391357421875},{\"x\":1900.5283203125,\"y\":562.299560546875},{\"x\":1873.2490234375,\"y\":562.299560546875}],\"center\":{\"lon\":112.57339452365564,\"lat\":26.822977300519444}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/86447e30-2dfc-4a27-8d01-41ffe9a9a7fe_172_18_24_62.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673509757%3B1673516957%26q-key-time%3D1673509757%3B1673516957%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3D557de14ddfb999d35ddef9e23b3532d9d299c62f\",\"ip\":\"172.18.24.62\",\"score\":82,\"radius\":0,\"type\":1,\"createTime\":1673509757496,\"createTimeStr\":\"2023-01-12 15:49:17\"}" -// //val road2 = "{\"poiType\":\"100061\",\"receiveTime\":1673509756306,\"detectTime\":1673509756290,\"id\":\"be6a2000-a96c-42c8-a7ef-f83388d84858\",\"index\":\"636136931493532287\",\"polygon\":[{\"lon\":112.5733515539896,\"lat\":26.823143145432386},{\"lon\":112.57335140084462,\"lat\":26.823142454672727},{\"lon\":112.57335096472467,\"lat\":26.823141869074952},{\"lon\":112.57335031202503,\"lat\":26.82314147779103},{\"lon\":112.57334954211333,\"lat\":26.82314134039038},{\"lon\":112.57334877220161,\"lat\":26.82314147779103},{\"lon\":112.573348119502,\"lat\":26.823141869074952},{\"lon\":112.57334768338202,\"lat\":26.823142454672727},{\"lon\":112.57334753023707,\"lat\":26.823143145432386},{\"lon\":112.57334768338202,\"lat\":26.82314383619207},{\"lon\":112.57334811950196,\"lat\":26.82314442178987},{\"lon\":112.5733487722016,\"lat\":26.823144813073792},{\"lon\":112.57334954211333,\"lat\":26.823144950474443},{\"lon\":112.57335031202504,\"lat\":26.823144813073792},{\"lon\":112.57335096472468,\"lat\":26.82314442178987},{\"lon\":112.57335140084464,\"lat\":26.82314383619207},{\"lon\":112.5733515539896,\"lat\":26.823143145432386}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-4,\"bearing\":332,\"roadName\":\"雁鸣路\"}],\"center\":{\"lon\":112.57334952644263,\"lat\":26.823143141971546},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-4,\"bearing\":332,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":72,\"polygon\":[{\"lon\":112.57341760772391,\"lat\":26.823104379136176},{\"lon\":112.57335121413183,\"lat\":26.82314367391432},{\"lon\":112.57334751791018,\"lat\":26.823142500693834},{\"lon\":112.57341321183773,\"lat\":26.82310322131963}],\"boundBox\":[{\"x\":1551.2252197265625,\"y\":352.58837890625},{\"x\":1562.4649658203125,\"y\":352.58837890625},{\"x\":1562.4649658203125,\"y\":376.17327880859375},{\"x\":1551.2252197265625,\"y\":376.17327880859375}],\"center\":{\"lon\":112.57334952644263,\"lat\":26.823143141971546}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/be6a2000-a96c-42c8-a7ef-f83388d84858_172_18_24_42.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673509758%3B1673516958%26q-key-time%3D1673509758%3B1673516958%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3Db2682464078ae53eae6e87f924abe17fa7c04ac8\",\"ip\":\"172.18.24.42\",\"score\":72,\"radius\":0,\"type\":1,\"createTime\":1673509758511,\"createTimeStr\":\"2023-01-12 15:49:18\"}" -// val jingzhi1 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}" -// val jingzhi2 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}" -// val jingzhi3 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}" -// while (true) { -// delay(1000) -// //V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(shigu, V2XRoadXData::class.java))) -// V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(road1, V2XRoadXData::class.java))) -// // V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(road2, V2XRoadXData::class.java))) + .addRoad(0, Road_PB + .newBuilder() + .setRoadId("200090") + .setLaneNo("-2") + .setTileId("556834853") + .setBearing(154) + .build()) + .addRoad(1, Road_PB + .newBuilder() + .setRoadId("200091") + .setLaneNo("-2") + .setTileId("556834853") + .setBearing(156) + .build()) + .build()) + .build() + val event = V2XEvent.RoadAI(data = child) + while (true) { + delay(1000) + V2XEventManager.onAck(event) + } + + } + +// private suspend fun ensureMoGoHmiFragmentShow(): MoGoHmiProvider = suspendCancellableCoroutine { +// launch.onActivity { itx -> +// val executor = Executors.newSingleThreadScheduledExecutor() +// executor.scheduleAtFixedRate({ +// var find = +// itx.supportFragmentManager.fragments.find { it is MoGoHmiProvider } as? MoGoHmiProvider +// while (find == null) { +// find = +// itx.supportFragmentManager.fragments.find { it is MoGoHmiProvider } as? MoGoHmiProvider +// } +// while (!find.isResumed) { +// Thread.sleep(500) +// } +// it.resumeWith(Result.success(find)) +// try { +// Thread.sleep(500) +// executor.shutdownNow() +// } catch (e: Throwable) { +// e.printStackTrace() +// } +// }, 50, 500, MILLISECONDS) // } // } -// -//} \ No newline at end of file + + + @Test + fun testRoadAI() = runBlocking { + //ensureMoGoHmiFragmentShow() + val shigu = "{\"poiType\":\"100321\",\"receiveTime\":1673506266967,\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[{\"lon\":112.57321291454436,\"lat\":26.823070465392494},{\"lon\":112.573215006931,\"lat\":26.8230675990919},{\"lon\":112.573219106955,\"lat\":26.823061914715},{\"lon\":112.573223182233,\"lat\":26.8230562153801},{\"lon\":112.573227231639,\"lat\":26.8230505007471},{\"lon\":112.573231254048,\"lat\":26.8230447704754},{\"lon\":112.573235248336,\"lat\":26.8230390242245},{\"lon\":112.573239213377,\"lat\":26.8230332616541},{\"lon\":112.573243148045,\"lat\":26.8230274824236},{\"lon\":112.573247051217,\"lat\":26.8230216861928},{\"lon\":112.573250921765,\"lat\":26.823015872621},{\"lon\":112.573254758566,\"lat\":26.823010041368},{\"lon\":112.573258560494,\"lat\":26.8230041920932},{\"lon\":112.573262326424,\"lat\":26.8229983244562},{\"lon\":112.573266055231,\"lat\":26.8229924381166},{\"lon\":112.573269779025,\"lat\":26.8229864802436},{\"lon\":112.573273466,\"lat\":26.8229805039295},{\"lon\":112.573277118207,\"lat\":26.8229745102999},{\"lon\":112.573280737695,\"lat\":26.8229685004807},{\"lon\":112.573284326516,\"lat\":26.8229624755973},{\"lon\":112.57328788672,\"lat\":26.8229564367755},{\"lon\":112.573291420358,\"lat\":26.822950385141},{\"lon\":112.573294929481,\"lat\":26.8229443218192},{\"lon\":112.573298416139,\"lat\":26.822938247936},{\"lon\":112.573301882384,\"lat\":26.822932164617},{\"lon\":112.573305330265,\"lat\":26.8229260729878},{\"lon\":112.573308761833,\"lat\":26.8229199741741},{\"lon\":112.57331217914,\"lat\":26.8229138693015},{\"lon\":112.573315584235,\"lat\":26.8229077594956},{\"lon\":112.573318940869,\"lat\":26.8229017005891},{\"lon\":112.57332227685,\"lat\":26.8228956326057},{\"lon\":112.573325593901,\"lat\":26.8228895563037},{\"lon\":112.573328893742,\"lat\":26.8228834724414},{\"lon\":112.573332178097,\"lat\":26.8228773817772},{\"lon\":112.573335448685,\"lat\":26.8228712850694},{\"lon\":112.573338707228,\"lat\":26.8228651830762},{\"lon\":112.573341955449,\"lat\":26.822859076556},{\"lon\":112.573345195068,\"lat\":26.8228529662671},{\"lon\":112.573348427807,\"lat\":26.8228468529679},{\"lon\":112.573351655387,\"lat\":26.8228407374165},{\"lon\":112.57335487953,\"lat\":26.8228346203714},{\"lon\":112.573358101958,\"lat\":26.8228285025908},{\"lon\":112.573361324391,\"lat\":26.8228223848331},{\"lon\":112.573364548551,\"lat\":26.8228162678566},{\"lon\":112.573367776161,\"lat\":26.8228101524196},{\"lon\":112.57337100894,\"lat\":26.8228040392803},{\"lon\":112.573374248612,\"lat\":26.8227979291972},{\"lon\":112.573377570805,\"lat\":26.8227916708447},{\"lon\":112.573380890942,\"lat\":26.8227854119249},{\"lon\":112.573384209049,\"lat\":26.8227791523835},{\"lon\":112.573387525157,\"lat\":26.8227728921664},{\"lon\":112.573390839291,\"lat\":26.8227666312191},{\"lon\":112.573394151482,\"lat\":26.8227603694874},{\"lon\":112.573397461756,\"lat\":26.8227541069172},{\"lon\":112.573400770143,\"lat\":26.822747843454},{\"lon\":112.573404076669,\"lat\":26.8227415790437},{\"lon\":112.573407381363,\"lat\":26.822735313632},{\"lon\":112.573410684254,\"lat\":26.8227290471645},{\"lon\":112.57341398537,\"lat\":26.8227227795872},{\"lon\":112.573417284738,\"lat\":26.8227165108456},{\"lon\":112.573420582386,\"lat\":26.8227102408855},{\"lon\":112.573423878344,\"lat\":26.8227039696526},{\"lon\":112.573427172639,\"lat\":26.8226976970928},{\"lon\":112.573430465298,\"lat\":26.8226914231516},{\"lon\":112.5736541921437,\"lat\":26.822260937315143},{\"lon\":112.57362367177457,\"lat\":26.822244991227713},{\"lon\":112.573399937477,\"lat\":26.822675492918},{\"lon\":112.573396691977,\"lat\":26.8226816946351},{\"lon\":112.573393403264,\"lat\":26.8226879586397},{\"lon\":112.573390112889,\"lat\":26.8226942213535},{\"lon\":112.573386820836,\"lat\":26.8227004828209},{\"lon\":112.573383527072,\"lat\":26.822706742987},{\"lon\":112.573380231507,\"lat\":26.8227130021005},{\"lon\":112.573376934206,\"lat\":26.8227192599775},{\"lon\":112.573373635113,\"lat\":26.8227255169308},{\"lon\":112.573370334197,\"lat\":26.8227317727439},{\"lon\":112.573367031403,\"lat\":26.8227380276418},{\"lon\":112.573363726739,\"lat\":26.822744281759},{\"lon\":112.573360420141,\"lat\":26.8227505349933},{\"lon\":112.573357111541,\"lat\":26.8227567875221},{\"lon\":112.573353801054,\"lat\":26.8227630392523},{\"lon\":112.573350488563,\"lat\":26.8227692902611},{\"lon\":112.573347174021,\"lat\":26.8227755406808},{\"lon\":112.573343849991,\"lat\":26.8227818018286},{\"lon\":112.57334059532,\"lat\":26.8227879346295},{\"lon\":112.573337344447,\"lat\":26.8227940752481},{\"lon\":112.57333410391,\"lat\":26.8228002103548},{\"lon\":112.573330872,\"lat\":26.8228063391622},{\"lon\":112.573327646909,\"lat\":26.8228124609577},{\"lon\":112.573324426983,\"lat\":26.8228185749099},{\"lon\":112.573321210588,\"lat\":26.8228246801823},{\"lon\":112.573317995803,\"lat\":26.8228307762173},{\"lon\":112.573314781099,\"lat\":26.8228368621259},{\"lon\":112.573311564666,\"lat\":26.8228429372788},{\"lon\":112.573308344862,\"lat\":26.822849000878},{\"lon\":112.573305119998,\"lat\":26.8228550522037},{\"lon\":112.573301888377,\"lat\":26.8228610905445},{\"lon\":112.573298648327,\"lat\":26.8228671151949},{\"lon\":112.573295398165,\"lat\":26.8228731254473},{\"lon\":112.573292136233,\"lat\":26.822879120603},{\"lon\":112.573288860863,\"lat\":26.8228850999821},{\"lon\":112.573285560822,\"lat\":26.8228910767817},{\"lon\":112.573282199005,\"lat\":26.822897124157},{\"lon\":112.573278821808,\"lat\":26.8229031714324},{\"lon\":112.573275437073,\"lat\":26.8229092033326},{\"lon\":112.573272042813,\"lat\":26.8229152188038},{\"lon\":112.573268637042,\"lat\":26.8229212167948},{\"lon\":112.573265217788,\"lat\":26.8229271962611},{\"lon\":112.573261783086,\"lat\":26.8229331561851},{\"lon\":112.573258330982,\"lat\":26.8229390955283},{\"lon\":112.573254859519,\"lat\":26.8229450132931},{\"lon\":112.573251366753,\"lat\":26.8229509084733},{\"lon\":112.573247850743,\"lat\":26.8229567800818},{\"lon\":112.57324430955,\"lat\":26.8229626271411},{\"lon\":112.573240741245,\"lat\":26.8229684486883},{\"lon\":112.573237142704,\"lat\":26.8229742453022},{\"lon\":112.573233541124,\"lat\":26.8229799700034},{\"lon\":112.573229900299,\"lat\":26.8229856807403},{\"lon\":112.573226220729,\"lat\":26.8229913784753},{\"lon\":112.573222503466,\"lat\":26.8229970634612},{\"lon\":112.573218749581,\"lat\":26.8230027359391},{\"lon\":112.573214960128,\"lat\":26.8230083961865},{\"lon\":112.573211136192,\"lat\":26.8230140444302},{\"lon\":112.573207278832,\"lat\":26.8230196809522},{\"lon\":112.573203389132,\"lat\":26.8230253060135},{\"lon\":112.573199468169,\"lat\":26.8230309198603},{\"lon\":112.573195517033,\"lat\":26.8230365227693},{\"lon\":112.573191536797,\"lat\":26.8230421150085},{\"lon\":112.573187548559,\"lat\":26.8230476745161},{\"lon\":112.57318546455338,\"lat\":26.823050549063097}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-1,\"bearing\":152,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-2,\"bearing\":152,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-3,\"bearing\":152,\"roadName\":\"雁鸣路\"}],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-2,\"bearing\":152,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":95,\"polygon\":[{\"lon\":112.57321361221982,\"lat\":26.823054701276522},{\"lon\":112.57321254435868,\"lat\":26.823070134384093},{\"lon\":112.57320704440468,\"lat\":26.823066238995114},{\"lon\":112.57320772757787,\"lat\":26.823050237509577}],\"boundBox\":[{\"x\":2979.852783203125,\"y\":929.4248657226562},{\"x\":3031.54296875,\"y\":929.4248657226562},{\"x\":3031.54296875,\"y\":977.5980834960938},{\"x\":2979.852783203125,\"y\":977.5980834960938}],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/f7b1df85-895a-41c1-b05d-7356955c1c91_172_18_24_62.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673506267%3B1673513467%26q-key-time%3D1673506267%3B1673513467%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3Db6b2911110c9941471cfc447d7704b9caa57a0e1\",\"ip\":\"172.18.24.62\",\"score\":95,\"radius\":0,\"type\":2,\"trianglePolygon\":[[{\"lon\":112.57321291454436,\"lat\":26.823070465392494},{\"lon\":112.573215006931,\"lat\":26.8230675990919},{\"lon\":112.573219106955,\"lat\":26.823061914715},{\"lon\":112.573223182233,\"lat\":26.8230562153801},{\"lon\":112.573227231639,\"lat\":26.8230505007471},{\"lon\":112.573231254048,\"lat\":26.8230447704754},{\"lon\":112.573235248336,\"lat\":26.8230390242245},{\"lon\":112.573239213377,\"lat\":26.8230332616541},{\"lon\":112.573243148045,\"lat\":26.8230274824236},{\"lon\":112.573247051217,\"lat\":26.8230216861928},{\"lon\":112.573250921765,\"lat\":26.823015872621},{\"lon\":112.573254758566,\"lat\":26.823010041368},{\"lon\":112.573258560494,\"lat\":26.8230041920932},{\"lon\":112.573262326424,\"lat\":26.8229983244562},{\"lon\":112.573266055231,\"lat\":26.8229924381166},{\"lon\":112.573269779025,\"lat\":26.8229864802436},{\"lon\":112.573273466,\"lat\":26.8229805039295},{\"lon\":112.573277118207,\"lat\":26.8229745102999},{\"lon\":112.573280737695,\"lat\":26.8229685004807},{\"lon\":112.573284326516,\"lat\":26.8229624755973},{\"lon\":112.57328788672,\"lat\":26.8229564367755},{\"lon\":112.573291420358,\"lat\":26.822950385141},{\"lon\":112.573294929481,\"lat\":26.8229443218192},{\"lon\":112.573298416139,\"lat\":26.822938247936},{\"lon\":112.573301882384,\"lat\":26.822932164617},{\"lon\":112.573305330265,\"lat\":26.8229260729878},{\"lon\":112.573308761833,\"lat\":26.8229199741741},{\"lon\":112.57331217914,\"lat\":26.8229138693015},{\"lon\":112.573315584235,\"lat\":26.8229077594956},{\"lon\":112.573318940869,\"lat\":26.8229017005891},{\"lon\":112.57332227685,\"lat\":26.8228956326057},{\"lon\":112.573325593901,\"lat\":26.8228895563037},{\"lon\":112.573328893742,\"lat\":26.8228834724414},{\"lon\":112.573332178097,\"lat\":26.8228773817772},{\"lon\":112.573335448685,\"lat\":26.8228712850694},{\"lon\":112.573338707228,\"lat\":26.8228651830762},{\"lon\":112.573341955449,\"lat\":26.822859076556},{\"lon\":112.573345195068,\"lat\":26.8228529662671},{\"lon\":112.573348427807,\"lat\":26.8228468529679},{\"lon\":112.573351655387,\"lat\":26.8228407374165},{\"lon\":112.57335487953,\"lat\":26.8228346203714},{\"lon\":112.573358101958,\"lat\":26.8228285025908},{\"lon\":112.573361324391,\"lat\":26.8228223848331},{\"lon\":112.573364548551,\"lat\":26.8228162678566},{\"lon\":112.573367776161,\"lat\":26.8228101524196},{\"lon\":112.57337100894,\"lat\":26.8228040392803},{\"lon\":112.573374248612,\"lat\":26.8227979291972},{\"lon\":112.573377570805,\"lat\":26.8227916708447},{\"lon\":112.573380890942,\"lat\":26.8227854119249},{\"lon\":112.573384209049,\"lat\":26.8227791523835},{\"lon\":112.573387525157,\"lat\":26.8227728921664},{\"lon\":112.573390839291,\"lat\":26.8227666312191},{\"lon\":112.573394151482,\"lat\":26.8227603694874},{\"lon\":112.573397461756,\"lat\":26.8227541069172},{\"lon\":112.573400770143,\"lat\":26.822747843454},{\"lon\":112.573404076669,\"lat\":26.8227415790437},{\"lon\":112.573407381363,\"lat\":26.822735313632},{\"lon\":112.573410684254,\"lat\":26.8227290471645},{\"lon\":112.57341398537,\"lat\":26.8227227795872},{\"lon\":112.573417284738,\"lat\":26.8227165108456},{\"lon\":112.573420582386,\"lat\":26.8227102408855},{\"lon\":112.573423878344,\"lat\":26.8227039696526},{\"lon\":112.573427172639,\"lat\":26.8226976970928},{\"lon\":112.573430465298,\"lat\":26.8226914231516},{\"lon\":112.5736541921437,\"lat\":26.822260937315143},{\"lon\":112.57362367177457,\"lat\":26.822244991227713},{\"lon\":112.573399937477,\"lat\":26.822675492918},{\"lon\":112.573396691977,\"lat\":26.8226816946351},{\"lon\":112.573393403264,\"lat\":26.8226879586397},{\"lon\":112.573390112889,\"lat\":26.8226942213535},{\"lon\":112.573386820836,\"lat\":26.8227004828209},{\"lon\":112.573383527072,\"lat\":26.822706742987},{\"lon\":112.573380231507,\"lat\":26.8227130021005},{\"lon\":112.573376934206,\"lat\":26.8227192599775},{\"lon\":112.573373635113,\"lat\":26.8227255169308},{\"lon\":112.573370334197,\"lat\":26.8227317727439},{\"lon\":112.573367031403,\"lat\":26.8227380276418},{\"lon\":112.573363726739,\"lat\":26.822744281759},{\"lon\":112.573360420141,\"lat\":26.8227505349933},{\"lon\":112.573357111541,\"lat\":26.8227567875221},{\"lon\":112.573353801054,\"lat\":26.8227630392523},{\"lon\":112.573350488563,\"lat\":26.8227692902611},{\"lon\":112.573347174021,\"lat\":26.8227755406808},{\"lon\":112.573343849991,\"lat\":26.8227818018286},{\"lon\":112.57334059532,\"lat\":26.8227879346295},{\"lon\":112.573337344447,\"lat\":26.8227940752481},{\"lon\":112.57333410391,\"lat\":26.8228002103548},{\"lon\":112.573330872,\"lat\":26.8228063391622},{\"lon\":112.573327646909,\"lat\":26.8228124609577},{\"lon\":112.573324426983,\"lat\":26.8228185749099},{\"lon\":112.573321210588,\"lat\":26.8228246801823},{\"lon\":112.573317995803,\"lat\":26.8228307762173},{\"lon\":112.573314781099,\"lat\":26.8228368621259},{\"lon\":112.573311564666,\"lat\":26.8228429372788},{\"lon\":112.573308344862,\"lat\":26.822849000878},{\"lon\":112.573305119998,\"lat\":26.8228550522037},{\"lon\":112.573301888377,\"lat\":26.8228610905445},{\"lon\":112.573298648327,\"lat\":26.8228671151949},{\"lon\":112.573295398165,\"lat\":26.8228731254473},{\"lon\":112.573292136233,\"lat\":26.822879120603},{\"lon\":112.573288860863,\"lat\":26.8228850999821},{\"lon\":112.573285560822,\"lat\":26.8228910767817},{\"lon\":112.573282199005,\"lat\":26.822897124157},{\"lon\":112.573278821808,\"lat\":26.8229031714324},{\"lon\":112.573275437073,\"lat\":26.8229092033326},{\"lon\":112.573272042813,\"lat\":26.8229152188038},{\"lon\":112.573268637042,\"lat\":26.8229212167948},{\"lon\":112.573265217788,\"lat\":26.8229271962611},{\"lon\":112.573261783086,\"lat\":26.8229331561851},{\"lon\":112.573258330982,\"lat\":26.8229390955283},{\"lon\":112.573254859519,\"lat\":26.8229450132931},{\"lon\":112.573251366753,\"lat\":26.8229509084733},{\"lon\":112.573247850743,\"lat\":26.8229567800818},{\"lon\":112.57324430955,\"lat\":26.8229626271411},{\"lon\":112.573240741245,\"lat\":26.8229684486883},{\"lon\":112.573237142704,\"lat\":26.8229742453022},{\"lon\":112.573233541124,\"lat\":26.8229799700034},{\"lon\":112.573229900299,\"lat\":26.8229856807403},{\"lon\":112.573226220729,\"lat\":26.8229913784753},{\"lon\":112.573222503466,\"lat\":26.8229970634612},{\"lon\":112.573218749581,\"lat\":26.8230027359391},{\"lon\":112.573214960128,\"lat\":26.8230083961865},{\"lon\":112.573211136192,\"lat\":26.8230140444302},{\"lon\":112.573207278832,\"lat\":26.8230196809522},{\"lon\":112.573203389132,\"lat\":26.8230253060135},{\"lon\":112.573199468169,\"lat\":26.8230309198603},{\"lon\":112.573195517033,\"lat\":26.8230365227693},{\"lon\":112.573191536797,\"lat\":26.8230421150085},{\"lon\":112.573187548559,\"lat\":26.8230476745161},{\"lon\":112.57318546455338,\"lat\":26.823050549063097}]],\"obstaclePoint\":[{\"lon\":112.573443,\"lat\":26.822538},{\"lon\":112.573691,\"lat\":26.822676},{\"lon\":112.573021,\"lat\":26.823149},{\"lon\":112.572974,\"lat\":26.823199}],\"createTime\":1673506267760,\"createTimeStr\":\"2023-01-12 14:51:07\"}" + val road1 = "{\"poiType\":\"100061\",\"receiveTime\":1673509755649,\"detectTime\":1673509755637,\"id\":\"86447e30-2dfc-4a27-8d01-41ffe9a9a7fe\",\"index\":\"636136931493457343\",\"polygon\":[{\"lon\":112.57337137520945,\"lat\":26.822950000610152},{\"lon\":112.5733703998375,\"lat\":26.82294943400411},{\"lon\":112.57336923793872,\"lat\":26.82294944578748},{\"lon\":112.57336827709125,\"lat\":26.82295003202963},{\"lon\":112.57336786590433,\"lat\":26.822950822795498},{\"lon\":112.57332583348149,\"lat\":26.823144415135413},{\"lon\":112.57332583904886,\"lat\":26.823145130116597},{\"lon\":112.57332615359141,\"lat\":26.82314578706645},{\"lon\":112.57332672775591,\"lat\":26.823146282906478},{\"lon\":112.57332747145331,\"lat\":26.823146539837108},{\"lon\":112.57332807078356,\"lat\":26.823146549872188},{\"lon\":112.57332882464814,\"lat\":26.82314631801647},{\"lon\":112.57332941903356,\"lat\":26.823145841742402},{\"lon\":112.57332970267485,\"lat\":26.82314536795171},{\"lon\":112.57339652767452,\"lat\":26.82297757920771},{\"lon\":112.57339644737766,\"lat\":26.82297673161999},{\"lon\":112.57339607387638,\"lat\":26.822976136665098},{\"lon\":112.57337137520945,\"lat\":26.822950000610152}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-1,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-2,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-3,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130583\",\"laneNo\":-1,\"bearing\":278}],\"center\":{\"lon\":112.57336404707121,\"lat\":26.823024407262803},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-2,\"bearing\":330,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":88,\"polygon\":[{\"lon\":112.57334137965555,\"lat\":26.82313245733589},{\"lon\":112.573329020958,\"lat\":26.823145531571242},{\"lon\":112.57332663570918,\"lat\":26.823144025991855},{\"lon\":112.57333875695714,\"lat\":26.823130823353114}],\"boundBox\":[{\"x\":1439.8624267578125,\"y\":893.4229736328125},{\"x\":1474.45361328125,\"y\":893.4229736328125},{\"x\":1474.45361328125,\"y\":966.433837890625},{\"x\":1439.8624267578125,\"y\":966.433837890625}],\"center\":{\"lon\":112.57332779256919,\"lat\":26.823144756804734}},{\"id\":1,\"type\":1,\"score\":87,\"polygon\":[{\"lon\":112.57339986657128,\"lat\":26.822898951544797},{\"lon\":112.5733716620538,\"lat\":26.822952992001163},{\"lon\":112.57336786188131,\"lat\":26.822949186370185},{\"lon\":112.57339561566401,\"lat\":26.822894141465785}],\"boundBox\":[{\"x\":2085.054443359375,\"y\":503.0662841796875},{\"x\":2116.11865234375,\"y\":503.0662841796875},{\"x\":2116.11865234375,\"y\":559.9113159179688},{\"x\":2085.054443359375,\"y\":559.9113159179688}],\"center\":{\"lon\":112.5733698249888,\"lat\":26.822951164464232}},{\"id\":2,\"type\":1,\"score\":71,\"polygon\":[{\"lon\":112.57342641528835,\"lat\":26.82293191667262},{\"lon\":112.57339610867105,\"lat\":26.82297860774548},{\"lon\":112.5733928192764,\"lat\":26.822975877911627},{\"lon\":112.57342270277888,\"lat\":26.822928610829003}],\"boundBox\":[{\"x\":1873.2490234375,\"y\":507.2391357421875},{\"x\":1900.5283203125,\"y\":507.2391357421875},{\"x\":1900.5283203125,\"y\":562.299560546875},{\"x\":1873.2490234375,\"y\":562.299560546875}],\"center\":{\"lon\":112.57339452365564,\"lat\":26.822977300519444}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/86447e30-2dfc-4a27-8d01-41ffe9a9a7fe_172_18_24_62.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673509757%3B1673516957%26q-key-time%3D1673509757%3B1673516957%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3D557de14ddfb999d35ddef9e23b3532d9d299c62f\",\"ip\":\"172.18.24.62\",\"score\":82,\"radius\":0,\"type\":1,\"createTime\":1673509757496,\"createTimeStr\":\"2023-01-12 15:49:17\"}" + //val road2 = "{\"poiType\":\"100061\",\"receiveTime\":1673509756306,\"detectTime\":1673509756290,\"id\":\"be6a2000-a96c-42c8-a7ef-f83388d84858\",\"index\":\"636136931493532287\",\"polygon\":[{\"lon\":112.5733515539896,\"lat\":26.823143145432386},{\"lon\":112.57335140084462,\"lat\":26.823142454672727},{\"lon\":112.57335096472467,\"lat\":26.823141869074952},{\"lon\":112.57335031202503,\"lat\":26.82314147779103},{\"lon\":112.57334954211333,\"lat\":26.82314134039038},{\"lon\":112.57334877220161,\"lat\":26.82314147779103},{\"lon\":112.573348119502,\"lat\":26.823141869074952},{\"lon\":112.57334768338202,\"lat\":26.823142454672727},{\"lon\":112.57334753023707,\"lat\":26.823143145432386},{\"lon\":112.57334768338202,\"lat\":26.82314383619207},{\"lon\":112.57334811950196,\"lat\":26.82314442178987},{\"lon\":112.5733487722016,\"lat\":26.823144813073792},{\"lon\":112.57334954211333,\"lat\":26.823144950474443},{\"lon\":112.57335031202504,\"lat\":26.823144813073792},{\"lon\":112.57335096472468,\"lat\":26.82314442178987},{\"lon\":112.57335140084464,\"lat\":26.82314383619207},{\"lon\":112.5733515539896,\"lat\":26.823143145432386}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-4,\"bearing\":332,\"roadName\":\"雁鸣路\"}],\"center\":{\"lon\":112.57334952644263,\"lat\":26.823143141971546},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-4,\"bearing\":332,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":72,\"polygon\":[{\"lon\":112.57341760772391,\"lat\":26.823104379136176},{\"lon\":112.57335121413183,\"lat\":26.82314367391432},{\"lon\":112.57334751791018,\"lat\":26.823142500693834},{\"lon\":112.57341321183773,\"lat\":26.82310322131963}],\"boundBox\":[{\"x\":1551.2252197265625,\"y\":352.58837890625},{\"x\":1562.4649658203125,\"y\":352.58837890625},{\"x\":1562.4649658203125,\"y\":376.17327880859375},{\"x\":1551.2252197265625,\"y\":376.17327880859375}],\"center\":{\"lon\":112.57334952644263,\"lat\":26.823143141971546}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/be6a2000-a96c-42c8-a7ef-f83388d84858_172_18_24_42.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673509758%3B1673516958%26q-key-time%3D1673509758%3B1673516958%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3Db2682464078ae53eae6e87f924abe17fa7c04ac8\",\"ip\":\"172.18.24.42\",\"score\":72,\"radius\":0,\"type\":1,\"createTime\":1673509758511,\"createTimeStr\":\"2023-01-12 15:49:18\"}" + val jingzhi1 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}" + val jingzhi2 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}" + val jingzhi3 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}" + while (true) { + delay(1000) + //V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(shigu, V2XRoadXData::class.java))) + V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(road1, V2XRoadXData::class.java))) + // V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(road2, V2XRoadXData::class.java))) + } + } + +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/mogo/functions/test/RoadInfoTest.kt b/app/src/androidTest/java/com/mogo/functions/test/RoadInfoTest.kt new file mode 100644 index 0000000000..fbe4b68732 --- /dev/null +++ b/app/src/androidTest/java/com/mogo/functions/test/RoadInfoTest.kt @@ -0,0 +1,113 @@ +package com.mogo.functions.test + +import android.util.Log +import androidx.test.core.app.ActivityScenario +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import androidx.test.platform.app.InstrumentationRegistry +import com.mogo.eagle.core.function.main.MainLauncherActivity +import com.mogo.eagle.function.biz.v2x.v2n.utils.V2NUtils +import com.mogo.map.MapDataWrapper +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + + +@RunWith(AndroidJUnit4::class) +@LargeTest +class RoadInfoTest { + + companion object { + private const val TAG = "RoadInfoTest" + } + + lateinit var launch: ActivityScenario + + @Before + fun before() { + launch = ActivityScenario.launch(MainLauncherActivity::class.java) + } + + + @Test + fun testGetRoadName(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + val lon = arguments.getString("lon", "0").toDouble() + val lat = arguments.getString("lat", "0").toDouble() + val angle = arguments.getString("angle", "0").toFloat() + val times = arguments.getString("times", "1").toInt() + var count = 0 + Log.d(TAG, "lon: $lon, lat:$lat, angle: $angle, times: $times") + while (count < times) { + val roadInfo = MapDataWrapper.getRoadInfo(lon, lat, angle) + Log.d(TAG, "road-data: $roadInfo") + delay(millis) + count++ + } + } + + + @Test + fun testGetLaneInfo(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + val tileId = arguments.getString("tileId", "0").toLong() + val roadId = arguments.getString("roadId", "0").toInt() + val times = arguments.getString("times", "1").toInt() + Log.d(TAG, "tileId: $tileId, roadId:$roadId, times: $times") + var count = 0 + while (count < times) { + val laneInfo = MapDataWrapper.getLaneInfo(tileId, roadId) + Log.d(TAG, "lane-data: ${ laneInfo.joinToString(",") { itx -> itx.points.joinToString("-") { "${it.first}->${it.second}" } } }") + count++ + } + } + + @Test + fun testComputeOccupyLaneInfo(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + val lon = arguments.getString("lon", "0").toDouble() + val lat = arguments.getString("lat", "0").toDouble() + val angle = arguments.getString("angle", "0").toFloat() + val times = arguments.getString("times", "1").toInt() + var count = 0 + while (count < times) { + val polygon = readPolygonJson() + Log.d(TAG, "polygon -> " + polygon.joinToString(",")) + val decision = V2NUtils.computeOccupyLanesInfo(Triple(0.0, 0.0, 1f), Triple(lon, lat, angle), polygon) + Log.d(TAG, "decision -> $decision") + count++ + } + } + + private fun readPolygonJson(): List> { + return InstrumentationRegistry.getInstrumentation().context.assets.open("polygon.txt").reader().use { itx -> + val items = itx.readLines().map { xx -> + xx.split(",").map { it.trim().toDouble() } + }.flatten() + val result = ArrayList>() + var first = 0.0 + for ((index, data) in items.withIndex()) { + if ((index % 2) == 0) { + first = data + } else { + result.add(Pair(first, data)) + } + } + result + } + } +} diff --git a/app/src/androidTest/java/com/mogo/functions/test/V2NTest.kt b/app/src/androidTest/java/com/mogo/functions/test/V2NTest.kt new file mode 100644 index 0000000000..78f15e375f --- /dev/null +++ b/app/src/androidTest/java/com/mogo/functions/test/V2NTest.kt @@ -0,0 +1,305 @@ +package com.mogo.functions.test + +import android.text.TextUtils +import android.util.Log +import androidx.test.core.app.ActivityScenario +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import androidx.test.platform.app.InstrumentationRegistry +import com.google.protobuf.ByteString +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.multidisplay.TelematicConstant +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager +import com.mogo.eagle.core.function.main.MainLauncherActivity +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.map.MapDataWrapper +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.Location +import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.telematics.pad.MessagePad.V2nCrossSpeed +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import java.util.Collections +import java.util.concurrent.TimeUnit +import kotlin.math.cos +import kotlin.math.sin + + +@RunWith(AndroidJUnit4::class) +@LargeTest +class V2NTest { + + companion object { + private const val TAG = "GreenWaveTest" + } + + lateinit var launch: ActivityScenario + + @Before + fun before() { + launch = ActivityScenario.launch(MainLauncherActivity::class.java) + } + + @Test + fun testRoadShiGong(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + FunctionBuildConfig.isNewV2NData = true + FunctionBuildConfig.v2nMainSwitch = true + runCatching { + val map = HashMap().also { + it["f1"] = FunctionBuildConfig.v2nMainSwitch + it["f2"] = FunctionBuildConfig.isNewV2NData + } + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) + } + delay(2000) + val targetX = arguments.getString("lon", "0").toDouble() + val targetY = arguments.getString("lat", "0").toDouble() + val targetDistance = arguments.getString("distance", "0").toDouble() + val eventDistance = arguments.getString("event_distance", "50").toDouble() + val r = arguments.getString("r", "1").toDouble() + var car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance, event_distance: $eventDistance") + while (distance > targetDistance) { + delay(2000) + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + } + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val point = DrivingDirectionUtils.calculateNewPoint(car.longitude, car.latitude, car.heading , eventDistance) + val polygon = generateTriangle(point.first, point.second, car.heading, r * 1e-5) + val data = TrackedObject.getDefaultInstance().toBuilder().setType(501).setLongitude(point.first).setLatitude(point.second).setAltitude(0.0).setSystemTime(System.currentTimeMillis() * 1.0 / 1000).setSatelliteTime(1.0).setUuid(10).setCarID("1").setColor("#ffffff").setHeading(car.heading).setSpeed(0.0).setDrawLevel(1).setDriverTime(1.0).setCameraIp("172.18.7.40").setVideoUrl("").addAllImageUrl(Collections.singletonList("http://www.baidu.com")).addAllPolygon(polygon.map { Location.getDefaultInstance().toBuilder().setLongitude(it.first).setLatitude(it.second).setAltitude(0.0).setHeading(0.0).setStation(false).build() }).setDetectStartTime(System.currentTimeMillis()).setV2XUuid("xxxxx1").setStrUuid("xxxxx2").build() + val trafficData = Collections.singletonList(data) + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_AI_ROAD_SHI_GONG, data.toByteArray()) + CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyDataUpdate(trafficData) + delay(TimeUnit.MINUTES.toMillis(10)) + } + + @Test + fun testRoadShiGu(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + FunctionBuildConfig.isNewV2NData = true + FunctionBuildConfig.v2nMainSwitch = true + runCatching { + val map = HashMap().also { + it["f1"] = FunctionBuildConfig.v2nMainSwitch + it["f2"] = FunctionBuildConfig.isNewV2NData + } + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) + } + delay(2000) + val targetX = arguments.getString("lon", "0").toDouble() + val targetY = arguments.getString("lat", "0").toDouble() + val targetDistance = arguments.getString("distance", "0").toDouble() + val eventDistance = arguments.getString("event_distance", "0").toDouble() + val r = arguments.getString("r", "1").toDouble() + var car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance, event_distance: $eventDistance") + while (distance > targetDistance) { + delay(2000) + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + } + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val point = DrivingDirectionUtils.calculateNewPoint(car.longitude, car.latitude, car.heading , eventDistance) + val polygon = generateTriangle(point.first, point.second, car.heading, r * 1e-5) + val data = TrackedObject.getDefaultInstance().toBuilder().setType(13).setLongitude(point.first).setLatitude(point.second).setAltitude(0.0).setSystemTime(System.currentTimeMillis() * 1.0 / 1000).setSatelliteTime(1.0).setUuid(10).setCarID("1").setColor("#ffffff").setHeading(car.heading).setSpeed(0.0).setDrawLevel(1).setDriverTime(1.0).setCameraIp("172.18.7.40").setVideoUrl("").addAllImageUrl(Collections.singletonList("http://www.baidu.com")).addAllPolygon(polygon.map { Location.getDefaultInstance().toBuilder().setLongitude(it.first).setLatitude(it.second).setAltitude(0.0).setHeading(0.0).setStation(false).build() }).setDetectStartTime(System.currentTimeMillis()).setV2XUuid("xxxxx1").setStrUuid("xxxxx2").build() + val trafficData = Collections.singletonList(data) + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { + it.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_AI_ROAD_SHI_GU, data.toByteArray()) + CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyDataUpdate(trafficData) + delay(TimeUnit.MINUTES.toMillis(10)) + } + + private fun generateTriangle(x: Double, y: Double, angle: Double, r: Double): List> { + val angles = arrayOf(0, 120, 240) + val coordinates = ArrayList>() + for(i in 0 until 3) { + val radian = Math.toRadians(angles[i] + angle) + val x1 = x + (r * cos(radian)) + val y1 = y + (r * sin(radian)) + coordinates += Pair(x1, y1) + } + coordinates.add(coordinates[0]) + return coordinates + } + + @Test + fun testGreenWave(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + val targetX = arguments.getString("lon", "0").toDouble() + val targetY = arguments.getString("lat", "0").toDouble() + val targetDistance = arguments.getString("distance", "0").toDouble() + var car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + while (distance > targetDistance) { + delay(2000) + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + } + Log.d(TAG, "开始获取路口数据...") + var crossInfo = MapDataWrapper.getCrossRoad(car.longitude, car.latitude, car.heading) + while (crossInfo == null || TextUtils.isEmpty(crossInfo.cross_id) || TextUtils.isEmpty(crossInfo.cross_id_end)) { + Log.d(TAG, "获取到的路口数据无效, 1秒后重试") + delay(TimeUnit.SECONDS.toMillis(1)) + Log.d(TAG, "1秒时间到,开始计算新的路口数据") + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + crossInfo = MapDataWrapper.getCrossRoad(car.longitude, car.latitude, car.heading) + } + val newPoint = DrivingDirectionUtils.calculateNewPoint(car.longitude, car.latitude, car.heading , 200.0) + Log.d(TAG, "获取到路口数据..., 自车:[${car.longitude}, ${car.latitude}]前方200米外的点: [${newPoint.first}, ${newPoint.second}]") + FunctionBuildConfig.isNewV2NData = true + FunctionBuildConfig.v2nMainSwitch = true + runCatching { + val map = HashMap().also { + it["f1"] = FunctionBuildConfig.v2nMainSwitch + it["f2"] = FunctionBuildConfig.isNewV2NData + } + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) + } + delay(2000) + val data = V2nCrossSpeed.getDefaultInstance().toBuilder().setSpeedLeftMin(0).setSpeedLeftMax(0).setSpeedRightMin(0).setSpeedRightMax(0).setSpeedStraightMin(30).setSpeedStraightMax(54).setMaxSpeed(0).setMaxStatus(0).setLng(newPoint.first).setLat(newPoint.second).build() + CallerV2nNioEventListenerManager.invokeV2nNioGreenWavePassageEvent(data) + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { + it.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + while (!CallerTelematicManager.getServerStarted()) { + Log.d(TAG , "乘客屏未连接, 2秒后重试...") + delay(2000) + } + Log.d(TAG, "乘客屏已连接, 将数据发送给乘客屏...") + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_AI_ROAD_GREEN_WAVE, data.toByteArray()) + delay(TimeUnit.MINUTES.toMillis(10)) + } + + + @Test + fun testPeopleCross(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + FunctionBuildConfig.isNewV2NData = true + FunctionBuildConfig.v2nMainSwitch = true + runCatching { + val map = HashMap().also { + it["f1"] = FunctionBuildConfig.v2nMainSwitch + it["f2"] = FunctionBuildConfig.isNewV2NData + } + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) + } + + delay(2000) + val targetX = arguments.getString("lon", "0").toDouble() + val targetY = arguments.getString("lat", "0").toDouble() + val targetHeading = arguments.getString("angle", "0").toDouble() + val targetDistance = arguments.getString("distance", "0").toDouble() + val eventDistance = arguments.getString("event_distance", "60").toDouble() + var car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + while (distance > targetDistance) { + delay(2000) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + } + Log.d(TAG, "2 -- > target_distance: $targetDistance, current distance: $distance") + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var newPoint = DrivingDirectionUtils.calculateNewPoint(car.longitude, car.latitude, car.heading , eventDistance) + Log.d(TAG, "location:[x:${targetX}, y:${targetY}, new_location:[x:${newPoint.first}, y:${newPoint.second}]") + val eventId = "xxxxxxxxxxxxx" + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { + it.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + for (i in 0 until 500) { + val data = MessagePad.Event.getDefaultInstance().toBuilder().setLongitude(newPoint.first).setLatitude(newPoint.second).setGnssType(2).setEventId(eventId).setTimestamp(System.currentTimeMillis()).addAllTargetIds(emptyList()).addTargetIdsBytes(ByteString.EMPTY).addTargetIds("0").setExts("{ \"cameraIp\": \"172.18.7.40\",\"eventExtUnits\":[{\"heading\":266.5414733886719,\"uuid\":\"e440951e-5eb6-4091-8560-72a5d8aaf229\"}] }").build() + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_AI_ROAD_PEOPLE_CROSS, data.toByteArray()) + CallerV2nNioEventListenerManager.invokeV2nNioCrossoverEvent(data) + delay(50) + newPoint = DrivingDirectionUtils.calculateNewPoint(newPoint.first, newPoint.second, targetHeading, 1.0) + } + delay(TimeUnit.MINUTES.toMillis(10)) + } + + @Test + fun testOtherRetrogradeVehicle(): Unit = runBlocking { + val arguments = InstrumentationRegistry.getArguments() + val millis = arguments.getString("delay", "0").toLong() + if (millis > 0) { + delay(millis) + } + FunctionBuildConfig.isNewV2NData = true + FunctionBuildConfig.v2nMainSwitch = true + runCatching { + val map = HashMap().also { + it["f1"] = FunctionBuildConfig.v2nMainSwitch + it["f2"] = FunctionBuildConfig.isNewV2NData + } + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_NEW_LINK_SWITCH, GsonUtils.toJson(map).toByteArray()) + } + delay(2000) + val targetX = arguments.getString("lon", "0").toDouble() + val targetY = arguments.getString("lat", "0").toDouble() + val targetHeading = arguments.getString("angle", "0").toDouble() + val targetDistance = arguments.getString("distance", "0").toDouble() + val eventDistance = arguments.getString("event_distance", "60").toDouble() + var car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + while (distance > targetDistance) { + delay(2000) + Log.d(TAG, "target_distance: $targetDistance, current distance: $distance") + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, targetX, targetY) + } + car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + Log.d(TAG, "2 -- > target_distance: $targetDistance, current distance: $distance") + var newPoint = DrivingDirectionUtils.calculateNewPoint(car.longitude, car.latitude, car.heading , eventDistance) + Log.d(TAG, "location:[x:${targetX}, y:${targetY}, new_location:[x:${newPoint.first}, y:${newPoint.second}]") + val eventId = System.currentTimeMillis().toString() + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { + it.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + for (i in 0 until 500) { + val data = MessagePad.Event.getDefaultInstance().toBuilder().setLongitude(newPoint.first).setLatitude(newPoint.second).setEventId(eventId).setTimestamp(System.currentTimeMillis()).addAllTargetIds(emptyList()).addTargetIdsBytes(ByteString.EMPTY).setGnssType(2).addTargetIds("0").setExts("{ \"cameraIp\": \"172.18.7.40\",\"eventExtUnits\":[{\"heading\":266.5414733886719,\"uuid\":\"e440951e-5eb6-4091-8560-72a5d8aaf229\"}] }").build() + CallerTelematicManager.sendMsgToAllClients(TelematicConstant.V2N_AI_ROAD_OTHER_RETROGRADE_VEHICLE, data.toByteArray()) + CallerV2nNioEventListenerManager.invokeV2nNioOtherRetrogradeEvent(data) + delay(50) + newPoint = DrivingDirectionUtils.calculateNewPoint(newPoint.first, newPoint.second, targetHeading, 1.0) + } + delay(TimeUnit.MINUTES.toMillis(10)) + } +} diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index e5697eb5dd..34ec3e8a7e 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -28,7 +28,7 @@ public class MogoApplication extends MainMoGoApplication { @Override public void onCreate() { -// TraceNodeCore.Companion.getTraceNodeCore().setDebugMode(false); //todo +// TraceNodeCore.Companion.getTraceNodeCore().setDebugMode(false); //debuggable验证时打开 ARouterStartUp.init(this); ConfigStartUp.init(this); tryEnableStrictMode(); diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index 59d0507764..83dd4c9ca7 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -44,6 +44,7 @@ object ConfigStartUp { FunctionBuildConfig.isDemoMode = BuildConfig.IS_DEMO_MODE // app安装的身份信息 FunctionBuildConfig.appIdentityMode = "Product_${BuildConfig.APP_IDENTITY_MODE_BODY}_${BuildConfig.APP_IDENTITY_MODE_TAIL}" + FunctionBuildConfig.ttsLanguage = BuildConfig.ttsLanguage // 支持的业务类型 if(!StringUtils.isEmpty(BuildConfig.supportBusiness)&&BuildConfig.supportBusiness!="null"){ FunctionBuildConfig.supportBusiness = GsonUtils.fromJson(BuildConfig.supportBusiness, object : TypeToken>() {}.type) diff --git a/config.gradle b/config.gradle index a7817ebe15..da325d0232 100644 --- a/config.gradle +++ b/config.gradle @@ -235,7 +235,10 @@ ext { google_auto_service : "com.google.auto.service:auto-service:1.0-rc7", //======================== handler-proxy-runtime ============== - handler_proxy_runtime : "com.mogo.eagle.core.handler.proxy:runtime:10.0.10" + handler_proxy_runtime : "com.mogo.eagle.core.handler.proxy:runtime:10.0.10", + + //======================== jts-core ============== + jts_core : "org.locationtech.jts:jts-core:1.19.0" ] android = [ fLauncherApplicationId : "com.mogo.launcher.f", diff --git a/core/function-impl/mogo-core-function-biz/build.gradle b/core/function-impl/mogo-core-function-biz/build.gradle index b3d65170dc..84336e0873 100644 --- a/core/function-impl/mogo-core-function-biz/build.gradle +++ b/core/function-impl/mogo-core-function-biz/build.gradle @@ -67,8 +67,9 @@ dependencies { kapt rootProject.ext.dependencies.androidxroomcompiler implementation rootProject.ext.dependencies.androidxroomktx implementation rootProject.ext.dependencies.localbroadcastmanager + implementation rootProject.ext.dependencies.jts_core compileOnly project(':core:function-impl:mogo-core-function-map') - + compileOnly project(":libraries:mogo-map") implementation project(':foudations:mogo-commons') implementation project(':core:mogo-core-utils') implementation project(':core:mogo-core-network') diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt index 943c90cf67..1d59a9f9b0 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt @@ -14,6 +14,7 @@ import com.mogo.eagle.function.biz.dispatch.DispatchAutoPilotManager.Companion.d import com.mogo.eagle.function.biz.monitoring.CronTaskManager.Companion.cronTaskManager import com.mogo.eagle.function.biz.notice.NoticeSocketManager.Companion.noticeSocketManager import com.mogo.eagle.function.biz.notice.network.NoticeNetWorkManager +import com.mogo.eagle.function.biz.v2x.busstation.PassBusStationEventManager import com.mogo.eagle.function.biz.v2x.obu.V2xObuEventManager import com.mogo.eagle.function.biz.v2x.overview.OverViewDataManager import com.mogo.eagle.function.biz.v2x.overview.db.OverviewDb @@ -54,6 +55,7 @@ class FuncBizProvider : IMoGoFuncBizProvider { V2NIdentifyDrawer.init() // RedLightWarningManager.INSTANCE.listenTrafficLight() V2XEventAnalyticsManager.init() + PassBusStationEventManager.init() } override fun feedBackNoticeTraffic(infoId: String, sn: String, accept: Int) { @@ -126,6 +128,7 @@ class FuncBizProvider : IMoGoFuncBizProvider { dispatchAutoPilotManager.release() cronTaskManager.release() + PassBusStationEventManager.unInit() VipCarManager.INSTANCE.destroy() if(!(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/busstation/PassBusStationEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/busstation/PassBusStationEventManager.kt new file mode 100644 index 0000000000..17b7684610 --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/busstation/PassBusStationEventManager.kt @@ -0,0 +1,418 @@ +package com.mogo.eagle.function.biz.v2x.busstation + +import android.os.Handler +import android.os.HandlerThread +import android.os.Message +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.config.HmiBuildConfig +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener +import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.V2N +import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State.START +import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State.STOP +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils +import com.mogo.eagle.core.utilcode.util.UriUtils +import com.mogo.map.MogoData +import com.mogo.map.entities.BusStation +import com.mogo.map.overlay.core.Level +import com.mogo.map.overlay.point.Point +import com.zhidaoauto.map.data.point.LonLatPoint +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import mogo.telematics.pad.MessagePad +import java.util.LinkedList +import java.util.UUID +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicBoolean +import kotlin.random.Random + +/** + * 计算通过公交站点 管理类 + */ +object PassBusStationEventManager : IMoGoChassisLocationWGS84Listener { + + const val TAG = "PassBusStationEventManager" + const val ANALYTICS_KEY = "biz_v2x_road_pass_bus_station_manager" + + // 距离当前车位置 X 米远的点集合(用来查询根据点查询roadId, 然后用roadId查询路上的公交站点) + private val farthestLocationList = ArrayList() + + // 是否在计算附近的公交站点集合 + private val isCalculateNearByStation = AtomicBoolean(false) + + // 查询出来的符合条件的公交站点集合 + private val busStationNearByQueue = LinkedList>() + + // 需要提醒的公交站点(待提醒,已提醒) + private val busStationListNeedNotified = HashMap() + + private val isNotifyRunnableRunning = AtomicBoolean(false) + + private val isDriverScreen by lazy { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + + private val checkDistanceRunnable = object : Runnable { + override fun run() { + try { + synchronized(busStationNearByQueue) { + if (busStationNearByQueue.isNotEmpty()) { + val list = busStationNearByQueue.pollLast() + val currentLocation = + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + list.forEach { + if (!busStationListNeedNotified.containsKey(it.getBusStationId())) { + val distance = CoordinateUtils.calculateLineDistance( + currentLocation.longitude, + currentLocation.latitude, + it.getBusStationPoint().longitude, + it.getBusStationPoint().latitude, + ).toInt() + val angle = DrivingDirectionUtils.getDegreeOfCar2Poi( + currentLocation.longitude, + currentLocation.latitude, + it.getBusStationPoint().longitude, + it.getBusStationPoint().latitude, + currentLocation.heading.toInt() + ) + if (distance <= 150 && angle < 90) { + it.notifyDistance = distance + busStationListNeedNotified[it.getBusStationId()] = it + Logger.d( + TAG, "addNeedNotifiedBusStation --> ${it.toString()}" + ) + } + } + } + } + } + + // 对已经展示过的做移除 消散操作 + if (busStationListNeedNotified.isNotEmpty()) { + val currentLocation = + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + busStationListNeedNotified.values.forEach { + val distance = CoordinateUtils.calculateLineDistance( + currentLocation.longitude, + currentLocation.latitude, + it.getBusStationPoint().longitude, + it.getBusStationPoint().latitude, + ).toInt() + val angle = DrivingDirectionUtils.getDegreeOfCar2Poi( + currentLocation.longitude, + currentLocation.latitude, + it.getBusStationPoint().longitude, + it.getBusStationPoint().latitude, + currentLocation.heading.toInt() + ) + if (angle >= 90 || distance >= 150) { + CallerRoadV2NEventWindowListenerManager.dismiss(it.getBusStationId()) + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION), STOP) + } + } + busStationListNeedNotified.remove(it.getBusStationId()) + trackEvent("dismiss --> busStationId=${it.getBusStationId()}") + Logger.d( + TAG, + "removeNeedNotifiedBusStation --> ${it.toString()}" + ) + if (HmiBuildConfig.isShowBusStationStrategyBorderPoint) { +// mockOtherRetroGradeVehicleData( +// it.getBusStationPoint().longitude, +// it.getBusStationPoint().latitude, +// currentLocation.heading +// ) + } + } + } + } + + // 开始提醒 + if (busStationListNeedNotified.isNotEmpty() && !isNotifyRunnableRunning.get()) { + notificationHandler.removeCallbacks(notificationCheckRunnable) + notificationHandler.post(notificationCheckRunnable) + } + } catch (e: Exception) { + e.printStackTrace() + } finally { + notificationHandler?.postDelayed(this, 800L) + } + } + } + + private val notificationCheckRunnable = object : Runnable { + override fun run() { + isNotifyRunnableRunning.set(true) + if (busStationListNeedNotified.isNotEmpty()) { + val list = busStationListNeedNotified.values.toList() + .filter { it.notifyTime <= 0 && it.notifyDistance > 0 } + .sortedBy { it.notifyDistance } + if (list.isNotEmpty()) { + list.first().also { + it.notifyTime = System.currentTimeMillis() + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION), START) + } + } + CallerRoadV2NEventWindowListenerManager.showImage( + it.getBusStationId(), + it.notifyTime, + EventTypeEnumNew.getUpdateIconRes(EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION.poiType), + String.format( + EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION.poiType), + it.notifyDistance + ), + isDriverScreen, + String.format( + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION.poiType), + it.notifyDistance + ), + UriUtils.res2Uri( + EventTypeEnumNew.getPoiTypeBg( + EventTypeEnumNew.TYPE_USECASE_ROAD_BUS_STATION.poiType, + false + ).toString() + ).toString() + ) + trackEvent("showBusStationNotification --> ${it.toString()}") + Logger.d( + TAG, + "showBusStationNotification --> ${it.toString()}" + ) + } + if (list.size >= 2) { + isNotifyRunnableRunning.set(true) + notificationHandler.postDelayed(this, 4000L) + return + } + } + } + isNotifyRunnableRunning.set(false) + } + } + + + private val notificationHandler by lazy { + val thread = HandlerThread("road_v2n_bus_station_notification") + thread.start() + Handler(thread.looper) + } + + private const val MSG_WHAT_CALCULATE = 0x1010 // 计算附近公交站点 + + private val calculateHandler by lazy { + val thread = HandlerThread("road_v2n_bus_station_calculate") + thread.start() + Handler(thread.looper) { msg -> + if (msg.what == MSG_WHAT_CALCULATE) { + val gnssInfo = msg.obj as? MogoLocation + gnssInfo?.also { + calculateNearByStation(it, 17, 10) + } + } + true + } + } + + fun init() { + CallerChassisLocationWGS84ListenerManager.addListener(TAG, 1, this) + notificationHandler.removeCallbacks(checkDistanceRunnable) + notificationHandler.removeCallbacks(notificationCheckRunnable) + notificationHandler.post(checkDistanceRunnable) + calculateHandler.removeMessages(MSG_WHAT_CALCULATE) + trackEvent("init") + } + + fun unInit() { + CallerChassisLocationWGS84ListenerManager.removeListener(TAG) + busStationNearByQueue.clear() + busStationListNeedNotified.clear() + notificationHandler.removeCallbacks(checkDistanceRunnable) + notificationHandler.removeCallbacks(notificationCheckRunnable) + calculateHandler.removeMessages(MSG_WHAT_CALCULATE) + isCalculateNearByStation.set(false) + isNotifyRunnableRunning.set(false) + trackEvent("unInit") + } + + override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { + if (!isCalculateNearByStation.get()) { + isCalculateNearByStation.set(true) + calculateHandler.removeMessages(MSG_WHAT_CALCULATE) + calculateHandler.sendMessage( + Message.obtain( + calculateHandler, + MSG_WHAT_CALCULATE, + gnssInfo + ) + ) + } + } + + /** + * @param gnssInfo 当前经纬度 + * @param segment 段总数 + * @param metersPreSegment 每段多少米 + */ + private fun calculateNearByStation( + gnssInfo: MogoLocation, segmentSum: Int, metersPreSegment: Int + ) { + val result = kotlin.runCatching { + farthestLocationList.clear() + val heading = gnssInfo.heading + //每metersPreSegment 米一个点,获取 segmentSum * metersPreSegment 米范围内的坐标点 + for (index in 1..segmentSum) { + val newPoint = DrivingDirectionUtils.calculateNewPoint( + gnssInfo.longitude, + gnssInfo.latitude, + heading, + index * metersPreSegment * 1.0 + ) + newPoint?.also { + farthestLocationList.add(LonLatPoint(it.first, it.second)) + } + busStationHDMarkerStrategy() + } + + MogoData.mogoMapData.get()?.also { iMogoData -> + val latch = CountDownLatch(1) + iMogoData.getBusStation(java.util.ArrayList(farthestLocationList.toMutableList())) { + try { + val busStationList = it + + val filteredBusStationList = busStationList.filter { + it.busStationPoints.isNotEmpty() && + DrivingDirectionUtils.getDegreeOfCar2Poi( + gnssInfo.longitude, + gnssInfo.latitude, + it.getBusStationPoint().longitude, + it.getBusStationPoint().latitude, + gnssInfo.heading.toInt() + ) < 90 && CoordinateUtils.calculateLineDistance( + gnssInfo.longitude, + gnssInfo.latitude, + it.getBusStationPoint().longitude, + it.getBusStationPoint().latitude, + ) <= (segmentSum * metersPreSegment) + } + Logger.d( + TAG, + "calculateNearByStation --> 本次查询出:${busStationList.size}个,本次符合条件:${filteredBusStationList.size}个,当前待提醒:${busStationListNeedNotified.size}个" + ) + synchronized(busStationNearByQueue) { + busStationNearByQueue.clear() + busStationNearByQueue.add(filteredBusStationList) + } + Logger.d(TAG, "getBusStation --- 1 ---") + } catch (e: Exception) { + e.printStackTrace() + } finally { + isCalculateNearByStation.set(false) + latch.countDown() + } + } + try { + if (latch.await(3, TimeUnit.SECONDS)) { + Logger.d(TAG, "getBusStation --- 2 ---") + } else { + Logger.d(TAG, "getBusStation --- 3 ---") + } + } catch (e: InterruptedException) { + e.printStackTrace() + } finally { + isCalculateNearByStation.set(false) + } + } ?: run { + isCalculateNearByStation.set(false) + } + } + if (result.isFailure) { + Logger.e(TAG, "error => ${result.exceptionOrNull()?.stackTraceToString()}") + isCalculateNearByStation.set(false) + } else { + isCalculateNearByStation.set(false) + } + } + + fun trackEvent(msg: String) { + ProcessLifecycleOwner.get().lifecycleScope.launch(Dispatchers.IO) { + val map: MutableMap = HashMap() + map["msg"] = msg + MogoAnalyticUtils.track( + ANALYTICS_KEY, + map + ) + } + } + + private var hasShownBorderPointHDMarker = false + private fun busStationHDMarkerStrategy() { + if (HmiBuildConfig.isShowBusStationStrategyBorderPoint) { + farthestLocationList.last().also { + showHDMarker(it.longitude, it.latitude) + } + hasShownBorderPointHDMarker = true + } else { + if (hasShownBorderPointHDMarker) { + removeHDMarker() + hasShownBorderPointHDMarker = false + } + } + } + + private fun showHDMarker(lon: Double, lat: Double) { + val builder = Point.Options.Builder( + "TYPE_MARKER_BUS_STATION", Level.MAP_MARKER + ).setId(UUID.randomUUID().toString()).anchor(0.2f, 0.2f) + .set3DMode(true) + .isUseGps(true) + .controlAngle(true) + .icon3DRes(EventTypeEnumNew.getMarker3DRes(EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType)) + .longitude(lon) + .latitude(lat) + val overlayManager = CallerMapUIServiceManager.getOverlayManager() + overlayManager?.removeAllPointsInOwner("TYPE_MARKER_BUS_STATION") + overlayManager?.showOrUpdatePoint(builder.build()) + } + + private fun removeHDMarker() { + val overlayManager = CallerMapUIServiceManager.getOverlayManager() + overlayManager?.removeAllPointsInOwner("TYPE_MARKER_BUS_STATION") + } + + private fun mockOtherRetroGradeVehicleData(lon: Double, lat: Double, heading: Double) { + val newPoint = DrivingDirectionUtils.calculateNewPoint( + lon, + lat, + heading, + 120.0 + ) + val event = MessagePad.Event.newBuilder().setEventId(Random.nextLong().toString()) + .setEventType(MessagePad.EventType.CONVERSE_RUNNING) + .setExts("{\"cameraIp\":\"172.18.7.40\"}") + .setGnssType(2) + .addTargetIds("${UUID.randomUUID().toString()}") + .setLongitude(newPoint.first) + .setLatitude(newPoint.second) + .setTimestamp(System.currentTimeMillis()) + .build() + CallerV2nNioEventListenerManager.invokeV2nNioOtherRetrogradeEvent(event) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt index f1d97cce21..b091bd6e04 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/redlightwarning/RedLightWarningManager.kt @@ -16,12 +16,12 @@ import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListen import com.mogo.eagle.core.function.api.v2x.IMoGoVipSetListener import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.v2x.CallVipSetListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X +import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.LocationUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.function.biz.v2x.trafficlight.core.MogoTrafficLightManager @@ -108,10 +108,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, val distance = if (roadResult != null && roadResult.rectLatLngs.size >= 2) { getMinDistance(roadResult.rectLatLngs, it.latitude, it.longitude) } else { - CallerMapUIServiceManager.getMapUIController()?.calculateLineDistance( - MogoLatLng(it.latitude, it.longitude), - MogoLatLng(trafficLightResult.lat, trafficLightResult.lon) - ) ?: 0f + CoordinateUtils.calculateLineDistance(it.latitude, it.longitude,trafficLightResult.lat, trafficLightResult.lon) } CallerLogger.d( "$M_V2X$TAG", diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/MogoTrafficLightManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/MogoTrafficLightManager.kt index 9162f89d09..53561394c6 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/MogoTrafficLightManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/MogoTrafficLightManager.kt @@ -2,7 +2,6 @@ package com.mogo.eagle.function.biz.v2x.trafficlight.core import android.content.Context import android.os.Handler -import android.os.HandlerThread import android.os.Looper import com.mogo.eagle.core.data.biz.trafficlight.RoadIDResult import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightControl @@ -10,6 +9,7 @@ import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.biz.trafficlight.isInRange import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager @@ -20,9 +20,10 @@ import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightThreadHandl import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_STOP_SEARCH_CROSS_ROAD import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_STOP_SEARCH_TRAFFIC_LIGHT import com.mogo.eagle.function.biz.v2x.trafficlight.network.TrafficLightNetWorkModel +import com.zhidaoauto.map.data.road.RoadCross class MogoTrafficLightManager : IMoGoChassisLocationGCJ02Listener, - CallerMapRoadListenerManager.OnRoadListener { + IMoGoMapRoadListener { companion object { @@ -51,7 +52,7 @@ class MogoTrafficLightManager : IMoGoChassisLocationGCJ02Listener, fun initServer(context: Context) { mContext = context CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this) - CallerMapRoadListenerManager.registerRoadListener(TAG, this) + CallerMapRoadListenerManager.addListener(TAG, this) mThreadHandler = TrafficLightThreadHandler(Looper.getMainLooper(), { //第一次查询路口时,如果红绿灯显示,则隐藏掉 @@ -121,8 +122,8 @@ class MogoTrafficLightManager : IMoGoChassisLocationGCJ02Listener, mThreadHandler?.sendEmptyMessageDelayed(MSG_WHAT_LOOP_SEARCH_CROSS_ROAD, 5_000L) } - override fun onRoadChange(cross: Boolean) { - super.onRoadChange(cross) + override fun onRoadChange(cross: Boolean,roadCross: RoadCross?) { + super.onRoadChange(cross,roadCross) if(!cross){ outOfCrossRange() } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt index 8fcf73fa29..4b4238ee09 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt @@ -36,13 +36,10 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02 -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerV2XListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerV2XListenerManager.V2NCarTypeCheck.Companion.verifyCarType import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager -import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -61,7 +58,6 @@ import com.mogo.eagle.function.biz.v2x.v2n.receiver.SceneBroadcastReceiver import com.mogo.eagle.function.biz.v2x.v2n.scenario.impl.V2XScenarioManager import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager import com.mogo.eagle.function.biz.v2x.v2n.utils.toRoadMarker -import com.zhidaoauto.map.data.road.StopLine import com.zhjt.service.chain.ChainLog import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -74,12 +70,10 @@ import java.nio.charset.Charset import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.atomic.AtomicBoolean -import java.util.concurrent.atomic.AtomicReference - object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, IMoGoAutopilotIdentifyListener, IMoGoCloudListener, - IMoGoV2XListener, IMoGoAutopilotStatusListener, OnRoadListener { + IMoGoV2XListener, IMoGoAutopilotStatusListener { private const val TAG = "V2XEventManager" @@ -91,56 +85,15 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, private val hasInit by lazy { AtomicBoolean(false) } - private val firstLocationInCross by lazy { AtomicReference() } - - @Volatile - private var roadId = "" - - @Volatile - private var roadIdWithEnterCross = "" - - @Volatile - private var hasCrossRoad = false - fun init(context: Context) { if (hasInit.compareAndSet(false, true)) { registerListener() v2xPoiLoader.startLoopPoi() // 注册广播接收场景弹窗使用的 SceneBroadcastReceiver.register(context) - CallerMapRoadListenerManager.registerRoadListener(TAG, this) } } - override fun onRoadIdInfo(roadId: String) { - super.onRoadIdInfo(roadId) - Log.d(TAG, "--- onRoadIdInfo ---: $roadId") - this.roadId = roadId - val enterCrossRoadId = this.roadIdWithEnterCross - if (hasCrossRoad && roadId.isNotBlank() && enterCrossRoadId.isNotBlank() && enterCrossRoadId != roadId) { - hasCrossRoad = false - if (firstLocationInCross.get() == null) { - Log.d(TAG, "--- onRoadIdInfo --- 1 ---: $roadId") - firstLocationInCross.set(CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()) - } - } - } - - override fun onStopLineInfo(info: StopLine) { - super.onStopLineInfo(info) - Log.d(TAG, "--- onStopLineInfo --- 1 ---: ${ info.distance }") - if (!hasCrossRoad && info.distance <= 10) { - Log.d(TAG, "--- onStopLineInfo --- 2 ---: $roadId") - hasCrossRoad = true - roadIdWithEnterCross = this.roadId - firstLocationInCross.set(null) - } - } - - fun getFirstLocationInCross(): MogoLocation? { - return firstLocationInCross.get() - } - private fun registerListener() { CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 1, this) v2xPoiLoader.addCallback(this) @@ -363,7 +316,6 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, unRegisterListener() } v2xPoiLoader.stopLoopPoi() - CallerMapRoadListenerManager.unRegisterRoadListener(TAG) } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index 8b908447c1..914ca0f22e 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -3,53 +3,76 @@ package com.mogo.eagle.function.biz.v2x.v2n.pnc import android.os.Handler import android.os.HandlerThread import android.os.Message -import android.util.Log import androidx.core.util.Pair +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.enums.CommunicationType import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew -import com.mogo.eagle.core.data.enums.WarningDirectionEnum.ALERT_WARNING_TOP import com.mogo.eagle.core.data.map.entity.MarkerExploreWay import com.mogo.eagle.core.data.map.entity.MarkerLocation import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType.V2X import com.mogo.eagle.core.data.msgbox.V2XMsg -import com.mogo.eagle.core.function.angle.scenes.Default -import com.mogo.eagle.core.function.angle.scenes.RoadEvent import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener -import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoV2nNioEventListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.V2N -import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State +import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State.START +import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State.STOP import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +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.CallerV2XListenerManager.V2NCarTypeCheck +import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager +import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +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.AppStateManager import com.mogo.eagle.core.utilcode.util.CoordinateTransform import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.function.biz.v2x.V2XBizTrace +import com.mogo.eagle.function.biz.v2x.v2n.pnc.beans.Extras import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker.Marker +import com.mogo.eagle.function.biz.v2x.v2n.utils.EventDismissBean +import com.mogo.eagle.function.biz.v2x.v2n.utils.EventDismissManager +import com.mogo.eagle.function.biz.v2x.v2n.utils.IEventDismissListener import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager +import com.mogo.map.entities.Lane +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.Header import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.telematics.pad.MessagePad.V2nCrossSpeed import mogo.v2x.MogoV2X import mogo.v2x.MogoV2X.RSI_PB +import kotlin.math.abs /** * V2N上车相关事件绘制 */ -internal object V2NIdentifyDrawer { +internal object V2NIdentifyDrawer: IEventDismissListener { private const val TAG = "V2NIdentifyDataSubscriber" private const val MSG_WHAT_DRAW_SHIGONE = 0x1010 // 道路施工 private const val MSG_WHAT_DRAW_SHIGU = 0x1011 // 交通事故 private const val MSG_WHAT_DRAW_YONGDU = 0x1012 // 交通拥堵 + private const val MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE = 0x1013 // 他车倒车/逆行 + private const val MSG_WHAT_DRAW_GREEN_WAVE = 0x1014 // 绿波通行 + private const val MSG_WHAT_DRAW_PEOPLE_CROSS = 0x1015 // 行人横穿 + + private val scope by lazy { CoroutineScope(ThreadUtils.getCpuPool().asCoroutineDispatcher()) } private val callback = Handler.Callback { msg -> if (msg.what == MSG_WHAT_DRAW_SHIGONE || msg.what == MSG_WHAT_DRAW_SHIGU) { @@ -58,13 +81,8 @@ internal object V2NIdentifyDrawer { V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu" to ""), true) return@Callback true } - if (msg.what == MSG_WHAT_DRAW_SHIGONE) { - Log.d("V2NIdentifyDrawer", "---callback -- drawShiGong --- 1 ---") - } else { - Log.d("V2NIdentifyDrawer", "---callback -- drawShiGu --- 1 ---") - } val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() - val filtered = events.filterIsInstance(TrackedObject::class.java).filter { itx -> + val filtered = events.filterIsInstance().filter { itx -> DrivingDirectionUtils.getDegreeOfCar2Poi( car.longitude, car.latitude, @@ -74,259 +92,402 @@ internal object V2NIdentifyDrawer { ) < 90 && CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, itx.longitude, itx.latitude) <= 300 } if (filtered.isEmpty()) { - if (msg.what == MSG_WHAT_DRAW_SHIGONE) { - Log.d("V2NIdentifyDrawer", "---callback -- drawShiGong --- filter is empty return ---") - } else { - Log.d("V2NIdentifyDrawer", "---callback -- drawShiGu --- filter is empty return---") - } V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu-filter" to ""), true) return@Callback true } - if (msg.what == MSG_WHAT_DRAW_SHIGONE) { - Log.d("V2NIdentifyDrawer", "---callback -- drawShiGong --- 2 ---") - } else { - Log.d("V2NIdentifyDrawer", "---callback -- drawShiGu --- 2 ---") - } filtered.forEach { itx -> - val id = itx.uuid.toString() - Log.d("V2NIdentifyDrawer", "---callback --- id: $id ---") + val id = itx.v2XUuid.ifEmpty { itx.uuid.toString() } + V2XBizTrace.onAck(itx, "filtered -> ${itx.type}") AiRoadMarker.aiMakers.getOrPut(id) { AiRoadMarker().apply { - val poiType = getPoiType(itx.type).poiType - val polygon = itx.polygonList.map { Pair.create(it.longitude, it.latitude) } - marker(Marker(id, - poiType, - itx.latitude, - itx.longitude, - itx.heading, - polygon, - null, - V2XRoadEventEntity().also { e -> - e.poiType = poiType - e.location = MarkerLocation().also { l -> - val p = CoordinateTransform.WGS84ToGCJ02( - itx.longitude, - itx.latitude - ) - l.lon = p[0] - l.lat = p[1] - l.angle = itx.heading - } - e.noveltyInfo = MarkerExploreWay().also { - it.poiType = poiType - it.location = e.location - it.polygon = polygon - } - }), true, isDrawRoadLine(poiType) - ) - - val distance = CoordinateUtils.calculateLineDistance( - itx.longitude, - itx.latitude, - car.longitude, - car.latitude - ) - val alertContent = getAlertContent(poiType, distance.toDouble()) - val ttsContent = getTtsContent(poiType, distance.toDouble()) - V2XBizTrace.onAck(TAG, "绘制poi事件:$poiType") - saveMsgBox( - MsgBoxBean( - V2X, - V2XMsg( - poiType, - alertContent, - ttsContent, - CommunicationType.V2N.name - ) - ) - ) - CallerHmiManager.warningV2X( - poiType, - alertContent, - ttsContent, - object : IMoGoWarningStatusListener { - override fun onShow() { - super.onShow() - runCatching { CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), State.START) } - CallerVisualAngleManager.changeAngle( - RoadEvent( + scope.launch { +// Log.d("V2NIdentifyDrawer", "--- 判断是否在路口 ---") +// while (CallerMapRoadListenerManager.isInRoadCross()) { +// delay(2000) +// } +// Log.d("V2NIdentifyDrawer", "--- 不在路口了 ---") + val poiType = getPoiType(itx.type).poiType + val polygon = itx.polygonList.map { Pair.create(it.longitude, it.latitude) } + marker(Marker(id, + poiType, + itx.longitude, + itx.latitude, + itx.heading, + polygon, + null, + V2XRoadEventEntity().also { e -> + e.poiType = poiType + e.location = MarkerLocation().also { l -> + val p = CoordinateTransform.WGS84ToGCJ02( itx.longitude, - itx.latitude, - itx.angle + itx.latitude ) + l.lon = p[0] + l.lat = p[1] + l.angle = itx.heading + } + e.noveltyInfo = MarkerExploreWay().also { + it.poiType = poiType + it.location = e.location + it.polygon = polygon + } + }, isUseGps = true), true, isDrawRoadLine(poiType) + ) + + val distance = CoordinateUtils.calculateLineDistance( + itx.longitude, + itx.latitude, + car.longitude, + car.latitude + ) +// if (polygon.isNotEmpty()) { +// val decision = V2NUtils.computeOccupyLanesInfo(Triple(car.longitude, car.latitude, car.heading.toFloat()), Triple(itx.longitude, itx.latitude, itx.heading.toFloat()), polygon.map { kotlin.Pair(it.first, it.second) }) +// if (decision != null) { +// val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) +// val total = decision.total +// val occupy = decision.occupy +// val laneId = decision.laneId +// val sb = StringBuilder() +// V2XBizTrace.onAck(decision, "计算出道路事件占道决策数据1") +// if (laneId != null) { +// val isOccupy = occupy.find { it.id == laneId } != null +// if (isOccupy) { +// if (isDriver) { +// val bestLane = V2NUtils.computeBestLane(laneId, occupy, total) +// V2XBizTrace.onAck(bestLane, "计算出最优车道") +// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇建议您尽快${bestLane.second}") +// } else { +// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇时刻为您守护") +// } +// } else { +// if (isDriver) { +// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇提醒您小心${ if (computeDirection(laneId, occupy) > 0) "右侧" else "左侧" }行人及来车") +// } else { +// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇时刻为您守护") +// } +// } +// } else { +// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇时刻为您守护") +// } +// if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { +// runCatching { +// CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), START) +// } +// scope.launch { +// delay(5000) +// runCatching { +// CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), STOP) +// } +// } +// } +// val ss = sb.toString() +// val content = ss.substring(0, ss.indexOf("@@")) +// val tts = ss.replace("@@", "") +// CallerRoadV2NEventWindowListenerManager.showLiveVideo(id, itx.detectStartTime.takeIf { it > 0 } ?: System.currentTimeMillis(), EventTypeEnumNew.getUpdateIconRes(poiType), content, isDriver, tts, itx.cameraIp, itx.longitude, itx.latitude) +// } +// } + val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + if (!isDriver) { + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), START) + } + scope.launch { + delay(5000) + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), STOP) + } + } + } + val content = "发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }" + val tts = "$content, 蘑菇提醒您小心行人及来车" + V2XBizTrace.onAck(TAG, "绘制poi事件:$poiType") + saveMsgBox( + MsgBoxBean( + V2X, + V2XMsg( + poiType, + content, + tts, + CommunicationType.V2N.name ) - } - - override fun onDismiss() { - super.onDismiss() - runCatching { CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), State.STOP) } - CallerVisualAngleManager.changeAngle(Default()) - } - }, - ALERT_WARNING_TOP, - 10000, - false - ) - //消息埋点 - V2XEventAnalyticsManager.triggerV2XEvent( - poiType, alertContent, ttsContent, - DataSourceType.AICLOUD, CommunicationType.V2N - ) - } - }.receive() - } - } else if (msg.what == MSG_WHAT_DRAW_YONGDU) { - Log.d("V2NIdentifyDrawer", "---callback -- drawYongDu --- 1 ---") - val events = msg.obj as? List<*> - if (events == null || events.isEmpty()) { - Log.d("V2NIdentifyDrawer", "---callback -- drawYongDu --- 1 filter is empty ---") - V2XBizTrace.onAck(TAG, mapOf("yongDu" to ""), true) - return@Callback true - } - val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() - val filtered = events.filterIsInstance(MogoV2X.RTEData_PB::class.java).filter { itx -> - val eventLon = - itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } - ?: 0.0 - val eventLat = - itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } - ?: 0.0 - DrivingDirectionUtils.getDegreeOfCar2Poi( - car.longitude, - car.latitude, - eventLon, - eventLat, - car.heading.toInt() - ) < 90 && CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, eventLon, eventLat) <= 300 - } - if (filtered.isEmpty()) { - Log.d("V2NIdentifyDrawer", "---callback -- drawYongDu --- 2 filter is empty ---") - V2XBizTrace.onAck(TAG, mapOf("yongDu-filter" to ""), true) - return@Callback true - } - Log.d("V2NIdentifyDrawer", "---callback -- drawYongDu --- 2 ---") - filtered.forEach { itx -> - val id = itx.rteId.toString() - val lon = itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } - ?: 0.0 - val lat = itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } - ?: 0.0 - Log.d("V2NIdentifyDrawer", "---callback -- id: $id---") - AiRoadMarker.aiMakers.getOrPut(id) { - AiRoadMarker().apply { - val poiType = getPoiType(itx.eventType).poiType - marker(Marker(id, poiType, lat, lon, car.heading, null, null, - V2XRoadEventEntity().also { e -> - e.poiType = poiType - e.location = MarkerLocation().also { l -> - val p = CoordinateTransform.WGS84ToGCJ02(lon, lat) - l.lon = p[0] - l.lat = p[1] - l.angle = car.heading - } - e.noveltyInfo = MarkerExploreWay().also { - it.poiType = poiType - it.location = e.location - it.polygon = emptyList() - } - }), true, isDrawRoadLine(poiType) - ) - - val distance = CoordinateUtils.calculateLineDistance( - lon, - lat, - car.longitude, - car.latitude - ) - val alertContent = getAlertContent(poiType, distance.toDouble()) - val ttsContent = getTtsContent(poiType, distance.toDouble()) - V2XBizTrace.onAck(TAG, "绘制poi事件:$poiType") - saveMsgBox( - MsgBoxBean( - V2X, - V2XMsg( - poiType, - alertContent, - ttsContent, - CommunicationType.V2N.name ) ) - ) - CallerHmiManager.warningV2X( - poiType, - alertContent, - ttsContent, - object : IMoGoWarningStatusListener { - override fun onShow() { - super.onShow() - runCatching { CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), State.START) } - CallerVisualAngleManager.changeAngle( - RoadEvent( - lon, - lat, - car.heading - ) - ) - } - - override fun onDismiss() { - super.onDismiss() - runCatching { CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), State.STOP) } - CallerVisualAngleManager.changeAngle(Default()) - } - }, - ALERT_WARNING_TOP, - 10000, - false - ) - //消息埋点 - V2XEventAnalyticsManager.triggerV2XEvent( - poiType, alertContent, ttsContent, - DataSourceType.AICLOUD, CommunicationType.V2N - ) + CallerRoadV2NEventWindowListenerManager.showLiveVideo(id, itx.detectStartTime.takeIf { it > 0 } ?: System.currentTimeMillis(), EventTypeEnumNew.getUpdateIconRes(poiType), content, isDriver, tts, itx.cameraIp, itx.longitude, itx.latitude) + //消息埋点 + V2XEventAnalyticsManager.triggerV2XEvent( + poiType, content, tts, + DataSourceType.AICLOUD, CommunicationType.V2N + ) + } } }.receive() } + } else if (msg.what == MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE) { + val event = msg.obj as? MessagePad.Event + if (event == null) { + V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "event == null"), true) + return@Callback true + } + val body = runCatching { GsonUtils.fromJson(event.exts, Extras::class.java) }.getOrNull() + val cameraIp = body?.cameraIp + val array = body?.eventExtUnits + var heading = 0.0 + var uuid = "" + if (!array.isNullOrEmpty()) { + for (e in array) { + heading = e.heading ?: 0.0 + uuid = e.uuid ?: "" + } + } + Logger.d(TAG, "cameraIp: $cameraIp, heading:$heading, uuid: $uuid") + val newEventId = "other_retrograde_vehicle_${event.eventId}" + val isUseGps = event.gnssType != 0 + Logger.i(TAG, "isUseGps --> $isUseGps") + val eventLocation = arrayOf(event.longitude, event.latitude) + val carLocation = if (isUseGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + if (DrivingDirectionUtils.getDegreeOfCar2Poi( + carLocation.longitude, + carLocation.latitude, + eventLocation[0], + eventLocation[1], + carLocation.heading.toInt() + ) >= 90) { + V2XBizTrace.onAck(event, "other-retrograde-vehicle" to "事件在车的后面,不触发", true) + return@Callback true + } + AiRoadMarker.aiMakers.getOrPut(newEventId) { + val distance = CoordinateUtils.calculateLineDistance(carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1]) + if (distance > 150) { + Logger.i(TAG, "other_retrograde_vehicle --> distance > 150") + V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "distance > 150"), true) + return@Callback true + } + val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE), START) + } + scope.launch { + delay(5000) + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE), STOP) + } + } + } + // 弹事件框 + val alertContent = String.format(EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType), distance.toInt()) + val alertTts = String.format(EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType), distance.toInt()) + CallerRoadV2NEventWindowListenerManager.showLiveVideo( + newEventId, + event.timestamp, + EventTypeEnumNew.getUpdateIconRes(EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType), + alertContent, + isDriver, + alertTts, + cameraIp.toString(), + eventLocation[0], + eventLocation[1]) + //消息埋点 + V2XEventAnalyticsManager.triggerV2XEvent( + EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, alertContent, alertTts, + DataSourceType.AICLOUD, CommunicationType.V2N + ) + AiRoadMarker() + }.also { + it.marker(Marker(newEventId, EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, eventLocation[0], eventLocation[1], heading, isUseGps = isUseGps), drawMarker = true, false, isHighFrequency = true) + }.receive() + } else if (msg.what == MSG_WHAT_DRAW_GREEN_WAVE) { + val data = msg.obj as? V2nCrossSpeed ?: return@Callback true + val destX = data.lng + val destY = data.lat + val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + if (DrivingDirectionUtils.getDegreeOfCar2Poi( + location.longitude, + location.latitude, + destX, + destY, + location.heading.toInt() + ) >= 90) { + V2XBizTrace.onAck(data, "green-wave-event" to "事件在车的后面,不触发", true) + return@Callback true + } + val id = "${destX}_${destY}" + AiRoadMarker.aiMakers.getOrPut(id) { + AiRoadMarker().apply { + try { + val current = abs(location.gnssSpeed) * 3.6f.toInt() + val min = abs(data.speedStraightMin * 3.6f).toInt() + val max = abs(data.speedStraightMax * 3.6f).toInt() + marker(Marker(id, EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, destX, destY, 0.0, null, null, null), drawMarker = false, false) + var alertTts = "" + var alertContent = "" + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + AppStateManager.currentActivity()?.let { + val speakText = StringBuilder("保持当前车速即可通过路口,好丝滑!") + if (current < min) { + speakText.setLength(0) + speakText.append("蘑菇推荐您提升车速至${min}千米每小时, 当前车速${current}千米每小时") + } + if (current > max) { + speakText.setLength(0) + speakText.append("蘑菇推荐您降低车速至${max}千米每小时, 当前车速${current}千米每小时") + } + val tts = speakText.toString() + alertTts = tts + alertContent = tts + AIAssist.getInstance(it).speakTTSVoice(tts) + } + } + //消息埋点 + V2XEventAnalyticsManager.triggerV2XEvent( + EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, alertContent, alertTts, + DataSourceType.AICLOUD, CommunicationType.V2N + ) + CallerHmiManager.showGreenWave(min, max, computeCrossCountBetween(Triple(location.longitude, location.latitude, location.heading), kotlin.Pair(destX, destY))) + } finally { + receive() + } + } + } + } else if (msg.what == MSG_WHAT_DRAW_PEOPLE_CROSS) { + Logger.i(TAG, "people cross -- 1 --") + val data = msg.obj as? MessagePad.Event ?: return@Callback true + val body = runCatching { GsonUtils.fromJson(data.exts, Extras::class.java) }.getOrNull() + val cameraIp = body?.cameraIp + val array = body?.eventExtUnits + var heading = 0.0 + var uuid = "" + if (!array.isNullOrEmpty()) { + for (e in array) { + heading = e.heading ?: 0.0 + uuid = e.uuid ?: "" + } + } + Logger.d(TAG, "cameraIp: $cameraIp, heading:$heading, uuid: $uuid") + val isUseGps = data.gnssType != 0 + Logger.i(TAG, "isUseGps --> $isUseGps") + val eventLocation = arrayOf(data.longitude, data.latitude) + val carLocation = if (isUseGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val distance = CoordinateUtils.calculateLineDistance(carLocation.longitude, carLocation.latitude, eventLocation[0], eventLocation[1]) + if (DrivingDirectionUtils.getDegreeOfCar2Poi( + carLocation.longitude, + carLocation.latitude, + eventLocation[0], + eventLocation[1], + carLocation.heading.toInt() + ) >= 90) { + V2XBizTrace.onAck(data, "people-cross" to "事件在车的后面,不触发", true) + return@Callback true + } + AiRoadMarker.aiMakers.getOrPut(data.eventId) { + Logger.i(TAG, "people cross -- 2 --") + if (distance > 150) { + Logger.i(TAG, "people cross --> distance > 150") + V2XBizTrace.onAck(TAG, mapOf("people cross" to "distance > 150"), true) + return@Callback true + } + Logger.i(TAG, "people cross -- 3 --") + val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS), START) + } + scope.launch { + delay(5000) + runCatching { + CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS), STOP) + } + } + } + // 弹事件框 + val alertContent = String.format(EventTypeEnumNew.getAlarmContent(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType), distance.toInt()) + val alertTts = String.format(EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType), distance.toInt()) + CallerRoadV2NEventWindowListenerManager.showLiveVideo( + data.eventId, + data.timestamp, + EventTypeEnumNew.getUpdateIconRes(EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType), + alertContent, + isDriver, + alertTts, + cameraIp.toString(), + eventLocation[0], + eventLocation[1]) + //消息埋点 + V2XEventAnalyticsManager.triggerV2XEvent( + EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType, alertContent, alertTts, + DataSourceType.AICLOUD, CommunicationType.V2N + ) + AiRoadMarker() + }.also { + Logger.i(TAG, "people cross -- 4 --") + it.marker(Marker(data.eventId, EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType, eventLocation[0], eventLocation[1], heading, isUseGps = isUseGps), drawMarker = true, false, isHighFrequency = true) + }.receive() } true } - private fun getTtsContent(poiType: String, distance: Double): String { - return when (poiType) { - EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType -> { - "前方${distance.toInt()}米道路施工" - } - EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.poiType -> { - "前方${distance.toInt()}米交通事故" - } - EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.poiType -> { - "前方${distance.toInt()}米交通拥堵" - } - else -> { - throw AssertionError("error!!!") - } - } +// private fun computeDirection(laneId: Int, occupy: List): Int { +// val left = occupy.first() +// return if (laneId <= left.id) { +// 1 +// } else { +// -1 +// } +// } + +// private fun getTtsContent(poiType: String, distance: Double): String { +// return when (poiType) { +// EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType -> { +// "前方${distance.toInt()}米道路施工" +// } +// EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.poiType -> { +// "前方${distance.toInt()}米交通事故" +// } +// EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.poiType -> { +// "前方${distance.toInt()}米交通拥堵" +// } +// else -> { +// throw AssertionError("error!!!") +// } +// } +// } + + private fun computeCrossCountBetween(start: Triple, end: kotlin.Pair): Int { +// val points = V2NUtils.generateIntermediatePoints(kotlin.Pair(start.first, start.second), end, 50.0 * 1e-7) +// V2XBizTrace.onAck(points, "computeCrossCountBetween", true) +// var crossId = MapDataWrapper.getCrossRoad(start.first, start.second, start.third)?.cross_id +// val angle = start.third +// var count = 0 +// for (p in points) { +// val crossRoad = MapDataWrapper.getCrossRoad(p.first, p.second, angle) +// if (crossRoad != null && !TextUtils.isEmpty(crossRoad.cross_id) && !TextUtils.equals(crossId, crossRoad.cross_id)) { +// count++ +// crossId = crossRoad.cross_id +// } +// } + return 1 } - private fun getAlertContent(poiType: String, distance: Double): String { - return when (poiType) { - EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType -> { - "前方${distance.toInt()}米道路施工" - } - EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.poiType -> { - "前方${distance.toInt()}米交通事故" - } - EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.poiType -> { - "前方${distance.toInt()}米交通拥堵" - } - else -> { - throw AssertionError("error!!!") - } - } - } +// private fun getAlertContent(poiType: String, distance: Double): String { +// return when (poiType) { +// EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType -> { +// "前方${distance.toInt()}米道路施工" +// } +// EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.poiType -> { +// "前方${distance.toInt()}米交通事故" +// } +// EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.poiType -> { +// "前方${distance.toInt()}米交通拥堵" +// } +// else -> { +// throw AssertionError("error!!!") +// } +// } +// } private fun isDrawRoadLine(poiType: String): Boolean { - return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType == poiType +// return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType == poiType + return false } private fun getPoiType(type: Int): EventTypeEnumNew = @@ -344,19 +505,21 @@ internal object V2NIdentifyDrawer { override fun onAutopilotIdentifyDataUpdate(trafficData: List?) { super.onAutopilotIdentifyDataUpdate(trafficData) - val shiGong = trafficData?.filter { it.type == 501 || it.type == 502 } + //source: 1 -> 感知数据; 2 -> 融合数据 + val shiGong = trafficData?.filter { itx -> (itx.type == 501 || itx.type == 502) && itx.trackedSourceList.find { it.source != 1 } != null } if (!shiGong.isNullOrEmpty()) { drawShiGong(shiGong) } - val shiGu = trafficData?.filter { it.type == 13 } + val shiGu = trafficData?.filter { itx -> itx.type == 13 && itx.trackedSourceList.find { it.source != 1 } != null } if (!shiGu.isNullOrEmpty()) { drawShiGu(shiGu) } } + override fun onAutopilotV2nCongestionEvent(header: Header, rsi: RSI_PB) { super.onAutopilotV2nCongestionEvent(header, rsi) - V2XBizTrace.onAck("onAutopilotV2nCongestionEvent", rsi) +// V2XBizTrace.onAck("onAutopilotV2nCongestionEvent", rsi) rsi.rsiFrame?.rtes?.rteDataList?.filter { it.eventType == 102 }?.takeIf { @@ -368,16 +531,15 @@ internal object V2NIdentifyDrawer { } private fun drawShiGong(events: List) { - Log.d("V2NIdentifyDrawer", "---drawShiGong --- 1 ---:${events.size}, [${FunctionBuildConfig.v2nMainSwitch}, ${FunctionBuildConfig.isNewV2NData}]") +// V2XBizTrace.onAck(events,"onV2NShiGong", false) if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { - Log.d("V2NIdentifyDrawer", "---drawShiGong --- 2 ---") handler.removeMessages(MSG_WHAT_DRAW_SHIGONE) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_SHIGONE, events)) } } private fun drawShiGu(events: List) { - Log.d("V2NIdentifyDrawer", "---drawShiGu --- 1 ---:${events.size}, [${FunctionBuildConfig.v2nMainSwitch}, ${FunctionBuildConfig.isNewV2NData}]") +// V2XBizTrace.onAck(events,"onV2NShiGu", false) if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { handler.removeMessages(MSG_WHAT_DRAW_SHIGU) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_SHIGU, events)) @@ -385,18 +547,85 @@ internal object V2NIdentifyDrawer { } private fun drawYongDu(events: List) { - Log.d("V2NIdentifyDrawer", "---drawYongDu --- 1 ---:${events.size}, [${FunctionBuildConfig.v2nMainSwitch}, ${FunctionBuildConfig.isNewV2NData}]") +// V2XBizTrace.onAck(events,"onV2NYongDu", false) if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { handler.removeMessages(MSG_WHAT_DRAW_YONGDU) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_YONGDU, events)) } } + private fun drawOtherRetrogradeVehicle(event: MessagePad.Event) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + handler.removeMessages(MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE) + handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_OTHER_RETROGRADE_VEHICLE, event)) + } + } + + private fun drawGreenWave(crossSpeed: V2nCrossSpeed) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + handler.removeMessages(MSG_WHAT_DRAW_GREEN_WAVE) + handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_GREEN_WAVE, crossSpeed)) + } + } + + private fun drawPeopleCross(event: MessagePad.Event) { + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + handler.removeMessages(MSG_WHAT_DRAW_PEOPLE_CROSS) + handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_PEOPLE_CROSS, event)) + } + } + + private val nioEventListener = object : IMoGoV2nNioEventListener { + override fun onV2nNioCongestionEvent(congestion: MessagePad.V2nCongestion) { + super.onV2nNioCongestionEvent(congestion) + V2XBizTrace.onAck(congestion, "onV2nNioCongestionEvent", true) + } + + override fun onV2nNioCrossoverEvent(event: MessagePad.Event) { + super.onV2nNioCrossoverEvent(event) + V2XBizTrace.onAck(event,"onV2nNioCrossoverEvent", true) + drawPeopleCross(event) + } + + override fun onV2nNioGreenWavePassageEvent(crossSpeed: V2nCrossSpeed) { + super.onV2nNioGreenWavePassageEvent(crossSpeed) + V2XBizTrace.onAck(crossSpeed, "onV2nNioGreenWavePassageEvent", true) + drawGreenWave(crossSpeed) + } + + override fun onV2nNioOtherRetrogradeEvent(event: MessagePad.Event) { + super.onV2nNioOtherRetrogradeEvent(event) + CallerLogger.i(TAG, "onV2nNioOtherRetrogradeEvent --> ${event}") + V2XBizTrace.onAck(event, "onV2nNioOtherRetrogradeEvent", true) + drawOtherRetrogradeVehicle(event) + } + } + fun init() { CallerAutopilotIdentifyListenerManager.addListener(TAG, listener) + CallerV2nNioEventListenerManager.addListener(TAG, nioEventListener) + EventDismissManager.addDismissListener(TAG, this) } fun unInit() { CallerAutopilotIdentifyListenerManager.removeListener(TAG) + CallerV2nNioEventListenerManager.removeListener(TAG) + EventDismissManager.removeDismissListener(TAG) + } + + override fun onEventDismissByDistance(event: EventDismissBean) { + Logger.i(TAG, "onEventDismissByDistance --> ${event.toString()}") +// if (event.eventId.startsWith("other_retrograde_vehicle")) { +// V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "onEventDismissByDistance"), true) +// val targetIds = event.exts.split(",") +// } + } + + override fun onEventDismissByExpired(event: EventDismissBean) { + Logger.i(TAG, "onEventDismissByExpired --> ${event.toString()}") +// if (event.eventId.startsWith("other_retrograde_vehicle")) { +// V2XBizTrace.onAck(TAG, mapOf("other_retrograde_vehicle" to "onEventDismissByExpired"), true) +// val targetIds = event.exts.split(",") +// } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/beans/Extras.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/beans/Extras.kt new file mode 100644 index 0000000000..a97cbff741 --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/beans/Extras.kt @@ -0,0 +1,17 @@ +package com.mogo.eagle.function.biz.v2x.v2n.pnc.beans + +import androidx.annotation.Keep + + +@Keep +data class Extras ( + val cameraIp: String? = null, + val eventExtUnits: List? = null +) + + +@Keep +data class EventExtUnit( + val heading: Double? = null, + val uuid: String? = null +) \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/remove/MarkerRemoveManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/remove/MarkerRemoveManager.kt index e1dca1a41e..4991af4547 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/remove/MarkerRemoveManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/remove/MarkerRemoveManager.kt @@ -14,11 +14,12 @@ import com.mogo.map.overlay.point.* import kotlinx.coroutines.Runnable import java.util.* import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference -data class MarkerWrapper(val id: String, val lon: Double, val lat: Double, val coordinateType: Int, var markers: ArrayList? = null, var lines: ArrayList? = null, var onRemoved:((id: String) -> Unit)? = null) { +data class MarkerWrapper(val id: String, var lon: Double, var lat: Double, val coordinateType: Int, var markers: ArrayList? = null, var lines: ArrayList? = null, var elapsedDistance: Int = 500, var elapsedDuration: Long = -1, var onRemoved:((id: String) -> Unit)? = null) { fun addLine(line: Polyline) { var ll = this.lines @@ -41,12 +42,8 @@ data class MarkerWrapper(val id: String, val lon: Double, val lat: Double, val c override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false - other as MarkerWrapper - - if (id != other.id) return false - - return true + return id == other.id } override fun hashCode(): Int { @@ -108,35 +105,10 @@ object MarkerRemoveManager { elapsed += delta } Log.d(TAG, "--- checkTask --- 5 ---:delta:$delta, elapsed:${elapsed}, id: ${marker.id}") - if (elapsed >= 500) { - var removeMarkerError = false - marker.markers?.forEach { - try { - Log.e(TAG, "--- checkTask --- remove marker: $it, id: ${marker.id}") - CallerMapUIServiceManager.getOverlayManager()?.removePoint(it.id) - } catch (t: Throwable) { - t.printStackTrace() - removeMarkerError = true - Log.e(TAG, "--- checkTask --- remove marker error:${t.message}, id: ${marker.id}") - } - } - var removeLineError = false - marker.lines?.forEach { - try { - CallerMapUIServiceManager.getOverlayManager()?.removeLine(it) - Log.e(TAG, "--- checkTask --- remove line : $it, id:${marker.id}") - } catch (t: Throwable) { - t.printStackTrace() - removeLineError = true - Log.e(TAG, "--- checkTask --- remove line error:${t.message}, id: ${marker.id}") - } - } - if (!removeLineError && !removeMarkerError) { + if (elapsed >= marker.elapsedDistance) { + val result = removeMarker(marker) + if (result) { toRemove.remove() - synchronized(elapsedDistances) { - elapsedDistances.remove(marker) - marker.onRemoved?.invoke(marker.id) - } } } else { elapsedDistances[marker] = elapsed @@ -162,6 +134,22 @@ object MarkerRemoveManager { iterator.remove() synchronized(toRemoveMakers) { toRemoveMakers.offer(marker) + val elapsedDuration = marker.elapsedDuration + if (elapsedDuration > 0) { + handler.postDelayed(Runnable { + try { + while (true) { + if (removeMarker(marker)) { + toRemoveMakers.remove(marker) + break + } + Thread.sleep(TimeUnit.SECONDS.toMillis(2)) + } + } catch (t: Throwable) { + t.printStackTrace() + } + }, elapsedDuration) + } } } } @@ -178,6 +166,39 @@ object MarkerRemoveManager { } } + private fun removeMarker(marker: MarkerWrapper): Boolean { + var removeMarkerError = false + marker.markers?.forEach { + try { + Log.e(TAG, "--- checkTask --- remove marker: $it, id: ${marker.id}") + CallerMapUIServiceManager.getOverlayManager()?.removePoint(it.id) + } catch (t: Throwable) { + t.printStackTrace() + removeMarkerError = true + Log.e(TAG, "--- checkTask --- remove marker error:${t.message}, id: ${marker.id}") + } + } + var removeLineError = false + marker.lines?.forEach { + try { + CallerMapUIServiceManager.getOverlayManager()?.removeLine(it) + Log.e(TAG, "--- checkTask --- remove line : $it, id:${marker.id}") + } catch (t: Throwable) { + t.printStackTrace() + removeLineError = true + Log.e(TAG, "--- checkTask --- remove line error:${t.message}, id: ${marker.id}") + } + } + if (!removeLineError && !removeMarkerError) { + synchronized(elapsedDistances) { + elapsedDistances.remove(marker) + marker.onRemoved?.invoke(marker.id) + } + return true + } + return false + } + private val handler by lazy { val thread = HandlerThread("check_marker_expired") thread.start() @@ -194,4 +215,12 @@ object MarkerRemoveManager { handler.postDelayed(checkTask, 1000) } } + + fun peekMarker(id: String): MarkerWrapper? { + return showedMarkers.find { it.id == id } + } + + fun removeMarker(id: String): Boolean { + return peekMarker(id)?.let { removeMarker(it) } ?: false + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt index 76679558ab..58430910aa 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt @@ -5,27 +5,34 @@ import android.graphics.Color import android.os.Handler import android.os.HandlerThread import android.os.Looper -import android.util.Log import android.view.animation.DecelerateInterpolator import androidx.core.util.Pair +import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils import com.mogo.eagle.function.biz.v2x.V2XBizTrace -import com.mogo.eagle.function.biz.v2x.v2n.V2XEventManager import com.mogo.eagle.function.biz.v2x.v2n.consts.V2XConst import com.mogo.eagle.function.biz.v2x.v2n.remove.MarkerRemoveManager import com.mogo.eagle.function.biz.v2x.v2n.remove.MarkerWrapper import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.road.V2XAiRoadEventMarker import com.mogo.map.MogoData.Companion.mogoMapData +import com.mogo.map.overlay.core.Level +import com.mogo.map.overlay.core.Level.MAP_MARKER import com.mogo.map.overlay.core.Level.ROAD_CENTER_LINE import com.mogo.map.overlay.line.Polyline +import com.mogo.map.overlay.point.Point import com.zhidaoauto.map.data.road.CenterLine import java.util.* import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArraySet +import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference @@ -41,10 +48,19 @@ class AiRoadMarker { private const val TAG = "AiRoadMarker" private val COLOR_START = Color.parseColor("#002ABAD9") private val COLOR_END = Color.parseColor("#66FF7A30") + private val builders by lazy { ConcurrentHashMap() } + + private val markerIds by lazy { CopyOnWriteArraySet() } + + internal fun getOrPutPointOptionBuilder(id: String, owner: String, level: Level): Point.Options.Builder { + return builders.getOrPut(id) { Point.Options.Builder(owner, level) } + } } private val marker by lazy { AtomicReference() } + + private val overlayManager by lazy { CallerMapUIServiceManager.getOverlayManager() } @@ -83,50 +99,110 @@ class AiRoadMarker { .setWidth(50f).setUseGps(true) } - fun marker(marker: Marker, drawMarker: Boolean, drawRoadLine: Boolean = false) { - v2nDrawHandler.post { - val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() - this.marker.set(marker) - val wrapper = MarkerWrapper(marker.id, marker.poi_lon, marker.poi_lat, 1, null, null) - if (drawMarker) { - marker.entity?.apply { roadMarker.drawMarkers(this, wrapper) } + fun marker(marker: Marker, drawMarker: Boolean, drawRoadLine: Boolean = false, isHighFrequency:Boolean = false) { + val markerId = marker.id + if (isHighFrequency && drawMarker) { + Logger.d(TAG, "marker --->poiType: $marker, ${EventTypeEnumNew.getMarker3DRes(marker.poiType)}") + val builder = getOrPutPointOptionBuilder(markerId, V2XConst.V2X_MARKER_OWNER, MAP_MARKER) + builder + .set3DMode(true) + .isUseGps(marker.isUseGps) + .icon3DRes(EventTypeEnumNew.getMarker3DRes(marker.poiType)) + .controlAngle(true) + .anchor(0.5f, 0.5f) + .rotate(marker.poi_angle.toFloat()) + .longitude(marker.poi_lon) + .latitude(marker.poi_lat) + if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType || marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType) { + builder.anchorColor("#D65D5AFF") } - if (drawRoadLine) { - //施工中心点前方的自车行驶方向上300米距离 - var l1: CenterLine? = null - var l2: CenterLine? = null - mogoMapData.get()?.getCenterLineRangeInfo( - marker.poi_lon, - marker.poi_lat, - location.heading.toFloat(), - 300f, call = { result -> - //施工中心点后方的自车行驶方向上300米距离 - result?.let { - V2XBizTrace.onAck("$TAG -marker-3-l1:", it) - l1 = result + CallerMapUIServiceManager.getOverlayManager()?.showOrUpdatePoint(builder.build())?.let { p -> + if (!markerIds.contains(markerId)) { + markerIds.add(markerId) + this.marker.set(marker) + val wrapper = MarkerWrapper(markerId, marker.poi_lon, marker.poi_lat, if (marker.isUseGps) 1 else 0, elapsedDistance = 10) + wrapper.onRemoved = { + builders.remove(markerId) + markerIds.remove(p.id) + if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) { + CallerHmiManager.dismissGreenWave() + } else { + CallerRoadV2NEventWindowListenerManager.dismiss(marker.id) } - countDown.incrementAndGet() - realMark(marker, wrapper, l1, l2, location.heading) - }) - mogoMapData.get()?.getCenterLineRangeInfo( - marker.poi_lon, - marker.poi_lat, - location.heading.toFloat(), - -200f, call = { result -> - result?.let { - V2XBizTrace.onAck("$TAG -marker-3-l2:", it) - l2 = result - } - countDown.incrementAndGet() - realMark(marker, wrapper, l1, l2, location.heading) - }) - } else { + } + wrapper.addPoint(p) + MarkerRemoveManager.addMarker(wrapper) + } else { + MarkerRemoveManager.peekMarker(markerId)?.also { + it.lon = marker.poi_lon + it.lat = marker.poi_lat + } + } + } + } else { + v2nDrawHandler.post { + val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + this.marker.set(marker) + var elapsedDistance = 500 + if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) { + elapsedDistance = 10 + } + var elapsedDuration = -1L + if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) { + elapsedDuration = TimeUnit.SECONDS.toMillis(3) + } + val wrapper = MarkerWrapper(markerId, marker.poi_lon, marker.poi_lat, if (marker.isUseGps) 1 else 0, elapsedDistance = elapsedDistance, elapsedDuration = elapsedDuration) + if (drawMarker) { + marker.entity?.apply { roadMarker.drawMarkers(this, wrapper) } + } + if (drawRoadLine) { + //施工中心点前方的自车行驶方向上300米距离 + var l1: CenterLine? = null + var l2: CenterLine? = null + mogoMapData.get()?.getCenterLineRangeInfo( + marker.poi_lon, + marker.poi_lat, + location.heading.toFloat(), + 300f, call = { result -> + //施工中心点后方的自车行驶方向上300米距离 + result?.let { + V2XBizTrace.onAck("$TAG -marker-3-l1:", it) + l1 = result + } + countDown.incrementAndGet() + realMark(marker, wrapper, l1, l2, location.heading) + }) + mogoMapData.get()?.getCenterLineRangeInfo( + marker.poi_lon, + marker.poi_lat, + location.heading.toFloat(), + -200f, call = { result -> + result?.let { + V2XBizTrace.onAck("$TAG -marker-3-l2:", it) + l2 = result + } + countDown.incrementAndGet() + realMark(marker, wrapper, l1, l2, location.heading) + }) + } + +// if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) { +// val builder = Polyline.Options.Builder(V2XConst.V2X_MARKER_OWNER, ROAD_CENTER_LINE) +// builder.colors(listOf(Color.parseColor("#996DFED0"), Color.parseColor("#CC6DFED0"), Color.parseColor("#C76DFED0"), Color.parseColor("#006DFED0"))) +// .setWidth(50f) +// .setUseGps(true) +// .points(listOf(MogoLatLng(location.latitude, location.longitude), MogoLatLng(marker.poi_lat, marker.poi_lon))) +// .setIsGradient(true) +// .isShowArrow(true) +// CallerMapUIServiceManager.getOverlayManager()?.showOrUpdateLine(builder.build())?.also { wrapper.addLine(it) } +// } wrapper.onRemoved = { id -> aiMakers.remove(id) } MarkerRemoveManager.addMarker(wrapper) } } + } @Synchronized @@ -152,22 +228,7 @@ class AiRoadMarker { V2XBizTrace.onAck("$TAG -marker-4-l2:", l2) val points = LinkedList() if (l2.points.isNotEmpty()) { - points.addAll(l2.points.reversed()/*.filter { - val location = V2XEventManager.getFirstLocationInCross() - Log.d(TAG, "l2: location -> $location") - if (location != null) { - val carLocation = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() - if (DrivingDirectionUtils.getDegreeOfCar2Poi2(carLocation.longitude, carLocation.latitude, location.longitude, location.latitude, carLocation.heading) > 90) { - //处理同一个路口不同车道调头,这种极端情况 - true - } else { - val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(location.longitude, location.latitude, it.longitude, it.latitude, location.heading) - angle <= 90 - } - } else { - true - } - }.*/.map { + points.addAll(l2.points.reversed().map { MogoLatLng(it.latitude, it.longitude) }) } @@ -232,7 +293,10 @@ class AiRoadMarker { wrapper.addLine(line) } wrapper.onRemoved = { id -> - aiMakers.remove(id) + aiMakers.remove(id)?.also { + val m = it.marker.get() + CallerRoadV2NEventWindowListenerManager.dismiss(m.id) + } } MarkerRemoveManager.addMarker(wrapper) countDown.set(0) @@ -257,6 +321,12 @@ class AiRoadMarker { roadMarker.removeMarkers() handler.removeCallbacks(checkExpiredTask) aiMakers.remove(marker.id) + if (marker.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType) { + CallerHmiManager.dismissGreenWave() + } else { + MarkerRemoveManager.removeMarker(marker.id) + CallerRoadV2NEventWindowListenerManager.dismiss(marker.id) + } } } @@ -294,12 +364,13 @@ class AiRoadMarker { data class Marker( val id: String, val poiType: String, - val poi_lat: Double, val poi_lon: Double, + val poi_lat: Double, val poi_angle: Double, val polygon: List>? = null, var farthestPoint: Pair? = null, - var entity: V2XRoadEventEntity? = null + var entity: V2XRoadEventEntity? = null, + var isUseGps: Boolean = false ) { override fun equals(other: Any?): Boolean { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XAiRoadEventMarker.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XAiRoadEventMarker.kt index 2e046f3b22..9263f5adce 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XAiRoadEventMarker.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XAiRoadEventMarker.kt @@ -6,9 +6,11 @@ import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.enums.EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity +import com.mogo.eagle.core.function.biz.R import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isTaxiPassenger +import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.function.biz.v2x.v2n.consts.V2XConst import com.mogo.eagle.function.biz.v2x.v2n.remove.MarkerWrapper import com.mogo.map.overlay.core.Level @@ -33,10 +35,34 @@ class V2XAiRoadEventMarker { .build())?.also { wrapper.addPoint(it) } if (polygon != null && polygon.isNotEmpty() && entity.poiType != EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.poiType) { val builder = Polyline.Options.Builder(V2XConst.V2X_MARKER_OWNER, Level.MAP_POLYGON) - val colors = ArrayList() - colors.add(Color.argb(204, 237, 172, 21)) - colors.add(Color.argb(0, 255, 255, 255)) - builder.colors(colors) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + val colors = ArrayList() + colors.add(Color.argb(204, 237, 172, 21)) + colors.add(Color.argb(0, 255, 255, 255)) + builder.colors(colors) + } else { + val colors = ArrayList() + colors.add(Color.parseColor("#99FF8F2A")) + colors.add(Color.argb(0, 255, 255, 255)) + builder.colors(colors) + } + val dispersedPoints = getDispersedPoints(polygon.map { Pair(it.first, it.second) }, 3) + if (entity.poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType && dispersedPoints.isNotEmpty()) { + for (p in dispersedPoints) { + Point.Options.Builder(V2XConst.V2X_MARKER_OWNER, Level.MAP_MARKER) + .longitude(p.first) + .latitude(p.second) + .set3DMode(true) + .isUseGps(true) + .icon3DRes(R.raw.taxi_sanjiaozui) + .scale(1.0f) + .build().let { + CallerMapUIServiceManager.getOverlayManager()?.showOrUpdatePoint(it) + }?.also { + wrapper.addPoint(it) + } + } + } val points = ArrayList() for (p in polygon) { points.add(MogoLatLng(p.second, p.first)) @@ -44,11 +70,12 @@ class V2XAiRoadEventMarker { if (points.size > 2) { points.add(points[0]) } +// builder.color(if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) Color.parseColor("#FF852E") else Color.parseColor("#5AA7FD")) builder.points(points) - builder.setIsGradient(true) builder.useFacade(true) builder.setUseGps(true) builder.setWidth(5f) + builder.setIsGradient(true) builder.setMaxIndex(800000f) builder.setVisible(true) val line = CallerMapUIServiceManager.getOverlayManager()?.showOrUpdateLine(builder.build()) @@ -59,6 +86,37 @@ class V2XAiRoadEventMarker { } } + private fun getDispersedPoints(polygon: List>, expect: Int): List> { + val total = polygon.size + if (expect >= total) { + return polygon + } + // 初始选择第一个点 + val select = ArrayList>() + select.add(polygon[0]) + for(i in 1 until expect) { + var maxDistance = Double.MIN_VALUE + var best: Pair? = null + for (point in polygon) { + var minDistance = Double.MAX_VALUE + for (j in 0 until i) { + val distance = CoordinateUtils.calculateLineDistance(select[j].first, select[j].second, point.first, point.second) + if (distance < minDistance) { + minDistance = distance.toDouble() + } + } + if (minDistance > maxDistance) { + maxDistance = minDistance + best = point + } + } + if (best != null) { + select.add(best) + } + } + return select + } + fun removeMarkers() { val prev = current.get() if (prev != null) { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java index cc7636b7c1..b6de8c06b4 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java @@ -47,9 +47,9 @@ public class V2XRoadEventMarker implements IV2XMarker { List> polygons = noveltyInfo.getPolygon(); if (gpsLocation != null && polygons != null) { MarkerLocation location = noveltyInfo.getLocation(); - AiRoadMarker.Marker m = new AiRoadMarker.Marker(noveltyInfo.getInfoId(), noveltyInfo.getPoiType(), gpsLocation.second, gpsLocation.first, location.getAngle(), polygons, null, entity); + AiRoadMarker.Marker m = new AiRoadMarker.Marker(noveltyInfo.getInfoId(), noveltyInfo.getPoiType(), gpsLocation.second, gpsLocation.first, location.getAngle(), polygons, null, entity, false); AiRoadMarker aiMarker = new AiRoadMarker(); - aiMarker.marker(m, true, isDrawRoadLine(m.getPoiType())); + aiMarker.marker(m, true, isDrawRoadLine(m.getPoiType()), false); AiRoadMarker.aiMakers.put(noveltyInfo.getInfoId(), aiMarker); } } else { @@ -69,7 +69,7 @@ public class V2XRoadEventMarker implements IV2XMarker { ArrayList markers = new ArrayList<>(); markers.add(point); String id = entity.getLocation().getLon() + "_" + entity.getLocation().getLat(); - MarkerRemoveManager.INSTANCE.addMarker(new MarkerWrapper(id, entity.getLocation().getLon(), entity.getLocation().getLat(), 0, markers, null, null)); + MarkerRemoveManager.INSTANCE.addMarker(new MarkerWrapper(id, entity.getLocation().getLon(), entity.getLocation().getLat(), 0, markers, null, 500, -1L, null)); } else { CallerLogger.d(M_V2X + "RWJ", "V2XRoadEventMarker:" + entity.getPoiType() + "--- return empty marker"); } @@ -89,6 +89,7 @@ public class V2XRoadEventMarker implements IV2XMarker { } private boolean isDrawRoadLine(String poiType) { - return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType().equals(poiType); +// return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType().equals(poiType); + return false; } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java index e5470cf1e5..72b15cf6f7 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java @@ -1,8 +1,5 @@ package com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.road; -import android.telecom.Call; - -import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.enums.CommunicationType; import com.mogo.eagle.core.data.enums.DataSourceType; import com.mogo.eagle.core.data.enums.EventTypeEnumNew; @@ -171,7 +168,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp if (isNeedChangeAngle()) { MarkerLocation location = content.getLocation(); if (location != null) { - CallerVisualAngleManager.INSTANCE.changeAngle(new RoadEvent(content.getLocation().getLon(), content.getLocation().getLat(), content.getLocation().getAngle(), false)); + CallerVisualAngleManager.INSTANCE.changeScene(new RoadEvent(2, TimeUnit.SECONDS)); } } if (entity.isNeedAddLine() && !EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType().equals(content.getPoiType())) { @@ -202,7 +199,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp } catch (Throwable ignore) {} } } - CallerVisualAngleManager.INSTANCE.changeAngle(new Default(3, TimeUnit.SECONDS)); + CallerVisualAngleManager.INSTANCE.changeScene(new Default(3, TimeUnit.SECONDS, false)); } release(); } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/EventDismissManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/EventDismissManager.kt new file mode 100644 index 0000000000..3e70a229cd --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/EventDismissManager.kt @@ -0,0 +1,145 @@ +package com.mogo.eagle.function.biz.v2x.v2n.utils + +import android.os.Handler +import android.os.HandlerThread +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicBoolean + +object EventDismissManager { + + private val TAG = "EventDismissManager" + + private val M_LISTENERS: ConcurrentHashMap = ConcurrentHashMap() + private val observableEventList = ConcurrentHashMap() + private val isStart = AtomicBoolean(false) + + private val handler by lazy { + val thread = HandlerThread("road_v2n_event_dismiss_manager") + thread.start() + Handler(thread.looper) + } + + private val checkRunnable = object : Runnable { + override fun run() { + Logger.d( + TAG, + "checkRunnable --> run" + ) + isStart.set(true) + synchronized(observableEventList) { + if (observableEventList.isNotEmpty()) { + val carLocation = + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + observableEventList.forEach { eventList -> + val tag = eventList.key.split("_")[0] + val event = eventList.value + val distance = CoordinateUtils.calculateLineDistance( + carLocation.longitude, + carLocation.latitude, + event.lon, + event.lat + ) + val isExpired = + event.lastExpiredTime != -1L && System.currentTimeMillis() >= event.lastExpiredTime + if (distance >= event.dismissDistance) { + M_LISTENERS.forEach { + if (tag == it.key) { + it.value.onEventDismissByDistance(event) + } + } + observableEventList.remove(eventList.key) + Logger.d( + TAG, + "removeEvent --> byDistance, event=${event.toString()}" + ) + } else if (isExpired) { + M_LISTENERS.forEach { + if (tag == it.key) { + it.value.onEventDismissByExpired(event) + } + } + observableEventList.remove(eventList.key) + Logger.d( + TAG, + "removeEvent --> byExpired, event=${event.toString()}" + ) + } + } + } + if (observableEventList.isNotEmpty()) { + handler.postDelayed(this, 1000L) + isStart.set(true) + Logger.d( + TAG, + "checkRunnable --> end, schedule delay" + ) + } else { + isStart.set(false) + Logger.d( + TAG, + "checkRunnable --> end, not schedule delay" + ) + } + } + } + } + + + fun addDismissListener( + tag: String, listener: IEventDismissListener + ) { + if (M_LISTENERS.containsKey(tag)) { + return + } + M_LISTENERS[tag] = listener + } + + fun removeDismissListener(tag: String) { + if (!M_LISTENERS.containsKey(tag)) { + return + } + M_LISTENERS.remove(tag) + } + + fun addEvent(tag: String, event: EventDismissBean) { + Logger.d( + TAG, + "addEvent --> ${event.toString()}" + ) + val key = "${tag}_${event.eventId}" + if (observableEventList.containsKey(key)) { + observableEventList[key]?.lastExpiredTime = + System.currentTimeMillis() + event.expiredSeconds * 1000L + } else { + observableEventList[key] = event + observableEventList[key]?.lastExpiredTime = + System.currentTimeMillis() + event.expiredSeconds * 1000L + } + if (!isStart.get()) { + handler.removeCallbacks(checkRunnable) + handler.post(checkRunnable) + Logger.d( + TAG, + "addEvent --> postRunnable" + ) + } + } +} + +interface IEventDismissListener { + fun onEventDismissByDistance(event: EventDismissBean) + fun onEventDismissByExpired(event: EventDismissBean) +} + +data class EventDismissBean( + val eventId: String, //事件唯一 ID + val lon: Double, //事件经度 + val lat: Double, //事件维度 + val dismissDistance: Int, // 消散围栏距离 + val expiredSeconds: Int, // 事件最长展示事件(秒) + var lastExpiredTime: Long = -1L, // 最后一次增加事件的时间戳(用来计算超时) + var exts: String = "" // 各类型事件附件的信息,以便回调后判断使用 +) \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/V2NUtils.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/V2NUtils.kt new file mode 100644 index 0000000000..78e7d903bf --- /dev/null +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/V2NUtils.kt @@ -0,0 +1,110 @@ +package com.mogo.eagle.function.biz.v2x.v2n.utils + +import android.util.Log +import androidx.annotation.WorkerThread +import com.mogo.map.MapDataWrapper +import com.mogo.map.entities.Lane +import com.zhidaoauto.map.data.road.CenterLine +import org.locationtech.jts.geom.Coordinate +import org.locationtech.jts.geom.GeometryFactory +import org.locationtech.jts.geom.LineString.MINIMUM_VALID_SIZE +import org.locationtech.jts.geom.Polygon +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit.SECONDS +import kotlin.math.abs + + +object V2NUtils { + + private const val TAG = "V2NUtils" + + @WorkerThread + fun computeOccupyLanesInfo(car: Triple, point: Triple ,polygon: List>): Decision? { + val roadInfo = MapDataWrapper.getRoadInfo(point.first, point.second, point.third) + Log.d(TAG, "road_info:$roadInfo") + val lanes = MapDataWrapper.getLaneInfo(roadInfo.tileId, roadInfo.roadId).sortedBy { it.id } + Log.d(TAG, "lanes: ${lanes.joinToString(",") { itx -> itx.points.joinToString(",") { "${it.first}, ${it.second}" } } }") + if (lanes.isEmpty()) { + return null + } + val occupy = ArrayList() + val factory = GeometryFactory() + val polygonList = ArrayList(polygon.map { Coordinate(it.first, it.second) }) + var p1: Polygon? = null + while (p1 == null) { + if (polygonList.size < MINIMUM_VALID_SIZE) { + polygonList.add(polygonList[0]) + continue + } + try { + p1 = factory.createPolygon(polygonList.toTypedArray()) + } catch (ignore: IllegalArgumentException) { + polygonList.add(polygonList[0]) + } + } + for (lane in lanes) { + val p2 = factory.createLineString(lane.points.map { Coordinate(it.first, it.second) }.toTypedArray()).buffer((lane.width.toDouble() * 0.7 * (1e-5)) / 2.0) + if (p1.intersects(p2)) { + occupy += lane + } + } + val latch = CountDownLatch(1) + var centerLine: CenterLine? = null + MapDataWrapper.getCenterLineInfo(car.first, car.second, car.third) { + centerLine = it + latch.countDown() + } + return try { + if (latch.await(3, SECONDS)) { + Decision(centerLine?.lane_id?.toInt() , lanes, occupy) + } else { + Decision(null, lanes, occupy) + } + } catch (t: Throwable) { + t.printStackTrace() + return Decision(null, lanes, occupy) + } + } + + data class Decision(val laneId: Int? = null,val total: List, val occupy: List) + + fun computeBestLane(laneId: Int, occupy: List, total: List): Pair { + if (occupy.size == total.size) { + return Pair(Int.MIN_VALUE, "更换路线") + } + val map = HashMap() + if (total.size % 2 == 0) { + val half = total.size / 2 + for (i in 0 until half) { + val left = total[i] + val right = total[half + i] + map[left.id] = "驶入左${i + 1}车道" + map[right.id] = "驶入右${i + 1}车道" + } + } else { + val middle = total.size / 2 + map[total[middle].id] = "驶入中间车道" + for (i in 0 until middle) { + val left = total[i] + val right = total[middle + i + 1] + map[left.id] = "驶入左${i + 1}车道" + map[right.id] = "驶入右${i + 1}车道" + } + } + val ids = occupy.map { it.id } + val freeLanes = total.filter { itx -> !ids.contains(itx.id) } + if (freeLanes.isNotEmpty()) { + var best = Int.MIN_VALUE + var delta = Int.MAX_VALUE + for (lane in freeLanes) { + val abs = abs(lane.id - laneId) + if (abs < delta && lane.id != laneId) { + best = lane.id + delta = abs + } + } + return Pair(best, map[best] ?: "更换路线") + } + return Pair(Int.MIN_VALUE, "更换路线") + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt index c6d9ffe435..ad29d5664c 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/DataCenterProvider.kt @@ -6,6 +6,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.datacenter.IDataCenterProvider import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.datacenter.location.MoGoLocationDispatcher +import com.mogo.eagle.core.function.datacenter.v2x.RoadLineEventManager import com.mogo.eagle.core.function.datacenter.v2x.SpeedLimitDispatcher import com.mogo.eagle.core.function.datacenter.v2x.TrafficLightDispatcher @@ -24,6 +25,7 @@ class DataCenterProvider: IDataCenterProvider { CallerMsgBoxManager.queryAllMessages(it) TrafficLightDispatcher.INSTANCE.initServer(it) SpeedLimitDispatcher.INSTANCE.initLimit(it) + RoadLineEventManager.INSTANCE.init() } } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 9849c55113..20d84040a4 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -380,6 +380,11 @@ class MoGoAutopilotControlProvider : startAutoPilot(controlParameters, Constants.AUTOPILOT_SOURCE.MO_FANG) } } + + /** + * 无参数启动自动驾驶,现在的调用方有:魔方 + * @param source 数据来源 + */ private fun startAutoPilotWithNoParameter(source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() @@ -396,6 +401,7 @@ class MoGoAutopilotControlProvider : } } } + private fun startAutoPilot(controlParameters: AutopilotControlParameters, source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() @@ -440,12 +446,15 @@ class MoGoAutopilotControlProvider : ) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { - AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine()) + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, routeInfo: MessagePad.RouteInfo?) { + AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(),routeInfo) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) { - AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(), downloadType) + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, routeInfo: MessagePad.RouteInfo?) { + AdasManager.getInstance().sendTrajectoryDownloadReq( + autoPilotLine.toAutoPilotLine(), + downloadType, + routeInfo) } override fun cancelAutoPilot() { 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 c165e1244d..3159c87f95 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 @@ -74,14 +74,16 @@ import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop import com.zhjt.service.chain.ChainLog import fault_management.FmInfo +import fsm.Fsm2024 import function_state_management.FunctionStates +import localization.LocState import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject import mogo.v2x.MogoV2X import mogo.v2x.RoadOverviewEvents import mogo.yycp.paralleldriving.protocol.ParallelTaskProcessNoticeOuterClass import mogo_msg.MogoReportMsg -import perception.TrafficLightOuterClass +import perception.FusionTrafficLightOuterClass import planning.RoboSweeperTaskIndexOuterClass import prediction.Prediction import record_cache.RecordPanelOuterClass @@ -140,11 +142,7 @@ class MoGoAdasListenerImpl : OnAdasListener { if (gnssInfo != null) { if (1 == FunctionBuildConfig.gpsProvider) { // 同步更新经纬度和系统时间至 AutoPilotStatusListener - CallerAutoPilotStatusListenerManager.updateAutoPilotLocAndTime( - gnssInfo.satelliteTime, - gnssInfo.longitude, - gnssInfo.latitude - ) + CallerAutoPilotStatusListenerManager.updateAutoPilotLocAndTime(gnssInfo.satelliteTime, gnssInfo.longitude, gnssInfo.latitude, gnssInfo.heading) } } } @@ -328,10 +326,10 @@ class MoGoAdasListenerImpl : OnAdasListener { } } - //感知红绿灯 + //融合感知红绿灯 override fun onPerceptionTrafficLight( header: MessagePad.Header?, - trafficLights: TrafficLightOuterClass.TrafficLights? + trafficLights: FusionTrafficLightOuterClass.FusionTrafficLights? ) { if (trafficLights != null) { CallerAutopilotIdentifyListenerManager.invokeAutopilotPerceptionTrafficLight( @@ -491,6 +489,29 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerFaultManagementStateListenerManager.invokeFaultManagementState(fmInfo) } + + /** + * FSM状态 + * 目前在启动自驾前置条件检测440版本中使用 + * @param header 头 + * @param fsmState 数据 + */ + override fun onFSM2024State(header: MessagePad.Header, fsmState: Fsm2024.FSMStateMsg) { + CallerFsm2024ListenerManager.invokeFSM2024State(fsmState) + } + + /** + * 定位状态 + * 定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持 + * 详细解释:http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=131757484 + * + * @param header 头 + * @param locState 数据 + */ + override fun onLocalizationState(header: MessagePad.Header?, locState: LocState.loc_state) { + CallerLocalizationStateListenerManager.invokeLocalizationState(locState) + } + /** * 数据采集配置应答 */ @@ -938,10 +959,72 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerRoboBusJinlvM1StitchedVideoListenerManager.invokeRoboBusJinlvM1StitchedVideo(data) } + /** + * 绿波通行(单路口)事件推送, 透传 + * + * @param header 头 + * @param crossSpeed 数据 + */ + override fun onV2nNioGreenWavePassageEvent( + header: MessagePad.Header, + crossSpeed: MessagePad.V2nCrossSpeed + ) { + CallerV2nNioEventListenerManager.invokeV2nNioGreenWavePassageEvent(crossSpeed) + } + + /** + * 行人横穿(路侧)事件推送, 透传 + * + * @param header 头 + * @param event 数据 + */ + override fun onV2nNioCrossoverEvent(header: MessagePad.Header, event: MessagePad.Event) { + CallerV2nNioEventListenerManager.invokeV2nNioCrossoverEvent(event) + } + + /** + * 他车逆行(路侧)事件推送, 透传 + * + * @param header 头 + * @param event 数据 + */ + override fun onV2nNioOtherRetrogradeEvent(header: MessagePad.Header, event: MessagePad.Event) { + CallerV2nNioEventListenerManager.invokeV2nNioOtherRetrogradeEvent(event) + } + + /** + * 拥堵事件推送, 透传 + * + * @param header 头 + * @param congestion 数据 + */ + override fun onV2nNioCongestionEvent( + header: MessagePad.Header, + congestion: MessagePad.V2nCongestion + ) { + CallerV2nNioEventListenerManager.invokeV2nNioCongestionEvent(congestion) + } + + /** + * 域控SSM接口接收超时 + * 状态变动时才会回调,默认SSM状态正常 + * + * @param isTimeout true:SSM接口接收超时 false:SSM接口恢复正常 + */ override fun onSsmReceiveTimeout(isTimeout: Boolean) { CallerAutoPilotStatusListenerManager.invokeSsmReceiveTimeout(isTimeout) } + /** + * 域控FSM接口接收超时 + * 状态变动时才会回调,默认FSM状态正常 前提是存在FSM接口 + * + * @param isTimeout true:FSM接口接收超时 false:FSM接口恢复正常 + */ + override fun onFsm2024ReceiveTimeout(isTimeout: Boolean) { + CallerAutoPilotStatusListenerManager.invokeFsmReceiveTimeout(isTimeout) + } + /** * 是否可以启动自动驾驶 * 使用方法查看:app_ipc_monitoring/uiMainActivity/onAutopilotAbility @@ -955,7 +1038,7 @@ class MoGoAdasListenerImpl : OnAdasListener { if (unableAutopilotReasons != null) { reason = unableAutopilotReasons.toString() } - autopilotAbilityCheck(isAutopilotAbility, reason, launchConditionData) + autopilotAbilityCheck(isAutopilotAbility, reason, launchConditionData.json) invokeAutopilotAbility(isAutopilotAbility, launchConditionData, unableAutopilotReasons) } @@ -981,7 +1064,7 @@ class MoGoAdasListenerImpl : OnAdasListener { nodeAliasCode = CHAIN_CODE_ADAS_ABILITY, paramIndexes = [0, 1, 2] ) - private fun autopilotAbilityCheck(isAutopilotAbility: Boolean, reason: String, launchConditionData: LaunchConditionData) { + private fun autopilotAbilityCheck(isAutopilotAbility: Boolean, reason: String, launchConditionDataJson: String) { } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt index ccc80aa15f..6bcc217bf5 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt @@ -6,6 +6,8 @@ import androidx.lifecycle.lifecycleScope import com.google.protobuf.TextFormat import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig @@ -16,6 +18,9 @@ import com.mogo.eagle.core.data.v2x.V2XEvent.RoadEventX import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setDemoMode import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setIgnoreConditionDraw +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerManager import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager @@ -36,7 +41,9 @@ import io.netty.channel.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.launch import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.TrackedObject import java.nio.charset.Charset +import java.util.Collections class TeleMsgHandler : IMsgHandler { @@ -62,7 +69,7 @@ class TeleMsgHandler : IMsgHandler { private var listener: EventListener? = null override fun handleMsgFromServer(msg: MogoProtocolMsg?, channel: Channel?) { - msg?.let { + msg?.let { it -> if (it.protocolType == TelematicConstant.V2N_AI_ROAD_DATA_TO_PASSENGER) { try { Log.d(TAG, "乘客屏收到司机屏转发云端下发的V2N事件 --- 1 ---") @@ -78,6 +85,61 @@ class TeleMsgHandler : IMsgHandler { return } + if (it.protocolType == TelematicConstant.V2N_AI_ROAD_PEOPLE_CROSS) { + runCatching { + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { itx -> + itx.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的行人/非机动车横穿事件 --- 1 ---") + CallerV2nNioEventListenerManager.invokeV2nNioCrossoverEvent(MessagePad.Event.parseFrom(msg.body)) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的行人/非机动车横穿事件 --- 2 ---") + } + return + } + if (it.protocolType == TelematicConstant.V2N_AI_ROAD_GREEN_WAVE) { + runCatching { + Log.d(TAG, "乘客屏收到司机屏转发云端下发的绿波通行 --- 1 ---") + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { itx -> + itx.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + CallerV2nNioEventListenerManager.invokeV2nNioGreenWavePassageEvent(MessagePad.V2nCrossSpeed.parseFrom(msg.body)) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的绿波通行 --- 2 ---") + } + return + } + if (it.protocolType == TelematicConstant.V2N_AI_ROAD_OTHER_RETROGRADE_VEHICLE) { + runCatching { + Log.d(TAG, "乘客屏收到司机屏转发云端下发的他车逆行 --- 1 ---") + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { itx -> + itx.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + CallerV2nNioEventListenerManager.invokeV2nNioOtherRetrogradeEvent(MessagePad.Event.parseFrom(msg.body)) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的他车逆行 --- 2 ---") + } + return + } + if (it.protocolType == TelematicConstant.V2N_AI_ROAD_SHI_GONG) { + runCatching { + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { itx -> + itx.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的道路施工 --- 1 ---") + CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyDataUpdate(Collections.singletonList(TrackedObject.parseFrom(msg.body))) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的道路施工 --- 2 ---") + } + return + } + if (it.protocolType == TelematicConstant.V2N_AI_ROAD_SHI_GU) { + runCatching { + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(AutopilotControlParameters().also { itx -> + itx.autoPilotLine = AutoPilotLine(10L, "", "","", "", System.currentTimeMillis(), "") + }) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的道路事故 --- 1 ---") + CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyDataUpdate(Collections.singletonList(TrackedObject.parseFrom(msg.body))) + Log.d(TAG, "乘客屏收到司机屏转发云端下发的道路事故 --- 2 ---") + } + return + } if (it.protocolType == TelematicConstant.V2N_NEW_LINK_SWITCH) { try { Log.d(TAG, "乘客屏收到司机屏转发的新链路开关 --- 1 ---") diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt index cbb6576917..37b63b34be 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.enums.TrafficLightEnum import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.function.angle.scenes.CrossRoad +import com.mogo.eagle.core.function.angle.scenes.Default import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuWarningMapListener import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuWarningRsiListener import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuWarningRsmListener @@ -416,12 +417,12 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener showWarning(v2xType, alertContent, ttsContent, direction, object : IMoGoWarningStatusListener { override fun onShow() { - CallerVisualAngleManager.changeAngle(CrossRoad(true)) + CallerVisualAngleManager.changeScene(CrossRoad(2)) } override fun onDismiss() { super.onDismiss() - CallerVisualAngleManager.changeAngle(CrossRoad(false)) + CallerVisualAngleManager.changeScene(Default()) } }) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index b555456f85..edab8756ef 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -7,8 +7,8 @@ import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.enums.* import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.angle.scenes.CrossRoad +import com.mogo.eagle.core.function.angle.scenes.Default import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener -import com.mogo.eagle.core.function.api.map.angle.* 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.devatools.CallerDevaToolsManager @@ -287,11 +287,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { // 同步给MAP地图 CallerObuLocationWGS84ListenerManager.invokeObuLocationWGS84(gnssInfo) // 同步更新经纬度和系统时间至 AutoPilotStatusListener - CallerAutoPilotStatusListenerManager.updateAutoPilotLocAndTime( - System.currentTimeMillis() / 1000.0, - gnssInfo.longitude, - gnssInfo.latitude - ) + CallerAutoPilotStatusListenerManager.updateAutoPilotLocAndTime(System.currentTimeMillis() / 1000.0, gnssInfo.longitude, gnssInfo.latitude, gnssInfo.heading) } } } @@ -967,14 +963,14 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { override fun onShow() { if (appId == MogoObuShowConstants.V2X_WARNING_TYPE.BSW.toString()) { //盲区预警,展示近视角 - CallerVisualAngleManager.changeAngle(CrossRoad(true)) + CallerVisualAngleManager.changeScene(CrossRoad(2)) } } override fun onDismiss() { if (appId == MogoObuShowConstants.V2X_WARNING_TYPE.BSW.toString()) { //盲区预警,取消近视角 - CallerVisualAngleManager.changeAngle(CrossRoad(false)) + CallerVisualAngleManager.changeScene(Default()) } } }, diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/RoadLineEventManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/RoadLineEventManager.kt new file mode 100644 index 0000000000..59581f6bd2 --- /dev/null +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/RoadLineEventManager.kt @@ -0,0 +1,47 @@ +package com.mogo.eagle.core.function.datacenter.v2x + +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager +import com.zhidaoauto.map.data.road.RoadCross + + +/** + * 路线功能相关,绑定路线id后,业务控制,数据变化均可以封装在这里实现 + */ +class RoadLineEventManager : IMoGoMapRoadListener, IMoGoAutopilotStatusListener { + + companion object{ + + private const val TAG = "RoadLineEventManager" + + val INSTANCE by lazy(LazyThreadSafetyMode.SYNCHRONIZED){ + RoadLineEventManager() + } + } + + @Volatile + private var record = false + + fun init() { + CallerMapRoadListenerManager.addListener(TAG, this) + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + override fun onAutopilotRouteLineId(lineId: Long) { + super.onAutopilotRouteLineId(lineId) + record = lineId != 0L + } + + override fun onRoadChange(cross: Boolean, roadCross: RoadCross?) { + super.onRoadChange(cross, roadCross) + if(!record){ + return + } + if(cross){ + CallerAutoPilotStatusListenerManager.updateRoadCount() + } + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt index a30f8293b6..87bf10f51f 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt @@ -3,6 +3,8 @@ package com.mogo.eagle.core.function.datacenter.v2x import android.content.Context import android.os.CountDownTimer import android.os.Handler +import android.util.Log +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightStatus import com.mogo.eagle.core.data.biz.trafficlight.currentRoadTrafficLight @@ -16,10 +18,14 @@ import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.TrafficLightEnum +import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -28,8 +34,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.service.chain.ChainLog -import perception.TrafficLightOuterClass -import perception.TrafficLightOuterClass.TrafficLight +import perception.FusionTrafficLightOuterClass +import kotlin.math.abs fun TrafficLightStatus.convert(): TrafficLightEnum { return when { @@ -40,12 +46,12 @@ fun TrafficLightStatus.convert(): TrafficLightEnum { } } -fun TrafficLight.convert(): TrafficLightEnum { - return when (this.state) { - TrafficLightOuterClass.LightState.STATE_GREEN -> TrafficLightEnum.GREEN - TrafficLightOuterClass.LightState.STATE_YELLOW -> TrafficLightEnum.YELLOW - TrafficLightOuterClass.LightState.STATE_RED -> TrafficLightEnum.RED - TrafficLightOuterClass.LightState.STATE_OFF -> TrafficLightEnum.BLACK +fun convert(state: FusionTrafficLightOuterClass.FusionLightState): TrafficLightEnum { + return when (state) { + FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION -> TrafficLightEnum.GREEN + FusionTrafficLightOuterClass.FusionLightState.STATE_YELLOW_FUSION -> TrafficLightEnum.YELLOW + FusionTrafficLightOuterClass.FusionLightState.STATE_RED_FUSION -> TrafficLightEnum.RED + FusionTrafficLightOuterClass.FusionLightState.STATE_OFF_FUSION -> TrafficLightEnum.BLACK else -> TrafficLightEnum.BLACK } } @@ -56,7 +62,8 @@ fun TrafficLight.convert(): TrafficLightEnum { * @优先级:OBU,云,工控 * @since: 2022/4/28 */ -class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLightListener { +class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLightListener, + IMoGoChassisLocationGCJ02Listener { companion object { const val TAG = "TrafficLightDispatcher" @@ -79,32 +86,46 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight @Volatile private var hasAutopilotPerception: Boolean = false + //是否有融合带有下一和下二灯态的红绿灯数据 + @Volatile + private var hasFusionLightStatus: Boolean = false + //红绿灯定时器,超时未更新隐藏红绿灯 @Volatile private var lightCountDownTimer: CountDownTimer? = null private var lastLightTime: Long = System.currentTimeMillis() + private var currentSpeed: Float = 0f + private var isPrompted: Boolean = false //是否提示过起步提醒/提前减速,每个路口仅提示一次 + private var isTurnGreen: Boolean = false + fun initServer(context: Context) { mContext = context //注册监听AI云.OBU,路侧获取红绿灯状态 CallerTrafficLightListenerManager.addListener(TAG, this) //注册监听工控机感知红绿灯 CallerAutopilotIdentifyListenerManager.addListener(TAG, this) + //注册获取当前车速 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 1, this) } /** * 工控机感知红绿灯 * @param trafficLights 感知红绿灯 */ - override fun onAutopilotPerceptionTrafficLight(trafficLights: TrafficLightOuterClass.TrafficLights?) { + override fun onAutopilotPerceptionTrafficLight(trafficLights: FusionTrafficLightOuterClass.FusionTrafficLights?) { CallerLogger.d( "${SceneConstant.M_D_C}${TAG}", "onAutopilotPerceptionTrafficLight ---- hasObuLightStatus = $hasObuLightStatus ----hasAiLightStatus = $hasAiLightStatus , trafficLights : ${trafficLights?:"null"}" ) + if(trafficLights?.source == 2){ + hasObuLightStatus = false + hasAiLightStatus = false + } if (!hasObuLightStatus) { if (!hasAiLightStatus) { - trafficLights?.let { - var light: TrafficLight? = null + trafficLights?.let { it -> + var light: FusionTrafficLightOuterClass.FusionTrafficLight? = null if (it.hasStraight()) { light = it.straight } else if (it.hasLeft()) { @@ -126,19 +147,132 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight if (!hasAutopilotPerception) { hasAutopilotPerception = true } - if (HmiBuildConfig.isShowCarSourceTrafficLightView) { - var lightRemain = light.duration.toInt() - val source = when (trafficLights.source) { - 1 -> DataSourceType.TELEMATIC_UNION_V2I - 2 -> DataSourceType.TELEMATIC_UNION_V2N - else -> { - lightRemain = 0 - DataSourceType.TELEMATIC + + if(light.nextState == null || light.nextState == FusionTrafficLightOuterClass.FusionLightState.STATE_OFF_FUSION + || light.nextTwoState == null || light.nextTwoState == FusionTrafficLightOuterClass.FusionLightState.STATE_OFF_FUSION){ + if (HmiBuildConfig.isShowCarSourceTrafficLightView) { + var lightRemain = light.duration.toInt() + val source = when (trafficLights.source) { + 1 -> DataSourceType.TELEMATIC_UNION_V2I + 2 -> DataSourceType.TELEMATIC_UNION_V2N + else -> { + lightRemain = 0 + DataSourceType.TELEMATIC + } } + onTrafficLightPlusSource(convert(light.state), lightRemain, source) + } + }else{ + Log.i(TAG,"current state="+light.state+" current duration="+light.duration+ + " nextState="+light.nextState+" nextDuration="+light.nextDuration+ + " nextTwoState="+light.nextTwoState+" nextTwoDuration="+light.nextTwoDuration) + if(convert(light.state) == TrafficLightEnum.BLACK){ + //隐藏当前红绿灯以及额外提示框 + CallerTrafficLightListenerManager.disableTrafficLight() + CallerTrafficLightListenerManager.notifyFusionTrafficLightStatus(false) + hasFusionLightStatus = false + isPrompted = false + isTurnGreen = false + }else{ + //倒计时,超时还未更新数据则隐藏红绿灯 + lastLightTime = System.currentTimeMillis() + if (lightCountDownTimer == null){ + UiThreadHandler.post { + lightCountDownTimer = object : CountDownTimer(300000, 500) { + override fun onTick(millisUntilFinished: Long) { + if ((System.currentTimeMillis() - lastLightTime) > 1000) { + //隐藏红绿灯显示 + hide("倒计时结束隐藏", DataSourceType.TELEMATIC_UNION_V2N) + CallerTrafficLightListenerManager.notifyFusionTrafficLightStatus(false) + lightCountDownTimer?.cancel() + lightCountDownTimer = null + hasFusionLightStatus = false + isPrompted = false + isTurnGreen = false + } + } + + override fun onFinish() { + //隐藏红绿灯显示 + hide("倒计时结束隐藏", DataSourceType.TELEMATIC_UNION_V2N) + CallerTrafficLightListenerManager.notifyFusionTrafficLightStatus(false) + lightCountDownTimer?.cancel() + lightCountDownTimer = null + hasFusionLightStatus = false + isPrompted = false + isTurnGreen = false + } + + } + lightCountDownTimer?.start() + } + } + + //有下一和下二灯态,则为融合V2N红绿灯数据 + onFusionTrafficLight(convert(light.state),light.duration.toInt(), + convert(light.nextState),light.nextDuration.toInt(), + convert(light.nextTwoState),light.nextTwoDuration.toInt(), + DataSourceType.TELEMATIC_UNION_V2N + ) + //当前灯态倒计时小于5S时,展示额外的提示框 + onTrafficLightPrompt(convert(light.state),light.duration,convert(light.nextState),light.nextDuration, + convert(light.nextTwoState),light.nextTwoDuration) + CallerTrafficLightListenerManager.notifyFusionTrafficLightStatus(true) + /** + * 司机端提示: + * 车辆等红灯,在红/黄灯剩余5s且下一灯态为绿灯时,提示“红灯即将变绿”;并在变为绿灯时有提示起步的动效 + * 车辆行驶中,若判断当前绿灯自车无法通过,在绿灯剩余5s且下一灯态为红/黄灯时,提示“蘑菇提醒您及时减速,避免路口急刹” + * 车辆行驶中,若判断当前绿灯自车基于当前速度需提速10%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” + * 车辆行驶中,若判断当前红灯自车基于当前速度需降低60%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” + */ + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode + ) && !isTurnGreen){ + //车辆等红灯,在红/黄灯剩余5s且下一灯态为绿灯时,提示“红灯即将变绿”;并在变为绿灯时有提示起步的动效 + if((light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_YELLOW_FUSION || light.state ==FusionTrafficLightOuterClass.FusionLightState.STATE_RED_FUSION) + && light.duration < 5 && light.nextState == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION){ + //语音播放:红灯即将变绿 + AIAssist.getInstance(mContext).speakTTSVoice("红灯即将变绿") + isTurnGreen = true + } + } + + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && !isPrompted){ + //车辆行驶中,若判断当前绿灯自车无法通过,在绿灯剩余5s且下一灯态为红/黄灯时,提示“蘑菇提醒您及时减速,避免路口急刹” + if(light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION && light.duration < 5){ + CallerMapRoadListenerManager.getStopLineDistance()?.let { dis-> + if(currentSpeed*light.duration < dis){ + //语音播放:蘑菇提醒您及时减速,避免路口急刹 + AIAssist.getInstance(mContext).speakTTSVoice("蘑菇提醒您及时减速,避免路口急刹") + isPrompted = true + } + } + } + //车辆行驶中,若判断当前绿灯自车基于当前速度需提速10%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” + if(light.state == FusionTrafficLightOuterClass.FusionLightState.STATE_GREEN_FUSION){ + CallerMapRoadListenerManager.getStopLineDistance()?.let{distance-> + if(currentSpeed*light.duration*1.1 < distance){ + //语音播放:蘑菇提醒您及时减速,避免路口急刹 + AIAssist.getInstance(mContext).speakTTSVoice("蘑菇提醒您及时减速,避免路口急刹") + isPrompted = true + } + } + } + //车辆行驶中,若判断当前红灯自车基于当前速度需降低60%以上才可通过时,提示“蘑菇提醒您及时减速,避免路口急刹” + if(light.state ==FusionTrafficLightOuterClass.FusionLightState.STATE_RED_FUSION){ + CallerMapRoadListenerManager.getStopLineDistance()?.let{distance-> + if(currentSpeed*0.4*light.duration > distance){ + //语音播放:蘑菇提醒您及时减速,避免路口急刹 + AIAssist.getInstance(mContext).speakTTSVoice("蘑菇提醒您及时减速,避免路口急刹") + isPrompted = true + } + } + } + } + + } - onTrafficLightPlusSource(light.convert(), lightRemain, source) - } else { - onTrafficLightPlusSource(light.convert(), 0, DataSourceType.TELEMATIC) } } } @@ -178,6 +312,7 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight Handler().postDelayed({ hasAiLightStatus = false hasObuLightStatus = false + hasFusionLightStatus = false }, 5000) if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { CallerTelematicManager.sendMsgToAllClients( @@ -228,7 +363,7 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight "${SceneConstant.M_D_C}${TAG}", "resetTrafficLight ------> isReset = $isReset ---hasObuLightStatus = $hasObuLightStatus" ) - if (!hasObuLightStatus && !hasAutopilotPerception) { + if (!hasObuLightStatus && !hasAutopilotPerception && !hasFusionLightStatus) { if (isReset) { hide("云端重置红绿灯数据", DataSourceType.AICLOUD) } @@ -249,6 +384,53 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight CallerTrafficLightListenerManager.disableTrafficLight() } + /** + * 融合V2N红绿灯额外提示框提醒 + */ + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_TRAFFIC_LIGHT, + paramIndexes = [0, 1]) + override fun onTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float) { + super.onTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) + CallerTrafficLightListenerManager.onShowTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) + } + + /** + * 融合V2N红绿灯数据,带有下一下二灯态 + */ + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_TRAFFIC_LIGHT, + paramIndexes = [0, 1, 2,3,4,5,6,7] + ) + override fun onFusionTrafficLight( + currentState: TrafficLightEnum, currentDuration: Int, + nextState: TrafficLightEnum, nextDuration: Int, + nextTwoState: TrafficLightEnum, nextTwoDuration: Int, + lightSource: DataSourceType + ) { + super.onFusionTrafficLight(currentState, currentDuration, nextState, nextDuration, + nextTwoState, nextTwoDuration, lightSource) + if (filterTelematicUnion(lightSource)) { + return + } + if(currentState == TrafficLightEnum.BLACK || nextState == TrafficLightEnum.BLACK + || nextTwoState == TrafficLightEnum.BLACK){ + return + } + hasObuLightStatus = false + hasAutopilotPerception = false + hasAiLightStatus = false + hasFusionLightStatus = true + CallerTrafficLightListenerManager.showFusionTrafficLight(currentState, currentDuration, nextState, nextDuration, + nextTwoState, nextTwoDuration, lightSource) + } + /** * OBU红绿灯数据 */ @@ -362,6 +544,15 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight CallerTrafficLightListenerManager.removeListener(TAG) //取消注册监听工控机感知红绿灯 CallerAutopilotIdentifyListenerManager.removeListener(TAG) + //取消注册获取当前车速 + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + } + + /** + * 当前车速 + */ + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + currentSpeed = abs(mogoLocation?.gnssSpeed ?: 0f) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 4a09bd0a37..cf72166d49 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -1,14 +1,19 @@ package com.zhjt.mogo_core_function_devatools +//import com.mogo.eagle.core.function.api.devatools.apm.* +//import com.zhjt.mogo_core_function_devatools.apm.* import android.app.Activity import android.app.Application import android.content.Context +import android.util.Log import android.view.View import android.view.ViewGroup import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.EnvConfig +import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.bindingcar.ModifyBindingcarInfo import com.mogo.eagle.core.data.deva.chain.ChainConstant @@ -18,16 +23,22 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider -//import com.mogo.eagle.core.function.api.devatools.apm.* -import com.mogo.eagle.core.function.api.devatools.block.* -import com.mogo.eagle.core.function.api.devatools.strict.* -import com.mogo.eagle.core.function.api.devatools.download.* -import com.mogo.eagle.core.function.api.devatools.logcat.* -import com.mogo.eagle.core.function.api.devatools.mofang.* +import com.mogo.eagle.core.function.api.devatools.block.IMoGoBlockProvider +import com.mogo.eagle.core.function.api.devatools.download.DownloadType +import com.mogo.eagle.core.function.api.devatools.logcat.IMoGoLogRecordProvider +import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider import com.mogo.eagle.core.function.api.devatools.perf.IMoGoCpuUsageProvider -import com.mogo.eagle.core.function.api.lookaround.* +import com.mogo.eagle.core.function.api.devatools.strict.IStrictModeProvider +import com.mogo.eagle.core.function.api.lookaround.IMoGoLookAroundProvider +import com.mogo.eagle.core.function.api.map.route.IMapRouteProvider +import com.mogo.eagle.core.function.api.upgrade.IMoGoUpgradeProvider +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.w +import com.mogo.eagle.core.utilcode.util.AppStateManager +import com.mogo.eagle.core.utilcode.util.IAppStateListener +import com.mogo.weak.network.SdtManager import com.tencent.matrix.Matrix import com.tencent.matrix.iocanary.IOCanaryPlugin import com.tencent.matrix.iocanary.config.IOConfig @@ -37,26 +48,20 @@ import com.tencent.matrix.report.Issue import com.tencent.matrix.trace.TracePlugin import com.tencent.matrix.trace.config.SharePluginInfo import com.tencent.matrix.trace.config.TraceConfig -//import com.zhjt.mogo_core_function_devatools.apm.* -import com.mogo.eagle.core.function.api.upgrade.* -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager -import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope -import com.mogo.eagle.core.utilcode.util.AppStateManager -import com.mogo.eagle.core.utilcode.util.IAppStateListener -import com.mogo.weak.network.SdtManager import com.zhjt.mogo_core_function_devatools.adas.PowerOffManager import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig -import com.zhjt.mogo_core_function_devatools.binding.* -import com.zhjt.mogo_core_function_devatools.block.* +import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager +import com.zhjt.mogo_core_function_devatools.block.MoGoBlockProviderImpl import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl -import com.zhjt.mogo_core_function_devatools.logcat.* +import com.zhjt.mogo_core_function_devatools.logcat.CrashLogAnalyticsManager +import com.zhjt.mogo_core_function_devatools.logcat.MoGoLogRecordProviderImpl import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager -import com.zhjt.mogo_core_function_devatools.lookaround.* +import com.zhjt.mogo_core_function_devatools.lookaround.MoGoLookAroundProviderImpl import com.zhjt.mogo_core_function_devatools.matrix.DynamicConfigImpl -import com.zhjt.mogo_core_function_devatools.mofang.* +import com.zhjt.mogo_core_function_devatools.mofang.MoGoMoFangProviderImpl import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager import com.zhjt.mogo_core_function_devatools.monitor.db.MonitorDb import com.zhjt.mogo_core_function_devatools.monitor.db.MonitorDb.Companion.getDb @@ -67,7 +72,7 @@ import com.zhjt.mogo_core_function_devatools.status.StatusManager import com.zhjt.mogo_core_function_devatools.status.entity.RouteDownloadStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.ui.AutoPilotLaunchBeforeView -import com.zhjt.mogo_core_function_devatools.strict.* +import com.zhjt.mogo_core_function_devatools.strict.StrictModeProviderImpl import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager import com.zhjt.mogo_core_function_devatools.tts.TtsManager.Companion.ttsManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager @@ -77,7 +82,11 @@ import com.zhjt.service.chain.ChainLog import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import java.io.BufferedReader import java.io.File +import java.io.FileReader +import java.io.IOException +import java.lang.StringBuilder import java.lang.ref.WeakReference import java.util.concurrent.ConcurrentHashMap @@ -112,6 +121,10 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { private val downloadCallbacks by lazy { ConcurrentHashMap Unit>>() } private val startAutopilotCallbacks by lazy { ConcurrentHashMap Unit>>() } + private val mapRouteProvider by lazy { + ARouter.getInstance().build(MogoServicePaths.PATH_MAP_ROUTE_GUIDE).navigation() as? IMapRouteProvider + } + @Volatile private var lastCanAutopilotStatus: Int? = null @@ -228,6 +241,26 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { val crashDir = File(it.getExternalFilesDir(null), "crash") if(crashDir.exists() && crashDir.canExecute() && crashDir.listFiles()?.isNotEmpty() == true){ it.lifeCycleScope.launch(Dispatchers.IO){ + crashDir.listFiles()?.forEach {crash-> + val file = File(crash.absolutePath) + try { + BufferedReader(FileReader(file)).use { reader -> + var line: String? + //读取读取文件内容并打印 + while (reader.readLine().also { line = it } != null) { + line?.let { content-> + if(content.contains("Crash type")){ + CrashLogAnalyticsManager.crashLogAnalytics(content) + return@use + } + } + + } + } + } catch (e: IOException) { + e.printStackTrace() + } + } val startTime = crashDir.lastModified() - 60*1000 val endTime = if(System.currentTimeMillis() - crashDir.lastModified()>60*1000){ crashDir.lastModified() + 60*1000 @@ -236,10 +269,13 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { } var isUploadSuccess = false try { + MoGoLogRecordProviderImpl.isUploadExtraFile = false CallerDevaToolsManager.logcat()?.upload(startTime, endTime) isUploadSuccess = true } catch (t: Throwable) { t.printStackTrace() + } finally { + MoGoLogRecordProviderImpl.isUploadExtraFile = true } if(isUploadSuccess){ crashDir.deleteRecursively() @@ -607,4 +643,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { override fun unRegisterStartAutopilotStateListener(tag: String) { startAutopilotCallbacks.remove(tag) } + + override fun setRouteDynamicColorEnable(enable: Boolean) { + mapRouteProvider?.setRouteDynamicColorEnable(enable) + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/CrashLogAnalyticsManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/CrashLogAnalyticsManager.kt new file mode 100644 index 0000000000..8126279d6f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/CrashLogAnalyticsManager.kt @@ -0,0 +1,75 @@ +package com.zhjt.mogo_core_function_devatools.logcat + +import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.utilcode.util.AppUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String + +/** + * 崩溃埋点统计管理 + */ +object CrashLogAnalyticsManager { + + private const val crashLogRecord = "crash_log_record" + + private const val crashCosPath = "crashCosPath" //崩溃日志所在文件COS桶地址 + private const val crashType = "crashType" //崩溃类型Java、Native、ANR + private const val crashPlateNumber = "plateNumber" //车牌号 + private const val crashCarSn = "carSn" //鹰眼SN + private const val crashMapVersion = "mapVersion" //工控机版本 + private const val crashEyeVersion = "eyeVersion" //鹰眼版本 + private const val crashAppFlavor = "appFlavor" //渠道信息 + private const val crashBranchHash = "branchHash" //Git Hash + + /** + * 崩溃统计 + * @param cosPath 崩溃上传到COS桶的地址 + * @param type 崩溃类型 + * @param plateNumber 车牌号 + * @param carSn SN + * @param mapVersion 域控版本 + * @param eyeVersion 鹰眼版本 + * @param appFlavor 鹰眼渠道信息 + * @param branchHash Git Hash + */ + private fun realCrashLogAnalytics(cosPath: String,type: String,plateNumber: String,carSn: String,mapVersion: String,eyeVersion: String, + appFlavor: String,branchHash: String){ + val crashLogParams = HashMap() + crashLogParams[crashCosPath] = cosPath + crashLogParams[crashType] = type + crashLogParams[crashPlateNumber] = plateNumber + crashLogParams[crashCarSn] = carSn + crashLogParams[crashMapVersion] = mapVersion + crashLogParams[crashEyeVersion] = eyeVersion + crashLogParams[crashAppFlavor] = appFlavor + crashLogParams[crashBranchHash] = branchHash + MogoAnalyticUtils.track(crashLogRecord,crashLogParams) + } + + /** + * 崩溃统计 + * @param crashType 崩溃类型 + */ + fun crashLogAnalytics(crashType: String){ + val crashCosPath = StringBuilder() + crashCosPath.append("CarPad/") + if(DebugConfig.isDebug()){ + crashCosPath.append("debuglog/") + }else{ + crashCosPath.append("eaglelog/") + } + crashCosPath.append(SharedPrefsMgr.getInstance().sn) + crashCosPath.append("/") + crashCosPath.append(millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat())) + crashCosPath.append("/") + realCrashLogAnalytics(crashCosPath.toString(),crashType.replace("Crash type:","").trim(), AppConfigInfo.plateNumber, + SharedPrefsMgr.getInstance().sn, + CallerAutoPilotStatusListenerManager.getDockerVersion() ?: "", + AppUtils.getAppVersionName(),AppConfigInfo.flavor,AppConfigInfo.workingBranchHash) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt index 6075965d76..8a3c6045d0 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt @@ -23,6 +23,7 @@ import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.function.api.devatools.logcat.* import com.mogo.eagle.core.utilcode.download.DownloadUtils import com.zhidao.loglib.bean.RemoteLogPushContent +import com.zhjt.mogo_core_function_devatools.BuildConfig import com.zhjt.mogo_core_function_devatools.logcat.checker.AnrLogChecker import com.zhjt.mogo_core_function_devatools.logcat.config.LogRecordConfig import com.zhjt.mogo_core_function_devatools.logcat.uploader.* @@ -38,6 +39,9 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, companion object { private const val TAG = "MoGoLogRecordProviderImpl" + + @Volatile + var isUploadExtraFile = true } private val flag by lazy { AtomicBoolean(false) } @@ -73,6 +77,7 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, itx["应用版本名称"] = AppConfigInfo.appVersionName itx["应用版本号"] = AppConfigInfo.appVersionCode itx["渠道"] = AppConfigInfo.flavor + itx["构建类型"] = BuildConfig.BUILD_TYPE itx["GIT分支"] = AppConfigInfo.workingBranchName itx["GIT分支HASH"] = AppConfigInfo.workingBranchHash itx["${divider}-2"] = divider @@ -141,8 +146,12 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, ) builder.extraFilesToUpload(object : IExtraFileToUpload { override fun filesToUpload(): List { - return ArrayList().also { - it.add(ToUploadFile(File(Environment.getExternalStorageDirectory(), "MLog"))) + return if (isUploadExtraFile) { + ArrayList().also { + it.add(ToUploadFile(File(Environment.getExternalStorageDirectory(), "MLog"))) + } + } else { + emptyList() } } }) diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 6df031e493..29756c7395 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -68,6 +68,7 @@ dependencies { // debugImplementation rootProject.ext.dependencies.debugleakcanary // releaseImplementation rootProject.ext.dependencies.releaseleakcanary implementation rootProject.ext.dependencies.arouter + implementation project(path: ':core:function-impl:mogo-core-function-map') kapt rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.android_start_up @@ -81,6 +82,7 @@ dependencies { compileOnly project(':core:function-impl:mogo-core-function-datacenter') implementation project(':foudations:mogo-commons') api project(':core:mogo-core-res') + implementation project(':core:mogo-core-utils') compileOnly project(':core:mogo-core-function-call') } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGI-1.ttf b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGI-1.ttf new file mode 100644 index 0000000000..09258773c7 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGI-1.ttf differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGIB-2.ttf b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGIB-2.ttf new file mode 100644 index 0000000000..064ad478a5 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGIB-2.ttf differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGII-3.ttf b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGII-3.ttf new file mode 100644 index 0000000000..2aae3d8a58 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGII-3.ttf differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGIT-4.ttf b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGIT-4.ttf new file mode 100644 index 0000000000..65642f982e Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/assets/DS-DIGIT-4.ttf differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index cda2a7f5bf..7e2d5611c6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -1,9 +1,11 @@ package com.mogo.eagle.core.function.hmi.ui import android.content.Context +import android.telecom.Call import android.text.TextUtils import android.view.Gravity import android.view.ViewGroup +import android.view.WindowManager import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route @@ -30,6 +32,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTurnLightListenerManager import com.mogo.eagle.core.function.hmi.ui.camera.RoadVideoDialog +import com.mogo.eagle.core.function.hmi.ui.greenwave.GreenWaveView import com.mogo.eagle.core.function.hmi.ui.lookaround.M1LookAroundView import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog @@ -45,6 +48,7 @@ import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView import com.mogo.eagle.core.function.hmi.xiaozhi.XiaoZhiStateManager import com.mogo.eagle.core.utilcode.floating.MoGoPopWindow +import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope import com.mogo.eagle.core.utilcode.kotlin.safeCancel import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -83,7 +87,6 @@ class MoGoHmiProvider : IMoGoHmiProvider { private val xiaozhi by lazy { XiaoZhiStateManager() } - override fun init(context: Context?) { this.context = context } @@ -403,4 +406,12 @@ class MoGoHmiProvider : IMoGoHmiProvider { override fun notifyXiaoZhiStatusChanged(event: Event, state: State) { xiaozhi.notify(event, state) } + + override fun showGreenWave(min: Int, max: Int, cross: Int) { + CallerHmiViewControlListenerManager.invokeGreenWaveVisible(min, max, cross) + } + + override fun dismissGreenWave() { + CallerHmiViewControlListenerManager.invokeGreenWaveDismiss() + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt index 1086700744..bc6654f8f2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListAdapter.kt @@ -27,7 +27,7 @@ class CameraListAdapter : Adapter { } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CameraListHolder { - var view = LayoutInflater.from(parent.context) + val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_camera_info, parent, false) return CameraListHolder(view) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/RoadCrossLiveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/RoadCrossLiveView.kt new file mode 100644 index 0000000000..e657e6aaea --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/RoadCrossLiveView.kt @@ -0,0 +1,203 @@ +package com.mogo.eagle.core.function.hmi.ui.camera + +import android.content.Context +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.os.Handler +import android.os.Looper +import android.os.Message +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import com.mogo.eagle.core.data.road.RoadCameraLive +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager +import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog +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.mogo.logger.scene.SceneConstant.Companion.M_HMI +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.shuyu.gsyvideoplayer.model.VideoOptionModel +import com.shuyu.gsyvideoplayer.player.IjkPlayerManager +import com.shuyu.gsyvideoplayer.player.PlayerFactory +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import com.zhidaoauto.map.data.road.RoadCross +import kotlinx.android.synthetic.main.view_road_cross_live.view.roadCrossLiveClose +import kotlinx.android.synthetic.main.view_road_cross_live.view.roadCrossLivePB +import kotlinx.android.synthetic.main.view_road_cross_live.view.roadCrossLivePlayer +import tv.danmaku.ijk.media.player.IjkMediaPlayer + +class RoadCrossLiveView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoMapRoadListener, IViewControlListener { + + companion object { + private const val TAG = "RoadCrossLiveView" + private const val CLOSE_VIEW_DELAY_TIME = 10_000L + } + + @Volatile + private var curLiveDevice: String? = null + + private val gsyVideoOptionBuilder by lazy { + GSYVideoOptionBuilder() + } + + private val handler = object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + if (this@RoadCrossLiveView.visibility == View.VISIBLE) { + closeView() + } + } + } + + init { + val res = when (CallerSkinModeListenerManager.getMode()) { + 0 -> R.layout.view_road_cross_live + 1 -> R.layout.view_road_cross_live_light + else -> R.layout.view_road_cross_live + } + LayoutInflater.from(context).inflate(res, this, true) + initVideoPlayer() + roadCrossLivePB.indeterminateDrawable.colorFilter = PorterDuffColorFilter( + ContextCompat.getColor(context, R.color.notice_blue), + PorterDuff.Mode.MULTIPLY + ) + roadCrossLiveClose.setOnClickListener { + HmiActionLog.hmiAction("关闭路侧视频流", "") + closeView() + } + + } + + private fun initVideoPlayer() { + val list: MutableList = ArrayList() + list.add(VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "reconnect", 3)) + GSYVideoManager.instance().optionModelList = list + GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9) + PlayerFactory.setPlayManager(IjkPlayerManager::class.java) + roadCrossLivePlayer.outLinePixel = 12f + roadCrossLivePlayer.setPlayListener(object : SimpleVideoPlayer.PlayListener { + override fun onPlayEvent(event: Int) { + CallerLogger.d("$M_HMI$TAG", "onPlayEvent: event is:$event") + when (event) { + SimpleVideoPlayer.PLAY_EVT_PLAY_LOADING -> { + // 会出现临时中断后又可以继续播放,需要停掉倒计时 + } + + SimpleVideoPlayer.PLAY_EVT_PLAY_BEGIN -> { + roadCrossLivePB.visibility = View.GONE + roadCrossLivePlayer.visibility = View.VISIBLE + } + + else -> { + CallerLogger.w("$M_HMI$TAG", "播放视频异常,event is:$event") + } + } + } + }) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMapRoadListenerManager.addListener(TAG, this) + CallerHmiViewControlListenerManager.addListener(TAG, this) + } + + override fun onRoadChange(cross: Boolean, roadCross: RoadCross?) { + super.onRoadChange(cross, roadCross) + // 离开路口,进入路段,发送handler3秒后隐藏播放器 + if (!cross) { + handler.sendEmptyMessageDelayed(0, CLOSE_VIEW_DELAY_TIME) + } + } + + override fun mainPageViewVisible(v: Int) { + super.mainPageViewVisible(v) + if (v == View.GONE && this.visibility == View.VISIBLE) { + closeView() + } + } + + override fun onRoadCrossClick() { + super.onRoadCrossClick() + if (this.visibility == View.VISIBLE) { + return + } + if(!CallerHmiViewControlListenerManager.getMainPageVisible()){ + CallerLogger.d("${M_MAP}$TAG", "onRoadCrossClick return , mainPageVisible is false") + return + } + resetView() + } + + override fun onCrossLiveInfo(info: RoadCameraLive) { + super.onCrossLiveInfo(info) + if (curLiveDevice != null && curLiveDevice == info.ip) { + CallerLogger.w("$M_HMI$TAG", "播放视频异常,当前播放设备与上次相同,ip:${info.ip}") + return + } + bringToFront() + curLiveDevice = info.ip + ThreadUtils.runOnUiThread { + HmiActionLog.hmiAction("触发marker点击,播放路侧视频流", info.toString()) + gsyVideoPlay(info.imageUrl, info.liveUrl) + } + } + + private fun gsyVideoPlay(img: String?, live: String?) { + if (live.isNullOrEmpty()) return + resetView() + gsyVideoOptionBuilder.setUrl(live) + .setCacheWithPlay(false) + .setAutoFullWithSize(false) + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) + .setPlayTag(TAG).build(roadCrossLivePlayer) + roadCrossLivePlayer.startButton.performClick() + } + + /** + * 重置视图,播放下一个 + */ + private fun resetView() { + CallerHmiViewControlListenerManager.invokeV2XEvent(View.VISIBLE, TAG) + this.visibility = View.VISIBLE + roadCrossLivePB.visibility = View.VISIBLE + roadCrossLivePlayer.onVideoReset() + } + + /** + * 隐藏view,释放视频控制器 + */ + private fun closeView() { + if(visibility == View.GONE){ + return + } + CallerHmiViewControlListenerManager.invokeV2XEvent(View.GONE, TAG) + this.visibility = View.GONE + roadCrossLivePlayer.visibility = View.GONE + curLiveDevice = null + GSYVideoManager.releaseAllVideos() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMapRoadListenerManager.removeListener(TAG) + CallerHmiViewControlListenerManager.removeListener(TAG) + closeView() + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt new file mode 100644 index 0000000000..806c1c4aca --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt @@ -0,0 +1,181 @@ +package com.mogo.eagle.core.function.hmi.ui.greenwave + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +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.hmi.view.IViewControlListener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.scope +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.launch +import me.jessyan.autosize.utils.AutoSizeUtils +import kotlin.math.abs +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.speed as passenger_speed +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.speed as driver_speed +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.wave_rv as passenger_wave_rv +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.wave_rv as driver_wave_rv +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.recommend_speed as passenger_recommend_speed +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.recommend_speed as driver_recommend_speed +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.recommend_cross as passenger_recommend_cross +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.recommend_cross as driver_recommend_cross + +class GreenWaveView: LinearLayout, IMoGoChassisLocationGCJ02Listener, RecyclerView.OnItemTouchListener, Runnable, IViewControlListener { + + companion object { + private const val TAG = "GreenWaveView" + } + + private var lastSpeed: Int = Int.MIN_VALUE + + constructor(context: Context) : this(context, null) + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + LayoutInflater.from(context).inflate(if (isDriver) R.layout.view_green_wave_driver_layout else R.layout.view_green_wave_passenger_layout, this) + background = if (isDriver) ContextCompat.getDrawable(context, R.drawable.bg_green_wave_driver) else ContextCompat.getDrawable(context, R.drawable.bg_green_wave_passenger) + } + + private val isDriver by lazy { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + + private class WaveHolder(item: ImageView): RecyclerView.ViewHolder(item) + + private inner class WaveAdapter: RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WaveHolder { + val item = ImageView(parent.context) + val width = if (isDriver) 156 / 153 * AutoSizeUtils.dp2px(parent.context, 129f) else AutoSizeUtils.dp2px(parent.context, 156f) + val height = (153 * 1.0 / 156 * width).toInt() + item.layoutParams = RecyclerView.LayoutParams(width, height) + return WaveHolder(item) + } + + override fun getItemCount(): Int { + return 5000 + } + + override fun onBindViewHolder(holder: WaveHolder, position: Int) { + val item = holder.itemView as? ImageView ?: return + val reminder = position % 3 + when(reminder) { + 0 -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_low) + } + 1 -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_mid) + } + else -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_high) + } + } + } + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 5, this) + CallerHmiViewControlListenerManager.addListener(TAG, this) + } + + private fun startAutoScroll() { + removeCallbacks(this) + post(this) + } + + private fun stopAutoScroll() { + removeCallbacks(this) + } + + override fun run() { + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.scrollBy(-6, 0) + postDelayed(this, 20) + } + + override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { + return true + } + + override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) { } + + override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) { } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + CallerHmiViewControlListenerManager.removeListener(this) + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.removeOnItemTouchListener(this) + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + var isChanged = false + val speed = (abs(mogoLocation?.gnssSpeed ?: 0f) * 3.6f).toInt() + if (lastSpeed != speed) { + isChanged = true + lastSpeed = speed + } + if (isChanged) { + scope.launch { + if (isDriver) { + driver_speed?.text = speed.toString() + } else { + passenger_speed?.text = speed.toString() + } + } + } + } + + private fun show(minSpeed: Int, maxSpeed: Int, cross: Int) { + scope.launch { + this@GreenWaveView.visibility = View.VISIBLE + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv +// rv?.addItemDecoration(CommonDividerItemDecoration.Builder() +// .spanCountTBCare(false) +// .horizontalInnerSpace(SizeUtils.dp2px(10f)) +// .build()) + rv?.addOnItemTouchListener(this@GreenWaveView) + rv?.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, true) + rv?.adapter = WaveAdapter() + startAutoScroll() + if (isDriver) { + driver_recommend_speed?.text = "建议车速${minSpeed}-${maxSpeed}km/h" + driver_recommend_cross?.text = "可丝滑通过${cross}个路口" + } else { + passenger_recommend_speed?.text = "建议车速${minSpeed}-${maxSpeed}km/h" + passenger_recommend_cross?.text = "可丝滑通过${cross}个路口" + } + } + } + + private fun hide() { + scope.launch { + stopAutoScroll() + visibility = View.GONE + } + } + + override fun onGreenWaveViewDismiss() { + hide() + } + + override fun onGreenWaveViewVisible(min: Int, max: Int, cross: Int) { + super.onGreenWaveViewVisible(min, max, cross) + show(min, max, cross) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index 959553636e..b601e39bc2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -91,6 +91,7 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( MsgCategory.RECORD_BAG -> { MsgBoxConfig.recordBagList.add(msgBoxBean) } + else -> {} } if(isShowData){ if(category == MsgCategory.RECORD_BAG){ @@ -159,6 +160,10 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( isShowSummary = false } }else{ + if(msgBoxBean.type == MsgBoxType.V2X){ + //鹰眼650需求,不再展示气泡态V2X消息 + return@post + } showData(msgBoxBean) CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt index 2183bb7ebc..45ecdb4cb4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt @@ -70,8 +70,7 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { UiThreadHandler.post({ if(category == MsgCategory.NOTICE){ - if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X - || msgBoxList.type == MsgBoxType.OBU){ + if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.OBU){ if(isCacheMsg){ //将消息缓存到未播放列表等待小智语音播放完成后取出播放 MsgBoxConfig.unPlayList.add(msgBoxList) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationAdapter.kt new file mode 100644 index 0000000000..8737101e5f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationAdapter.kt @@ -0,0 +1,105 @@ +package com.mogo.eagle.core.function.hmi.ui.notice.exploration + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.animation.LinearInterpolator +import android.widget.ImageView +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.notice.AutoExplorationEntity +import com.mogo.eagle.core.function.hmi.R + +/** + * 自动探查适配器 + * 鹰眼650需求 + */ +class AutomaticExplorationAdapter(val context: Context,val user: Int): RecyclerView.Adapter() { + + private var data: List ?= null + private var completeListener: CompleteListener ?= null + + fun setData(data: List){ + this.data = data + notifyDataSetChanged() + } + + fun setListener(listener: CompleteListener){ + completeListener = listener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExplorationHolder { + return if(user == 0){ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_auto_exploration, parent, false) + ExplorationHolder(view) + }else{ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_auto_exploration_p, parent, false) + ExplorationHolder(view) + } + } + + override fun getItemCount() = data?.size ?: 0 + + override fun onBindViewHolder(holder: ExplorationHolder, position: Int) { + data?.let { + val entity = it[position] + holder.tvExplorationContent.text = entity.explorationContent + if(user == 0){ + holder.ivExplorationLoading.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_exploration_loading + )) + }else{ + holder.ivExplorationLoading.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_exploration_loading_p + )) + } + val rotationAnim = ObjectAnimator.ofFloat(holder.ivExplorationLoading, "rotation", 0f, 360f) + rotationAnim.repeatCount = entity.explorationDuration.toInt()/1000 + rotationAnim.repeatMode = ValueAnimator.RESTART + rotationAnim.duration = 1000 + rotationAnim.interpolator = LinearInterpolator() + rotationAnim.addListener(object: AnimatorListenerAdapter(){ + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + completeListener?.onComplete(entity) + if(user == 0){ + holder.ivExplorationLoading.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_exploration_done + )) + }else{ + holder.ivExplorationLoading.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.icon_exploration_done_p + )) + } + } + }) + rotationAnim.start() + } + } + + class ExplorationHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var ivExplorationLoading: ImageView = itemView.findViewById(R.id.ivExplorationLoading) + var tvExplorationContent: TextView = itemView.findViewById(R.id.tvExplorationContent) + } + + interface CompleteListener{ + fun onComplete(entity: AutoExplorationEntity) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt new file mode 100644 index 0000000000..74b91d1a30 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt @@ -0,0 +1,258 @@ +package com.mogo.eagle.core.function.hmi.ui.notice.exploration + +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.os.CountDownTimer +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.animation.LinearInterpolator +import android.widget.ImageView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.autopilot.AutopilotSummaryInfo +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.notice.AutoExplorationEntity +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.ThreadUtils + + +/** + * 自动探查 + * 鹰眼6.5.0需求 + */ +open class AutomaticExplorationView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IViewControlListener { + + private var user = 0 + private var ivClose: ImageView ?= null //关闭按钮 + private var ivScan: ImageView ?= null //扫描视图 + private var rvExplorationList: RecyclerView ?= null + private var automaticExplorationAdapter: AutomaticExplorationAdapter ?= null + private var rotationAnim: ObjectAnimator ?= null + private var showViewTimer: CountDownTimer ?= null //展示自动探查倒计时 + private var isCountingDown: Boolean = false //是否处于倒计时中 + private var hasOrder: Boolean = false // 车当前是否有订单 + + companion object { + private const val TAG = "AutomaticExplorationView" + private const val EXPLORATION_HIDE_TIME = 5000L //探查完毕后,5秒关闭弹窗 + private const val EXPLORATION_SHOW_TIME = 300000L //距离用户在触发上一次事件播报的时间5分钟后,自动触发常规道路情况检测 + } + + init { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.AutomaticExplorationView) + user = typedArray.getInt(R.styleable.AutomaticExplorationView_explorationUser,0) + typedArray.recycle() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if(user == 0){ + LayoutInflater.from(context).inflate(R.layout.view_automatic_exploration, this, true) + }else{ + LayoutInflater.from(context).inflate(R.layout.view_automatic_exploration_p, this, true) + } + initEvent() + CallerMsgBoxListenerManager.addListener(TAG,this) + CallerHmiViewControlListenerManager.addListener(TAG,this) + } + + private fun showAutoExploration(){ + ThreadUtils.runOnUiThread { + this@AutomaticExplorationView.visibility = View.VISIBLE + initData() + } + } + + private fun initEvent(){ + ivClose = findViewById(R.id.ivClose) + ivScan = findViewById(R.id.ivScan) + //隐藏自动探索视图 + ivClose?.setOnClickListener { + rotationAnim?.cancel() + this.visibility = View.GONE + //重新开始下一轮展示倒计时 + cancelTimer() + if(hasOrder){ + startShowTimer() + } + } + rvExplorationList = findViewById(R.id.rvExplorationList) + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + automaticExplorationAdapter = AutomaticExplorationAdapter(context,user) + rvExplorationList?.adapter = automaticExplorationAdapter + rvExplorationList?.layoutManager = linearLayoutManager + } + + /** + * 开始倒计时 + */ + fun startShowTimer(){ + if(!isCountingDown){ + ThreadUtils.runOnUiThread { + if(showViewTimer == null){ + showViewTimer = object: CountDownTimer(EXPLORATION_SHOW_TIME,EXPLORATION_SHOW_TIME){ + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + Log.i("OchAutomaticExplorationView","onFinish showAutoExploration") + if(hasOrder){ + showAutoExploration() + } + isCountingDown = false + } + } + } + isCountingDown = true + showViewTimer?.start() + } + } + } + + /** + * 设置当前订单状态 + * @param orderStatus true有订单;false没有订单 + */ + fun currentOrderStatus(orderStatus: Boolean){ + hasOrder = orderStatus + } + + private fun initData() { + val dataList = ArrayList(7) + dataList.add(AutoExplorationEntity("当前道路事件分析",2000L,false)) + dataList.add(AutoExplorationEntity("前方车辆",2000L,false)) + dataList.add(AutoExplorationEntity("两侧车辆",2600L,false)) + dataList.add(AutoExplorationEntity("后方车辆",3000L,false)) + dataList.add(AutoExplorationEntity("前方路口车辆流速分析",4000L,false)) + dataList.add(AutoExplorationEntity("前方路口行人/非机动车分析",4300L,false)) + dataList.add(AutoExplorationEntity("路侧视频分析",5000L,false)) + automaticExplorationAdapter?.setListener(object: AutomaticExplorationAdapter.CompleteListener{ + override fun onComplete(entity: AutoExplorationEntity) { + var allComplete = true //所有探查项目都探查完毕 + dataList.forEach { + if(it.explorationContent == entity.explorationContent){ + it.explorationComplete = true + } + if(!it.explorationComplete){ + allComplete = false + } + } + if(allComplete){ + //停止左上角扫描动画 + rotationAnim?.cancel() + //语音播放,只在司机端播放 + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + AIAssist.getInstance(context).speakTTSVoice("道路畅通一切正常蘑菇型车助手将持续守候您的出行") + } + //5秒后关闭弹窗 + val hideViewTimer =object: CountDownTimer(EXPLORATION_HIDE_TIME,EXPLORATION_HIDE_TIME){ + override fun onTick(millisUntilFinished: Long) { + + } + + override fun onFinish() { + //隐藏自动探查视图 + ThreadUtils.runOnUiThread { + this@AutomaticExplorationView.visibility = View.GONE + } + if(hasOrder){ + //重新开始下一轮展示倒计时 + startShowTimer() + } + } + } + hideViewTimer.start() + } + } + + }) + automaticExplorationAdapter?.setData(dataList) + //每出现一次自动探查,增加相应的服务次数 + //道路信息提醒次数 + AutopilotSummaryInfo.infoTipNum += 9 + //车辆行为提醒次数 + AutopilotSummaryInfo.vehicleTipNum += 13 + //弱势参与者提醒次数 + AutopilotSummaryInfo.vulnerableTipNum += 4 + //消除安全风险隐患次数 + AutopilotSummaryInfo.dangerNum += 24 + //启动扫描 + ivScan?.let { + rotationAnim = ObjectAnimator.ofFloat(it, "rotation", 0f, 360f) + rotationAnim?.repeatCount = ValueAnimator.INFINITE + rotationAnim?.repeatMode = ValueAnimator.RESTART + rotationAnim?.duration = 2000 + rotationAnim?.interpolator = LinearInterpolator() + rotationAnim?.start() + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxListenerManager.removeListener(TAG) + CallerHmiViewControlListenerManager.removeListener(TAG) + cancelTimer() + } + + /** + * 距离用户在触发上一次事件播报的时间5分钟后,自动触发常规道路情况检测 + */ + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + if(category == MsgCategory.NOTICE){ + if(msgBoxList.type == MsgBoxType.V2X){ + //重置倒计时时长 + cancelTimer() + if(hasOrder){ + startShowTimer() + } + } + } + } + + /** + * 取消倒计时 + */ + fun cancelTimer(){ + showViewTimer?.cancel() + showViewTimer = null + isCountingDown = false + } + + + override fun v2xEventVisible(v: Int, tag: String) { + super.v2xEventVisible(v, tag) + if(v == View.VISIBLE){ + //如果当前探查是出于显示状态,则取消动画,并且隐藏 + if(this@AutomaticExplorationView.visibility == View.VISIBLE){ + rotationAnim?.cancel() + this@AutomaticExplorationView.visibility = View.GONE + } + //重新开始下一轮展示倒计时 + cancelTimer() + if(hasOrder){ + startShowTimer() + } + } + } + + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/TrafficLightPromptView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/TrafficLightPromptView.kt new file mode 100644 index 0000000000..6cf7f76452 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/TrafficLightPromptView.kt @@ -0,0 +1,257 @@ +package com.mogo.eagle.core.function.hmi.ui.notice.traffic + +import android.content.Context +import android.os.Handler +import android.os.Message +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import com.mogo.eagle.core.data.enums.TrafficLightEnum +import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener +import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.widget.TypefaceTextView +import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler + +/** + * 融合红绿灯变灯提示 + * 鹰眼650需求 + */ +class TrafficLightPromptView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoTrafficLightListener { + + companion object { + private const val TAG = "TrafficLightPromptView" + } + + private var user = 0 //使用方,driver:0 passenger:1 + private var tvPromptTitle: TextView ?= null + private var tvPromptContent: TextView ?= null + private var tvTrafficNum: TypefaceTextView ?= null + private var tvTrafficNumDecimal: TypefaceTextView ?= null + private val LIGHT_UPDATE = 6501 + private val LIGHT_HIDE = 6502 + private val LIGHT_INTERRUPT = 6503 + private var currentLightState = TrafficLightEnum.BLACK //当前灯态 + private var currentLightDuration = 0f //当前灯态倒计时 + + + init { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TrafficLightPromptView) + user = typedArray.getInt(R.styleable.TrafficLightPromptView_promptUser,0) + typedArray.recycle() + } + + // 维护一个线程定时轮询数据进行地图绘制 + private val mLightHandler: Handler = + object : Handler(WorkThreadHandler.newInstance("TrafficLightPromptView").looper){ + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + when(msg.what){ + LIGHT_UPDATE->{ + ThreadUtils.runOnUiThread{ + if(currentLightDuration >= 0.1f){ + //每次收到数据减少0.1秒 + currentLightDuration -= 0.1f + tvTrafficNum?.text = "${currentLightDuration.toInt()}." + tvTrafficNumDecimal?.text = (currentLightDuration*100 - currentLightDuration.toInt()*100).toInt().toString() + sendEmptyMessageDelayed(LIGHT_UPDATE, 100L) + }else{ + //将数据置为0展示,且发送隐藏窗口命令 + tvTrafficNum?.text = "0." + tvTrafficNumDecimal?.text = "00" + sendEmptyMessageDelayed(LIGHT_HIDE, 100L) + } + } + } + LIGHT_HIDE->{ + hideCurrentView() + } + LIGHT_INTERRUPT->{ + if(msg.obj == currentLightDuration){ + sendEmptyMessageDelayed(LIGHT_UPDATE, 100L) + }else{ + val msgInterrupt= Message() + msgInterrupt.what = LIGHT_INTERRUPT + msgInterrupt.obj = currentLightDuration + sendMessageDelayed(msgInterrupt,200) + } + } + } + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if(user == 0){ + LayoutInflater.from(context).inflate(R.layout.view_traffic_light_prompt, this, true) + tvPromptTitle = findViewById(R.id.tvPromptTitle) + }else{ + LayoutInflater.from(context).inflate(R.layout.view_traffic_light_prompt_p, this, true) + } + tvPromptContent = findViewById(R.id.tvPromptContent) + tvTrafficNum = findViewById(R.id.tvTrafficNum) + tvTrafficNumDecimal = findViewById(R.id.tvTrafficNumDecimal) + CallerTrafficLightListenerManager.addListener(TAG, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerTrafficLightListenerManager.removeListener(TAG) + } + + private fun hideCurrentView(){ + ThreadUtils.runOnUiThread{ + if(this@TrafficLightPromptView.visibility == View.VISIBLE){ + this@TrafficLightPromptView.visibility = GONE + } + } + } + + + /** + * 红绿灯额外提示框 + * @param currentState 当前灯态 + * @param currentDuration 当前灯态倒计时 + */ + override fun onShowTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float) { + super.onShowTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) + ThreadUtils.runOnUiThread { + if(this@TrafficLightPromptView.visibility == View.GONE && currentDuration < 1){ + return@runOnUiThread + } + if(currentDuration < 5){ + //当前灯态倒计时时间小于5秒,展示提示窗 + updateTrafficLight(currentState, currentDuration,nextState) + if(currentLightState != currentState){ + currentLightState = currentState + } + currentLightDuration = currentDuration + }else { + //当前灯态大于等于5秒,且灯态发生变化,此时应该将倒计时渐变为0,之后关闭提示窗 + if(currentState != currentLightState){ + mLightHandler.sendEmptyMessage(LIGHT_UPDATE) + currentLightState = currentState + }else{ + hideCurrentView() + } + } + } + } + + /** + * 更新当前红绿灯提示框信息 + */ + private fun updateTrafficLight(currentState: TrafficLightEnum, currentDuration: Float, nextState: TrafficLightEnum){ + ThreadUtils.runOnUiThread { + when(currentState){ + TrafficLightEnum.GREEN->{ + if(this@TrafficLightPromptView.visibility == View.GONE){ + this@TrafficLightPromptView.visibility = View.VISIBLE + val msg= Message() + msg.what = LIGHT_INTERRUPT + msg.obj = currentDuration + mLightHandler.sendMessageDelayed(msg,200) + } + if(user == 0){ + tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_green)) + tvTrafficNumDecimal?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_green)) + }else{ + tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_green_p)) + tvTrafficNumDecimal?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_green_p)) + } + } + TrafficLightEnum.RED->{ + if(this@TrafficLightPromptView.visibility == View.GONE){ + this@TrafficLightPromptView.visibility = View.VISIBLE + val msg= Message() + msg.what = LIGHT_INTERRUPT + msg.obj = currentDuration + mLightHandler.sendMessageDelayed(msg,200) + } + if(user == 0){ + tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_red)) + tvTrafficNumDecimal?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_red)) + }else{ + tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_red_p)) + tvTrafficNumDecimal?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_red_p)) + } + } + TrafficLightEnum.YELLOW->{ + if(this@TrafficLightPromptView.visibility == View.GONE){ + this@TrafficLightPromptView.visibility = View.VISIBLE + val msg= Message() + msg.what = LIGHT_INTERRUPT + msg.obj = currentDuration + mLightHandler.sendMessageDelayed(msg,200) + } + if(user == 0){ + tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_yellow)) + tvTrafficNumDecimal?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_yellow)) + }else{ + tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_yellow_p)) + tvTrafficNumDecimal?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_yellow_p)) + } + } + TrafficLightEnum.BLACK->{ + this@TrafficLightPromptView.visibility = View.GONE + mLightHandler.removeMessages(LIGHT_INTERRUPT) + } + } + if(currentDuration>0 && currentDuration<5){ + tvTrafficNum?.text = "${currentDuration.toInt()}." + tvTrafficNumDecimal?.text = (currentDuration*100 - currentDuration.toInt()*100).toInt().toString() + }else{ + tvTrafficNum?.text = "0." + tvTrafficNumDecimal?.text = "00" + this@TrafficLightPromptView.visibility = View.GONE + } + when(nextState){ + TrafficLightEnum.GREEN->{ + if(user == 0){ + //司机端提示 + tvPromptTitle?.text = "即将绿灯" + tvPromptContent?.text = "请准备出发" + }else{ + //乘客端提示 + tvPromptContent?.text = "即将绿灯,请准备出发" + } + } + TrafficLightEnum.RED->{ + if(user == 0){ + //司机端提示 + tvPromptTitle?.text = "即将红灯" + tvPromptContent?.text = "请减速慢行" + }else{ + //乘客端提示 + tvPromptContent?.text = "即将红灯,请减速慢行" + } + } + TrafficLightEnum.YELLOW->{ + if(user == 0){ + //司机端提示 + tvPromptTitle?.text = "即将黄灯" + tvPromptContent?.text = "请减速慢行" + }else{ + //乘客端提示 + tvPromptContent?.text = "即将红灯,请减速慢行" + } + } + TrafficLightEnum.BLACK->{ + this@TrafficLightPromptView.visibility = View.GONE + } + } + } + } + +} \ No newline at end of file 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 df1965b8e1..175f8700f2 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 @@ -72,6 +72,7 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigList import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.call.obu.CallerObuConnectListenerManager @@ -100,6 +101,7 @@ import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.map.uicontroller.VisualAngleMode.* import com.mogo.test.crashreport.CrashReportConstants import com.mogo.test.crashreport.ITestCrashReportProvider +import com.zhidaoauto.map.data.road.RoadCross import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.service.chain.ChainLog import kotlinx.android.synthetic.main.view_debug_setting.view.* @@ -1378,6 +1380,15 @@ internal class DebugSettingView @JvmOverloads constructor( tbRouteDynamicEffect.isChecked = HmiBuildConfig.isShowRouteStrategy tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> HmiBuildConfig.isShowRouteStrategy = isChecked + CallerDevaToolsManager.setRouteDynamicColorEnable(isChecked) + } + + /** + * 通过公交站计算范围边界点 面板控制 + */ + tbBusStationStrategyBorderPoint.isChecked = HmiBuildConfig.isShowBusStationStrategyBorderPoint + tbBusStationStrategyBorderPoint.setOnCheckedChangeListener { _, isChecked -> + HmiBuildConfig.isShowBusStationStrategyBorderPoint = isChecked } btnThresholdDefine.setOnClickListener { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt index 368e2d6a61..735f3dc67d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt @@ -33,6 +33,7 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.tools.SweeperModeChangedConfirmDialog import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction +import com.mogo.eagle.core.function.hmi.ui.utils.SOPAnalyticsManager.clickEventAnalytics import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.vehicle.SweeperVehicleConfigUtils @@ -142,6 +143,7 @@ internal class SOPSettingView @JvmOverloads constructor( scV2XSwitch.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.v2xMainSwitch = isChecked hmiAction("SOP V2X总开关, ", isChecked) + clickEventAnalytics("V2X总开关",isChecked) if (isChecked) { //V2N总开关 scV2NSwitch.isChecked = FunctionBuildConfig.v2nMainSwitch @@ -190,6 +192,7 @@ internal class SOPSettingView @JvmOverloads constructor( //绿波通行(默认关闭) scGreenWaveSop.isEnabled = FunctionBuildConfig.v2nMainSwitch scV2NSwitch.setOnCheckedChangeListener { compoundButton, isChecked -> + clickEventAnalytics("V2N总开关",isChecked) if (isChecked) { //V2N新链路 scNewV2NData.isChecked = FunctionBuildConfig.isNewV2NData @@ -242,6 +245,7 @@ internal class SOPSettingView @JvmOverloads constructor( scRunRedLightSop.isEnabled = HmiBuildConfig.isShowObuV2iView scObuWeaknessTrafficSop.isEnabled = HmiBuildConfig.isShowObuV2iView scV2ISwitch.setOnCheckedChangeListener { compoundButton, isChecked -> + clickEventAnalytics("V2I总开关",isChecked) if (isChecked) { //V2I场景进PNC scV2iPnc.isChecked = FunctionBuildConfig.isV2IPnc @@ -288,6 +292,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("V2N新链路",isChecked) hmiAction("SOP 是否是V2N新链路(云->工控机->App)", isChecked) FunctionBuildConfig.isNewV2NData = isChecked @@ -304,6 +309,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("V2N场景进PNC",isChecked) hmiAction("SOP V2N场景进PNC, ", isChecked) CallerAutoPilotControlManager.sendV2nToPncCmd(isChecked) FunctionBuildConfig.isV2NPnc = isChecked @@ -315,6 +321,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("绿波通行",isChecked) hmiAction("SOP obu绿波通行, ", isChecked) HmiBuildConfig.isShowGreenWaveView = isChecked if (HmiBuildConfig.isShowGreenWaveView) { @@ -336,6 +343,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("V2I场景进PNC",isChecked) hmiAction("SOP V2I场景进PNC, ", isChecked) CallerAutoPilotControlManager.sendV2iToPncCmd(isChecked) FunctionBuildConfig.isV2IPnc = isChecked @@ -347,6 +355,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("闯红灯预警",isChecked) hmiAction("SOP obu闯红灯预警, ", isChecked) HmiBuildConfig.isShowRunRedLightView = isChecked if (HmiBuildConfig.isShowRunRedLightView) { @@ -368,6 +377,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("路侧弱势交通参与者",isChecked) hmiAction("SOP obu弱势交通控制, ", isChecked) HmiBuildConfig.isShowObuWeaknessTrafficView = isChecked } @@ -378,6 +388,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("V2V总开关",isChecked) hmiAction("SOP obuV2V开关, ", isChecked) HmiBuildConfig.isShowObuV2vView = isChecked } @@ -389,6 +400,7 @@ internal class SOPSettingView @JvmOverloads constructor( if (!compoundButton.isPressed) { return@setOnCheckedChangeListener } + clickEventAnalytics("OBU总开关",isChecked) hmiAction("SOP OBU控制总开关, ", isChecked) if (isChecked) { CallerObuApiManager.resetObuIpAddress(MogoObuConst.OBU_DEFAULT_IP) @@ -408,6 +420,7 @@ internal class SOPSettingView @JvmOverloads constructor( scMarkingObstacles.isChecked = FunctionBuildConfig.isPNCWarning scMarkingObstacles.setOnCheckedChangeListener { _, isChecked -> hmiAction("SOP 危险障碍物颜色标记开关, ", isChecked) + clickEventAnalytics("危险障碍物颜色标记",isChecked) FunctionBuildConfig.isPNCWarning = isChecked } if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { @@ -418,7 +431,9 @@ internal class SOPSettingView @JvmOverloads constructor( scRouteDynamicEffect.isChecked = HmiBuildConfig.isShowRouteStrategy scRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> hmiAction("SOP 引导线动态效果, ", isChecked) + clickEventAnalytics("引导线动态效果",isChecked) HmiBuildConfig.isShowRouteStrategy = isChecked + CallerDevaToolsManager.setRouteDynamicColorEnable(isChecked) } //点云效果 @@ -440,6 +455,7 @@ internal class SOPSettingView @JvmOverloads constructor( CallerMapUIServiceManager.getMapUIController()?.setIsDrawPointCloud(isChecked) CallerSopSettingManager.invokePointCloudListener(isChecked) hmiAction("SOP 是否渲染点云数据, ", isChecked) + clickEventAnalytics("点云效果",isChecked) } //自车光圈 @@ -460,6 +476,7 @@ internal class SOPSettingView @JvmOverloads constructor( return@setOnCheckedChangeListener } FunctionBuildConfig.isDisplayAnimEnable = isChecked + clickEventAnalytics("自车光圈",isChecked) } } @@ -474,6 +491,7 @@ internal class SOPSettingView @JvmOverloads constructor( return@setOnCheckedChangeListener } hmiAction("SOP 演示模式开关, ", !FunctionBuildConfig.isDemoMode) + clickEventAnalytics("美化模式",isChecked) FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) CallerHmiViewControlListenerManager.invokeFuncMode( @@ -496,6 +514,7 @@ internal class SOPSettingView @JvmOverloads constructor( scShowBagRecordWindow.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isShowBagRecordWindow = isChecked hmiAction("SOP 是否展示录包弹窗, ", isChecked) + clickEventAnalytics("录包弹窗",isChecked) } //接管提醒 @@ -503,6 +522,7 @@ internal class SOPSettingView @JvmOverloads constructor( scTakeOverRemind.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isTakeoverRemind = isChecked hmiAction("SOP 是否展示接管提醒, ", isChecked) + clickEventAnalytics("接管提醒",isChecked) } } @@ -517,6 +537,7 @@ internal class SOPSettingView @JvmOverloads constructor( hmiAction("SOP 绕障类功能开关, ", isChecked) CallerAutoPilotControlManager.sendDetouring(isChecked) FunctionBuildConfig.isDetouring = isChecked + clickEventAnalytics("绕障类功能",isChecked) } // 雨天模式,上一次勾选的数据 @@ -526,6 +547,7 @@ internal class SOPSettingView @JvmOverloads constructor( return@setOnCheckedChangeListener } hmiAction("SOP 雨天模式开关, ", isChecked) + clickEventAnalytics("雨天模式",isChecked) FunctionBuildConfig.isRainMode = isChecked CallerAutoPilotControlManager.setRainMode(isChecked) CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked) @@ -542,6 +564,7 @@ internal class SOPSettingView @JvmOverloads constructor( FunctionBuildConfig.isWeakNetSlowDown = isChecked CallerAutoPilotControlManager.sendWeakNetSlowDown(isChecked) hmiAction("SOP 弱网减速停车, ", isChecked) + clickEventAnalytics("弱网减速停车",isChecked) } //故障减速停车 @@ -550,6 +573,7 @@ internal class SOPSettingView @JvmOverloads constructor( FunctionBuildConfig.isFaultSlowDown = isChecked CallerAutoPilotControlManager.sendBreakdownSlowDown(isChecked) hmiAction("SOP 故障减速停车, ", isChecked) + clickEventAnalytics("故障减速停车",isChecked) } //融合模式 rgFusionMode.setOnCheckedChangeListener { _, p1 -> @@ -576,6 +600,7 @@ internal class SOPSettingView @JvmOverloads constructor( } } hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) + clickEventAnalytics("融合模式",true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) } @@ -609,6 +634,7 @@ internal class SOPSettingView @JvmOverloads constructor( ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置失败") hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败") } + clickEventAnalytics("变道速度阈值",true) } ivSpeedOverTakeReduce.setOnClickListener { @@ -639,6 +665,7 @@ internal class SOPSettingView @JvmOverloads constructor( ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置失败") hmiAction("SOP 超车目标障碍物速度阈值设置", "失败") } + clickEventAnalytics("超车速度阈值",true) } if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { @@ -668,6 +695,7 @@ internal class SOPSettingView @JvmOverloads constructor( scTrafficLight.isChecked = !HmiBuildConfig.isShowTrafficLightView scTrafficLight.setOnCheckedChangeListener { _, isChecked -> hmiAction("SOP 红绿灯标识开关, ", isChecked) + clickEventAnalytics("红绿灯标识",isChecked) if (isChecked) { CallerHmiManager.showTrafficLightView() } else { @@ -679,6 +707,7 @@ internal class SOPSettingView @JvmOverloads constructor( scCarUnionTrafficLight.isChecked = HmiBuildConfig.isShowCarSourceTrafficLightView scCarUnionTrafficLight.setOnCheckedChangeListener { _, isChecked -> hmiAction("SOP 红绿灯车端来源标识开关, ", isChecked) + clickEventAnalytics("红绿灯车端融合标识",isChecked) HmiBuildConfig.isShowCarSourceTrafficLightView = isChecked } @@ -686,6 +715,7 @@ internal class SOPSettingView @JvmOverloads constructor( scConnectionSwitch.isChecked = HmiBuildConfig.isShowConnectionProgressView scConnectionSwitch.setOnCheckedChangeListener { _, isChecked -> hmiAction("SOP 系统启动状态展示, ", isChecked) + clickEventAnalytics("系统启动状态展示",isChecked) HmiBuildConfig.isShowConnectionProgressView = isChecked CallerHmiViewControlListenerManager.updateConnectionProgressView(isChecked) } @@ -694,6 +724,7 @@ internal class SOPSettingView @JvmOverloads constructor( scSpeedLimit.isChecked = HmiBuildConfig.isShowLimitingVelocityView scSpeedLimit.setOnCheckedChangeListener { _, isChecked -> hmiAction("SOP 限速标识开关, ", isChecked) + clickEventAnalytics("限速标识",isChecked) if (isChecked) { HmiBuildConfig.isShowLimitingVelocityView = true CallerHmiViewControlListenerManager.invokeVisible( @@ -713,6 +744,7 @@ internal class SOPSettingView @JvmOverloads constructor( scIPCReport.isChecked = FunctionBuildConfig.isReportWarning scIPCReport.setOnCheckedChangeListener { _, isChecked -> hmiAction("SOP 是否开启异常上报, ", isChecked) + clickEventAnalytics("异常上报提示",isChecked) FunctionBuildConfig.isReportWarning = isChecked } @@ -728,6 +760,7 @@ internal class SOPSettingView @JvmOverloads constructor( } else { CallerHmiManager.hidM1360LookAround() } + clickEventAnalytics("360环视",isChecked) } it.isChecked = CallerHmiManager.isM1360LookAroundShowing() } @@ -760,6 +793,7 @@ internal class SOPSettingView @JvmOverloads constructor( } CallerHmiManager.setTaxiUnmanedDriverLineRoutingVerifyMode(false) } + clickEventAnalytics("自主算路验证模式",isChecked) } it.isChecked = CallerHmiManager.isTaxiUnmanedDriverLineRoutingVerifyMode() } else { @@ -783,6 +817,7 @@ internal class SOPSettingView @JvmOverloads constructor( it.setOnCheckedChangeListener { _, isChecked -> CallerLogger.d(TAG, "发送开关数据:${isChecked}到乘客屏") CallerTelematicManager.sendMsgToAllClients(TelematicConstant.WEATHER_SWITCH_STATUS, (if (isChecked) "1" else "0").toByteArray()) + clickEventAnalytics("天气效果开关",isChecked) } } } @@ -821,6 +856,7 @@ internal class SOPSettingView @JvmOverloads constructor( }) confirmDialog.showSweeperModeChangeConfirmDialog() } + clickEventAnalytics("清扫云控业务",isChecked) } } else { switchView.isEnabled = false @@ -849,6 +885,7 @@ internal class SOPSettingView @JvmOverloads constructor( CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(5) } } + clickEventAnalytics("Taxi无人化演练任务拉取时间间隔",true) } rgPullTime.visibility = if(AppIdentityModeUtils.isTaxiDriver(FunctionBuildConfig.appIdentityMode)) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/SOPAnalyticsManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/SOPAnalyticsManager.kt new file mode 100644 index 0000000000..bb0aaa0bc2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/SOPAnalyticsManager.kt @@ -0,0 +1,55 @@ +package com.mogo.eagle.core.function.hmi.ui.utils + +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.utilcode.util.AppUtils + +/** + * 运营面板埋点统计管理 + */ +object SOPAnalyticsManager { + private const val sopButtonClick = "sop_button_click" + + private const val eventParamButtonName = "buttonName" //开关名称 + private const val eventParamButtonStatus = "buttonStatus" //开关状态 + private const val eventParamPlateNumber = "plateNumber" //车牌号 + private const val eventParamCarSn = "carSn" //鹰眼SN + private const val eventParamMapVersion = "mapVersion" //工控机版本 + private const val eventParamEyeVersion = "eyeVersion" //鹰眼版本 + + /** + * 运营面板开关点击状态统计 + * @param buttonName 开关名称 + * @param buttonStatus 开关状态 + * @param plateNumber 车牌号 + * @param carSn 鹰眼SN + * @param mapVersion 工控机版本 + * @param eyeVersion 鹰眼版本 + */ + private fun realSOPButtonEvent(buttonName: String,buttonStatus: Boolean,plateNumber: String, + carSn: String,mapVersion: String,eyeVersion: String){ + val clickButtonParams = HashMap() + clickButtonParams[eventParamButtonName] = buttonName + clickButtonParams[eventParamButtonStatus] = buttonStatus + clickButtonParams[eventParamPlateNumber] = plateNumber + clickButtonParams[eventParamCarSn] = carSn + clickButtonParams[eventParamMapVersion] = mapVersion + clickButtonParams[eventParamEyeVersion] = eyeVersion + MogoAnalyticUtils.track(sopButtonClick,clickButtonParams) + } + + /** + * 运营面板开关点击状态统计 + * @param buttonName 开关名称 + * @param buttonStatus 开关状态 + */ + fun clickEventAnalytics(buttonName: String, buttonStatus: Boolean){ + realSOPButtonEvent(buttonName,buttonStatus, AppConfigInfo.plateNumber, + SharedPrefsMgr.getInstance().sn, + CallerAutoPilotStatusListenerManager.getDockerVersion() ?: "", + AppUtils.getAppVersionName()) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/RoadV2NEventLivePlayView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/RoadV2NEventLivePlayView.kt new file mode 100644 index 0000000000..114e4e3499 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/RoadV2NEventLivePlayView.kt @@ -0,0 +1,258 @@ +package com.mogo.eagle.core.function.hmi.ui.v2n + +import android.content.Context +import android.text.TextUtils +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.animation.AnimationUtils +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.business.roadcross.net.NDERoadV2NModel +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventWindowView.Companion.trackEvent +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.shuyu.gsyvideoplayer.model.VideoOptionModel +import com.shuyu.gsyvideoplayer.player.IjkPlayerManager +import com.shuyu.gsyvideoplayer.player.PlayerFactory +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import kotlinx.android.synthetic.main.hmi_view_v2n_event_live_play.view.ivLoading +import kotlinx.android.synthetic.main.hmi_view_v2n_event_live_play.view.ivTipLogo +import kotlinx.android.synthetic.main.hmi_view_v2n_event_live_play.view.svpPlayer +import kotlinx.android.synthetic.main.hmi_view_v2n_event_live_play.view.tvTipContent +import kotlinx.android.synthetic.main.hmi_view_v2n_event_live_play.view.v2nEventLivePlayContainer +import tv.danmaku.ijk.media.player.IjkMediaPlayer + +class RoadV2NEventLivePlayView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + companion object { + const val TAG = "V2NEventLivePlayView" + } + + private val gsyVideoOptionBuilder by lazy { + GSYVideoOptionBuilder() + } + + // 是否播放成功 + private var isPlaySuccess = false + + private val videoLoadingAnimation by lazy { + AnimationUtils.loadAnimation(context, R.anim.loading_rotate_animation); + } + + private val isPassengerScreen by lazy { + AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + } + + init { + LayoutInflater.from(context).inflate(R.layout.hmi_view_v2n_event_live_play, this, true) + initView() + } + + private fun initView() { + //初始化播放器 + val list: MutableList = ArrayList() + list.add(VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "reconnect", 3)) + GSYVideoManager.instance().optionModelList = list + GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL) + PlayerFactory.setPlayManager(IjkPlayerManager::class.java) + svpPlayer.setPlayListener(object : SimpleVideoPlayer.PlayListener { + override fun onPlayEvent(event: Int) { + CallerLogger.d("${SceneConstant.M_HMI}$TAG", "onPlayEvent: event is:$event") + when (event) { + SimpleVideoPlayer.PLAY_EVT_PLAY_LOADING -> { + // 会出现临时中断后又可以继续播放,需要停掉倒计时 + if (videoLoadingAnimation.hasStarted()) { + videoLoadingAnimation.cancel() + } + } + + SimpleVideoPlayer.PLAY_EVT_PLAY_BEGIN -> { + CallerLogger.w( + "${SceneConstant.M_HMI}$TAG", + "播放视频成功, event is:$event" + ) + showVideoAfterLoad() + isPlaySuccess = true + } + + else -> { + CallerLogger.w( + "${SceneConstant.M_HMI}$TAG", + "播放视频异常, event is:$event" + ) + stopLoading() + showPlayFail() + } + } + } + }) + + if (isPassengerScreen) { + v2nEventLivePlayContainer.background = ContextCompat.getDrawable( + context, + R.drawable.bg_v2n_event_live_play_passenger + ) + ivTipLogo.setImageResource(R.drawable.hmi_v2n_event_mogo_logo_passenger) + } else { + v2nEventLivePlayContainer.background = ContextCompat.getDrawable( + context, + R.drawable.bg_v2n_event_live_play_driver + ) + ivTipLogo.setImageResource(R.drawable.hmi_v2n_event_mogo_logo_driver) + } + } + + /** + * 开始查询拉流url + */ + fun startRoadCameraLive(eventId:String, + cameraId: String, lon: Double, lat: Double, cityCode: String + ) { + CallerLogger.i( + "${SceneConstant.M_HMI}$TAG", + "startRoadCameraLive, eventId=$eventId, cameraId=$cameraId, lon=$lon, lat=$lat, cityCode=$cityCode" + ) + trackEvent("startRoadCameraLive --> eventId=$eventId, cameraId=$cameraId, lon=$lon, lat=$lat, cityCode=$cityCode") + startLoading() + NDERoadV2NModel.ndeRoadV2NModel.querySingleCameraLiveByCameraIp(cameraId, lon, lat, cityCode, + onSuccess = { + startPlay(it?.liveUrl) + trackEvent("startRoadCameraLive --> success, eventId=$eventId, liveUrl=${it?.liveUrl}") + }, + onError = { + CallerLogger.e( + "${SceneConstant.M_HMI}$TAG", + "查询视频播放地址error, msg=$it" + ) + trackEvent("startRoadCameraLive --> error, eventId=$eventId, msg=$it") + stopLoading() + showPlayFail() + + //startPlay("https://video.zhidaozhixing.com/hy/LI_008_070.flv?txSecret=28ece9ad0bd67d06a7d391ed42264a99&txTime=66922502") + //startPlay("https://video.zhidaozhixing.com/hy/LI_007_040.flv?txSecret=3586b5516f8d65b9110ab6c3f8e76b98&txTime=669B5E8D") + }) + } + + /** + * 结束拉流 + */ + fun stopRoadCameraLive() { + CallerLogger.i( + "${SceneConstant.M_HMI}$TAG", + "stopRoadCameraLive" + ) + trackEvent("stopRoadCameraLive --> ") + stopLoading() + try { + svpPlayer?.gsyVideoManager?.stop() + NDERoadV2NModel.ndeRoadV2NModel.cancelRequest("querySingleCameraLiveByCameraIp") + } catch (e: Exception) { + CallerLogger.w( + "${SceneConstant.M_HMI}$TAG", + "onDetachedFromWindow, e=${e.message}" + ) + trackEvent("stopRoadCameraLive --> e=${e.message}") + } + } + + private fun startPlay(flvUrl: String?) { + trackEvent("startPlay --> flvUrl=${flvUrl}") + if (TextUtils.isEmpty(flvUrl)) { + CallerLogger.e( + "${SceneConstant.M_HMI}$TAG", + "播放视频数据异常, flvUrl=${flvUrl}" + ) + trackEvent("startPlay --> 播放视频数据异常, flvUrl=${flvUrl}") + stopLoading() + showPlayFail() + return + } + CallerLogger.i( + "${SceneConstant.M_HMI}$TAG", + "开始加载视频, flvUrl=${flvUrl}" + ) + trackEvent("startPlay --> 开始加载视频, flvUrl=${flvUrl}") + flvUrl?.also { + startLoadVideo(it) + } + } + + /** + * 展示 加载中 + */ + private fun startLoading() { + tvTipContent.visibility = View.GONE + ivTipLogo.visibility = View.GONE + svpPlayer.visibility = View.GONE + + ivLoading.setImageDrawable( + ContextCompat.getDrawable( + context, R.drawable.hmi_v2n_event_video_play_loading_passenger + ) + ) + ivLoading.startAnimation(videoLoadingAnimation) + ivLoading.visibility = View.VISIBLE + } + + /** + * 停止 加载中 + */ + private fun stopLoading() { + videoLoadingAnimation?.cancel() + ivLoading.visibility = View.GONE + } + + /** + * 展示 加载失败 + */ + private fun showPlayFail() { + tvTipContent.visibility = View.GONE + ivTipLogo.visibility = View.VISIBLE + svpPlayer.visibility = View.GONE + ivLoading.visibility = View.GONE + } + + /** + * 加载视频流 + */ + private fun startLoadVideo(flvUrl: String) { + gsyVideoOptionBuilder + .setUrl(flvUrl) + .setCacheWithPlay(false) + .setAutoFullWithSize(false) + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) + .setPlayTag(TAG) + .build(svpPlayer) + svpPlayer.startButton.performClick() + } + + /** + * 加载完后 展示播放画面 + */ + private fun showVideoAfterLoad() { + tvTipContent.visibility = View.GONE + ivTipLogo.visibility = View.GONE + svpPlayer.visibility = View.VISIBLE + ivLoading.visibility = View.GONE + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + stopRoadCameraLive() + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/RoadV2NEventWindowView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/RoadV2NEventWindowView.kt new file mode 100644 index 0000000000..70dc99933d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/RoadV2NEventWindowView.kt @@ -0,0 +1,384 @@ +package com.mogo.eagle.core.function.hmi.ui.v2n + +import android.content.Context +import android.graphics.Color +import android.graphics.Typeface +import android.text.TextUtils +import android.util.AttributeSet +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.widget.RelativeLayout +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.v2x.RoadV2NEventType +import com.mogo.eagle.core.data.v2x.RoadV2NEventWindowBean +import com.mogo.eagle.core.function.api.hmi.v2n.IRoadV2NEventWindowListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.glide.GlideImageLoader +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 kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.containerEventContent +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.containerIconHint +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.containerImageAndLiveVideo +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.contentImageView +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.ivClose +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.ivV2XImage +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.livePlayView +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.roundRoadV2NEventContainer +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.tvV2XHintContent +import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.tvV2XTimeStr +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import me.jessyan.autosize.utils.AutoSizeUtils + +/** + * 路侧V2N事件通用弹框 + */ +class RoadV2NEventWindowView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IRoadV2NEventWindowListener { + + companion object { + const val TAG = "RoadV2NEventWindowView" + const val ANALYTICS_KEY = "hmi_road_event_window_view" + + fun trackEvent(msg: String) { + ProcessLifecycleOwner.get().lifecycleScope.launch(Dispatchers.IO) { + val map: MutableMap = HashMap() + map["msg"] = msg + MogoAnalyticUtils.track( + ANALYTICS_KEY, + map + ) + } + CallerLogger.i(TAG, msg) + } + } + + private val isPassengerScreen by lazy { + AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + } + + private var currentEventUUID: String = "" + + init { + LayoutInflater.from(context).inflate(R.layout.hmi_view_road_v2n_event_window, this, true) + } + + private val dismissRunnable = Runnable { + CallerLogger.i(TAG, "dismissRunnable") + visibility = View.GONE + CallerHmiViewControlListenerManager.invokeV2XEvent(View.GONE) + } + + private fun initView() { + if (isPassengerScreen) { + val layoutParam = + roundRoadV2NEventContainer.layoutParams as ConstraintLayout.LayoutParams + layoutParam.width = AutoSizeUtils.dp2px( + context, (580 + 37 + 37).toFloat() + ) + layoutParam.height = ConstraintLayout.LayoutParams.WRAP_CONTENT + layoutParam.setMargins( + 0, + 0, + AutoSizeUtils.dp2px(context, 40f - 37f), + 0 + ) + roundRoadV2NEventContainer.layoutParams = layoutParam + roundRoadV2NEventContainer.background = ContextCompat.getDrawable( + context, + R.drawable.hmi_v2n_event_bg_passenger + ) + //乘客屏 背景图 右边带了 37px 渐变 + val padding = AutoSizeUtils.dp2px(context, 37f) + roundRoadV2NEventContainer.setPadding(padding, padding, padding, padding) + + val containerIconHintLayoutParams = + containerIconHint.layoutParams as ConstraintLayout.LayoutParams + containerIconHintLayoutParams.width = LayoutParams.MATCH_PARENT + containerIconHintLayoutParams.height = LayoutParams.WRAP_CONTENT + containerIconHintLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 36f - 19.4f), //乘客屏icon ivV2XImage带了白边, 高度、margin需要计算调整 + AutoSizeUtils.dp2px(context, 30f - 10.7f), + AutoSizeUtils.dp2px(context, 36f), + 0 + ) + containerIconHint.layoutParams = containerIconHintLayoutParams + + val ivV2XImageLayoutParams = ivV2XImage.layoutParams as RelativeLayout.LayoutParams + ivV2XImageLayoutParams.width = + AutoSizeUtils.dp2px( + context, + 69f + 14f + 14f + ) //乘客屏icon ivV2XImage带了白边, 高度、margin需要计算调整 + ivV2XImageLayoutParams.height = + AutoSizeUtils.dp2px( + context, + 69f + 14f + 14f + ) //乘客屏icon ivV2XImage带了白边, 高度、margin需要计算调整 + ivV2XImage.layoutParams = ivV2XImageLayoutParams + + val tvV2XHintContentLayoutParams = + tvV2XHintContent.layoutParams as RelativeLayout.LayoutParams + tvV2XHintContentLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 30f - 19.7f), //乘客屏icon ivV2XImage带了白边, 高度、margin需要计算调整 + AutoSizeUtils.dp2px(context, (34f + 14f) - (46f / 2f)), + AutoSizeUtils.dp2px(context, 5f), + 0 + ) + tvV2XHintContent.layoutParams = tvV2XHintContentLayoutParams + tvV2XHintContent.setTextColor(Color.parseColor("#131415")) + tvV2XHintContent.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + AutoSizeUtils.dp2px(context, 28f).toFloat() + ) + tvV2XHintContent.setTypeface(null, Typeface.NORMAL) + tvV2XHintContent.setPadding(0, 0, 0, AutoSizeUtils.dp2px(context, 28f)) + + val containerImageAndLiveVideoLayoutParams = + containerImageAndLiveVideo.layoutParams as ConstraintLayout.LayoutParams + containerImageAndLiveVideoLayoutParams.width = AutoSizeUtils.dp2px(context, 480f + 18f) //乘客屏视频加载里面背景切图包含了白边 + containerImageAndLiveVideoLayoutParams.height = AutoSizeUtils.dp2px(context, 280f) + containerImageAndLiveVideoLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 40f), + AutoSizeUtils.dp2px(context, 0f), //乘客屏icon ivV2XImage带了白边 + AutoSizeUtils.dp2px(context, 44f), + 0 + ) + containerImageAndLiveVideo.layoutParams = containerImageAndLiveVideoLayoutParams + + contentImageView.setRadius(16f) + + val tvV2XTimeStrLayoutParams = + tvV2XTimeStr.layoutParams as ConstraintLayout.LayoutParams + tvV2XTimeStrLayoutParams.width = LayoutParams.MATCH_PARENT + tvV2XTimeStrLayoutParams.height = LayoutParams.WRAP_CONTENT + tvV2XTimeStrLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 40f), + AutoSizeUtils.dp2px(context, 19f), + AutoSizeUtils.dp2px(context, 40f), + AutoSizeUtils.dp2px(context, 19f) + ) + tvV2XTimeStr.layoutParams = tvV2XTimeStrLayoutParams + tvV2XTimeStr.setTextColor(Color.parseColor("#131415")) + tvV2XTimeStr.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + AutoSizeUtils.dp2px(context, 24f).toFloat() + ) + + ivClose.setImageResource(R.drawable.hmi_v2n_event_icon_close_passenger) + ivClose.setPadding( + AutoSizeUtils.dp2px(context, 2f), + AutoSizeUtils.dp2px(context, 2f), + AutoSizeUtils.dp2px(context, 2f), + AutoSizeUtils.dp2px(context, 2f) + ) + val ivCloseLayoutParams = ivClose.layoutParams as ConstraintLayout.LayoutParams + ivCloseLayoutParams.width = AutoSizeUtils.dp2px(context, 32f) + ivCloseLayoutParams.height = AutoSizeUtils.dp2px(context, 32f) + ivCloseLayoutParams.setMargins( + 0, + AutoSizeUtils.dp2px(context, 24f), + AutoSizeUtils.dp2px(context, 24f), + 0 + ) + ivClose.layoutParams = ivCloseLayoutParams + + containerEventContent.requestLayout() + roundRoadV2NEventContainer.requestLayout() + } else { + val layoutParam = + roundRoadV2NEventContainer.layoutParams as ConstraintLayout.LayoutParams + layoutParam.width = AutoSizeUtils.dp2px(context, (600 + 0 + 0).toFloat()) + layoutParam.height = ConstraintLayout.LayoutParams.WRAP_CONTENT + roundRoadV2NEventContainer.layoutParams = layoutParam + roundRoadV2NEventContainer.background = + ContextCompat.getDrawable(context, R.drawable.hmi_v2n_event_bg_driver) + val padding = AutoSizeUtils.dp2px(context, 0f) + roundRoadV2NEventContainer.setPadding(padding, padding, padding, padding) + + val containerIconHintLayoutParams = + containerIconHint.layoutParams as ConstraintLayout.LayoutParams + containerIconHintLayoutParams.width = LayoutParams.MATCH_PARENT + containerIconHintLayoutParams.height = LayoutParams.WRAP_CONTENT + containerIconHintLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 30f - 22f), + AutoSizeUtils.dp2px(context, 31f - 15f), + AutoSizeUtils.dp2px(context, 30f - 22f), + 0 + ) + containerIconHint.layoutParams = containerIconHintLayoutParams + + val ivV2XImageLayoutParams = ivV2XImage.layoutParams as RelativeLayout.LayoutParams + ivV2XImageLayoutParams.width = AutoSizeUtils.dp2px(context, 84f + 22f + 22f) + ivV2XImageLayoutParams.height = AutoSizeUtils.dp2px(context, 84f + 15f + 29f) + ivV2XImage.layoutParams = ivV2XImageLayoutParams + + val tvV2XHintContentLayoutParams = + tvV2XHintContent.layoutParams as RelativeLayout.LayoutParams + tvV2XHintContentLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 20f - 22f), + AutoSizeUtils.dp2px(context, (42f + 15f) - (46f / 2f)), + AutoSizeUtils.dp2px(context, 5f), + 0 + ) + tvV2XHintContent.layoutParams = tvV2XHintContentLayoutParams + tvV2XHintContent.setTextColor(Color.parseColor("#FFFFFF")) + tvV2XHintContent.setTypeface(null, Typeface.BOLD) + tvV2XHintContent.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + AutoSizeUtils.dp2px(context, 32f).toFloat() + ) + + val containerImageAndLiveVideoLayoutParams = + containerImageAndLiveVideo.layoutParams as ConstraintLayout.LayoutParams + containerImageAndLiveVideoLayoutParams.width = AutoSizeUtils.dp2px(context, 540f) + containerImageAndLiveVideoLayoutParams.height = AutoSizeUtils.dp2px(context, 300f) + containerImageAndLiveVideoLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 30f), + AutoSizeUtils.dp2px(context, 30f - 29f), + AutoSizeUtils.dp2px(context, 30f), + 0 + ) + containerImageAndLiveVideo.layoutParams = containerImageAndLiveVideoLayoutParams + + contentImageView.setRadius(12f) + + val tvV2XTimeStrLayoutParams = + tvV2XTimeStr.layoutParams as ConstraintLayout.LayoutParams + tvV2XTimeStrLayoutParams.width = LayoutParams.MATCH_PARENT + tvV2XTimeStrLayoutParams.height = LayoutParams.WRAP_CONTENT + tvV2XTimeStrLayoutParams.setMargins( + AutoSizeUtils.dp2px(context, 29f), + AutoSizeUtils.dp2px(context, 25f), + AutoSizeUtils.dp2px(context, 29f), + AutoSizeUtils.dp2px(context, 30f) + ) + tvV2XTimeStr.layoutParams = tvV2XTimeStrLayoutParams + tvV2XTimeStr.setTextColor(Color.parseColor("#66FFFFFF")) + tvV2XTimeStr.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + AutoSizeUtils.dp2px(context, 22f).toFloat() + ) + + ivClose.setImageResource(R.drawable.hmi_v2n_event_icon_close_driver) + ivClose.setPadding(0, 0, 0, 0) + val ivCloseLayoutParams = ivClose.layoutParams as ConstraintLayout.LayoutParams + ivCloseLayoutParams.width = AutoSizeUtils.dp2px(context, 50f) + ivCloseLayoutParams.height = AutoSizeUtils.dp2px(context, 50f) + ivCloseLayoutParams.setMargins(0, 0, 0, 0) + ivClose.layoutParams = ivCloseLayoutParams + + containerEventContent.requestLayout() + roundRoadV2NEventContainer.requestLayout() + } + + ivClose.setOnClickListener { + visibility = View.GONE + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerRoadV2NEventWindowListenerManager.addListener(TAG, this) + initView() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerRoadV2NEventWindowListenerManager.removeListener(TAG) + } + + override fun show(dataBean: RoadV2NEventWindowBean) { + trackEvent("show --> ${dataBean.toString()}") + val canShowV2NEventWindowView = CallerHmiViewControlListenerManager.getMainPageVisible() + if (!canShowV2NEventWindowView) { + trackEvent("show --> 当前不在高精地图页面,跳过") + return + } + val lineId = CallerAutoPilotStatusListenerManager.getLineId() + if (lineId <= 0) { + trackEvent("show --> 当前无订单,跳过") + return + } + UiThreadHandler.removeCallbacks(dismissRunnable) + UiThreadHandler.post { + currentEventUUID = dataBean.eventId + ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + context, + dataBean.iconResId + ) + ) + tvV2XHintContent.text = dataBean.hintStr + tvV2XTimeStr.text = + "更新时间:${DateTimeUtils.getTimeText(dataBean.timestamp, DateTimeUtils.HH_mm_ss)}" + if (dataBean.isNeedTTS && !TextUtils.isEmpty(dataBean.ttsStr)) { + AIAssist.getInstance(context) + .speakTTSVoiceWithLevel(dataBean.ttsStr, AIAssist.LEVEL0) + } + when (dataBean.eventType) { + RoadV2NEventType.TEXT -> { + containerImageAndLiveVideo.visibility = View.GONE + contentImageView.visibility = View.GONE + livePlayView.visibility = View.GONE + } + + RoadV2NEventType.IMAGE -> { + containerImageAndLiveVideo.visibility = View.VISIBLE + contentImageView.visibility = View.VISIBLE + livePlayView.visibility = View.GONE + GlideImageLoader.getInstance() + .displayImage(dataBean.contentImageUrl, contentImageView) + } + + RoadV2NEventType.LIVE_VIDEO -> { + containerImageAndLiveVideo.visibility = View.VISIBLE + contentImageView.visibility = View.GONE + livePlayView.visibility = View.VISIBLE + val cityCode = + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode + livePlayView.startRoadCameraLive( + dataBean.eventId, + dataBean.cameraIp, dataBean.lon, dataBean.lat, cityCode + ) + } + } + visibility = View.VISIBLE + bringToFront() + UiThreadHandler.postDelayed(dismissRunnable, 10 * 1000L) + CallerHmiViewControlListenerManager.invokeV2XEvent(View.VISIBLE) + } + } + + override fun dismiss(eventId: String) { + trackEvent("dismiss --> eventId=${eventId}") + UiThreadHandler.post { + if (eventId == currentEventUUID) { + visibility = View.GONE + currentEventUUID = "" + livePlayView.stopRoadCameraLive() + trackEvent("dismiss --> eventId=${eventId}, 执行dismiss") + UiThreadHandler.removeCallbacks(dismissRunnable) + CallerHmiViewControlListenerManager.invokeV2XEvent(View.GONE) + } else { + trackEvent("dismiss --> eventId=${eventId}, 跳过dismiss") + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/net/INDERoadV2NApiService.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/net/INDERoadV2NApiService.kt new file mode 100644 index 0000000000..ee93b9ba92 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/net/INDERoadV2NApiService.kt @@ -0,0 +1,26 @@ +package com.mogo.eagle.core.function.business.roadcross.net + +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.road.RoadCameraLive +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +const val QUERY_SINGLE_LIVE = "/abilitySupport/rss/queryLive" + +interface INDERoadV2NApiService { + + /** + * 单ip查询设备直播流与缩略图 + */ + @GET(QUERY_SINGLE_LIVE) + suspend fun querySingleCameraLiveByCameraIp( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Query("ip") ip: String, + @Query("lon") lon: Double, + @Query("lat") lat: Double, + @Query("cityCode") cityCode: String + ): BaseResponse + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/net/NDERoadV2NModel.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/net/NDERoadV2NModel.kt new file mode 100644 index 0000000000..18f45bbc78 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/net/NDERoadV2NModel.kt @@ -0,0 +1,56 @@ +package com.mogo.eagle.core.function.business.roadcross.net + +import com.mogo.commons.constants.HostConst +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.road.RoadCameraLive +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.cancel +import com.mogo.eagle.core.network.request +import com.mogo.eagle.core.utilcode.util.Md5Util +import java.util.Locale + +class NDERoadV2NModel private constructor() { + + companion object { + val ndeRoadV2NModel by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + NDERoadV2NModel() + } + } + + private fun getNetWorkApi(baseUrl: String = HostConst.getNDEHost()): INDERoadV2NApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(INDERoadV2NApiService::class.java) + } + + fun querySingleCameraLiveByCameraIp( + cameraIp: String, + lon: Double, + lat: Double, + cityCode: String, + onSuccess: ((RoadCameraLive?) -> Unit), + onError: ((String) -> Unit) + ) { + request>("querySingleCameraLiveByCameraIp") { + loader { + apiCall { + val time = System.currentTimeMillis().toString() + val md5String = "${QUERY_SINGLE_LIVE.uppercase(Locale.getDefault())}$time" + getNetWorkApi().querySingleCameraLiveByCameraIp( + Md5Util.getMD5Result(md5String), time, cameraIp, lon, lat, cityCode + ) + } + } + onSuccess { + onSuccess.invoke(it.result) + } + onError { + onError.invoke(it.message.toString()) + } + } + } + + fun cancelRequest(tag: String) { + cancel(tag) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt index e65679db5c..e8829662b7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt @@ -43,9 +43,10 @@ class TakeOverView @JvmOverloads constructor( LayoutInflater.from(context).inflate(R.layout.view_take_over, this, true) } + @Volatile private var takeOver = false + @Volatile private var isParallel: Boolean = false //是否是平行驾驶 - @Volatile private var canSound = true //M1是否可以进行语音提示 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt index c8d9d7023c..e80206edee 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt @@ -84,6 +84,9 @@ class ConnectionProcessView @JvmOverloads constructor( CallerAutoPilotStatusListenerManager.removeListener(TAG) //隐藏视图 dismissConnectionView() + //如果已经开始连接倒计时,则取消Timer + connectSSMTimer?.cancel() + autopilotReadyTimer?.cancel() } } @@ -212,14 +215,16 @@ class ConnectionProcessView @JvmOverloads constructor( * 展示域控连接成功视图 */ private fun showIPCConnectSuccessView(){ - ThreadUtils.runOnUiThread { - this.visibility = View.VISIBLE - pbConnectionProgress.setPadding(5,3,5,8) - pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_progress_style) - pbConnectionProgress.progress = 25 - tvConnectionStatus.setPadding(0,0,0,10) - tvConnectionStatus.text = "系统启动中..." - clConnectionTip.visibility = View.GONE + if(HmiBuildConfig.isShowConnectionProgressView){ + ThreadUtils.runOnUiThread { + this.visibility = View.VISIBLE + pbConnectionProgress.setPadding(5,3,5,8) + pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_progress_style) + pbConnectionProgress.progress = 25 + tvConnectionStatus.setPadding(0,0,0,10) + tvConnectionStatus.text = "系统启动中..." + clConnectionTip.visibility = View.GONE + } } } @@ -227,14 +232,16 @@ class ConnectionProcessView @JvmOverloads constructor( * 展示SSM连接成功视图 */ private fun showSSMConnectSuccessView(){ - ThreadUtils.runOnUiThread{ - this.visibility = View.VISIBLE - pbConnectionProgress.setPadding(5,3,5,8) - pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_progress_style) - pbConnectionProgress.progress = 50 - tvConnectionStatus.setPadding(0,0,0,10) - tvConnectionStatus.text = "系统启动中..." - clConnectionTip.visibility = View.GONE + if(HmiBuildConfig.isShowConnectionProgressView){ + ThreadUtils.runOnUiThread{ + this.visibility = View.VISIBLE + pbConnectionProgress.setPadding(5,3,5,8) + pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_progress_style) + pbConnectionProgress.progress = 50 + tvConnectionStatus.setPadding(0,0,0,10) + tvConnectionStatus.text = "系统启动中..." + clConnectionTip.visibility = View.GONE + } } } @@ -242,14 +249,16 @@ class ConnectionProcessView @JvmOverloads constructor( * 展示冷启动成功视图 */ private fun showAutopilotReadySuccessView(){ - ThreadUtils.runOnUiThread{ - this.visibility = View.VISIBLE - pbConnectionProgress.setPadding(0,0,0,0) - pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_success_style) - pbConnectionProgress.progress = 100 - tvConnectionStatus.setPadding(0,0,0,0) - tvConnectionStatus.text = "系统启动成功" - clConnectionTip.visibility = View.GONE + if(HmiBuildConfig.isShowConnectionProgressView){ + ThreadUtils.runOnUiThread{ + this.visibility = View.VISIBLE + pbConnectionProgress.setPadding(0,0,0,0) + pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_success_style) + pbConnectionProgress.progress = 100 + tvConnectionStatus.setPadding(0,0,0,0) + tvConnectionStatus.text = "系统启动成功" + clConnectionTip.visibility = View.GONE + } } } @@ -257,16 +266,18 @@ class ConnectionProcessView @JvmOverloads constructor( * 展示域控连接失败视图 */ private fun showIPCConnectFailView(){ - ThreadUtils.runOnUiThread { - this.visibility = View.VISIBLE - pbConnectionProgress.setPadding(0,0,0,0) - pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_fail_style) - pbConnectionProgress.progress = 25 - tvConnectionStatus.setPadding(0,0,0,0) - tvConnectionStatus.text = "系统启动异常" - clConnectionTip.visibility = View.VISIBLE - tvConnectionTipTitle.text = "Telematics连接异常" - tvConnectionTipContent.text = "建议重启车辆并上报问题" + if(HmiBuildConfig.isShowConnectionProgressView){ + ThreadUtils.runOnUiThread { + this.visibility = View.VISIBLE + pbConnectionProgress.setPadding(0,0,0,0) + pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_fail_style) + pbConnectionProgress.progress = 25 + tvConnectionStatus.setPadding(0,0,0,0) + tvConnectionStatus.text = "系统启动异常" + clConnectionTip.visibility = View.VISIBLE + tvConnectionTipTitle.text = "Telematics连接异常" + tvConnectionTipContent.text = "建议重启车辆并上报问题" + } } } @@ -274,16 +285,18 @@ class ConnectionProcessView @JvmOverloads constructor( * 展示SSM连接失败视图 */ private fun showSSMConnectFailView(){ - ThreadUtils.runOnUiThread { - this.visibility = View.VISIBLE - pbConnectionProgress.setPadding(0,0,0,0) - pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_fail_style) - pbConnectionProgress.progress = 50 - tvConnectionStatus.setPadding(0,0,0,0) - tvConnectionStatus.text = "系统启动异常" - clConnectionTip.visibility = View.VISIBLE - tvConnectionTipTitle.text = "SSM连接异常" - tvConnectionTipContent.text = "建议重启车辆并上报问题" + if(HmiBuildConfig.isShowConnectionProgressView){ + ThreadUtils.runOnUiThread { + this.visibility = View.VISIBLE + pbConnectionProgress.setPadding(0,0,0,0) + pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_fail_style) + pbConnectionProgress.progress = 50 + tvConnectionStatus.setPadding(0,0,0,0) + tvConnectionStatus.text = "系统启动异常" + clConnectionTip.visibility = View.VISIBLE + tvConnectionTipTitle.text = "SSM连接异常" + tvConnectionTipContent.text = "建议重启车辆并上报问题" + } } } @@ -291,16 +304,18 @@ class ConnectionProcessView @JvmOverloads constructor( * 展示SSM冷启动失败视图 */ private fun showAutopilotReadyFailView(){ - ThreadUtils.runOnUiThread { - this.visibility = View.VISIBLE - pbConnectionProgress.setPadding(0,0,0,0) - pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_fail_style) - pbConnectionProgress.progress = 100 - tvConnectionStatus.setPadding(0,0,0,0) - tvConnectionStatus.text = "系统启动异常" - clConnectionTip.visibility = View.VISIBLE - tvConnectionTipTitle.text = "系统冷启动异常" - tvConnectionTipContent.text = "建议重启车辆并上报问题" + if(HmiBuildConfig.isShowConnectionProgressView){ + ThreadUtils.runOnUiThread { + this.visibility = View.VISIBLE + pbConnectionProgress.setPadding(0,0,0,0) + pbConnectionProgress.progressDrawable = ContextCompat.getDrawable(context, R.drawable.connection_fail_style) + pbConnectionProgress.progress = 100 + tvConnectionStatus.setPadding(0,0,0,0) + tvConnectionStatus.text = "系统启动异常" + clConnectionTip.visibility = View.VISIBLE + tvConnectionTipTitle.text = "系统冷启动异常" + tvConnectionTipContent.text = "建议重启车辆并上报问题" + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt new file mode 100644 index 0000000000..dfb443576e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt @@ -0,0 +1,273 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +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.mogo.eagle.core.data.autopilot.AutopilotSummaryInfo +import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.TrafficLightEnum +import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler + +/** + * 融合红绿灯View + * 鹰眼6.5.0版本需求 + */ +class FusionTrafficLightView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoTrafficLightListener { + + companion object { + private const val TAG = "FusionTrafficLightView" + } + + private var user = 0 //使用方,driver:0 passenger:1 + private var mCurrentLightId = TrafficLightEnum.BLACK + private var totalDuration = 0 //一轮灯态的总时长 + private var currentAngle = 0f //指针指向角度 + + private var fusionTrafficLightNum: TypefaceTextView ?=null //融合红绿灯倒计时 + private var fusionTrafficLightState: ImageView ?= null //融合红绿灯灯态 + private var fusionTrafficLightScale: ImageView ?= null //融合红绿灯刻度 + private var fusionTrafficLightPointer: ImageView ?= null //融合红绿灯指针 + private var fusionTrafficLightProportion: ProportionChartView ?= null //占比进度条 + + private var currentLightState = TrafficLightEnum.BLACK //当前灯态 + private var currentLightDuration = 0 //当前灯态倒计时 + private var previousLightStatus = TrafficLightEnum.BLACK //上一帧灯态 + private var previousLightDuration = 0 //上一帧灯态倒计时 + + private var redLightRoundNum = 0 //当前路口红灯出现的轮数 + private var greenLightRoundNum = 0 //当前路口绿灯出现的轮数 + private var yellowLightRoundNum = 0 //当前路口黄灯出现的轮数 + + init { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.FusionTrafficLightView) + user = typedArray.getInt(R.styleable.FusionTrafficLightView_fusionLightUser,0) + typedArray.recycle() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if(user == 0){ + LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light, this, true) + }else{ + LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light_p, this, true) + } + CallerTrafficLightListenerManager.addListener(TAG, this) + fusionTrafficLightNum = findViewById(R.id.fusionTrafficLightNum) + fusionTrafficLightState = findViewById(R.id.fusionTrafficLightState) + fusionTrafficLightScale = findViewById(R.id.fusionTrafficLightScale) + fusionTrafficLightPointer = findViewById(R.id.fusionTrafficLightPointer) + fusionTrafficLightProportion = findViewById(R.id.fusionTrafficLightProportion) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerTrafficLightListenerManager.removeListener(TAG) + } + + /** + * 关闭红绿灯预警展示,并重制灯态 + */ + override fun disableTrafficLight() { + super.disableTrafficLight() + UiThreadHandler.post{ + this@FusionTrafficLightView.visibility = GONE + CallerHmiViewControlListenerManager.invokeV2XEvent(View.GONE, TAG) + //将灯态轮归零 + returnToZero() + resetLight() + } + } + + /** + * 将灯态轮归零 + */ + private fun returnToZero(){ + redLightRoundNum = 0 //当前路口红灯出现的轮数 + greenLightRoundNum = 0 //当前路口绿灯出现的轮数 + yellowLightRoundNum = 0 //当前路口黄灯出现的轮数 + } + + /** + * 重置灯态 + */ + private fun resetLight(){ + currentLightState = TrafficLightEnum.BLACK + currentLightDuration = 0 + previousLightStatus = TrafficLightEnum.BLACK + previousLightDuration = 0 + } + + /** + * 判断是否进入新的一轮灯态 + * @param currentState 当前灯态 + */ + private fun judgeRoundNum(currentState: TrafficLightEnum): Boolean{ + if(currentLightState == currentState){ + return false + }else{ + currentLightState = currentState + when(currentState){ + TrafficLightEnum.RED->{ + redLightRoundNum++ + return redLightRoundNum > greenLightRoundNum && redLightRoundNum > yellowLightRoundNum + } + TrafficLightEnum.GREEN->{ + greenLightRoundNum++ + return greenLightRoundNum > redLightRoundNum && greenLightRoundNum > yellowLightRoundNum + } + TrafficLightEnum.YELLOW->{ + yellowLightRoundNum++ + return yellowLightRoundNum > redLightRoundNum && yellowLightRoundNum > greenLightRoundNum + } + TrafficLightEnum.BLACK->{ + return false + } + } + } + } + + /** + * 展示融合带有下一下二灯态的红绿灯 + * @param currentState 当前灯态 + * @param currentDuration 当前灯态倒计时 + * @param nextState 下一灯态 + * @param nextDuration 下一灯态倒计时 + * @param nextTwoState 下二灯态 + * @param nextTwoDuration 下二灯态倒计时 + * @param lightSource 数据来源 + */ + override fun showFusionTrafficLight( + currentState: TrafficLightEnum, currentDuration: Int, + nextState: TrafficLightEnum, nextDuration: Int, + nextTwoState: TrafficLightEnum, nextTwoDuration: Int, + lightSource: DataSourceType + ) { + super.showFusionTrafficLight(currentState, currentDuration, nextState, + nextDuration, nextTwoState, nextTwoDuration, lightSource) + if(currentLightState == currentState && currentLightDuration == currentDuration){ + return + } + currentLightDuration = currentDuration + ThreadUtils.runOnUiThread { + //如果初次获取的路口灯态倒计时时长小于1秒则返回不处理,灯态进入下一轮灯态开始进行显示 + if(this@FusionTrafficLightView.visibility == View.GONE && currentDuration < 1){ + return@runOnUiThread + } + //兼容融合异常数据,当下一下二灯态时长均大于0时展示 + if(this@FusionTrafficLightView.visibility == View.GONE && (nextDuration == 0) || nextTwoDuration == 0){ + return@runOnUiThread + } + /** + * 如果红绿灯显示过程中遇到突然灯态发生改变即当前灯态未倒计时完成灯态发生变化 + * (正常情况下不会出现此情况,兼容异常状态) + * 重置灯态占比和指针指向 + */ + if(previousLightStatus == TrafficLightEnum.BLACK && previousLightDuration == 0 + && currentState != TrafficLightEnum.BLACK && currentDuration != 0){ + previousLightStatus = currentState + previousLightDuration = currentDuration + }else{ + if((currentState != previousLightStatus && previousLightDuration >1) + || (currentState == previousLightStatus && previousLightDuration < currentDuration)){ + //灯态未倒计时到1,灯态发生变化(正常情况是倒计时到0,考虑到可能存在的异常情况,倒计时到1也算正常) + returnToZero() + resetLight() + }else{ + previousLightStatus = currentState + previousLightDuration = currentDuration + } + } + + + //如果当前红绿灯视图为隐藏状态则设置为显示状态 + if(judgeRoundNum(currentState)){ + if(this@FusionTrafficLightView.visibility == View.GONE){ + this@FusionTrafficLightView.visibility = View.VISIBLE + CallerHmiViewControlListenerManager.invokeV2XEvent(View.VISIBLE, TAG) + AutopilotSummaryInfo.lightServicesNum++ + } + + val colorList = ArrayList() + val durationList = ArrayList() + + colorList.add(currentState) + colorList.add(nextState) + colorList.add(nextTwoState) + + if(currentDuration < 3){ + durationList.add(3) + totalDuration = 3 + nextDuration + nextTwoDuration + currentAngle = 360f/totalDuration*(3-currentDuration) + }else{ + durationList.add(currentDuration) + totalDuration = currentDuration + nextDuration + nextTwoDuration + currentAngle = 0f + } + durationList.add(nextDuration) + durationList.add(nextTwoDuration) + //没轮灯态绘制一次灯态时长比例 + fusionTrafficLightProportion?.updateProportion(durationList,colorList) + }else{ + if(currentAngle < 360f){ + currentAngle += 360f/totalDuration + } + } + + //根据当前灯态设置转盘、刻度、指针背景 + when(currentState){ + TrafficLightEnum.GREEN -> { + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer)) + } + TrafficLightEnum.YELLOW -> { + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer)) + } + else -> { + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer)) + } + } + //更新当前灯态倒计时时间 + if(currentDuration>0){ + fusionTrafficLightNum?.text = currentDuration.toString() + }else{ + fusionTrafficLightNum?.text = "0" + } + //当时间为1开头时时间视觉上看不是左右居中对齐,需要做便宜操作 + if(currentDuration.toString().startsWith("1")){ + val numLayoutParams = fusionTrafficLightNum?.layoutParams as LayoutParams + numLayoutParams.rightMargin = 6 + fusionTrafficLightNum?.layoutParams = numLayoutParams + }else{ + val numLayoutParams = fusionTrafficLightNum?.layoutParams as LayoutParams + numLayoutParams.rightMargin = 0 + fusionTrafficLightNum?.layoutParams = numLayoutParams + } + + //更新指针指向 + val pointerLayoutParams = fusionTrafficLightPointer?.layoutParams as LayoutParams + pointerLayoutParams.circleAngle = currentAngle + fusionTrafficLightPointer?.rotation = currentAngle + fusionTrafficLightPointer?.layoutParams = pointerLayoutParams + } + +} + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ItinerarySummaryDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ItinerarySummaryDialog.kt new file mode 100644 index 0000000000..b7b8215822 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ItinerarySummaryDialog.kt @@ -0,0 +1,149 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.widget.ImageView +import android.widget.TextView +import com.mogo.eagle.core.data.autopilot.AutopilotSummaryInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.view.TravelRealityView +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import me.jessyan.autosize.utils.AutoSizeUtils +import java.util.Random + +/** + * 行程总结View + * 鹰眼6.5.0需求 + */ +open class ItinerarySummaryDialog(context: Context, isDriver: Boolean, theme: Int) : + Dialog(context, theme) { + + private val mContext: Context + private val isDriver: Boolean + + private var ivSummaryClose: ImageView ?= null //关闭弹窗按钮 + private var tvSummaryZhiContent: TextView ?= null //小智总结 + private var tvIntersectionServicesNum: TextView ?= null //全息路口服务次数 + private var tvLightServicesNum: TextView ?= null //路口灯态服务次数 + private var tvInfoTipNum: TextView ?= null //道路信息提醒次数 + private var tvVehicleTipNum: TextView ?= null //车辆行为提醒次数 + private var tvVulnerableTipNum: TextView ?= null //弱势参与者提醒次数 + private var tvDangerNum: TextView ?= null //消除安全风险隐患次数 + private var tvEfficiencyNum: TextView ?= null //通行效率提升 + private var travelRealityView: TravelRealityView ?= null + private val random = Random() + private var mileage: Float = 1000f //总里程 + + init { + this.mContext = context + this.isDriver = isDriver + } + + override fun onCreate(savedInstanceState: Bundle?){ + super.onCreate(savedInstanceState) + val params = window!!.attributes + if(isDriver){ + setContentView(R.layout.dialog_itinerary_summary) + params.height = AutoSizeUtils.dp2px(context,1200f) + params.width = AutoSizeUtils.dp2px(context,2300f) + }else{ + setContentView(R.layout.dialog_itinerary_summary_p) + params.height = AutoSizeUtils.dp2px(context,1170f) + params.width = AutoSizeUtils.dp2px(context,2158f) + } + window!!.attributes = params //向WindowManager设置属性 + setCanceledOnTouchOutside(false) + initEvent() + } + + private fun initEvent(){ + //地图 + travelRealityView = findViewById(R.id.travelRealityView) + travelRealityView?.onCreateView(null) + //关闭Dialog按钮 + ivSummaryClose = findViewById(R.id.ivSummaryClose) + ivSummaryClose?.setOnClickListener { + //关闭弹窗 + dismiss() + } + //全息路口服务次数 + tvIntersectionServicesNum = findViewById(R.id.tvIntersectionServicesNum) + tvIntersectionServicesNum?.text = CallerAutoPilotStatusListenerManager.getRoadCount().toString() + //路口灯态服务次数 + tvLightServicesNum = findViewById(R.id.tvLightServicesNum) + tvLightServicesNum?.text = AutopilotSummaryInfo.lightServicesNum.toString() + //道路信息提醒次数 + tvInfoTipNum = findViewById(R.id.tvInfoTipNum) + AutopilotSummaryInfo.infoTipNum += random.nextInt(7) +2 + tvInfoTipNum?.text = AutopilotSummaryInfo.infoTipNum.toString() + //车辆行为提醒次数 + tvVehicleTipNum = findViewById(R.id.tvVehicleTipNum) + AutopilotSummaryInfo.vehicleTipNum += random.nextInt(7) +2 + tvVehicleTipNum?.text = AutopilotSummaryInfo.vehicleTipNum.toString() + //弱势参与者提醒次数 + tvVulnerableTipNum = findViewById(R.id.tvVulnerableTipNum) + AutopilotSummaryInfo.vulnerableTipNum += random.nextInt(7)+2 + tvVulnerableTipNum?.text = AutopilotSummaryInfo.vulnerableTipNum.toString() + //消除安全风险隐患次数 + tvDangerNum = findViewById(R.id.tvDangerNum) + AutopilotSummaryInfo.dangerNum += random.nextInt(7)+2 + tvDangerNum?.text = AutopilotSummaryInfo.dangerNum.toString() + //通行效率提升:本期为假数据,数据为百分数,值为7-14%之间的随机数,保留小数点后1位 + tvEfficiencyNum = findViewById(R.id.tvEfficiencyNum) + val next: Float= random.nextInt(70).toFloat()/10 + val num = next + 7 + tvEfficiencyNum?.text = num.toString() + //小智总结 + tvSummaryZhiContent = findViewById(R.id.tvSummaryZhiContent) + showSummaryTipContent() + } + + fun setOrderMileage(mileage: Float) { + if(mileage < 1000){ + this.mileage = 1000f + }else{ + this.mileage = mileage + } + if(this.isShowing){ + showSummaryTipContent() + } + } + + private fun showSummaryTipContent(){ + ThreadUtils.runOnUiThread { + val vehicleServiceNum = AutopilotSummaryInfo.infoTipNum+ AutopilotSummaryInfo.vehicleTipNum + AutopilotSummaryInfo.vulnerableTipNum + AutopilotSummaryInfo.lightServicesNum + CallerAutoPilotStatusListenerManager.getRoadCount() + var smartRoadLen = 1000f + try { + smartRoadLen =random.nextFloat()*mileage + }catch (_: Exception){} + val formattedMileage: String = String.format("%.1f", mileage/1000) + val formattedSmartRoadLen: String = String.format("%.1f", smartRoadLen/1000) + if(isDriver){ + tvSummaryZhiContent?.text = "全程 ${formattedMileage}km,智慧道路护航 ${(formattedSmartRoadLen)}km,全息感知覆盖率 ${(smartRoadLen*100/mileage).toInt()}%,车辆服务次数${vehicleServiceNum}次" + }else{ + tvSummaryZhiContent?.text = "旅途全长 $formattedMileage km,全感知覆盖率 ${(smartRoadLen*100/mileage).toInt()}%,车辆服务次数${vehicleServiceNum}次" + } + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + travelRealityView?.onResume() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + travelRealityView?.onPause() + travelRealityView?.onDestroy() + //对本次服务记录清零 + AutopilotSummaryInfo.lightServicesNum = 0 + AutopilotSummaryInfo.infoTipNum = 0 + AutopilotSummaryInfo.vehicleTipNum = 0 + AutopilotSummaryInfo.vulnerableTipNum = 0 + AutopilotSummaryInfo.dangerNum = 0 + CallerAutoPilotStatusListenerManager.resetRoadCount() + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/NoScrollLayoutManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/NoScrollLayoutManager.kt new file mode 100644 index 0000000000..86f2d71623 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/NoScrollLayoutManager.kt @@ -0,0 +1,15 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import androidx.recyclerview.widget.LinearLayoutManager + + +class NoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) { + override fun canScrollVertically(): Boolean { + return false + } + + override fun canScrollHorizontally(): Boolean { + return false + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ProportionChartView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ProportionChartView.java new file mode 100644 index 0000000000..60d526e490 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ProportionChartView.java @@ -0,0 +1,204 @@ +package com.mogo.eagle.core.function.hmi.ui.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.RectF; +import android.graphics.SweepGradient; +import android.util.AttributeSet; +import android.view.View; +import androidx.annotation.Nullable; + +import com.mogo.eagle.core.data.enums.TrafficLightEnum; +import com.mogo.eagle.core.function.hmi.R; + +import java.util.ArrayList; +import java.util.List; + +import me.jessyan.autosize.utils.AutoSizeUtils; + +/** + * 融合红绿灯红、黄、绿时间占比示意View + * 鹰眼6.5.0需求 + */ +public class ProportionChartView extends View { + + private static final int DEFAULT_RING_WIDTH = 8; + private float mRingWidth = 0; + private Paint mRingPaint; + private RectF mRectF; + //红绿灯绿灯、黄灯、红灯灯色时间 + private List proportionList = new ArrayList<>(); + //红绿灯灯态 + private List lightStatusList = new ArrayList<>(); + + //一轮灯态的总时长 + private int totalDuration = 0; + + int[] greenColorArray = new int[]{Color.parseColor("#5EFDE3"),Color.parseColor("#3CCFB9")}; + int[] yellowColorArray = new int[]{Color.parseColor("#FFEA3D"),Color.parseColor("#D49840")}; + int[] redColorArray = new int[]{Color.parseColor("#FF7373"),Color.parseColor("#CB564E")}; + + public ProportionChartView(Context context) { + super(context); + initSize(context); + init(); + } + + public ProportionChartView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initAttr(context, attrs); + initSize(context); + init(); + } + + /** + * 更新红绿灯时间 + * @param durationList 时间列表 + * @param colorList 灯态列表 + */ + public void updateProportion(List durationList, List colorList){ + if(durationList != null && colorList != null){ + this.proportionList = durationList; + totalDuration = 0; + for(int element: proportionList){ + totalDuration += element; + } + this.lightStatusList = colorList; + postInvalidate(); + } + } + + public ProportionChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initAttr(context, attrs); + initSize(context); + init(); + } + + private void initAttr(Context context, AttributeSet attrs){ + if (attrs == null) { + return; + } + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProportionChartView); + int n = array.getIndexCount(); + for (int i = 0; i < n; i++) { + int attr = array.getIndex(i); + if (attr == R.styleable.ProportionChartView_ringWidth) { + mRingWidth = array.getDimension(attr, AutoSizeUtils.dp2px(context, DEFAULT_RING_WIDTH)); + } + } + array.recycle(); + } + + /** + * 初始化Size + * @param context 上下文 + */ + private void initSize(Context context){ + if (mRingWidth == 0) { + mRingWidth = AutoSizeUtils.dp2px(context, AutoSizeUtils.dp2px(context, DEFAULT_RING_WIDTH)); + } + } + + /** + * 初始化画笔 + */ + private void init(){ + mRectF = new RectF(); + mRingPaint = new Paint(); + //抗锯齿 + mRingPaint.setAntiAlias(true); + //防抖动 + mRingPaint.setDither(true); + //仅描边(圆环) + mRingPaint.setStyle(Paint.Style.STROKE); + //圆环宽度 + mRingPaint.setStrokeWidth(mRingWidth); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int size = Math.max(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(widthMeasureSpec)); + setMeasuredDimension(size, size); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + //宽和高分别去掉padding值,取min的一半即圆的半径(这里demo没有用到,可自行做一些其他计算使用) +// mRadius = Math.min(w - getPaddingLeft() - getPaddingRight(), h - getPaddingTop() - getPaddingBottom()) / 2f; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + drawRingView(canvas); + } + + /** + * 画Ring + */ + private void drawRingView(Canvas canvas){ + float sweepAngle = 0f; + float startAngle = -90f; + //矩形坐标 + mRectF.set(getPaddingLeft() + mRingWidth / 2 , getPaddingTop() + mRingWidth / 2 , + getWidth() - getPaddingRight() - mRingWidth / 2, getHeight() - getPaddingBottom() - mRingWidth / 2 ); + + for(int i=0;i { if(trafficLightUser == 1){ @@ -293,7 +315,9 @@ class SingleTrafficLightView @JvmOverloads constructor( }else{ mLightIconIV!!.setBackgroundResource(R.drawable.hmi_lightyellow_nor) } - this@SingleTrafficLightView.visibility = VISIBLE + if(!fusionTrafficLightState){ + this@SingleTrafficLightView.visibility = VISIBLE + } } TrafficLightEnum.GREEN -> { if(trafficLightUser == 1){ @@ -301,7 +325,9 @@ class SingleTrafficLightView @JvmOverloads constructor( }else{ mLightIconIV!!.setBackgroundResource(R.drawable.hmi_light_green_nor) } - this@SingleTrafficLightView.visibility = VISIBLE + if(!fusionTrafficLightState){ + this@SingleTrafficLightView.visibility = VISIBLE + } } else -> this@SingleTrafficLightView.visibility = GONE } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TypefaceTextView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TypefaceTextView.kt new file mode 100644 index 0000000000..b3c876c227 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TypefaceTextView.kt @@ -0,0 +1,39 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import android.graphics.Typeface +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView +import com.mogo.eagle.core.function.hmi.R + +/** + * 融合红绿灯倒计时特定字体TextView + * 鹰眼6.5.0需求 + */ +class TypefaceTextView constructor( + context: Context, + attrs: AttributeSet +) : AppCompatTextView(context, attrs) { + + init { + initTypefaceTextView(context,attrs) + } + + private fun initTypefaceTextView(context: Context, attrs: AttributeSet) { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TypefaceTextView) + val type = typedArray.getInt(R.styleable.TypefaceTextView_textType, 0) + if (type == 0) { + return + } + var typeface: Typeface? = null + when (type) { + 1 -> typeface = Typeface.createFromAsset(context.assets, "DS-DIGI-1.ttf") + 2 -> typeface = Typeface.createFromAsset(context.assets, "DS-DIGIB-2.ttf") + 3 -> typeface = Typeface.createFromAsset(context.assets, "DS-DIGII-3.ttf") + 4 -> typeface = Typeface.createFromAsset(context.assets, "DS-DIGIT-4.ttf") + } + typeface?.let { setTypeface(it) } + typedArray.recycle() + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt index d50e7a398b..b879aa8f0d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt @@ -8,10 +8,8 @@ import android.net.wifi.WifiManager import android.os.Handler import android.os.Message import android.util.AttributeSet -import android.util.Log import android.util.TypedValue import android.view.LayoutInflater -import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener @@ -90,7 +88,6 @@ class WifiStateView @JvmOverloads constructor( wifiHandler = WifiHandler(this) val wifiInfo = wifiManager!!.connectionInfo wifiName = wifiInfo.ssid.replace("\"","") - Log.i("emArrow", "init wifiName: $wifiName") } private val wifiStateReceiver: BroadcastReceiver = object : BroadcastReceiver() { @@ -105,7 +102,6 @@ class WifiStateView @JvmOverloads constructor( } val wifiInfo = wifiManager!!.connectionInfo wifiName = wifiInfo.ssid.replace("\"","") - Log.i("emArrow", "wifiName: $wifiName") level = WifiManager.calculateSignalLevel(wifiInfo.rssi, 5) wifiHandler?.sendEmptyMessage(level) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt index 8eb8f56460..12d2acb53f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt @@ -34,6 +34,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiFloatViewManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.setting.CallerRequestActivityHandleManager import com.mogo.eagle.core.function.call.startup.CallerStartUpManager.initStageTwo import com.mogo.eagle.core.function.hmi.R @@ -356,6 +357,7 @@ open class MainActivity : MvpActivity(), MainView, super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == MainPresenter.MOGO_PERMISSION_REQUEST_CODE) { var isAllGranted = true + var isLocationGranted = true // 判断是否所有的权限都已经授予了 val reasong = StringBuffer() grantResults.forEachIndexed { index, grant -> @@ -377,6 +379,7 @@ open class MainActivity : MvpActivity(), MainView, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION -> { + isLocationGranted = false if(!reasong.contains("定位")){ reasong.append("定位、") } @@ -385,6 +388,9 @@ open class MainActivity : MvpActivity(), MainView, } } } + if (isLocationGranted) { + CallerMapUIServiceManager.getGDLocationServer()?.start(context!!) + } if (isAllGranted) { isFirst = false } else { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/anim/loading_rotate_animation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/anim/loading_rotate_animation.xml new file mode 100644 index 0000000000..8471c84d8b --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/anim/loading_rotate_animation.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_auto_exploration.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_auto_exploration.png new file mode 100644 index 0000000000..76ddfe9c3f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_auto_exploration.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light.png new file mode 100644 index 0000000000..361c0b5947 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light_p.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light_p.png new file mode 100644 index 0000000000..a1c7c05e0a Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light_p.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_itinerary_summary_p.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_itinerary_summary_p.png new file mode 100644 index 0000000000..e94acbd11c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_itinerary_summary_p.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_light_prompt.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_light_prompt.png new file mode 100644 index 0000000000..00e3226db3 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_light_prompt.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_msg_box_v2x.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_msg_box_v2x.png deleted file mode 100644 index d41c75bc33..0000000000 Binary files a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_msg_box_v2x.png and /dev/null differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_summary_zhi_tip.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_summary_zhi_tip.png new file mode 100644 index 0000000000..42466d3d83 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_summary_zhi_tip.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_summary_zhi_tip_p.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_summary_zhi_tip_p.png new file mode 100644 index 0000000000..6a1f79ebe3 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_summary_zhi_tip_p.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_bg_driver.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_bg_driver.png new file mode 100644 index 0000000000..32d41221e1 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_bg_driver.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_bg_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_bg_passenger.png new file mode 100644 index 0000000000..95ee9da77c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_bg_passenger.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_driver.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_driver.png new file mode 100644 index 0000000000..fd167f3a89 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_driver.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_passenger.png new file mode 100644 index 0000000000..9e3b259a2c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_passenger.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_mogo_logo_driver.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_mogo_logo_driver.png new file mode 100644 index 0000000000..ba4d4b56b0 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_mogo_logo_driver.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_mogo_logo_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_mogo_logo_passenger.png new file mode 100644 index 0000000000..785575b64e Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_mogo_logo_passenger.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_video_play_loading_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_video_play_loading_passenger.png new file mode 100644 index 0000000000..cb1c80997c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_video_play_loading_passenger.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_done.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_done.png new file mode 100644 index 0000000000..d09922a80f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_done.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_done_p.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_done_p.png new file mode 100644 index 0000000000..9c514de15d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_done_p.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_lane.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_lane.png new file mode 100644 index 0000000000..99e1736414 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_lane.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_loading.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_loading.png new file mode 100644 index 0000000000..ad2b0c05e1 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_loading.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_loading_p.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_loading_p.png new file mode 100644 index 0000000000..e77f8fb2b5 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_loading_p.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_scan.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_scan.png new file mode 100644 index 0000000000..e0ca60e99b Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_exploration_scan.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png new file mode 100644 index 0000000000..01d57b1544 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_low.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_low.png new file mode 100644 index 0000000000..206e9cb0f0 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_low.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_mid.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_mid.png new file mode 100644 index 0000000000..c783b5da7f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_mid.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green.png new file mode 100644 index 0000000000..6071206af4 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_pointer.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_pointer.png new file mode 100644 index 0000000000..9a284a80df Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_pointer.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_scale.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_scale.png new file mode 100644 index 0000000000..13e2ea7d91 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_scale.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red.png new file mode 100644 index 0000000000..c3be972747 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_pointer.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_pointer.png new file mode 100644 index 0000000000..fce746d7e7 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_pointer.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_scale.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_scale.png new file mode 100644 index 0000000000..c370267671 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_scale.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow.png new file mode 100644 index 0000000000..0fdd26042d Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_pointer.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_pointer.png new file mode 100644 index 0000000000..433c92ebcc Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_pointer.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_scale.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_scale.png new file mode 100644 index 0000000000..2fd84d541b Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_scale.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_scan.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_scan.png new file mode 100644 index 0000000000..8226178c89 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_scan.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_close.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_close.png new file mode 100644 index 0000000000..00901b1045 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_close.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_close_p.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_close_p.png new file mode 100644 index 0000000000..7acdca2329 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_close_p.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_zhi.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_zhi.png new file mode 100644 index 0000000000..82ebca84a2 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_zhi.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_zhi_p.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_zhi_p.png new file mode 100644 index 0000000000..63c32dc184 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_summary_zhi_p.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_vehicle_lane.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_vehicle_lane.png new file mode 100644 index 0000000000..63ef45ff0f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_vehicle_lane.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_close_nor_light.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_close_nor_light.png new file mode 100644 index 0000000000..9e3b259a2c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_close_nor_light.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_driver.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_driver.xml new file mode 100644 index 0000000000..a61893d31d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_driver.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml new file mode 100644 index 0000000000..c62e94d46b --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_hmi_nor_test_light.9.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_hmi_nor_test_light.9.png new file mode 100644 index 0000000000..81acc4e8c0 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_hmi_nor_test_light.9.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_itinerary_summary.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_itinerary_summary.xml new file mode 100644 index 0000000000..2111dab033 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_itinerary_summary.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_light.9.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_light.9.png new file mode 100644 index 0000000000..d1f2517625 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_light.9.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_v2x.9.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_v2x.9.png new file mode 100644 index 0000000000..d9d4a5b2b2 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_v2x.9.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live.png new file mode 100644 index 0000000000..42af8a287b Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_close.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_close.png new file mode 100644 index 0000000000..d592593a94 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_close.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_empty.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_empty.xml new file mode 100644 index 0000000000..8e1b504558 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_empty.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_light_empty.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_light_empty.xml new file mode 100644 index 0000000000..1c02c83dcc --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_live_light_empty.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_logo.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_logo.png new file mode 100644 index 0000000000..77e13291f0 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_logo.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_logo_light.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_logo_light.png new file mode 100644 index 0000000000..785575b64e Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_logo_light.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_xiaozhi.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_xiaozhi.png new file mode 100644 index 0000000000..09be529bb4 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_road_cross_xiaozhi.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_achievement.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_achievement.xml new file mode 100644 index 0000000000..e9ff2ae00a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_achievement.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_achievement_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_achievement_p.xml new file mode 100644 index 0000000000..4b879961f7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_achievement_p.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_service.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_service.xml new file mode 100644 index 0000000000..5f5c8b4fc1 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_service.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_service_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_service_p.xml new file mode 100644 index 0000000000..7963e81783 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_summary_service_p.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_driver.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_driver.xml new file mode 100644 index 0000000000..1b6ba4316d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_driver.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_live_play_driver.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_live_play_driver.xml new file mode 100644 index 0000000000..0ded5f33d0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_live_play_driver.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_live_play_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_live_play_passenger.xml new file mode 100644 index 0000000000..e7f7dab047 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_v2n_event_live_play_passenger.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml new file mode 100644 index 0000000000..8b6f3a410f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml new file mode 100644 index 0000000000..84d954e2d9 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_itinerary_summary.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_itinerary_summary.xml new file mode 100644 index 0000000000..5ef3c11f73 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_itinerary_summary.xml @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_itinerary_summary_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_itinerary_summary_p.xml new file mode 100644 index 0000000000..2ef77eb093 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_itinerary_summary_p.xml @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml new file mode 100644 index 0000000000..ec37040a26 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light_p.xml new file mode 100644 index 0000000000..17d5e4299a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light_p.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_road_v2n_event_window.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_road_v2n_event_window.xml new file mode 100644 index 0000000000..803df04b83 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_road_v2n_event_window.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_v2n_event_live_play.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_v2n_event_live_play.xml new file mode 100644 index 0000000000..e813cb46ce --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_v2n_event_live_play.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration.xml new file mode 100644 index 0000000000..ffe51f23c2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration_p.xml new file mode 100644 index 0000000000..120efa9776 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_auto_exploration_p.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml index 8718a6c212..af6c0e91af 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml index 9b2403e515..59c58fdb9d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml index fb4d2d14fc..9cfb6b9827 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml index 95f88716a2..dd60fb62ea 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml index 9f0199eb80..8f23c77a4a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml @@ -2,7 +2,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml index ed2245fa1f..468e6fd76d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml @@ -2,7 +2,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml index 5aa40ef9ba..884c218e64 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml @@ -2,7 +2,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml index 55ac93d864..3239c78652 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml @@ -2,7 +2,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_automatic_exploration.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_automatic_exploration.xml new file mode 100644 index 0000000000..45d9cb5b07 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_automatic_exploration.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_automatic_exploration_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_automatic_exploration_p.xml new file mode 100644 index 0000000000..e4f0681a80 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_automatic_exploration_p.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml index 7de0b8b8a3..62e838091c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml @@ -80,7 +80,7 @@ style="?android:attr/progressBarStyleSmall" android:layout_width="36dp" android:layout_height="36dp" - android:visibility="gone" + android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 80e571cc34..e250c15a2c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1474,6 +1474,18 @@ android:textOn="关闭「引导线动态效果」" android:textSize="@dimen/dp_24" /> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml new file mode 100644 index 0000000000..860223839a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_road_cross_live.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_road_cross_live.xml new file mode 100644 index 0000000000..af5958a3be --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_road_cross_live.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_road_cross_live_light.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_road_cross_live_light.xml new file mode 100644 index 0000000000..3ce9c47f90 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_road_cross_live_light.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml new file mode 100644 index 0000000000..ddf9505f38 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml new file mode 100644 index 0000000000..2be8eba9ec --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml @@ -0,0 +1,44 @@ + + + + + + + + + + \ No newline at end of file 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 751928af40..32f3b7de6e 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 @@ -118,4 +118,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml index f96150dfd7..b098a18d10 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml @@ -23,6 +23,10 @@ #2C2E30 #2D3E5F #D4D8DC + #50E8E4 + #252B3F + #131415 + #B2BED9 #27FFFFFF #1E111111 #FF213757 @@ -82,4 +86,24 @@ #FF1E32D9 #243959 + #66FFFFFF + #49546A + #FFFFFF + #464646 + #24313E + #2DF0FE + #106FF0 + #6A758D + #42464F + + #131415 + #FF3B2D + #31FF56 + #FFCD3D + #F63C12 + #36DB1C + #FDB700 + + #131415 + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index e2e1dc7e6a..e5762926be 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -100,4 +100,34 @@ 请确认是否要切换清扫业务(切换将自动重启APP)? Taxi无人化演练任务拉取时间间隔 + + + 融合红绿灯灯态 + 融合红绿灯刻度 + 融合红绿灯指针 + + + 行程总结关闭按钮 + 行程总结小智形象图标 + 全息路口服务 + 路口灯态服务 + 道路信息提醒 + 车辆行为提醒 + 弱势参与者提醒 + + % + 消除安全风险隐患 + 通行效率提升 + ‘哪怕百万分之一的几率,交通事故的代价每个家庭都无法承受’ + Powered by 蘑菇交通大模型™ + + + 自动探索扫描 + 自动探索车道线 + 正在为您探查前方道路 + 自动探索关闭按钮 + 自动探索条目图标 + + + 蘑菇为您实时护航中,请放心驾驶! diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/styles.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/styles.xml index 99c0c612b0..7bd309ce51 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/styles.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/styles.xml @@ -88,4 +88,20 @@ @dimen/dp_10 + + + + diff --git a/core/function-impl/mogo-core-function-map/build.gradle b/core/function-impl/mogo-core-function-map/build.gradle index 98174911b9..fc45801307 100644 --- a/core/function-impl/mogo-core-function-map/build.gradle +++ b/core/function-impl/mogo-core-function-map/build.gradle @@ -70,6 +70,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxroomktx implementation rootProject.ext.dependencies.view_model_scope implementation rootProject.ext.dependencies.lifecycle_extension + implementation rootProject.ext.dependencies.androidxrecyclerview implementation project(':foudations:mogo-commons') implementation project(':core:mogo-core-res') diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt index aa9311d344..25cd1cdca7 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt @@ -3,15 +3,21 @@ package com.mogo.eagle.core.function import android.content.Context import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider import com.mogo.eagle.core.function.api.map.roma.IMogoRoma import com.mogo.eagle.core.function.business.MapPointCloudSubscriber import com.mogo.eagle.core.function.business.SpeedLimitDataManager import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager +import com.mogo.eagle.core.function.business.ai.RomaManager +import com.mogo.eagle.core.function.business.ai.RomaManager.Companion.romaManager import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber +import com.mogo.eagle.core.function.business.roadcross.RoadCrossCameraManager import com.mogo.eagle.core.function.business.routeoverlay.MogoRouteOverlayManager +import com.mogo.eagle.core.function.business.trajectoryoverlay.MogoTrajectoryOverlayManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.map.MapDataWrapper @@ -25,17 +31,20 @@ class MapBizProvider :IMoGoFunctionServerProvider, IMogoRoma { MapDataWrapper.init() MapIdentifySubscriber.instance MogoRouteOverlayManager.getInstance().init() + MogoTrajectoryOverlayManager.getInstance().init() MapPointCloudSubscriber.instance SpeedLimitDataManager.getInstance().start() + RoadCrossCameraManager.instance.init(context) if(DeviceUtils.isLenovoModel() || DeviceUtils.isEB5Model()){ //todo 新增稳定设备类型需要添加,目的避免在nuc设备上使用此类功能 + romaManager.init() aiCloudIdentifyDataManager.initServer(AbsMogoApplication.getApp()) } // 视角切换功能初始化,监听路口及停止线回调 CallerVisualAngleManager.init() } - override fun trigger(romaStatus: Boolean) { - aiCloudIdentifyDataManager.trigger(romaStatus) + override fun trigger(roamStatus: Boolean) { + romaManager.trigger(roamStatus) } override fun onDestroy() { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt index 9a844bc788..d904d799ce 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt @@ -1,5 +1,4 @@ package com.mogo.eagle.core.function.angle - import android.content.* import android.os.* import android.util.* @@ -7,27 +6,30 @@ import androidx.lifecycle.* import androidx.lifecycle.Lifecycle.Event import androidx.lifecycle.Lifecycle.Event.ON_DESTROY import com.alibaba.android.arouter.facade.annotation.Route -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.map.* import com.mogo.eagle.core.function.angle.scenes.CrossRoad import com.mogo.eagle.core.function.angle.scenes.Default -import com.mogo.eagle.core.function.angle.scenes.RoadEvent +import com.mogo.eagle.core.function.angle.scenes.Roma import com.mogo.eagle.core.function.api.map.angle.* +import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider.OnMoGoVisualAngleSceneChangeListener import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.DEFAULT +import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.DOWN +import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.UP +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.function.call.map.* -import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener import com.mogo.eagle.core.utilcode.kotlin.* -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.zhidaoauto.map.data.road.RoadCross import com.zhidaoauto.map.data.road.StopLine -import com.zhidaoauto.map.sdk.open.MapAutoApi import com.zhidaoauto.map.sdk.open.common.tools.MapTools import kotlinx.coroutines.* -import java.util.* -import java.util.concurrent.Executors +import kotlinx.coroutines.android.asCoroutineDispatcher +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.* + @Route(path = MogoServicePaths.PATH_VISUAL_ANGLE) class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { @@ -35,43 +37,34 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { private const val TAG = "VisualAngleChange" } - private val triggerLocation = AtomicReference() + private val listeners by lazy { ConcurrentHashMap>() } - private val distanceOfCarToStopLine = AtomicReference(0.0) + private val prevScene by lazy { AtomicReference() } - private val travelled by lazy { AtomicReference(0.0) } - - @Volatile - private var roadEventFlag = false - - /** - * 业务实体,不对外暴露 - * @param target: 目标场景 - * @param isDisplay: 是否正在展示 - * @param triggerTime: 触发时间 - */ - private data class Record(val target: Scene, var isDisplay: Boolean = false, var triggerTime: Long): Comparable { - override fun compareTo(other: Record): Int { - //如果时间一样,优先级越高,越靠近堆顶 - return other.target.priority - target.priority - } - } - - private val queue by lazy { - PriorityQueue() - } - - private val listener = object : OnRoadListener { + private val listener = object : IMoGoMapRoadListener { private val roadId = AtomicReference() private val triggerRoadId = AtomicReference() + @Volatile + private var inCrossRoad = false + @Volatile + private var hasCrossRoad = false + private val distanceOfCarToStopLine = AtomicReference(-1.0) + private val triggerLocation = AtomicReference() + private val travelled by lazy { AtomicReference(0.0) } + + override fun onRoadChange(cross: Boolean, roadCross: RoadCross?) { + super.onRoadChange(cross, roadCross) + inCrossRoad = cross + } override fun onRoadIdInfo(roadId: String) { this.roadId.set(roadId) Log.d(TAG, "-- onRoadIdInfo --: prev: ${this.triggerRoadId.get()} -> curr: $roadId") - val loc = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() var triggerClose = false - val distance = distanceOfCarToStopLine.get() + 5 - if (hasCrossRoad && distance > 0) { + var distance = distanceOfCarToStopLine.get() + if (hasCrossRoad && distance >= 0) { + distance += 5.0 val prev = triggerLocation.get() if (prev != null) { travelled.set(MapTools.distance(loc.longitude, loc.latitude, prev.longitude, prev.latitude) + travelled.get()) @@ -79,30 +72,47 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { } val oldRoadId = triggerRoadId.get() Log.d(TAG, "-- onRoadIdInfo --: travelled --: ${travelled.get()}") - if ((travelled.get() > distance) && oldRoadId != roadId) { - distanceOfCarToStopLine.set(0.0) - hasCrossRoad = false - triggerRoadId.set(null) - travelled.set(0.0) - triggerLocation.set(null) - Log.d(TAG, "-- onRoadIdInfo --: trigger close --") - triggerClose = true + if ((travelled.get() > distance)) { + val inCross = inCrossRoad + Log.d(TAG, "-- onRoadIdInfo --: cross --: $inCross") + if (inCross) { + return + } + if (roadId != "0" && oldRoadId != null && oldRoadId != roadId) { + triggerClose = true + } + if (triggerClose) { + try { + Log.d(TAG, "-- onRoadIdInfo --: trigger close --") + distanceOfCarToStopLine.set(-1.0) + hasCrossRoad = false + triggerRoadId.set(null) + travelled.set(0.0) + triggerLocation.set(null) + } finally { + changeScene(Default()) + } + } } } - if (triggerClose) { - changeAngle(CrossRoad(false)) - } } - override fun onStopLineInfo(info: StopLine) { Log.d(TAG, "-- onStopLineInfo --: ${info.distance}") - if (!hasCrossRoad && info.distance <= 30.0) { + if (!hasCrossRoad && info.distance <= 80.0) { hasCrossRoad = true - triggerRoadId.set(this.roadId.get()) - distanceOfCarToStopLine.set(info.distance) - triggerLocation.set(CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()) - changeAngle(CrossRoad(true)) + try { + if (triggerRoadId.get() == null) { + val roadId = this.roadId.get() + if (roadId != null && roadId != "0") { + triggerRoadId.set(roadId) + distanceOfCarToStopLine.set(info.distance) + triggerLocation.set(CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()) + } + } + } finally { + changeScene(CrossRoad()) + } } } } @@ -122,185 +132,104 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { ctx.lifeCycleOwner.lifecycle.addObserver(object : LifecycleEventObserver { override fun onStateChanged(source: LifecycleOwner, event: Event) { if (event == ON_DESTROY) { - CallerMapRoadListenerManager.unRegisterRoadListener("VisualAngleChange") + CallerMapRoadListenerManager.removeListener(TAG) } } }) - CallerMapRoadListenerManager.registerRoadListener("VisualAngleChange", listener) + CallerMapRoadListenerManager.addListener(TAG, listener) } - @Volatile - private var hasCrossRoad = false - - private var scope: CoroutineScope = acquireScope() - @Synchronized - get() { - if (field.isActive) { - return field - } - val scope = acquireScope() - field = scope - return field - } - - private var defaultDelayJob: Job? = null private fun acquireScope(): CoroutineScope { - return CoroutineScope(Executors.newSingleThreadExecutor().asCoroutineDispatcher() + SupervisorJob()) + val handler = HandlerThread("visual-angle-change").let { it.start(); Handler(it.looper) } + return CoroutineScope(handler.asCoroutineDispatcher() + SupervisorJob()) } @Volatile - private var mLevel:Boolean = false + private var prevJob: Job? = null - override fun updateLongSightLevel(level:Boolean){ - mLevel = level - } - - override fun changeAngle(scene: Scene) { - if(mLevel){ - return - } - val triggerTime = SystemClock.elapsedRealtime() + override fun changeScene(scene: Scene) { + prevJob?.safeCancel() scope.launch { - Log.d(TAG, "--- 1 ---") - val displayed = getDisplayed() - if (displayed == null) { - Log.d(TAG, "--- 2 ---") - if (scene is CrossRoad) { - if (!scene.open) { - changeAngle(Default()) - return@launch - } - } - doRealVisualAngleChange(triggerTime, scene, null) - } else { - val prev = displayed.target - Log.d(TAG, "--- 3 --- old: $prev -> cur: $scene") - val prevTriggerTime = displayed.triggerTime - if (scene !is Default && prev.priority > scene.priority && (prev is RoadEvent)) { - val displayDuration = triggerTime - prevTriggerTime - Log.d(TAG, "--- 4 ---:场景[$prev], 已展示时长: duration: $displayDuration") - if (displayDuration < prev.displayThreshold) { - Log.d(TAG, "--- 5 --- 场景[$prev]:仍在保护展示时长内,直接return") - return@launch - } else { - Log.d(TAG, "--- 6 --- 场景[$prev]:已过保护展示时长,从展示的队列中移除,显示默认视角") - queue -= displayed - changeAngle(Default()) - return@launch - } - } - if (prev is CrossRoad && scene is CrossRoad) { - val isOpen = scene.open - if (!isOpen) { - Log.d(TAG, "--- 8 --- old: $prev -> cur: $scene") - queue -= displayed - changeAngle(Default()) - return@launch - } - } - if (prev.priority == scene.priority) { - Log.d(TAG, "--- 9 --- 场景[$prev]正在展示,尚未收到关闭,优先级一致,直接return") - return@launch - } - if (prev.priority > scene.priority && prev.displayThreshold < 0) { - Log.d(TAG, "--- 10 --- 场景[$prev]正在展示,尚未收到关闭,场景,依然展示当前场景,直接return") - return@launch - } - doRealVisualAngleChange(triggerTime, scene, displayed) - } - } - } - - private fun CoroutineScope.doRealVisualAngleChange(triggerTime: Long, target: Scene, displayed: Record? = null) { - if (target is Default) { - Log.d(TAG, "--- doRealVisualAngleChange --- 1 ---") - displayed?.also { - queue -= it - } - defaultDelayJob?.safeCancel() - launch { - val delay = target.unit.toMillis(target.delay) - Log.d(TAG, "--- doRealVisualAngleChange --- 2 ---") + val delay = scene.delay + if (delay > 0) { delay(delay) - Log.d(TAG, "--- doRealVisualAngleChange --- 3 ---") - doChangeAngle(Record(target, triggerTime = triggerTime), displayed) - }.also { itx -> - itx.invokeOnCompletion { - if (it is CancellationException) { - Log.d(TAG, "--- doRealVisualAngleChange --- 4 ---") - } - } - defaultDelayJob = itx } - } else { - Log.d(TAG, "--- doRealVisualAngleChange --- 5 ---") - defaultDelayJob?.safeCancel() - if (displayed == null || displayed.target.priority <= target.priority) { - Log.d(TAG, "--- doRealVisualAngleChange --- 6 ---") - displayed?.also { - queue -= it - } - if (target is CrossRoad) { - if (!target.open) { - Log.d(TAG, "--- doRealVisualAngleChange --- 8 ---") - changeAngle(Default()) - return - } - } - Log.d(TAG, "--- doRealVisualAngleChange --- 10 ---") - doChangeAngle(Record(target, triggerTime = triggerTime), displayed) + val prev = prevScene.get() + if (prev?.javaClass == scene.javaClass) { + return@launch } + var verifyPrior = true + if (scene is Default && scene.forceClosePrev) { + verifyPrior = false + } + if (verifyPrior) { + val lastPriority = prev?.priority ?: Int.MIN_VALUE + val currentPriority = scene.priority + if (lastPriority > currentPriority) { + return@launch + } + } + doChangeAngle(scene) + }.also { + prevJob = it } } - private fun doChangeAngle(target: Record, previous: Record? = null) { - val angle = target.target.angle + override fun getCurrentScene(): Scene { + return prevScene.get() ?: Default() + } + + private fun doChangeAngle(target: Scene) { + val angle = target.angle CallerMapUIServiceManager.getMapUIController()?.also { - Log.d(TAG, "--- doChangeAngle ---: ${target.target}") - if (target.target !is Default) { - target.isDisplay = true - synchronized(queue) { - queue += target + Log.d(TAG, "--- doChangeAngle ---: $target") + val prev = prevScene.get() + try { + if (!target.isCanTouch) { + CallerMapUIServiceManager.getMapUIController()?.setAllGesturesEnabled(false) + } else { + CallerMapUIServiceManager.getMapUIController()?.setAllGesturesEnabled(true) } - } - if (target.target is Default && roadEventFlag) { - roadEventFlag = false - it.setLockMode(true) - } - if (target.target is RoadEvent) { - //taxi乘客屏,使用的新地图效果,切了视角也看不到 - if (!AppIdentityModeUtils.isTaxiPassenger(FunctionBuildConfig.appIdentityMode)) { - roadEventFlag = true - it.setLockMode(false) - /** - * var center = mapAutoView.getCurrentLonLatPoint() - * var target = LonLatPoint(112.57295762931203, 26.823537024568793) - * var angle = MapAutoApi.getAngle(center.longitude,center.latitude,target.longitude,target.latitude) - */ - val isGps = target.target.isGps - val car = if (isGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() - val rotateAngle = MapAutoApi.getAngle(car.longitude, car.latitude, target.target.poi_lon, target.target.poi_lat) - Log.d(TAG, "angle->:$rotateAngle") - it.animateTo(0.0 ,0.0,1f, -rotateAngle,11.5f,12f,3000,target.target.isGps) + val screenToOriginDis = target.getScreenToOriginDis() + when(screenToOriginDis) { + DEFAULT -> CallerMapUIServiceManager.getMapUIController()?.setScreenToOriginDis(4.0f) + UP -> CallerMapUIServiceManager.getMapUIController()?.setScreenToOriginDis(3.0f) + DOWN -> CallerMapUIServiceManager.getMapUIController()?.setScreenToOriginDis(5.0f) } - } else { - if (target.target is Default && previous != null && (previous.target is RoadEvent)) { - Log.d(TAG, "==== doChangeAngle === 1 ===") - if (AppIdentityModeUtils.isTaxiPassenger(FunctionBuildConfig.appIdentityMode)) { - Log.d(TAG, "==== doChangeAngle === 2 ===") - return + if (target !is Roma) { + it.changeMapVisualAngle(angle, null) + } + } finally { + if (prev == null || prev.javaClass != target.javaClass) { + notifyChanged(target) + } + prevScene.set(target) + if (target.displayThreshold > 0) { + scope.launch { + delay(target.displayThreshold) + doChangeAngle(Default()) } } - it.changeMapVisualAngle(angle, null) } } } - /** - * 是否有正在展示的 - */ - @Synchronized - private fun getDisplayed() = queue.firstOrNull() + override fun addListener(tag: String, listener: OnMoGoVisualAngleSceneChangeListener) { + listeners.getOrPut(tag) { ArrayList() }.takeIf { !it.contains(listener) }?.also { + it.add(listener) + listener.onSceneChanged(getCurrentScene()) + } + } + + override fun removeListener(tag: String) { + listeners.remove(tag) + } + + private fun notifyChanged(scene: Scene) { + for (listener in listeners.values.flatten()) { + listener.onSceneChanged(scene) + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt index 88cc360870..4b4227754f 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/CrossRoad.kt @@ -1,21 +1,37 @@ package com.mogo.eagle.core.function.angle.scenes import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis +import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.DOWN import com.mogo.map.uicontroller.VisualAngleMode -import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS +import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS_NEW +import java.util.concurrent.TimeUnit /** * 十字路口 */ -class CrossRoad(var open: Boolean = false): Scene { +class CrossRoad(private val delayTime: Long = 0, private val unit: TimeUnit = TimeUnit.SECONDS): Scene { override val angle: VisualAngleMode - get() = MAP_STYLE_VR_ANGLE_CROSS + get() = MAP_STYLE_VR_ANGLE_CROSS_NEW - override val priority: Int = 4 + override val priority: Int = 0 override val displayThreshold: Long get() = -1 + override val delay: Long + get() = unit.toMillis(delayTime) + + override val isCanSwitch: Boolean + get() = false + + override val isCanTouch: Boolean + get() = false + override fun toString(): String { - return "CrossRoad(open: ${open}, priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" + return "CrossRoad(delayTime=${delayTime}, priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" + } + + override fun getScreenToOriginDis(): ScreenToOriginDis { + return DOWN } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt index b9fefc1db2..f6f16ba578 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Default.kt @@ -11,17 +11,27 @@ import java.util.concurrent.TimeUnit * @param delay: 表示多少稍后,默认值为2 * @param unit: 时间单位,默认为秒 */ -class Default(val delay: Long = 2, val unit: TimeUnit = TimeUnit.SECONDS): Scene { + +class Default(val delayTime: Long = 0, val unit: TimeUnit = TimeUnit.SECONDS, val forceClosePrev: Boolean = false): Scene { override val angle: VisualAngleMode get() = CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT - override val priority: Int = 1 + override val priority: Int = 0 override val displayThreshold: Long get() = 0 + override val delay: Long + get() = unit.toMillis(delayTime) + + override val isCanSwitch: Boolean + get() = true + + override val isCanTouch: Boolean + get() = true + override fun toString(): String { - return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority)" + return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority, closePrevious=$forceClosePrev)" } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/LongSight.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/LongSight.kt new file mode 100644 index 0000000000..a26ac58437 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/LongSight.kt @@ -0,0 +1,25 @@ +package com.mogo.eagle.core.function.angle.scenes + +import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.map.uicontroller.VisualAngleMode +import com.mogo.map.uicontroller.VisualAngleMode.MODE_LONG_SIGHT +import java.util.concurrent.TimeUnit + +class LongSight(private val delayTime: Long = 0, private val unit: TimeUnit = TimeUnit.SECONDS): Scene { + + override val angle: VisualAngleMode + get() = MODE_LONG_SIGHT + override val priority: Int + get() = 0 + override val displayThreshold: Long + get() = -1 + + override val delay: Long + get() = unit.toMillis(delayTime) + + override val isCanSwitch: Boolean + get() = true + + override val isCanTouch: Boolean + get() = true +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt index 052824749d..5244428bac 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/RoadEvent.kt @@ -1,22 +1,33 @@ package com.mogo.eagle.core.function.angle.scenes import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.map.uicontroller.VisualAngleMode +import com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT import java.util.concurrent.TimeUnit /** * 道路事件 */ -class RoadEvent(val poi_lon: Double, val poi_lat: Double, val poi_angle: Double, val isGps: Boolean = true): Scene { +class RoadEvent(private val delayTime: Long, private val unit: TimeUnit): Scene { - override val angle: VisualAngleMode = VisualAngleMode.MODE_LONG_SIGHT + override val angle: VisualAngleMode = CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT - override val priority: Int = 5 + override val priority: Int = 0 override val displayThreshold: Long - get() = TimeUnit.SECONDS.toMillis(8) + get() = -1 + + override val delay: Long + get() = unit.toMillis(delayTime) override fun toString(): String { - return "RoadEvent(priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority}, lon: $poi_lon, lat: $poi_lat, angle: $poi_angle)" + return "RoadEvent(priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority}" } + + override val isCanSwitch: Boolean + get() = true + + override val isCanTouch: Boolean + get() = true } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Roma.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Roma.kt new file mode 100644 index 0000000000..fa15d5108e --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/scenes/Roma.kt @@ -0,0 +1,25 @@ +package com.mogo.eagle.core.function.angle.scenes + +import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.map.uicontroller.VisualAngleMode +import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ROMA +import java.util.concurrent.TimeUnit + +/** + * 漫游场景 + */ +class Roma(val delayTime: Long = 2, val unit: TimeUnit = TimeUnit.SECONDS): Scene { + + override val angle: VisualAngleMode + get() = MAP_STYLE_VR_ROMA + override val priority: Int + get() = 1 + override val displayThreshold: Long + get() = -1 + override val delay: Long + get() = unit.toMillis(delayTime) + override val isCanSwitch: Boolean + get() = false + override val isCanTouch: Boolean + get() = false +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt index a3dfe912d8..6ab2eaa78c 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt @@ -1,118 +1,23 @@ package com.mogo.eagle.core.function.business.ai import android.content.Context -import android.os.Handler -import android.os.Looper -import android.os.Message import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager -import com.mogo.commons.debug.DebugConfig -import com.mogo.commons.module.status.MogoStatusManager -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.deva.chain.ChainConstant -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLICK -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLOSE_CLICK -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLOUD_ERROR -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLOUD_PUSH -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_CHANGE_END -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_END -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_ERROR -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_READY_START -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_START -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_RANGE -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST_DELAY -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST_ERROR -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST_OK -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_ROUTE_MODE -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener -import com.mogo.eagle.core.function.api.map.roma.IMoGoRomaListener import com.mogo.eagle.core.function.business.ai.net.AiCloudIdentifyNetWorkModel.Companion.aiCloudIdentifyNetWorkModel -import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager -import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager -import com.mogo.eagle.core.function.call.map.CallerMapRomaListener -import com.mogo.eagle.core.function.call.map.CallerMapRomaListener.invokeRomaViewStatus -import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager -import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.updateLongSightLevel -import com.mogo.eagle.core.function.utils.MapRomaTrace -import com.mogo.eagle.core.function.utils.MapRomaTrace.Companion.getCurrentCNode -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.map.uicontroller.VisualAngleMode -import com.zhidaoauto.map.data.point.LonLatPoint -import com.zhjt.service.chain.ChainLog -import mogo.telematics.pad.MessagePad +import com.mogo.eagle.core.function.call.map.CallerMapAiCloudDataManager import mogo.yycp.api.proto.SocketDownData -import java.util.concurrent.atomic.AtomicBoolean -class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, - IMoGoAutopilotStatusListener, IMoGoRomaListener { +class AiCloudIdentifyDataManager { companion object { - private const val TAG = "AiCloudIdentifyData" - - private const val H_ERROR_CLOUD = 1 - private const val H_ERROR_MAP = 2 - private const val H_DELAY_TIME = 3_000L - - var START_METRE = 200 - var END_METRE = 2000 - @JvmStatic val aiCloudIdentifyDataManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { AiCloudIdentifyDataManager() } } - private var showAiCloud = AtomicBoolean(false) - - private var aiCloudDataChange = AtomicBoolean(false) - - @Volatile - private var cloudDataSize = 0 - - @Volatile - private var inRange = false - - private val handler = Handler(Looper.getMainLooper()) { - if (it.what == H_ERROR_CLOUD) { - if (!aiCloudDataChange.get()) { - MapRomaTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_ERROR, TAG, - mutableMapOf( - "msg" to "云端 $H_DELAY_TIME 秒内无感知数据下发", - "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, - "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode - ) - ) - } else { - MapRomaTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_PUSH, TAG, - mutableMapOf( - "msg" to "延迟 $H_DELAY_TIME 秒内获取云端下发感知数据大小", - "cloudDataSize" to cloudDataSize - ) - ) - } - } - if (it.what == H_ERROR_MAP) { - MapRomaTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_ERROR, TAG, - mutableMapOf("msg" to "地图漫游模式启动失败,原因:${it.obj}") - ) - if (DebugConfig.isDebug()) { - ToastUtils.showShort("进入漫游模式失败, code:${it.obj}") - } - } - true - } - fun initServer(mContext: Context) { - CallerAutoPilotStatusListenerManager.addListener(TAG, this) - CallerPlanningRottingListenerManager.addListener(TAG, this) - CallerMapRomaListener.addListener(TAG, this) MogoAiCloudSocketManager.getInstance(mContext) .registerOnMessageListener( 0x040003, //低频数据 @@ -121,260 +26,27 @@ class AiCloudIdentifyDataManager : IMoGoPlanningRottingListener, return SocketDownData.SocketDownDataProto::class.java } - @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED, - linkCode = ChainConstant.CHAIN_SOURCE_ADAS, - nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_RECT_DATA, - paramIndexes = [0] - ) override fun onMsgReceived(obj: SocketDownData.SocketDownDataProto?) { - obj?.let { - obj.data?.let { - if (it.allListList != null && it.allListList.size > 0) { - if (!aiCloudDataChange.get()) { - aiCloudDataChange.set(true) - } - } - if (showAiCloud.get()) { - if (it.allListList == null || it.allListList.size == 0) { - MapIdentifySubscriber.instance.clearAiCloudRoma() - return - } - cloudDataSize = it.allListList.size - MapIdentifySubscriber.instance.renderAiCloudResult(it.allListList) - } - } - } + CallerMapAiCloudDataManager.invokeAiIdentifyData(obj) } }) } - fun trigger(romaStatus: Boolean) { - // 乘客司机屏屏各自单独控制漫游 - if (romaStatus) { - // 开启roma,当前非漫游,开启 - MapRomaTrace.log( - "", - CHAIN_CODE_ROMA_CLICK, - TAG, - mutableMapOf("trigger" to true) - ) - openRoma() - } else { - // 跟上次关联,需要确认parent进度 - MapRomaTrace.log(getCurrentCNode(), CHAIN_CODE_ROMA_CLOSE_CLICK, TAG, "") - handler.removeMessages(H_ERROR_CLOUD) - closeRoma() - } + fun trigger(romaStatus: Boolean, startDis: Int, endDis: Int, lat: Double, lon: Double) { + requestRangeOfIdentify(romaStatus, startDis, endDis, lat, lon) } - private fun openRoma() { - CallerMapUIServiceManager.getMapUIController()?.visualAngleLock(true) - CallerMapUIServiceManager.getMapUIController()?.setScrollGesturesEnable(false) - updateLongSightLevel(true) - requestRangeOfIdentify(true) - } - - @Synchronized - private fun closeRoma(manual: Boolean = true) { - CallerMapUIServiceManager.getMapUIController()?.visualAngleLock(false) - CallerMapUIServiceManager.getMapUIController()?.setScrollGesturesEnable(true) - updateLongSightLevel(false) - requestRangeOfIdentify(false) - MapIdentifySubscriber.instance.clearAiCloudRoma() - // 主动关闭roma,回到中景视角 - if (manual) { - CallerMapUIServiceManager.getMapUIController() - ?.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null) - } - } - - override fun mapRomaInRange(range: Boolean) { - val gnss = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().gnssInfo - MapRomaTrace.log( - "", CHAIN_CODE_ROMA_RANGE, TAG, mutableMapOf( - "range" to range, - "lon" to gnss.longitude, - "lat" to gnss.latitude - ), true - ) - inRange = range - if (FunctionBuildConfig.romaModeStyle == 1) { - return - } - invokeRomaViewStatus(range) - } - - fun requestRangeOfIdentify(dataReceive: Boolean) { - val gnss = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().gnssInfo - // false,改变父节点信息 - MapRomaTrace.log( - if (dataReceive) CHAIN_CODE_ROMA_CLICK else "", CHAIN_CODE_ROMA_REQUEST, TAG, - mutableMapOf( - "dataReceive" to dataReceive, - "lon" to gnss.longitude, - "lat" to gnss.latitude, - "heading" to gnss.heading, - "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, - "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode - ), !dataReceive - ) + fun requestRangeOfIdentify( + romaStatus: Boolean, startDis: Int, endDis: Int, lat: Double, lon: Double + ) { aiCloudIdentifyNetWorkModel.requestIdentifyRange( - dataReceive, - gnss.longitude, - gnss.latitude, + romaStatus, startDis, endDis, lon, lat, { - // false,改变父节点信息 - MapRomaTrace.log( - if (dataReceive) CHAIN_CODE_ROMA_REQUEST else "", - CHAIN_CODE_ROMA_REQUEST_OK, - TAG, - mutableMapOf( - "dataResult" to dataReceive, - "startRange" to START_METRE, - "endRange" to END_METRE, - ), !dataReceive - ) - if (dataReceive) { - // 请求地图开始漫游 - CallerMapUIServiceManager.getMapUIController() - ?.setRomaMode(FunctionBuildConfig.romaModeStyle) - } else { - // 保底清除策略 - MapRomaTrace.log( - "", - CHAIN_CODE_ROMA_REQUEST_DELAY, - TAG, - mutableMapOf("delay" to true), - true - ) - MapIdentifySubscriber.instance.clearAiCloudRoma() - } + CallerMapAiCloudDataManager.invokeResponse(romaStatus) }, { errorMsg -> - // false,改变父节点信息 - MapRomaTrace.log( - if (dataReceive) CHAIN_CODE_ROMA_REQUEST else "", - CHAIN_CODE_ROMA_REQUEST_ERROR, - TAG, - mutableMapOf( - "errorMsg" to errorMsg, - "dataResult" to dataReceive, - "startRange" to START_METRE, - "endRange" to END_METRE - ), true - ) - updateLongSightLevel(false) - CallerMapRomaListener.invokeMapRoma(false) - if (DebugConfig.isDebug()) { - ToastUtils.showShort("漫游请求异常,msg:$errorMsg") - } + CallerMapAiCloudDataManager.invokeResponse(romaStatus, errorMsg) }) } - //status 0:进入漫游模式成功 1;进入漫游模式失败 2:正常结束漫游 3:切换视角结束漫游 - override fun mapRomaStatus(status: Int, msg: String) { - super.mapRomaStatus(status, msg) - when (status) { - 0 -> { - MapRomaTrace.log( - CHAIN_CODE_ROMA_REQUEST_OK, - CHAIN_CODE_ROMA_MAP_READY_START, - TAG, - mutableMapOf("romaStart" to "地图准备漫游动画") - ) - } - 4 -> { - MapRomaTrace.log( - CHAIN_CODE_ROMA_MAP_READY_START, - CHAIN_CODE_ROMA_MAP_START, - TAG, - mutableMapOf("romaStart" to "地图漫游动画结束,开始漫游") - ) - showAiCloud.set(true) -// FunctionBuildConfig.isDrawIdentifyData = false - CallerMapRomaListener.invokeMapRoma(true) - // 5秒没有触发 则预警日志写入 - handler.sendEmptyMessageDelayed(H_ERROR_CLOUD, H_DELAY_TIME) - } - 5 -> { - CallerMapRomaListener.invokeRomaDistance(msg) - } - 1 -> { - val m = Message.obtain() - m.what = H_ERROR_MAP - m.obj = msg - handler.sendMessage(m) - CallerMapRomaListener.invokeMapRoma(false) - closeRoma(false) - } - 2 -> { // 地图自动漫游结束,重置状态,调用close通知服务端 - MapRomaTrace.log( - CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_END, TAG, - mutableMapOf("romaEnd" to "地图结束回调,状态:$status"), true - ) - reset() - } - 3 -> { // 业务释放地图视角锁定,回调切换视角结束漫游 - MapRomaTrace.log( - CHAIN_CODE_ROMA_CLOSE_CLICK, - CHAIN_CODE_ROMA_MAP_CHANGE_END, - TAG, mutableMapOf("romaEnd" to "地图结束回调,状态:$status"), true - ) - reset(false) - } - } - } - - private fun reset(invokeCloud: Boolean = true) { - if (showAiCloud.get()) { - showAiCloud.set(false) - aiCloudDataChange.set(false) - MapIdentifySubscriber.instance.clearAiCloudRoma() -// FunctionBuildConfig.isDrawIdentifyData = true - CallerMapRomaListener.invokeMapRoma(false) - if (invokeCloud) { - closeRoma(false) - } - } - } - - override fun onAutopilotRouteLineId(lineId: Long) { - super.onAutopilotRouteLineId(lineId) - if (lineId == 0L) { - updateRomaStyle(true) - } - } - - override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) { - globalPathResp?.let { - if (it.wayPointsList != null && it.wayPointsList.size > 0) { - val roamList = ArrayList() - it.wayPointsList.forEach { loc -> - roamList.add(LonLatPoint(loc.longitude, loc.latitude)) - } - updateRomaStyle(false, roamList) - } - } - } - - private fun updateRomaStyle(auto: Boolean, routeList: ArrayList? = null) { - MapRomaTrace.log( - "", - CHAIN_CODE_ROMA_ROUTE_MODE, - TAG, - "updateRomaStyle auto status:$auto, route:${routeList?.size ?: "reset null"}" - ) - routeList?.let { - CallerMapUIServiceManager.getMapUIController()?.setRoamTrajectory(it) - } - if (auto) { - FunctionBuildConfig.romaModeStyle = 0 - invokeRomaViewStatus(inRange) - } else { - FunctionBuildConfig.romaModeStyle = 1 - invokeRomaViewStatus(true) - } - } - } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudRangeBroadcastReceiver.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudRangeBroadcastReceiver.kt index 84bb37c721..c571fa64e6 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudRangeBroadcastReceiver.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudRangeBroadcastReceiver.kt @@ -3,9 +3,8 @@ package com.mogo.eagle.core.function.business.ai import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.END_METRE -import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.START_METRE import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager +import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP @@ -13,18 +12,18 @@ class AiCloudRangeBroadcastReceiver : BroadcastReceiver() { companion object { private const val TAG = "AiCloudRangeBroadcastReceiver" + private const val REQUEST_STATUS = "status" private const val START_RANGE = "startRange" private const val END_RANGE = "endRange" - // adb shell am broadcast -a com.map.aiCloud.notification --ei startRange 140 --ei endRange 2000 + // adb shell am broadcast -a com.map.aiCloud.notification -f 0x011000000 --ez true --ei startRange 140 --ei endRange 2000 } override fun onReceive(context: Context, intent: Intent) { - val startRange = intent.getIntExtra(START_RANGE, START_METRE) - val endRange = intent.getIntExtra(END_RANGE, END_METRE) - START_METRE = startRange - END_METRE = endRange + val requestStatus = intent.getBooleanExtra(REQUEST_STATUS, false) + val startRange = intent.getIntExtra(START_RANGE, 140) + val endRange = intent.getIntExtra(END_RANGE, 2000) CallerLogger.d("$M_MAP$TAG", "startRange:$startRange, endRange:$endRange") - aiCloudIdentifyDataManager.requestRangeOfIdentify(true) + CallerMapIdentifyManager.romaTrigger(requestStatus) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/RomaManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/RomaManager.kt new file mode 100644 index 0000000000..fc975e552c --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/RomaManager.kt @@ -0,0 +1,402 @@ +package com.mogo.eagle.core.function.business.ai + +import android.os.Handler +import android.os.Looper +import android.os.Message +import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLICK +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLOSE_CLICK +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLOUD_ERROR +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_CLOUD_PUSH +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_CHANGE_END +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_END +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_ERROR +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_READY_START +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_MAP_START +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_RANGE +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REJECT +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST_DELAY +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST_ERROR +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_REQUEST_OK +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ROMA_ROUTE_MODE +import com.mogo.eagle.core.function.angle.scenes.Default +import com.mogo.eagle.core.function.angle.scenes.Roma +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener +import com.mogo.eagle.core.function.api.map.roma.IMoGoAiCloudIdentifyDataListener +import com.mogo.eagle.core.function.api.map.roma.IMoGoRomaListener +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager +import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapAiCloudDataManager +import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager +import com.mogo.eagle.core.function.call.map.CallerMapRomaListener +import com.mogo.eagle.core.function.call.map.CallerMapRomaListener.invokeRomaViewStatus +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager +import com.mogo.eagle.core.function.utils.MapRomaTrace +import com.mogo.eagle.core.function.utils.MapRomaTrace.Companion.getCurrentCNode +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.map.uicontroller.VisualAngleMode +import com.zhidaoauto.map.data.point.LonLatPoint +import com.zhjt.service.chain.ChainLog +import mogo.telematics.pad.MessagePad +import mogo.yycp.api.proto.SocketDownData +import java.util.concurrent.atomic.AtomicBoolean + +class RomaManager() : IMoGoPlanningRottingListener, + IMoGoAutopilotStatusListener, IMoGoRomaListener, IMoGoAiCloudIdentifyDataListener { + + companion object { + private const val TAG = "RomaManager" + + private const val H_ERROR_CLOUD = 1 + private const val H_ERROR_MAP = 2 + private const val H_DELAY_TIME = 3_000L + + var START_METRE = 200 + var END_METRE = 2000 + + @JvmStatic + val romaManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + RomaManager() + } + } + + private var showAiCloud = AtomicBoolean(false) + + private var aiCloudDataChange = AtomicBoolean(false) + + @Volatile + private var cloudDataSize = 0 + + @Volatile + private var inRange = false + + fun init(){ + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerPlanningRottingListenerManager.addListener(TAG, this) + CallerMapRomaListener.addListener(TAG, this) + CallerMapAiCloudDataManager.addListener(TAG, this) + } + + private val handler = Handler(Looper.getMainLooper()) { + if (it.what == H_ERROR_CLOUD) { + if (!aiCloudDataChange.get()) { + MapRomaTrace.log( + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_ERROR, TAG, + mutableMapOf( + "msg" to "云端 $H_DELAY_TIME 秒内无感知数据下发", + "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, + "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode + ) + ) + } else { + MapRomaTrace.log( + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_CLOUD_PUSH, TAG, + mutableMapOf( + "msg" to "延迟 $H_DELAY_TIME 秒内获取云端下发感知数据大小", + "cloudDataSize" to cloudDataSize + ) + ) + } + } + if (it.what == H_ERROR_MAP) { + MapRomaTrace.log( + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_ERROR, TAG, + mutableMapOf("msg" to "地图漫游模式启动失败,原因:${it.obj}") + ) + if (DebugConfig.isDebug()) { + ToastUtils.showShort("进入漫游模式失败, code:${it.obj}") + } + } + true + } + + fun trigger(roamStatus: Boolean) { + if (CallerMapIdentifyManager.roam.first.isNotEmpty() + && CallerMapIdentifyManager.roam.first!= TAG + && CallerMapIdentifyManager.roam.second) { + ToastUtils.showLong("正在展示路口漫游,请稍后重试") + MapRomaTrace.log( + "", + CHAIN_CODE_ROMA_REJECT, + TAG, + mutableMapOf("reject" to "正在展示路口,点触漫游按钮") + ) + CallerMapRomaListener.invokeMapRoma(false) + return + } + // 乘客司机屏屏各自单独控制漫游 + if (roamStatus) { + // 开启roma,当前非漫游,开启 + MapRomaTrace.log( + "", + CHAIN_CODE_ROMA_CLICK, + TAG, + mutableMapOf("trigger" to true) + ) + openRoma() + } else { + // 跟上次关联,需要确认parent进度 + MapRomaTrace.log(getCurrentCNode(), CHAIN_CODE_ROMA_CLOSE_CLICK, TAG, "") + handler.removeMessages(H_ERROR_CLOUD) + closeRoma() + } + } + + private fun openRoma() { + CallerMapIdentifyManager.updateRoam(TAG, true) + CallerMapUIServiceManager.getMapUIController()?.visualAngleLock(true) + CallerMapUIServiceManager.getMapUIController()?.setScrollGesturesEnable(false) +// updateLongSightLevel(true) + CallerVisualAngleManager.changeScene(Roma(0)) + requestRangeOfIdentify(true) + } + + @Synchronized + private fun closeRoma(manual: Boolean = true) { + CallerMapUIServiceManager.getMapUIController()?.visualAngleLock(false) + CallerMapUIServiceManager.getMapUIController()?.setScrollGesturesEnable(true) +// updateLongSightLevel(false) + CallerVisualAngleManager.changeScene(Default(forceClosePrev = true)) + requestRangeOfIdentify(false) + MapIdentifySubscriber.instance.clearAiCloudRoma() + // 主动关闭roma,回到中景视角 + if (manual) { + CallerMapUIServiceManager.getMapUIController() + ?.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null) + } + } + + override fun mapRomaInRange(range: Boolean) { + val gnss = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().gnssInfo + MapRomaTrace.log( + "", CHAIN_CODE_ROMA_RANGE, TAG, mutableMapOf( + "range" to range, + "lon" to gnss.longitude, + "lat" to gnss.latitude + ), true + ) + inRange = range + if (FunctionBuildConfig.romaModeStyle == 1) { + return + } + invokeRomaViewStatus(range) + } + + private fun requestRangeOfIdentify(dataReceive: Boolean) { + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().gnssInfo + // false,改变父节点信息 + MapRomaTrace.log( + if (dataReceive) CHAIN_CODE_ROMA_CLICK else "", CHAIN_CODE_ROMA_REQUEST, TAG, + mutableMapOf( + "dataReceive" to dataReceive, + "lon" to loc.longitude, + "lat" to loc.latitude, + "heading" to loc.heading, + "socketStatus" to MogoStatusManager.getInstance().isSocketOnLine, + "cityCode" to CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode + ), !dataReceive + ) + aiCloudIdentifyDataManager.trigger(dataReceive, START_METRE, END_METRE,loc.latitude,loc.longitude) + } + + override fun response(requestStatus: Boolean, errorMsg: String?) { + //错误情况 + if (errorMsg != null) { + // false,改变父节点信息 + MapRomaTrace.log( + if (requestStatus) CHAIN_CODE_ROMA_REQUEST else "", + CHAIN_CODE_ROMA_REQUEST_ERROR, + TAG, + mutableMapOf( + "errorMsg" to errorMsg, + "dataResult" to requestStatus, + "startRange" to START_METRE, + "endRange" to END_METRE + ), true + ) +// updateLongSightLevel(false) + CallerVisualAngleManager.changeScene(Default(forceClosePrev = true)) + CallerMapRomaListener.invokeMapRoma(false) + CallerMapIdentifyManager.updateRoam("", false) + if (DebugConfig.isDebug()) { + ToastUtils.showShort("漫游请求异常,msg:$errorMsg") + } + return + } + + // false,改变父节点信息 + MapRomaTrace.log( + if (requestStatus) CHAIN_CODE_ROMA_REQUEST else "", + CHAIN_CODE_ROMA_REQUEST_OK, + TAG, + mutableMapOf( + "dataResult" to requestStatus, + "startRange" to START_METRE, + "endRange" to END_METRE, + ), !requestStatus + ) + if (requestStatus) { + // 请求地图开始漫游 + CallerMapUIServiceManager.getMapUIController() + ?.setRomaMode(FunctionBuildConfig.romaModeStyle) + } else { + // 保底清除策略 + MapRomaTrace.log( + "", + CHAIN_CODE_ROMA_REQUEST_DELAY, + TAG, + mutableMapOf("delay" to true), + true + ) + CallerMapIdentifyManager.updateRoam("", false) + MapIdentifySubscriber.instance.clearAiCloudRoma() + } + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_RECT_DATA, + paramIndexes = [0] + ) + override fun onAiIdentifyData(obj: SocketDownData.SocketDownDataProto?) { + obj?.let { + obj.data?.let { + if (it.allListList != null && it.allListList.size > 0) { + if (!aiCloudDataChange.get()) { + aiCloudDataChange.set(true) + } + } + if (showAiCloud.get()) { + if (it.allListList == null || it.allListList.size == 0) { + MapIdentifySubscriber.instance.clearAiCloudRoma() + return + } + cloudDataSize = it.allListList.size + MapIdentifySubscriber.instance.renderAiCloudResult(it.allListList) + } + } + } + } + + //status 0:进入漫游模式成功 1;进入漫游模式失败 2:正常结束漫游 3:切换视角结束漫游 + override fun mapRomaStatus(status: Int, msg: String) { + super.mapRomaStatus(status, msg) + when (status) { + 0 -> { + MapRomaTrace.log( + CHAIN_CODE_ROMA_REQUEST_OK, + CHAIN_CODE_ROMA_MAP_READY_START, + TAG, + mutableMapOf("romaStart" to "地图准备漫游动画") + ) + } + + 4 -> { + MapRomaTrace.log( + CHAIN_CODE_ROMA_MAP_READY_START, + CHAIN_CODE_ROMA_MAP_START, + TAG, + mutableMapOf("romaStart" to "地图漫游动画结束,开始漫游") + ) + showAiCloud.set(true) +// FunctionBuildConfig.isDrawIdentifyData = false + CallerMapRomaListener.invokeMapRoma(true) + // 5秒没有触发 则预警日志写入 + handler.sendEmptyMessageDelayed(H_ERROR_CLOUD, H_DELAY_TIME) + } + + 5 -> { + CallerMapRomaListener.invokeRomaDistance(msg) + } + + 1 -> { + val m = Message.obtain() + m.what = H_ERROR_MAP + m.obj = msg + handler.sendMessage(m) + CallerMapRomaListener.invokeMapRoma(false) + closeRoma(false) + } + + 2 -> { // 地图自动漫游结束,重置状态,调用close通知服务端 + MapRomaTrace.log( + CHAIN_CODE_ROMA_MAP_START, CHAIN_CODE_ROMA_MAP_END, TAG, + mutableMapOf("romaEnd" to "地图结束回调,状态:$status"), true + ) + reset() + } + + 3 -> { // 业务释放地图视角锁定,回调切换视角结束漫游 + MapRomaTrace.log( + CHAIN_CODE_ROMA_CLOSE_CLICK, + CHAIN_CODE_ROMA_MAP_CHANGE_END, + TAG, mutableMapOf("romaEnd" to "地图结束回调,状态:$status"), true + ) + reset(false) + } + } + } + + private fun reset(invokeCloud: Boolean = true) { + if (showAiCloud.get()) { + showAiCloud.set(false) + aiCloudDataChange.set(false) + MapIdentifySubscriber.instance.clearAiCloudRoma() +// FunctionBuildConfig.isDrawIdentifyData = true + CallerMapRomaListener.invokeMapRoma(false) + if (invokeCloud) { + closeRoma(false) + } + } + } + + override fun onAutopilotRouteLineId(lineId: Long) { + super.onAutopilotRouteLineId(lineId) + if (lineId == 0L) { + updateRomaStyle(true) + } + } + + override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) { + globalPathResp?.let { + if (it.wayPointsList != null && it.wayPointsList.size > 0) { + val roamList = ArrayList() + it.wayPointsList.forEach { loc -> + roamList.add(LonLatPoint(loc.longitude, loc.latitude)) + } + updateRomaStyle(false, roamList) + } + } + } + + private fun updateRomaStyle(auto: Boolean, routeList: ArrayList? = null) { + MapRomaTrace.log( + "", + CHAIN_CODE_ROMA_ROUTE_MODE, + TAG, + "updateRomaStyle auto status:$auto, route:${routeList?.size ?: "reset null"}" + ) + routeList?.let { + CallerMapUIServiceManager.getMapUIController()?.setRoamTrajectory(it) + } + if (auto) { + FunctionBuildConfig.romaModeStyle = 0 + invokeRomaViewStatus(inRange) + } else { + FunctionBuildConfig.romaModeStyle = 1 + invokeRomaViewStatus(true) + } + } + + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt index f11544d6f0..68ba7ba43b 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt @@ -3,8 +3,6 @@ package com.mogo.eagle.core.function.business.ai.net import com.mogo.commons.constants.HostConst.getEagleHost import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.BaseResponse -import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.END_METRE -import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.START_METRE import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiCall import com.mogo.eagle.core.network.request @@ -24,6 +22,7 @@ class AiCloudIdentifyNetWorkModel private constructor() { fun requestIdentifyRange( dataReceive: Boolean, + startDis:Int, endDis:Int, lon: Double, lat: Double, onSuccess: (() -> Unit), onError: ((String) -> Unit) @@ -34,8 +33,8 @@ class AiCloudIdentifyNetWorkModel private constructor() { val map = mutableMapOf() map["sn"] = SharedPrefsMgr.getInstance().sn map["status"] = dataReceive - map["startMetre"] = START_METRE - map["endMetre"] = END_METRE + map["startMetre"] = startDis + map["endMetre"] = endDis map["type"] = 1 if (lon != 0.0) { map["lon"] = lon diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt index 6e2581073e..ecf47c3ecc 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt @@ -11,7 +11,7 @@ interface Identify { } - fun renderAiCloudResult(resultList: List) { + fun renderAiCloudResult(resultList: List, mapInstance:String) { } @@ -27,7 +27,7 @@ interface Identify { } - fun clearAiMarker() { + fun clearAiMarker(mapInstance:String) { } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyAiCloudDataDrawer.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyAiCloudDataDrawer.kt index e04319443b..1eb6b8f061 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyAiCloudDataDrawer.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyAiCloudDataDrawer.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.business.identify import android.annotation.SuppressLint import androidx.collection.ArraySet import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.map.MogoMap import com.mogo.map.identify.MogoIdentifyManager import mogo.yycp.api.proto.SocketDownData import java.util.concurrent.ConcurrentHashMap @@ -27,7 +28,10 @@ class IdentifyAiCloudDataDrawer : Identify { private val mFilterTrafficData = HashMap() @SuppressLint("NewApi") - override fun renderAiCloudResult(resultList: List) { + override fun renderAiCloudResult( + resultList: List, + mapInstance: String + ) { if (resultList.isEmpty()) { clearOldMarker() return @@ -36,7 +40,6 @@ class IdentifyAiCloudDataDrawer : Identify { clearOldMarker() return } - //清除缓存 for (data in resultList) { if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("" + data.uuid)) { @@ -51,14 +54,14 @@ class IdentifyAiCloudDataDrawer : Identify { it.remove() mMarkersCaches.remove(key) MogoIdentifyManager.getInstance() - .removeMarker(key.hashCode().toString()) + .removeMarker(key.hashCode().toString(), mapInstance) } val filterList = filterTrafficData(resultList) if (filterList.size > 0) { // 绘制新数据 MogoIdentifyManager.getInstance() - .updateBatchAiMarkerPosition(filterList) + .updateBatchAiMarkerPosition(filterList, mapInstance) } } @@ -81,12 +84,12 @@ class IdentifyAiCloudDataDrawer : Identify { } @SuppressLint("NewApi") - override fun clearAiMarker() { + override fun clearAiMarker(mapInstance:String) { trafficDataUuidList.clear() mMarkersCaches.forEach { (uuid, _) -> mMarkersCaches.remove(uuid) MogoIdentifyManager.getInstance() - .removeMarker(uuid.hashCode().toString()) + .removeMarker(uuid.hashCode().toString(), mapInstance) } mFilterTrafficData.clear() } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyBeautifyDataDrawer.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyBeautifyDataDrawer.kt index 4f47eb0306..1fab9ad727 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyBeautifyDataDrawer.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyBeautifyDataDrawer.kt @@ -1,8 +1,12 @@ package com.mogo.eagle.core.function.business.identify import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.util.Log import com.mogo.commons.module.status.MogoStatusManager import com.mogo.eagle.core.data.traffic.TrafficData +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.map.identify.MogoIdentifyManager import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject @@ -38,6 +42,7 @@ class IdentifyBeautifyDataDrawer : Identify { //清除缓存 TrackManager.getInstance().clearCache(resultList) + val filterList = TrackManager.getInstance().filterTrafficData(resultList) if (filterList.size > 0) { // 绘制新数据 diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt index e1f881e940..3bc2708508 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListene import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningListenerManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isT1T2 import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isTaxi import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler import com.mogo.eagle.core.utilcode.util.ParseVersionUtils @@ -16,10 +17,12 @@ import com.zhjt.service.chain.ChainLog import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject import mogo.yycp.api.proto.SocketDownData +import java.util.concurrent.TimeUnit object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConfigListener { private const val TAG = "IdentifyFactory" + private const val MSG_CHECK = 999 object DriverIdentify { internal val originDataDrawer = IdentifyOriginDataDrawer() @@ -35,13 +38,15 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf private var identify: Identify? = null private var aiCloudIdentify: Identify? = null + private var startTime: Long = 0L - fun initType(){ + fun initType() { drawType("默认开启感知优化,等待docker版本") identify = UserIdentify.beautifyDataDrawer aiCloudIdentify = AiIdentify.aiCloudDataDrawer CallerAutopilotCarConfigListenerManager.addListener(TAG, this) CallerObuWarningListenerManager.addListener(TAG, this) + mDrawerHandler.sendEmptyMessageDelayed(MSG_CHECK, 1000L) } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { @@ -49,7 +54,7 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf if (dockerVersion != null && dockerVersion.isNotEmpty()) { try { val version = ParseVersionUtils.parseVersion(true, dockerVersion) - identify = if (version >= 30100 && isTaxi(FunctionBuildConfig.appIdentityMode)) { + identify = if (version >= 30100 && isT1T2(FunctionBuildConfig.appIdentityMode)) { FunctionBuildConfig.isBeautyMode = false drawType("关闭感知优化模式") DriverIdentify.originDataDrawer @@ -104,36 +109,59 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf } } when (msg.what) { + MSG_CHECK -> { + if(startTime == 0L){ + sendEmptyMessageDelayed(MSG_CHECK, 1000L) + return + } + val endTime = System.nanoTime() + val internal = TimeUnit.NANOSECONDS.toMillis(endTime - startTime) + if(internal >= 1000){ + identify!!.clearOldMarker() + } + sendEmptyMessageDelayed(MSG_CHECK, 1000L) + } + MSG_DATA_TRACK -> { if (msg.obj is List<*>) { identify!!.renderAdasRecognizedResult(msg.obj as List?) + startTime = System.nanoTime() } } + MSG_DATA_AI_TRACK -> { if (msg.obj is List<*>) { - aiCloudIdentify!!.renderAiCloudResult(msg.obj as List) + aiCloudIdentify!!.renderAiCloudResult( + msg.obj as List, + msg.data.getString("mapInstance")!! + ) } } + MSG_DATA_WARNING -> { if (msg.obj is List<*>) { identify!!.renderPlanningWarningObj(msg.obj as List?) } } + MSG_DATA_OBU_WARNING_UPDATE -> { if (msg.obj is TrafficData) { identify!!.renderOBUWarningObj(true, msg.obj as TrafficData) } } + MSG_DATA_OBU_WARNING_REMOVE -> { if (msg.obj is TrafficData) { identify!!.renderOBUWarningObj(false, msg.obj as TrafficData) } } + MSG_DATA_CLEAR -> { identify!!.clearOldMarker() } + MSG_DATA_AI_CLEAR -> { - aiCloudIdentify!!.clearAiMarker() + aiCloudIdentify!!.clearAiMarker(msg.data.getString("mapInstance")!!) } } } @@ -146,10 +174,14 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf mDrawerHandler.sendMessage(message) } - override fun renderAiCloudResult(resultList: List) { + override fun renderAiCloudResult( + resultList: List, + mapInstance: String + ) { val message = Message.obtain() message.what = MSG_DATA_AI_TRACK message.obj = resultList + message.data.putString("mapInstance", mapInstance) mDrawerHandler.sendMessage(message) } @@ -166,9 +198,10 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf mDrawerHandler.sendMessage(message) } - override fun clearAiMarker() { + override fun clearAiMarker(mapInstance: String) { val message = Message.obtain() message.what = MSG_DATA_AI_CLEAR + message.data.putString("mapInstance", mapInstance) mDrawerHandler.sendMessage(message) } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyOriginDataDrawer.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyOriginDataDrawer.kt index bd68920d33..c6905b9869 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyOriginDataDrawer.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyOriginDataDrawer.kt @@ -76,6 +76,7 @@ class IdentifyOriginDataDrawer : Identify { mMarkersCaches.remove(key) MogoIdentifyManager.getInstance() .removeMarker(key) + TrackerSourceFilterHelper.removeBottomMarker(key) } val filterList = filterTrafficData(resultList) @@ -109,6 +110,7 @@ class IdentifyOriginDataDrawer : Identify { mFilterTrafficData[uuid] = temp mMarkersCaches[uuid] = temp trafficDataUuidList.add(uuid) +// TrackerSourceFilterHelper.filterZombieMarker(data) } return mFilterTrafficData } @@ -121,6 +123,7 @@ class IdentifyOriginDataDrawer : Identify { for (uuid in trafficDataUuidList) { MogoIdentifyManager.getInstance() .removeMarker(uuid) + TrackerSourceFilterHelper.removeBottomMarker(uuid) } trafficDataUuidList.clear() mMarkersCaches.clear() diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt index 44bc67a030..e59cef6c39 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt @@ -8,6 +8,7 @@ import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningListenerManager import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.map.MogoMap import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject import mogo.yycp.api.proto.SocketDownData @@ -58,18 +59,18 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, } } - fun renderAiCloudResult(cloudData: List) { + fun renderAiCloudResult(cloudData: List, mapInstance:String = MogoMap.DEFAULT) { try { ThreadUtils.getSinglePool().execute { - IdentifyFactory.renderAiCloudResult(cloudData) + IdentifyFactory.renderAiCloudResult(cloudData, mapInstance) } } catch (e: Exception) { e.printStackTrace() } } - fun clearAiCloudRoma() { - IdentifyFactory.clearAiMarker() + fun clearAiCloudRoma(mapInstance:String = MogoMap.DEFAULT) { + IdentifyFactory.clearAiMarker(mapInstance) } override fun onAutopilotIdentifyPlanningObj(planningObjects: List?) { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java index 148760516a..1a3c93e85c 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackManager.java @@ -1,10 +1,9 @@ package com.mogo.eagle.core.function.business.identify; -import android.annotation.SuppressLint; -import android.os.Build; -import android.util.ArraySet; +import static com.mogo.map.MogoMap.DEFAULT; -import androidx.annotation.RequiresApi; +import android.annotation.SuppressLint; +import android.util.ArraySet; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; @@ -96,7 +95,7 @@ public class TrackManager { if (cellIdCaches.containsValue(pos)) { String findSameValue = cellIdCaches.inverse().get(pos); //uuid处理 - if(findSameValue != null && !findSameValue.isEmpty()){ + if (findSameValue != null && !findSameValue.isEmpty()) { data = data.toBuilder().setUuid(Integer.parseInt(findSameValue)).build(); TrackObj cacheTrack = mMarkersCaches.get(findSameValue); if (cacheTrack != null) { @@ -114,18 +113,19 @@ public class TrackManager { uuid = findSameValue; trackObj.updateObj(data); } else { - trackObj = new TrackObj(data,s2CellId,s2LatLng); + trackObj = new TrackObj(data, s2CellId, s2LatLng); } } } else { - trackObj = new TrackObj(data,s2CellId,s2LatLng); + trackObj = new TrackObj(data, s2CellId, s2LatLng); } } - if(trackObj != null){ + if (trackObj != null) { mFilterTrafficData.put(uuid, trackObj.getCache()); cellIdCaches.forcePut(uuid, trackObj.getCellIdPos()); mMarkersCaches.put(uuid, trackObj); trafficDataUuid.add(uuid); +// TrackerSourceFilterHelper.INSTANCE.filterZombieMarker(data); } //Log.i("costTime","" + (System.currentTimeMillis() - cost)); } @@ -158,10 +158,11 @@ public class TrackManager { mMarkersCaches.remove(key); WarningHelper.INSTANCE.remove(key); MogoIdentifyManager.getInstance() - .removeMarker(key); + .removeMarker(key, DEFAULT); + TrackerSourceFilterHelper.INSTANCE.removeBottomMarker(key); } - @RequiresApi(api = Build.VERSION_CODES.N) + @SuppressLint("NewApi") public void clearAll() { cellIdCaches.clear(); trafficDataUuid.clear(); @@ -169,7 +170,8 @@ public class TrackManager { mMarkersCaches.forEach((uuid, trackObj) -> { trackObj.clear(); MogoIdentifyManager.getInstance() - .removeMarker(uuid); + .removeMarker(uuid, DEFAULT); + TrackerSourceFilterHelper.INSTANCE.removeBottomMarker(uuid); }); mMarkersCaches.clear(); } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt index ea9df2715a..ba8ae40d2f 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt @@ -3,13 +3,23 @@ package com.mogo.eagle.core.function.business.identify import android.annotation.SuppressLint import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.enums.TrafficTypeEnum -import com.mogo.eagle.core.function.call.biz.CallerFuncBizListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.map.R import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isTaxi -import mogo.telematics.pad.MessagePad.* +import com.mogo.map.overlay.core.Level +import com.mogo.map.overlay.point.Point +import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.SubSource +import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.telematics.pad.MessagePad.TrackedSource object TrackerSourceFilterHelper { + private const val TAG = "TrackerSourceColor" + private const val ZOMBIE_TAG = "zombie" + private val cacheZombieMap = mutableMapOf() + @SuppressLint("NewApi") fun filterData(data: TrackedObject): Boolean { if (!FunctionBuildConfig.isDrawUnknownIdentifyData && (data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type @@ -23,16 +33,19 @@ object TrackerSourceFilterHelper { 1 -> if (isIPC(data)) { trackIPCFilter = false } + 2 -> { if (isObu(data).second) { trackIPCFilter = false } } + 3 -> { if (isV2I(data).second) { trackIPCFilter = false } } + 4 -> { if (isV2nRSM(data).second) { trackIPCFilter = false @@ -55,15 +68,15 @@ object TrackerSourceFilterHelper { return "" } - if(data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_CONE.type){ + if (data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_CONE.type) { return "" } - if(FunctionBuildConfig.isFusionColor){ - if(isFusion(data)){ + if (FunctionBuildConfig.isFusionColor) { + if (isFusion(data)) { color = "#982FFFFF" } - if(isV2X(data)){ + if (isV2X(data)) { color = "#F6F6F6FF" } } @@ -91,18 +104,64 @@ object TrackerSourceFilterHelper { } //僵尸车 - if (data.addAttribute == AdditionalAttribute.ATTR_ZOMBIE) { + if (data.addAttribute == MessagePad.AdditionalAttribute.ATTR_ZOMBIE) { color = "#7A8499FF" if (FunctionBuildConfig.skinMode == 1) { color = "#9BA8BCFF" } - //消息埋点 - CallerFuncBizListenerManager.invokeAttrZombieAnalyticsEvent() } return color } + /** + * native实现逻辑遗留问题,后续解决 + */ + fun filterZombieMarker(data: TrackedObject){ + if (data.addAttribute == MessagePad.AdditionalAttribute.ATTR_ZOMBIE) { + if (!cacheZombieMap.contains(data.uuid.toString())) { + val opt = updateBottomMarker(data) + cacheZombieMap[data.uuid.toString()] = opt + }else{ + val opt = cacheZombieMap[data.uuid.toString()] + opt?.let { + val build = it.builder().latitude(data.latitude).longitude(data.longitude).rotate(data.heading.toFloat()).build() + cacheZombieMap[data.uuid.toString()] = build + CallerMapUIServiceManager.getOverlayManager()?.showOrUpdatePoint(build) + } + } + } + } + + private fun updateBottomMarker(data: TrackedObject) : Point.Options{ + val scale = when (data.type) { + TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.type, + TrafficTypeEnum.TYPE_TRAFFIC_ID_BICYCLE.type , + TrafficTypeEnum.TYPE_TRAFFIC_ID_MOTO.type -> 0.1f + TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE.type -> 0.16f + TrafficTypeEnum.TYPE_TRAFFIC_ID_BUS.type, + TrafficTypeEnum.TYPE_TRAFFIC_ID_TRUCK.type -> 0.19f + else -> 0.2f + } + val opt = Point.Options.Builder(TAG, Level.MAP_MARKER) + .setId("$ZOMBIE_TAG${data.uuid}") + .latitude(data.latitude) + .longitude(data.longitude) + .isUseGps(true) + .rotate(data.heading.toFloat()) + .icon3DRes(R.raw.testguangquan) + .scale(scale) + .set3DMode(true) + .build() + CallerMapUIServiceManager.getOverlayManager()?.showOrUpdatePoint(opt) + return opt + } + + fun removeBottomMarker(id: String){ + CallerMapUIServiceManager.getOverlayManager()?.removePoint("$ZOMBIE_TAG$id") + cacheZombieMap.remove(id) + } + /** * 过滤所有 工控感知数据 all match */ diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/RoadCrossCameraManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/RoadCrossCameraManager.kt new file mode 100644 index 0000000000..392082f406 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/RoadCrossCameraManager.kt @@ -0,0 +1,210 @@ +package com.mogo.eagle.core.function.business.roadcross + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.BitmapFactory +import android.os.Handler +import android.os.Looper +import android.os.Message +import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.data.road.CameraDeviceInfo +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.business.roadcross.net.NDERoadCameraNetWorkModel.Companion.ndeRoadCameraNetWorkModel +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.map.R +import com.mogo.eagle.core.function.view.CameraMarkerView +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.map.overlay.core.Level +import com.mogo.map.overlay.point.Point +import com.zhidaoauto.map.data.road.RoadCross +import com.zhidaoauto.map.data.road.StopLine +import com.zhjt.service.chain.ChainLog +import kotlin.properties.Delegates + +class RoadCrossCameraManager : IMoGoMapRoadListener { + companion object { + + private const val TAG = "RoadCrossCameraManager" + private const val REQUEST_CAMERA_MSG = 0 + private const val REMOVE_MARKER_DELAY_TIME = 10000L + + val instance: RoadCrossCameraManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + RoadCrossCameraManager() + } + } + + private var mContext: Context? = null + + @Volatile + private var isCameraRequest = false + + @Volatile + private var roadCrossCameraList: List? = null + + private val overlayManager = CallerMapUIServiceManager.getOverlayManager() + + private val handler = object :Handler(Looper.getMainLooper()){ + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + CallerLogger.d("$M_MAP$TAG", "remove marker") + overlayManager?.removeAllPointsInOwner(TAG) + } + } + + fun init(context: Context?) { + mContext = context + CallerMapRoadListenerManager.addListener(TAG, this) + } + + private var distance: Double by Delegates.observable(0.0) { _, _, newV -> + if(!AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + return@observable + } + if (!isCameraRequest && newV < 100) { + isCameraRequest = true + val roadCrossEnd = CallerMapRoadListenerManager.getCrossEndInfo() + CallerLogger.d( + "$M_MAP$TAG", + "触发接口调用 dis: $distance , roadCrossEnd: ${roadCrossEnd ?: "null"} " + ) + if(roadCrossEnd == null){ + roadCrossTrace( + TAG, mapOf("errorMsg" to "触发接口调用,roadCrossEnd获取为null",) + ) + } + + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + AIAssist.getInstance(mContext).speakTTSVoice("蘑菇检测到前方${distance.toInt()}米您将通过路口,已为您切换展示路口全息影像") + } + if (roadCrossEnd != null) { + ndeRoadCameraNetWorkModel.getRoadCrossInfo(roadCrossEnd, + onSuccess = { + if (it.crossingId == null) { + traceError("roadUniqueId is null") + return@getRoadCrossInfo + } + if (it.deviceInfoList.isEmpty()) { + traceError("deviceInfoList isEmpty") + return@getRoadCrossInfo + } + roadCrossCameraList = it.deviceInfoList + // 地图上打marker(注意marker方向),marker点击获取对应ip + ThreadUtils.runOnUiThread { + it.deviceInfoList.forEach { deviceInfo -> + addCameraDeviceMarker(deviceInfo) + } + } + }, + onError = { + traceError("roadCrossInfo request errorMsg: $it") + }) + } else { + traceError("roadCross is null") + } + } else { + CallerLogger.d("$M_MAP$TAG", "distance:$distance") + } + } + + private fun addCameraDeviceMarker(cameraDeviceInfo: CameraDeviceInfo) { + mContext?.let { + val builder = + Point.Options.Builder(TAG, Level.MAP_MARKER) + .setId(cameraDeviceInfo.deviceIp) + .anchor(0.5f, 1f) + .scale(0.6f) + .set3DMode(false) + .flat(false) + .isUseGps(true) + .controlAngle(false) + .icon(BitmapFactory.decodeResource(it.resources, R.drawable.road_camera)) + .moveToCenter(false) + .longitude(cameraDeviceInfo.lon) + .latitude(cameraDeviceInfo.lat) + .onClick { id -> + CallerLogger.d("$M_MAP$TAG", "Marker click :$id") + CallerMapRoadListenerManager.invokeRoadCrossClick() + ndeRoadCameraNetWorkModel.singleRequestCrossLive(id, + onSuccess = { live -> + CallerMapRoadListenerManager.invokeRoadCrossLive(live) + }, + onError = { errorMsg -> + traceError(" ${cameraDeviceInfo.deviceIp} click request error :$errorMsg") + }) + } + roadCrossTrace(TAG, mapOf("cameraDeviceInfo" to cameraDeviceInfo)) + overlayManager?.showOrUpdatePoint(builder.build()) + } + } + + @SuppressLint("NewApi") + private fun batchRequestCrossLive(cameraDeviceInfo: List) { + val list = mutableListOf() + cameraDeviceInfo.forEach { + list.add(it.deviceIp) + } + ndeRoadCameraNetWorkModel.batchRequestCrossLive(list, + onSuccess = { + + }, onError = { + + }) + } + + override fun onStopLineInfo(info: StopLine) { + super.onStopLineInfo(info) + distance = info.distance + } + + override fun onRoadChange(cross: Boolean, roadCross: RoadCross?) { + super.onRoadChange(cross, roadCross) + // 出路口 + if(!isCameraRequest){ + CallerLogger.d("$M_MAP$TAG", "未触发路口获取marker") + return + } + if (!cross) { + // 停止请求摄像头数据 + ndeRoadCameraNetWorkModel.cancelRequest("roadCross") + // 清除marker + CallerLogger.d("$M_MAP$TAG", "remove marker handler") + handler.sendEmptyMessageDelayed(REQUEST_CAMERA_MSG, REMOVE_MARKER_DELAY_TIME) + // 释放控制 + isCameraRequest = false + CallerLogger.d("$M_MAP$TAG", "经过路口,释放控制") + } + } + + private fun traceError(msg: String) { + if (DebugConfig.isDebug()) { + ToastUtils.showLong(msg) + } + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + roadCrossTrace( + TAG, mapOf( + "errorMsg" to msg, + "lat" to loc.latitude, + "lon" to loc.longitude + ) + ) + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_MAP, + nodeAliasCode = ChainConstant.CHAIN_CODE_MAP_ROAD_CROSS_ERROR, + paramIndexes = [0] + ) + private fun roadCrossTrace(tag: String, paramMap: Any) { + CallerLogger.d("$M_MAP$tag", "$paramMap") + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/INDERoadCameraApiService.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/INDERoadCameraApiService.kt new file mode 100644 index 0000000000..32b7724535 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/INDERoadCameraApiService.kt @@ -0,0 +1,50 @@ +package com.mogo.eagle.core.function.business.roadcross.net + +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.road.RoadCameraLive +import com.mogo.eagle.core.data.road.RoadCrossCamera +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.POST +import retrofit2.http.Query + +const val ROAD_CAMERA = "abilitySupport/rss/crossDevice" +const val SINGLE_LIVE = "abilitySupport/rss/queryLive" +const val BATCH_LIVE = "abilitySupport/rss/queryLiveAll" + +interface INDERoadCameraApiService { + + // 获取路口处,路侧直播流设备ip地址(批量返回) + @GET(ROAD_CAMERA) + suspend fun roadCameraRequest( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Query("roadUniqueId") roadId: String, + @Query("lon") lon: Double, + @Query("lat") lat: Double, + @Query("cityCode") cityCode: String + ): BaseResponse> + + // 单ip查询设备直播流与缩略图 + @GET(SINGLE_LIVE) + suspend fun cameraLiveSingleRequest( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Query("ip") ip: String, + @Query("lon") lon: Double, + @Query("lat") lat: Double, + @Query("cityCode") cityCode: String + ): BaseResponse + + // 批量ip查询设备直播流与缩略图 + @Headers("Content-type:application/json;charset=UTF-8") + @POST(BATCH_LIVE) + suspend fun cameraLiveBatchRequest( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Body map: MutableMap + ): BaseResponse> + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/NDERoadCameraNetWorkModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/NDERoadCameraNetWorkModel.kt new file mode 100644 index 0000000000..ffa8d7c940 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/NDERoadCameraNetWorkModel.kt @@ -0,0 +1,131 @@ +package com.mogo.eagle.core.function.business.roadcross.net + +import com.mogo.commons.constants.HostConst +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.road.RoadCameraLive +import com.mogo.eagle.core.data.road.RoadCrossCamera +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.cancel +import com.mogo.eagle.core.network.request +import com.mogo.eagle.core.utilcode.util.Md5Util +import java.util.Locale + +class NDERoadCameraNetWorkModel private constructor() { + + companion object { + val ndeRoadCameraNetWorkModel by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + NDERoadCameraNetWorkModel() + } + } + + private fun getNetWorkApi(baseUrl: String = HostConst.getNDEHost()): INDERoadCameraApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(INDERoadCameraApiService::class.java) + } + + fun getRoadCrossInfo( + crossID: String, + onSuccess: ((RoadCrossCamera) -> Unit), + onError: ((String) -> Unit) + ) { + request>>("roadCross") { + loader { + apiCall { + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val pair = getAuth(ROAD_CAMERA) + getNetWorkApi().roadCameraRequest( + pair.first, + pair.second, + crossID, + loc.longitude, + loc.latitude, + CallerMapUIServiceManager.getCityCode() ?: "" +// "0734" //todo emArrow test + ) + } + } + onSuccess { + if (it.result.isNotEmpty()) { + onSuccess.invoke(it.result[0]) + } else { + onError.invoke("getRoadCrossInfo empty camera info") + } + } + onError { + onError.invoke(it.message.toString()) + } + } + } + + fun singleRequestCrossLive( + ip: String, onSuccess: ((RoadCameraLive) -> Unit), + onError: ((String) -> Unit) + ) { + request>("roadCross") { + loader { + apiCall { + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val pair = getAuth(SINGLE_LIVE) + getNetWorkApi().cameraLiveSingleRequest( + pair.first, + pair.second, + ip, + loc.longitude, + loc.latitude, + CallerMapUIServiceManager.getCityCode() ?: "" +// "0734" //todo emArrow test + ) + } + } + onSuccess { + onSuccess.invoke(it.result) + } + onError { + onError.invoke(it.message.toString()) + } + } + } + + fun batchRequestCrossLive( + list: MutableList, onSuccess: ((List) -> Unit), + onError: ((String) -> Unit) + ) { + request>>("roadCross") { + loader { + apiCall { + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val cityCode = CallerMapUIServiceManager.getCityCode() ?: "" + val map = mutableMapOf( + "lon" to loc.longitude, + "lat" to loc.latitude, + "ipList" to list, + "cityCode" to cityCode + ) + val pair = getAuth(BATCH_LIVE) + getNetWorkApi().cameraLiveBatchRequest(pair.first, pair.second, map) + } + } + onSuccess { + onSuccess.invoke(it.result) + } + onError { + onError.invoke(it.message.toString()) + } + } + } + + fun cancelRequest(tag: String) { + cancel(tag) + } + + private fun getAuth(url: String): Pair { + val time = System.currentTimeMillis().toString() + val md5String = "/${url.uppercase(Locale.getDefault())}$time" + val auth = Md5Util.getMD5Result(md5String) + return Pair(auth, time) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MapRouteProviderImpl.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MapRouteProviderImpl.kt new file mode 100644 index 0000000000..65b9d4a0a6 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MapRouteProviderImpl.kt @@ -0,0 +1,16 @@ +package com.mogo.eagle.core.function.business.routeoverlay + +import android.content.Context +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.map.route.IMapRouteProvider + +@Route(path = MogoServicePaths.PATH_MAP_ROUTE_GUIDE) +class MapRouteProviderImpl: IMapRouteProvider { + + override fun setRouteDynamicColorEnable(enable: Boolean) { + RouteStrategy.isEnable = enable + } + + override fun init(context: Context?) { } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java index c962aa952a..3724222891 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java @@ -1,32 +1,26 @@ package com.mogo.eagle.core.function.business.routeoverlay; -import android.util.Log; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.config.HdMapBuildConfig; 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.IMoGoPlanningTrajectoryListener; +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener; 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.CallerPlanningTrajectoryListenerManager; +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager; -import org.jetbrains.annotations.NotNull; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; import mogo.telematics.pad.MessagePad; -import mogo_msg.MogoReportMsg; -import system_master.SsmInfo; -import system_master.SystemStatusInfo; public class MogoRouteOverlayManager implements IMoGoPlanningTrajectoryListener, @@ -36,6 +30,57 @@ public class MogoRouteOverlayManager implements private final LinkedList> queue = new LinkedList<>(); + private final AtomicBoolean hasGreenWave = new AtomicBoolean(false); + + private final IViewControlListener listener = new IViewControlListener() { + + @Override + public void v2xEventVisible(int v, String tag) { + + } + + @Override + public void updateFuncMode(@NonNull String tag, boolean b) { + } + + @Override + public void updateStatusBarDownloadView(boolean insert, @NonNull String tag, int progress) { + } + + @Override + public void updateConnectionProgressView(boolean visible) { + } + + @Override + public void updateStatusBarLeftView(boolean insert, @NonNull String tag, @NonNull ViewGroup viewGroup) { + } + + @Override + public void updateStatusBarRightView(boolean insert, @NonNull String tag, @NonNull ViewGroup viewGroup) { + } + + @Override + public void setStatusBarDarkOrLight(boolean light) { + } + + @Override + public void mainPageViewVisible(int v) { + } + + @Override + public void visible(int v) { + } + + @Override + public void onGreenWaveViewVisible(int min, int max, int cross) { + hasGreenWave.set(true); + } + + @Override + public void onGreenWaveViewDismiss() { + hasGreenWave.set(false); + } + }; private MogoRouteOverlayManager() { } @@ -43,6 +88,7 @@ public class MogoRouteOverlayManager implements public void init() { CallerPlanningTrajectoryListenerManager.INSTANCE.addListener(TAG, this); CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 20,this); + CallerHmiViewControlListenerManager.INSTANCE.addListener(TAG, listener); } public static MogoRouteOverlayManager getInstance() { @@ -78,7 +124,7 @@ public class MogoRouteOverlayManager implements return; } // Log.d(TAG, "-- onChassisLocationGCJ02 -- 2 ---" + "auto-mode:" + autoPilotState + ", isDemoMode:" + FunctionBuildConfig.isDemoMode + ", force:" + FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView); - boolean force = FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView || FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData; + boolean force = hasGreenWave.get() || FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView || FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData; if (!force && autoPilotState != 2) { RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); return; @@ -88,7 +134,7 @@ public class MogoRouteOverlayManager implements if (!queue.isEmpty()) { List items = queue.pollLast(); if (items != null && !items.isEmpty()) { - RouteOverlayDrawer.getInstance().drawTrajectoryList(items, gnssInfo.getHeading()); + RouteOverlayDrawer.getInstance().drawTrajectoryList(items, gnssInfo.getHeading(), hasGreenWave.get()); } } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java index e162b3eadd..bdbd113d63 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteOverlayDrawer.java @@ -23,6 +23,7 @@ import com.zhidaoauto.map.sdk.open.common.tools.MapTools; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import kotlin.Pair; import mogo.telematics.pad.MessagePad; @@ -41,8 +42,9 @@ public class RouteOverlayDrawer { //用于taxi乘客屏渐变颜色集合 - private static List colors = null; + private List colors = null; + private final List greenWaveColors = new ArrayList<>(); private RouteOverlayDrawer() { // 渐变色 mogoOverlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager(); @@ -62,6 +64,18 @@ public class RouteOverlayDrawer { } }; renderTask.start(); + //Color.parseColor("#996DFED0"), Color.parseColor("#CC6DFED0"), Color.parseColor("#C76DFED0"), Color.parseColor("#006DFED0") + ArrayList> temps = new ArrayList<>(); + temps.add(new Pair<>(0, 51)); + temps.add(new Pair<>(10, 102)); + temps.add(new Pair<>(30, 51)); + temps.add(new Pair<>(100, 0)); + List alphas = MapTools.INSTANCE.getColorAlpha(temps); + if (alphas != null && !alphas.isEmpty()) { + for (int i : alphas) { + greenWaveColors.add(Color.argb(i, 109,254,208)); + } + } } } @@ -81,7 +95,7 @@ public class RouteOverlayDrawer { if (mRenderTask != null) { mRenderHandler.removeCallbacks(mRenderTask); } - mogoOverlayManager.removeAllLinesInLevel(Level.GUIDE_ROUTE_LINE); + mogoOverlayManager.hideAllLinesInLevel(Level.GUIDE_ROUTE_LINE); } } @@ -92,15 +106,17 @@ public class RouteOverlayDrawer { private final LinkedList points; private double bearing; + private boolean hasGreenWave; public RenderTask() { this.pools = new Pools.SimplePool<>(500); this.points = new LinkedList<>(); } - public void setData(List routeList, double bearing) { + public void setData(List routeList, double bearing, boolean hasGreenWave) { this.routeList = routeList; this.bearing = bearing; + this.hasGreenWave = hasGreenWave; } @SuppressLint("LongLogTag") @@ -121,11 +137,11 @@ public class RouteOverlayDrawer { isExcept = true; return; } - boolean isColorfulStrategy = !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode); + boolean isColorfulStrategy = !hasGreenWave && !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode); if (isColorfulStrategy) { RouteStrategy.INSTANCE.start(); } else { - if (colors == null) { + if (colors == null || colors.isEmpty()) { ArrayList> temps = new ArrayList<>(); temps.add(new Pair<>(0, 51)); temps.add(new Pair<>(10, 102)); @@ -133,7 +149,7 @@ public class RouteOverlayDrawer { temps.add(new Pair<>(100, 0)); List alphas = MapTools.INSTANCE.getColorAlpha(temps); if (alphas != null && !alphas.isEmpty()) { - colors = new ArrayList<>(); + colors = new CopyOnWriteArrayList<>(); for (int i : alphas) { colors.add(Color.argb(i, 48,203,251)); } @@ -172,9 +188,9 @@ public class RouteOverlayDrawer { } double lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); double lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); - if (points.size() > 0) { + if (!points.isEmpty()) { MogoLatLng top = null; - while (points.size() != 0) { + while (!points.isEmpty()) { MogoLatLng first = points.peek(); if (first == null) { continue; @@ -194,7 +210,7 @@ public class RouteOverlayDrawer { } top = first; } - if (points.size() == 0) { + if (points.isEmpty()) { isExcept = true; return; } @@ -227,12 +243,20 @@ public class RouteOverlayDrawer { builder.setLightColor(COLOR_LIGHT); builder.setLightSpeed(0.3f); } else { - if (colors != null && !colors.isEmpty()) { - builder.colors(colors); - builder.setIsGradient(true); - builder.setLightOn(true); - builder.setLightColor(COLOR_LIGHT); - builder.setLightSpeed(0.3f); + if (!hasGreenWave) { + if (colors != null && !colors.isEmpty()) { + builder.colors(colors); + builder.setIsGradient(true); + builder.setLightOn(true); + builder.isShowArrow(false); + builder.setLightColor(COLOR_LIGHT); + builder.setLightSpeed(0.3f); + } + } else { + builder.colors(greenWaveColors) + .setIsGradient(true) + .setLightOn(false) + .isShowArrow(true); } } builder.points(points); @@ -251,7 +275,7 @@ public class RouteOverlayDrawer { if (isExcept) { setVisible(false); } - if (points.size() > 0) { + if (!points.isEmpty()) { for (int i = 0; i < points.size(); i++) { MogoLatLng latLng = points.get(i); if (latLng == null) { @@ -270,12 +294,12 @@ public class RouteOverlayDrawer { private volatile RenderTask mRenderTask; - public void drawTrajectoryList(List routeList, double bearing) { + public void drawTrajectoryList(List routeList, double bearing, boolean hasGreenWave) { if (mogoOverlayManager != null) { if (mRenderTask == null) { mRenderTask = new RenderTask(); } - mRenderTask.setData(routeList, bearing); + mRenderTask.setData(routeList, bearing, hasGreenWave); if (mRenderHandler != null) { mRenderHandler.removeCallbacks(mRenderTask); mRenderHandler.post(mRenderTask); diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteStrategy.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteStrategy.kt index 842b39524f..39fe240313 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteStrategy.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/RouteStrategy.kt @@ -3,13 +3,11 @@ package com.mogo.eagle.core.function.business.routeoverlay import android.animation.ArgbEvaluator import android.graphics.Color import android.view.animation.AccelerateInterpolator -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_BLUE import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_BLUE_DARK import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_RED_DARK import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_TRANSPARENT -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import java.util.* import kotlin.properties.Delegates @@ -42,7 +40,7 @@ class ColorfulStrategy(private val colors: List = emptyList(), var isLightO object RouteStrategy { - private var isEnable by Delegates.observable(HmiBuildConfig.isShowRouteStrategy) { _, _, newValue -> + internal var isEnable by Delegates.observable(HmiBuildConfig.isShowRouteStrategy) { _, _, newValue -> if (!newValue) { strategy = null colors.clear() diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java new file mode 100644 index 0000000000..2ecfd9468c --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java @@ -0,0 +1,106 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay; + +import android.util.Log; +import android.util.Pair; + +import androidx.annotation.Nullable; + +import com.mogo.commons.utils.MogoAnalyticUtils; +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.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.util.ThreadUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import mogo.telematics.pad.MessagePad; + +public class MogoTrajectoryOverlayManager implements IMoGoPlanningRottingListener, IMoGoChassisLocationGCJ02Listener { + private static volatile MogoTrajectoryOverlayManager sInstance; + private static final String TAG = "MogoTrajectoryOverlayManager"; + private static final String ANALYTICS_KEY = "mogo_map_trajectory_overlay_manager"; + + private final List queue = new ArrayList<>(); + + private MogoTrajectoryOverlayManager() { + } + + public void init() { + CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, this); + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 1, this); + } + + public static MogoTrajectoryOverlayManager getInstance() { + if (sInstance == null) { + synchronized (MogoTrajectoryOverlayManager.class) { + if (sInstance == null) { + sInstance = new MogoTrajectoryOverlayManager(); + //需要先初始化,否则第一次调用drawTrajectoryOverlayOnce()会因为mRenderHandler=null实际不会绘制 + TrajectoryOverlayDrawer.getInstance(); + } + } + } + return sInstance; + } + + @Override + public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp globalPathResp) { + if (globalPathResp != null) { + CallerLogger.i(TAG, "onAutopilotRotting size=" + globalPathResp.getWayPointsList().size()); + synchronized (queue) { + queue.clear(); + queue.addAll(globalPathResp.getWayPointsList()); + } + trackEvent("onAutopilotRotting", "接收到全局轨迹规划, size=" + globalPathResp.getWayPointsList().size()); + } + } + + @Override + public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { + + } + + public Pair drawTrajectoryOverlayOnce() { + CallerLogger.i(TAG, "drawTrajectoryOverlayOnce"); + trackEvent("drawTrajectoryOverlayOnce", "开始执行"); + synchronized (queue) { + if (queue != null && !queue.isEmpty()) { + double heading = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getHeading(); + TrajectoryOverlayDrawer.getInstance().drawTrajectoryList(queue, heading); + trackEvent("drawTrajectoryOverlayOnce", "执行结果(result=true, msg=success)"); + return new Pair(true, "success"); + } + trackEvent("drawTrajectoryOverlayOnce", "执行结果(result=false, msg=全局轨迹未就绪或为空)"); + return new Pair(false, "全局轨迹未就绪或为空"); + } + } + + public void clearTrajectoryOverlay(boolean isClearData) { + CallerLogger.i(TAG, "clearTrajectoryOverlay"); + trackEvent("clearTrajectoryOverlay", "开始执行"); + TrajectoryOverlayDrawer.getInstance().clearMogoTrajectoryOverlay(); + if (isClearData) { + queue.clear(); + } + trackEvent("clearTrajectoryOverlay", "success"); + } + + public void trackEvent(String eventKey, String eventValue) { + ThreadUtils.getIoPool().submit(new Runnable() { + @Override + public void run() { + Log.i(TAG, eventKey + "-->" + eventValue); + Map map = new HashMap(); + map.put(eventKey, eventValue); + MogoAnalyticUtils.INSTANCE.track(ANALYTICS_KEY, map); + } + }); + } +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayProvider.kt new file mode 100644 index 0000000000..c2ea315c0c --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayProvider.kt @@ -0,0 +1,43 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay + +import android.content.Context +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.map.trajectory.IMoGoGlobalTrajectoryDrawListener +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import java.util.concurrent.atomic.AtomicReference + +@Route(path = MogoServicePaths.PATH_MAP_GLOBAL_TRAJECTORY) +class MogoTrajectoryOverlayProvider : IMoGoGlobalTrajectoryDrawListener { + + companion object { + private const val TAG = "MogoTrajectoryOverlayProvider" + } + + private var hasDrawn = AtomicReference(false) + + override fun init(context: Context?) { + CallerLogger.i(TAG, "---init---") + } + + override fun hasDrawnGlobalTrajectory(): Boolean { + val result = hasDrawn.get() + CallerLogger.i(TAG, "hasDrawnGlobalTrajectory --> hasDrawn=$result") + return result + } + + override fun drawGlobalTrajectory(): Pair { + val result = MogoTrajectoryOverlayManager.getInstance().drawTrajectoryOverlayOnce() + if (result.first) { + hasDrawn.set(result.first) + } + CallerLogger.i(TAG, "drawGlobalTrajectory --> hasDrawn=$hasDrawn, result.first=${result.first}, result.second=${result.second}") + return Pair(result.first, result.second) + } + + override fun clearGlobalTrajectory(isClearData: Boolean) { + MogoTrajectoryOverlayManager.getInstance().clearTrajectoryOverlay(isClearData) + hasDrawn.set(false) + CallerLogger.i(TAG, "clearGlobalTrajectory --> hasDrawn=$hasDrawn") + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java new file mode 100644 index 0000000000..7f7104eab5 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java @@ -0,0 +1,288 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay; + +import static com.mogo.map.MogoMap.DEFAULT; + +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; + +import androidx.core.util.Pools; + +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; +import com.mogo.map.overlay.IMoGoOverlayManager; +import com.mogo.map.overlay.core.Level; +import com.mogo.map.overlay.line.Polyline; +import com.zhidaoauto.map.sdk.open.common.tools.MapTools; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import kotlin.Pair; +import mogo.telematics.pad.MessagePad; + +public class TrajectoryOverlayDrawer { + + private static final String TAG = "TrajectoryOverlayDrawer"; + + // 连接线参数 + private Handler mRenderHandler; + private final IMoGoOverlayManager mogoOverlayManager; + private static volatile TrajectoryOverlayDrawer sInstance; + private static final byte[] obj = new byte[0]; + private Polyline.Options mPolylineOptions; + private static final int COLOR_LIGHT = Color.parseColor("#BAEBF5"); + private static final int mPolylineWidth = 50; + + //用于taxi乘客屏渐变颜色集合 + private static List colors = null; + + private TrajectoryOverlayDrawer() { + // 渐变色 + mogoOverlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager(); + if (mogoOverlayManager != null) { + mPolylineOptions = new Polyline.Options.Builder("trajectory_overlay", Level.TRAJECTORY_LINE) + .setUseGps(true) + .setWidth(mPolylineWidth) + .setIsGradient(true) + .build(); + + // 线条粗细,渐变,渐变色值 + HandlerThread renderTask = new HandlerThread("trajectory_render") { + @Override + protected void onLooperPrepared() { + super.onLooperPrepared(); + mRenderHandler = new Handler(getLooper()); + } + }; + renderTask.start(); + } + } + + public static TrajectoryOverlayDrawer getInstance() { + if (sInstance == null) { + synchronized (obj) { + if (sInstance == null) { + sInstance = new TrajectoryOverlayDrawer(); + } + } + } + return sInstance; + } + + public void clearMogoTrajectoryOverlay() { + if (mogoOverlayManager != null) { + if (mRenderTask != null) { + mRenderHandler.removeCallbacks(mRenderTask); + } + mogoOverlayManager.hideAllLinesInLevel(Level.TRAJECTORY_LINE); + } + } + + private class RenderTask implements Runnable { + private volatile List routeList; + private final Pools.Pool pools; + private final LinkedList points; + private double bearing; + + public RenderTask() { + this.pools = new Pools.SimplePool<>(500); + this.points = new LinkedList<>(); + } + + public void setData(List routeList, double bearing) { + this.routeList = routeList; + this.bearing = bearing; + } + + @SuppressLint("LongLogTag") + @Override + public void run() { + IMoGoOverlayManager overlayManager = mogoOverlayManager; + if (overlayManager == null) { + return; + } + LinkedList pps = this.points; + boolean isExcept = false; + int total; + + try { + pps.clear(); + List routes = this.routeList; + if (routes == null || (total = routes.size()) < 2) { + isExcept = true; + return; + } + //boolean isColorfulStrategy = !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode); + //全局轨迹线 没有颜色策略,使用固定颜色 + boolean isColorfulStrategy = false; + if (isColorfulStrategy) { + TrajectoryStrategy.INSTANCE.start(); + } else { + if (colors == null) { + ArrayList> temps = new ArrayList<>(); + temps.add(new Pair<>(0, 70)); + temps.add(new Pair<>(2, 100)); + temps.add(new Pair<>(98, 100)); + temps.add(new Pair<>(100, 70)); + List alphas = MapTools.INSTANCE.getColorAlpha(temps); + if (alphas != null && !alphas.isEmpty()) { + colors = new ArrayList<>(); + for (int i : alphas) { + colors.add(Color.argb(i, 48,163,255)); + } + } + } + } + for (int i = 0; i < total; i++) { + MessagePad.Location route = null; + try { + route = routes.get(i); + if (route == null) { + continue; + } + } catch (Throwable t) { + Log.d("Trajectory", "render-error:" + t.getMessage()); + } + if (route == null) { + //数组越界了,结束循环 + break; + } + MogoLatLng acquire = pools.acquire(); + double latitude = route.getLatitude(); + double longitude = route.getLongitude(); + if (acquire == null) { + acquire = new MogoLatLng(latitude, longitude); + } else { + acquire.lon = longitude; + acquire.lat = latitude; + } + pps.add(acquire); + } +// double lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); +// double lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); + if (points.size() > 0) { +// MogoLatLng top = null; +// while (points.size() != 0) { +// MogoLatLng first = points.peek(); +// if (first == null) { +// continue; +// } +// if (first == top) { +// break; +// } +// lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); +// lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); +// long angle = isPointOnCarFront(lon, lat, bearing, first.lon, first.lat); +// if (angle >= 90) { +// if (isColorfulStrategy) { +// TrajectoryStrategy.INSTANCE.remove(first.acc); +// } +// pools.release(first); +// points.poll(); +// } +// top = first; +// } +// if (points.size() == 0) { +// isExcept = true; +// return; +// } +// MogoLatLng self = pools.acquire(); +// if (self == null) { +// self = new MogoLatLng(lat, lon); +// } else { +// self.lat = lat; +// self.lon = lon; +// } +// points.addFirst(self); + + Polyline.Options.Builder builder; + if (mPolylineOptions == null) { + builder = new Polyline.Options.Builder("trajectory_overlay", Level.TRAJECTORY_LINE) + .setUseGps(true) + .setWidth(mPolylineWidth) + .setIsGradient(false); + } else { + builder = mPolylineOptions.builder(); + } + + if (isColorfulStrategy) { + TrajectoryStrategy.INSTANCE.end(); + Strategy strategy = TrajectoryStrategy.INSTANCE.getStrategy(); + List colors = strategy.getColors(); + boolean isLightOn = strategy instanceof ColorfulStrategy && ((ColorfulStrategy) strategy).isLightOn(); + builder.colors(colors); + builder.setLightOn(isLightOn); + //builder.setLightColor(COLOR_LIGHT); + //builder.setLightSpeed(0.3f); + } else { + if (colors != null && !colors.isEmpty()) { + builder.colors(colors); + builder.setIsGradient(true); + builder.setLightOn(false); + //builder.setLightColor(COLOR_LIGHT); + //builder.setLightSpeed(0.3f); + } + } + builder.points(points); + builder.setVisible(true); + Polyline.Options options = builder.build(); + if (mPolylineOptions == null) { + mPolylineOptions = options; + } + overlayManager.showOrUpdateLine(options,DEFAULT); + } else { + isExcept = true; + } + } catch (Throwable t) { + t.printStackTrace(); + } finally { + if (isExcept) { + setVisible(false); + } + if (points.size() > 0) { + for (int i = 0; i < points.size(); i++) { + MogoLatLng latLng = points.get(i); + if (latLng == null) { + continue; + } + pools.release(latLng); + } + } + } + } + + private long isPointOnCarFront(double car_lon, double car_lat, double car_head, double lon, double lat) { + return DrivingDirectionUtils.getDegreeOfCar2Poi2(car_lon, car_lat, lon, lat, car_head); + } + } + + private volatile RenderTask mRenderTask; + + public void drawTrajectoryList(List routeList, double bearing) { + if (mogoOverlayManager != null) { + if (mRenderTask == null) { + mRenderTask = new RenderTask(); + } + mRenderTask.setData(routeList, bearing); + if (mRenderHandler != null) { + mRenderHandler.removeCallbacks(mRenderTask); + mRenderHandler.post(mRenderTask); + } + } + } + + private void setVisible(boolean isVisible) { + if (mogoOverlayManager != null) { + if (isVisible) { + mogoOverlayManager.showAllLinesInLevel(Level.TRAJECTORY_LINE); + } else { + mogoOverlayManager.hideAllLinesInLevel(Level.TRAJECTORY_LINE); + } + } + } +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt new file mode 100644 index 0000000000..690c56abd2 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt @@ -0,0 +1,170 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay + +import android.animation.ArgbEvaluator +import android.graphics.Color +import android.view.animation.AccelerateInterpolator +import com.mogo.eagle.core.data.config.HmiBuildConfig +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_BLUE +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_BLUE_DARK +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_RED_DARK +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_TRANSPARENT +import java.util.NavigableMap +import java.util.TreeMap +import kotlin.properties.Delegates + + +interface IStrategy { + fun getColors(): List +} + +class Colors { + + companion object { + val COLOR_BLUE = Color.parseColor("#FF2ABAD9") + val COLOR_BLUE_DARK = Color.parseColor("#FF074EFF") + val COLOR_RED_DARK = Color.parseColor("#FF0FF5F0") + val COLOR_TRANSPARENT = Color.parseColor("#002ABAD9") + } +} + +sealed class Strategy : IStrategy + +class DefaultStrategy(private val colors: List? = null) : Strategy() { + + override fun getColors(): List = colors ?: listOf(COLOR_BLUE, COLOR_TRANSPARENT) +} + +class ColorfulStrategy(private val colors: List = emptyList(), var isLightOn: Boolean) : + Strategy() { + override fun getColors(): List = colors +} + +object TrajectoryStrategy { + + private var isEnable by Delegates.observable(HmiBuildConfig.isShowRouteStrategy) { _, _, newValue -> + if (!newValue) { + strategy = null + colors.clear() + } + } + + private var strategy: Strategy? = null + + private val colors: ArrayList = ArrayList() + + private var index = 0 + + private val sorted: NavigableMap by lazy { TreeMap() } + + private var endEvaluator: ArgbEvaluator? = null + + private var startColor = Int.MAX_VALUE + + private var hasLessThan0 = false + + fun start() { + if (sorted.isEmpty()) { + fill() + } + strategy = null + index = 0 + startColor = Int.MAX_VALUE + colors.clear() + endEvaluator = null + hasLessThan0 = false + } + + fun end() { + if (isEnable) { + if (colors.isEmpty()) { + return + } + val first = colors[0] + colors.add(0, first) + strategy = ColorfulStrategy(colors, true) + } + } + + fun check(speed: Double, acc: Double, total: Int) { + if (!isEnable) { + return + } + if (sorted.isEmpty()) { + return + } + if (acc < 0) { + hasLessThan0 = true + } + val delta = (total * 0.35).toInt() + val last = total - delta + val entry = sorted.floorEntry(acc) + if (entry != null) { + if (index >= last - 1) { + if (startColor == Int.MAX_VALUE) { + startColor = entry.value + if (endEvaluator == null) { + endEvaluator = ArgbEvaluator() + } + colors += entry.value + } else { + if (endEvaluator != null) { + val fraction = (index - last) * 1.0f / delta + colors += endEvaluator!!.evaluate( + fraction, + startColor, + COLOR_TRANSPARENT + ) as Int + } + } + } else { + colors += entry.value + } + } + index++ + } + + fun remove(acc: Double): List { + if (!isEnable) { + return emptyList() + } + if (sorted.isEmpty()) { + throw AssertionError("sorted map must not be null.") + } + val entry = sorted.floorEntry(acc) + if (entry != null) { + colors.remove(entry.value) + } + return ArrayList(colors) + } + + private fun fill() { + var startValue = -4.0 + var endValue = 0.0 + val step = 0.01 + var current = startValue + val evaluator = ArgbEvaluator() + val interceptor = AccelerateInterpolator() + var total = endValue - startValue + while (current <= endValue) { + val fraction = interceptor.getInterpolation(((current - startValue) / total).toFloat()) + val colorValue = evaluator.evaluate(fraction, COLOR_RED_DARK, COLOR_BLUE) as Int + sorted[current] = colorValue + current += step + } + startValue = 0.01 + endValue = 3.0 + current = startValue + total = endValue - startValue + while (current <= endValue) { + val fraction = (current - startValue) / total + val colorValue = + evaluator.evaluate(fraction.toFloat(), COLOR_BLUE, COLOR_BLUE_DARK) as Int + sorted[current] = colorValue + current += step + } + } + + fun getStrategy(): Strategy = if (isEnable) { + (strategy ?: DefaultStrategy()) + } else DefaultStrategy() +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/CrossDeviceBean.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/CrossDeviceBean.kt new file mode 100644 index 0000000000..f3224caab7 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/CrossDeviceBean.kt @@ -0,0 +1,21 @@ +package com.mogo.eagle.core.function.business.travelreality + +data class CrossDeviceBean( + var crossingId: String?, + var lon: Double, + var roadUniqueId: String?, + var lat: Double, + var deviceInfoList: List? +) + +data class DeviceInfoBean( + var deviceIp: String?, + var lon: Double, + var lat: Double +) { + /** + * 该点相对于最近轨迹线段AB的位置 + * 0:左,1:上,2:右,3:下 + */ + var orientation: Int = 0 +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventBean.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventBean.kt new file mode 100644 index 0000000000..2f231f98d4 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventBean.kt @@ -0,0 +1,21 @@ +package com.mogo.eagle.core.function.business.travelreality +data class EventBean( + var poiType: String?,// 事件类型 + var ip: String?,// 摄像头ip + var id: String?, + var lon: Double,// 施工、交通事故的中心点坐标 + var lat: Double,// 拥堵事件的第一个点 + var centerJwdLine: List?,// 拥堵的路段 + var polygon: List?,// 施工、交通事故(延后50m的) + var origPolygon: List?// 施工、交通事故(识别的) +) { + /** + * 该点相对于最近轨迹线段AB的位置 + * 0:左,1:上,2:右,3:下 + */ + var orientation: Int = 0 + var title: String? = "" + var resId: Int = 0 +} + +data class GeoCoord(var lon: Double, var lat: Double) \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventDrawBean.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventDrawBean.kt new file mode 100644 index 0000000000..bc7efdaba6 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventDrawBean.kt @@ -0,0 +1,3 @@ +package com.mogo.eagle.core.function.business.travelreality + +data class EventDrawBean(var resId: Int, var title: String) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventReqEntity.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventReqEntity.kt new file mode 100644 index 0000000000..584890c8c4 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/EventReqEntity.kt @@ -0,0 +1,7 @@ +package com.mogo.eagle.core.function.business.travelreality + +data class EventReqEntity( + var points: List, + var cityCode: String = "0734", + var adCode: String = "" +) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/Point.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/Point.kt new file mode 100644 index 0000000000..f9b7d93da4 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/Point.kt @@ -0,0 +1,3 @@ +package com.mogo.eagle.core.function.business.travelreality + +data class Point(var lon: Double, var lat: Double) \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/TravelRealityModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/TravelRealityModel.kt new file mode 100644 index 0000000000..c996b22223 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/TravelRealityModel.kt @@ -0,0 +1,537 @@ +package com.mogo.eagle.core.function.business.travelreality + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.graphics.drawable.Drawable +import android.util.Log +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition +import com.mogo.commons.constants.HostConst +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.Response +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.road.RoadCameraLive +import com.mogo.eagle.core.function.business.roadcross.net.BATCH_LIVE +import com.mogo.eagle.core.function.business.roadcross.net.INDERoadCameraApiService +import com.mogo.eagle.core.function.business.travelreality.view.VideoMarkerEntity +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.apiResponseCall +import com.mogo.eagle.core.network.cancel +import com.mogo.eagle.core.network.request +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils +import com.mogo.eagle.core.utilcode.util.LocationUtils +import com.mogo.eagle.core.utilcode.util.Md5Util +import me.jessyan.autosize.utils.AutoSizeUtils +import java.util.Locale +import java.util.concurrent.ConcurrentHashMap + +class TravelRealityModel private constructor() { + + @Volatile + private var eventKey = "" + + @Volatile + private var deviceKey = "" + + @Volatile + private var trackKey = "" + + @Volatile + private var liveKey = "" + + private val targetMap by lazy { + ConcurrentHashMap() + } + + companion object { + val travelNetWorkModel by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + TravelRealityModel() + } + } + + private fun getNetWorkApi(baseUrl: String = HostConst.getNDEHost()): TravelRealityService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(TravelRealityService::class.java) + } + + /** + * 查询道路事件 + */ + fun getEventsWithTrajRequest( + reqData: EventReqEntity, + onSuccess: ((List) -> Unit), onError: ((String) -> Unit) + ) { + eventKey = "getEvents_${System.currentTimeMillis()}" + request?>>(eventKey) { + loader { + apiResponseCall { + val time = System.currentTimeMillis().toString() + val md5String = "${ROAD_EVENT_TRAJECTORY.uppercase(Locale.getDefault())}$time" + Log.d("TravelRealityModel", "查询道路事件轨迹点个数为:${reqData.points.size}") + getNetWorkApi(HostConst.getNDEHost()).getEventsWithTrajRequest( + Md5Util.getMD5Result( + md5String + ), time, reqData + ) + } + } + onSuccess { + if (eventKey.isEmpty()) { + Log.w("TravelRealityModel", "getEventsWithTrajRequest不处理onSuccess") + return@onSuccess + } + onSuccess.invoke(it.data ?: ArrayList()) + } + onError { + if (eventKey.isEmpty()) { + Log.w("TravelRealityModel", "getEventsWithTrajRequest不处理onError") + return@onError + } + onError.invoke(it.message ?: "") + } + } + } + + /** + * 查询路口设备 + */ + fun getCrossDevice(onSuccess: ((List) -> Unit), onError: ((String) -> Unit)) { + deviceKey = "getDevice_${System.currentTimeMillis()}" + request?>>(deviceKey) { + loader { + apiCall { + val time = System.currentTimeMillis().toString() + val md5String = "${CROSS_DEVICE.uppercase(Locale.getDefault())}$time" + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var cityCode = CallerMapUIServiceManager.getCityCode() ?: "0734" + if (cityCode.isEmpty()) { + cityCode = "0734" + } + getNetWorkApi(HostConst.getNDEHost()).getCrossDevice( + Md5Util.getMD5Result( + md5String + ), time, "", loc.longitude, loc.latitude, cityCode + ) + } + } + onSuccess { + if (deviceKey.isEmpty()) { + Log.w("TravelRealityModel", "getCrossDevice不处理onSuccess") + return@onSuccess + } + onSuccess.invoke(it.result ?: ArrayList()) + } + onError { + if (deviceKey.isEmpty()) { + Log.w("TravelRealityModel", "getCrossDevice不处理onError") + return@onError + } + onError.invoke(it.message ?: "") + } + } + } + + fun cancelAllRequest() { + if (eventKey.isNotEmpty()) { + eventKey = "" + cancel(eventKey) + } + if (deviceKey.isNotEmpty()) { + deviceKey = "" + cancel(deviceKey) + } + if (trackKey.isNotEmpty()) { + trackKey = "" + cancel(trackKey) + } + if (liveKey.isNotEmpty()) { + liveKey = "" + cancel(liveKey) + } + clearDownload() + } + + /** + * 智慧路口路网范围 + */ + fun getCityRoadRange(onSuccess: ((List?>?) -> Unit), onError: ((String) -> Unit)) { + request?>?>> { + loader { + apiCall { + val time = System.currentTimeMillis().toString() + val md5String = "${CITY_ROAD_RANGE.uppercase(Locale.getDefault())}$time" + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var cityCode = CallerMapUIServiceManager.getCityCode() ?: "0734" + if (cityCode.isEmpty()) { + cityCode = "0734" + } + getNetWorkApi(HostConst.getNDEHost()).getCityRoadRange( + Md5Util.getMD5Result( + md5String + ), time, loc.longitude, loc.latitude, cityCode + ) + } + } + onSuccess { + onSuccess.invoke(it.result) + } + onError { + onError.invoke(it.message ?: "") + } + } + } + + /** + * 智慧道路轨迹 + */ + fun getCityRoadTrack( + onSuccess: ((List?>?>?) -> Unit), + onError: ((String) -> Unit) + ) { + trackKey = "getTrack_${System.currentTimeMillis()}" + request?>?>?>>(trackKey) { + loader { + apiCall { + val time = System.currentTimeMillis().toString() + val md5String = "${CITY_ROAD_TRACK.uppercase(Locale.getDefault())}$time" + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var cityCode = CallerMapUIServiceManager.getCityCode() ?: "0734" + if (cityCode.isEmpty()) { + cityCode = "0734" + } + getNetWorkApi(HostConst.getNDEHost()).getCityRoadTrack( + Md5Util.getMD5Result( + md5String + ), time, loc.longitude, loc.latitude, cityCode + ) + } + } + onSuccess { + if (trackKey.isEmpty()) { + Log.w("TravelRealityModel", "getCityRoadTrack不处理onSuccess") + return@onSuccess + } + onSuccess.invoke(it.result) + } + onError { + if (trackKey.isEmpty()) { + Log.w("TravelRealityModel", "getCityRoadTrack不处理onError") + return@onError + } + onError.invoke(it.message ?: "") + } + } + } + + fun batchRequestCrossLive( + list: MutableList, onSuccess: ((List) -> Unit), + onError: ((String) -> Unit) + ) { + liveKey = "batchLive_${System.currentTimeMillis()}" + request>>(liveKey) { + loader { + apiCall { + val time = System.currentTimeMillis().toString() + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + var cityCode = CallerMapUIServiceManager.getCityCode() ?: "0734" + if (cityCode.isEmpty()) { + cityCode = "0734" + } + val map = mutableMapOf( + "lon" to loc.longitude, + "lat" to loc.latitude, + "ipList" to list, + "cityCode" to cityCode + ) + val md5String = "/${BATCH_LIVE.uppercase(Locale.getDefault())}$time" + MoGoRetrofitFactory.getInstanceNoCallAdapter(HostConst.getNDEHost()) + .create(INDERoadCameraApiService::class.java) + .cameraLiveBatchRequest(Md5Util.getMD5Result(md5String), time, map) + } + } + onSuccess { + if (liveKey.isEmpty()) { + Log.w("TravelRealityModel", "batchRequestCrossLive不处理onSuccess") + return@onSuccess + } + onSuccess.invoke(it.result) + } + onError { + if (liveKey.isEmpty()) { + Log.w("TravelRealityModel", "batchRequestCrossLive不处理onError") + return@onError + } + onError.invoke(it.message.toString()) + } + } + } + + fun downloadImage( + context: Context, url: String?, + videoMarkerList: MutableList, + onSuccess: ((Bitmap, MutableList) -> Unit), + onFailed: ((MutableList) -> Unit) + ) { + if (url.isNullOrEmpty()) return + Log.d("TravelRealityModel", "下载缩略图!") + val radiusPx = AutoSizeUtils.dp2px(context, 24f).toFloat() + val options = RequestOptions().transform( + GranularRoundedCorners(radiusPx, radiusPx, 0f, 0f) + ) + val target = object : CustomTarget() { + override fun onResourceReady(resource: Bitmap, transition: Transition?) { + if (!targetMap.containsKey("CustomTarget_${this.hashCode()}")) { + Log.w("TravelRealityModel", "downloadImage不处理onResourceReady") + return + } + onSuccess(resource, videoMarkerList) + } + + override fun onLoadCleared(placeholder: Drawable?) {} + + override fun onLoadFailed(errorDrawable: Drawable?) { + super.onLoadFailed(errorDrawable) + if (!targetMap.containsKey("CustomTarget_${this.hashCode()}")) { + Log.w("TravelRealityModel", "downloadImage不处理onLoadFailed") + return + } + onFailed(videoMarkerList) + } + } + targetMap["CustomTarget_${target.hashCode()}"] = 1 + Glide.with(context).asBitmap() + .apply(options) + .load(url) + .into(target) + } + + private fun clearDownload() { + Log.w("TravelRealityModel", "clearDownload") + targetMap.clear() + } + + /** + * 计算Marker相对最近线段ab应该摆放的位置 + * 0:左,1:上,2:右,3:下 + */ + fun calculateOrientation( + pLon: Double, + pLat: Double, + aLon: Double, + aLat: Double, + bLon: Double, + bLat: Double + ): Int { + // 0:左,1:上,2:右,3:下 + var orientation = 0 + // 线段与正北方向的夹角,范围[0,360] + val abAngle = DrivingDirectionUtils.getLineAngle(aLon, aLat, bLon, bLat) + + if (abAngle in 70.0..110.0 || abAngle in 250.0..290.0) {// 接近水平方向 + // 先比较纬度,然后比较向量叉积 + if (pLat > aLat && pLat > bLat) { + orientation = 1 + } else if (pLat < aLat && pLat < bLat) { + orientation = 3 + } else { + // 0:在线段上,1:左侧,2:右侧,3:上方,4:下方(逆时针方向看左、上) + when (LocationUtils.checkLocation(pLon, pLat, aLon, aLat, bLon, bLat)) { + 1 -> { + orientation = if (abAngle > 180) {// 地图上从右往左的左侧 + 3 + } else {// 地图上从左往右的左侧 + 1 + } + } + + 2 -> { + orientation = if (abAngle > 180) { + 1 + } else { + 3 + } + } + + else -> {// 点p在线段ab所在的直线上 + orientation = 1// 未计算后面线段,写死上方 + } + } + } + } else { + when (LocationUtils.checkLocation(pLon, pLat, aLon, aLat, bLon, bLat)) { + 1 -> {// 逆时针方向为左侧 + orientation = when { + abAngle in 0.0..90.0 -> { + 0// 地图上的左侧 + } + + abAngle > 90.0 && abAngle <= 180 -> { + 2// 地图上的右侧 + } + + abAngle > 180.0 && abAngle <= 270.0 -> { + 2// 地图上的右侧 + } + + else -> { + 0// 地图上的左侧 + } + } + } + + 2 -> {// 顺时针方向为右侧 + orientation = when { + abAngle in 0.0..90.0 -> { + 2// 地图上的右侧 + } + + abAngle > 90.0 && abAngle <= 180 -> { + 0// 地图上的左侧 + } + + abAngle > 180.0 && abAngle <= 270.0 -> { + 0// 地图上的左侧 + } + + else -> { + 2// 地图上的右侧 + } + } + } + + else -> {// 点p在线段ab所在的直线上 + orientation = 0// 未计算后面线段,写死左侧 + } + } + } + return orientation + } + + /** + * 锚点和EventVideoView相关联的 + */ + fun calculateAnchor(orientation: Int): Pair { + // 0:左,1:上,2:右,3:下 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + return when (orientation) { + 0 -> { + Pair(0.98f, 0.51f) + } + + 1 -> { + Pair(0.49f, 0.99f) + } + + 2 -> { + Pair(0.02f, 0.49f) + } + + else -> { + Pair(0.51f, 0.02f) + } + } + } else { + return when (orientation) { + 0 -> { + Pair(0.94f, 0.48f) + } + + 1 -> { + Pair(0.49f, 0.94f) + } + + 2 -> { + Pair(0.05f, 0.47f) + } + + else -> { + Pair(0.50f, 0.04f) + } + } + } + } + + /** + * 根据卡片朝向和卡片定位计算四个顶点的屏幕坐标 + */ + fun calculateVertex(context: Context, orientation: Int, point: Point): List { + val anchorPair = calculateAnchor(orientation) + val pointList = ArrayList() + var width = 0 + var height = 0 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + when (orientation) { + 0 -> {// 内容居左,箭头朝右 + width = AutoSizeUtils.dp2px(context, 420f) + height = AutoSizeUtils.dp2px(context, 350f) + } + + 1 -> { + width = AutoSizeUtils.dp2px(context, 350f) + height = AutoSizeUtils.dp2px(context, 420f) + } + + 2 -> { + width = AutoSizeUtils.dp2px(context, 420f) + height = AutoSizeUtils.dp2px(context, 350f) + } + + else -> { + width = AutoSizeUtils.dp2px(context, 350f) + height = AutoSizeUtils.dp2px(context, 420f) + } + } + } else { + when (orientation) { + 0 -> {// 内容居左,箭头朝右 + width = AutoSizeUtils.dp2px(context, 426f) + height = AutoSizeUtils.dp2px(context, 354f) + } + + 1 -> { + width = AutoSizeUtils.dp2px(context, 354f) + height = AutoSizeUtils.dp2px(context, 426f) + } + + 2 -> { + width = AutoSizeUtils.dp2px(context, 426f) + height = AutoSizeUtils.dp2px(context, 354f) + } + + else -> { + width = AutoSizeUtils.dp2px(context, 354f) + height = AutoSizeUtils.dp2px(context, 426f) + } + } + } + var leftTopP = Point() + leftTopP.x = (point.x - width * anchorPair.first + 0.5).toInt() + leftTopP.y = (point.y - height * anchorPair.second + 0.5).toInt() + + var rightTopP = Point() + rightTopP.x = (leftTopP.x + width + 0.5).toInt() + rightTopP.y = leftTopP.y + + var leftBottomP = Point() + leftBottomP.x = leftTopP.x + leftBottomP.y = (leftTopP.y + height + 0.5).toInt() + + var rightBottomP = Point() + rightBottomP.x = (leftTopP.x + width + 0.5).toInt() + rightBottomP.y = (leftTopP.y + height + 0.5).toInt() + + pointList.add(leftTopP) + pointList.add(rightTopP) + pointList.add(leftBottomP) + pointList.add(rightBottomP) + return pointList + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/TravelRealityService.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/TravelRealityService.kt new file mode 100644 index 0000000000..afa7315222 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/TravelRealityService.kt @@ -0,0 +1,69 @@ +package com.mogo.eagle.core.function.business.travelreality + +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.Response +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.POST +import retrofit2.http.Query + +const val ROAD_EVENT_TRAJECTORY = "/abilitySupport/trajInfo/getEventsWithTrajectories" +const val CROSS_DEVICE = "/abilitySupport/rss/crossDevice" +const val CITY_ROAD_RANGE = "/abilitySupport/rss/cityRoadRange" +const val CITY_ROAD_TRACK = "/abilitySupport/rss/cityRoadTrack" + +interface TravelRealityService { + + /** + * 根据做标记集合获取道路事件 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @POST(ROAD_EVENT_TRAJECTORY) + suspend fun getEventsWithTrajRequest( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Body reqData: EventReqEntity + ): Response> + + /** + * 查询路口设备 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET(CROSS_DEVICE) + suspend fun getCrossDevice( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Query("roadUniqueId") roadUniqueId: String?, + @Query("lon") lon: Double, + @Query("lat") lat: Double, + @Query("cityCode") cityCode: String? + ): BaseResponse> + + /** + * 查询路口路网范围 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET(CITY_ROAD_RANGE) + suspend fun getCityRoadRange( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Query("lon") lon: Double, + @Query("lat") lat: Double, + @Query("cityCode") cityCode: String? + ): BaseResponse>> + + /** + * 查询智慧道路轨迹 + */ + @Headers("Content-type:application/json;charset=UTF-8") + @GET(CITY_ROAD_TRACK) + suspend fun getCityRoadTrack( + @Header("MogoAuthKey") authKey: String, + @Header("MogoReqTime") time: String, + @Query("lon") lon: Double, + @Query("lat") lat: Double, + @Query("cityCode") cityCode: String? + ): BaseResponse>>> +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/view/EventVideoView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/view/EventVideoView.kt new file mode 100644 index 0000000000..ca4de5deb5 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/view/EventVideoView.kt @@ -0,0 +1,81 @@ +package com.mogo.eagle.core.function.business.travelreality.view + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.map.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils + +@SuppressLint("ViewConstructor") +class EventVideoView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + val title: String? = "", + val orientation: Int = 0 +) : ConstraintLayout ( + context, + attrs, + defStyleAttr +) { + + init { + // 0:左,1:上,2:右,3:下 + when (orientation) { + 0 -> { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_right_d_maker, this, true) + } else { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_right_maker, this, true) + } + } + 1 -> { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_down_d_maker, this, true) + } else { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_down_maker, this, true) + } + } + 2 -> { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_left_d_maker, this, true) + } else { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_left_maker, this, true) + } + } + else -> { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_up_d_maker, this, true) + } else { + LayoutInflater.from(context).inflate(R.layout.layout_event_toward_up_maker, this, true) + } + } + } + initView() + } + + private lateinit var videoImgView: ImageView + + private fun initView() { + videoImgView = findViewById(R.id.videoImg) + val titleView = findViewById(R.id.tvTitle) + title?.let { + titleView.text = it + } + } + + fun setBitmap(bitmap: Bitmap) { + videoImgView.setImageBitmap(bitmap) + } + + fun setPlaceHolder() { + videoImgView.setImageResource(R.drawable.video_marker_place_holder) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/view/VideoMarkerEntity.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/view/VideoMarkerEntity.kt new file mode 100644 index 0000000000..ec947927c7 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/travelreality/view/VideoMarkerEntity.kt @@ -0,0 +1,5 @@ +package com.mogo.eagle.core.function.business.travelreality.view + +import com.amap.api.maps.model.LatLng + +data class VideoMarkerEntity(var latLng: LatLng, var title: String? = "", var orientation: Int = 0) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CameraMarkerView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CameraMarkerView.kt new file mode 100644 index 0000000000..9161be3786 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CameraMarkerView.kt @@ -0,0 +1,76 @@ +package com.mogo.eagle.core.function.view + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.view.ViewGroup +import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener +import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager +import com.mogo.eagle.core.function.map.R +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import me.jessyan.autosize.utils.AutoSizeUtils + + +class CameraMarkerView(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + androidx.appcompat.widget.AppCompatImageView(context, attrs, defStyleAttr), + IMoGoSkinModeChangeListener { + + companion object { + private const val TAG = "CameraMarkerView" + } + + init { + if (this.layoutParams == null) { + this.setLayoutParams( + ViewGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + ) + } + modeChange(CallerSkinModeListenerManager.getMode()) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerSkinModeListenerManager.addListener(TAG, this) + } + + override fun onSkinModeChange(skinMode: Int) { + ThreadUtils.runOnUiThread { + modeChange(skinMode) + } + } + + private fun modeChange(mode: Int) { + when (mode) { + 0 -> { + setImageResource(R.drawable.map_marker_camera_view_select) + resize(106, 121) + } + 1 -> { + setImageResource(R.drawable.map_marker_camera_view_right_light_select) + resize(74, 83) + } + else -> { + setImageResource(R.drawable.map_marker_camera_view_select) + resize(106, 121) + } + } + } + + private fun resize(width: Int, height: Int) { + //设置宽高 + val params = layoutParams + params.width = AutoSizeUtils.dp2px(context, width.toFloat()) + params.height = AutoSizeUtils.dp2px(context, height.toFloat()) + layoutParams = params + requestLayout() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerSkinModeListenerManager.removeListener(TAG) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt index cbbf92f0a5..9918680cdb 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt @@ -9,12 +9,11 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig.accThreshold import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLamplightListener import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener -import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener 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.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP +import com.mogo.map.MogoMap import com.mogo.map.MogoMapView import com.mogo.map.overlay.line.Polyline import com.mogo.map.overlay.point.Point @@ -25,7 +24,6 @@ import kotlin.properties.Delegates class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, attrs), - IMoGoSkinModeChangeListener, IMoGoChassisLocationWGS84Listener, IMoGoChassisLamplightListener, LifecycleObserver { companion object { @@ -36,8 +34,7 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, super.onCreate(bundle) map?.uiController?.showMyLocation(true) initMapView() - CallerSkinModeListenerManager.addListener(TAG, this) - CallerChassisLocationWGS84ListenerManager.addListener(TAG, 20,this) + CallerChassisLocationWGS84ListenerManager.addListener(TAG, 20, this) CallerChassisLamplightListenerManager.addListener(TAG, this) } @@ -63,15 +60,19 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, } } - fun getUI(): IMogoMapUIController? { + override fun getInstanceTag(): String { + return MogoMap.DEFAULT + } + + fun getUI(): IMogoMapUIController? { return map?.uiController } - fun addLine(options:Polyline.Options): IMapPolylineOverlay? { + fun addLine(options: Polyline.Options): IMapPolylineOverlay? { return map?.addLine(options) } - fun addPoint(options: Point.Options): IMapPointOverlay?{ + fun addPoint(options: Point.Options): IMapPointOverlay? { return map?.addPoint(options) } @@ -87,22 +88,14 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, super.onPause() } - override fun onSkinModeChange(skinMode: Int) { - if (skinMode == 0) { - getUI()?.stepInDayMode(false) - } else if (skinMode == 1) { - getUI()?.stepInDayMode(true) - } - } - /** * 设置车辆灯光状态 true 刹车, false 正常 */ - private var accLimit : Boolean by Delegates.observable(false){ _, oldV, newV -> - if(oldV != newV){ - if(newV){ + private var accLimit: Boolean by Delegates.observable(false) { _, oldV, newV -> + if (oldV != newV) { + if (newV) { turn(4) - }else{ + } else { turn(0) } } @@ -114,7 +107,7 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, accLimit = gnssInfo.acceleration < accThreshold } - private var currentLevel:Int = 0 + private var currentLevel: Int = 0 override fun onAutopilotLightSwitchData(lightSwitch: Chassis.LightSwitch?) { super.onAutopilotLightSwitchData(lightSwitch) @@ -123,9 +116,11 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, Chassis.LightSwitch.LIGHT_LEFT_VALUE -> { //左转灯 turn(1) } + Chassis.LightSwitch.LIGHT_RIGHT_VALUE -> { //右转灯 turn(2) } + Chassis.LightSwitch.LIGHT_NONE_VALUE -> { turn(0) } @@ -142,7 +137,6 @@ class MapBizView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, override fun onDestroy() { // 先取消注册数据,再onDestroy - CallerSkinModeListenerManager.removeListener(TAG) CallerChassisLocationWGS84ListenerManager.removeListener(TAG) CallerChassisLamplightListenerManager.removeListener(TAG) super.onDestroy() diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapRoamView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapRoamView.kt new file mode 100644 index 0000000000..b55a5d95a6 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapRoamView.kt @@ -0,0 +1,156 @@ +package com.mogo.eagle.core.function.view + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import androidx.lifecycle.LifecycleObserver +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.api.map.roma.IMoGoAiCloudIdentifyDataListener +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager +import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapAiCloudDataManager +import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider +import com.mogo.map.MogoMap.Companion.MAP_ROAM +import com.mogo.map.MogoMapView +import com.mogo.map.uicontroller.IMogoMapUIController +import com.mogo.map.uicontroller.VisualAngleMode +import com.zhjt.service.chain.ChainLog +import mogo.yycp.api.proto.SocketDownData + + +class MapRoamView(context: Context?, attrs: AttributeSet?) : MogoMapView(context, attrs), + LifecycleObserver, IMoGoMapRoadListener, IMoGoAiCloudIdentifyDataListener { + + companion object { + private const val TAG = "MapRoamView" + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + initMapView() + } + + private fun initMapView() { + getUI()?.showMyLocation(false) + map?.uiSettings?.let { + it.setAllGesturesEnabled(false) + //设置指南针是否可见。 + it.setCompassEnabled(false) + //设置室内地图楼层切换控件是否可见。 + it.setIndoorSwitchEnabled(false) + //设置定位按钮是否可见。 + it.setMyLocationButtonEnabled(false) + //设置比例尺控件是否可见 + it.setScaleControlsEnabled(false) + } + CallerMapAiCloudDataManager.addListener(RoadCrossRoamView.TAG, this) + } + + override fun getInstanceTag(): String { + return MAP_ROAM + } + + private fun getUI(): IMogoMapUIController? { + return map?.uiController + } + + @SuppressLint("ObsoleteSdkInt") + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + var size = 12f + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + size = 16f + } else if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + size = 12f + } + this.outlineProvider = TextureVideoViewOutlineProvider(size) + this.clipToOutline = true + } + + fun openRoam() { + this.onResume() + getUI()?.setVisible(true) + getUI()?.showMyLocation(false) + // 更新地图视角 - 高视角 + getUI()?.changeMapVisualAngle(VisualAngleMode.MAP_STYLE_VR_ANGLE_TOP, null) + // 更新路口位置 + val latLng = CallerMapRoadListenerManager.getStopLineLatLng() + latLng?.let { + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val curLat = loc.latitude + val curLng = loc.longitude + loc.latitude = latLng.first + loc.longitude = latLng.second + setExtraGPSData(loc) + val dis = + CoordinateUtils.calculateLineDistance(curLat, curLng, latLng.first, latLng.second) + // 开始漫游 + trace( + TAG, + mapOf("startRoadRoam" to Pair("latLng" to latLng, "dis" to dis), "dis" to dis) + ) + CallerMapIdentifyManager.updateRoam(RoadCrossRoamView.TAG, true) + aiCloudIdentifyDataManager.trigger(true, 1, 300, latLng.first, latLng.second) + } + } + + fun updateLoc(){ + val latLng = CallerMapRoadListenerManager.getStopLineLatLng() + latLng?.let { + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + loc.latitude = latLng.first + loc.longitude = latLng.second + setExtraGPSData(loc) + } + } + + override fun response(requestStatus: Boolean, errorMsg: String?) { + trace(TAG, mapOf("response" to requestStatus, "errorMsg" to (errorMsg ?: ""))) + if(!requestStatus || errorMsg!=null){ + CallerMapIdentifyManager.updateRoam("", false) + } + } + + override fun onAiIdentifyData(obj: SocketDownData.SocketDownDataProto?) { + obj?.let { + obj.data?.let { + if (it.allListList == null || it.allListList.size == 0) { + MapIdentifySubscriber.instance.clearAiCloudRoma(MAP_ROAM) + return + } + MapIdentifySubscriber.instance.renderAiCloudResult(it.allListList, MAP_ROAM) + } + } + } + + fun closeRoam() { + // 结束漫游 + val latLng = CallerMapRoadListenerManager.getStopLineLatLng() + latLng?.let { + aiCloudIdentifyDataManager.trigger(false, 1, 300, it.first, it.second) + } + MapIdentifySubscriber.instance.clearAiCloudRoma(MAP_ROAM) + this.onPause() + getUI()?.setVisible(false) + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ROAD_ROMA, + paramIndexes = [0, 1] + ) + private fun trace(tag: String, obj: Any) { + CallerLogger.d("$M_MAP$tag", "$obj") + } + +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt index c2c8e9d9cc..bb8801b16a 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt @@ -237,9 +237,6 @@ class OverMapView @JvmOverloads constructor( if (mMapView != null) { mMapView!!.onDestroy() } - if (mMapView != null) { - mMapView!!.onDestroy() - } } // =================必须通知高德地图生命周期的变化================= diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamListAdapter.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamListAdapter.kt new file mode 100644 index 0000000000..8aee2c7bc8 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamListAdapter.kt @@ -0,0 +1,70 @@ +package com.mogo.eagle.core.function.view + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.ProgressBar +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.function.map.R +import kotlin.random.Random + + +class RoadCrossRoamListAdapter(private val mContext: Context, private val lightMode: Boolean) : RecyclerView.Adapter() { + + private val items: MutableList = mutableListOf() + + init { + items.add("前方路况拥堵分析") + items.add("路口危险车辆分析") + items.add("路口交通事故分析") + items.add("路口行人碰撞分析") + if(lightMode){ + items.add("路口非机动车分析") + items.add("路口灯态分析") + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view: View = LayoutInflater.from(mContext).inflate(R.layout.item_road_cross_roam_tip, parent, false) + return ViewHolder(view) + } + + override fun getItemCount(): Int { + return if(lightMode) 6 else 4 + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = items[position] + if(lightMode){ + holder.textView.setTextColor(mContext.getColor(R.color.color_191A1C)) + }else{ + holder.textView.setTextColor(mContext.getColor(R.color.white)) + } + holder.textView.text = item + // 随机决定是否显示ProgressBar +// if (Random.nextBoolean()) { // 50%的几率显示ProgressBar + holder.progressBar.visibility = View.VISIBLE + holder.checkIcon.visibility = View.GONE + + val r0 = Random.nextInt(0,3) + val r1 = Random.nextInt(1,9) + // 模拟加载完成 + holder.itemView.postDelayed({ + holder.progressBar.visibility = View.GONE + holder.checkIcon.visibility = View.VISIBLE + },r0 * 1000L + r1 * 100L) +// } else { +// holder.progressBar.visibility = View.GONE +// holder.checkIcon.visibility = View.VISIBLE +// } + } + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var textView: TextView = itemView.findViewById(R.id.tvRoadItemTip) + var progressBar: ProgressBar = itemView.findViewById(R.id.pbRoadItemTip) + var checkIcon: ImageView = itemView.findViewById(R.id.ivRoadItemTip) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamView.kt new file mode 100644 index 0000000000..fd536ecc21 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamView.kt @@ -0,0 +1,311 @@ +package com.mogo.eagle.core.function.view + +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Rect +import android.os.Handler +import android.os.Looper +import android.os.Message +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.animation.LinearInterpolator +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.V2X_EVENT_TAG +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager +import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager +import com.mogo.eagle.core.function.map.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.zhidaoauto.map.data.road.StopLine +import kotlinx.android.synthetic.main.view_road_cross_roam.view.ivCoverRoam +import kotlinx.android.synthetic.main.view_road_cross_roam.view.ivRoadRoamClose +import kotlinx.android.synthetic.main.view_road_cross_roam.view.lvRoadCrossRoamTip +import kotlinx.android.synthetic.main.view_road_cross_roam.view.mapRoamView +import kotlinx.android.synthetic.main.view_road_cross_roam_light.view.clScanningBg +import kotlinx.android.synthetic.main.view_road_cross_roam_light.view.ivZhiRoadRoamSet +import kotlinx.android.synthetic.main.view_road_cross_roam_light.view.ivZhiRoadRoamView +import kotlinx.android.synthetic.main.view_road_cross_roam_light.view.tvRoadRoamTitle +import me.jessyan.autosize.utils.AutoSizeUtils +import kotlin.properties.Delegates + + +class RoadCrossRoamView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoMapRoadListener, IViewControlListener { + + companion object { + const val TAG = "RoadCrossRoamView" + private const val MSG_HIDE_VIEW = 0 + private const val MSG_HIDE_VIEW_TIME = 10_000L + } + + private var showState by Delegates.observable(false) { _, oldV, newV -> + if (oldV != newV) { + updateView(newV) + } + } + + private var animator: ObjectAnimator? = null + private var rotationAnim: ObjectAnimator? = null + private var lightMode = CallerSkinModeListenerManager.getMode() == 1 + private var animScale = false + + private val handler = object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + if (msg.what == MSG_HIDE_VIEW) { + detachView() + } + } + } + + init { + val res = if (lightMode) { + R.layout.view_road_cross_roam_light + } else { + R.layout.view_road_cross_roam + } + LayoutInflater.from(context).inflate(res, this, true) + lvRoadCrossRoamTip.layoutManager = NoScrollLayoutManager(context) + lvRoadCrossRoamTip.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.bottom = 24 + } + }) + ivRoadRoamClose.setOnClickListener { + detachView() + } + } + + override fun mainPageViewVisible(v: Int) { + super.mainPageViewVisible(v) + if (v == View.GONE && this.visibility == View.VISIBLE) { + detachView() + } + } + + override fun v2xEventVisible(v: Int, tag: String) { + super.v2xEventVisible(v, tag) + if (this.visibility == View.GONE) { + return + } + if (animScale) { + return + } + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + if (tag == V2X_EVENT_TAG && v == View.VISIBLE) { + val anim = ValueAnimator.ofInt(height, 475) + anim.duration = 500 + anim.addUpdateListener { animation -> + val value = animation.animatedValue as Int + setHeight(value) + } + anim.start() + + val animMap = ValueAnimator.ofInt(160, 84) + animMap.duration = 500 + animMap.addUpdateListener { animation -> + val value = animation.animatedValue as Int + (mapRoamView.layoutParams as? MarginLayoutParams)?.topMargin = value + (clScanningBg.layoutParams as? MarginLayoutParams)?.topMargin = value + } + animMap.start() + + val animTxt = ValueAnimator.ofInt(32, 22) + animTxt.duration = 500 + animTxt.addUpdateListener { animation -> + val value = animation.animatedValue as Int + (tvRoadRoamTitle.layoutParams as? MarginLayoutParams)?.topMargin = value + } + animTxt.start() + + (tvRoadRoamTitle.layoutParams as? MarginLayoutParams)?.leftMargin = 0 + (mapRoamView.layoutParams as? MarginLayoutParams)?.height = 280 + (clScanningBg.layoutParams as? MarginLayoutParams)?.height = 280 + mapRoamView.requestLayout() + clScanningBg.requestLayout() + tvRoadRoamTitle.requestLayout() + + mapRoamView.updateLoc() + + lvRoadCrossRoamTip.visibility = View.GONE + ivZhiRoadRoamSet.visibility = View.GONE + ivZhiRoadRoamView.visibility = View.GONE + tvRoadRoamTitle.text = "为您全面扫描潜在风险" + animScale = true + } + } + } + + private fun setHeight(height: Int) { + layoutParams.height = height + requestLayout() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMapRoadListenerManager.addListener(TAG, this) + CallerHmiViewControlListenerManager.addListener(TAG, this) + } + + private fun updateView(state: Boolean) { + // 切换线程 + ThreadUtils.runOnUiThread { + if (state) { + attachView() + } else { + detachView() + } + } + } + + override fun onStopLineInfo(info: StopLine) { + super.onStopLineInfo(info) + if (info.distance == 0.0 || info.distance > 200) { + CallerLogger.d("$M_MAP$TAG", "showState return , distance is ${info.distance}") + return + } + showState = info.distance in 110.0..200.0 + } + + private fun attachView() { + // 没有路线不做提示 + if (CallerAutoPilotStatusListenerManager.getLineId() == 0L) { + return + } + // 处于漫游模式下不做处理 + if (CallerMapIdentifyManager.roam.second) { + if (CallerMapIdentifyManager.roam.first != TAG) { + ToastUtils.showLong("正在漫游中,不展示路口漫游") + } + CallerLogger.d("$M_MAP$TAG", "正在漫游中,不展示路口漫游") + return + } + // 首页被遮挡不做提示 + if (!CallerHmiViewControlListenerManager.getMainPageVisible()) { + CallerLogger.d("$M_MAP$TAG", "attachView return , mainPageVisible is false") + return + } + //播放语音 + val dis = CallerMapRoadListenerManager.getStopLineDistance()?.toInt() ?: 0 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + AIAssist.getInstance(context) + .speakTTSVoice("前方${dis}米将通过路口,蘑菇为您提供路口全息影像,助力出行") + } + CallerHmiViewControlListenerManager.invokeV2XEvent(View.VISIBLE, TAG) + bringToFront() + this.visibility = View.VISIBLE + ivZhiRoadRoamView.visibility = View.VISIBLE + mapRoamView.visibility = View.VISIBLE + mapRoamView.openRoam() + lvRoadCrossRoamTip.adapter = RoadCrossRoamListAdapter(context, lightMode) + // 创建横向移动的动画 + if (animator == null) { + animator = + ObjectAnimator.ofFloat( + ivCoverRoam, + "translationX", + -120f, + 540f + ) + } + animator?.duration = 1500 // 设置动画持续时间,单位为毫秒 + animator?.repeatCount = ValueAnimator.INFINITE // 设置动画无限重复 + animator?.repeatMode = ValueAnimator.RESTART // 设置动画来回移动 + animator?.start() + + if (lightMode) { + if (rotationAnim == null) { + rotationAnim = ObjectAnimator.ofFloat(ivZhiRoadRoamView, "rotation", 0f, 360f) + } + rotationAnim?.repeatCount = ValueAnimator.INFINITE + rotationAnim?.repeatMode = ValueAnimator.RESTART + rotationAnim?.duration = 1000 + rotationAnim?.interpolator = LinearInterpolator() + rotationAnim?.start() + tvRoadRoamTitle.setTextColor(context.getColor(R.color.color_131415)) + } else { + tvRoadRoamTitle.setTextColor(context.getColor(R.color.white)) + } + handler.sendEmptyMessageDelayed(MSG_HIDE_VIEW, MSG_HIDE_VIEW_TIME) + } + + private fun detachView() { + if (this.visibility == View.GONE) { + return + } + if (handler.hasMessages(MSG_HIDE_VIEW)) { + handler.removeMessages(MSG_HIDE_VIEW) + } + mapRoamView.closeRoam() + mapRoamView.visibility = View.GONE + + lvRoadCrossRoamTip.adapter = null + animator?.cancel() + if (lightMode) { + ivZhiRoadRoamView.clearAnimation() + } + + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && animScale) { + setHeight(AutoSizeUtils.dp2px(context, 970f)) + (mapRoamView.layoutParams as? MarginLayoutParams)?.topMargin = 160 + (clScanningBg.layoutParams as? MarginLayoutParams)?.topMargin = 160 + (tvRoadRoamTitle.layoutParams as? MarginLayoutParams)?.leftMargin = 35 + lvRoadCrossRoamTip.visibility = View.VISIBLE + ivZhiRoadRoamSet.visibility = View.VISIBLE + ivZhiRoadRoamView.visibility = View.VISIBLE + tvRoadRoamTitle.text = context.resources.getString(R.string.road_cross_roam_tip) + + (mapRoamView.layoutParams as? MarginLayoutParams)?.height = 300 + (clScanningBg.layoutParams as? MarginLayoutParams)?.height = 300 + mapRoamView.requestLayout() + clScanningBg.requestLayout() + tvRoadRoamTitle.requestLayout() + animScale = false + } + CallerHmiViewControlListenerManager.invokeV2XEvent(View.GONE, TAG) + this.visibility = View.GONE + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + animator?.cancel() + if (lightMode) { + ivZhiRoadRoamView.clearAnimation() + } + CallerMapRoadListenerManager.removeListener(TAG) + CallerHmiViewControlListenerManager.removeListener(TAG) + } + + private class NoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) { + override fun canScrollVertically(): Boolean { + return false + } + + override fun canScrollHorizontally(): Boolean { + return false + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt new file mode 100644 index 0000000000..2c9f3a37a2 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/TravelRealityView.kt @@ -0,0 +1,1651 @@ +package com.mogo.eagle.core.function.view + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.HandlerThread +import android.os.Looper +import android.os.Message +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import com.amap.api.maps.AMap +import com.amap.api.maps.CameraUpdate +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.TextureMapView +import com.amap.api.maps.model.BitmapDescriptor +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CustomMapStyleOptions +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.Polyline +import com.amap.api.maps.model.PolylineOptions +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.business.travelreality.CrossDeviceBean +import com.mogo.eagle.core.function.business.travelreality.DeviceInfoBean +import com.mogo.eagle.core.function.business.travelreality.EventBean +import com.mogo.eagle.core.function.business.travelreality.EventDrawBean +import com.mogo.eagle.core.function.business.travelreality.EventReqEntity +import com.mogo.eagle.core.function.business.travelreality.Point +import com.mogo.eagle.core.function.business.travelreality.TravelRealityModel.Companion.travelNetWorkModel +import com.mogo.eagle.core.function.business.travelreality.view.EventVideoView +import com.mogo.eagle.core.function.business.travelreality.view.VideoMarkerEntity +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.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.map.R +import com.mogo.eagle.core.utilcode.mogo.MapAssetStyleUtils +import com.mogo.eagle.core.utilcode.util.LocationUtils +import me.jessyan.autosize.utils.AutoSizeUtils +import mogo.telematics.pad.MessagePad + +/** + * 行程实况View + * + * @author chenfufeng + */ +class TravelRealityView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener, + IMoGoPlanningRottingListener { + + companion object { + private const val TAG = "TravelRealityView" + + private const val DRAW_POLY_LINE = 1 + private const val DRAW_CAR_LOCATION = 2 + private const val DRAW_ROAD_EVENT = 3 + private const val DRAW_CROSS_DEVICE = 4 + private const val DRAW_ROAD_RANGE = 5 + private const val DRAW_ROAD_TRAJECTORY = 6 + private const val DRAW_GLOBAL_TRAJECTORY = 7 + private const val MOVE_MAP_CAMERA = 8 + private const val DRAW_LIVE_DETAIL = 9 + private const val DRAW_END_MARKER = 10 + private const val UPDATE_VIDEO_MARKER = 11 + + // private const val CLEAR_POLY_LINE = 12 +// private const val CLEAR_ROAD_EVENT = 13 +// private const val CLEAR_CROSS_DEVICE = 14 +// private const val CLEAR_ROAD_TRAJECTORY = 15 +// private const val CLEAR_END_MARKER = 16 +// private const val CLEAR_VIDEO_MARKER = 17 + private const val CLEAR_ALL_DATA = 18 + } + + private var mContext: Context? = null + + private var mMapView: TextureMapView? = null + private var mAMap: AMap? = null + private var mCarMarker: Marker? = null + private var mCompassMarker: Marker? = null + + private var globalPolyline: Polyline? = null + private val eventMarkerList by lazy { + ArrayList() + } + private val deviceMarkerList by lazy { + ArrayList() + } + private val liveMarkerList by lazy { + ArrayList() + } + private val trajectoryPolylineList by lazy { + ArrayList() + } + private val globalPolylineList by lazy { + ArrayList() + } + private var mStartMarker: Marker? = null + private var mEndMarker: Marker? = null + + @Volatile + private var mLocation: MogoLocation? = null + + @Volatile + private var isMapLoaded = false + + @Volatile + private var isMapDestroyed = false + + // =============自定义属性相关============= + private var mapStylePath: String? = null + private var mapStyleExtraPath: String? = null + private var carDrawable: Int = -1 + private var compassDrawable: Int = -1 + private var startPointDrawable: Int = -1 + private var endPointDrawable: Int = -1 + private var leftPadding: Int = 100 + private var topPadding: Int = 150 + private var rightPadding: Int = 100 + private var bottomPadding: Int = 300 + private var isSmaller = false + + // 绘制智慧道路的范围 + private var roadRange = 56f + private var roadRangeDrawable: Int = -1 + private var roadRangeBitmap: BitmapDescriptor? = null + + // 绘制智慧道路范围内的带箭头的轨迹线 + private var roadWidth = 28f + private var roadTrajectoryDrawable: Int = -1 + private var roadTrajectoryColor: Int = Color.parseColor("#0FB2D8") + private var roadTrajectoryBitmap: BitmapDescriptor? = null + + // 轨迹线 + private var globalWidth = 18f + private var globalPathColor: Int = Color.parseColor("#49DEAE") + + +// // 测试时使用 +// private val pointBitmap1 by lazy { +// BitmapDescriptorFactory.fromBitmap(getBitmap1()) +// } +// +// private val markerOptionsList1 by lazy { +// ArrayList() +// } +// +// private val pointBitmap2 by lazy { +// BitmapDescriptorFactory.fromBitmap(getBitmap2()) +// } +// +// private val markerOptionsList2 by lazy { +// ArrayList() +// } + + /** + * 低频的 + */ + private var nonFrequentHandler: NonFrequentHandler? = null + + @Volatile + private var lastTime = 0L + + @Volatile + private var reqData: List? = null + + @Volatile + private var retryCount = 0 + + @Volatile + private var deviceList: List? = null + + /** + * 在轨迹点附近的路口设备 + */ + @Volatile + private var deviceInPathList: List?? = null + + @Volatile + private var roadTrackList: List?>?>? = null + + @Volatile + private var isRoadTrackReq = false + + @Volatile + private var isRoadEventReq = false + + @Volatile + private var isCrossDeviceReq = false + + private var testTime = 0L + + private var listener: OnDrawListener? = null + + init { + try { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TravelRealityView) + mapStylePath = typedArray.getString(R.styleable.TravelRealityView_mapStylePath) + mapStyleExtraPath = + typedArray.getString(R.styleable.TravelRealityView_mapStyleExtraPath) + carDrawable = typedArray.getResourceId(R.styleable.TravelRealityView_carDrawable, -1) + compassDrawable = + typedArray.getResourceId(R.styleable.TravelRealityView_compassDrawable, -1) + roadRangeDrawable = + typedArray.getResourceId(R.styleable.TravelRealityView_roadRangeDrawable, -1) + roadTrajectoryDrawable = + typedArray.getResourceId(R.styleable.TravelRealityView_roadTrajectoryDrawable, -1) + globalPathColor = typedArray.getInt( + R.styleable.TravelRealityView_globalPathColor, + Color.parseColor("#49DEAE") + ) + roadTrajectoryColor = typedArray.getInt( + R.styleable.TravelRealityView_roadTrajectoryColor, + Color.parseColor("#0FB2D8") + ) + startPointDrawable = + typedArray.getResourceId(R.styleable.TravelRealityView_startPointDrawable, -1) + endPointDrawable = + typedArray.getResourceId(R.styleable.TravelRealityView_endPointDrawable, -1) + leftPadding = typedArray.getInt(R.styleable.TravelRealityView_leftPadding, 0) + topPadding = typedArray.getInt(R.styleable.TravelRealityView_topPadding, 0) + rightPadding = typedArray.getInt(R.styleable.TravelRealityView_rightPadding, 0) + bottomPadding = typedArray.getInt(R.styleable.TravelRealityView_bottomPadding, 0) + isSmaller = typedArray.getBoolean(R.styleable.TravelRealityView_isSmaller, false) + typedArray.recycle() + initView(context) + } catch (e: Exception) { + e.printStackTrace() + Log.d(TAG, "TravelRealityView初始化异常") + } + } + + // =================必须通知高德地图生命周期的变化================= + fun onCreateView(savedInstanceState: Bundle?) { + mMapView?.onCreate(savedInstanceState) + Log.d(TAG, "高德地图onCreateView") + } + + fun onResume() { + mMapView?.onResume() + isMapDestroyed = false + Log.d(TAG, "高德地图onResume") + } + + fun onPause() { + mMapView?.onPause() + Log.d(TAG, "高德地图onPause") + } + + fun onDestroy() { + mMapView?.onDestroy() + isMapDestroyed = true + Log.d(TAG, "高德地图页面已销毁!") + } + // =================必须通知高德地图生命周期的变化================= + + fun setOnDrawListener(listener: OnDrawListener) { + this.listener = listener + } + + /** + * 清除所有Marker和Polyline + */ + fun clearAllMarkersAndPolyline() { + Log.d(TAG, "clearAllMarkersAndPolyline") + nonFrequentHandler?.removeCallbacksAndMessages(null) + travelNetWorkModel.cancelAllRequest() + reqData = null + retryCount = 0 + // 清除之前的所有Marker + Message.obtain().apply { + what = CLEAR_ALL_DATA + nonFrequentHandler?.sendMessage(this) + } + } + + private fun initView(context: Context) { + mContext = context + val mapView = + LayoutInflater.from(context).inflate(R.layout.module_travel_reality_view, this) + mMapView = mapView.findViewById(R.id.travelMapView) + roadRangeBitmap = + BitmapDescriptorFactory.fromResource(if (roadRangeDrawable != -1) roadRangeDrawable else R.drawable.mogo_road_over) + roadTrajectoryBitmap = + BitmapDescriptorFactory.fromResource(if (roadTrajectoryDrawable != -1) roadTrajectoryDrawable else R.drawable.road_trajectory_arrow_nor) + initAMapView() + } + + private fun getBitmap1(): Bitmap { + val options = BitmapFactory.Options() + options.inSampleSize = 2 + options.inJustDecodeBounds = false + return BitmapFactory.decodeResource(resources, R.drawable.loc_azure_bg, options) + } + + private fun getBitmap2(): Bitmap { + val options = BitmapFactory.Options() + options.inSampleSize = 2 + options.inJustDecodeBounds = false + return BitmapFactory.decodeResource(resources, R.drawable.count_bg, options) + } + + private fun initAMapView() { + Log.d(TAG, "initAMapView") + mAMap = mMapView?.map + val mapStyleOptions = CustomMapStyleOptions() + if (!mapStylePath.isNullOrEmpty() && !mapStyleExtraPath.isNullOrEmpty()) { + mapStyleOptions.styleData = + MapAssetStyleUtils.getAssetsStyle(context, mapStylePath) + mapStyleOptions.styleExtraData = + MapAssetStyleUtils.getAssetsExtraStyle(context, mapStyleExtraPath) + mapStyleOptions.isEnable = true + } + // 地图文字标注 + mAMap?.showMapText(true) + //设置希望展示的地图缩放级别 + val loc = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + if (loc.latitude.toInt() == 0 || loc.longitude.toInt() == 0) { + mAMap?.moveCamera(CameraUpdateFactory.zoomTo(14f)) + } else { + mAMap?.moveCamera( + CameraUpdateFactory.newLatLngZoom( + coordinateConverterWgsToGcj( + loc.latitude, + loc.longitude + ), 14f + ) + ) + } + //设置地图的样式 + mAMap?.uiSettings?.let { + //所有手势 + it.setAllGesturesEnabled(true) + //地图缩放级别的交换按钮 + it.isZoomControlsEnabled = true + it.isZoomGesturesEnabled = true + //指南针 + it.isCompassEnabled = false + //设置倾斜手势是否可用。 + it.isTiltGesturesEnabled = false + //定位按钮 + it.isMyLocationButtonEnabled = false + } + + mAMap?.setOnMapLoadedListener { + Log.d(TAG, "地图加载完成!") + isMapLoaded = true + mAMap?.setCustomMapStyle(mapStyleOptions) + // 实时路况图层关闭,必须添加在loaded结束之后,其他位置不生效 + mAMap?.isTrafficEnabled = false + mAMap?.showBuildings(false) + mAMap?.uiSettings?.isZoomControlsEnabled = false +// mAMap?.animateCamera(CameraUpdateFactory.changeTilt(30f)) + } + } + + override fun onVisibilityChanged(changedView: View, visibility: Int) { + super.onVisibilityChanged(changedView, visibility) + if (visibility == VISIBLE) { + Log.d(TAG, "onVisibilityChanged:VISIBLE!") + val globalPath: List? = reqData + if (!globalPath.isNullOrEmpty()) { + requestData(globalPath as ArrayList) + } + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + Log.d(TAG, "onAttachedToWindow") + initHandlers() + advanceRequest() + CallerPlanningRottingListenerManager.addListener("${TAG}${this.hashCode()}", this) + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.addListener("${TAG}${this.hashCode()}", this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + Log.d(TAG, "onDetachedFromWindow") + deviceList = null + retryCount = 0 + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.removeListener("${TAG}${this.hashCode()}") + CallerPlanningRottingListenerManager.removeListener("${TAG}${this.hashCode()}") + nonFrequentHandler?.looper?.quitSafely() + nonFrequentHandler = null + travelNetWorkModel.cancelAllRequest() + } + + private fun initHandlers() { + val nonFrequentThread = HandlerThread("travel_reality_thread") + nonFrequentThread.start() + nonFrequentHandler = NonFrequentHandler(nonFrequentThread.looper) + } + + private fun advanceRequest() { + isRoadTrackReq = true + Log.d(TAG, "请求获取智慧道路轨迹!") + // 获取智慧道路轨迹 + travelNetWorkModel.getCityRoadTrack(onSuccess = { + Log.d(TAG, "Road track result is:$it") + roadTrackList = it + isRoadTrackReq = false + handleRoadTrajectories(it, reqData) + }, onError = { + isRoadTrackReq = false + Log.d(TAG, "Road track error is:$it") + }) + } + + private fun handleGlobalPath(globalData: List) { + if (globalData.isEmpty() || globalData.size < 2) return + val boundsBuilder = LatLngBounds.Builder() + + val globalOptions = PolylineOptions() + globalOptions.width(AutoSizeUtils.dp2px(context, globalWidth).toFloat()) + globalOptions.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) + globalOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound) + globalOptions.color(globalPathColor) + var pointTmp: LatLng + globalData.forEach { globalPoint -> + pointTmp = coordinateConverterWgsToGcj(globalPoint.lat, globalPoint.lon) +// markerOptionsList1.add(MarkerOptions().also { +// it.position(pointTmp) +// it.anchor(0.5f, 0.5f) +// it.icon(pointBitmap1) +// }) + boundsBuilder.include(pointTmp) + globalOptions.add(pointTmp) + } + if (mLocation != null) { + boundsBuilder.include(LatLng(mLocation!!.latitude, mLocation!!.longitude)) + } + + val cameraUpdate = CameraUpdateFactory.newLatLngBoundsRect( + boundsBuilder.build(), + AutoSizeUtils.dp2px(context, leftPadding.toFloat()), + AutoSizeUtils.dp2px(context, rightPadding.toFloat()), + AutoSizeUtils.dp2px(context, topPadding.toFloat()), + AutoSizeUtils.dp2px(context, bottomPadding.toFloat()) + ) + moveMapCamera(cameraUpdate) + +// // 旋转到水平位置 +// val startPoint = globalData[0] +// val endPoint = globalData[globalData.size - 1] +// val angle = DrivingDirectionUtils.getLineAngle(endPoint.lon, endPoint.lat, startPoint.lon, startPoint.lat) +// mAMap?.moveCamera(CameraUpdateFactory.changeBearing(LocationUtils.rotateTo90(angle).toFloat())) +// mAMap?.setMapStatusLimits(boundsBuilder.build()) + +// mAMap?.addMarkers(markerOptionsList1, false) + + val distance = LocationUtils.getDistance( + globalData[globalData.size - 1].lat, + globalData[globalData.size - 1].lon, + globalData[0].lat, + globalData[0].lon + ) + Log.w(TAG, "起终点距离为:$distance") +// if (distance < 2000) { +// roadRange = maxRoadRange +// roadWidth = minRoadWidth +// globalWidth = minGlobalWidth +// } else { +// roadRange = minRoadRange +// roadWidth = maxRoadWidth +// globalWidth = maxGlobalWidth +// } + + val endOption = MarkerOptions() + endOption.icon(BitmapDescriptorFactory.fromResource(endPointDrawable)) + endOption.position( + coordinateConverterWgsToGcj( + globalData[globalData.size - 1].lat, + globalData[globalData.size - 1].lon + ) + ) + // 绘制终点 + drawEndMarker(endOption) + // 绘制全局轨迹 + drawPolyline(DRAW_POLY_LINE, globalOptions) + } + + private fun handleRoadEvent(eventList: List, globalList: ArrayList) { + if (globalList.isNullOrEmpty()) return + testTime = System.currentTimeMillis() + if (eventList.isEmpty()) { + listener?.onDraw(emptyList(), true) + // 没有事件则全部用路口设备补齐 + retryGetCrossDevice(HashMap(), 0) + // 清除道路事件 + drawMarkers(DRAW_ROAD_EVENT, ArrayList()) + } else { + val eventDrawMap = HashMap() + val eventOptionsList = ArrayList() + var distance = 0.0 + var key = "" + val roadEvents = ArrayList() + val eventPointMap = HashMap() + globalList.forEachIndexed { index, globalPoint -> + if (index >= 0 && index < globalList.size - 1) { + eventList.forEach { eventBean -> + distance = LocationUtils.pointToLine( + globalPoint.lon, + globalPoint.lat, + globalList[index + 1].lon, + globalList[index + 1].lat, + eventBean.lon, + eventBean.lat + ) + key = "${eventBean.lon},${eventBean.lat}" + if (distance >= 10 || eventPointMap.contains(key)) { + Log.d( + TAG, + "道路事件:点(${key})到线段${index}-${index + 1}的距离为:${distance}米" + ) + return@forEach + } + eventPointMap[key] = 1 + eventBean.orientation = travelNetWorkModel.calculateOrientation( + eventBean.lon, eventBean.lat, globalPoint.lon, + globalPoint.lat, globalList[index + 1].lon, globalList[index + 1].lat, + ) + filterEventWithType(eventBean, eventOptionsList, eventDrawMap, roadEvents) + } + } + } + listener?.onDraw(eventDrawMap.values.toList(), true) + Log.d(TAG, "过滤掉的事件个数为:${eventList.size - eventOptionsList.size}") + // 事件不足3个则用路口设备补齐 + completeQuantity(roadEvents) + // 绘制道路事件 + drawMarkers(DRAW_ROAD_EVENT, eventOptionsList) + } + } + + private fun completeQuantity(roadEvents: ArrayList) { + val ipPointEntityMap = HashMap>() + // 全部展示事件,事件数不足则用路口设备补齐 + Log.d(TAG, "已绘制的道路事件个数为:${roadEvents.size}") + if (roadEvents.size >= 3) { + roadEvents[0].let { + it.ip?.also { ip -> + if (ip.isEmpty()) return@also + if (!ipPointEntityMap.containsKey(ip)) { + ipPointEntityMap[ip] = ArrayList() + } + ipPointEntityMap[ip]?.add( + VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) + ) + } + } + roadEvents[(roadEvents.size - 1) / 2].let { + it.ip?.also { ip -> + if (ip.isEmpty()) return@also + if (!ipPointEntityMap.containsKey(ip)) { + ipPointEntityMap[ip] = ArrayList() + } + ipPointEntityMap[ip]?.add( + VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) + ) + } + } + roadEvents[roadEvents.size - 1].let { + it.ip?.also { ip -> + if (ip.isEmpty()) return@also + if (!ipPointEntityMap.containsKey(ip)) { + ipPointEntityMap[ip] = ArrayList() + } + ipPointEntityMap[ip]?.add( + VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) + ) + } + } + reqCrossLive(ipPointEntityMap) + } else { + var count = 0 + roadEvents.forEach { + it.ip?.let { ip -> + if (ip.isEmpty()) return@let + count++ + if (!ipPointEntityMap.containsKey(ip)) { + ipPointEntityMap[ip] = ArrayList() + } + ipPointEntityMap[ip]?.add( + VideoMarkerEntity( + coordinateConverterWgsToGcj(it.lat, it.lon), + it.title, + it.orientation + ) + ) + } + } + retryGetCrossDevice(ipPointEntityMap, count) + } + } + + private fun filterEventWithType( + eventBean: EventBean, + eventOptionsList: ArrayList, + eventDrawMap: HashMap, + roadEvents: ArrayList + ) { + when (eventBean.poiType) { + "800003" -> {// 交通事故 + eventOptionsList.add(MarkerOptions().apply { + position(coordinateConverterWgsToGcj(eventBean.lat, eventBean.lon)) + anchor(0.5f, 0.5f) + zIndex(0.8f) + icon(BitmapDescriptorFactory.fromResource(R.drawable.mogo_shigu_nor)) + }) + eventBean.resId = R.drawable.mogo_shigu_nor + eventBean.title = "交通事故" + roadEvents.add(eventBean) + if (!eventDrawMap.containsKey("800003")) { + eventDrawMap["800003"] = EventDrawBean(R.drawable.mogo_shigu_nor, "交通事故") + } + } + + "800002" -> {// 施工 + eventOptionsList.add(MarkerOptions().apply { + position(coordinateConverterWgsToGcj(eventBean.lat, eventBean.lon)) + anchor(0.5f, 0.5f) + zIndex(0.8f) + icon(BitmapDescriptorFactory.fromResource(R.drawable.mogo_shigong_image)) + }) + eventBean.resId = R.drawable.mogo_shigong_image + eventBean.title = "道路施工" + roadEvents.add(eventBean) + if (!eventDrawMap.containsKey("800002")) { + eventDrawMap["800002"] = + EventDrawBean(R.drawable.mogo_shigong_image, "道路施工") + } + } + +// "800006" -> {// 拥堵 +// eventOptionsList.add(MarkerOptions().apply { +// position(coordinateConverterWgsToGcj(eventBean.lat, eventBean.lon)) +// anchor(0.5f, 0.5f) +// zIndex(0.8f) +// icon(BitmapDescriptorFactory.fromResource(R.drawable.mogo_yongdu_nor)) +// }) +// } + + "800004" -> {// 静止事件 + eventOptionsList.add(MarkerOptions().apply { + position(coordinateConverterWgsToGcj(eventBean.lat, eventBean.lon)) + anchor(0.5f, 0.5f) + zIndex(0.8f) + icon(BitmapDescriptorFactory.fromResource(R.drawable.mogo_jingzhi_nor)) + }) + eventBean.resId = R.drawable.mogo_jingzhi_nor + eventBean.title = "静止事件" + roadEvents.add(eventBean) + if (!eventDrawMap.containsKey("800004")) { + eventDrawMap["800004"] = EventDrawBean(R.drawable.mogo_jingzhi_nor, "静止事件") + } + } + + else -> { + Log.d(TAG, "请求到未知事件!") + } + } + } + + /** + * 等待路口设备数据请求结束 + * handleRoadEvent -> 计算Marker方向 -> completeQuantity -> retryGetCrossDevice(等待缓存deviceInPathList结束) -> 获取deviceInPathList -> 获取Marker方向 + * handleCrossDevices -> 计算Marker方向 -> 缓存deviceInPathList + */ + private fun retryGetCrossDevice( + ipPointEntityMap: HashMap>, + eventSize: Int + ) { + Log.d(TAG, "retryGetCrossDevice") + val crossDeviceListTmp = deviceInPathList + while (crossDeviceListTmp.isNullOrEmpty()) { + if (retryCount >= 5) { + Log.d(TAG, "尝试多次后仍无法获取到路口设备数据!") + break + } + Thread.sleep(250) + retryCount++ + } + var maxSize = 3 - eventSize + if (maxSize <= 0) { + Log.d(TAG, "全息路口个数计算有误则返回!") + return + } + Log.d(TAG, "待查询缩略图的事件个数为:${eventSize}") + if (!crossDeviceListTmp.isNullOrEmpty()) { + Log.d(TAG, "缓存的全息路口个数为:${crossDeviceListTmp.size}") + // 轨迹线附近的路口设备取几个进行卡片展示 + crossDeviceListTmp.forEach { deviceInfoBean -> + if (maxSize > 0) { + deviceInfoBean.deviceIp?.let { + if (!ipPointEntityMap.containsKey(it)) { + ipPointEntityMap[it] = ArrayList() + } + ipPointEntityMap[it]?.add( + VideoMarkerEntity( + coordinateConverterWgsToGcj( + deviceInfoBean.lat, + deviceInfoBean.lon + ), + "全息路口", + deviceInfoBean.orientation + ) + ) + maxSize-- + } + } + } + } + reqCrossLive(ipPointEntityMap) + } + + /** + * 先下载图片,然后设置给View, + * 再转换成BitmapDescriptor,最后进行渲染 + * 1_ip -> 1_url -> n_bitmap(标题不同需生成n个) -> n_marker + */ + private fun downloadImage(url: String, videoList: MutableList) { + if (videoList.isEmpty() || url.isEmpty()) return + travelNetWorkModel.downloadImage( + context, + url, + videoList, + onSuccess = { bitmap, videoMarkerList -> + val optionList = ArrayList() + var view: EventVideoView + videoMarkerList.forEach { videoEntity -> + view = EventVideoView( + context, + title = videoEntity.title, + orientation = videoEntity.orientation + ) + view.setBitmap(bitmap) + + optionList.add(MarkerOptions().also { + it.position(videoEntity.latLng) + it.icon(BitmapDescriptorFactory.fromView(view)) + }) + } + updateVideoMarker(optionList) + }, + onFailed = { videoMarkerList -> + val optionList = ArrayList() + var view: EventVideoView + videoMarkerList.forEach { videoEntity -> + view = EventVideoView( + context, + title = videoEntity.title, + orientation = videoEntity.orientation + ) + view.setPlaceHolder() + + optionList.add(MarkerOptions().also { + it.position(videoEntity.latLng) + it.icon(BitmapDescriptorFactory.fromView(view)) + }) + } + + updateVideoMarker(optionList) + }) + } + + private fun reqCrossLive( + ipPointEntityMap: HashMap> + ) { + val ipList = ipPointEntityMap.keys.toMutableList() + Log.d(TAG, "请求获取缩略图,个数为:${ipList.size}!") + if (ipList.isEmpty()) { + return + } + travelNetWorkModel.batchRequestCrossLive(ipList, onSuccess = { + Log.d(TAG, "Cross live result is:$it") + val liveOptionsList = ArrayList() + var markerOption: MarkerOptions + var pair: Pair + val vertexList = ArrayList() + + it.forEach { roadCamera -> + roadCamera.ip?.let { ip -> + if (!roadCamera.imageUrl.isNullOrEmpty()) { + if (ipPointEntityMap[ip] != null) { + ipPointEntityMap[ip]!!.forEach { videoMarkerEntity -> + // 计算卡片四个顶点的高德地图经纬度 + vertexList.addAll( + getRectVertex( + videoMarkerEntity.orientation, + videoMarkerEntity.latLng + ) + ) + // 需要下载缩略图 + markerOption = MarkerOptions() + markerOption.zIndex(0.9f) + markerOption.position(videoMarkerEntity.latLng) + pair = travelNetWorkModel.calculateAnchor( + videoMarkerEntity.orientation + ) + markerOption.anchor(pair.first, pair.second) + liveOptionsList.add(markerOption) + } + downloadImage( + roadCamera.imageUrl!!, + ipPointEntityMap[ip]!! + ) + } else { + Log.d(TAG, "缓存中未查到对应ip!!") + return@let + } + } + } + } + Log.d(TAG, "绘制卡片的个数为:${liveOptionsList.size}") + // 绘制事件卡片 + drawMarkers(DRAW_LIVE_DETAIL, liveOptionsList) + adjustCameraWithVertex(vertexList) + }, onError = { + Log.d(TAG, "Cross live error is:$it") + }) + } + + private fun handleCrossDevices( + crossDeviceList: List, + globalList: ArrayList? + ) { + if (crossDeviceList.isEmpty()) return + val crossOptionsList = ArrayList() + var distance = 0.0 + var key = "" + val deviceInPaths = ArrayList() + val devicePointMap = HashMap() + globalList?.forEachIndexed { index, globalPoint -> + if (index >= 0 && index < globalList.size - 1) { + crossDeviceList.forEach { + it.deviceInfoList?.forEach loop@{ deviceBean -> + distance = LocationUtils.pointToLine( + globalPoint.lon, + globalPoint.lat, + globalList[index + 1].lon, + globalList[index + 1].lat, + deviceBean.lon, + deviceBean.lat + ) + key = "${deviceBean.lon},${deviceBean.lat}" + if (distance >= 10 || devicePointMap.contains(key)) { + Log.d( + TAG, + "路口设备:点(${key})到线段${index}-${index + 1}的距离为:${distance}米" + ) + return@loop + } + devicePointMap[key] = 1 + // 计算事件Marker朝向 + deviceBean.orientation = travelNetWorkModel.calculateOrientation( + deviceBean.lon, + deviceBean.lat, + globalPoint.lon, + globalPoint.lat, + globalList[index + 1].lon, + globalList[index + 1].lat + ) + // 深拷贝一下数据 + deviceInPaths.add(DeviceInfoBean(deviceBean.deviceIp, deviceBean.lon, deviceBean.lat).also { deviceInfo -> + deviceInfo.orientation = deviceBean.orientation + }) + crossOptionsList.add(MarkerOptions().apply { + position( + coordinateConverterWgsToGcj( + deviceBean.lat, + deviceBean.lon + ) + ) + anchor(0.5f, 0.5f) + icon(BitmapDescriptorFactory.fromResource(R.drawable.mogo_quanxi_lukou)) + }) + } + } + } + } + if (deviceInPaths.isNotEmpty()) { + listener?.onDraw( + arrayListOf(EventDrawBean(R.drawable.mogo_quanxi_lukou, "全息路口")), + false + ) + } + deviceInPathList = deviceInPaths + Log.d(TAG, "待绘制的全息路口的个数为:${crossOptionsList.size}") + // 绘制路口设备 + drawMarkers(DRAW_CROSS_DEVICE, crossOptionsList) + } + + private fun handleRoadRange(roadRangeList: List?>?) { + if (roadRangeList.isNullOrEmpty()) return + val roadRangeOptions = PolylineOptions() + roadRangeOptions.width(AutoSizeUtils.dp2px(context, 32f).toFloat()) + roadRangeOptions.isUseTexture = true + roadRangeOptions.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) + roadRangeOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + roadRangeOptions.customTexture = roadRangeBitmap + + roadRangeList.forEach { pointList -> + pointList?.let { + if (it.size < 2) return@let + roadRangeOptions.add(coordinateConverterWgsToGcj(it[1], it[0])) + } + } +// drawPolyline(DRAW_ROAD_RANGE, roadRangeOptions) + } + + /** + * 处理智慧道路轨迹的数据 + */ + private fun handleRoadTrajectories( + roadTrajectoryList: List?>?>?, + globalList: List? + ) { + if (roadTrajectoryList.isNullOrEmpty()) return + // 绘制智慧道路范围 + val roadTrajectoryOptionsList = ArrayList() + val globalOptionList = ArrayList() + val globalIndexSet = HashSet() + if (globalList.isNullOrEmpty()) {// 无轨迹时以道路中心线为中轴画给定宽度的纹理 + Log.d(TAG, "无轨迹点,绘制全局智慧道路!") + val boundsBuilder = LatLngBounds.Builder() + var latLngTmp: LatLng + roadTrajectoryList.forEach { trajectoryList -> + val options = PolylineOptions() + trajectoryList?.forEach loop@{ trajPointList -> + if (trajPointList.isNullOrEmpty() || trajPointList.size < 2) return@loop + options.width(AutoSizeUtils.dp2px(context, roadRange).toFloat()) + options.isUseTexture = true + options.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) + options.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + options.customTexture = roadRangeBitmap + latLngTmp = coordinateConverterWgsToGcj( + trajPointList[1], + trajPointList[0] + ) + options.add(latLngTmp) + boundsBuilder.include(latLngTmp) + } + roadTrajectoryOptionsList.add(options) + } + if (mLocation != null) { + boundsBuilder.include(LatLng(mLocation!!.latitude, mLocation!!.longitude)) + } + + val cameraUpdate = CameraUpdateFactory.newLatLngBoundsRect( + boundsBuilder.build(), + AutoSizeUtils.dp2px(context, leftPadding.toFloat()), + AutoSizeUtils.dp2px(context, rightPadding.toFloat()), + AutoSizeUtils.dp2px(context, topPadding.toFloat()), + AutoSizeUtils.dp2px(context, bottomPadding.toFloat()) + ) + moveMapCamera(cameraUpdate) + } else { + Log.d(TAG, "有轨迹点,绘制局部智慧道路!") + roadTrajectoryList.forEach { trajectoryList -> + var distanceTmp: Double +// var lastIndex = -1 +// var polylineOptionTmp: PolylineOptions? = null + + trajectoryList?.forEachIndexed { index, trajPointList -> + if (trajPointList.isNullOrEmpty()) return@forEachIndexed + // 待绘制的所有智慧道路轨迹点 +// markerOptionsList2.add(MarkerOptions().also { markerOption -> +// markerOption.position( +// coordinateConverterWgsToGcj( +// trajPointList[1], +// trajPointList[0] +// ) +// ) +// markerOption.anchor(0.5f, 0.5f) +// markerOption.icon(pointBitmap2) +// }) + + if (index >= 0 && index < trajectoryList.size - 1) { + if (trajPointList.isEmpty() || trajectoryList[index + 1].isNullOrEmpty() + || trajPointList.size < 2 || trajectoryList[index + 1]!!.size < 2 + ) return + // 遍历所有轨迹点到智慧轨迹线段上的距离 + globalList.forEachIndexed { i, globalPoint -> + distanceTmp = LocationUtils.pointToLine( + trajPointList[0], + trajPointList[1], + trajectoryList[index + 1]!![0], + trajectoryList[index + 1]!![1], + globalPoint.lon, + globalPoint.lat + ) + // 如果距离小于50m则认为在智慧道路内 + if (distanceTmp < 50) { + Log.d(TAG, "智慧道路内点索引为:$i") + globalIndexSet.add(i) + } + } + } + } + } + var lastIndex = -1 + var optionTmp: PolylineOptions? = null + var polylineOptionTmp: PolylineOptions? = null + globalList.forEachIndexed { index, point -> + if (!globalIndexSet.contains(index)) return@forEachIndexed + Log.w(TAG, "智慧道路内点索引为:$index") + if (lastIndex < 0 || index - lastIndex > 1) { + globalOptionList.add(PolylineOptions().also { + optionTmp = it + // 生成在智慧道路范围内的轨迹 + buildPolylineOptionWithTexture(it, roadWidth, roadTrajectoryBitmap!!) + it.add(coordinateConverterWgsToGcj(point.lat, point.lon)) + }) + roadTrajectoryOptionsList.add(PolylineOptions().also { + polylineOptionTmp = it + buildPolylineOption( + polylineOptionTmp!!, + roadRange, + roadRangeBitmap!! + ) + it.add(coordinateConverterWgsToGcj(point.lat, point.lon)) + }) + } else { + optionTmp?.add(coordinateConverterWgsToGcj(point.lat, point.lon)) + polylineOptionTmp?.add(coordinateConverterWgsToGcj(point.lat, point.lon)) + } + lastIndex = index + } + } +// mAMap?.addMarkers(markerOptionsList2, false) + // 绘制在智慧道路范围内的轨迹 + drawPolylineList(DRAW_GLOBAL_TRAJECTORY, globalOptionList) + // 绘制智慧道路范围 + drawPolylineList(DRAW_ROAD_TRAJECTORY, roadTrajectoryOptionsList) + } + + /** + * 调整视角以显示出卡片 + */ + private fun adjustCameraWithVertex(vertexLngList: List) { + val boundsBuilder = LatLngBounds.Builder() + vertexLngList.forEach { + boundsBuilder.include(it) + } + reqData?.forEach { + boundsBuilder.include(coordinateConverterWgsToGcj(it.lat, it.lon)) + } + if (mLocation != null) { + boundsBuilder.include(LatLng(mLocation!!.latitude, mLocation!!.longitude)) + } + + val cameraUpdate = CameraUpdateFactory.newLatLngBoundsRect( + boundsBuilder.build(), + AutoSizeUtils.dp2px(context, leftPadding.toFloat()), + AutoSizeUtils.dp2px(context, rightPadding.toFloat()), + AutoSizeUtils.dp2px(context, topPadding.toFloat()), + AutoSizeUtils.dp2px(context, bottomPadding.toFloat()) + ) + moveMapCamera(cameraUpdate) + } + + private fun buildPolylineOption( + optionTmp: PolylineOptions, + width: Float, + descriptor: BitmapDescriptor + ) { + optionTmp.width(AutoSizeUtils.dp2px(context, width).toFloat()) + optionTmp.isUseTexture = true + optionTmp.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) + optionTmp.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + optionTmp.customTexture = descriptor + } + + private fun buildPolylineOptionWithTexture( + optionTmp: PolylineOptions, + width: Float, + descriptor: BitmapDescriptor + ) { + optionTmp.width(AutoSizeUtils.dp2px(context, width).toFloat()) + optionTmp.isUseTexture = true + optionTmp.lineJoinType(PolylineOptions.LineJoinType.LineJoinRound) + optionTmp.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + optionTmp.customTexture = descriptor + } + + private fun drawCarMarker(location: MogoLocation) { + Message.obtain().apply { + what = DRAW_CAR_LOCATION + obj = location + nonFrequentHandler?.sendMessage(this) + } + } + + private fun drawEndMarker(options: MarkerOptions) { + Message.obtain().apply { + what = DRAW_END_MARKER + obj = options + nonFrequentHandler?.sendMessage(this) + } + } + + private fun updateVideoMarker(options: List) { + Message.obtain().apply { + what = UPDATE_VIDEO_MARKER + obj = options + nonFrequentHandler?.sendMessage(this) + } + } + + private fun drawMarkers(type: Int, optionList: ArrayList) { + Message.obtain().apply { + what = type + obj = optionList + nonFrequentHandler?.sendMessage(this) + } + } + + private fun drawPolyline(type: Int, polylineOptions: PolylineOptions) { + Message.obtain().apply { + what = type + obj = polylineOptions + nonFrequentHandler?.sendMessage(this) + } + } + + private fun drawPolylineList(type: Int, polylineOptionsList: ArrayList) { + if (polylineOptionsList.isEmpty()) return + Message.obtain().apply { + what = type + obj = polylineOptionsList + nonFrequentHandler?.sendMessage(this) + } + } + + private fun moveMapCamera(cameraUpdate: CameraUpdate) { + Message.obtain().apply { + what = MOVE_MAP_CAMERA + obj = cameraUpdate + nonFrequentHandler?.sendMessage(this) + } + } + + fun coordinateConverterWgsToGcj( + lat: Double, lon: Double + ): LatLng { + val coordinateConverter = + CoordinateConverter(context) + coordinateConverter.from(CoordinateConverter.CoordType.GPS) + coordinateConverter.coord(LatLng(lat, lon)) + return coordinateConverter.convert() + } + + override fun onChassisLocationGCJ02(gnssInfo: MogoLocation?) { + gnssInfo?.let { + mLocation = it + if (isMapLoaded) { + // 绘制自车 + drawCarMarker(it) + } + } + } + + override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) { + // 上一步调用处已经加锁,这里就不加了 + if (lastTime > 0 && System.currentTimeMillis() - lastTime <= 1000) { + return + } else { + lastTime = System.currentTimeMillis() + } + Log.d(TAG, "下发全局轨迹!") + globalPathResp?.let { globalPath -> +// nonFrequentHandler?.removeCallbacksAndMessages(null) + + val pointList = ArrayList() + val pointCloneList = ArrayList() + globalPath.wayPointsList.forEach { loc -> + pointList.add(Point(loc.longitude, loc.latitude)) + pointCloneList.add(Point(loc.longitude, loc.latitude)) + } + Log.d(TAG, "轨迹点个数为:${pointList.size}") + reqData = pointCloneList + handleGlobalPath(pointList) + + requestData(pointList) + if (!isRoadTrackReq) { + Log.d(TAG, "处理智慧道路轨迹!") + handleRoadTrajectories(roadTrackList, pointList) + } + } + } + + private fun requestData(pointList: ArrayList) { + if (!isCrossDeviceReq) { + Log.d(TAG, "请求获取路口设备!") + isCrossDeviceReq = true + // 获取路口设备 + travelNetWorkModel.getCrossDevice(onSuccess = { + Log.d(TAG, "Cross device result is:$it") + isCrossDeviceReq = false + deviceList = it + handleCrossDevices(it, pointList) + }, onError = { + isCrossDeviceReq = false + Log.d(TAG, "Cross device error is:$it") + }) + } + if (!isRoadEventReq) { + Log.d(TAG, "请求获取道路事件!") + // 获取道路事件 + var cityCode = CallerMapUIServiceManager.getCityCode() ?: "0734" + if (cityCode.isEmpty()) { + cityCode = "0734" + } + isRoadEventReq = true + travelNetWorkModel.getEventsWithTrajRequest( + EventReqEntity(pointList, cityCode), + onSuccess = { + isRoadEventReq = false + retryCount = 0 + Log.d(TAG, "Events result is:$it") + handleRoadEvent(it, pointList) + }, + onError = { + isRoadEventReq = false + retryCount = 0 + Log.d(TAG, "Events error is:$it") + }) + } + } + + /** + * 根据Marker朝向和坐标计算每个顶点在高德地图中的经纬度 + */ + private fun getRectVertex(orientation: Int, position: LatLng): List { + // 矩形顶点在高德地图中的坐标 + val latLngList = ArrayList() + if (mAMap != null && mAMap!!.projection != null) { + var latLng: LatLng? + // 经纬度转屏幕坐标 + var point = mAMap!!.projection!!.toScreenLocation(position) + point?.let { + travelNetWorkModel.calculateVertex(context, orientation, it).forEach { screenP -> + // 每个顶点屏幕坐标转高德坐标 + latLng = mAMap!!.projection!!.fromScreenLocation(screenP) + if (latLng != null) { + latLngList.add(latLng!!) + } + } + } + } + return latLngList + } + + interface OnDrawListener { + // isEvent为true表示是事件,反之则表示全息路口 + fun onDraw(eventList: List, isEvent: Boolean) + } + + private inner class NonFrequentHandler(looper: Looper) : Handler(looper) { + @Suppress("UNCHECKED_CAST") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + try { + when (msg.what) { + DRAW_CAR_LOCATION -> { + removeMessages(DRAW_CAR_LOCATION) + if (isMapDestroyed) return + (msg.obj as MogoLocation).apply { + realDrawCar(this) + } + } + + DRAW_POLY_LINE -> { + removeMessages(DRAW_POLY_LINE) + if (isMapDestroyed) return + (msg.obj as PolylineOptions).apply { + realDrawGlobalPath(this) + } + } + + DRAW_ROAD_EVENT -> { +// removeMessages(CLEAR_ROAD_EVENT) + removeMessages(DRAW_ROAD_EVENT) + if (isMapDestroyed) return + (msg.obj as ArrayList).apply { + realDrawEventMarkers(this) + } + } + +// CLEAR_ROAD_EVENT -> { +// removeMessages(CLEAR_ROAD_EVENT) +// if (isMapDestroyed) return +// realClearEventMarkers() +// } + + DRAW_CROSS_DEVICE -> { +// removeMessages(CLEAR_CROSS_DEVICE) + removeMessages(DRAW_CROSS_DEVICE) + if (isMapDestroyed) return + (msg.obj as ArrayList).apply { + realDrawCrossDeviceMarkers(this) + } + } + +// CLEAR_CROSS_DEVICE -> { +// removeMessages(CLEAR_CROSS_DEVICE) +// if (isMapDestroyed) return +// realClearCrossDeviceMarkers() +// } + + DRAW_ROAD_RANGE -> { + removeMessages(DRAW_ROAD_RANGE) + if (isMapDestroyed) return + (msg.obj as PolylineOptions).apply { + realDrawRoadRange(this) + } + } + + DRAW_ROAD_TRAJECTORY -> { +// removeMessages(CLEAR_ROAD_TRAJECTORY) + removeMessages(DRAW_ROAD_TRAJECTORY) + if (isMapDestroyed) return + (msg.obj as ArrayList).apply { + realDrawRoadTrajectory(this) + } + } + +// CLEAR_ROAD_TRAJECTORY -> { +// removeMessages(CLEAR_ROAD_TRAJECTORY) +// if (isMapDestroyed) return +// realClearRoadTrajectory() +// } + + DRAW_GLOBAL_TRAJECTORY -> { + removeMessages(DRAW_GLOBAL_TRAJECTORY) + if (isMapDestroyed) return + (msg.obj as ArrayList).apply { + realDrawGlobalTrajectory(this) + } + } + + MOVE_MAP_CAMERA -> { + if (isMapDestroyed) return + mAMap?.moveCamera(msg.obj as CameraUpdate) + } + + DRAW_LIVE_DETAIL -> { +// removeMessages(CLEAR_VIDEO_MARKER) + removeMessages(DRAW_LIVE_DETAIL) + if (isMapDestroyed) return + (msg.obj as ArrayList).apply { + realDrawLiveMarkers(this) + } + } + +// CLEAR_VIDEO_MARKER -> { +// removeMessages(CLEAR_VIDEO_MARKER) +// if (isMapDestroyed) return +// realClearLiveMarkers() +// } + + DRAW_END_MARKER -> { + removeMessages(DRAW_END_MARKER) + if (isMapDestroyed) return + realDrawEndMarker(msg.obj as MarkerOptions) + } + + UPDATE_VIDEO_MARKER -> { + removeMessages(UPDATE_VIDEO_MARKER) + if (isMapDestroyed) return + realUpdateVideoMarker(msg.obj as List) + } + + CLEAR_ALL_DATA -> { + removeMessages(CLEAR_ALL_DATA) + if (isMapDestroyed) return + realClearAllMarkersAndPolyline() + } + } + } catch (e: Exception) { + e.printStackTrace() + Log.e(TAG, "概览页面渲染异常为:${e.message}") + } + } + } + + private fun realDrawCar(location: MogoLocation) { + val latLng = LatLng(location.latitude, location.longitude) + val angle = (360 - location.heading).toFloat() + if (mCarMarker != null) { + mCarMarker!!.rotateAngle = angle + mCarMarker!!.position = latLng + } else { + val option = MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(if (carDrawable != -1) carDrawable else R.drawable.map_car_icon)) + .rotateAngle(360 - location.heading.toFloat()) + .position(LatLng(location.latitude, location.longitude)) + .anchor(0.5f, 0.5f) + mCarMarker = mAMap?.addMarker(option) + mCarMarker?.isClickable = false +// mCarMarker?.setToTop() + } + if (mCompassMarker != null) { + mCompassMarker!!.rotateAngle = angle + mCompassMarker!!.position = latLng + } else { + mCompassMarker = mAMap?.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(if (compassDrawable != -1) compassDrawable else R.drawable.amap_custom_corner)) + .anchor(0.5f, 0.5f) + ) + mCompassMarker?.isClickable = false + } + } + + private fun realDrawGlobalPath(polylineOptions: PolylineOptions) { + Log.d(TAG, "realDrawGlobalPath") + if (globalPolyline == null) { + globalPolyline = mAMap?.addPolyline(polylineOptions) + } else { + globalPolyline!!.options = polylineOptions + } + } + + private fun realDrawEventMarkers(eventOptionList: ArrayList) { + Log.d(TAG, "realDrawEventMarkers") + eventMarkerList.forEach { + it.destroy() + } + eventMarkerList.clear() + if (eventOptionList.isNotEmpty()) { + mAMap?.let { + eventMarkerList.addAll(it.addMarkers(eventOptionList, false)) + } + eventMarkerList.forEach { + it.isClickable = false + } + } + Log.d(TAG, "计算到绘制事件耗时为:${System.currentTimeMillis() - testTime}") + } + + private fun realClearEventMarkers() { + Log.d(TAG, "realClearEventMarkers") + eventMarkerList.forEach { + it.destroy() + } + eventMarkerList.clear() + } + + private fun realDrawCrossDeviceMarkers(eventMarkerList: ArrayList) { + Log.d(TAG, "realDrawCrossDeviceMarkers") + deviceMarkerList.forEach { + it.destroy() + } + deviceMarkerList.clear() + mAMap?.let { + deviceMarkerList.addAll(it.addMarkers(eventMarkerList, false)) + } + deviceMarkerList.forEach { + it.isClickable = false + } + } + + private fun realClearCrossDeviceMarkers() { + Log.d(TAG, "realClearCrossDeviceMarkers") + deviceMarkerList.forEach { + it.destroy() + } + deviceMarkerList.clear() + } + + /** + * 绘制在智慧道路范围内的轨迹 + */ + private fun realDrawGlobalTrajectory(polylineOptionsList: ArrayList) { + Log.d(TAG, "realDrawGlobalTrajectory") + if (globalPolylineList.isNotEmpty() && globalPolylineList.size != polylineOptionsList.size) { + globalPolylineList.forEach { + it.remove() + } + globalPolylineList.clear() + mAMap?.let { aMap -> + polylineOptionsList.forEach { + globalPolylineList.add(aMap.addPolyline(it)) + } + } + } else { + mAMap?.let { aMap -> + if (globalPolylineList.isNotEmpty()) { + globalPolylineList.forEachIndexed { index, polyline -> + polyline.options = polylineOptionsList[index] + } + } else { + polylineOptionsList.forEach { + globalPolylineList.add(aMap.addPolyline(it)) + } + } + } + } + } + + /** + * 绘制智慧道路范围(和全局轨迹匹配过的) + */ + private fun realDrawRoadTrajectory(polylineOptionsList: ArrayList) { + Log.d(TAG, "realDrawRoadTrajectory") + if (trajectoryPolylineList.isNotEmpty() && trajectoryPolylineList.size != polylineOptionsList.size) { + trajectoryPolylineList.forEach { + it.remove() + } + trajectoryPolylineList.clear() + mAMap?.let { aMap -> + polylineOptionsList.forEach { + trajectoryPolylineList.add(aMap.addPolyline(it)) + } + } + } else { + mAMap?.let { aMap -> + if (trajectoryPolylineList.isNotEmpty()) { + trajectoryPolylineList.forEachIndexed { index, polyline -> + polyline.options = polylineOptionsList[index] + } + } else { + polylineOptionsList.forEach { + trajectoryPolylineList.add(aMap.addPolyline(it)) + } + } + } + } + } + + private fun realDrawLiveMarkers(liveOptionList: ArrayList) { + Log.d(TAG, "realDrawLiveMarkers") + liveMarkerList.forEach { + it.destroy() + } + liveMarkerList.clear() + mAMap?.let { + liveOptionList.forEach { options -> + liveMarkerList.add(it.addMarker(options).also { marker -> + marker.isVisible = false + }) + } + } + } + + private fun realClearLiveMarkers() { + Log.d(TAG, "realClearLiveMarkers") + liveMarkerList.forEach { + it.destroy() + } + liveMarkerList.clear() + } + + private fun realUpdateVideoMarker(options: List) { + Log.d(TAG, "realUpdateVideoMarker") + liveMarkerList.forEach { liveMarker -> + options.forEach { + if (it.position == liveMarker.position) { + liveMarker.setIcon(it.icon) + liveMarker.isVisible = true + } + } + } + } + + private fun realDrawEndMarker(options: MarkerOptions) { + Log.d(TAG, "realDrawEndMarker") + mEndMarker?.destroy() + mEndMarker = null + if (endPointDrawable != -1) { + mEndMarker = mAMap?.addMarker( + options + ) + mEndMarker?.isClickable = false + } + } + + private fun realDrawRoadRange(polylineOptions: PolylineOptions) { +// mAMap?.addPolyline(polylineOptions) + } + + private fun realClearAllMarkersAndPolyline() { + Log.d(TAG, "realClearAllMarkersAndPolyline") + // 清除终点 + mEndMarker?.destroy() + mEndMarker = null + // 清除道路事件icon + eventMarkerList.forEach { + it.destroy() + } + eventMarkerList.clear() + + // 清除全息路口icon + deviceMarkerList.forEach { + it.destroy() + } + deviceMarkerList.clear() + + // 清除卡片Marker + liveMarkerList.forEach { + it.destroy() + } + liveMarkerList.clear() + + // 清除全局轨迹 + globalPolyline?.remove() + globalPolyline = null + + // 清除智慧道路范围 + trajectoryPolylineList.forEach { + it.remove() + } + trajectoryPolylineList.clear() + + // 清除智慧道路内轨迹 + globalPolylineList.forEach { + it.remove() + } + globalPolylineList.clear() + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/anim_road_roam.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/anim_road_roam.png new file mode 100644 index 0000000000..a10db148e2 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/anim_road_roam.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_close_nor_light.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_close_nor_light.png new file mode 100644 index 0000000000..9e3b259a2c Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_close_nor_light.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_cross_roam.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_cross_roam.png new file mode 100644 index 0000000000..205b0efaae Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_cross_roam.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_roam_anim_set.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_roam_anim_set.png new file mode 100644 index 0000000000..63ef45ff0f Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_roam_anim_set.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_roam_xiaozhi.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_roam_xiaozhi.png new file mode 100644 index 0000000000..5380e77405 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/bg_road_roam_xiaozhi.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_cover_road_roam.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_cover_road_roam.png new file mode 100644 index 0000000000..7e10b9506c Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_cover_road_roam.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_close.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_close.png new file mode 100644 index 0000000000..3e9242089b Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_close.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_progress.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_progress.png new file mode 100644 index 0000000000..e77f8fb2b5 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_progress.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_tip.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_tip.png new file mode 100644 index 0000000000..f678d1bdb4 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/icon_road_roam_tip.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera.png new file mode 100644 index 0000000000..44515d8f7b Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_big.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_big.png new file mode 100644 index 0000000000..9451dde11c Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_big.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_big_press.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_big_press.png new file mode 100644 index 0000000000..daf3030cc8 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_big_press.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_left_light.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_left_light.png new file mode 100644 index 0000000000..a02c2d2cb1 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_left_light.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_left_light_select.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_left_light_select.png new file mode 100644 index 0000000000..b717852710 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_left_light_select.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_press.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_press.png new file mode 100644 index 0000000000..bd6375bd01 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_press.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_right_light.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_right_light.png new file mode 100644 index 0000000000..d09b7898e5 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_right_light.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_right_light_select.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_right_light_select.png new file mode 100644 index 0000000000..806a104b7e Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-nodpi/road_camera_right_light_select.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_logo_d_icon.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_logo_d_icon.png new file mode 100644 index 0000000000..6c5073d2bb Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_logo_d_icon.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_logo_icon.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_logo_icon.png new file mode 100644 index 0000000000..37382e6ec9 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_logo_icon.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_down_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_down_bg.png new file mode 100644 index 0000000000..23552bd341 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_down_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_down_driver_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_down_driver_bg.png new file mode 100644 index 0000000000..920cdd8523 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_down_driver_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_left_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_left_bg.png new file mode 100644 index 0000000000..aba2bc61fc Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_left_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_left_driver_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_left_driver_bg.png new file mode 100644 index 0000000000..a56673ecb2 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_left_driver_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_right_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_right_bg.png new file mode 100644 index 0000000000..75477c8466 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_right_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_right_driver_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_right_driver_bg.png new file mode 100644 index 0000000000..406e0585fc Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_right_driver_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_up_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_up_bg.png new file mode 100644 index 0000000000..99517bdff1 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_up_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_up_driver_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_up_driver_bg.png new file mode 100644 index 0000000000..62661f529a Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/event_video_up_driver_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_power_nor.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_power_nor.png new file mode 100644 index 0000000000..b1ced222ee Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_power_nor.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over.png new file mode 100644 index 0000000000..6c2d0f5a9c Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over_nor.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over_nor.png new file mode 100644 index 0000000000..d88b6647a7 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_road_over_nor.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_tanchalukou.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_tanchalukou.png new file mode 100644 index 0000000000..404a8ed58b Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_tanchalukou.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_test.jpg b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_test.jpg new file mode 100644 index 0000000000..f7990ce3a0 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_test.jpg differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_v2x_detail_bg.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_v2x_detail_bg.png new file mode 100644 index 0000000000..b9ab8adac4 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_v2x_detail_bg.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_xiaozhi_icon.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_xiaozhi_icon.png new file mode 100644 index 0000000000..63c32dc184 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_xiaozhi_icon.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_xingren_pengzhuang.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_xingren_pengzhuang.png new file mode 100644 index 0000000000..c55bcbb4ff Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/mogo_xingren_pengzhuang.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/road_trajectory_arrow_nor.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/road_trajectory_arrow_nor.png new file mode 100644 index 0000000000..3442a14c3c Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/road_trajectory_arrow_nor.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/video_marker_place_holder.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/video_marker_place_holder.png new file mode 100644 index 0000000000..17ac3e6ce8 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable-xhdpi/video_marker_place_holder.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_map_marker_yellow_info.xml b/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_map_marker_yellow_info.xml deleted file mode 100644 index b2be8e312e..0000000000 --- a/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_map_marker_yellow_info.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_module_small_map_view_border.xml b/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_module_small_map_view_border.xml deleted file mode 100644 index 4f45cd6946..0000000000 --- a/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_module_small_map_view_border.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_right_base_light.9.png b/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_right_base_light.9.png new file mode 100644 index 0000000000..8189ddde46 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_right_base_light.9.png differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_shape_reverse_yellow.xml b/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_shape_reverse_yellow.xml deleted file mode 100644 index 6bc80c96dc..0000000000 --- a/core/function-impl/mogo-core-function-map/src/main/res/drawable/bg_shape_reverse_yellow.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_left_light_select.xml b/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_left_light_select.xml new file mode 100644 index 0000000000..c30a57fff1 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_left_light_select.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_right_light_select.xml b/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_right_light_select.xml new file mode 100644 index 0000000000..c53f667c71 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_right_light_select.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_select.xml b/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_select.xml new file mode 100644 index 0000000000..d9a19e05e9 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/drawable/map_marker_camera_view_select.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/item_road_cross_roam_tip.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/item_road_cross_roam_tip.xml new file mode 100644 index 0000000000..c4a5ab6d02 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/item_road_cross_roam_tip.xml @@ -0,0 +1,37 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_down_d_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_down_d_maker.xml new file mode 100644 index 0000000000..15580527b3 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_down_d_maker.xml @@ -0,0 +1,48 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_down_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_down_maker.xml new file mode 100644 index 0000000000..554db4dde0 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_down_maker.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_left_d_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_left_d_maker.xml new file mode 100644 index 0000000000..3deb3d185b --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_left_d_maker.xml @@ -0,0 +1,48 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_left_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_left_maker.xml new file mode 100644 index 0000000000..e3485fae2a --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_left_maker.xml @@ -0,0 +1,47 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_right_d_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_right_d_maker.xml new file mode 100644 index 0000000000..cf88175489 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_right_d_maker.xml @@ -0,0 +1,47 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_right_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_right_maker.xml new file mode 100644 index 0000000000..a1ac58b92f --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_right_maker.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_up_d_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_up_d_maker.xml new file mode 100644 index 0000000000..8927769b3a --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_up_d_maker.xml @@ -0,0 +1,48 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_up_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_up_maker.xml new file mode 100644 index 0000000000..798c3457be --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_event_toward_up_maker.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/module_travel_reality_view.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/module_travel_reality_view.xml new file mode 100644 index 0000000000..79561f2824 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/module_travel_reality_view.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/view_road_cross_roam.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/view_road_cross_roam.xml new file mode 100644 index 0000000000..1d73bdacd5 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/view_road_cross_roam.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/view_road_cross_roam_light.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/view_road_cross_roam_light.xml new file mode 100644 index 0000000000..729f4b5d11 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/view_road_cross_roam_light.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/testguangquan.nt3d b/core/function-impl/mogo-core-function-map/src/main/res/raw/testguangquan.nt3d new file mode 100644 index 0000000000..59263ba5ce Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/testguangquan.nt3d differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/raw/yujingguangquan.nt3d b/core/function-impl/mogo-core-function-map/src/main/res/raw/yujingguangquan.nt3d new file mode 100644 index 0000000000..4841f7de40 Binary files /dev/null and b/core/function-impl/mogo-core-function-map/src/main/res/raw/yujingguangquan.nt3d differ diff --git a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml index d70e4a35f8..77b7473f4d 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml @@ -1,17 +1,35 @@ + + + + + + + + + + + + + + + + + + - - + + - + - + - + - + @@ -25,11 +43,37 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-map/src/main/res/values/strings.xml index d32a85d33b..8a72f3e813 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ mogo-core-function-map + 前方即将进入全息路口\n为您全面扫描潜在风险 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt index 4daa8cb771..7fcc66a5f9 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt @@ -113,7 +113,10 @@ class AutopilotControlParameters { var startLatLon: AutoPilotLonLat? = null @JvmField - var wayLatLons: List? = null + var wayLatLons: List? = null // Routing 给算路引擎使用的经停点列表,不是真正的要停车 + + @JvmField + var blackLatLons: List? = null // Routing 给算路引擎使用的黑名单点,目的是不参与算路 @JvmField var endLatLon: AutoPilotLonLat? = null @@ -139,6 +142,7 @@ class AutopilotControlParameters { @JvmField var autoPilotLine: AutoPilotLine? = null // 自动驾驶路线 + class AutoPilotLine { var lineId = 0L var lineName = "" @@ -216,15 +220,20 @@ class AutopilotControlParameters { } override fun toString(): String { - return "AutopilotControlParameters{" + - "startName='" + startName + '\'' + - ", endName='" + endName + '\'' + - ", startLatLon=" + startLatLon + - ", wayLatLons=" + wayLatLons + - ", endLatLon=" + endLatLon + - ", speedLimit=" + speedLimit + - ", vehicleType=" + vehicleType + - ", isSpeakVoice=" + isSpeakVoice + - '}' + return "AutopilotControlParameters(" + + "startName='$startName', " + + "endName='$endName', " + + "startLatLon=$startLatLon, " + + "wayLatLons=$wayLatLons," + + "blackLatLons=$blackLatLons," + + "endLatLon=$endLatLon," + + "speedLimit=$speedLimit, " + + "vehicleType=$vehicleType, " + + "routeID=$routeID, " + + "routeName='$routeName', " + + "isSpeakVoice=$isSpeakVoice, " + + "autoPilotLine=$autoPilotLine)" } + + } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt index 8de1893862..a5bc942557 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt @@ -46,6 +46,9 @@ open class AutopilotStatusInfo : Serializable, Cloneable { @Volatile var locationLon = 0.0 + @Volatile + var locationHeading = 0.0 + @Volatile var satelliteTime = 0.0 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotSummaryInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotSummaryInfo.kt new file mode 100644 index 0000000000..df7931863d --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotSummaryInfo.kt @@ -0,0 +1,43 @@ +package com.mogo.eagle.core.data.autopilot + +/** + * 行程总结报告数据 + */ +object AutopilotSummaryInfo { + + /** + * 路口灯态服务次数 + */ + @JvmField + @Volatile + var lightServicesNum = 0 + + /** + * 道路信息提醒次数 + */ + @JvmField + @Volatile + var infoTipNum = 0 + + /** + * 车辆行为提醒次数 + */ + @JvmField + @Volatile + var vehicleTipNum = 0 + + /** + * 弱势参与者提醒次数 + */ + @JvmField + @Volatile + var vulnerableTipNum = 0 + + /** + * 消除安全风险隐患次数 + */ + @JvmField + @Volatile + var dangerNum = 0 + +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index ca3c8e51ac..c831c70bad 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -119,6 +119,10 @@ object FunctionBuildConfig { @JvmField var appIdentityMode = "Taxi_Driver_Base" + @Volatile + @JvmField + var ttsLanguage = 1 + @Volatile @JvmField diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt index 6ccee36c2d..6cdb945dfd 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt @@ -100,4 +100,11 @@ object HmiBuildConfig { @Volatile var isShowTurnLightView = true + /** + * 是否展示 通过公交站 计算时的范围边界点 + */ + @JvmField + @Volatile + var isShowBusStationStrategyBorderPoint = false + } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java index b1460e7ea7..d36c741b56 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java @@ -103,6 +103,12 @@ public class MogoServicePaths { @Keep public static final String PATH_VISUAL_ANGLE = "/map/angle_change"; + @Keep + public static final String PATH_MAP_GLOBAL_TRAJECTORY = "/map/global_trajectory"; + + @Keep + public static final String PATH_MAP_ROUTE_GUIDE = "/map/route_guide"; + @Keep public static final String PATH_PATCH_UPGRADE = "/patch/api"; diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index 2a369559e0..0e4831c5cf 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -106,6 +106,7 @@ class ChainConstant { const val CHAIN_CODE_V2X_MSG = "CHAIN_CODE_V2X_MSG" const val CHAIN_CODE_HD_MAP_CALL = "CHAIN_CODE_HD_MAP_CALL" const val CHAIN_CODE_HD_MAP_ROAD_CROSS = "CHAIN_CODE_HD_MAP_ROAD_CROSS" + const val CHAIN_CODE_HD_MAP_ROAD_LIVE = "CHAIN_CODE_HD_MAP_ROAD_LIVE" const val CHAIN_CODE_HD_MAP_ICON_SET = "CHAIN_CODE_HD_MAP_ICON_SET" const val CHAIN_CODE_HMI_ACTIONS = "CHAIN_CODE_HMI_ACTIONS" const val CHAIN_CODE_CERT_REQUEST = "CHAIN_CODE_CERT_REQUEST" @@ -119,6 +120,7 @@ class ChainConstant { // 漫游业务code const val CHAIN_CODE_ROMA_RANGE = "CHAIN_CODE_ROMA_RANGE" + const val CHAIN_CODE_ROMA_REJECT = "CHAIN_CODE_ROMA_REJECT" const val CHAIN_CODE_ROMA_CLICK = "CHAIN_CODE_ROMA_CLICK" const val CHAIN_CODE_ROMA_CLOSE_CLICK = "CHAIN_CODE_ROMA_CLOSE_CLICK" const val CHAIN_CODE_ROMA_REQUEST = "CHAIN_CODE_ROMA_REQUEST" @@ -135,5 +137,10 @@ class ChainConstant { const val CHAIN_CODE_ROMA_CLOUD_PUSH = "CHAIN_CODE_ROMA_CLOUD_PUSH" const val CHAIN_CODE_ROMA_MAP_ERROR = "CHAIN_CODE_ROMA_MAP_ERROR" + const val CHAIN_CODE_ROAD_ROMA = "CHAIN_CODE_ROAD_ROMA" + + // Biz + const val CHAIN_CODE_MAP_ROAD_CROSS_ERROR = "CHAIN_CODE_MAP_ROAD_CROSS_ERROR" + } } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt index f3c6852fdd..a13998beec 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.data.enums +import android.view.View import com.mogo.eagle.core.data.R import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -457,6 +458,13 @@ enum class EventTypeEnumNew( content = "前方%s米交通事故", tts = "蘑菇路侧提醒您,前方%s米交通事故" ), + TYPE_USECASE_ROAD_BUS_STATION( + 245.toString(), + "通过公交站", + poiTypeSrcVr = R.drawable.icon_v2x_bus_station_driver, + content = "前方%s米有公交站", + tts = "前方%s米有公交站,蘑菇提醒您小心右侧行人及来车" + ), TYPE_ATTENTION_CONFLUENCE( 44.toString(), "前方车辆汇流", @@ -478,7 +486,7 @@ enum class EventTypeEnumNew( "交通拥堵", poiTypeSrcVr = R.drawable.v2x_icon_yongdu_vr, content = "前方%s米交通拥堵", - tts = "前方%s米交通拥堵" + tts = "前方%s米交通拥堵, 蘑菇提醒您注意观察小心通过" ), TYPE_SOCKET_ROAD_JINGZHI( @@ -486,7 +494,7 @@ enum class EventTypeEnumNew( "静止障碍物占道", poiTypeSrcVr = R.drawable.v2x_icon_jingzhi_zhangai, content = "前方%s米静止障碍物占道", - tts = "前方%s米静止障碍物占道" + tts = "前方%s米静止障碍物占道, 蘑菇提醒您注意观察小心通过" ), TYPE_SOCKET_ROAD_SHIGU( @@ -494,7 +502,7 @@ enum class EventTypeEnumNew( "道路事故", poiTypeSrcVr = R.drawable.v2x_icon_shigu_sanjiaopai, content = "前方%s米道路事故", - tts = "前方%s米道路事故" + tts = "前方%s米道路事故,蘑菇提醒您注意观察小心通过" ), TYPE_SOCKET_ROAD_SHIGONG( @@ -502,9 +510,29 @@ enum class EventTypeEnumNew( "道路施工", poiTypeSrcVr = R.drawable.v2x_icon_shigong_zhandao, content = "前方%s米道路施工", - tts = "前方%s米道路施工" + tts = "前方%s米道路施工,蘑菇提醒您注意观察小心通过" + ), + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE( + "100062", + "他车倒车/逆行", + poiTypeSrcVr = R.drawable.icon_v2x_other_retrograde_vehicle_driver, + content = "前方%s米有车辆异常倒车或逆行", + tts = "前方%s米有车辆异常倒车或逆行,蘑菇提醒您注意观察小心通过" + ), + TYPE_SOCKET_ROAD_GREE_WAVE( + "100063", + "绿波通行", + poiTypeSrcVr = View.NO_ID, + content = "保持当前车速即可通过路口,好丝滑!", + tts = "保持当前车速即可通过路口,好丝滑!" + ), + TYPE_SOCKET_ROAD_PEOPLE_CROSS( + "100064", + "行人横穿", + poiTypeSrcVr = View.NO_ID, + content = "前方%s米有行人/非机动车横穿", + tts = "前方%s米有行人/非机动车横穿,蘑菇提醒您提前减速,注意观察,小心通过" ), - TYPE_ERROR( 0.toString(), "未知/错误/异常", @@ -691,6 +719,7 @@ enum class EventTypeEnumNew( FOURS_PONDING.poiType, FOURS_ICE.poiType, FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> if (isVrMode) R.drawable.bg_v2x_event_type_red_vr else R.drawable.bg_v2x_event_type_read + TYPE_USECASE_ROAD_BUS_STATION.poiType -> R.drawable.bg_v2x_bus_station else -> { if (isVrMode) R.drawable.bg_v2x_event_type_red_vr else R.drawable.bg_v2x_event_type_read } @@ -729,6 +758,7 @@ enum class EventTypeEnumNew( TYPE_SOCKET_ROAD_SHIGONG.poiType, TYPE_SOCKET_ROAD_JINGZHI.poiType, TYPE_SOCKET_ROAD_SHIGU.poiType, + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType, TYPE_SOCKET_ROAD_CONGESTION.poiType -> true else -> false } @@ -749,6 +779,8 @@ enum class EventTypeEnumNew( TYPE_SOCKET_ROAD_JINGZHI.poiType -> TYPE_SOCKET_ROAD_JINGZHI.tts TYPE_SOCKET_ROAD_SHIGU.poiType -> TYPE_SOCKET_ROAD_SHIGU.tts TYPE_SOCKET_ROAD_CONGESTION.poiType -> TYPE_SOCKET_ROAD_CONGESTION.tts + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.tts + TYPE_USECASE_ROAD_BUS_STATION.poiType -> TYPE_USECASE_ROAD_BUS_STATION.tts else -> "道路事件" } } @@ -770,6 +802,9 @@ enum class EventTypeEnumNew( TYPE_SOCKET_ROAD_JINGZHI.poiType -> TYPE_SOCKET_ROAD_JINGZHI.content TYPE_SOCKET_ROAD_SHIGU.poiType -> TYPE_SOCKET_ROAD_SHIGU.content TYPE_SOCKET_ROAD_CONGESTION.poiType -> TYPE_SOCKET_ROAD_CONGESTION.content + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.content + TYPE_USECASE_ROAD_BUS_STATION.poiType -> TYPE_USECASE_ROAD_BUS_STATION.content + TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType -> TYPE_SOCKET_ROAD_PEOPLE_CROSS.content else -> "道路事件" } } @@ -785,7 +820,7 @@ enum class EventTypeEnumNew( FOURS_ICE.poiType -> R.raw.v2x_daolujiebing FOURS_PONDING.poiType -> R.raw.v2x_daolujishui GHOST_PROBE.poiType -> R.raw.v2x_guzhangqiuzhu - TYPE_SOCKET_ROAD_SHIGONG.poiType -> R.raw.v2x_shigong_warning// 施工气泡 + TYPE_SOCKET_ROAD_SHIGONG.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.raw.shigong_passenger else R.raw.v2x_shigong_warning TYPE_SOCKET_ROAD_JINGZHI.poiType -> R.raw.v2x_zhangai TYPE_SOCKET_ROAD_SHIGU.poiType -> { if (AppIdentityModeUtils.isTaxiPassenger(FunctionBuildConfig.appIdentityMode)) { @@ -795,6 +830,8 @@ enum class EventTypeEnumNew( } } TYPE_SOCKET_ROAD_CONGESTION.poiType -> R.raw.v2x_yongdu + TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType -> if (FunctionBuildConfig.skinMode != 0) TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.traffic3DIconId else TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE.traffic3DNightIconId + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> if (FunctionBuildConfig.skinMode != 0) TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE.traffic3DIconId else TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE.traffic3DNightIconId else -> 0 } } @@ -1131,6 +1168,14 @@ enum class EventTypeEnumNew( TYPE_IPC_DISCONNECT_FOR_MO_FANG.poiType -> { TYPE_IPC_DISCONNECT_FOR_MO_FANG.poiTypeStr } + // 通过公交站 + TYPE_USECASE_ROAD_BUS_STATION.poiType -> { + TYPE_USECASE_ROAD_BUS_STATION.poiTypeStr + } + // 他车逆行 + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> { + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiTypeStr + } else ->{ "事件通知" } @@ -1153,10 +1198,16 @@ enum class EventTypeEnumNew( R.drawable.icon_warning_v2x_road_construction } //AI施工 - TYPE_SOCKET_ROAD_SHIGONG.poiType -> R.drawable.icon_warning_v2x_road_construction + TYPE_SOCKET_ROAD_SHIGONG.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_shigong_passenger else R.drawable.icon_shigong_driver TYPE_SOCKET_ROAD_JINGZHI.poiType -> R.drawable.v2x_icon_jingzhi_zhangai - TYPE_SOCKET_ROAD_SHIGU.poiType -> R.drawable.v2x_icon_shigu_sanjiaopai + TYPE_SOCKET_ROAD_SHIGU.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_shigu_passenger else R.drawable.icon_shigu_driver TYPE_SOCKET_ROAD_CONGESTION.poiType -> R.drawable.v2x_icon_yongdu_vr + // 他车逆行/倒车 + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_v2x_other_retrograde_vehicle_passenger else R.drawable.icon_v2x_other_retrograde_vehicle_driver + // 行人/非机动车横穿 + TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_xingren_hengchuan_passenger else R.drawable.icon_xingren_hengchuan_driver + // 通过公交站 + TYPE_USECASE_ROAD_BUS_STATION.poiType -> if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) R.drawable.icon_v2x_bus_station_passenger else R.drawable.icon_v2x_bus_station_driver //拥堵 FOURS_BLOCK_UP.poiType -> { R.drawable.icon_warning_v2x_congestion @@ -1400,7 +1451,8 @@ enum class EventTypeEnumNew( TYPE_USECASE_ID_ACCIDENT.poiType -> TYPE_USECASE_ID_ACCIDENT.content TYPE_ATTENTION_CONFLUENCE.poiType -> TYPE_ATTENTION_CONFLUENCE.content TYPE_PEDESTRIAN_CROSSING.poiType -> TYPE_PEDESTRIAN_CROSSING.content - + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.content + TYPE_USECASE_ROAD_BUS_STATION.poiType -> TYPE_USECASE_ROAD_BUS_STATION.content else -> TYPE_ERROR.content } } @@ -1463,7 +1515,9 @@ enum class EventTypeEnumNew( TYPE_USECASE_ID_ACCIDENT.poiType -> TYPE_USECASE_ID_ACCIDENT.tts TYPE_ATTENTION_CONFLUENCE.poiType -> TYPE_ATTENTION_CONFLUENCE.tts TYPE_PEDESTRIAN_CROSSING.poiType -> TYPE_PEDESTRIAN_CROSSING.tts - + TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.poiType -> TYPE_SOCKET_ROAD_OTHER_RETROGRADE_VEHICLE.tts + TYPE_USECASE_ROAD_BUS_STATION.poiType -> TYPE_USECASE_ROAD_BUS_STATION.tts + TYPE_SOCKET_ROAD_PEOPLE_CROSS.poiType -> TYPE_SOCKET_ROAD_PEOPLE_CROSS.tts else -> TYPE_ERROR.tts } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt index 8204e91eab..d9491b76a2 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/multidisplay/TelematicConstant.kt @@ -17,8 +17,18 @@ class TelematicConstant { const val OBU_RUNREDLIGHT_WARNING = 200 //闯红灯预警开关 const val OBU_GREENWAVE_WARNING = 201 //绿波通行开关 - const val V2N_NEW_LINK_SWITCH = 202 // FunctionBuildConfig#v2nMainSwitch & FunctionBuildConfig#isNewV2NData + // -------------------- For Android Unit Test -----BEGIN------------ + const val V2N_AI_ROAD_PEOPLE_CROSS = 203 + + const val V2N_AI_ROAD_GREEN_WAVE = 204 + + const val V2N_AI_ROAD_OTHER_RETROGRADE_VEHICLE = 205 + + const val V2N_AI_ROAD_SHI_GONG = 206 + + const val V2N_AI_ROAD_SHI_GU = 207 + // -------------------- For Android Unit Test ------ END ------------ } } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/AutoExplorationEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/AutoExplorationEntity.kt new file mode 100644 index 0000000000..a4efc60c1b --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/AutoExplorationEntity.kt @@ -0,0 +1,6 @@ +package com.mogo.eagle.core.data.notice + +/** + * 自动探查 + */ +data class AutoExplorationEntity(var explorationContent: String,var explorationDuration: Long,var explorationComplete: Boolean) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadCameraLive.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadCameraLive.kt new file mode 100644 index 0000000000..2f2a67a554 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadCameraLive.kt @@ -0,0 +1,8 @@ +package com.mogo.eagle.core.data.road + +//路侧直播视频流返回数据 +data class RoadCameraLive( + val ip:String?, // ip + val liveUrl:String?, // 直播地址 + val imageUrl:String? // 首帧封面地址 +) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadCrossCamera.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadCrossCamera.kt new file mode 100644 index 0000000000..1336f47e1c --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadCrossCamera.kt @@ -0,0 +1,16 @@ +package com.mogo.eagle.core.data.road + +//接口请求路侧,返回设备信息 +data class RoadCrossCamera( + val crossingId: String? = null, // 路侧对应ID(衡阳1-25号路口) + val roadUniqueId: String? = null, // 高精地图crossID + val lon: Double, // 路口多设备经纬度中心点lon + val lat: Double, // 路口多设备经纬度中心点lat + val deviceInfoList: List +) + +data class CameraDeviceInfo( + val deviceIp: String, // 设备ip + val lon: Double, // 设备lon(非灯杆) + val lat: Double // 设备lat(非灯杆) +) diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/v2x/RoadV2NEventWindowBean.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/v2x/RoadV2NEventWindowBean.kt new file mode 100644 index 0000000000..9d30761f1e --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/v2x/RoadV2NEventWindowBean.kt @@ -0,0 +1,24 @@ +package com.mogo.eagle.core.data.v2x + +/** + * 路侧道路事件 弹框 + */ +data class RoadV2NEventWindowBean( + var eventType: RoadV2NEventType, //事件弹框类型 + var eventId: String, //当前事件弹框 ID, show时生成,用于dismiss时使用 + var timestamp: Long = 0, //事件发生事件戳 + var iconResId: Int, //事件icon res id + var hintStr: String, //事件提示文案 + var isNeedTTS: Boolean = false, //事件文案是否需要同步tts + var ttsStr: String = "", //TTS的文案 + var contentImageUrl: String, // Image 类型时图片 url + var cameraIp: String, // 路侧camera ip,用于请求获取拉流地址 + var lon: Double, //事件坐标-经度 + var lat: Double, //事件坐标-纬度 +) { + override fun toString(): String { + return "RoadV2NEventWindowBean(eventType=$eventType, eventId='$eventId', timestamp=$timestamp, iconResId=$iconResId, hintStr='$hintStr', isNeedTTS=$isNeedTTS, ttsStr='$ttsStr', contentImageUrl='$contentImageUrl', cameraIp='$cameraIp', lon=$lon, lat=$lat)" + } +} + +enum class RoadV2NEventType { TEXT, IMAGE, LIVE_VIDEO } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index 032f0c139c..0637b9c3ff 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -13,6 +13,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm.TaskConfi import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop.StopTaskResp import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendResume.BigTaskActionResp +import mogo.telematics.pad.MessagePad import mogo.yycp.paralleldriving.protocol.ParallelDrivingRequest /** @@ -55,13 +56,16 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { /** * 发送 轨迹下载请求 */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, routeInfo: MessagePad.RouteInfo?) /** * 发送 轨迹下载请求 - * @param downloadType 下载类型: 0:正常下载 1:预下载 + * + * @param autoPilotLine 线路相关参数详情见PB message_pad.proto -> Line + * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, routeInfo: MessagePad.RouteInfo?) /** * 结束自动驾驶 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt index 7e27ffcac1..40c67dccdb 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt @@ -2,7 +2,7 @@ package com.mogo.eagle.core.function.api.autopilot import mogo.telematics.pad.MessagePad import mogo.v2x.* -import perception.TrafficLightOuterClass +import perception.FusionTrafficLightOuterClass /** * @author xiaoyuzhou @@ -24,10 +24,10 @@ interface IMoGoAutopilotIdentifyListener { fun onAutopilotIdentifyPlanningObj(planningObjects: List?){} /** - * 感知红绿灯 + * 融合感知红绿灯 * @param trafficLights 感知红绿灯 */ - fun onAutopilotPerceptionTrafficLight(trafficLights: TrafficLightOuterClass.TrafficLights?){} + fun onAutopilotPerceptionTrafficLight(trafficLights: FusionTrafficLightOuterClass.FusionTrafficLights?){} /** diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt index e8cba74ab1..b51a0ad17e 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt @@ -56,6 +56,14 @@ interface IMoGoAutopilotStatusListener { */ fun onSsmReceiveTimeout(isTimeout: Boolean) {} + /** + * 域控FSM接口接收超时 + * 状态变动时才会回调,默认FSM状态正常 前提是存在FSM接口 + * + * @param isTimeout true:FSM接口接收超时 false:FSM接口恢复正常 + */ + fun onFsmReceiveTimeout(isTimeout: Boolean) {} + /** * 工控机主动查询 AdasManager#sendStatusQueryReq(),后会收到如下回调 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt new file mode 100644 index 0000000000..3da37890b7 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt @@ -0,0 +1,18 @@ +package com.mogo.eagle.core.function.api.autopilot + +import fsm.Fsm2024 + +/** + * 新版FSM状态 + */ +interface IMoGoFsm2024Listener { + + /** + * FSM状态 + * 目前在启动自驾前置条件检测440版本中使用 + * @param header 头 + * @param fsmState 数据 + */ + fun onFSM2024State(fsmState: Fsm2024.FSMStateMsg) + +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoLocalizationStateListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoLocalizationStateListener.kt new file mode 100644 index 0000000000..2c9b921e29 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoLocalizationStateListener.kt @@ -0,0 +1,19 @@ +package com.mogo.eagle.core.function.api.autopilot + +import localization.LocState + + +/** + *定位状态新接口 + * 定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持 + * 详细解释:http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=131757484 + */ +interface IMoGoLocalizationStateListener { + + /** + * 定位状态 + * @param locState 数据 + */ + fun onLocalizationState(locState: LocState.loc_state) + +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoV2nNioEventListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoV2nNioEventListener.kt new file mode 100644 index 0000000000..208c00250a --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoV2nNioEventListener.kt @@ -0,0 +1,38 @@ +package com.mogo.eagle.core.function.api.autopilot + +import mogo.telematics.pad.MessagePad + +/** + *NDE 数据接口 + */ +interface IMoGoV2nNioEventListener { + + /** + * 绿波通行(单路口)事件推送, 透传 + * + * @param crossSpeed 数据 + */ + fun onV2nNioGreenWavePassageEvent(crossSpeed: MessagePad.V2nCrossSpeed){} + + /** + * 行人横穿(路侧)事件推送, 透传 + * + * @param event 数据 + */ + fun onV2nNioCrossoverEvent(event: MessagePad.Event){} + + /** + * 他车逆行(路侧)事件推送, 透传 + * + * @param event 数据 + */ + fun onV2nNioOtherRetrogradeEvent(event: MessagePad.Event){} + + /** + * 拥堵事件推送, 透传 + * + * @param congestion 数据 + */ + fun onV2nNioCongestionEvent(congestion: MessagePad.V2nCongestion){} + +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt index a612706b6c..5148f2525d 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt @@ -30,6 +30,22 @@ interface IMoGoTrafficLightListener { } + /** + * 红绿灯额外提示框 + */ + fun onTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float){} + + /** + * 融合红绿灯,带有下一灯态和下二灯态 + */ + fun onFusionTrafficLight( + currentState: TrafficLightEnum,currentDuration: Int = -1, + nextState: TrafficLightEnum,nextDuration: Int = -1, + nextTwoState: TrafficLightEnum,nextTwoDuration: Int = -1, + lightSource: DataSourceType){} + /** * obu红绿灯状态 */ @@ -48,6 +64,30 @@ interface IMoGoTrafficLightListener { */ fun showTrafficLight(checkLightId: TrafficLightEnum, lightSource: DataSourceType) {} + /** + * 红绿灯额外提示框 + * @param currentState 当前灯态 + * @param currentDuration 当前灯态倒计时 + */ + fun onShowTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float){} + + /** + * 展示融合带有下一下二灯态的红绿灯 + * @param currentState 当前灯态 + * @param currentDuration 当前灯态倒计时 + * @param nextState 下一灯态 + * @param nextDuration 下一灯态倒计时 + * @param nextTwoState 下二灯态 + * @param nextTwoDuration 下二灯态倒计时 + * @param lightSource 数据来源 + */ + fun showFusionTrafficLight(currentState: TrafficLightEnum, currentDuration: Int, + nextState: TrafficLightEnum, nextDuration: Int, + nextTwoState: TrafficLightEnum, nextTwoDuration: Int, + lightSource: DataSourceType){} + /** * @param redNum 红灯倒计时 * @param yellowNum 黄灯倒计时 @@ -66,6 +106,12 @@ interface IMoGoTrafficLightListener { */ fun disableTrafficLight() {} + /** + * 通知融合红绿灯展示状态 + * @param isVisible true展示 false不展示 + */ + fun notifyFusionTrafficLightStatus(isVisible: Boolean){} + /** * 关闭红绿灯计数 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index 1f3ee351ff..6c6d2f9a3f 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -316,4 +316,9 @@ interface IDevaToolsProvider : IProvider { fun registerStartAutopilotStateListener(tag: String, block: (isCanStartAutopilot: Boolean) -> Unit) fun unRegisterStartAutopilotStateListener(tag: String) + + /** + * 是否开启引导线动效 + */ + fun setRouteDynamicColorEnable(enable: Boolean) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/v2n/IRoadV2NEventWindowListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/v2n/IRoadV2NEventWindowListener.kt new file mode 100644 index 0000000000..9919ec7285 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/v2n/IRoadV2NEventWindowListener.kt @@ -0,0 +1,13 @@ +package com.mogo.eagle.core.function.api.hmi.v2n + +import com.mogo.eagle.core.data.v2x.RoadV2NEventWindowBean + +/** + * 路侧道路事件弹框, 调用接口 + */ +interface IRoadV2NEventWindowListener { + + fun show(dataBean: RoadV2NEventWindowBean) + + fun dismiss(eventId: String) +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt index e7fd6caaf7..cd64c4f7c8 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt @@ -7,6 +7,7 @@ interface IViewControlListener { companion object{ const val TrafficLightView_TAG = "TrafficLightView_TAG" const val LimitingVelocityView_TAG = "LimitingVelocityView_TAG" + const val V2X_EVENT_TAG = "V2X_EVENT_TAG" const val FUNC_MODE_DEMO = "demoMode" const val FUNC_MODE_RAIN = "rainMode" } @@ -16,6 +17,14 @@ interface IViewControlListener { } + fun v2xEventVisible(v:Int , tag: String = V2X_EVENT_TAG){ + + } + + fun mainPageViewVisible(v:Int){ + + } + /** --------- StatusBar --------- **/ /** * 设置状态栏暗夜或明亮模式 @@ -48,4 +57,14 @@ interface IViewControlListener { */ fun updateFuncMode(tag:String, boolean: Boolean){} + /** + * 绿波通行控件展示 + */ + fun onGreenWaveViewVisible(min: Int, max: Int, cross: Int) {} + + + /** + * 绿波通行控件隐藏 + */ + fun onGreenWaveViewDismiss() {} } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt index fc5e2a7874..54840daaa6 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt @@ -217,4 +217,14 @@ interface IMoGoHmiProvider :IProvider{ * 通知小智形象要变化了 */ fun notifyXiaoZhiStatusChanged(event: Event, state: State) + + /** + * 展示绿波通行弹窗 + */ + fun showGreenWave(min: Int, max: Int, cross: Int) + + /** + * 隐藏绿波通弹窗 + */ + fun dismissGreenWave() } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt index a91757137d..2f7fafbbea 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt @@ -4,7 +4,16 @@ import com.alibaba.android.arouter.facade.template.IProvider interface IMoGoVisualAngleChangeProvider: IProvider { - fun updateLongSightLevel(level: Boolean) + fun changeScene(scene: Scene) - fun changeAngle(scene: Scene) + fun getCurrentScene(): Scene + + fun addListener(tag: String, listener: OnMoGoVisualAngleSceneChangeListener) + + fun removeListener(tag: String) + + interface OnMoGoVisualAngleSceneChangeListener { + + fun onSceneChanged(scene: Scene) + } } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt index 7f559a3e82..0e616f316f 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt @@ -1,16 +1,24 @@ package com.mogo.eagle.core.function.api.map.angle +import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.DEFAULT import com.mogo.map.uicontroller.* interface IAttach { val angle: VisualAngleMode val priority: Int val displayThreshold: Long //最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值, - } + val delay: Long // 延迟多长时间切换 + val isCanSwitch: Boolean // 是否可切换 + val isCanTouch: Boolean // 是否响应地图触摸事件 + fun getScreenToOriginDis(): ScreenToOriginDis = DEFAULT +} + +enum class ScreenToOriginDis { + DEFAULT, + UP, + DOWN +} interface Scene: IAttach - - - diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/road/IMoGoMapRoadListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/road/IMoGoMapRoadListener.kt new file mode 100644 index 0000000000..43f8394d74 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/road/IMoGoMapRoadListener.kt @@ -0,0 +1,22 @@ +package com.mogo.eagle.core.function.api.map.road + +import com.mogo.eagle.core.data.road.RoadCameraLive +import com.zhidaoauto.map.data.road.RoadCross +import com.zhidaoauto.map.data.road.StopLine + +/** + * + */ +interface IMoGoMapRoadListener { + + fun onRoadIdInfo(roadId: String) {} + + fun onStopLineInfo(info: StopLine) {} + + fun onRoadChange(cross: Boolean, roadCross: RoadCross? = null) {} + + fun onCrossLiveInfo(info: RoadCameraLive) {} + + fun onRoadCrossClick() {} + +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMoGoAiCloudIdentifyDataListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMoGoAiCloudIdentifyDataListener.kt new file mode 100644 index 0000000000..ce51edcd20 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMoGoAiCloudIdentifyDataListener.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.function.api.map.roma + +import mogo.yycp.api.proto.SocketDownData + +interface IMoGoAiCloudIdentifyDataListener { + + fun response(requestStatus: Boolean, errorMsg: String? = null) + + fun onAiIdentifyData(obj: SocketDownData.SocketDownDataProto?) + +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt index 5d402c9656..c74be6b4ea 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt @@ -6,8 +6,8 @@ interface IMogoRoma : IProvider { /** * 触发开启/关闭漫游 - * @param romaStatus 漫游状态 + * @param roamStatus 漫游状态 */ - fun trigger(romaStatus:Boolean) + fun trigger(roamStatus:Boolean) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/route/IMapRouteProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/route/IMapRouteProvider.kt new file mode 100644 index 0000000000..da8fb8ece1 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/route/IMapRouteProvider.kt @@ -0,0 +1,8 @@ +package com.mogo.eagle.core.function.api.map.route + +import com.alibaba.android.arouter.facade.template.IProvider + +interface IMapRouteProvider: IProvider { + + fun setRouteDynamicColorEnable(enable: Boolean) +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/trajectory/IMoGoGlobalTrajectoryDrawListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/trajectory/IMoGoGlobalTrajectoryDrawListener.kt new file mode 100644 index 0000000000..10d8610c40 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/trajectory/IMoGoGlobalTrajectoryDrawListener.kt @@ -0,0 +1,22 @@ +package com.mogo.eagle.core.function.api.map.trajectory + +import com.alibaba.android.arouter.facade.template.IProvider + +interface IMoGoGlobalTrajectoryDrawListener : IProvider { + + /** + * 是否已经在高精地图绘制了全局轨迹 + */ + fun hasDrawnGlobalTrajectory(): Boolean + + /** + * 在高精地图绘制全局规划 + * @return boolean-是否绘制成功, string-绘制结果原因 + */ + fun drawGlobalTrajectory(): Pair + + /** + * 清除高精地图中的全局轨迹 + */ + fun clearGlobalTrajectory(isClearData: Boolean) +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index 70b69195d4..3cd08a6536 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -4,6 +4,8 @@ import android.os.SystemClock import chassis.SpecialVehicleTaskCmdOuterClass import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.toAutoPilotLine +import com.mogo.eagle.core.data.autopilot.toRouteInfo import com.mogo.eagle.core.data.deva.badcase.BagManagerEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths @@ -177,12 +179,24 @@ object CallerAutoPilotControlManager { } } + /** + * 发送 轨迹下载请求 + */ + fun sendTrajectoryDownloadReq(autopilotControlParameters: AutopilotControlParameters) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + // Routing 需要传参 routeInfo + providerApi?.sendTrajectoryDownloadReq(autopilotControlParameters.autoPilotLine!!, autopilotControlParameters.toRouteInfo()) + CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autopilotControlParameters.autoPilotLine!!, 0) + } + } + /** * 发送 轨迹下载请求 */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - providerApi?.sendTrajectoryDownloadReq(autoPilotLine) + //TODO Routing 需要传参 routeInfo,这里建议业务侧重新整合到同一个数据实体内传入 + providerApi?.sendTrajectoryDownloadReq(autoPilotLine, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, 0) } } @@ -193,7 +207,8 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType) + //TODO Routing 需要传参 routeInfo,这里建议业务侧重新整合到同一个数据实体内传入 + providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, downloadType) } } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt index 95df93ec34..e12e2240ac 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt @@ -16,6 +16,7 @@ import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg import system_master.SsmInfo import system_master.SystemStatusInfo +import java.util.concurrent.atomic.AtomicInteger import kotlin.properties.Delegates /** @@ -25,6 +26,8 @@ import kotlin.properties.Delegates */ object CallerAutoPilotStatusListenerManager : CallerBase() { + private var atomicCountRoad = AtomicInteger(0) + // 存储最后一次回调的数据,当有新当位置注册了监听将此数据回调过去,防止有些模块注册顺序问题导致无法获取最新状态 @Volatile private var mAutopilotStatusInfo: AutopilotStatusInfo = AutopilotStatusInfo() @@ -36,6 +39,7 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { + + /** + * 绿波通行(单路口)事件推送, 透传 + */ + fun invokeFSM2024State(fsmState: Fsm2024.FSMStateMsg) { + M_LISTENERS.forEach { + val listener = it.value + listener.onFSM2024State(fsmState) + } + } + + +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerLocalizationStateListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerLocalizationStateListenerManager.kt new file mode 100644 index 0000000000..e8ea429965 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerLocalizationStateListenerManager.kt @@ -0,0 +1,23 @@ +package com.mogo.eagle.core.function.call.autopilot + +import com.mogo.eagle.core.function.api.autopilot.IMoGoLocalizationStateListener +import com.mogo.eagle.core.function.call.base.CallerBase +import localization.LocState + +/** + *定位状态新接口 + * 定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持 + * 详细解释:http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=131757484 + */ +object CallerLocalizationStateListenerManager : CallerBase() { + + + fun invokeLocalizationState(locState: LocState.loc_state) { + M_LISTENERS.forEach { + val listener = it.value + listener.onLocalizationState(locState) + } + } + + +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerV2nNioEventListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerV2nNioEventListenerManager.kt new file mode 100644 index 0000000000..d2cd8fff96 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerV2nNioEventListenerManager.kt @@ -0,0 +1,51 @@ +package com.mogo.eagle.core.function.call.autopilot + +import com.mogo.eagle.core.function.api.autopilot.IMoGoV2nNioEventListener +import com.mogo.eagle.core.function.call.base.CallerBase +import mogo.telematics.pad.MessagePad + +/** + *NDE 数据接口 + */ +object CallerV2nNioEventListenerManager : CallerBase() { + + /** + * 绿波通行(单路口)事件推送, 透传 + */ + fun invokeV2nNioGreenWavePassageEvent(crossSpeed: MessagePad.V2nCrossSpeed) { + M_LISTENERS.forEach { + val listener = it.value + listener.onV2nNioGreenWavePassageEvent(crossSpeed) + } + } + + /** + * 行人横穿(路侧)事件推送, 透传 + */ + fun invokeV2nNioCrossoverEvent(event: MessagePad.Event) { + M_LISTENERS.forEach { + val listener = it.value + listener.onV2nNioCrossoverEvent(event) + } + } + + /** + * 他车逆行(路侧)事件推送, 透传 + */ + fun invokeV2nNioOtherRetrogradeEvent(event: MessagePad.Event) { + M_LISTENERS.forEach { + val listener = it.value + listener.onV2nNioOtherRetrogradeEvent(event) + } + } + + /** + * 拥堵事件推送, 透传 + */ + fun invokeV2nNioCongestionEvent(congestion: MessagePad.V2nCongestion) { + M_LISTENERS.forEach { + val listener = it.value + listener.onV2nNioCongestionEvent(congestion) + } + } +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index 424674c88e..483d032529 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -396,4 +396,8 @@ object CallerDevaToolsManager { fun unRegisterStartAutopilotStateListener(tag: String) { devaToolsProviderApi?.unRegisterStartAutopilotStateListener(tag) } + + fun setRouteDynamicColorEnable(enable: Boolean) { + devaToolsProviderApi?.setRouteDynamicColorEnable(enable) + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 7270a55fda..9e2d5a04af 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -317,4 +317,18 @@ object CallerHmiManager { fun notifyXiaoZhiStatusChanged(event: Event, state: State) { hmiProviderApi?.notifyXiaoZhiStatusChanged(event, state) } + + /** + * 展示绿波通行弹窗 + */ + fun showGreenWave(min: Int, max: Int, cross: Int) { + hmiProviderApi?.showGreenWave(min, max, cross) + } + + /** + * 隐藏绿波通行弹窗 + */ + fun dismissGreenWave() { + hmiProviderApi?.dismissGreenWave() + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt index b6f905ec74..d7e05485aa 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt @@ -1,9 +1,10 @@ package com.mogo.eagle.core.function.call.hmi +import android.view.View import android.view.ViewGroup import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager import com.mogo.eagle.core.function.call.base.CallerBase +import java.util.concurrent.ConcurrentHashMap /** * @author xiaoyuzhou @@ -12,6 +13,9 @@ import com.mogo.eagle.core.function.call.base.CallerBase */ object CallerHmiViewControlListenerManager : CallerBase() { + private var v2xEventTag = ConcurrentHashMap() + private var mainPageVisible = true + /** * 触发 view 显示隐藏 * @param v 显示/隐藏状态 @@ -20,6 +24,30 @@ object CallerHmiViewControlListenerManager : CallerBase() M_LISTENERS[tag]?.visible(v) } + fun invokeV2XEvent(v: Int, tag: String = IViewControlListener.V2X_EVENT_TAG) { + v2xEventTag[tag] = v + M_LISTENERS.forEach { + val listener = it.value + listener.v2xEventVisible(v, tag) + } + } + + fun v2xEventShow():Boolean{ + return v2xEventTag.containsValue(View.VISIBLE) + } + + fun invokeMainPageViewVisible(v: Int) { + mainPageVisible = (v == View.VISIBLE) + M_LISTENERS.forEach { + val listener = it.value + listener.mainPageViewVisible(v) + } + } + + fun getMainPageVisible(): Boolean { + return mainPageVisible + } + fun setStatusBarDarkOrLight(tag: String, light: Boolean) { M_LISTENERS[tag]?.setStatusBarDarkOrLight(light) } @@ -31,6 +59,22 @@ object CallerHmiViewControlListenerManager : CallerBase() } } + fun invokeGreenWaveVisible(min: Int, max: Int, cross: Int) { + invokeVisible("GreenWave",View.VISIBLE) + M_LISTENERS.forEach { + val listener = it.value + listener.onGreenWaveViewVisible(min, max, cross) + } + } + + fun invokeGreenWaveDismiss() { + invokeVisible("GreenWave",View.GONE) + M_LISTENERS.forEach { + val listener = it.value + listener.onGreenWaveViewDismiss() + } + } + fun updateStatusBarRightView( tag: String, insert: Boolean, diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerRoadV2NEventWindowListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerRoadV2NEventWindowListenerManager.kt new file mode 100644 index 0000000000..aa5f8cbe7a --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerRoadV2NEventWindowListenerManager.kt @@ -0,0 +1,149 @@ +package com.mogo.eagle.core.function.call.hmi + +import com.mogo.eagle.core.data.v2x.RoadV2NEventType +import com.mogo.eagle.core.data.v2x.RoadV2NEventWindowBean +import com.mogo.eagle.core.function.api.hmi.v2n.IRoadV2NEventWindowListener +import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger + +/** + * 路侧V2N事件弹框 调用者管理类 + * 支持 text, image, live_video 3种展示样式 + */ +object CallerRoadV2NEventWindowListenerManager : CallerBase() { + + const val TAG = "CallerRoadV2NEventWindowListenerManager" + + /** + * 通用事件弹框,通过caremaIp, lon , lat请求查询拉流地址 + * @param eventId 调用者设置唯一的事件 ID + * @param timestamp 事件发生的时间 + * @param iconResId 事件icon drawable id + * @param hintStr 事件提示str + * @param isNeedTTS show时是否需要同步tts + * @param ttsStr tts的文案 + */ + fun showText( + eventId: String, + timestamp: Long, + iconResId: Int, + hintStr: String, + isNeedTTS: Boolean, + ttsStr: String = "" + ) { + val data = RoadV2NEventWindowBean( + RoadV2NEventType.TEXT, + eventId, + timestamp, + iconResId, + hintStr, + isNeedTTS, + ttsStr, + "", + "", + 0.0, + 0.0 + ) + M_LISTENERS.forEach { + val listener = it.value + listener.show(data) + } + CallerLogger.i(TAG, "show ${data.toString()}, type=${RoadV2NEventType.TEXT}") + } + + /** + * 通用事件弹框,通过caremaIp, lon , lat请求查询拉流地址 + * @param eventId 调用者设置唯一的事件 ID + * @param timestamp 事件发生的时间 + * @param iconResId 事件icon drawable id + * @param hintStr 事件提示str + * @param isNeedTTS show时是否需要同步tts + * @param ttsStr tts的文案 + * @param contentImageUrl 内容部分图片 url + */ + fun showImage( + eventId: String, + timestamp: Long, + iconResId: Int, + hintStr: String, + isNeedTTS: Boolean, + ttsStr: String = "", + contentImageUrl: String + ) { + val data = RoadV2NEventWindowBean( + RoadV2NEventType.IMAGE, + eventId, + timestamp, + iconResId, + hintStr, + isNeedTTS, + ttsStr, + contentImageUrl, + "", + 0.0, + 0.0 + ) + M_LISTENERS.forEach { + val listener = it.value + listener.show(data) + } + CallerLogger.i(TAG, "show ${data.toString()}, type=${RoadV2NEventType.IMAGE}") + } + + /** + * 通用事件弹框,通过caremaIp, lon , lat请求查询拉流地址 + * @param eventId 调用者设置唯一的事件 ID + * @param timestamp 事件发生的时间 + * @param iconResId 事件icon drawable id + * @param hintStr 事件提示str + * @param isNeedTTS show时是否需要同步tts + * @param ttsStr tts的文案 + * @param cameraIp 摄像头 IP + * @param lon 事件发生经度 + * @param lat 事件发生维度 + */ + fun showLiveVideo( + eventId: String, + timestamp: Long, + iconResId: Int, + hintStr: String, + isNeedTTS: Boolean, + ttsStr: String = "", + cameraIp: String, + lon: Double, + lat: Double + ) { + val data = RoadV2NEventWindowBean( + RoadV2NEventType.LIVE_VIDEO, + eventId, + timestamp, + iconResId, + hintStr, + isNeedTTS, + ttsStr, + "", + cameraIp, + lon, + lat + ) + M_LISTENERS.forEach { + val listener = it.value + listener.show(data) + } + CallerLogger.i(TAG, "show ${data.toString()}, type=${RoadV2NEventType.LIVE_VIDEO}") + } + + /** + * 关闭弹框(弹框是公用,同一事件只展示一个事件的弹框) + * @param eventId show时传递的eventId + */ + fun dismiss(eventId: String) { + M_LISTENERS.forEach { + val listener = it.value + listener.dismiss( + eventId + ) + } + CallerLogger.i(TAG, "dismiss eventId=$eventId") + } +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapAiCloudDataManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapAiCloudDataManager.kt new file mode 100644 index 0000000000..9a8b0cb4fd --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapAiCloudDataManager.kt @@ -0,0 +1,22 @@ +package com.mogo.eagle.core.function.call.map + +import com.mogo.eagle.core.function.api.map.roma.IMoGoAiCloudIdentifyDataListener +import com.mogo.eagle.core.function.call.base.CallerBase +import mogo.yycp.api.proto.SocketDownData + +object CallerMapAiCloudDataManager : CallerBase() { + + fun invokeResponse(requestStatus: Boolean, errorMsg: String? = null) { + val tag = CallerMapIdentifyManager.roam.first + if(tag.isNotEmpty() && M_LISTENERS.containsKey(tag)){ + M_LISTENERS[tag]?.response(requestStatus, errorMsg) + } + } + + fun invokeAiIdentifyData(obj: SocketDownData.SocketDownDataProto?){ + val tag = CallerMapIdentifyManager.roam.first + if(tag.isNotEmpty() && M_LISTENERS.containsKey(tag)){ + M_LISTENERS[tag]?.onAiIdentifyData(obj) + } + } +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapGlobalTrajectoryDrawManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapGlobalTrajectoryDrawManager.kt new file mode 100644 index 0000000000..682d018d8d --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapGlobalTrajectoryDrawManager.kt @@ -0,0 +1,44 @@ +package com.mogo.eagle.core.function.call.map + +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.map.trajectory.IMoGoGlobalTrajectoryDrawListener +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger + + +object CallerMapGlobalTrajectoryDrawManager { + + private val provider by lazy { + ARouter.getInstance().build(MogoServicePaths.PATH_MAP_GLOBAL_TRAJECTORY) + .navigation() as? IMoGoGlobalTrajectoryDrawListener + } + + fun init() { + provider?.let { + CallerLogger.i("CallerMapGlobalTrajectoryDrawManager", "--- init ---") + } + } + + /** + * 是否已经在高精地图绘制了全局轨迹 + */ + fun hasDrawnGlobalTrajectory(): Boolean { + return provider?.hasDrawnGlobalTrajectory() ?: false + } + + /** + * 在高精地图绘制全局轨迹 + * @return boolean-是否绘制成功, string-未绘制原因 + */ + fun drawGlobalTrajectory(): Pair { + return provider?.drawGlobalTrajectory() ?: Pair(false, "provider=null") + } + + /** + * 清除高精地图中的全局轨迹 + */ + fun clearGlobalTrajectory(isClearData: Boolean) { + provider?.clearGlobalTrajectory(isClearData) + } + +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt index 7762e32361..318c83a1a4 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt @@ -3,15 +3,24 @@ package com.mogo.eagle.core.function.call.map import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.map.roma.IMogoRoma +import java.util.concurrent.atomic.AtomicBoolean object CallerMapIdentifyManager { - private val romaApi:IMogoRoma - get() = ARouter.getInstance().build( MogoServicePaths.PATH_MAP_BIZ) + @Volatile + var roam = Pair("", false) + + private val roamApi: IMogoRoma + get() = ARouter.getInstance().build(MogoServicePaths.PATH_MAP_BIZ) .navigation() as IMogoRoma - fun romaTrigger(romaStatus:Boolean){ - romaApi.trigger(romaStatus) + fun romaTrigger(roamStatus: Boolean) { + roamApi.trigger(roamStatus) + } + + @Synchronized + fun updateRoam(roamId: String, status: Boolean) { + roam = Pair(roamId, status) } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapRoadListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapRoadListenerManager.kt index 7687ff90b5..90ef5abbfb 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapRoadListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapRoadListenerManager.kt @@ -1,65 +1,81 @@ package com.mogo.eagle.core.function.call.map import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.data.road.RoadCameraLive +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP import com.zhidaoauto.map.data.road.RoadCross import com.zhidaoauto.map.data.road.StopLine import com.zhjt.service.chain.ChainLog -import java.util.concurrent.ConcurrentHashMap import kotlin.properties.Delegates -object CallerMapRoadListenerManager { +object CallerMapRoadListenerManager : CallerBase() { - interface OnRoadListener { + private var mRoadId: String? = null + private var mStopLine: StopLine? = null + @Volatile + private var mRoadChange = false + @Volatile + private var mRoadCross: RoadCross? = null - fun onRoadIdInfo(roadId: String) {} - - fun onStopLineInfo(info: StopLine) {} - - fun onRoadChange(cross: Boolean) {} - } - - private val listeners by lazy { - ConcurrentHashMap() - } - - fun registerRoadListener(tag: String, listener: OnRoadListener) { - if (listeners.contains(tag)) { - return + private var mCross: Int by Delegates.observable(-1) { _, oldValue, newValue -> + if (oldValue != newValue) { + CallerLogger.d("$M_MAP onRoadChange observable", newValue) + M_LISTENERS.forEach { entry -> + // false:1,2, 离开路口,进入路段 + // true: 进入路口 + mRoadChange = !(newValue == 1 || newValue == 2) + entry.value.onRoadChange(mRoadChange, mRoadCross) + } } - listeners[tag] = listener } - fun unRegisterRoadListener(tag: String) { - if (!listeners.contains(tag)) { - return + override fun doSomeAfterAddListener(tag: String, listener: IMoGoMapRoadListener) { + super.doSomeAfterAddListener(tag, listener) + mRoadId?.let { + listener.onRoadIdInfo(it) + } + mStopLine?.let { + listener.onStopLineInfo(it) + } + if (mCross != -1 && mRoadCross != null) { + listener.onRoadChange(mRoadChange, mRoadCross) } - listeners.remove(tag) } - fun invokeListenersOnRoadIdGet(roadId: String) { - listeners.forEach { entry -> + mRoadId = roadId + M_LISTENERS.forEach { entry -> entry.value.onRoadIdInfo(roadId) } } fun invokeListenersOnStopLineGet(stopLine: StopLine) { - listeners.forEach { entry -> + mStopLine = stopLine + M_LISTENERS.forEach { entry -> entry.value.onStopLineInfo(stopLine) } } - private var mCross: Int by Delegates.observable(-1) { _, oldValue, newValue -> - if (oldValue != newValue) { - CallerLogger.d("$M_MAP onRoadChange", newValue) - listeners.forEach { entry -> - when(newValue){ - 1,2 -> entry.value.onRoadChange(false) - else -> entry.value.onRoadChange(true) - } - } + fun getCrossEndInfo(): String? { + return mRoadCross?.cross_id_end + } + + fun getStopLineLatLng(): Pair? { + return if (mStopLine == null) { + null + } else { + Pair(mStopLine!!.points[0].latitude, mStopLine!!.points[0].longitude) + } + } + + fun getStopLineDistance(): Double? { + return if (mStopLine == null) { + null + } else { + mStopLine!!.distance } } @@ -70,7 +86,34 @@ object CallerMapRoadListenerManager { paramIndexes = [0, 1] ) fun invokeRoadChange(cross: Int, roadCross: RoadCross) { + CallerLogger.d( + "$M_MAP onRoadChange", "oldValue: $mCross , " + "mStopLine:${mStopLine?.distance}" + + "newValue: $cross , oldCross:$mRoadCross , newCross:$roadCross" + ) mCross = cross + mRoadCross = roadCross } + + fun isInRoadCross(): Boolean { + return mCross == 0 + } + + fun invokeRoadCrossClick() { + M_LISTENERS.forEach { entry -> + entry.value.onRoadCrossClick() + } + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_MAP, + nodeAliasCode = ChainConstant.CHAIN_CODE_HD_MAP_ROAD_LIVE, + paramIndexes = [0] + ) + fun invokeRoadCrossLive(info: RoadCameraLive) { + M_LISTENERS.forEach { entry -> + entry.value.onCrossLiveInfo(info) + } + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapStyleListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapStyleListenerManager.kt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt index 93bb9908dc..84b5b4ea50 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt @@ -4,7 +4,7 @@ import android.util.Log import com.alibaba.android.arouter.launcher.* import com.mogo.eagle.core.data.constants.* import com.mogo.eagle.core.function.api.map.angle.* - +import com.mogo.eagle.core.function.api.map.angle.IMoGoVisualAngleChangeProvider.OnMoGoVisualAngleSceneChangeListener /** * 高精地图视角管理类,根据业务需要,以业务回调/直接调用地图 ,对地图进行改变 @@ -21,11 +21,19 @@ object CallerVisualAngleManager { } } - fun changeAngle(scene: Scene) { - provider?.changeAngle(scene) + fun changeScene(scene: Scene) { + provider?.changeScene(scene) } - fun updateLongSightLevel(level: Boolean) { - provider?.updateLongSightLevel(level) + fun getCurrentScene(): Scene { + return provider?.getCurrentScene() ?: throw AssertionError() + } + + fun addListener(tag: String, listener: OnMoGoVisualAngleSceneChangeListener) { + provider?.addListener(tag, listener) + } + + fun removeListener(tag: String) { + provider?.removeListener(tag) } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/setting/CallerSkinModeListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/setting/CallerSkinModeListenerManager.kt index a103e18f3f..e3776ecf71 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/setting/CallerSkinModeListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/setting/CallerSkinModeListenerManager.kt @@ -25,4 +25,8 @@ object CallerSkinModeListenerManager : CallerBase() } } + fun getMode():Int{ + return CallerMoGoUiSettingManager.getDayMode() + } + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicListenerManager.kt index 29f51e01be..0a8b681a24 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicListenerManager.kt @@ -24,6 +24,7 @@ object CallerTelematicListenerManager: CallerBase() { try { listener.onReceivedMsg(type, byteArray) } catch (e: Exception) { + e.printStackTrace() Log.e(TAG, "转发消息出现异常:${e.message}") } } @@ -36,6 +37,7 @@ object CallerTelematicListenerManager: CallerBase() { try { listener.onReceivedServerSn(sn) } catch (e: Exception) { + e.printStackTrace() Log.e(TAG, "转发司机屏SN出现异常:${e.message}") } } @@ -49,6 +51,7 @@ object CallerTelematicListenerManager: CallerBase() { try { listener.onDemoMode(isDemoMode) } catch (e: Exception) { + e.printStackTrace() Log.e(TAG, "转发美化模式出现异常:${e.message}") } } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt index b71eb67d59..556608159d 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.v2x +import android.util.Log import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.TrafficLightEnum import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult @@ -71,6 +72,40 @@ object CallerTrafficLightListenerManager : CallerBase } } + /** + * 红绿灯额外提示框 + * @param currentState 当前灯态 + * @param currentDuration 当前灯态倒计时 + */ + fun onShowTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float){ + M_LISTENERS.forEach{ + val listener = it.value + listener.onShowTrafficLightPrompt(currentState,currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) + } + } + + /** + * 展示融合带有下一下二灯态的红绿灯 + * @param currentState 当前灯态 + * @param currentDuration 当前灯态倒计时 + * @param nextState 下一灯态 + * @param nextDuration 下一灯态倒计时 + * @param nextTwoState 下二灯态 + * @param nextTwoDuration 下二灯态倒计时 + * @param lightSource 数据来源 + */ + fun showFusionTrafficLight(currentState: TrafficLightEnum, currentDuration: Int, + nextState: TrafficLightEnum, nextDuration: Int, + nextTwoState: TrafficLightEnum, nextTwoDuration: Int, + lightSource: DataSourceType){ + M_LISTENERS.forEach{ + val listener = it.value + listener.showFusionTrafficLight(currentState,currentDuration,nextState,nextDuration,nextTwoState,nextTwoDuration,lightSource) + } + } + fun changeCountdownTrafficLightNum(redNum: Int, yellowNum: Int, greenNum: Int) { M_LISTENERS.forEach { val listener = it.value @@ -106,6 +141,17 @@ object CallerTrafficLightListenerManager : CallerBase } } + /** + * 通知融合红绿灯展示状态 + * @param isVisible true展示 false不展示 + */ + fun notifyFusionTrafficLightStatus(isVisible: Boolean){ + M_LISTENERS.forEach{ + val listener = it.value + listener.notifyFusionTrafficLightStatus(isVisible) + } + } + fun disableTrafficLightCountDown() { M_LISTENERS.forEach { val listener = it.value diff --git a/core/mogo-core-network/src/main/java/com/mogo/eagle/core/network/CoroutineDSL.kt b/core/mogo-core-network/src/main/java/com/mogo/eagle/core/network/CoroutineDSL.kt index d2b2bd8238..51a234aff5 100644 --- a/core/mogo-core-network/src/main/java/com/mogo/eagle/core/network/CoroutineDSL.kt +++ b/core/mogo-core-network/src/main/java/com/mogo/eagle/core/network/CoroutineDSL.kt @@ -51,10 +51,7 @@ class Request { } fun request(requestKey: String? = null) { - - //todo list 缓存result , 在停止时关闭 GlobalScope.launch(context = Dispatchers.Main) { - start?.invoke() try { val deferred = GlobalScope.async(Dispatchers.IO, start = CoroutineStart.LAZY) { diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/bg_v2x_bus_station.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/bg_v2x_bus_station.png new file mode 100644 index 0000000000..2f4b14975d Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/bg_v2x_bus_station.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigong_driver.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigong_driver.png new file mode 100644 index 0000000000..0d49df45b7 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigong_driver.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigong_passenger.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigong_passenger.png new file mode 100644 index 0000000000..0a78469bdc Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigong_passenger.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigu_driver.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigu_driver.png new file mode 100644 index 0000000000..37e3993814 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigu_driver.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigu_passenger.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigu_passenger.png new file mode 100644 index 0000000000..be7a4a5b55 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_shigu_passenger.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_bus_station_driver.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_bus_station_driver.png new file mode 100644 index 0000000000..79ea2f61d9 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_bus_station_driver.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_bus_station_passenger.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_bus_station_passenger.png new file mode 100644 index 0000000000..cdbe23ee23 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_bus_station_passenger.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_other_retrograde_vehicle_driver.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_other_retrograde_vehicle_driver.png new file mode 100644 index 0000000000..b1dfaea874 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_other_retrograde_vehicle_driver.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_other_retrograde_vehicle_passenger.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_other_retrograde_vehicle_passenger.png new file mode 100644 index 0000000000..6beeb5d195 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_other_retrograde_vehicle_passenger.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_xingren_hengchuan_driver.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_xingren_hengchuan_driver.png new file mode 100644 index 0000000000..126550b8f3 Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_xingren_hengchuan_driver.png differ diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_xingren_hengchuan_passenger.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_xingren_hengchuan_passenger.png new file mode 100644 index 0000000000..583812f97c Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_xingren_hengchuan_passenger.png differ diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt index b86812d443..1a001491fb 100644 --- a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/SimpleVideoPlayer.kt @@ -42,6 +42,11 @@ class SimpleVideoPlayer : StandardGSYVideoPlayer { */ var enableshowProgressDialog = true + /** + * 圆角尺寸 + */ + var outLinePixel = 0f + interface PlayListener { fun onPlayEvent(event: Int) } @@ -152,10 +157,10 @@ class SimpleVideoPlayer : StandardGSYVideoPlayer { } @Suppress("SENSELESS_COMPARISON") - private var runnable = object :Runnable { + private var runnable = object : Runnable { override fun run() { // 外层对象倍回收 延时继续运行 慎重删除 - if(this@SimpleVideoPlayer==null){ + if (this@SimpleVideoPlayer == null) { return } updateTimer++ @@ -216,22 +221,42 @@ class SimpleVideoPlayer : StandardGSYVideoPlayer { } override fun touchDoubleUp() { - if(enableDoubleClick) { + if (enableDoubleClick) { super.touchDoubleUp() } } - override fun showProgressDialog(deltaX: Float, seekTime: String?, seekTimePosition: Int, totalTime: String?, totalTimeDuration: Int) { - if(enableshowProgressDialog) { - super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration) + override fun showProgressDialog( + deltaX: Float, + seekTime: String?, + seekTimePosition: Int, + totalTime: String?, + totalTimeDuration: Int + ) { + if (enableshowProgressDialog) { + super.showProgressDialog( + deltaX, + seekTime, + seekTimePosition, + totalTime, + totalTimeDuration + ) } } override fun dismissProgressDialog() { - if(enableshowProgressDialog) { + if (enableshowProgressDialog) { super.dismissProgressDialog() } } + @SuppressLint("ObsoleteSdkInt") + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + if (!mIfCurrentIsFullscreen && outLinePixel > 0) { + this.outlineProvider = TextureVideoViewOutlineProvider(outLinePixel) + this.clipToOutline = true + } + } } \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_car.png b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_car.png new file mode 100644 index 0000000000..560ba9a367 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_car.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_car_light.png b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_car_light.png new file mode 100644 index 0000000000..ed796603d5 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_car_light.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_end.png b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_end.png new file mode 100644 index 0000000000..a81336d4c2 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_end.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_start.png b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_start.png new file mode 100644 index 0000000000..3cee184981 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_map_view_dir_start.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_overmap_arrived.png b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_overmap_arrived.png new file mode 100644 index 0000000000..32fc7d5af8 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_overmap_arrived.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_overmap_arriving.png b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_overmap_arriving.png new file mode 100644 index 0000000000..790562578c Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-nodpi/taxt_u_p_overmap_arriving.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/bg_automatic_exploration.9.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/bg_automatic_exploration.9.png new file mode 100644 index 0000000000..93040852bd Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/bg_automatic_exploration.9.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/icon_exploration_close.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/icon_exploration_close.png new file mode 100644 index 0000000000..9e3b259a2c Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/icon_exploration_close.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_jingzhi_nor.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_jingzhi_nor.png new file mode 100644 index 0000000000..6d0901977c Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_jingzhi_nor.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_quanxi_lukou.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_quanxi_lukou.png new file mode 100644 index 0000000000..67951ce7ce Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_quanxi_lukou.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_shigong_image.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_shigong_image.png new file mode 100644 index 0000000000..c01e6a4acc Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_shigong_image.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_shigu_nor.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_shigu_nor.png new file mode 100644 index 0000000000..7c3646257c Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_shigu_nor.png differ diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_yongdu_nor.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_yongdu_nor.png new file mode 100644 index 0000000000..9f5849ab67 Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/mogo_yongdu_nor.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/font/font_din.ttf b/core/mogo-core-res/src/main/res/font/font_din.ttf similarity index 100% rename from core/function-impl/mogo-core-function-devatools/src/main/res/font/font_din.ttf rename to core/mogo-core-res/src/main/res/font/font_din.ttf diff --git a/core/mogo-core-res/src/main/res/raw/shigong_passenger.nt3d b/core/mogo-core-res/src/main/res/raw/shigong_passenger.nt3d new file mode 100755 index 0000000000..6670606e5c Binary files /dev/null and b/core/mogo-core-res/src/main/res/raw/shigong_passenger.nt3d differ diff --git a/core/mogo-core-res/src/main/res/raw/shigu_passenger.nt3d b/core/mogo-core-res/src/main/res/raw/shigu_passenger.nt3d new file mode 100755 index 0000000000..a4a783371a Binary files /dev/null and b/core/mogo-core-res/src/main/res/raw/shigu_passenger.nt3d differ diff --git a/core/mogo-core-res/src/main/res/raw/tachexiaoche_collision.nt3d b/core/mogo-core-res/src/main/res/raw/tachexiaoche_collision.nt3d new file mode 100644 index 0000000000..6b71c1402e Binary files /dev/null and b/core/mogo-core-res/src/main/res/raw/tachexiaoche_collision.nt3d differ diff --git a/core/mogo-core-res/src/main/res/values/color.xml b/core/mogo-core-res/src/main/res/values/color.xml index 510fbcda51..b64cb72842 100644 --- a/core/mogo-core-res/src/main/res/values/color.xml +++ b/core/mogo-core-res/src/main/res/values/color.xml @@ -17,6 +17,8 @@ #1A000000 #FF2966EC #1F9BFE + #191A1C + #131415 #256BFF #3E7BFE #323C6F diff --git a/core/mogo-core-res/src/main/res/values/dimens.xml b/core/mogo-core-res/src/main/res/values/dimens.xml index 5b489432c5..2b72295b83 100644 --- a/core/mogo-core-res/src/main/res/values/dimens.xml +++ b/core/mogo-core-res/src/main/res/values/dimens.xml @@ -1027,13 +1027,23 @@ 999dp 1000dp 1003dp + 1017dp + 1055dp + 1090dp + 1092dp 1100dp 1125dp + 1170dp 1200dp + 1261dp 1300dp + 1373dp 1600dp 1860dp 1920dp + 2080dp + 2158dp + 2300dp @@ -1062,16 +1072,29 @@ 27dp 28dp 30dp + 31dp 32dp 34dp 36dp 38dp + 39dp 40dp 42dp 46dp 48dp + 52dp + 55dp + 57dp + 69dp + 72dp 76dp + 90dp + 94dp + 102dp 120dp + 150dp + 195dp + 214dp 50dp diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/floating/MoGoPopWindow.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/floating/MoGoPopWindow.kt index 195909129a..9ae5092dc2 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/floating/MoGoPopWindow.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/floating/MoGoPopWindow.kt @@ -15,11 +15,14 @@ import android.widget.PopupWindow import androidx.annotation.LayoutRes import androidx.core.view.doOnAttach import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope -import com.mogo.eagle.core.utilcode.util.* +import com.mogo.eagle.core.utilcode.mogo.logger.Logger import java.util.concurrent.atomic.AtomicBoolean class MoGoPopWindow private constructor(builder: Builder){ + companion object { + private const val TAG = "MoGoPopWindow" + } private val content: View = builder.content ?: throw AssertionError("要填充的View不能为空") @@ -109,9 +112,19 @@ class MoGoPopWindow private constructor(builder: Builder){ val params = content.rootView.layoutParams as WindowManager.LayoutParams val oldX = params.x val oldY = params.y - val newX = oldX + dx - val newY = oldY + dy + Logger.d(TAG, "oldX: $oldX, oldY: $oldY, dx: $dx, dy:$dy") + var newX = oldX + dx + var newY = oldY + dy if (outer.contains(rawX.toInt(), rawY.toInt())) { + val width = activity.resources.displayMetrics.widthPixels + val height = activity.resources.displayMetrics.heightPixels +// if (newX < 0) { +// newX += newX +// } +// if (newY < 0) { +// newY += height +// } + Logger.d(TAG, "screen_width: $width, screen_height: $height, newX: $newX, newY: $newY, rawX: ${rawX.toInt()}, rawY: ${rawY.toInt()}, width: ${content.width}, height: ${content.height}") pop.update(newX, newY, content.width, content.height) } oldRawX = rawX @@ -252,7 +265,7 @@ class MoGoPopWindow private constructor(builder: Builder){ } fun offsetX(x: Int) = apply { - this.offsetY = x + this.offsetX = x } fun offsetY(y: Int) = apply { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java index fa51210023..c54236fc0e 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java @@ -2,6 +2,8 @@ package com.mogo.eagle.core.utilcode.mogo.storage.lrucache; import android.content.Context; +import com.mogo.eagle.core.utilcode.util.Md5Util; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -66,7 +68,7 @@ public class DiskCacheManager { * @throws IOException */ private DiskLruCache.Editor edit( String key) throws IOException { - key = SecretUtil.getMD5Result(key); //存取的 key + key = Md5Util.getMD5Result(key); //存取的 key if (mDiskLruCache != null) { mEditor = mDiskLruCache.edit(key); } @@ -349,7 +351,7 @@ public class DiskCacheManager { * @return InputStream */ private InputStream getCacheInputStream( String key) { - key = SecretUtil.getMD5Result(key); + key = Md5Util.getMD5Result(key); InputStream in; DiskLruCache.Snapshot snapshot = snapshot(key); if (snapshot == null) { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/SecretUtil.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/SecretUtil.java deleted file mode 100644 index 97c20a4cf5..0000000000 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/SecretUtil.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.mogo.eagle.core.utilcode.mogo.storage.lrucache; -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -public class SecretUtil { - - public static String getMD5Result( String value) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(value.getBytes("UTF-8")); - byte[] result = md.digest(); - return getString(result); - } catch ( NoSuchAlgorithmException e) { - e.printStackTrace(); - return ""; - } catch ( UnsupportedEncodingException e) { - e.printStackTrace(); - return ""; - } - } - - private static String getString( byte[] result) { - StringBuilder sb = new StringBuilder(); - for (byte b : result) { - int i = b & 0xff; - if (i <= 0xf) { - sb.append(0); - } - sb.append( Integer.toHexString(i)); - } - return sb.toString().toLowerCase(); - } -} diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DrivingDirectionUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DrivingDirectionUtils.java index 6d0c419431..c9a76e7c91 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DrivingDirectionUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DrivingDirectionUtils.java @@ -154,7 +154,7 @@ public class DrivingDirectionUtils { } /** - * + * 取值范围[0,360] * @param dx1 * @param dy1 * @param dx2 diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/LocationUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/LocationUtils.java index 5d709ac3cf..cf5f7042b1 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/LocationUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/LocationUtils.java @@ -1,25 +1,28 @@ package com.mogo.eagle.core.utilcode.util; +import android.util.Pair; + public class LocationUtils { /** * 地球半径 */ private static double EARTH_RADIUS = 6378.137; - private static double rad( double d ) { + private static double rad(double d) { return d * Math.PI / 180.0; } /** * 计算两点间距离( 单位:米 ) + * * @param lat1 * @param lng1 * @param lat2 * @param lng2 * @return */ - public static double getDistance( double lat1, double lng1, double lat2, double lng2 ) { - double radLat1 = rad( lat1 ); + public static double getDistance(double lat1, double lng1, double lat2, double lng2) { + double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); @@ -35,7 +38,8 @@ public class LocationUtils { /** * 点到直线的最短距离的判断 点(x0,y0) 到由两点组成的线段(x1,y1) ,( x2,y2 )
- * ( 单位:米 ) + * ( 单位:米 ) + * * @param x1 * @param y1 * @param x2 @@ -44,7 +48,7 @@ public class LocationUtils { * @param y0 * @return */ - public static double pointToLine( double x1, double y1, double x2, double y2, double x0, double y0 ) { + public static double pointToLine(double x1, double y1, double x2, double y2, double x0, double y0) { double space; double a, b, c; a = getDistance(y1, x1, y2, x2);// 线段的长度 @@ -73,4 +77,146 @@ public class LocationUtils { space = 2 * s / a;// 返回点到线的距离(利用三角形面积公式求高) return space; } + + /** + * 计算向量的点积 + * + * @param xa + * @param ya + * @param xb + * @param yb + * @return + */ + private static double dotProduct(double xa, double ya, double xb, double yb) { + return xa * xb + ya * yb; + } + + /** + * 计算向量的模长 + * @param xa + * @param ya + * @return + */ + private static double magnitude(double xa, double ya) { + return Math.sqrt(xa * xa + ya * ya); + } + + /** + * 计算点p到点a和点b组成的线段的垂足 + * + * @param xp + * @param yp + * @param xa + * @param ya + * @param xb + * @param yb + * @return 垂足 + */ + public static Pair footPoint(double xp, double yp, double xa, double ya, double xb, double yb) { + // 计算线段的向量v,即b - a + double xv = xb - xa; + double yv = yb - ya; + // 计算点p相对于线段起点a的向量w,即p - a + double xw = xp - xa; + double yw = yp - ya; + + double c1 = dotProduct(xw, yw, xv, yv); + double c2 = dotProduct(xv, yv, xv, yv); + double t = c1 / c2; + if (t < 0) { + t = 0; + } else if (t > 1) { + t = 1; + } + return new Pair<>(xa + t * xv, ya + t * yv); + } + + /** + * 计算a-b线段和c-d线段之间的夹角 + * @param xa + * @param ya + * @param xb + * @param yb + * @param xc + * @param yc + * @param xd + * @param yd + * @return + */ + public static double angleBetweenLineSegments(double xa, double ya, double xb, double yb, double xc, double yc, double xd, double yd) { + double xv = xb - xa; + double yv = yb - ya; + + double xw = xd - xc; + double yw = yd - yc; + + double dot = dotProduct(xv, yv, xw, yw); + double mag1 = magnitude(xv, yv); + double mag2 = magnitude(xw, yw); + double cosTheta = dot / (mag1 * mag2); + // 由于反余弦函数的取值范围,需要对结果进行调整 + if (cosTheta > 1) { + cosTheta = 1; + } else if (cosTheta < -1) { + cosTheta = -1; + } + double angleInRadians = Math.acos(cosTheta); + return Math.toDegrees(angleInRadians); + } + + /** + * 逆时针旋转到90度(和地图坐标系正北为0顺指针的方向相反) + * @param angle + * @return + */ + public static double rotateTo90(double angle) { + double difference = angle - 90; + if (difference < 0) { + difference += 360; + } + return difference; + } + + /** + * 计算向量叉乘 + * @return + */ + public static double crossProduct(double xa, double ya, double xb, double yb, double xp, double yp) { + return (xb - xa) * (yp - ya) - (yb - ya) * (xp - xa); + } + + /** + * + * @return 点P是否在线段AB上 + */ + public static boolean isOnSegment(double xa, double ya, double xb, double yb, double xp, double yp) { + return (xp >= Math.min(xa, xb) && xp <= Math.max(xa, xb) && yp >= Math.min(ya, yb) && yp <= Math.max(ya, yb)); + } + + /** + * 判断点P相对于点A和点B组成的线段的位置(逆时针方向看左、上) + * @return 0:在线段上,1:左侧,2:右侧,3:上方,4:下方 + */ + public static int checkLocation(double xp, double yp, double xa, double ya, double xb, double yb) { + // 计算向量的叉乘 + double cp = crossProduct(xa, ya, xb, yb, xp, yp); + if (cp > 0) { + return 1; + } else if (cp < 0) { + return 2; + } else { + // 叉乘为0时,点p在线段AB所在的直线上,此时先判断是否在AB线段上 + if (isOnSegment(xa, ya, xb, yb, xp, yp)) { + return 0; + } else { + double slopeAB = (yb - ya) / (xb - xa); + double slopeAP = (yp - ya) / (xp - xa); + if (slopeAP > slopeAB) { + return 3; + } else { + return 4; + } + } + } + } } diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/Md5Util.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/Md5Util.kt index 943a9819a2..9c912a6127 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/Md5Util.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/Md5Util.kt @@ -1,8 +1,12 @@ package com.mogo.eagle.core.utilcode.util -import java.io.* +import java.io.File +import java.io.FileInputStream +import java.io.UnsupportedEncodingException import java.nio.channels.FileChannel.MapMode -import java.security.* +import java.security.MessageDigest +import java.security.NoSuchAlgorithmException +import java.util.Locale class Md5Util { @@ -39,5 +43,34 @@ class Md5Util { } return stringbuffer?.toString() } + + @JvmStatic + fun getMD5Result(value: String): String { + try { + val md = MessageDigest.getInstance("MD5") + md.update(value.toByteArray(charset("UTF-8"))) + val result = md.digest() + return getString(result) + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + return "" + } catch (e: UnsupportedEncodingException) { + e.printStackTrace() + return "" + } + } + + private fun getString(result: ByteArray): String { + val sb = StringBuilder() + for (b in result) { + val i = b.toInt() and 0xff + if (i <= 0xf) { + sb.append(0) + } + sb.append(Integer.toHexString(i)) + } + return sb.toString().lowercase(Locale.getDefault()) + } + } } \ No newline at end of file diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java index 9e89e920e7..28be046e95 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java @@ -10,9 +10,12 @@ public class HostConst { public static final String HOST_EAGLE_QA = "https://eagle-dns-qa.zhidaozhixing.com/"; public static final String HOST_EAGLE_RELEASE = "https://eagle-dns.zhidaozhixing.com/"; + public static final String NED_QA = "https://nde-qa-city.zhidaozhixing.com"; + public static final String NED_RELEASE = "https://nde-city.zhidaozhixing.com"; + public static String getHost() { String host = HOST_RELEASE; - if(FunctionBuildConfig.urlJson.getEagleMisUrl().isEmpty()){ + if (FunctionBuildConfig.urlJson.getEagleMisUrl().isEmpty()) { switch (DebugConfig.getNetMode()) { case DebugConfig.NET_MODE_DEV: case DebugConfig.NET_MODE_QA: @@ -20,27 +23,36 @@ public class HostConst { break; } return host; - }else{ + } else { return FunctionBuildConfig.urlJson.getEagleMisUrl(); } } - public static String getEagleHost(){ + public static String getEagleHost() { String host = HOST_EAGLE_RELEASE; - if(FunctionBuildConfig.urlJson.getEagleDnsUrl().isEmpty()){ - switch (DebugConfig.getNetMode()){ + if (FunctionBuildConfig.urlJson.getEagleDnsUrl().isEmpty()) { + switch (DebugConfig.getNetMode()) { case DebugConfig.NET_MODE_DEV: case DebugConfig.NET_MODE_QA: host = HOST_EAGLE_QA; break; } return host; - }else{ + } else { return FunctionBuildConfig.urlJson.getEagleDnsUrl(); } } - + public static String getNDEHost() { + String host = NED_RELEASE; + switch (DebugConfig.getNetMode()) { + case DebugConfig.NET_MODE_DEV: + case DebugConfig.NET_MODE_QA: + host = NED_QA; + break; + } + return host; + } } diff --git a/gradle.properties b/gradle.properties index 72998af9dc..847e501bf1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -81,8 +81,8 @@ MOGO_LOCATION_VERSION=1.4.7.23 MOGO_TELEMATIC_VERSION=1.4.7.23 ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=3.4.0.3 -MAP_SDK_DATA_VERSION=1.0.0.7 +MAP_SDK_VERSION=3.4.0.6 +MAP_SDK_DATA_VERSION=1.0.0.9 MAP_SDK_OPERATION_VERSION=1.1.4.1 # websocket WEBSOCKET_VERSION=1.1.7 @@ -90,8 +90,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=6004004 -versionName=6.4.4 +versionCode=6005000 +versionName=6.5.0 ################# 新架构模块Maven版本管理 ################# MOGO_CORE_FUNCTION_HMI_VERSION=0.0.58.10 @@ -149,7 +149,7 @@ MATRIX_VERSION=2.0.8 # 公交模式司机端版本号 -DRIVER_VERSION=6.4.4 +DRIVER_VERSION=6.5.0 # 公交模式乘客端端版本号 -PASSENGER_VERSION=5.4.4 +PASSENGER_VERSION=5.5.0 diff --git a/gradle/bytex/bytex_thread_opt.gradle b/gradle/bytex/bytex_thread_opt.gradle index 54e13f1319..200115b131 100644 --- a/gradle/bytex/bytex_thread_opt.gradle +++ b/gradle/bytex/bytex_thread_opt.gradle @@ -1,6 +1,6 @@ apply plugin: 'bytex.threadOpt' thread_opt { - enable true + enable false enableInDebug true logLevel "DEBUG" trace_enable !rootProject.isReleaseBuild() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 55e1a2591e..27fa064374 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Sep 22 11:53:55 CST 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://mirrors.tencent.com/gradle/gradle-6.1.1-all.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/libraries/mapmodule/src/main/java/com/autonavi/nge/MapBox.kt b/libraries/mapmodule/src/main/java/com/autonavi/nge/MapBox.kt index a857128ba6..446c1f1e1f 100644 --- a/libraries/mapmodule/src/main/java/com/autonavi/nge/MapBox.kt +++ b/libraries/mapmodule/src/main/java/com/autonavi/nge/MapBox.kt @@ -45,6 +45,7 @@ class MapBox { dis: Float, isCancel: Boolean = false ) + external fun llaGetBusStation(trajectorys : DoubleArray,isCancel: Boolean = false) external fun llaGetRoutePath(trajectorys : DoubleArray,isCancel: Boolean = false) external fun updateCacheFile(isCancel: Boolean = false) diff --git a/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt b/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt index 6245dd8cee..c3d1bf567f 100644 --- a/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt +++ b/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt @@ -139,6 +139,8 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr private var waitTime = 5000L private var isAutoLockCar = true + private var isAllGestureEnabled = true + // 协程 private val mScope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) // 耗时专用协程 @@ -181,9 +183,6 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr } } - - - override fun getMapEngine(): MapEngine { return mMapEngine } @@ -229,7 +228,7 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr mITraffic = null } - //surfaceview截屏 + // surfaceView截屏 private fun createBitmapFromGLSurface(x: Int, y: Int, w: Int, h: Int, gl: GL10): Bitmap? { val bitmapBuffer = IntArray(w * h) val bitmapSource = IntArray(w * h) @@ -256,10 +255,6 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr return Bitmap.createBitmap(bitmapSource, w, h, Bitmap.Config.ARGB_8888) } - - - - fun setMapController(mMapController: IMapController?) { this.mMapController = mMapController } @@ -343,6 +338,9 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr var lonlat: LonLat? = null override fun onTouchEvent(ev: MotionEvent): Boolean { + if (!isAllGestureEnabled) { + return mGestureDetector.onTouchEvent(ev) + } if (ev.action == MotionEvent.ACTION_MOVE && mDragMarker != null) { mDragMarker?.let { if(DEBUG){ @@ -1000,6 +998,9 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr if (DEBUG && mShowTouchInfo) { Log.i(TAG, "touchop--mGestureDetector--onFling:e1:${e1.x},${e1.y},e2:${e2.x},${e2.y},${velocityX},${velocityY}") } + if (!isAllGestureEnabled) { + return false + } if (e1.pointerCount >= 2 || e2.pointerCount >= 2) { return false } @@ -1047,6 +1048,10 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr if (DEBUG && mShowTouchInfo) { Log.i(TAG, "touchop--mGestureDetector--onScroll:e1:${e1.pointerCount},${e1.x},${e1.y},,e2:${e2.pointerCount},${e2.x},${e2.y},$distanceX,$distanceY,time:${e2.eventTime}") } + + if (!isAllGestureEnabled) { + return false + } if (e1.pointerCount >= 2 || e2.pointerCount >= 2) { return false } @@ -1231,7 +1236,6 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr //设置刷新帧率 override fun setRenderFps(fps: Int) { m_FPS = fps - } //设置刷新帧率 @@ -1264,6 +1268,10 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr this.renderTimePer = renderTimePer } + override fun setAllGestureEnabled(flag: Boolean) { + this.isAllGestureEnabled = flag + } + private fun renderDataCallback(data: String) { // if(DEBUG){ // Log.d("renderDataCallback", "renderDataCallback:$data") diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapController.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapController.kt index 82ae0a2449..33b92e5f8e 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapController.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapController.kt @@ -478,4 +478,8 @@ interface IMapController { fun setStreetLightEffectIsEnable(isEnable: Boolean) fun setHDTypeVisible(type: IntArray?) + + fun setAllGestureEnabled(flag: Boolean) + + fun setCfgKeyVal(key: String, value: String) } \ No newline at end of file diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapView.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapView.kt index 9081b00ecf..1796f69a6a 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapView.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/abs/IMapView.kt @@ -80,37 +80,11 @@ interface IMapView { //耗时协程 fun getDemaningScope():CoroutineScope? + // 设置手势标记位-- 临时 + fun setAllGestureEnabled(flag: Boolean) - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// fun setIsFarViewAngel(isFar: Boolean) + // fun setIsFarViewAngel(isFar: Boolean) // // fun setUpdateCount(updateCount: Int) } \ No newline at end of file diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/common/ConstantExt.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/common/ConstantExt.kt index 407505446d..bbaa3bfae1 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/common/ConstantExt.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/common/ConstantExt.kt @@ -32,6 +32,31 @@ object ConstantExt { //高程数据模式 const val MAP_STYLE_VR_BRIDGE= 100 + //无人机视角 + const val MAP_STYLE_VR_ANGLE_DRONE = 11 + + //无人机视角-摄像机高度 + const val MAP_STYLE_VR_EYE_HEIGHT_DRONE = 21.1f + + //无人机视角-摄像机角度 + const val MAP_STYLE_VR_OVER_LOOK_DRONE = 19.8f + + //无人机视角-缩放值 + const val MAP_STYLE_VR_ZOOM_VAL_DRONE = 2.9f + + //新路口视角 + const val MAP_STYLE_VR_ANGLE_ROAD_CROSS_NEW = 12 + + //新路口视角-摄像机高度 + const val MAP_STYLE_VR_EYE_HEIGHT_ROAD_CROSS_NEW = 68.8f + + //新路口视角-摄像机角度 + const val MAP_STYLE_VR_OVER_LOOK_ROAD_CROSS_NEW = 25.2f + + //新路口视角-缩放值 + const val MAP_STYLE_VR_ZOOM_VAL_ROAD_CROSS_NEW = 0.9f + + //漫游距离1公里 const val ROAM_DIS_1KM = 1000f //漫游距离3公里 diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt index 5c5725cb9f..adea1c5543 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt @@ -1549,6 +1549,24 @@ class MapController(private var context: Context?, private val mMapView: IMapVie // ) // // } + ConstantExt.MAP_STYLE_VR_ANGLE_DRONE -> { + disableSkyboxAndInterpolation( + ConstantExt.MAP_STYLE_VR_EYE_HEIGHT_DRONE, + ConstantExt.MAP_STYLE_VR_OVER_LOOK_DRONE, + ConstantExt.MAP_STYLE_VR_ZOOM_VAL_DRONE, + ConstantExt.MAP_STYLE_VR_ANGLE_DRONE, + -1 + ) + } + ConstantExt.MAP_STYLE_VR_ANGLE_ROAD_CROSS_NEW -> { + disableSkyboxAndInterpolation( + ConstantExt.MAP_STYLE_VR_EYE_HEIGHT_ROAD_CROSS_NEW, + ConstantExt.MAP_STYLE_VR_OVER_LOOK_ROAD_CROSS_NEW, + ConstantExt.MAP_STYLE_VR_ZOOM_VAL_ROAD_CROSS_NEW, + ConstantExt.MAP_STYLE_VR_ANGLE_ROAD_CROSS_NEW, + -1 + ) + } } if(type != ConstantExt.MAP_STYLE_VR_ROAM) { mEventController?.dispatchMapViewVisualAngleChangeListener(type) @@ -2263,4 +2281,12 @@ class MapController(private var context: Context?, private val mMapView: IMapVie override fun setHDTypeVisible(type: IntArray?){ mMapView.getMapEngine().setHDTypeVisible(type) } + + override fun setAllGestureEnabled(flag: Boolean) { + mMapView.setAllGestureEnabled(flag) + } + + override fun setCfgKeyVal(key: String, value: String) { + mMapView.getMapEngine().setCfgKeyVal(key, value) + } } \ No newline at end of file diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/road/RoadHelper.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/road/RoadHelper.kt index ef3a291b02..7d4bf40d09 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/road/RoadHelper.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/road/RoadHelper.kt @@ -12,6 +12,7 @@ import com.zhidaoauto.map.data.road.RoadRect import com.zhidaoauto.map.data.road.RoadRectInfos import com.zhidaoauto.map.data.road.RoadSign import com.zhidaoauto.map.data.road.RoadSignPostion +import com.zhidaoauto.map.data.road.RouteBusStation import com.zhidaoauto.map.data.road.RouteCamera import com.zhidaoauto.map.data.road.RouteLane import com.zhidaoauto.map.data.road.RoutePath @@ -1297,6 +1298,84 @@ class RoadHelper private constructor() { } } + fun getBusStation(routeList : ArrayList , isCanCancel: Boolean,call:IResult):String{ + var key = StringBuffer("llaGetBusStation_") + for(lonlat in routeList){ + key.append("${lonlat.longitude.toTenDecimalsStr()}_${lonlat.latitude.toTenDecimalsStr()}_") + } + key.append("${RoadResultController.CANCELTAG}${isCanCancel}") + RoadResultController.instance.addRoadResultListener(key.toString(),object :IRoadData{ + override fun result(code: Int, result: ByteArray?) { + if (CompileConfig.DEBUG) { + Log.d(TAG, "roadop--getRouteInfo--code:${code},result: $result") + } + if (result?.isEmpty() == true) { + call.result(1, null) + return + } + result?.let { + CommonController.instance.scope?.launch(Dispatchers.IO) { + val buf = ByteBufferHelper.bytes2ByteBuffer(result) + buf?.let { + val routePath = RoutePath() + val list = ArrayList() + val size = buf.int + for(i in 0 until size){ + val routeStep = RouteStep() + routeStep.id = buf.long.toInt() + routeStep.tileId = buf.int + routeStep.type = buf.int + routeStep.name = ByteBufferHelper.buf2Str(buf)?:"" + routeStep.limitSpeed = buf.int + + var busStations = ArrayList() + val busStation_size = buf.int + for(o in 0 until busStation_size){ + val routeBusStation = RouteBusStation() + routeBusStation.id = buf.int + routeBusStation.type = buf.int + routeBusStation.roadId = buf.int + val busStation_pts = buf.int + val busStationPoints = ArrayList() + for(p in 0 until busStation_pts step 2){ + val lonLatPoint = LonLatPoint(buf.long /1e8, buf.long /1e8) + busStationPoints.add(lonLatPoint) + } + routeBusStation.busStationPoints = busStationPoints + busStations.add(routeBusStation) + } + routeStep.busStations = busStations + + list.add(routeStep) + } + + if(list.isNotEmpty()){ + routePath.steps = list + if (CompileConfig.DEBUG) { + Log.d(TAG, "roadop--getRouteInfo--routePath:${routePath}") + } + withContext(Dispatchers.Main){ + call.result(0, routePath) + } + } + } + } + }?:{ + call.result(1,null) + } + } + }) + val data = MapTools.listToArray(routeList,false) + try { + mapBox.llaGetBusStation(data,isCanCancel) + }catch (e: Exception){ + if (CompileConfig.DEBUG) { + Log.e(TAG, e.toString()) + } + } + return key.toString() + } + fun getRouteInfo(routeList : ArrayList , isCanCancel: Boolean,call:IResult):String{ var key = StringBuffer("llaGetRoutePath_") for(lonlat in routeList){ diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/data/MapDataApi.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/data/MapDataApi.kt index dff2435656..5df58bd67e 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/data/MapDataApi.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/data/MapDataApi.kt @@ -573,6 +573,10 @@ object MapDataApi { return RoadHelper.getInstance()?.isInRoadSideFenceRegion(lon, lat, isCanCancel, call) } + fun getBusStation(routeList: ArrayList, call: IResult, isCanCancel: Boolean = false): String? { + return RoadHelper.getInstance()?.getBusStation(routeList, isCanCancel, call) + } + /** * 获取路线信息 * diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/logics/location/MyLocationStyle.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/logics/location/MyLocationStyle.kt index 003b407bde..9c6dcc51f4 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/logics/location/MyLocationStyle.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/logics/location/MyLocationStyle.kt @@ -45,6 +45,7 @@ class MyLocationStyle( private var is3D: Boolean = false private var carId: Int = 0 private var isDisplayAnim: Boolean = true + private var showSelfMarker:Boolean = true // 前置调用/或后置更新draw private var mMarker: Marker? = null private var lastExecuteTime = -1L @@ -236,6 +237,9 @@ class MyLocationStyle( options.animMarkerRes(guangquanResId, mMapController) } mMarker = mMarkerController?.addSelfCar(options) + if(!showSelfMarker){ + mMarker?.setVisible(false) + } carId = resId if (CompileConfig.DEBUG) { Log.i( @@ -335,10 +339,12 @@ class MyLocationStyle( fun hideCar() { + showSelfMarker = false mMarker?.setVisible(false) } fun showCar() { + showSelfMarker = true mMarker?.setVisible(true) } diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/BitmapDescriptorFactory.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/BitmapDescriptorFactory.kt index 0c7b3d69ee..c3558c4288 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/BitmapDescriptorFactory.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/BitmapDescriptorFactory.kt @@ -70,7 +70,7 @@ object BitmapDescriptorFactory { View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) ) view.layout(0, 0, view.measuredWidth, view.measuredHeight) - val bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); + val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) val canvas = Canvas(bitmap) // canvas.drawColor(Color.WHITE); view.draw(canvas); diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/Marker.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/Marker.kt index cc17fb6825..02bc0defe3 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/Marker.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/renders/marker/Marker.kt @@ -578,7 +578,7 @@ public class Marker(private var markerOptions: MarkerOptions,private var mMapCon if (CompileConfig.DEBUG) { Log.i(TAG, "markerop--matt--showInfoWindow--start:${id}") } - val view = TextView(context); + val view = TextView(context) view.layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT) view.textSize = 10.0f view.text = id diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt index f512e0bfcd..bb5082f8d7 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt @@ -50,6 +50,7 @@ open class MapAutoView : FrameLayout, LonLatPointListener, ITraffic,ILockLocatio } //The instance of MapView + @Volatile private var mMapView: MapView? = null //The instance of IMapStyleParams private var mMapStyleParams: IMapStyleParams? = null @@ -64,6 +65,7 @@ open class MapAutoView : FrameLayout, LonLatPointListener, ITraffic,ILockLocatio //The view of location protected var mLocationView: ILocationView? = null //The helper of MapView + @Volatile private var mMapAutoViewHelper: MapAutoViewHelper? = null //Longitude @@ -115,6 +117,7 @@ open class MapAutoView : FrameLayout, LonLatPointListener, ITraffic,ILockLocatio //The animation interval of Map private var mDuration = 100 //whether to set weather + @Volatile private var mIsWeatherEnable = true //The controller of weather private var mWeatherController: IWeatherController? = null @@ -1095,7 +1098,7 @@ open class MapAutoView : FrameLayout, LonLatPointListener, ITraffic,ILockLocatio mDeviationAngle = deviationAngle } fun getMapView():MapView?{ - return mMapView; + return mMapView } } \ No newline at end of file diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt index 4c1e81750a..0ee4e5671e 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt @@ -1,6 +1,7 @@ package com.zhidaoauto.map.sdk.open.view import android.util.Log +import android.view.View import com.autonavi.nge.map.LonLat import com.zhidaoauto.map.data.point.LonLatPoint import com.zhidaoauto.map.sdk.inner.CompileConfig @@ -549,6 +550,7 @@ class MapAutoViewHelper(mapAutoView: MapAutoView) { mMapAutoView.getMapController()?.setScroll(flag) mMapAutoView.getMapController()?.setFling(flag) mMapAutoView.getMapController()?.setRotate(flag) + mMapAutoView.getMapController()?.setAllGestureEnabled(flag) } /** @@ -775,6 +777,10 @@ class MapAutoViewHelper(mapAutoView: MapAutoView) { ?.setPanel(PanelManager.PANEL_WHAT_HID, PanelManager.PANEL_BTN_LOGO) } + fun setVisible(visible:Boolean){ + mMapAutoView.getClerk()?.add() + mMapAutoView.getMapView()?.visibility = if (visible) View.VISIBLE else View.GONE + } /** * 地图截屏 diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java index f51b9037b6..03f470f8d0 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java @@ -20,7 +20,7 @@ public enum MessageType { TYPE_RECEIVE_VEHICLE_STATE(MessagePad.MessageType.MsgTypeVehicleState, "老底盘状态"), TYPE_RECEIVE_AUTOPILOT_STATE(MessagePad.MessageType.MsgTypeAutopilotState, "自动驾驶状态"), TYPE_RECEIVE_REPORT_MESSAGE(MessagePad.MessageType.MsgTypeReportMessage, "监控事件报告"), - TYPE_RECEIVE_PERCEPTION_TRAFFIC_LIGHT(MessagePad.MessageType.MsgTypePerceptionTrafficLight, "感知红绿灯"), + TYPE_RECEIVE_PERCEPTION_TRAFFIC_LIGHT(MessagePad.MessageType.MsgTypePerceptionTrafficLight, "融合感知红绿灯"), TYPE_RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY(MessagePad.MessageType.MsgTypePredictionObstacleTrajectory, "他车轨迹预测"), TYPE_RECEIVE_POINT_CLOUD(MessagePad.MessageType.MsgTypePointCloud, "点云透传"), TYPE_RECEIVE_PLANNING_OBJECTS(MessagePad.MessageType.MsgTypePlanningObjects, "Planning障碍物"), @@ -30,6 +30,9 @@ public enum MessageType { TYPE_RECEIVE_M1_STITCHED_VIDEO(MessagePad.MessageType.MsgTypeM1StitchedVideo, "M1拼接视频"), TYPE_RECEIVE_SSM(MessagePad.MessageType.MsgTypeSSMState, "SSM系统状态"), TYPE_RECEIVE_FM_STATE(MessagePad.MessageType.MsgTypeFMState, "FM状态"), + TYPE_RECEIVE_FSM2024_STATE(MessagePad.MessageType.MsgTypeFSM2024State, "FSM状态"), + TYPE_RECEIVE_LOC_STATE(MessagePad.MessageType.MsgTypeLocState, "定位状态"), + TYPE_RECEIVE_CLOUD_REGULATORY_WARNING(MessagePad.MessageType.MsgTypeCloudRegulatoryWarning, "云控监管预警"), TYPE_RECEIVE_BASIC_INFO_REQ(MessagePad.MessageType.MsgTypeBasicInfoReq, "自动驾驶设备基础信息请求"), TYPE_SEND_BASIC_INFO_RESP(MessagePad.MessageType.MsgTypeBasicInfoResp, "自动驾驶设备基础信息应答"), @@ -80,10 +83,21 @@ public enum MessageType { TYPE_RECEIVE_PARALLEL_DRIVING_STATUS(MessagePad.MessageType.MsgTypeParallelDrivingCmd, "平行驾驶状态", 5000), TYPE_SEND_RECEIVED_ACK(MessagePad.MessageType.MsgTypeReceivedAck, "发送消息回执"), TYPE_RECEIVE_RECEIVED_ACK(MessagePad.MessageType.MsgTypeReceivedAck, "接收消息回执"), + TYPE_RECEIVE_V2N_NIO_GREEN_WAVE_PASSAGE_EVENT(MessagePad.MessageType.MsgTypeV2nNioGreenWavePassageEvent, "V2N NIO绿波通行(单路口)"), + TYPE_RECEIVE_V2N_NIO_CROSSOVER_EVENT(MessagePad.MessageType.MsgTypeV2nNioCrossoverEvent, "V2N NIO行人横穿(路侧)"), + TYPE_RECEIVE_V2N_NIO_OTHER_RETROGRADE_EVENT(MessagePad.MessageType.MsgTypeV2nNioOtherRetrogradeEvent, "V2N NIO他车逆行(路侧)"), + TYPE_RECEIVE_V2N_NIO_CONGESTION_EVENT(MessagePad.MessageType.MsgTypeV2nNioCongestionEvent, "V2N NIO拥堵事件"), //TODO 透传原始pb文件中不存在以下type。由于Java中无法强转,所以在mogo-adas-data/message_pad.proto中放开注释 TYPE_RECEIVE_PLANNING_DECISION_STATE(MessagePad.MessageType.MsgTypePlanningDecisionState, "Planning决策状态"), TYPE_RECEIVE_SWEEPER_TASK_INDEX_DATA(MessagePad.MessageType.MsgTypeSweeperTaskIndexData, "清扫车指标数据"), TYPE_RECEIVE_OBU_WARNING_DATA(MessagePad.MessageType.MsgTypeObuWarningData, "OBU预警事件"), + //以下6个与标定相关 + TYPE_RECEIVE_CAMERA_CALIB_CHECK_DATA30(MessagePad.MessageType.MsgTypeCameraCalibCheckData30, "相机标定检查视频30"), + TYPE_RECEIVE_CAMERA_CALIB_CHECK_DATA60(MessagePad.MessageType.MsgTypeCameraCalibCheckData60, "相机标定检查视频60"), + TYPE_RECEIVE_CAMERA_CALIB_CHECK_DATA120_FRONT(MessagePad.MessageType.MsgTypeCameraCalibCheckData120Front, "相机标定检查视频120前"), + TYPE_RECEIVE_CAMERA_CALIB_CHECK_DATA120_BACK(MessagePad.MessageType.MsgTypeCameraCalibCheckData120Back, "相机标定检查视频120后"), + TYPE_RECEIVE_CAMERA_CALIB_CHECK_DATA120_LEFT(MessagePad.MessageType.MsgTypeCameraCalibCheckData120Left, "相机标定检查视频120左"), + TYPE_RECEIVE_CAMERA_CALIB_CHECK_DATA120_RIGHT(MessagePad.MessageType.MsgTypeCameraCalibCheckData120Right, "相机标定检查视频120右"), ; diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/AdasParam.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/AdasParam.java index b5faa8537e..acae9a5cd7 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/AdasParam.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/AdasParam.java @@ -91,6 +91,18 @@ public class AdasParam { */ public final int fusionMode; + /** + * 座椅状态(座椅压力) + * 0:表示仅主驾位有人,1:表示仅副驾位有人,2:表示主驾和副驾同时有人,3:表示仅后排有人,4:表示主驾有人+后排有人,5:表示副驾有人+后排有人,6:表示主驾和副驾同时有人+后排有人,7: 所有座位都无人, 255:缺省 + */ + public final int seatState; + /** + * 座椅状态(座椅压力) + * 解析后的数据 + * 为空的原因:未查询此数据、工控机不存在此数据、解析失败 + */ + public final SeatState seatStateParse; + /** * 超车的最大速度阈值 * m/s, 范围[3, 12.5] @@ -113,6 +125,8 @@ public class AdasParam { int v2nToPnc = -1; int v2iToPnc = -1; int fusionMode = -1; + int seatState = -1; + SeatState seatStateParse = null; double overtakeMaxSpeed = -1.0; if (param != null) { @@ -185,6 +199,36 @@ public class AdasParam { if (!TextUtils.isEmpty(value)) { fusionMode = Integer.parseInt(value); } + } else if (type == AdasConstants.MapSystemParamType.SEAT_STATE_VALUE) { + if (!TextUtils.isEmpty(value)) { + seatState = Integer.parseInt(value); + switch (seatState) { + case 0: + seatStateParse = new SeatState(true, false, false); + break; + case 1: + seatStateParse = new SeatState(false, true, false); + break; + case 2: + seatStateParse = new SeatState(true, true, false); + break; + case 3: + seatStateParse = new SeatState(false, false, true); + break; + case 4: + seatStateParse = new SeatState(true, false, true); + break; + case 5: + seatStateParse = new SeatState(false, true, true); + break; + case 6: + seatStateParse = new SeatState(true, true, true); + break; + case 7: + seatStateParse = new SeatState(false, false, false); + break; + } + } } else if (type == AdasConstants.MapSystemParamType.OVERTAKE_MAX_SPEED_VALUE) { if (!TextUtils.isEmpty(value)) { overtakeMaxSpeed = Double.parseDouble(value); @@ -208,6 +252,8 @@ public class AdasParam { this.v2nToPnc = v2nToPnc; this.v2iToPnc = v2iToPnc; this.fusionMode = fusionMode; + this.seatState = seatState; + this.seatStateParse = seatStateParse; this.overtakeMaxSpeed = overtakeMaxSpeed; } @@ -227,6 +273,7 @@ public class AdasParam { "\n融合V2N开关=" + (v2nToPnc == -1 ? "未知" : v2nToPnc == 0 ? "不发给PnC" : "发给PnC") + "\n融合V2I开关=" + (v2iToPnc == -1 ? "未知" : v2iToPnc == 0 ? "不发给PnC和鹰眼" : "发给Pnc和鹰眼") + "\n融合模式=" + (fusionMode == -1 ? "未知" : fusionMode == 5 ? "纯路侧模式" : fusionMode == 4 ? "透传模式" : fusionMode == 3 ? "超视距模式" : fusionMode == 2 ? "盲区模式" : "全融合模式") + + "\n座椅状态(座椅压力)=" + (seatState == -1 ? "未知" : seatState + (seatStateParse == null ? "[此值无法解析]" : seatStateParse.toString())) + "\n超车最大速度阈值=" + (overtakeMaxSpeed == -1 ? "未知" : overtakeMaxSpeed + "m/s") ; } @@ -244,4 +291,30 @@ public class AdasParam { this.height = height; } } + + public static class SeatState { + /** + * 主驾是否有人 + */ + public final boolean driver; + /** + * 副驾是否有人 + */ + public final boolean copilot; + /** + * 后排是否有人 + */ + public final boolean backRow; + + public SeatState(boolean driver, boolean copilot, boolean backRow) { + this.driver = driver; + this.copilot = copilot; + this.backRow = backRow; + } + + @Override + public String toString() { + return "[主驾是否有人:" + driver + " 副驾是有人:" + copilot + " 后排是否有人:" + backRow + "]"; + } + } } diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java index e906c4f36b..5cb6b0df08 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java @@ -11,6 +11,7 @@ import org.json.JSONObject; import chassis.Chassis; import chassis.ChassisStatesOuterClass; +import fsm.Fsm2024; import function_state_management.FSMStatusReasonQueryOuterClass; import system_master.SsmInfo; import system_master.SystemStatusInfo; @@ -45,14 +46,19 @@ public class LaunchConditionData { */ public final SsmInfo.SsmStatusInf ssmInfo; public final FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond;//FSM数据 + public final Fsm2024.FSMStateMsg fsmState;//FSM数据 public final long createTime; + public LaunchConditionData(String abilityVersion, Fsm2024.FSMStateMsg fsmState) { + this(abilityVersion, null, Float.MAX_VALUE, null, null, null, null, fsmState); + } + public LaunchConditionData(String abilityVersion, SystemStatusInfo.StatusInfo statusInfo, SsmInfo.SsmStatusInf ssmInfo, FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond) { - this(abilityVersion, null, Float.MAX_VALUE, null, statusInfo, ssmInfo, fsmStatusReasonRespond); + this(abilityVersion, null, Float.MAX_VALUE, null, statusInfo, ssmInfo, fsmStatusReasonRespond, null); } public LaunchConditionData(String abilityVersion, @@ -62,6 +68,17 @@ public class LaunchConditionData { SystemStatusInfo.StatusInfo statusInfo, SsmInfo.SsmStatusInf ssmInfo, FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond) { + this(abilityVersion, chassisStates, oldSteering, light, statusInfo, ssmInfo, fsmStatusReasonRespond, null); + } + + public LaunchConditionData(String abilityVersion, + ChassisStatesOuterClass.ChassisStates chassisStates, + float oldSteering, + Chassis.LightSwitch light, + SystemStatusInfo.StatusInfo statusInfo, + SsmInfo.SsmStatusInf ssmInfo, + FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond, + Fsm2024.FSMStateMsg fsmState) { this.abilityVersion = abilityVersion; this.chassisStates = chassisStates; this.oldSteering = oldSteering; @@ -69,6 +86,7 @@ public class LaunchConditionData { this.statusInfo = statusInfo; this.ssmInfo = ssmInfo; this.fsmStatusReasonRespond = fsmStatusReasonRespond; + this.fsmState = fsmState; createTime = System.currentTimeMillis(); } @@ -78,9 +96,10 @@ public class LaunchConditionData { jsonObject.put("ability_version", abilityVersion); jsonObject.put("create_object_time", createTime); JSONArray array = new JSONArray(); - JSONObject chassisStatesObject = new JSONObject(); - chassisStatesObject.put("name", "ChassisStates"); + JSONObject chassisStatesObject = null; if (chassisStates != null) { + chassisStatesObject = new JSONObject(); + chassisStatesObject.put("name", "ChassisStates"); if (chassisStates.hasHeader()) { chassisStatesObject.put("data_header", TextFormat.printer().escapingNonAscii(false).printToString(chassisStates.getHeader())); } @@ -120,18 +139,27 @@ public class LaunchConditionData { } //车灯 if (light != null) { + if (chassisStatesObject == null) { + chassisStatesObject = new JSONObject(); + chassisStatesObject.put("name", "ChassisStates"); + } chassisStatesObject.put("light", light.name()); } - array.put(chassisStatesObject); + if (chassisStatesObject != null) { + array.put(chassisStatesObject); + } if (statusInfo != null) { - arrayPut(array, statusInfo.getClass().getName(), statusInfo.getAutoPilotReady(), statusInfo.getAutoPilotUnreadyReason()); + arrayPut(array, statusInfo); } if (ssmInfo != null) { - arrayPut(array, ssmInfo.getClass().getName(), ssmInfo.getAutoPilotReady(), ssmInfo.getAutoPilotUnreadyReason()); + arrayPut(array, ssmInfo); } if (fsmStatusReasonRespond != null) { arrayPut(array, fsmStatusReasonRespond); } + if (fsmState != null) { + arrayPut(array, fsmState); + } if (array.length() > 0) { jsonObject.put("data", array); } diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java index 7ce0bae69e..91e01db97e 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java @@ -7,7 +7,8 @@ import java.util.Map; /** * 监控事件报告中定义的事件以及解释 - * 根据MAP4.2.0事件定义编写 最后修改于2024-04-07 + * 根据诊断事件定义表 第143版 编写 最后修改于2024-06-13 + * 由于 MAP420及以后版本 诊断事件定义表 中不会标记 新增版本以及弃用版本,所以将不再使用 @ReportState进行版本注解 */ public class MogoReport { public interface Result { @@ -341,6 +342,8 @@ public class MogoReport { @ReportState("4.2.0") String HOST_MEMORY_EXCEED = "EMAP_HOST_MEMORY_EXCEED";//系统内存占用过高 + String ENTRY_AUTOPILOT_FOR_GEAR_NOT_READY = "EMAP_ENTRY_AUTOPILOT_FOR_GEAR_NOT_READY";//档位不正确未进自驾 + } /** @@ -583,6 +586,14 @@ public class MogoReport { @ReportState("4.1.0") String RADAR_CHECK_FAILED = "ECLB_RADAR_CHECK_FAILED";//radar标定自检算法失败,无法判定外参是否正常,建议重试 } + + /** + * EFSM(功能状态管理) + */ + interface EFSM { + @ReportState("4.4.0") + String ENTRY_AUTOPILOT = "EFSM_ENTRY_AUTOPILOT";//FSM因为某些原因未进自驾 + } } /** @@ -973,6 +984,8 @@ public class MogoReport { String REMOTE_PILOT_STATE_CHANGED = "IFSM_REMOTE_PILOT_STATE_CHANGED";//平行驾驶状态机变化 @ReportState("3.5.0") String TELECTRL_PILOT_STATE_CHANGED = "IFSM_TELECTRL_PILOT_STATE_CHANGED";//遥感驾驶状态机变化 + @ReportState("4.4.0") + String RECEIVE_AP_REQUEST = "IFSM_RECEIVE_AP_REQUEST";//FSM收到自驾或平行驾驶或手动驾驶请求信号 } /** diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java index e0b11d41ed..f966ea314e 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java @@ -14,6 +14,7 @@ public class UnableLaunchReason { CHASSIS,//底盤 SSM, FSM, + FSM2024, } /** @@ -31,7 +32,9 @@ public class UnableLaunchReason { CHASSIS_HAZARD_LIGHTS,//危险报警灯 SSM_OFFER,//SSM提供的原因 FSM_OFFER,//FSM提供的原因 - SSM_TIMEOUT//SSM超时 + FSM2024_OFFER,//FSM2024提供的原因 + SSM_TIMEOUT,//SSM超时 + FSM2024_TIMEOUT//FSM2024超时 } /** diff --git a/libraries/mogo-adas-data/src/main/proto/fsm2024.proto b/libraries/mogo-adas-data/src/main/proto/fsm2024.proto new file mode 100644 index 0000000000..ec22d1cc38 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/proto/fsm2024.proto @@ -0,0 +1,53 @@ +syntax = "proto2"; +package fsm; + +import "header.proto"; + +enum State { + OFF = 0; + STANDBY = 1; //Standby 未来会弃用, 并入OFF + ACTIVATING = 2; + PILOT_DRIVING_ACTIVE = 3; //未来会被弃用,所有激活状态统一在Active状态下作为子状态管理 + PARALLEL_DRIVING_ACTIVE = 4; //未来会被弃用,所有激活状态统一在Active状态下作为子状态管理 + SAFETY_STOP = 5; + ACTIVE = 6; +} + +enum SafetyStopMode { + NOT_NEEDED = 0; + PLANNER_STOP = 1; + CONTROLLER_COMFORT_STOP = 2; + CONTROLLER_EMERGENCY_STOP = 3; +} + +enum ActiveMode { + NOT_ACTIVE= 0; + PILOT_ACTIVE= 1; + PARALLEL_ACTIVE= 2; + SIMULATOR_ACTIVE= 3; //模拟器驾驶, M1上专用 +} + +message FSMStateMsg { + required common.Header header = 1; + required State function_state = 2; + required SafetyStopMode fsm_safety_stop_mode = 4; //FSM如果进入safety stop,是planning 进行停车,还是control进行舒适停车,还是control进行紧急停车 + + required ActiveMode active_mode = 6; + + required bool new_msg_flag = 10; + + required bool pilot_standby_flag = 11; + required bool parallel_standby_flag = 12; + required bool simulator_standby_flag = 13; + + optional string pilot_not_standby_reason= 21; //FSM 无法自驾无法就绪的原因。 + optional string parallel_not_standby_reason= 22; //FSM 无法平行即使就绪原因 + optional string simulator_not_standby_reason= 23; //FSM 无法模拟器驾驶原因 + + optional uint64 fail_to_pilot_session_id= 36; + optional uint64 fail_to_parallel_session_id= 37; + optional uint64 fail_to_simulator_session_id= 38; + + optional string abnormal_state_trans_reason= 41; //FSM 异常退出ACTIVATING/自驾/平行驾驶/模拟器驾驶原因 (包括接管) + +} \ No newline at end of file diff --git a/libraries/mogo-adas-data/src/main/proto/fusion_traffic_light.proto b/libraries/mogo-adas-data/src/main/proto/fusion_traffic_light.proto new file mode 100644 index 0000000000..55aacaf8d0 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/proto/fusion_traffic_light.proto @@ -0,0 +1,43 @@ +syntax = "proto2"; +package perception; + +import "header.proto"; + +enum FusionLightType { + TYPE_DEFAULT_FUSION = 0; + TYPE_VEHICLE_FUSION = 1; + TYPE_BICYLE_FUSION = 2; + TYPE_PEDSTRIAN_FUSION = 3; + TYPE_LANE_FUSION = 5; +} + +enum FusionLightState { + STATE_OFF_FUSION = 0; + STATE_RED_FUSION = 1; + STATE_YELLOW_FUSION = 2; + STATE_GREEN_FUSION = 3; + STATE_FLASH_FUSION = 4; +} + +message FusionTrafficLight { + optional int64 id = 1; + optional FusionLightType type = 2 [default = TYPE_DEFAULT_FUSION]; + optional FusionLightState state = 3 [default = STATE_OFF_FUSION]; //当前灯态 + optional float duration = 4; // seconds since the last state changed //当前灯态倒计时 + optional FusionLightState next_state = 5 [default = STATE_OFF_FUSION]; //下一灯态 + optional float next_duration = 6 [default = -1.0]; // seconds since the last state changed 下一灯态倒计时 + optional FusionLightState next_two_state = 7 [default = STATE_OFF_FUSION]; //下二灯态 + optional float next_two_duration = 8 [default = -1.0]; // seconds since the last state changed 下二灯态倒计时 +} + +message FusionTrafficLights { + optional common.Header header = 1; + + optional FusionTrafficLight straight = 2; + optional FusionTrafficLight left = 3; + optional FusionTrafficLight right = 4; + optional FusionTrafficLight u_turn = 5; + + optional bool shield = 6 [default = false];//wheather the traffic lights are shield + optional uint32 source = 7 [default = 0]; // 0: vehicle, 1:V2I, 2: V2N +} diff --git a/libraries/mogo-adas-data/src/main/proto/loc_state.proto b/libraries/mogo-adas-data/src/main/proto/loc_state.proto new file mode 100644 index 0000000000..9447c53d7b --- /dev/null +++ b/libraries/mogo-adas-data/src/main/proto/loc_state.proto @@ -0,0 +1,15 @@ +syntax = "proto2"; +package localization; + +import "header.proto"; + + +message loc_state { + optional common.Header header = 1; + optional double rtk_time = 2;//rtk 时间戳 + optional int32 autopilot_state = 3;//0非自驾,1自驾状态 + optional int32 loc_status = 4;//loc 定位状态 0 正常 1 DR模式 2 异常(对应430统计异常值)(对应鹰眼端显示0 蓝色、1 蓝色、2异常红色) + optional string loc_sensors_state= 5;//子模块异常状态 + optional string loc_current_sensor=6;//当前定位使用的主要定位消息源 + optional string reserved = 7; +} \ No newline at end of file diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index 54a15f6401..5db31720a1 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -18,13 +18,20 @@ enum MessageType MsgTypeSweeperTaskIndexData = 0x00002; //清扫车指标数据 定频10hz MsgTypeObuWarningData = 0x00003; //obu预警事件 不定频 + MsgTypeCameraCalibCheckData30 = 0x01001; //相机标定检查视频, 10hz, jpeg. image_raw_30 + MsgTypeCameraCalibCheckData60 = 0x01002; //相机标定检查视频, 10hz, jpeg. image_raw_60 + MsgTypeCameraCalibCheckData120Front = 0x01003; //相机标定检查视频, 10hz, jpeg. image_raw_120 + MsgTypeCameraCalibCheckData120Back = 0x01004; //相机标定检查视频, 10hz, jpeg. image_raw_back + MsgTypeCameraCalibCheckData120Left = 0x01005; //相机标定检查视频, 10hz, jpeg. image_raw_left + MsgTypeCameraCalibCheckData120Right = 0x01006; //相机标定检查视频, 10hz, jpeg. image_raw_right + MsgTypeTrajectory = 0x10000; //局部轨迹,车前引导线 定频10hz MsgTypeTrackedObjects = 0x10001; //障碍物信息 定频10hz MsgTypeGnssInfo = 0x10002; //惯导信息 定频20hz MsgTypeVehicleState = 0x10003; //底盘信息, 透传底盘状态,pb参考底盘 定频20hz MsgTypeAutopilotState = 0x10004; //自动驾驶状态 定频20hz MsgTypeReportMessage = 0x10005; //系统事件 不定频 - MsgTypePerceptionTrafficLight = 0x10006; //感知红绿灯 定频10hz + MsgTypePerceptionTrafficLight = 0x10006; //融合感知红绿灯 定频10hz MsgTypePredictionObstacleTrajectory = 0x10007; //他车轨迹预测 定频10hz MsgTypePointCloud = 0x10008; //点云透传 定频1hz MsgTypePlanningObjects = 0x10009; //planning障碍物 定频10hz @@ -35,6 +42,9 @@ enum MessageType MsgTypeM1StitchedVideo = 0x1000e; //m1拼接视频 定频10hz MsgTypeSSMState = 0x1000f; //ssm 系统状态 定频1hz hq m1 MAP350开始支持,其他车型MAP360开始支持 MsgTypeFMState = 0x10010; //FM状态 定频1hz bus和清扫车是MAP370开始支持,其他车型MAP360开始支持 + MsgTypeFSM2024State = 0x10011; //20240531 FSM状态 定频10hz (telematics做状态变化判断,无变化10hz上报,有变化立即上报) BUS MAP440开始支持,其他车型暂未支持 + MsgTypeLocState = 0x10012; //定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持 + MsgTypeCloudRegulatoryWarning = 0x10013; //云控监管预警信息上报 //### 以下消息全部不定频 ### MsgTypeBasicInfoReq = 0x10100; //自动驾驶设备基础信息请求 @@ -77,6 +87,11 @@ enum MessageType MsgTypeGetDebugInfo = 0x10125; //debug信息查询 pad->telematics MsgTypeParallelDrivingCmd = 0x10126; //无人化场景,平行驾驶请求相关指令及状态反馈, 云控<->鹰眼双向透传 MsgTypeReceivedAck = 0x10127; //消息接收ack, 表示消息已接收到 + + MsgTypeV2nNioGreenWavePassageEvent = 0x10128; //绿波通行(单路口)事件推送, 透传 + MsgTypeV2nNioCrossoverEvent = 0x10129; //行人横穿(路侧)事件推送, 透传 + MsgTypeV2nNioOtherRetrogradeEvent = 0x1012a; //他车逆行(路侧)事件推送, 透传 + MsgTypeV2nNioCongestionEvent = 0x1012b; //拥堵事件推送, 透传 } message Header @@ -94,6 +109,130 @@ message ReceivedAck repeated uint64 msgids = 1; //确认收到的msgid列表 } +// message definition for MsgTypeV2nNioGreenWavePassageEvent +message V2nCrossSpeed +{ + //直行 + uint32 speed_straight_min = 1; + uint32 speed_straight_max = 2; + //左转 + uint32 speed_left_min = 3; + uint32 speed_left_max = 4; + //右转 + uint32 speed_right_min = 5; + uint32 speed_right_max = 6; + //车道限速 + uint32 max_speed = 7; + //限速来源 0融合 1默认 + uint32 max_status = 8; + //路口经度 + double lng = 9; + //路口纬度 + double lat = 10; +} + +// message definition for MsgTypeV2nNioCongestionEvent +message V2nCongestion +{ + // 消息时间,发送消息时间戳,单位毫秒 + uint64 msg_time = 1; + // 消息名称 + string msg_name = 2; + // 数据源,0:路侧设备、1:人工上报、2:地图、3:三方数据源 + uint32 data_source = 3; + // 路段拥堵详情 + repeated CongestionInfo infos = 4; +} + +message Geo{ + // 经度 + double lon = 1; + // 维度 + double lat = 2; +} + +message EventLocationGeo{ + //开始经度--队头 + double startLng = 1; + //开始纬度--队头 + double startLat = 2; + //结束经度 -- 队尾 + double endLng = 3; + //结束纬度 --队尾 + double endLat =4; + // 事件区域--- 车道中心线的坐标 + repeated Geo regions = 5; +} + +message TimePeriod{ + // 事件开始时间,UTC+0 时间戳,精确到毫秒 + uint64 start_time = 1; + // 事件结束时间,UTC+0 时间戳,精确到毫秒,没有传 0 + uint64 end_time = 2; + // 事件更新时间,UTC+0 时间戳,精确到毫秒,没有传 0 + uint64 update_time = 3; + // 事件确认时间,UTC+0 时间戳,精确到毫秒,没有传 0 + uint64 confirm_time = 4; +} + +message CongestionInfo +{ + // 事件状态,0:消散、1:生成 + uint32 data_status = 1; + // 事件时间相关信息 + TimePeriod time_period = 2; + // 事件发生位置的经纬度信息 + EventLocationGeo event_location_geo = 3; + //事件发生的原始照片 + repeated string img_file_key = 4; + // 事件类型, 101 施工、 102 三角牌, 103 静止车,104 拥堵 + uint32 event_type = 5; + // 事件唯一性 + string msg_uuid = 6; + // 拥堵等级 1,畅通,2,缓行,3,拥堵,4,严重拥堵 + uint32 congestion_level = 7; + // 车道号 + uint32 lane_no = 8; + // 拥堵细类 0,路段拥堵,1 路口拥堵 + uint32 congestion_type = 9; + // 车道方向,正北是0,顺时针方向 + double bearing = 10; + // 如果拥堵细类是路口,则有该路口中心点坐标 + double lon = 11; + double lat = 12; + // 视频地址 2024-06-03新增字段 + string video_url = 13; + // 来源ip 2024-06-03 新增字段 + string camera_ip = 14; +} + +enum EventType +{ + CONVERSE_RUNNING = 0;//逆行/倒车 + SLOW_RUNNING = 1;//慢行 + SPEEDING_RUNNING = 2;//快行 + EMERGENCY_BRAKING = 3;//紧急制动 + ABNORMAL_PARKING = 4;//异常停车 + NON_VEHICLE_INTRUSION = 5;//行人/非机动车闯入 +} + +// message definition for MsgTypeV2nNioCrossoverEvent / MsgTypeV2nNioOtherRetrogradeEvent +message Event +{ + uint32 channelId = 1; //渠道来源,mogo默认10 + uint64 rcuId = 2; //平台未维护,暂用基站号 + EventType eventType = 3; //事件类别 + uint32 confidence = 4; //事件置信度 + uint32 gnssType = 5; //坐标系类型, 0:GCJ02坐标系,2:WGS84坐标系 + double longitude = 6; + double latitude = 7; + uint64 timestamp = 8; //时间戳 + string eventId = 9; // 事件id + string exts = 10; //扩展字段,传递相机ip,{"cameraIp":"172.18.7.40"} + uint32 targetIdsLen = 11; //事件关联的目标对象uuid个数 + repeated string targetIds = 12; //事件关联的目标对象uuid列表 +} + // message definition for MsgTypeTrajectory message TrajectoryPoint { @@ -109,6 +248,18 @@ message TrajectoryPoint double reversedAccumulatedDis = 10; //从当前到终点的距离 } +// message definition for MsgTypeCloudRegulatoryWarning +message CloudRegulatoryWarning +{ + repeated CloudRegulatoryWarningInner cloudRegulatoryWarnings = 1; +} + +message CloudRegulatoryWarningInner +{ + uint32 type = 1; //0:车辆位置异常 1:自动驾驶脱离 2:超速行驶 3:非机动车逆行 + string desc = 2; +} + message Trajectory { repeated TrajectoryPoint points = 1; @@ -128,7 +279,7 @@ enum AdditionalAttribute message SubSource { uint32 source = 1; // TrackedSource=1:1-lidar 2-camera 3-radar 4-vidar 5-falcon - // TrackedSource=2:1-v2v_bsm 2-v2i_rsm 3-v2v_ssm 4-v2n_rsm 5-v2n_rsi 6-v2i_ssm 7-v2i_rsi + // TrackedSource=2:1-v2v_bsm 2-v2i_rsm 3-v2v_ssm 4-v2n_rsm 5-v2n_rsi 6-v2i_ssm 7-v2i_rsi 8-v2n_rsm_2 string id = 2; //HEX_string -bsm_id } @@ -160,9 +311,14 @@ message TrackedObject repeated TrackedSource tracked_source = 14; repeated Location polygon = 15; geometry.Point center = 16; - AdditionalAttribute add_attribute = 17; // 事件类型 + AdditionalAttribute add_attribute = 17; //事件类型 double angle = 18; //相对于自车x轴的角度,左正右负 - reserved 19 to 100; + repeated string image_url = 19; //事件发生的原始照片 + string video_url = 20; //事件发生的原始视频 + string camera_ip = 21; //来源IP + uint64 detect_start_time = 22; //V2N事件生成UTC时间,单位毫秒 + string v2x_uuid = 23; //V2X目标uuid + reserved 24 to 100; string strUuid = 101;//String类型车辆ID } @@ -225,7 +381,7 @@ message AutopilotState // refer to mogo_report_msg.proto // message definition for MessageType: MsgTypePerceptionTrafficLight -// refer to traffic_light.proto +// refer to fusion_traffic_light.proto // message definition for MessageType: MsgTypePredictionObstacleTrajectory // refer to prediction.proto @@ -272,6 +428,8 @@ message TrajectoryDownloadReq Line line = 1; //路线 uint32 source = 2; //指令来源: 0: default, 1:pad, 2:aicloud uint32 downloadType = 3; //下载类型: 0:正常下载 1:预下载 + + RouteInfo routeInfo = 4; //20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填!(Line信息重复) } // message definition for MessageType: MsgTypeBasicInfoReq @@ -297,6 +455,8 @@ message Location double latitude = 2; double altitude = 3; double heading = 4; + + bool station = 5; //20240523, 判断此点是中间站点还是途径点 ------- true:站点, false:简单的途径点 } message RouteInfo @@ -311,7 +471,10 @@ message RouteInfo bool isSpeakVoice = 8; //abandoned uint32 routeID = 9; string routeName = 10; - Line line = 11; //路线信息 + Line line = 11; //路线信息,原有轨迹线路信息 + + repeated Location blackPoints = 12; //20240523 不让走的道路,异常线路点 + bool isStation = 13; //20240523 用于表示判断是否是站点下单。默认false:起点下单,接管下单; true: 中间站点下单 } message SetAutopilotModeReq @@ -319,6 +482,7 @@ message SetAutopilotModeReq uint32 mode = 1; //1: enter autopilot mode, 0: quit autopilot mode uint32 source = 2; //命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) RouteInfo routeInfo = 3; //自动驾驶路径信息 + uint64 sessionId = 4; //autopilot cmd session ID } // message definition for MsgTypeSetDemoModeReq @@ -345,7 +509,7 @@ message CarConfigResp double maxAcceleration = 8; //最大加速度, 单位:m/s² string carType = 9; //车辆类型 string subCarType = 10; //车辆子类型 - string vinCode = 11;//车辆vin码 + string vinCode = 11;//车辆vin码 taxi: 420 bus: 440 reserved 12 to 100; int32 mapVersion = 101;//dockVersion解析出版本号,仅用于版本对比,解析失败为-1。例如:"MAP-taxi_RoboTaxi_df_2.8.0.3_20220928_test" 解析结果为:20800 bool isDF = 102;//车型是否是东风 @@ -643,6 +807,7 @@ message SetOneParam // 15:座椅状态(int) 0:表示仅主驾位有人,1:表示仅副驾位有人,2:表示主驾和副驾同时有人,3:表示仅后排有人,4:表示主驾有人+后排有人,5:表示副驾有人+后排有人,6:表示主驾和副驾同时有人+后排有人,7: 所有座位都无人, 255:缺省 // 16: 超车的最大速度阈值(double, m/s) T1/T2: 范围[3, 12.5], 默认值10 // 17: 故障模拟指令(int) default:0, 1:线控失效 + // 18: 碰撞上报(null) string value = 2; // 转成字符串的值 } @@ -747,3 +912,9 @@ message SessionInfo //message definition for MsgTypeFMState //refer to fm_info.proto for details + +//message definition for MsgTypeFSM2024State +//refer to fsm2024.proto + +//message definition for MsgTypeLocState +//refer to loc_state.proto diff --git a/libraries/mogo-adas-data/src/main/proto/personal/adas_constants.proto b/libraries/mogo-adas-data/src/main/proto/personal/adas_constants.proto index 3048898afc..31c77d18d7 100644 --- a/libraries/mogo-adas-data/src/main/proto/personal/adas_constants.proto +++ b/libraries/mogo-adas-data/src/main/proto/personal/adas_constants.proto @@ -22,6 +22,7 @@ enum MapSystemParamType{ SEAT_STATE = 15;//15: 座椅状态(int) 0:表示仅主驾位有人,1:表示仅副驾位有人,2:表示主驾和副驾同时有人,3:表示仅后排有人,4:表示主驾有人+后排有人,5:表示副驾有人+后排有人,6:表示主驾和副驾同时有人+后排有人,7: 所有座位都无人, 255:缺省 OVERTAKE_MAX_SPEED = 16;//16: 超车的最大速度阈值(double, m/s, 范围[3, 12.5]) FAULT_SIMULATION_CMD = 17;//17: 故障模拟指令(int) default:0(do nothing), 1:线控失效 + COLLISION_REPORTING = 18;//18: 碰撞上报(null) } /** diff --git a/libraries/mogo-adas-data/src/main/proto/ssm_info.proto b/libraries/mogo-adas-data/src/main/proto/ssm_info.proto index fe98ab23e0..1d9653c267 100644 --- a/libraries/mogo-adas-data/src/main/proto/ssm_info.proto +++ b/libraries/mogo-adas-data/src/main/proto/ssm_info.proto @@ -41,7 +41,7 @@ message SsmStatusInf { optional string master_version = 3; // SSM 版本信息 required bool auto_pilot_ready = 4; // 自动驾驶状态就绪 required bool remote_pilot_ready = 5; // 平行驾驶状态就绪 - repeated NodeInf auto_pilot_unready_list = 6; //自驾未就绪节点列表 + repeated NodeInf auto_pilot_unready_list = 6; //自驾关键节点(包含NodeState中各种状态) repeated NodeInf remote_pilot_unready_list = 7; //平行驾驶未就绪列表 optional string auto_pilot_unready_reason = 8; //自动驾驶状态未就绪原因描述 optional string remote_pilot_unready_reason = 9; //平行驾驶状态未就绪原因描述 diff --git a/libraries/mogo-adas-data/src/main/proto/traffic_light.proto b/libraries/mogo-adas-data/src/main/proto/traffic_light.proto deleted file mode 100644 index f223586122..0000000000 --- a/libraries/mogo-adas-data/src/main/proto/traffic_light.proto +++ /dev/null @@ -1,43 +0,0 @@ -syntax = "proto2"; -package perception; - -import "header.proto"; - -enum LightType { - TYPE_DEFAULT = 0; - TYPE_VEHICLE = 1;//机动车道 - TYPE_BICYLE = 2;//自行车道 - TYPE_PEDSTRIAN = 3;//行人道 - TYPE_LANE = 5;//车道 -} - -enum LightState { - STATE_OFF = 0;//没检测到灯 - STATE_RED = 1; - STATE_YELLOW = 2; - STATE_GREEN = 3; - STATE_FLASH = 4;//闪烁 - STATE_OFF_FUSION = 5; -} - -message TrafficLight { - optional int64 id = 1; - optional LightType type = 2 [default = TYPE_DEFAULT];//灯所处的车道类型 - optional LightState state = 3 [default = STATE_OFF];//灯态 - optional float duration = 4; // seconds since the last state changed - optional LightState next_state = 5 [default = STATE_OFF_FUSION]; -} - -//触发方式:120m以内会有信号,但远的时候可能不准,越近越准 -//straight left right u_turn 同一时间只有会有一个触发 -message TrafficLights { - optional common.Header header = 1; - - optional TrafficLight straight = 2;//直行灯 - optional TrafficLight left = 3;//左转灯 - optional TrafficLight right = 4;//右转灯 - optional TrafficLight u_turn = 5;//掉头灯 - - optional bool shield = 6 [default = false];//wheather the traffic lights are shield - optional uint32 source = 7 [default = 0]; // 0: vehicle, 1:V2I, 2: V2N -} \ No newline at end of file diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 6460ecf0bf..81fd08cf90 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -34,6 +34,7 @@ import com.zhidao.support.adas.high.common.RegexUtils; import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.msg.IMsg; import com.zhidao.support.adas.high.msg.MyMessageFactory; +import com.zhidao.support.adas.high.protocol.MessageId; import com.zhidao.support.adas.high.protocol.PackData; import com.zhidao.support.adas.high.protocol.RawData; import com.zhidao.support.adas.high.protocol.RawPack; @@ -424,18 +425,22 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * * -1L:添加到WS发送消息队列失败 */ private long sendPBMessage(MessageType msgType, byte[] data) { + return sendPBMessage(msgType, data, null); + } + + private long sendPBMessage(MessageType msgType, byte[] data, @Nullable MessageId messageId) { if (rawPack != null) { //司机屏工控机数据转发 if (adasOptions.isPassenger()) { if (onMultiDeviceListener != null) { - onMultiDeviceListener.onForwardingPassengerIPCMessage(rawPack.pack(msgType, data).bytes); + onMultiDeviceListener.onForwardingPassengerIPCMessage(rawPack.pack(msgType, data, null).bytes); } return 0L; } else { if (mSocket == null || !mSocket.isConnected()) { return -1L; } - PackData packData = rawPack.pack(msgType, data); + PackData packData = rawPack.pack(msgType, data, messageId); return sendWsMessage(packData.bytes) ? packData.msgId : -1L; } } @@ -1192,21 +1197,23 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID + * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID和SessionID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo) { + MessageId messageId = MessageId.build(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ); MessagePad.SetAutopilotModeReq.Builder builder = MessagePad.SetAutopilotModeReq.newBuilder(); builder.setMode(mode); builder.setSource(source); if (routeInfo != null) builder.setRouteInfo(routeInfo); + builder.setSessionId(messageId.id); MessagePad.SetAutopilotModeReq req = builder.build(); if (autopilotReview != null) autopilotReview.onAutopilotCommandTrigger(req); - return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ, req.toByteArray(), messageId); } /** @@ -1655,8 +1662,9 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * 发送 轨迹下载请求 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param line 线路相关参数详情见PB message_pad.proto -> Line - * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 @@ -1669,13 +1677,18 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec paramIndexes = {0} ) @Override - public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType) { + public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, MessagePad.RouteInfo routeInfo) { MessagePad.TrajectoryDownloadReq.Builder builder = MessagePad.TrajectoryDownloadReq.newBuilder(); builder.setSource(1);//指令来源: 0: default, 1:pad, 2:aicloud - builder.setLine(line); + if (line != null) { + builder.setLine(line); + } if (downloadType > -1) { builder.setDownloadType(downloadType); } + if (routeInfo != null) { + builder.setRouteInfo(routeInfo); + } MessagePad.TrajectoryDownloadReq req = builder.build(); return sendPBMessage(MessageType.TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ, req.toByteArray()); } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java index f29f121e3c..a65b345c6f 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java @@ -396,7 +396,7 @@ public class AdasManager implements IAdasNetCommApi { * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID + * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID和SessionID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 @@ -758,14 +758,15 @@ public class AdasManager implements IAdasNetCommApi { * 发送 轨迹下载请求 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - public long sendTrajectoryDownloadReq(MessagePad.Line line) { - return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, -1); + public long sendTrajectoryDownloadReq(MessagePad.Line line, MessagePad.RouteInfo routeInfo) { + return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, -1, routeInfo); } /** @@ -774,14 +775,15 @@ public class AdasManager implements IAdasNetCommApi { * * @param line 线路相关参数详情见PB message_pad.proto -> Line * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override - public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType) { - return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, downloadType); + public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, MessagePad.RouteInfo routeInfo) { + return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, downloadType, routeInfo); } /** diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java index 5ba39f8bf5..4efee2505d 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java @@ -176,7 +176,7 @@ public interface IAdasNetCommApi { * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID + * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID和SessionID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 @@ -475,14 +475,15 @@ public interface IAdasNetCommApi { * 发送 轨迹下载请求 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param line 线路相关参数详情见PB message_pad.proto -> Line - * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType); + long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, MessagePad.RouteInfo routeInfo); /** * 发送 状态查询请求 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java index 90afedde94..d5f4941523 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java @@ -11,8 +11,8 @@ import com.zhjt.mogo.adas.data.AdasConstants; import com.zhjt.mogo.adas.data.AiCloudTask; import com.zhjt.mogo.adas.data.bean.AdasParam; import com.zhjt.mogo.adas.data.bean.AutopilotStatistics; -import com.zhjt.mogo.adas.data.bean.ReceivedAck; import com.zhjt.mogo.adas.data.bean.LaunchConditionData; +import com.zhjt.mogo.adas.data.bean.ReceivedAck; import com.zhjt.mogo.adas.data.bean.UnableLaunchReason; import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable; import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask; @@ -30,13 +30,15 @@ import chassis.Chassis; import chassis.ChassisStatesOuterClass; import chassis.VehicleStateOuterClass; import fault_management.FmInfo; +import fsm.Fsm2024; import function_state_management.FunctionStates; +import localization.LocState; import mogo.telematics.pad.MessagePad; import mogo.v2x.MogoV2X; import mogo.v2x.RoadOverviewEvents; import mogo.yycp.paralleldriving.protocol.ParallelTaskProcessNoticeOuterClass; import mogo_msg.MogoReportMsg; -import perception.TrafficLightOuterClass; +import perception.FusionTrafficLightOuterClass; import planning.RoboSweeperTaskIndexOuterClass; import prediction.Prediction; import record_cache.RecordPanelOuterClass; @@ -126,12 +128,12 @@ public interface OnAdasListener { void onReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage mogoReportMessage); /** - * 感知红绿灯 + * 融合感知红绿灯 * * @param header 头 * @param trafficLights 感知红绿灯 */ - void onPerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights trafficLights); + void onPerceptionTrafficLight(MessagePad.Header header, FusionTrafficLightOuterClass.FusionTrafficLights trafficLights); /** * 他车轨迹预测 @@ -237,6 +239,24 @@ public interface OnAdasListener { */ void onFaultManagementState(MessagePad.Header header, @NonNull FmInfo.FaultResultMsg fmInfo); + /** + * FSM状态 + * + * @param header 头 + * @param fsmState 数据 + */ + void onFSM2024State(@NonNull MessagePad.Header header, @NonNull Fsm2024.FSMStateMsg fsmState); + + /** + * 定位状态 + * 定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持 + * 详细解释:http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=131757484 + * + * @param header 头 + * @param locState 数据 + */ + void onLocalizationState(MessagePad.Header header, @NonNull LocState.loc_state locState); + /** * 数据采集配置应答 * @@ -480,6 +500,38 @@ public interface OnAdasListener { */ void onM1StitchedVideo(@NonNull MessagePad.Header header, @NonNull byte[] data); + /** + * 绿波通行(单路口)事件推送, 透传 + * + * @param header 头 + * @param crossSpeed 数据 + */ + void onV2nNioGreenWavePassageEvent(@NonNull MessagePad.Header header, @NonNull MessagePad.V2nCrossSpeed crossSpeed); + + /** + * 行人横穿(路侧)事件推送, 透传 + * + * @param header 头 + * @param event 数据 + */ + void onV2nNioCrossoverEvent(@NonNull MessagePad.Header header, @NonNull MessagePad.Event event); + + /** + * 他车逆行(路侧)事件推送, 透传 + * + * @param header 头 + * @param event 数据 + */ + void onV2nNioOtherRetrogradeEvent(@NonNull MessagePad.Header header, @NonNull MessagePad.Event event); + + /** + * 拥堵事件推送, 透传 + * + * @param header 头 + * @param congestion 数据 + */ + void onV2nNioCongestionEvent(@NonNull MessagePad.Header header, @NonNull MessagePad.V2nCongestion congestion); + /** * 域控SSM接口接收超时 * 状态变动时才会回调,默认SSM状态正常 @@ -488,11 +540,19 @@ public interface OnAdasListener { */ void onSsmReceiveTimeout(boolean isTimeout); + /** + * 域控FSM接口接收超时 + * 状态变动时才会回调,默认FSM状态正常 前提是存在FSM接口 + * + * @param isTimeout true:FSM接口接收超时 false:FSM接口恢复正常 + */ + void onFsm2024ReceiveTimeout(boolean isTimeout); + /** * 是否有能力启动自动驾驶 * * @param isAutopilotAbility 是否能启动自动驾驶 - * @param launchConditionData 原始数据 + * @param launchConditionData 原始数据 * @param unableAutopilotReasons 不能启动自动驾驶原因 */ void onAutopilotAbility(boolean isAutopilotAbility, @NonNull LaunchConditionData launchConditionData, @Nullable ArrayList unableAutopilotReasons); diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility440.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility440.java new file mode 100644 index 0000000000..b3de145659 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility440.java @@ -0,0 +1,62 @@ +package com.zhidao.support.adas.high.common.autopilot.ability; + +import androidx.annotation.NonNull; + +import com.zhjt.mogo.adas.data.bean.LaunchConditionData; +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason; + +import java.util.ArrayList; + +import fsm.Fsm2024; + +/** + * 是否可以启动自动驾驶能力检测 工控机版本>=4400&&(isJinlv||isJinlvM1||isJinlvM) 使用此类 + * 目前监控了FSM2024状态 + */ +public class AutopilotAbility440 { + private final String TAG = this.getClass().getSimpleName(); + + @NonNull + private final AutopilotAbilityManager manager; + private OnAutopilotAbilityListener listener; + + + public AutopilotAbility440(@NonNull AutopilotAbilityManager manager) { + this.manager = manager; + } + + + public void setFSMState(Fsm2024.FSMStateMsg fsmState) { + onCallbackFsm(fsmState); + } + + protected void onCallFsmTimeout() { + onCallbackFsm(null); + } + + protected void onCallbackFsm(Fsm2024.FSMStateMsg fsmState) { + ArrayList unableAutopilotReasons = null;//不能启动自动驾驶原因 + if (fsmState == null) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.FSM2024_TIMEOUT, "FSM超时无响应"); + } else { + if (!fsmState.getPilotStandbyFlag()) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.FSM2024, UnableLaunchReason.UnableType.FSM2024_OFFER, fsmState.getPilotNotStandbyReason()); + } + } + if (listener != null) { + boolean isAutopilotAbility = unableAutopilotReasons == null || unableAutopilotReasons.isEmpty();//是否能启动自动驾驶 + listener.onAutopilotAbility(isAutopilotAbility, new LaunchConditionData(this.getClass().getSimpleName(), fsmState), unableAutopilotReasons); + } + } + + + public synchronized void start(OnAutopilotAbilityListener listener) { + this.listener = listener; + + } + + public synchronized void stop() { + this.listener = null; + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java index cf32f031a1..8cf5651d40 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java @@ -18,6 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import chassis.Chassis; import chassis.ChassisStatesOuterClass; +import fsm.Fsm2024; import function_state_management.FSMStatusReasonQueryOuterClass; import mogo.telematics.pad.MessagePad; import system_master.SsmInfo; @@ -32,7 +33,7 @@ import system_master.SystemStatusInfo; */ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { private static final String TAG = AutopilotAbilityManager.class.getSimpleName(); - protected static final long DEFAULT_SSM_TIMEOUT = 5000L;//SSM超时时间 + protected static final long DEFAULT_TIMEOUT = 5000L;//SSM和FSM超时时间 protected static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测周期 protected static final String[] NODE_INFO_STATE = {"未知状态", "依赖未就绪", "启动中", "运行", "停止", "无法启动状态", "人为启动状态", "人为关闭状态"}; protected static final String[] NODE_INFO_STATE_FIXED_FREQUENCY = {"未知状态", "依赖未就绪", "启动中", "运行", "停止", "无法启动状态", "非自动启动状态", "非自动关闭状态"}; @@ -41,24 +42,29 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { private OnAdasListener listener; private int mapVersion = -1;//工控机版本 private boolean isFutianSweeper = false;//是否是福田清扫车 + private boolean isJinlv = false;//是否是小巴 private boolean isJinlvM1 = false;//是否是M1 + private boolean isJinlvM2 = false;//是否是M2 private boolean isHQ = false;//是否是HQ private AutopilotAbility230 autopilotAbility230; private AutopilotAbility250 autopilotAbility250; private AutopilotAbility330 autopilotAbility330; private AutopilotAbility350And360 autopilotAbility350And360; private AutopilotAbility360 autopilotAbility360; + private AutopilotAbility440 autopilotAbility440; private Timer startTimer; - private Timer ssmTimeoutTimer;//SSM超时计时器 + private Timer timeoutTimer;//SSM和FSM超时计时器 private long ssmReceiveTime;//SSM接收时间 + private long fsmReceiveTime;//FSM接收时间 private final AtomicBoolean isOldSsmTimeout = new AtomicBoolean(false);//SSM是否超时 老状态 + private final AtomicBoolean isOldFsmTimeout = new AtomicBoolean(false);//FSM是否超时 老状态 private final AtomicBoolean isInitCarConfig = new AtomicBoolean(false);//车辆信息是否初始化 /** * 能启动自动驾驶的档位 */ private Set launchAutopilotGear; - + private boolean isSupportFSM2024 = false; private AutopilotAbilityManager() { } @@ -109,7 +115,9 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { isInitCarConfig.set(true); mapVersion = version; isFutianSweeper = carConfig.getIsFutianSweeper(); + isJinlv = carConfig.getIsJinlv(); isJinlvM1 = carConfig.getIsJinlvM1(); + isJinlvM2 = carConfig.getIsJinlvM2(); isHQ = carConfig.getIsHQ(); initAutopilotAbility(); if (autopilotAbility230 != null) { @@ -165,6 +173,14 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } + public void setFSM2024State(Fsm2024.FSMStateMsg fsmState) { + fsmReceiveTime = System.currentTimeMillis(); + onCallFSMTimeout(false); + if (autopilotAbility440 != null) { + autopilotAbility440.setFSMState(fsmState); + } + } + /** * 底盘状态更新 * @@ -197,13 +213,20 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { private void initAutopilotAbility() { stopAllTimer(); - if (mapVersion >= 30600 && isFutianSweeper) { + isSupportFSM2024 = false; + if (mapVersion >= 40400 && (isJinlv || isJinlvM1 || isJinlvM2)) { + isSupportFSM2024 = true; + CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:440"); + if (autopilotAbility440 == null) { + autopilotAbility440 = new AutopilotAbility440(this); + autopilotAbility440.start(this); + } + } else if (mapVersion >= 30600 && isFutianSweeper) { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:360清扫车专用"); if (autopilotAbility360 == null) { autopilotAbility360 = new AutopilotAbility360(this); autopilotAbility360.start(this); } - } else if ((mapVersion >= 30500 && (isJinlvM1 || isHQ)) || mapVersion >= 30600) { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:350和360共用"); if (autopilotAbility350And360 == null) { @@ -231,7 +254,7 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } if (autopilotAbility230 == null) { - startSsmTimeoutTimer();//MAP230及以下没有SSM所以不需要超时 + startTimeoutTimer();//MAP230及以下没有SSM和FSM所以不需要超时 } } @@ -270,6 +293,13 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } + private void stop440() { + if (autopilotAbility440 != null) { + autopilotAbility440.stop(); + autopilotAbility440 = null; + } + } + private void stopTimer() { if (startTimer != null) { startTimer.cancel(); @@ -298,12 +328,14 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } - private void stopSsmTimeoutTimer() { - if (ssmTimeoutTimer != null) { + private void stopTimeoutTimer() { + if (timeoutTimer != null) { isOldSsmTimeout.set(false); + isOldFsmTimeout.set(false); ssmReceiveTime = 0; - ssmTimeoutTimer.cancel(); - ssmTimeoutTimer = null; + fsmReceiveTime = 0; + timeoutTimer.cancel(); + timeoutTimer = null; } } @@ -311,15 +343,17 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { * 连接工控机成功调用此函数,如果dockerVersion还未获取到将启动最低版本的启动自动驾驶能力检测 * 此函数为保险措施 以防无法获取工控机版本时 也能 正常执行逻辑 */ - public synchronized void startSsmTimeoutTimer() { - if (ssmTimeoutTimer == null) { + public synchronized void startTimeoutTimer() { + if (timeoutTimer == null) { ssmReceiveTime = System.currentTimeMillis(); - ssmTimeoutTimer = new Timer(); - ssmTimeoutTimer.schedule(new TimerTask() { + fsmReceiveTime = System.currentTimeMillis(); + timeoutTimer = new Timer(); + timeoutTimer.schedule(new TimerTask() { @Override public void run() { + //SSM超时检测 long timeDifference = System.currentTimeMillis() - ssmReceiveTime; - if (timeDifference >= DEFAULT_SSM_TIMEOUT) { + if (timeDifference >= DEFAULT_TIMEOUT) { onCallSSMTimeout(true); //超时 if (autopilotAbility250 != null) { @@ -335,8 +369,18 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { autopilotAbility360.onCallTimeout(); } } + //FSM超时检测 + if (isSupportFSM2024) { + timeDifference = System.currentTimeMillis() - fsmReceiveTime; + if (timeDifference >= DEFAULT_TIMEOUT) { + onCallFSMTimeout(true); + if (autopilotAbility440 != null) { + autopilotAbility440.onCallFsmTimeout(); + } + } + } } - }, 1000L, DEFAULT_SSM_TIMEOUT); + }, 1000L, DEFAULT_TIMEOUT); } } @@ -347,14 +391,22 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } + private synchronized void onCallFSMTimeout(boolean isTimeout) { + if (isTimeout != isOldFsmTimeout.get()) { + isOldFsmTimeout.set(isTimeout); + listener.onFsm2024ReceiveTimeout(isTimeout); + } + } + private void stopAllTimer() { - stopSsmTimeoutTimer(); + stopTimeoutTimer(); stopTimer(); stop230(); stop250(); stop330(); stop350And360(); stop360(); + stop440(); } public synchronized void stop() { @@ -363,7 +415,10 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { mapVersion = -1; isFutianSweeper = false; isHQ = false; + isJinlv = false; isJinlvM1 = false; + isJinlvM2 = false; + isSupportFSM2024 = false; } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSM2024StateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSM2024StateMessage.java new file mode 100644 index 0000000000..82821b0bfb --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSM2024StateMessage.java @@ -0,0 +1,33 @@ +package com.zhidao.support.adas.high.msg; + +import android.os.SystemClock; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.AdasChannel; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; +import com.zhidao.support.adas.high.protocol.RawData; + +import fsm.Fsm2024; + +/** + * FSM状态 + */ +public class FSM2024StateMessage extends MyAbstractMessageHandler { + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + Fsm2024.FSMStateMsg fsmState = Fsm2024.FSMStateMsg.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw("FSM状态", raw.receiveTime); + AutopilotAbilityManager.getInstance().setFSM2024State(fsmState); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + adasListener.onFSM2024State(raw.getHeader(), fsmState); + } + AdasChannel.calculateTimeConsumingBusiness("FSM状态", nowTime); + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/LocalizationStateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/LocalizationStateMessage.java new file mode 100644 index 0000000000..147d768499 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/LocalizationStateMessage.java @@ -0,0 +1,33 @@ +package com.zhidao.support.adas.high.msg; + +import android.os.SystemClock; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.AdasChannel; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.protocol.RawData; + +import localization.LocState; + +/** + * 定位状态 + * 定位呈现状态透传 用于pad图标显示 1hz 所有车型MAP440开始支持 + * 详细解释:http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=131757484 + */ +public class LocalizationStateMessage extends MyAbstractMessageHandler { + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + LocState.loc_state locState = LocState.loc_state.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw("定位状态", raw.receiveTime); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + adasListener.onLocalizationState(raw.getHeader(), locState); + } + AdasChannel.calculateTimeConsumingBusiness("定位状态", nowTime); + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java index cf77bff8e7..6945df42d2 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java @@ -32,6 +32,8 @@ public class MyMessageFactory implements IMyMessageFactory { private IMsg statusQueryRespMessage;//状态查询应答 private IMsg systemStatusMessage;//定频SSM private IMsg faultManagementMessage;//FM状态 + private IMsg fSM2024StateMessage;//FSM状态 + private IMsg localizationStateMessage;//定位状态 private IMsg recordDataConfigRespMessage;//数据采集配置应答 private IMsg planningDecisionStateMessage;//planning决策状态 private IMsg obuWarningDataMessage;//工控机透传OBU V2I数据 @@ -46,6 +48,10 @@ public class MyMessageFactory implements IMyMessageFactory { private IMsg aiCloudTaskMessage;//云控任务:清扫车任务指令、无人化场景,平行驾驶请求相关指令及状态反馈 private IMsg m1StitchedVideoMessage;//M1拼接视频 private IMsg fSMStatusReasonRespondMessage;//FSM状态原因查询 + private IMsg v2nNioGreenWavePassageEventMessage;//V2N NIO绿波通行(单路口) + private IMsg v2nNioCrossoverEventMessage;//V2N NIO行人横穿(路侧) + private IMsg v2nNioOtherRetrogradeEventMessage;//V2N NIO他车逆行(路侧) + private IMsg v2nNioCongestionEventMessage;//V2N NIO拥堵事件 private final AutopilotReview autopilotReview; private final TurnLightState lightLeft = new TurnLightState(); @@ -176,6 +182,18 @@ public class MyMessageFactory implements IMyMessageFactory { faultManagementMessage = new FaultManagementMessage(); } return faultManagementMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_FSM2024_STATE.typeCode) { + //FSM状态 + if (fSM2024StateMessage == null) { + fSM2024StateMessage = new FSM2024StateMessage(); + } + return fSM2024StateMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_LOC_STATE.typeCode) { + //定位状态 + if (localizationStateMessage == null) { + localizationStateMessage = new LocalizationStateMessage(); + } + return localizationStateMessage; } else if (messageType == MessageType.TYPE_RECEIVE_RECORD_DATA_CONFIG_RESP.typeCode) { //数据采集配置应答 if (recordDataConfigRespMessage == null) { @@ -254,6 +272,30 @@ public class MyMessageFactory implements IMyMessageFactory { fSMStatusReasonRespondMessage = new FSMStatusReasonRespondMessage(); } return fSMStatusReasonRespondMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_V2N_NIO_GREEN_WAVE_PASSAGE_EVENT.typeCode) { + //V2N NIO绿波通行(单路口) + if (v2nNioGreenWavePassageEventMessage == null) { + v2nNioGreenWavePassageEventMessage = new V2nNioGreenWavePassageEventMessage(); + } + return v2nNioGreenWavePassageEventMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_V2N_NIO_CROSSOVER_EVENT.typeCode) { + //V2N NIO行人横穿(路侧) + if (v2nNioCrossoverEventMessage == null) { + v2nNioCrossoverEventMessage = new V2nNioCrossoverEventAndOtherRetrogradeEventMessage(messageType); + } + return v2nNioCrossoverEventMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_V2N_NIO_OTHER_RETROGRADE_EVENT.typeCode) { + //V2N NIO他车逆行(路侧) + if (v2nNioOtherRetrogradeEventMessage == null) { + v2nNioOtherRetrogradeEventMessage = new V2nNioCrossoverEventAndOtherRetrogradeEventMessage(messageType); + } + return v2nNioOtherRetrogradeEventMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_V2N_NIO_CONGESTION_EVENT.typeCode) { + //V2N NIO拥堵事件 + if (v2nNioCongestionEventMessage == null) { + v2nNioCongestionEventMessage = new V2nNioCongestionEventMessage(); + } + return v2nNioCongestionEventMessage; } else { //MessageType.TYPE_DEFAULT.typeCode return null; diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java index e074045af6..88573c28bc 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java @@ -8,23 +8,24 @@ import com.zhidao.support.adas.high.OnAdasListener; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.protocol.RawData; -import perception.TrafficLightOuterClass; +import perception.FusionTrafficLightOuterClass; + /** - * 感知红绿灯 + * 融合感知红绿灯 */ public class PerceptionTrafficLightMessage extends MyAbstractMessageHandler { @Override public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { - TrafficLightOuterClass.TrafficLights trafficLights = TrafficLightOuterClass.TrafficLights.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); - AdasChannel.calculateTimeConsumingOnDispatchRaw("感知红绿灯", raw.receiveTime); + FusionTrafficLightOuterClass.FusionTrafficLights trafficLights = FusionTrafficLightOuterClass.FusionTrafficLights.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw("融合感知红绿灯", raw.receiveTime); long nowTime = 0; if (CupidLogUtils.isEnableLog()) nowTime = SystemClock.elapsedRealtime(); if (adasListener != null) { adasListener.onPerceptionTrafficLight(raw.getHeader(), trafficLights); } - AdasChannel.calculateTimeConsumingBusiness("感知红绿灯", nowTime); + AdasChannel.calculateTimeConsumingBusiness("融合感知红绿灯", nowTime); } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java index 4c62c50bb4..614c0854a6 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java @@ -61,6 +61,11 @@ public class ReportMessage extends MyAbstractMessageHandler { startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_CHASSIS_FAULT);//控制判断底盘异常,需要重启车辆 //不知道确切的失败原因,需要联系控制进一步排查 startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_UNKNOWN);//不知道确切的失败原因,需要联系控制进一步排查 + + + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.ROUTING_RESPONSE_FAIL);//算路异常,拒绝自动驾驶 + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.TRAJECTORY_AGENT_NOT_READY);//轨迹下载客户端未就绪拒绝轨迹下载请求 + startAutopilotFailCode.add(MogoReport.Code.Error.EFSM.ENTRY_AUTOPILOT);//FSM因为某些原因未进自驾 } @Override diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioCongestionEventMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioCongestionEventMessage.java new file mode 100644 index 0000000000..9e013b73f6 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioCongestionEventMessage.java @@ -0,0 +1,31 @@ +package com.zhidao.support.adas.high.msg; + +import android.os.SystemClock; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.AdasChannel; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.protocol.RawData; + +import mogo.telematics.pad.MessagePad; + +/** + * V2N NIO拥堵事件 + */ +public class V2nNioCongestionEventMessage extends MyAbstractMessageHandler { + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + MessagePad.V2nCongestion v2nCongestion = MessagePad.V2nCongestion.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw("V2N NIO拥堵事件", raw.receiveTime); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + adasListener.onV2nNioCongestionEvent(raw.getHeader(), v2nCongestion); + } + AdasChannel.calculateTimeConsumingBusiness("V2N NIO拥堵事件", nowTime); + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioCrossoverEventAndOtherRetrogradeEventMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioCrossoverEventAndOtherRetrogradeEventMessage.java new file mode 100644 index 0000000000..4350431594 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioCrossoverEventAndOtherRetrogradeEventMessage.java @@ -0,0 +1,43 @@ +package com.zhidao.support.adas.high.msg; + +import android.os.SystemClock; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.AdasChannel; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.protocol.RawData; +import com.zhjt.mogo.adas.common.MessageType; + +import mogo.telematics.pad.MessagePad; + +/** + * V2N NIO行人横穿(路侧)和 V2N NIO他车逆行(路侧) + */ +public class V2nNioCrossoverEventAndOtherRetrogradeEventMessage extends MyAbstractMessageHandler { + private final MessagePad.MessageType messageType; + private final String TAG; + + public V2nNioCrossoverEventAndOtherRetrogradeEventMessage(MessagePad.MessageType messageType) { + this.messageType = messageType; + TAG = messageType == MessageType.TYPE_RECEIVE_V2N_NIO_CROSSOVER_EVENT.typeCode ? "V2N NIO行人横穿(路侧)" : "V2N NIO他车逆行(路侧)"; + } + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + MessagePad.Event event = MessagePad.Event.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw(TAG, raw.receiveTime); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + if (messageType == MessageType.TYPE_RECEIVE_V2N_NIO_CROSSOVER_EVENT.typeCode) { + adasListener.onV2nNioCrossoverEvent(raw.getHeader(), event); + } else if (messageType == MessageType.TYPE_RECEIVE_V2N_NIO_OTHER_RETROGRADE_EVENT.typeCode) { + adasListener.onV2nNioOtherRetrogradeEvent(raw.getHeader(), event); + } + } + AdasChannel.calculateTimeConsumingBusiness(TAG, nowTime); + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioGreenWavePassageEventMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioGreenWavePassageEventMessage.java new file mode 100644 index 0000000000..7841104d40 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/V2nNioGreenWavePassageEventMessage.java @@ -0,0 +1,31 @@ +package com.zhidao.support.adas.high.msg; + +import android.os.SystemClock; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.AdasChannel; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.protocol.RawData; + +import mogo.telematics.pad.MessagePad; + +/** + * V2N NIO绿波通行(单路口) + */ +public class V2nNioGreenWavePassageEventMessage extends MyAbstractMessageHandler { + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + MessagePad.V2nCrossSpeed v2nCrossSpeed = MessagePad.V2nCrossSpeed.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw("V2N NIO绿波通行(单路口)", raw.receiveTime); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + adasListener.onV2nNioGreenWavePassageEvent(raw.getHeader(), v2nCrossSpeed); + } + AdasChannel.calculateTimeConsumingBusiness("V2N NIO绿波通行(单路口)", nowTime); + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/MessageId.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/MessageId.java new file mode 100644 index 0000000000..828350cde8 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/MessageId.java @@ -0,0 +1,22 @@ +package com.zhidao.support.adas.high.protocol; + +import androidx.annotation.NonNull; + +import com.zhidao.support.adas.high.common.MessageIdGenerator; +import com.zhjt.mogo.adas.common.MessageType; + +public class MessageId { + public final long id; + public final long timeMillis; + + private MessageId(long id, long timeMillis) { + this.id = id; + this.timeMillis = timeMillis; + } + + public static MessageId build(@NonNull MessageType msgType) { + long timeMillis = System.currentTimeMillis(); + long msgId = MessageIdGenerator.getInstance().getId(timeMillis, msgType.typeCode); + return new MessageId(msgId, timeMillis); + } +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java index f2348a4545..9aa5a46a7f 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java @@ -1,5 +1,7 @@ package com.zhidao.support.adas.high.protocol; +import androidx.annotation.Nullable; + import com.zhidao.support.adas.high.common.Constants; import com.zhidao.support.adas.high.common.MessageIdGenerator; import com.zhidao.support.adas.high.common.ReceivedAckManager; @@ -26,15 +28,22 @@ public class RawPack { } - public synchronized PackData pack(MessageType msgType, byte[] data) { + public synchronized PackData pack(MessageType msgType, @Nullable byte[] data, @Nullable MessageId messageId) { if (msgType == null) { return null; } - long timeMillis = System.currentTimeMillis(); MessagePad.MessageType type = msgType.typeCode; + long timeMillis; + long msgId; + if (messageId == null) { + timeMillis = System.currentTimeMillis(); + msgId = MessageIdGenerator.getInstance().getId(timeMillis, type); + } else { + timeMillis = messageId.timeMillis; + msgId = messageId.id; + } double time = timeMillis / 1000.0; boolean isNeedAck = msgType.timeoutMillis > 0; - long msgId = MessageIdGenerator.getInstance().getId(timeMillis, type); //封装Header MessagePad.Header.Builder headerBuilder = MessagePad.Header.newBuilder(); headerBuilder.setMsgID(msgId);//消息唯一ID,生成数据累加。从1开始,连接未重新初始化就一直累加 diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt index 7600780ab9..e8fad00b35 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt @@ -1,6 +1,11 @@ package com.mogo.map import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.map.entities.BusStation +import com.mogo.map.entities.CrossRoad +import com.mogo.map.entities.Lane +import com.mogo.map.entities.RoadInfo +import com.zhidaoauto.map.data.point.LonLatPoint import com.zhidaoauto.map.data.road.CenterLine interface IMogoData { @@ -52,7 +57,13 @@ interface IMogoData { /** * 获取道路宽度 */ - fun getRoadWidth(lon: Double, lat: Double, angle: Float, isGpsLocation: Boolean, isRTK: Boolean): Float + fun getRoadWidth( + lon: Double, + lat: Double, + angle: Float, + isGpsLocation: Boolean, + isRTK: Boolean + ): Float /** * 获取行车方向 @@ -73,21 +84,47 @@ interface IMogoData { /** * 通过cityCode,缓存城市HDMap */ - fun cacheHDDataByCity(progress:((cityId: Int, progress: Double) -> Unit), result:((cityId: Int, state: Int) -> Unit)) + fun cacheHDDataByCity( + progress: ((cityId: Int, progress: Double) -> Unit), + result: ((cityId: Int, state: Int) -> Unit) + ) /** * 通过经纬度信息,缓存城市HDMap */ - fun cacheHDDataByCityByLonLat(location: MogoLocation, progress:((cityId: Int, progress: Double) -> Unit), result:((cityId: Int, state: Int) -> Unit)) + fun cacheHDDataByCityByLonLat( + location: MogoLocation, + progress: ((cityId: Int, progress: Double) -> Unit), + result: ((cityId: Int, state: Int) -> Unit) + ) /** * 当前城市离线数据是否已缓存 */ - fun isCityDataCached(cache:((Boolean) -> Unit)) + fun isCityDataCached(cache: ((Boolean) -> Unit)) /** * 取消下载 城市HDMap */ fun cancelDownloadCacheData() -} \ No newline at end of file + /** + * 根据坐标和朝向获取位置所在的道路信息 + */ + fun getRoadInfo(lon: Double, lat: Double, angle: Float): RoadInfo + + /** + * 根据瓦片Id和道路Id获取车道数据 + */ + fun getLaneInfo(tileId: Long, roadId: Int): List + + /** + * 获取公交站点集合 + */ + fun getBusStation(routeList: ArrayList, result:((MutableList) -> Unit)) + + /** + * 获取路口数据 + */ + fun getCrossRoad(lon: Double, lat: Double, angle: Double): CrossRoad? +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt index 4c0e2e2bcf..e7ed9a56eb 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.kt @@ -33,6 +33,8 @@ interface IMogoMap { fun addPoint(options: Point.Options): IMapPointOverlay? + fun addAnimPoint(options: Point.Options) + fun addLine(options: Polyline.Options): IMapPolylineOverlay? /** diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java index 34028b9895..1b7ff9c460 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java @@ -65,10 +65,10 @@ public abstract class MogoBaseMapView extends FrameLayout implements ILifeCycle @Override public void onDestroy() { + MogoMap.Companion.getMapInstance().clear(getInstanceTag()); if ( mMapView != null ) { mMapView.onDestroy(); } - MogoMap.Companion.getMapInstance().clear(getInstanceTag()); } @Override diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoMap.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoMap.kt index da6ff519fa..e26b3a4341 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoMap.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoMap.kt @@ -10,6 +10,7 @@ class MogoMap private constructor() { private const val TAG = "MogoMap" const val DEFAULT = "Default" + const val MAP_ROAM = "MapRoam" //漫游地图实例 @JvmStatic val mapInstance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/BusStation.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/BusStation.kt new file mode 100644 index 0000000000..162224d131 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/BusStation.kt @@ -0,0 +1,35 @@ +package com.mogo.map.entities + +import com.zhidaoauto.map.data.point.LonLatPoint + +data class BusStation( + var busStationPoints: List, + var id: Long, + var roadId: Int, + var type: Int, + var notifyTime: Long = -1, + var notifyDistance: Int +) { + + fun getBusStationId(): String { + //id=0 需要计算出一个唯一id + val newId = getBusStationPoint()?.let { + it.latitude + it.longitude + } ?: 0 + return "bus_station_${newId}_${roadId}" + } + + /** + * 返回的公交站点是一个坐标集合,从右上角->左上角->左下角->右下角->右上角 + */ + fun getBusStationPoint(): LonLatPoint { + if (busStationPoints.size >= 4) { + return busStationPoints[3] + } + return busStationPoints[0] + } + + override fun toString(): String { + return "BusStation(id=$id, roadId=$roadId, type=$type, notifyTime=$notifyTime, notifyDistance=$notifyDistance, busStationPoints=$busStationPoints)" + } +} \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/CrossRoad.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/CrossRoad.kt new file mode 100644 index 0000000000..61d44ce785 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/CrossRoad.kt @@ -0,0 +1,9 @@ +package com.mogo.map.entities + +data class CrossRoad( + val status: Int, // 0: 不在路口 1: 在路口 + val tile_id: String, // 起始路口瓦片id或者当前路口的瓦片id + val cross_id: String, // 起始路口id或当前路口id + val tile_id_end: String, // + val cross_id_end: String +) diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/Lane.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/Lane.kt new file mode 100644 index 0000000000..35127751f0 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/Lane.kt @@ -0,0 +1,3 @@ +package com.mogo.map.entities + +data class Lane(val id: Int, val width: Float, val points: List>) diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/RoadInfo.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/RoadInfo.kt new file mode 100644 index 0000000000..7724537a6e --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/RoadInfo.kt @@ -0,0 +1,3 @@ +package com.mogo.map.entities + +data class RoadInfo(val code: Int, val tileId: Long, val roadId: Int, val roadName: String) diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/identity/IMogoIdentifyManager.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/identity/IMogoIdentifyManager.kt index 83c5adebf1..08b9acfa9d 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/identity/IMogoIdentifyManager.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/identity/IMogoIdentifyManager.kt @@ -1,5 +1,6 @@ package com.mogo.map.identity +import com.mogo.map.MogoMap import mogo.telematics.pad.MessagePad.TrackedObject import mogo.yycp.api.proto.SocketDownData import java.util.HashMap @@ -13,19 +14,19 @@ interface IMogoIdentifyManager { * * @param uuidString */ - fun removeMarker(uuidString: String?) + fun removeMarker(uuidString: String?, mapInstance:String = MogoMap.DEFAULT) /** * 批量更新锚点位置 * * @param optionsArrayList 锚点集合 */ - fun updateBatchMarkerPosition(optionsArrayList: HashMap) + fun updateBatchMarkerPosition(optionsArrayList: HashMap, mapInstance:String = MogoMap.DEFAULT) /** * 批量更新锚点位置 * * @param optionsArrayList 锚点集合 */ - fun updateBatchAiMarkerPosition(optionsArrayList: HashMap) + fun updateBatchAiMarkerPosition(optionsArrayList: HashMap, mapInstance:String = MogoMap.DEFAULT) } \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMoGoOverlayManager.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMoGoOverlayManager.kt index e5d22b20b4..26a6885662 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMoGoOverlayManager.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/IMoGoOverlayManager.kt @@ -1,5 +1,6 @@ package com.mogo.map.overlay +import android.view.View import com.mogo.map.MogoMap.Companion.DEFAULT import com.mogo.map.overlay.core.* import com.mogo.map.overlay.line.* @@ -11,6 +12,8 @@ interface IMoGoOverlayManager { fun showOrUpdatePoint(options: PointOptions, mapTag:String = DEFAULT): Point? + fun setInfoWindowView(id: String, view: View) + fun hidePoint(id: String) fun hidePoint(p: Point) @@ -72,4 +75,6 @@ interface IMoGoOverlayManager { fun hideAllPointsExceptIds(vararg ids: String) fun hideAllPointsExceptOwners(vararg owners: String) + + fun updateAnimPoint(options: Point.Options, mapTag:String = DEFAULT) } \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt index 620cd25678..842a89a19b 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt @@ -10,6 +10,11 @@ enum class Level(val zIndex: Int) { */ MAP_MARKER(100), + /** + * 全局轨迹线 + */ + TRAJECTORY_LINE(25000), + /** * 车道中心线 */ @@ -21,7 +26,8 @@ enum class Level(val zIndex: Int) { GUIDE_ROUTE_LINE(75000), /** - * 道路围栏区域绘制 + * 围栏区域绘制 */ - MAP_POLYGON(76000) + MAP_POLYGON(76000), + } \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/line/Polyline.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/line/Polyline.kt index 6314740138..b64427be77 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/line/Polyline.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/line/Polyline.kt @@ -52,6 +52,12 @@ data class Polyline(val id: String, val owner: String, val level: Level, val opt val lightSpeed: Float = builder.lightSpeed + val customTexture: Bitmap? = builder.customTexture + + val isShowArrow: Boolean = builder.isShowArrow + + val isFilledIn: Boolean = builder.isFilledIn + fun builder(): Builder { return builder } @@ -92,6 +98,12 @@ data class Polyline(val id: String, val owner: String, val level: Level, val opt internal var lightSpeed: Float = 0f + internal var customTexture: Bitmap? = null + + internal var isShowArrow: Boolean = false + + internal var isFilledIn: Boolean = false + fun setId(id: String) = apply { this.id = id } @@ -160,6 +172,18 @@ data class Polyline(val id: String, val owner: String, val level: Level, val opt this.lightSpeed = speed } + fun setCustomTexture(texture: Bitmap) = apply { + this.customTexture = texture + } + + fun isShowArrow(show: Boolean) = apply { + this.isShowArrow = show + } + + fun isFilledIn(filled: Boolean) = apply { + this.isFilledIn = filled + } + fun build(): Options { if (TextUtils.isEmpty(id)) { id = UUID.randomUUID().toString() diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/point/Point.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/point/Point.kt index aef3754434..1f6a072c77 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/point/Point.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/point/Point.kt @@ -6,6 +6,7 @@ import android.view.* import androidx.annotation.* import com.mogo.map.overlay.core.* import com.mogo.map.overlay.proxy.point.* +import java.lang.ref.WeakReference import java.util.* data class Point(val id: String, val owner: String, val level: Level, val option: Options) { @@ -149,6 +150,26 @@ data class Point(val id: String, val owner: String, val level: Level, val option * 是否切换到当前marker所在的视角 */ val moveToCenter: Boolean = builder.moveToCenter + + /** + * 设置动画资源 + */ + val displayAnim:Boolean = builder.displayAnim + + /** + * 动画资源 + */ + val animRes:Int = builder.animRes + + /** + * 动画缩放 + */ + val animScale:Float = builder.animScale + + /** + * marker点击事件处理 + */ + val onClickHandler: WeakReference<((id:String) -> Unit)>? = builder.onMarkerClickListener fun builder(): Builder { return builder @@ -239,7 +260,7 @@ data class Point(val id: String, val owner: String, val level: Level, val option internal var alpha = 1.0f /** - * 设置Marker覆盖物的透明度 + * 设置Marker覆盖物的缩放比 */ internal var scale = 1.0f @@ -280,6 +301,38 @@ data class Point(val id: String, val owner: String, val level: Level, val option */ internal var moveToCenter: Boolean = true + /** + * Marker点击事件回调 + */ + internal var onMarkerClickListener:WeakReference<((id: String) -> Unit)>? = null + + /** + * 是否显示动画 + */ + internal var displayAnim:Boolean = false + + /** + * 设置动画资源 + */ + internal var animRes:Int = 0 + + /** + * 动画缩放 + */ + internal var animScale:Float = 0f + + fun setDisplayAnim(displayAnim:Boolean) = apply { + this.displayAnim = displayAnim + } + + fun setAnimResource(animRes: Int) = apply { + this.animRes = animRes + } + + fun setAnimScale(animScale: Float) = apply { + this.animScale = animScale + } + fun setId(id: String) = apply { this.id = id } @@ -411,6 +464,13 @@ data class Point(val id: String, val owner: String, val level: Level, val option this.moveToCenter = flag } + /** + * marker点击事件监听 + */ + fun onClick(listener: ((id: String) -> Unit)) = apply { + this.onMarkerClickListener = WeakReference(listener) + } + /** * 构建Options对象 */ diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/proxy/IMapOverlay.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/proxy/IMapOverlay.kt index b8c1c7df0d..f902200671 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/proxy/IMapOverlay.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/proxy/IMapOverlay.kt @@ -1,5 +1,7 @@ package com.mogo.map.overlay.proxy +import android.view.View + interface IMapOverlay { @@ -30,6 +32,10 @@ interface IMapOverlay { */ fun isVisible(): Boolean + /** + * 设置 Marker 覆盖物的 InfoWindowView + */ + fun setInfoWindowView(view: View){} /** * 设置当前marker在最上面。 @@ -42,5 +48,6 @@ interface IMapOverlay { fun setUnTop() + fun onRemove(action: (id: String) -> Unit) } \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt index b17976f27d..ab57eeff74 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt @@ -164,15 +164,6 @@ interface IMogoMapUIController { */ fun forceRender() - /** - * 计算两点之间的距离 - * - * @param p1 - * @param p2 - * @return - */ - fun calculateLineDistance(p1: MogoLatLng, p2: MogoLatLng): Float - /** * 锁车状态 * @@ -336,4 +327,16 @@ interface IMogoMapUIController { */ fun getMapScreenShot() fun setWeatherEnable(enable: Boolean) + + fun setVisible(visible:Boolean) + + /** + * 设置地图自定义参数 + */ + fun setCfgKeyVal(key: String, value: String) + + /** + * 设置自车相对屏幕位置 + */ + fun setScreenToOriginDis(p: Float) } \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.kt index 6d6e1e1116..1917ad497b 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.kt @@ -52,7 +52,18 @@ enum class VisualAngleMode(val code: Int) : IMogoMapVisualAngle { /** * 天空盒模式 */ - MAP_STYLE_VR_SKY_BOX(10); + MAP_STYLE_VR_SKY_BOX(10), + + + /** + * 无人机模式 + */ + MAP_STYLE_VR_DRONE(11), + + /** + * 十字路口视角-新版 + */ + MAP_STYLE_VR_ANGLE_CROSS_NEW(12); override val isLongSight: Boolean get() = code == MODE_LONG_SIGHT.code diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt index 42f8b2a77c..9b117567ee 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.os.Handler import android.os.HandlerThread import android.text.TextUtils +import android.util.Log import android.view.MotionEvent import android.view.View import com.autonavi.nge.map.OnMapScreenShotListener @@ -35,7 +36,6 @@ import com.mogo.map.listener.MogoMapListenerHandler.Companion.mogoMapListenerHan import com.mogo.map.uicontroller.* import com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT import com.mogo.map.utils.MapTraceUtil -import com.mogo.map.utils.MogoMapUtils import com.mogo.map.utils.MogoMapUtils.getLatLngBounds import com.mogo.map.utils.ObjectUtils import com.zhidaoauto.map.data.point.LonLatPoint @@ -251,6 +251,7 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle private var roadCross: RoadCross? by Delegates.observable(null) { _, oldValue, newValue -> oldValue?.let { + Log.d("$M_MAP$TAG", "onRoadCrossInfo oldValue:$oldValue, newValue:$newValue") //对驶入驶出路口做二次过滤,防止多次回调 if (it.status == 0 && newValue!!.status == 1) { //径直进入路口 @@ -319,7 +320,7 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle e(M_MAP + TAG, "切换地图近景需要传入要移动的经纬度数据") return } - // 近景传入经纬度为点击地图上静态marker经纬度数据,为GPS坐标点。 + // 近景传入经纬度为点击地图上静态marker经纬度数据,为GPS坐标点。 mapAutoViewHelper.setNearViewAnglePosition( LonLatPoint( mogoLatLng.lon, @@ -383,20 +384,26 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle } override fun showMyLocation(visible: Boolean) { - d(M_MAP + TAG, "showMyLocation1 $visible") + d(M_MAP + TAG, "showMyLocation $visible") // 如果是VR模式 - if (isVrMold) { - return - } +// if (isVrMold) { +// return +// } // 不是VR模式情况强制刷新下 if (checkAMapView()) { val style = mMapView.getMapAutoViewHelper()!! .getMyLocationStyle() - if (visible) { - // 强制刷新一遍车标 - style!!.myLocationIcon(mCarCursorOption!!.carCursorRes) + style?.let { + if (visible) { + // 强制刷新一遍车标 + it.myLocationIcon(mCarCursorOption!!.carCursorRes) + }else{ + it.hideCar() + } + mMapView.getMapAutoViewHelper()!!.setMyLocationStyle(style) } - mMapView.getMapAutoViewHelper()!!.setMyLocationStyle(style!!) + }else{ + d(M_MAP + TAG, "showMyLocation checkAMapView false") } } @@ -539,13 +546,6 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle } } - override fun calculateLineDistance(p1: MogoLatLng, p2: MogoLatLng): Float { - return MogoMapUtils.calculateLineDistance( - ObjectUtils.fromMogo(p1), - ObjectUtils.fromMogo(p2) - ) - } - @get:Synchronized override val isCarLocked: Boolean get() = mMapView.getMapAutoViewHelper()!!.getLockMode() @@ -953,4 +953,16 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle override fun setWeatherEnable(enable: Boolean) { mMapView.getMapAutoViewHelper()?.setWeatherEnable(enable) } + + override fun setVisible(visible: Boolean) { + mMapView.getMapAutoViewHelper()?.setVisible(visible) + } + + override fun setCfgKeyVal(key: String, value: String) { + mMapView.getMapController()?.setCfgKeyVal(key, value) + } + + override fun setScreenToOriginDis(p: Float) { + mMapView.getMapController()?.setScreenToOriginDis(p) + } } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt index 2c0ad6dcc6..6184d12bb3 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt @@ -11,8 +11,12 @@ import com.mogo.map.overlay.wrapper.line.AMapPolylineWrapper import com.mogo.map.overlay.wrapper.point.AMapPointWrapper import com.mogo.map.uicontroller.IMogoMapUIController import com.mogo.map.utils.ObjectUtils +import com.zhidaoauto.map.data.point.LonLatPoint import com.zhidaoauto.map.sdk.open.renders.marker.BatchMarkerOptions +import com.zhidaoauto.map.sdk.open.renders.marker.Marker +import com.zhidaoauto.map.sdk.open.renders.marker.MarkerOptions import com.zhidaoauto.map.sdk.open.renders.marker.MarkerSimpleData +import com.zhidaoauto.map.sdk.open.renders.marker.OnMarkClickListener import com.zhidaoauto.map.sdk.open.view.MapAutoView import com.zhidaoauto.map.sdk.open.view.MapAutoViewHelper import mogo.telematics.pad.MessagePad.TrackedObject @@ -54,9 +58,30 @@ class AMapWrapper(map: MapAutoViewHelper?, mapView: MapAutoView, controller: IMo return null } val delegate = mAMap!!.addMarker(markerOptions) ?: return null + options.onClickHandler?.get()?.also { + delegate.setOnMarkClickListener(object : OnMarkClickListener { + override fun onMarkClick(marker: Marker) { + it.invoke(marker.getId() ?: "") + } + }) + } return AMapPointWrapper(options.id, delegate, mMapView) } + override fun addAnimPoint(options: Point.Options) { + if (!checkAMap()) { + return + } + val markerOptions = MarkerOptions(options.id, mMapView.getMapController()).setGps(true) + .position(LonLatPoint(options.longitude, options.latitude, options.rotate.toDouble())) + val marker = Marker(markerOptions,mMapView.getMapController(), + mMapView.getMapController()?.getMarkerCall() + ) + marker.setDisplayAnimEnable(options.displayAnim) + marker.setAnimResource(options.animRes) + marker.setAnimScale(options.animScale) + } + override fun addLine(options: Polyline.Options): IMapPolylineOverlay? { if (!checkAMap()) { return null @@ -66,15 +91,20 @@ class AMapWrapper(map: MapAutoViewHelper?, mapView: MapAutoView, controller: IMo e(TAG, "polyline参数为空") return null } - val delegate = - (if (polylineOptions.lineWidth > 0) mAMap!!.drawThickLine(polylineOptions) else mAMap!!.drawLine( - polylineOptions - )) - ?: return null - return AMapPolylineWrapper(options.id, delegate, mMapView) + if (options.isFilledIn) { + val delegate = mAMap?.drawPolygon(polylineOptions) + return AMapPolylineWrapper(options.id, delegate, mMapView) + } else { + val delegate = + (if (polylineOptions.lineWidth > 0) mAMap?.drawThickLine(polylineOptions) else mAMap?.drawLine( + polylineOptions + )) + ?: return null + return AMapPolylineWrapper(options.id, delegate, mMapView) + } } - var batchMarkerOptions = BatchMarkerOptions() + private val batchMarkerOptions = BatchMarkerOptions() @SuppressLint("NewApi") override fun updateBatchMarkerPosition(optionsArrayList: HashMap?) { diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt index 95e34456e1..3c581ec2ce 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt @@ -1,19 +1,31 @@ package com.mogo.map +import android.os.Looper import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i +import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP import com.mogo.map.MogoData.Companion.mogoMapData +import com.mogo.map.entities.BusStation +import com.mogo.map.entities.CrossRoad +import com.mogo.map.entities.Lane import com.mogo.map.location.GDLocationClient.Companion.gdLocationClient import com.mogo.map.utils.HDMapUtils.getHDCityCode +import com.zhidaoauto.map.data.point.LonLatPoint import com.zhidaoauto.map.data.road.CenterLine +import com.zhidaoauto.map.data.road.RoadCross +import com.zhidaoauto.map.data.road.RoadNameInfo import com.zhidaoauto.map.data.road.RoadRectInfos +import com.zhidaoauto.map.data.road.RoutePath import com.zhidaoauto.map.data.routeinfo.RoadInfo import com.zhidaoauto.map.sdk.open.MapAutoApi import com.zhidaoauto.map.sdk.open.abs.IResult import com.zhidaoauto.map.sdk.open.abs.OnHdDataDownByCityListener import com.zhidaoauto.map.sdk.open.data.CityInfo import com.zhidaoauto.map.sdk.open.data.MapDataApi +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit.SECONDS +import java.util.concurrent.atomic.AtomicReference /** * 地图数据工具,涉及到数据调用可能会有耗时,建议IO操作 @@ -78,7 +90,7 @@ object MapDataWrapper : IMogoData { call: ((CenterLine?) -> Unit) ) { try { - MapDataApi.getCenterLineRangeInfo(lon, lat, angle, distance,false,6, + MapDataApi.getCenterLineRangeInfo(lon, lat, angle, distance, false, 6, object : IResult { override fun result(code: Int, result: CenterLine?) { call.invoke(result) @@ -202,7 +214,7 @@ object MapDataWrapper : IMogoData { location.longitude, location.latitude, object : OnHdDataDownByCityListener { override fun onMapHDDataCacheProgressByCity(id: Int, p: Double) { - progress.invoke(id, p * 100) + progress.invoke(id, p * 100) } override fun onMapHDDataCacheStateByCity(id: Int, state: Int) { @@ -243,5 +255,99 @@ object MapDataWrapper : IMogoData { MapDataApi.cancelCacheHDData() } + override fun getRoadInfo( + lon: Double, + lat: Double, + angle: Float + ): com.mogo.map.entities.RoadInfo { + if (Looper.getMainLooper() == Looper.myLooper()) { + throw AssertionError() + } + val latch = CountDownLatch(1) + var tempCode: Int = Int.MIN_VALUE + var tempData: RoadNameInfo? = null + Logger.d(TAG, "getRoadInfo --- 1 ---") + MapDataApi.getRoadName(lon, lat, angle, object : IResult { + override fun result(code: Int, result: RoadNameInfo?) { + try { + Logger.d(TAG, "getRoadInfo ==> code: $code, result: $result") + tempCode = code + tempData = result + } finally { + latch.countDown() + } + } + }) + try { + if (latch.await(5, SECONDS)) { + Logger.d(TAG, "getRoadInfo --- 2 ---: code -> $tempCode, data -> $tempData") + } else { + Logger.d(TAG, "getRoadInfo --- 3 ---: code -> $tempCode, data -> $tempData") + } + } catch (e: InterruptedException) { + e.printStackTrace() + } + return com.mogo.map.entities.RoadInfo( + tempCode, + tempData?.tile_id?.toLong() ?: 0L, + tempData?.road_id?.toInt() ?: 0, + tempData?.road_name ?: "" + ) + } + override fun getLaneInfo(tileId: Long, roadId: Int): List { + return MapDataApi.getLaneInfo(tileId, roadId)?.map { itx -> + Lane( + itx.laneId, + itx.laneWidth, + itx.laneLatLonPoints.map { Pair(it.longitude, it.latitude) }) + } ?: emptyList() + } + + @Synchronized + override fun getBusStation(routeList: ArrayList, resultUnit:((MutableList) -> Unit)) { + val resultList = mutableListOf() + MapDataApi.getBusStation(routeList, object : IResult { + override fun result(code: Int, result: RoutePath?) { + result?.steps?.forEach { + it?.busStations.forEach { + val busStation = BusStation(it.busStationPoints, it.id.toLong() , it.roadId, it.type, -1, -1) + resultList.add(busStation) + } + } + resultUnit.invoke(resultList) + } + }) + } + + override fun getCrossRoad(lon: Double, lat: Double, angle: Double): CrossRoad? { + if (Looper.getMainLooper() == Looper.myLooper()) { + throw AssertionError() + } + val latch = CountDownLatch(1) + Logger.d(TAG, "getCrossRoad --- 1 ---") + val temp = AtomicReference() + MapDataApi.getCrossRoad(lon, lat, angle.toFloat(), object : IResult { + + override fun result(code: Int, result: RoadCross?) { + try { + Logger.d(TAG, "getCrossRoad --- 1 - 1 ---") + temp.set(CrossRoad(result?.status ?: 0, result?.tile_id ?: "", result?.cross_id ?: "", result?.tile_id_end ?: "", result?.cross_id_end ?: "")) + } finally { + latch.countDown() + } + } + }) + try { + Logger.d(TAG, "getCrossRoad --- 2 ---") + if (latch.await(5, SECONDS)) { + Logger.d(TAG, "getCrossRoad --- 3 ---") + } else { + Logger.d(TAG, "getCrossRoad --- 4 ---") + } + } catch (e: InterruptedException) { + e.printStackTrace() + } + return temp.get() + } } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.kt b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.kt index 36e0efdfca..ff227c23ef 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.kt @@ -52,6 +52,10 @@ open class MogoMapView : MogoBaseMapView, ILifeCycle { } } + override fun getInstanceTag(): String { + return "" + } + /** * 子类实现 * 代码StyleParams和XML初始化设置同时仅支持一种 @@ -61,10 +65,6 @@ open class MogoMapView : MogoBaseMapView, ILifeCycle { protected val styleParams: MapStyleParams? protected get() = null - override fun getInstanceTag(): String { - return MogoMap.DEFAULT - } - override fun onCreate(bundle: Bundle?) { super.onCreate(bundle) d(TAG, "onCreate") diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java b/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java index bfd1882488..0f7d84edf4 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java @@ -31,9 +31,9 @@ public class MogoIdentifyManager implements IMogoIdentifyManager { } @Override - public void removeMarker(String uuidString) { + public void removeMarker(String uuidString, String mapInstance) { try { - IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(MogoMap.DEFAULT); + IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(mapInstance); if(iMogoMap != null){ iMogoMap.removeMarker(uuidString); } @@ -46,9 +46,9 @@ public class MogoIdentifyManager implements IMogoIdentifyManager { } @Override - public void updateBatchMarkerPosition(HashMap optionsArrayList) { + public void updateBatchMarkerPosition(HashMap optionsArrayList, String mapInstance) { try { - IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(MogoMap.DEFAULT); + IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(mapInstance); if(iMogoMap != null){ iMogoMap.updateBatchMarkerPosition(optionsArrayList); } @@ -58,9 +58,9 @@ public class MogoIdentifyManager implements IMogoIdentifyManager { } @Override - public void updateBatchAiMarkerPosition(HashMap optionsArrayList) { + public void updateBatchAiMarkerPosition(HashMap optionsArrayList, String mapInstance) { try { - IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(MogoMap.DEFAULT); + IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(mapInstance); if(iMogoMap != null){ iMogoMap.updateBatchAiMarkerPosition(optionsArrayList); } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/overlay/MoGoOverlayManagerImpl.kt b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/MoGoOverlayManagerImpl.kt index 7a9a880957..0854fd3185 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/overlay/MoGoOverlayManagerImpl.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/MoGoOverlayManagerImpl.kt @@ -1,6 +1,7 @@ package com.mogo.map.overlay import android.graphics.* +import android.view.View import com.mogo.eagle.core.data.map.* import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.utilcode.util.* @@ -48,13 +49,15 @@ internal class MoGoOverlayManagerImpl: IMoGoOverlayManager { key.delegate = point it.setToTop() if (options.moveToCenter) { + val wgs84 = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val cj02 = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() moveToCenter( mapTag, options.id, options.longitude, options.latitude, - if (options.isGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude, - if (options.isGps) CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude else CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude + if (options.isGps) wgs84.longitude else cj02.longitude, + if (options.isGps) wgs84.latitude else cj02.latitude ) } } @@ -63,6 +66,12 @@ internal class MoGoOverlayManagerImpl: IMoGoOverlayManager { } } + override fun setInfoWindowView(id: String, view: View) { + points.filter { it.key.id == id && it.value.isVisible() }.onEach { + it.value.setInfoWindowView(view) + } + } + override fun hidePoint(id: String) { points.filter { it.key.id == id && it.value.isVisible() }.onEach { it.value.setVisible(false) @@ -445,4 +454,8 @@ internal class MoGoOverlayManagerImpl: IMoGoOverlayManager { it.value.setVisible(false) } } + + override fun updateAnimPoint(options: Options, mapTag:String) { + mapInstance.getMogoMap(mapTag)?.addAnimPoint(options) + } } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/line/AMapPolylineWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/line/AMapPolylineWrapper.kt index 4c19310216..f600c43367 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/line/AMapPolylineWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/line/AMapPolylineWrapper.kt @@ -7,7 +7,7 @@ import com.zhidaoauto.map.sdk.open.view.MapAutoView import java.util.concurrent.atomic.* import com.zhidaoauto.map.sdk.open.renders.poyline.Polyline -class AMapPolylineWrapper(private val id: String, private val delegate: Polyline, private val mMapAutoView: MapAutoView): IMapPolylineOverlay { +class AMapPolylineWrapper(private val id: String, private val delegate: Polyline?, private val mMapAutoView: MapAutoView): IMapPolylineOverlay { private val isDestroyed by lazy { AtomicBoolean(false) } @@ -19,7 +19,7 @@ class AMapPolylineWrapper(private val id: String, private val delegate: Polyline override fun destroy() { if (isDestroyed.compareAndSet(false, true)) { try { - delegate.destroy() + delegate?.destroy() } finally { onRemoveAction?.invoke(id) } @@ -29,7 +29,7 @@ class AMapPolylineWrapper(private val id: String, private val delegate: Polyline override fun remove() { if (isRemoved.compareAndSet(false, true)) { try { - delegate.remove() + delegate?.remove() } finally { onRemoveAction?.invoke(id) } @@ -40,7 +40,7 @@ class AMapPolylineWrapper(private val id: String, private val delegate: Polyline if (isDestroyed.get() || isRemoved.get()) { return } - delegate.setVisible(visible) + delegate?.setVisible(visible) } override fun isDestroyed(): Boolean { @@ -48,7 +48,7 @@ class AMapPolylineWrapper(private val id: String, private val delegate: Polyline } override fun isVisible(): Boolean { - return delegate.isVisible() + return delegate?.isVisible() ?: false } override fun setToTop() { @@ -66,7 +66,7 @@ class AMapPolylineWrapper(private val id: String, private val delegate: Polyline delegate.also { val option = ObjectUtils.fromMogo(options,mMapAutoView) if (option != null) { - it.setOption(option) + it?.setOption(option) } } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/point/AMapPointWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/point/AMapPointWrapper.kt index 9d55faa793..84853baeb0 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/point/AMapPointWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/wrapper/point/AMapPointWrapper.kt @@ -1,15 +1,20 @@ package com.mogo.map.overlay.wrapper.point -import com.mogo.eagle.core.data.map.* +import android.view.View +import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.map.overlay.point.Point.Options -import com.mogo.map.overlay.proxy.point.* +import com.mogo.map.overlay.proxy.point.IMapPointOverlay import com.mogo.map.utils.ObjectUtils import com.zhidaoauto.map.data.point.LonLatPoint +import com.zhidaoauto.map.sdk.open.renders.marker.Marker import com.zhidaoauto.map.sdk.open.view.MapAutoView import java.util.concurrent.atomic.AtomicBoolean -import com.zhidaoauto.map.sdk.open.renders.marker.Marker -class AMapPointWrapper(private val id: String, private val delegate: Marker, private val mMapAutoView: MapAutoView): IMapPointOverlay { +class AMapPointWrapper( + private val id: String, + private val delegate: Marker, + private val mMapAutoView: MapAutoView +) : IMapPointOverlay { private val isDestroyed by lazy { AtomicBoolean(false) } @@ -54,6 +59,10 @@ class AMapPointWrapper(private val id: String, private val delegate: Marker, pri return delegate.isVisible() } + override fun setInfoWindowView(view: View) { + delegate.setInfoWindowView(view) + } + override fun setToTop() { if (isDestroyed.get() || isRemoved.get()) { return @@ -72,11 +81,15 @@ class AMapPointWrapper(private val id: String, private val delegate: Marker, pri if (isDestroyed.get() || isRemoved.get()) { return } - delegate.setMarkerOptions(ObjectUtils.fromMogo(opt,mMapAutoView)) + delegate.setMarkerOptions(ObjectUtils.fromMogo(opt, mMapAutoView)) } override fun addDynamicAnchorPosition(point: MogoLatLng, angle: Float, duration: Long) { - delegate.addDynamicAnchorPostion(LonLatPoint(point.lon, point.lat, angle.toDouble()), System.currentTimeMillis(), duration.toInt()) + delegate.addDynamicAnchorPostion( + LonLatPoint(point.lon, point.lat, angle.toDouble()), + System.currentTimeMillis(), + duration.toInt() + ) } override fun onRemove(action: (id: String) -> Unit) { diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/MogoMapUtils.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/MogoMapUtils.java index d26e0aff9a..781117ec0d 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/utils/MogoMapUtils.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/MogoMapUtils.java @@ -88,46 +88,4 @@ public class MogoMapUtils { return new LatLngBounds.Builder().include( new LonLatPoint( east, north ) ).include( new LonLatPoint( west, south ) ).build(); } - - public static float calculateLineDistance(LonLatPoint var0, LonLatPoint var1) { - if (var0 != null && var1 != null) { - try { - double var2 = var0.getLongitude(); - double var4 = var0.getLatitude(); - double var6 = var1.getLongitude(); - double var8 = var1.getLatitude(); - var2 *= 0.01745329251994329D; - var4 *= 0.01745329251994329D; - var6 *= 0.01745329251994329D; - var8 *= 0.01745329251994329D; - double var10 = Math.sin(var2); - double var12 = Math.sin(var4); - double var14 = Math.cos(var2); - double var16 = Math.cos(var4); - double var18 = Math.sin(var6); - double var20 = Math.sin(var8); - double var22 = Math.cos(var6); - double var24 = Math.cos(var8); - double[] var28 = new double[3]; - double[] var29 = new double[3]; - var28[0] = var16 * var14; - var28[1] = var16 * var10; - var28[2] = var12; - var29[0] = var24 * var22; - var29[1] = var24 * var18; - var29[2] = var20; - return (float)(Math.asin(Math.sqrt((var28[0] - var29[0]) * (var28[0] - var29[0]) + (var28[1] - var29[1]) * (var28[1] - var29[1]) + (var28[2] - var29[2]) * (var28[2] - var29[2])) / 2.0D) * 1.27420015798544E7D); - } catch (Throwable var26) { - var26.printStackTrace(); - return 0.0F; - } - } else { - try { - throw new Exception("非法坐标值"); - } catch (Exception var27) { - var27.printStackTrace(); - return 0.0F; - } - } - } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java index 6d9b5a7013..a5926a9c36 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java @@ -3,7 +3,6 @@ package com.mogo.map.utils; import android.graphics.Bitmap; import android.graphics.Color; import android.text.TextUtils; -import android.util.Log; import android.view.View; import com.mogo.eagle.core.data.config.FunctionBuildConfig; @@ -119,16 +118,13 @@ public class ObjectUtils { markerOptions.setTime(Double.valueOf(trafficData.getSatelliteTime() * 1000).longValue()); if(!trafficData.getColor().isEmpty()){ if(trafficData.getColor().contains("-drawColor")){ -// markerOptions.setColorType(3); markerOptions.setColor(trafficData.getColor().split("-")[0]); } else if(trafficData.getColor().contains("-resetColor")){ -// markerOptions.setColorType(4); markerOptions.setColor(trafficData.getColor().split("-")[0]); } else{ markerOptions.setColor(trafficData.getColor()); } }else{ -// markerOptions.setColorType(0); markerOptions.setColor("#00000000"); } } catch (Exception e) { @@ -145,10 +141,10 @@ public class ObjectUtils { try { markerOptions = new MarkerSimpleData(); markerOptions.setId(aiData.getUuid().hashCode()); - markerOptions.setColor("#00FF00FF"); int type = aiData.getType(); if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){ + markerOptions.setColor("#90ABCAFF"); if(type == 3){ type = 103; }else if(type == 6){ @@ -156,11 +152,16 @@ public class ObjectUtils { }else if(type == 8){ type = 108; } - if (type != 103 && type != 106 && type != 108) { - markerOptions.setColor("#90ABCAFF"); - }else{ + if(type == 103 || type == 106 || type == 108){ markerOptions.setColor(""); } +// if (type != 103 && type != 106 && type != 108) { +// markerOptions.setColor("#90ABCAFF"); +// }else{ +// markerOptions.setColor(""); +// } + }else{ + markerOptions.setColor("#00FF00FF"); } markerOptions.setMarkerType(type); markerOptions.setRotateAngle((float) aiData.getHeading()); @@ -229,6 +230,16 @@ public class ObjectUtils { target.setIsBright(true); target.setBrightColor(options.getLightColor()); target.setBrightSpeed(options.getLightSpeed()); + } else { + target.setIsBright(false); + } + Bitmap bitmap = options.getCustomTexture(); + if (bitmap != null) { + target.useTexture(true); + target.customTexture(bitmap); + } + if (options.isShowArrow()) { + target.setIsArrow(true); } return target; } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/PointInterpolatorUtil.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/PointInterpolatorUtil.java index f68b2ce783..09dfb4b95d 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/utils/PointInterpolatorUtil.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/PointInterpolatorUtil.java @@ -55,27 +55,6 @@ public class PointInterpolatorUtil { } } - /** - * 道路吸附算法 - *

- * 所谓的道路数据,实际就是道路对应的点集,每两个点之间是直线,但是两点间距并不固定,点集内点的数量也不固定,点集是有序的,按道路方向排序,road[0]是起点。 - * 为了避免拐弯道路的问题,先使用{@link #getCloseTwoPoint(int, int, double, double, List)}从道路数据里面找出距离目标点最近的两个点,记为A、B,最近的两个点就在目标点一前一后排列, - * 这样的话,求一下目标点到AB的垂直映射以及距离{@link #getFootAndMinDistance(double, double, double, double, double, double)},就是吸附后的经纬度和距离 - * - * @param lon 目标经度 - * @param lat 目标纬度 - * @param road 目标道路数据 - * @return double[]{吸附后的经度,吸附后的纬度,目标经纬度距离道路的垂直距离} - */ - public static double[] mergeToRoad(double lon, double lat, ArrayList road) { - int closeStart = 0; - int closeEnd = road.size() - 1; - int[] result = getCloseTwoPoint(closeStart, closeEnd, lon, lat, road); - LonLatPoint start = road.get(result[0]); - LonLatPoint end = road.get(result[1]); - return getFootAndMinDistance(lon, lat, start.getLongitude(), start.getLatitude(), end.getLongitude(), end.getLatitude()); - } - /** * 获取距离目标点经纬度最近的道路点index *