diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiCarServiceCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiCarServiceCallback.kt index 708d9bb030..79b047ac66 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiCarServiceCallback.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiCarServiceCallback.kt @@ -18,4 +18,5 @@ interface ITaxiCarServiceCallback { fun onCarStartServiceFailed(code: Int, msg: String) fun onCarStartServiceError() + fun onStartTaskFail() } \ 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 edcfce921e..b01476393a 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 @@ -462,6 +462,10 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), } } + override fun onStartTaskFail() { + + } + private fun clearDemoModeAndACParameters(){ if (FunctionBuildConfig.isDemoMode) { d(TAG, "setIPCDemoMode:false") 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 fc0bc0cee0..77f79bbfd9 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 @@ -947,6 +947,7 @@ object TaxiTaskModel { override fun onError() { super.onError() + mTaxiCarServiceCallback?.onStartTaskFail() if (!NetworkUtils.isConnected(mContext)) { // 网络异常,接口重试 ToastUtils.showShort("网络出现异常,请稍后重试") DebugView.printErrorMsg("[开始任务] 网络出现异常,请稍后重试") @@ -957,6 +958,7 @@ object TaxiTaskModel { } override fun onFail(code: Int, msg: String?) { + mTaxiCarServiceCallback?.onStartTaskFail() DebugView.printErrorMsg("[开始任务] 请求fail, code=$code, msg=$msg, lindId=$lineId") d(TAG, "startTask onFail: code=$code, msg=$msg") ToastUtils.showShort("开始任务请求出现异常,请稍后重试,code=$code, msg=$msg, lindId=$lineId") diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt index b843c773be..34202a630c 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt @@ -1,6 +1,5 @@ -package com.mogo.och.unmanned.taxi.ui.itinerarycurrent +package com.mogo.och.unmanned.taxi.ui.task.itinerarycurrent -import androidx.lifecycle.ViewModel import com.mogo.commons.AbsMogoApplication import com.mogo.commons.module.status.MogoStatusManager import com.mogo.eagle.core.data.BaseData @@ -27,7 +26,6 @@ import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.base.BaseViewModel import com.mogo.och.unmanned.taxi.base.IUiIntent import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean import com.mogo.och.unmanned.taxi.bean.TrajectoryListRespBean import com.mogo.och.unmanned.taxi.callback.ITaxiCarServiceCallback @@ -179,9 +177,14 @@ class ItineraryCurrentModel : BaseViewModel(), private fun startTask(isStartAutopilot: Boolean = true) { if (!TaxiTaskModel.checkCurrentTaskCondition()) { ToastUtils.showShort("无任务!") + onStartTaskFail() + return + } + if(TaxiTaskModel.getCurrentTaskWithOrder()==null){ + ToastUtils.showShort("无任务!") + onStartTaskFail() return } - TaxiTaskModel.getCurrentTaskWithOrder()?.let { TaxiTaskModel.startTask( if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code) @@ -480,6 +483,10 @@ class ItineraryCurrentModel : BaseViewModel(), } } + override fun onStartTaskFail() { + viewCallback?.onStartTaskFail() + } + private fun clearDemoModeAndACParameters(){ if (FunctionBuildConfig.isDemoMode) { d(TAG, "setIPCDemoMode:false") @@ -505,7 +512,7 @@ class ItineraryCurrentModel : BaseViewModel(), interface SwtichLineViewCallback { - + fun onStartTaskFail() } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt index 6a53c25dc4..147d856dc6 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt @@ -32,7 +32,6 @@ import com.mogo.och.common.module.utils.FlowBus import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.common.module.wigets.CommonSlideView -import com.mogo.och.common.module.wigets.OCHCommitDialog import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.TaxiUnmannedDriverProvider @@ -46,7 +45,6 @@ import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TAXI_END_ 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 import com.mogo.och.unmanned.taxi.ui.debug.DebugView -import com.mogo.och.unmanned.taxi.ui.itinerarycurrent.ItineraryCurrentModel import com.mogo.och.unmanned.taxi.ui.task.TaskUiIntent import com.mogo.och.unmanned.taxi.ui.task.TaskWithOrderUIState import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel @@ -868,4 +866,9 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi } } + override fun onStartTaskFail() { + commonSlideViewStartServer.reset() + } + + } 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 index c72c110fd8..eec14c4f54 100644 --- 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 @@ -2,7 +2,6 @@ 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 @@ -21,7 +20,9 @@ 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 import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +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.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.map.overlay.core.Level @@ -38,6 +39,8 @@ class RoadCrossCameraManager : IMoGoMapRoadListener, IGaoDeMapLocationListener { private const val TAG = "RoadCrossCameraManager" private const val REQUEST_CAMERA_MSG = 0 private const val REMOVE_MARKER_MSG = 1 + private const val REQUEST_CAL_ROAD_DISTANCE = 2 + private const val REQUEST_CAL_ROAD_DELAY_TIME = 1000L private const val REQUEST_CAMERA_DELAY_TIME = 20000L private const val REMOVE_MARKER_DELAY_TIME = 10000L @@ -64,6 +67,11 @@ class RoadCrossCameraManager : IMoGoMapRoadListener, IGaoDeMapLocationListener { getAllRoadCross() } + REQUEST_CAL_ROAD_DISTANCE -> { + CallerLogger.d("$M_MAP$TAG", "cal roam road distance") + calRoamRoadDistance() + } + REMOVE_MARKER_MSG -> { CallerLogger.d("$M_MAP$TAG", "remove marker") overlayManager?.removeAllPointsInOwner(TAG) @@ -208,44 +216,60 @@ class RoadCrossCameraManager : IMoGoMapRoadListener, IGaoDeMapLocationListener { } } - fun hasCrossCamera(): Boolean { - if(CallerMapUIServiceManager.getCityCode() == "010"){ + private fun hasCrossCamera(camera: ((Boolean, CameraDeviceInfo?) -> Unit)) { + if (CallerMapUIServiceManager.getCityCode() == "010") { roadCrossTrace( TAG, mapOf("errorMsg" to "cityCode限制 - 北京无路口设备") ) - return false + camera.invoke(false, null) } val roadCrossEnd = CallerMapRoadListenerManager.getCrossEndInfo() - if(roadCrossEnd == null){ + if (roadCrossEnd == null) { roadCrossTrace( TAG, mapOf("errorMsg" to "hasCrossCamera - 未获取到地图crossEnd数据") ) - return false + camera.invoke(false, null) } if (roadCrossCameraList == null) { roadCrossTrace( TAG, mapOf("errorMsg" to "hasCrossCamera - 未获取到全市路口设备信息") ) - return false + camera.invoke(false, null) } - - roadCrossCameraList?.forEach { - val result = (!it.roadUniqueId.isNullOrEmpty() + var result = false + roadCrossCameraList?.forEach { it -> + result = (!it.roadUniqueId.isNullOrEmpty() && it.roadUniqueId == roadCrossEnd) - if(result){ + if (result) { roadCrossTrace( - TAG, mapOf("errorMsg" to "hasCrossCamera - 遍历匹配路口数据命中 - $roadCrossEnd") + TAG, + mapOf("errorMsg" to "hasCrossCamera - 遍历匹配路口数据命中 - $roadCrossEnd") ) - return true + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val cameraInfo = it.deviceInfoList.minByOrNull { info -> + CoordinateUtils.calculateLineDistance( + info.lon, + info.lat, + loc.longitude, + loc.latitude + ) + } + if (cameraInfo != null) { + camera.invoke(true, cameraInfo) + return@forEach + } } } - roadCrossTrace( - TAG, mapOf("errorMsg" to "hasCrossCamera - 均不匹配上述条件") - ) - return false + if(!result){ + roadCrossTrace( + TAG, mapOf("errorMsg" to "hasCrossCamera - 未匹配到路口信息 - $roadCrossEnd") + ) + camera.invoke(false, null) + } + } @SuppressLint("NewApi") @@ -270,20 +294,102 @@ class RoadCrossCameraManager : IMoGoMapRoadListener, IGaoDeMapLocationListener { override fun onRoadChange(cross: Boolean, roadCross: RoadCross?) { super.onRoadChange(cross, roadCross) // 出路口 + if (!cross) { + handleRoadCrossRoam(false) + handleCameraMarker() + CallerLogger.d("$M_MAP$TAG", "经过路口,释放控制") + } else { + handleRoadCrossRoam(true) + } + } + + private var cameraDis: CameraDeviceInfo? = null + private fun handleRoadCrossRoam(isCross: Boolean) { + CallerLogger.d("$M_MAP$TAG", "handleRoadCrossRoam , isCross:$isCross") + if (isCross) { + //停止handler,remove + cameraDis = null + handler.removeMessages(REQUEST_CAL_ROAD_DISTANCE) + CallerMapRoadListenerManager.invokeCrossDevice(false) + CallerLogger.d("$M_MAP$TAG", "emArrow 已过路口,清除判断") + } else { + //开启handler计算,每隔一秒 + handler.sendEmptyMessageDelayed(REQUEST_CAL_ROAD_DISTANCE, REQUEST_CAL_ROAD_DELAY_TIME) + CallerLogger.d("$M_MAP$TAG", "emArrow 路口内,开始计算") + } + } + + private fun calRoamRoadDistance() { + //计算前方路口与marker最小距离 < 200 ,触发业务,回调 + //到达触发距离,可一直发,如果业务方已经展示业务,invoke取消handler + handler.removeMessages(REQUEST_CAL_ROAD_DISTANCE) + if (cameraDis != null) { + calDisInRange { b, dis -> + if(b){ + CallerLogger.d("$M_MAP$TAG", "emArrow 距离内,多次计算,命中") + CallerMapRoadListenerManager.invokeCrossDevice(true) + }else{ + //没有命中距离,继续计算 + handler.sendEmptyMessageDelayed(REQUEST_CAL_ROAD_DISTANCE, REQUEST_CAL_ROAD_DELAY_TIME) + CallerLogger.d("$M_MAP$TAG", "emArrow 继续计算, dis:$dis") + } + } + return + } + + hasCrossCamera { hasCamera, cameraDeviceInfo -> + if (hasCamera && cameraDeviceInfo != null) { + CallerLogger.d("$M_MAP$TAG", "emArrow 首次命中设备") + cameraDis = cameraDeviceInfo + calDisInRange { b, dis -> + if(b){ + CallerLogger.d("$M_MAP$TAG", "emArrow 距离内,首次即命中") + CallerMapRoadListenerManager.invokeCrossDevice(true) + }else{ + //没有命中距离,继续计算 + handler.sendEmptyMessageDelayed(REQUEST_CAL_ROAD_DISTANCE, REQUEST_CAL_ROAD_DELAY_TIME) + CallerLogger.d("$M_MAP$TAG", "emArrow 继续计算, 首次 dis:$dis") + } + } + }else{ + //没有命中设备,继续计算 + handler.sendEmptyMessageDelayed(REQUEST_CAL_ROAD_DISTANCE, REQUEST_CAL_ROAD_DELAY_TIME) + CallerLogger.d("$M_MAP$TAG", "emArrow 没有命中设备${cameraDeviceInfo?:"空"}/路口${CallerMapRoadListenerManager.getCrossEndInfo()},继续计算") + } + } + } + + private fun calDisInRange(range: ((Boolean, Float) -> Unit)) { + if (cameraDis == null) { + range.invoke(false, 0f) + return + } + val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val dis = CoordinateUtils.calculateLineDistance( + cameraDis!!.lon, + cameraDis!!.lat, + loc.longitude, + loc.latitude + ) + if (dis < 220 && dis >= 5) { + range.invoke(true, dis) + }else{ + range.invoke(false,dis) + } + } + + private fun handleCameraMarker() { 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(REMOVE_MARKER_MSG, REMOVE_MARKER_DELAY_TIME) - // 释放控制 - isCameraRequest = false - CallerLogger.d("$M_MAP$TAG", "经过路口,释放控制") - } + // 停止请求摄像头数据 + ndeRoadCameraNetWorkModel.cancelRequest("roadCross") + // 清除marker + CallerLogger.d("$M_MAP$TAG", "handleCameraMarker remove marker handler") + handler.sendEmptyMessageDelayed(REMOVE_MARKER_MSG, REMOVE_MARKER_DELAY_TIME) + // 释放控制 + isCameraRequest = false } private fun traceError(msg: String) { 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 index 0ab1959506..c8179001ee 100644 --- 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 @@ -188,18 +188,9 @@ class RoadCrossRoamView @JvmOverloads constructor( } } - override fun onStopLineInfo(info: StopLine) { - super.onStopLineInfo(info) - val cross = CallerMapRoadListenerManager.getCrossEndInfo() - if (info.distance == 0.0 || info.distance > 200) { - if (cross != null && cross != "0") { - CallerLogger.d("$M_MAP$TAG", "未触发,路口ID:$cross , 距离超出:${info.distance}") - } - return - } - CallerLogger.d("$M_MAP$TAG", "命中 before:$showState") - showState = info.distance in 100.0..200.0 - CallerLogger.d("$M_MAP$TAG", "命中 after:$showState,路口ID:$cross , dis:${info.distance}") + override fun onCrossDevice(trigger: Boolean) { + super.onCrossDevice(trigger) + showState = trigger } private fun attachView() { @@ -234,17 +225,17 @@ class RoadCrossRoamView @JvmOverloads constructor( CallerLogger.d("$M_MAP$TAG", "未触发,路口ID:$cross") return } - if (!instance.hasCrossCamera()) { - CallerLogger.d("$M_MAP$TAG", "没有路侧设备,不做处理") - return - } isShow = true //播放语音 val dis = CallerMapRoadListenerManager.getStopLineDistance()?.toInt() ?: 0 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - var disStr = "前方即将通过路口,${SkinResources.getInstance().getString(R.string.operation_platform_name)}为您提供路口全息影像,助力出行" + var disStr = "前方即将通过路口,${ + SkinResources.getInstance().getString(R.string.operation_platform_name) + }为您提供路口全息影像,助力出行" if (dis >= 80) { - disStr = "前方${dis}米将通过路口,${SkinResources.getInstance().getString(R.string.operation_platform_name)}为您提供路口全息影像,助力出行" + disStr = "前方${dis}米将通过路口,${ + SkinResources.getInstance().getString(R.string.operation_platform_name) + }为您提供路口全息影像,助力出行" } AIAssist.getInstance(context).speakTTSVoice(disStr) } 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 index 1d73bdacd5..2ca27ff1aa 100644 --- 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 @@ -41,7 +41,7 @@ () { private var mRoadId: String? = null private var mStopLine: StopLine? = null + @Volatile private var mRoadChange = false + @Volatile private var mRoadCross: RoadCross? = null + @Volatile + private var mTrigger = false + private var mCross: Int by Delegates.observable(-1) { _, oldValue, newValue -> if (oldValue != newValue) { CallerLogger.d("$M_MAP onRoadChange observable", newValue) @@ -40,9 +45,9 @@ object CallerMapRoadListenerManager : CallerBase() { mStopLine?.let { listener.onStopLineInfo(it) } - if (mCross != -1 && mRoadCross != null) { - listener.onRoadChange(mRoadChange, mRoadCross) - } + // 启动默认false + listener.onRoadChange(mRoadChange, mRoadCross) + listener.onCrossDevice(mTrigger) } fun invokeListenersOnRoadIdGet(roadId: String) { @@ -116,4 +121,17 @@ object CallerMapRoadListenerManager : CallerBase() { entry.value.onCrossLiveInfo(info) } } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_MAP, + nodeAliasCode = ChainConstant.CHAIN_CODE_HD_MAP_ROAD_DEVICE_TRIGGER, + paramIndexes = [0] + ) + fun invokeCrossDevice(trigger:Boolean){ + mTrigger = trigger + M_LISTENERS.forEach { entry -> + entry.value.onCrossDevice(trigger) + } + } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index bb52091df5..71bac237a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -151,7 +151,7 @@ MATRIX_VERSION=2.0.8 # 公交模式司机端版本号 -DRIVER_VERSION=6.7.3 +DRIVER_VERSION=6.7.4 # 公交模式乘客端端版本号 -PASSENGER_VERSION=5.7.3 +PASSENGER_VERSION=5.7.4