diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt index 54f444b221..2d796baca7 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt @@ -10,10 +10,14 @@ import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.bridge.bridge.OchBridgeManager +import com.mogo.och.bridge.bridge.OchVlmManager import com.mogo.och.bridge.trajectory.TrajectoryManager import com.mogo.och.common.module.biz.birdge.BridgeService import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.biz.birdge.data.RoadMsg +import com.mogo.och.common.module.biz.birdge.data.VlmData import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.EnvManager /** @@ -29,7 +33,16 @@ class BridgeProvider : BridgeService, CallerBase() { override fun init(context: Context?) { this.context = context - OchBridgeManager.load() + + // 车前引导线+预测数据 + if(EnvManager.isB2Passenger()||EnvManager.isT1T2Passenger()){ + OchBridgeManager.load() + } + +// if(EnvManager.isT1T2Passenger()){ + OchVlmManager.load() +// } + TrajectoryManager.load() } @@ -92,5 +105,17 @@ class BridgeProvider : BridgeService, CallerBase() { } } + fun invokeVlmDataDispatch(vlmData:VlmData){ + M_LISTENERS.forEach { + it.value.onVlmDataListener(vlmData) + } + } + + fun inVokeNdeData(title: String, desc: String, sortedList: List) { + M_LISTENERS.forEach { + it.value.onNdeDataListener(title,desc,sortedList) + } + } + } \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt index e600572140..048b82028f 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt @@ -3,13 +3,10 @@ package com.mogo.och.bridge import android.annotation.SuppressLint import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.map.MogoLocation -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.common.module.biz.birdge.data.RoadMsg +import com.mogo.och.common.module.biz.birdge.data.VlmData import com.mogo.och.common.module.constant.OchCommonConst -import com.mogo.och.common.module.manager.loop.BizLoopManager -import com.mogo.och.common.module.manager.loop.LoopInfo -import io.reactivex.schedulers.Schedulers -import kotlin.properties.Delegates object BridgeServiceManager { @@ -19,52 +16,12 @@ object BridgeServiceManager { private var bridgeService: BridgeProvider? = ARouter.getInstance().build(OchCommonConst.BIZ_Bridge).navigation() as BridgeProvider - private var trajectoryTime = 0L - private var predictionTime = 0L - - init { - BizLoopManager.setLoopFunction(TAG, - LoopInfo(2, ::checkTimeout, immediately = false, scheduler = Schedulers.io()) - ) - } - - // 是否有车前引导线 - private var haveTrajectoryInfo: Boolean by Delegates.observable(false) { _, oldValue, newValue -> - if (oldValue != newValue) { - bridgeService?.invokeTrajectoryHaveDataListener(newValue) - CallerLogger.d(TAG,"haveTrajectoryInfo 发生变化:${newValue}") - } - trajectoryTime = System.currentTimeMillis() - - } - - // 是否有预测数据 - private var havePredictionInfo: Boolean by Delegates.observable(false) { _, oldValue, newValue -> - if (oldValue != newValue) { - bridgeService?.invokePredictionHavaData(newValue) - CallerLogger.d(TAG,"havePredictionInfo 发生变化:${newValue}") - } - predictionTime = System.currentTimeMillis() - } - - fun checkTimeout(){ - if(System.currentTimeMillis() - trajectoryTime>2_000){ - haveTrajectoryInfo = false - CallerLogger.d(TAG,"超时设置为false:haveTrajectoryInfo ${haveTrajectoryInfo}") - } - if(System.currentTimeMillis() - predictionTime>2_000){ - havePredictionInfo = false - CallerLogger.d(TAG,"超时设置为false:havePredictionInfo ${havePredictionInfo}") - } - } - - fun invokePlanningListener(haveTrajectoryInfos:Boolean){ - this.haveTrajectoryInfo = haveTrajectoryInfos + bridgeService?.invokeTrajectoryHaveDataListener(haveTrajectoryInfos) } fun invokePredictionHaveData(havePredictionInfos:Boolean){ - this.havePredictionInfo = havePredictionInfos + bridgeService?.invokePredictionHavaData(havePredictionInfos) } fun invokeTrajectoryPoints(trajectoryList: MutableList){ @@ -78,4 +35,15 @@ object BridgeServiceManager { this.bridgeService?.invokeTrajectoryPointAndDistance(trajectoryList, distance) } + /** + * 分发vmData + */ + fun invokeVlmData(vlmData: VlmData){ + this.bridgeService?.invokeVlmDataDispatch(vlmData) + } + + fun invokeNdeData(title: String, desc: String, sortedList: List) { + this.bridgeService?.inVokeNdeData(title,desc,sortedList) + } + } \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/Data.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/Data.kt new file mode 100644 index 0000000000..834a40af21 --- /dev/null +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/Data.kt @@ -0,0 +1,42 @@ +package com.mogo.och.bridge.bridge + +data class VlmImageData(val imageSourceTimestamp: Double ,var image: ByteArray?) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as VlmImageData + + return imageSourceTimestamp == other.imageSourceTimestamp + } + + override fun hashCode(): Int { + return imageSourceTimestamp.hashCode() + } + + override fun toString(): String { + return "VlmImageData(imageSourceTimestamp=$imageSourceTimestamp)" + } + + +} + +data class VlmMessageData(val messageSourceTimestamp: Double ,val id:Int?,val message:String?){ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as VlmMessageData + +// if (messageSourceTimestamp != other.messageSourceTimestamp) return false + if (id != other.id) return false + + return true + } + + override fun hashCode(): Int { + var result = messageSourceTimestamp.hashCode() + result = 31 * result + (id ?: 0) + return result + } +} diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt index 9009316cb3..8955f6fcd7 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt @@ -4,24 +4,62 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningTrajectoryListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerPlanningTrajectoryListenerManager -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_OCHCOMMON import com.mogo.och.bridge.BridgeServiceManager +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.manager.loop.LoopInfo +import io.reactivex.schedulers.Schedulers import prediction2025.Prediction2025 import mogo.telematics.pad.MessagePad +import kotlin.properties.Delegates -object OchBridgeManager: CallerBase(), - IMoGoPlanningTrajectoryListener, IMoGoAutopilotIdentifyListener { +object OchBridgeManager: IMoGoPlanningTrajectoryListener, IMoGoAutopilotIdentifyListener { private val TAG = "${M_OCHCOMMON}OchPlanningListenerManager" + + private var trajectoryTime = 0L + private var predictionTime = 0L + fun load(){ CallerPlanningTrajectoryListenerManager.addListener(TAG,this) CallerAutopilotIdentifyListenerManager.addListener(TAG,this) + BizLoopManager.setLoopFunction(TAG, LoopInfo(2, ::checkTimeout, immediately = false, scheduler = Schedulers.io())) } fun release(){ CallerPlanningTrajectoryListenerManager.removeListener(TAG) + CallerAutopilotIdentifyListenerManager.removeListener(TAG) + } + + // 是否有车前引导线 + private var haveTrajectoryInfo: Boolean by Delegates.observable(false) { _, oldValue, newValue -> + if (oldValue != newValue) { + BridgeServiceManager.invokePlanningListener(newValue) + CallerLogger.d(TAG,"haveTrajectoryInfo 发生变化:${newValue}") + } + trajectoryTime = System.currentTimeMillis() + + } + + // 是否有预测数据 + private var havePredictionInfo: Boolean by Delegates.observable(false) { _, oldValue, newValue -> + if (oldValue != newValue) { + BridgeServiceManager.invokePredictionHaveData(newValue) + CallerLogger.d(TAG,"havePredictionInfo 发生变化:${newValue}") + } + predictionTime = System.currentTimeMillis() + } + + fun checkTimeout(){ + if(System.currentTimeMillis() - trajectoryTime>2_000){ + haveTrajectoryInfo = false + CallerLogger.d(TAG,"超时设置为false:haveTrajectoryInfo $haveTrajectoryInfo") + } + if(System.currentTimeMillis() - predictionTime>2_000){ + havePredictionInfo = false + CallerLogger.d(TAG,"超时设置为false:havePredictionInfo $havePredictionInfo") + } } /** @@ -29,17 +67,20 @@ object OchBridgeManager: CallerBase(), */ override fun onAutopilotTrajectory(trajectoryInfos: MutableList) { if(trajectoryInfos.isEmpty()){ - BridgeServiceManager.invokePlanningListener(false) + haveTrajectoryInfo = false }else{ - BridgeServiceManager.invokePlanningListener(true) + haveTrajectoryInfo = true } } + /** + * 预测信息 + */ override fun onPredictionObstacleTrajectory(predictionObjects: Prediction2025.mPredictionObjects) { if (predictionObjects.objsAppList==null) { - BridgeServiceManager.invokePredictionHaveData(false) + havePredictionInfo = false }else{ - BridgeServiceManager.invokePredictionHaveData(true) + havePredictionInfo = true } } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/NDEViewModel.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchNdeManager.kt similarity index 81% rename from OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/NDEViewModel.kt rename to OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchNdeManager.kt index 66c3fc90a0..674401607c 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/NDEViewModel.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchNdeManager.kt @@ -1,24 +1,28 @@ -package com.mogo.och.unmanned.passenger.ui.aiview +package com.mogo.och.bridge.bridge -import androidx.lifecycle.ViewModel import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager -import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.eagle.core.function.call.autopilot.CallerVlmManager +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.bridge.BridgeServiceManager +import com.mogo.och.common.module.biz.birdge.data.RoadMsg + import mogo.telematics.pad.MessagePad.TrackedObject -class NDEViewModel: ViewModel(), IMoGoAutopilotIdentifyListener { +object OchNdeManager : IMoGoAutopilotIdentifyListener { + private val TAG = "${M_OCHCOMMON}OchVlmManager" - companion object{ - private const val TAG = "NDEViewModel" + fun load(){ + CallerAutopilotIdentifyListenerManager.addListener(TAG, this) + } + + fun release(){ + CallerVlmManager.removeListener(TAG) } private var lastMap2 = HashMap() private var lastTime = 0L - fun init(){ - CallerAutopilotIdentifyListenerManager.addListener(TAG, this) - } - override fun onAutopilotIdentifyDataUpdate(trafficData: List?){ super.onAutopilotIdentifyDataUpdate(trafficData) handleCheLong(trafficData) @@ -27,7 +31,7 @@ class NDEViewModel: ViewModel(), IMoGoAutopilotIdentifyListener { private fun handleCheLong(trafficData: List?) { var hasCheLong = false var isNewData = false - val roadMsgList = ArrayList() + val roadMsgList = ArrayList() val curMap = HashMap() if (lastTime > 0 && System.currentTimeMillis() - lastTime > 60000) { lastMap2.clear()// 清除上次车龙事件的缓存 @@ -55,8 +59,7 @@ class NDEViewModel: ViewModel(), IMoGoAutopilotIdentifyListener { curMap[obj.laneNum] = "0" } // 保存所有车道信息 - roadMsgList.add( - AIMessage.RoadMsg( + roadMsgList.add(RoadMsg( obj.arrowType, laneNum = obj.laneNum, isRecommend = obj.suggestedLanes, @@ -74,10 +77,8 @@ class NDEViewModel: ViewModel(), IMoGoAutopilotIdentifyListener { lastTime = System.currentTimeMillis() val sortedList = roadMsgList.sortedWith(compareByDescending { it.laneNum }) - val ndeEvent = AIMessage.NDEData(System.currentTimeMillis().toString(),"路口车龙","前方路口有车龙",sortedList) - AIMessageManager.post(ndeEvent) + BridgeServiceManager.invokeNdeData("路口车龙","前方路口有车龙",sortedList) } } } - } \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchVlmManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchVlmManager.kt new file mode 100644 index 0000000000..d70f8cccff --- /dev/null +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchVlmManager.kt @@ -0,0 +1,58 @@ +package com.mogo.och.bridge.bridge + +import com.mogo.eagle.core.function.api.autopilot.IVlmListener +import com.mogo.eagle.core.function.call.autopilot.CallerVlmManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.bridge.BridgeServiceManager +import com.mogo.och.common.module.biz.birdge.data.VlmData +import vllm.Vlm +import kotlin.properties.Delegates + +object OchVlmManager : IVlmListener { + private val TAG = "${M_OCHCOMMON}OchVlmManager" + + fun load(){ + CallerVlmManager.addListener(TAG,this) + } + + fun release(){ + CallerVlmManager.removeListener(TAG) + } + + // + private var vllmImageData: VlmImageData by Delegates.observable(VlmImageData(0.0,null)) { _, oldValue, newValue -> + if (oldValue != newValue) { + if(newValue.imageSourceTimestamp == vllmData.messageSourceTimestamp){ + CallerLogger.d(TAG," message先来 图片后来 发送message和图片 ${newValue.imageSourceTimestamp}---${vllmData.messageSourceTimestamp}") + BridgeServiceManager.invokeVlmData(VlmData(vllmData.id,vllmData.message,newValue.image)) + } + } + } + private var vllmData: VlmMessageData by Delegates.observable(VlmMessageData(0.0,0,"")) { _, oldValue, newValue -> + if (oldValue != newValue) { + if(newValue.messageSourceTimestamp== vllmImageData.imageSourceTimestamp){ + // 图片先来 发送message和图片 + BridgeServiceManager.invokeVlmData(VlmData(newValue.id,newValue.message, + vllmImageData.image) + ) + CallerLogger.d(TAG,"messsage后来 图片先来 发送message和图片 ${newValue.message}----${newValue.messageSourceTimestamp}---${newValue.id}") + }else{ + // message 先来 单独发送message 图片来了后 再次发送出去 + BridgeServiceManager.invokeVlmData(VlmData(newValue.id,newValue.message,null)) + CallerLogger.d(TAG,"message先来 图片后来 发送message ${newValue.message}---${newValue.messageSourceTimestamp}---${newValue.id}") + } + } + } + + + override fun onVllm(sourceTimestamp: Double, vllm: Vlm.VLLMObject) { + if(this.vllmData.id!=vllm.workZone.id){ + this.vllmData = VlmMessageData(sourceTimestamp,vllm.workZone.id,vllm.workZone.sceneExplantion) + } + } + + override fun onVllmImage(sourceTimestamp: Double, image: ByteArray) { + this.vllmImageData = VlmImageData(sourceTimestamp,image) + } +} \ No newline at end of file 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 0d0219dd1d..51d39aca43 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 @@ -1,6 +1,8 @@ package com.mogo.och.common.module.debug import android.content.Intent +import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.os.Environment import android.os.SystemClock import chassis.Chassis @@ -8,6 +10,7 @@ import chassis.Chassis.DoorNumber import chassis.VehicleStateOuterClass import com.amap.api.maps.model.LatLng import com.google.gson.reflect.TypeToken +import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.map.MogoLocation @@ -24,6 +27,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02Lis import com.mogo.eagle.core.function.call.autopilot.CallerChassisStatesListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerVlmManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapRomaListener @@ -34,24 +38,25 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.och.common.module.R import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.biz.order.OrderManager import com.mogo.och.common.module.debug.location.MogoLocationExit import com.mogo.och.common.module.manager.loop.BizLoopManager -//import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager -//import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil -//import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil import com.mogo.och.common.module.view.DebugFloatWindow import com.mogo.och.common.module.wigets.media.MediaBeanManager import com.zhjt.mogo.adas.data.bean.AutopilotStatistics import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg +import vllm.Vlm import java.io.BufferedReader +import java.io.ByteArrayOutputStream import java.io.File import java.io.FileInputStream import java.io.IOException import java.io.InputStreamReader + object DebugDataDispatch { const val TAG = "DebugDataDispatch" @@ -73,6 +78,8 @@ object DebugDataDispatch { const val ota = "ota" const val video = "video" const val mediaMusic = "mediaAndMusic" + const val vlmMessage = "vlmMessage" + const val vlmImage = "vlmImage" // 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" @@ -89,7 +96,8 @@ object DebugDataDispatch { // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "showDebugView" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "scanner" --es qrInfo "" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "ota" --ei "ota" 1 -// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "video" --ei "video" 1 --es url "rtmp://video.zhidaozhixing.com/live/861130041693196C_2" +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "vlmMessage" --es message "前方100米有道路施工,施工长度100米,影响第1、2车道通行。" --ei id 128 --ef time 1880.0 +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "vlmImage" --ef time 1880.0 val ROOT_PATH = @@ -102,6 +110,25 @@ object DebugDataDispatch { } when (type) { + vlmMessage -> { + val time = intent.getFloatExtra("time",0f) + val id = intent.getIntExtra("id",0) + val message = intent.getStringExtra("message") + val newBuilder = Vlm.VLLMObject.newBuilder() + val build = newBuilder.workZoneBuilder.setId(id).setSceneExplantion(message).build() + newBuilder.workZone = build + CallerVlmManager.invokeVllm(time.toDouble(),newBuilder.build()) + } + vlmImage -> { + val time = intent.getFloatExtra("time",0f) + BizLoopManager.runInIoThread{ + val bitmap = BitmapFactory.decodeResource(AbsMogoApplication.getApp().resources, R.drawable.common_debug) + val stream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream) + val byteArray = stream.toByteArray() + CallerVlmManager.invokeVllmImage(time.toDouble(),byteArray) + } + } mediaMusic -> { val musicList = MediaBeanManager.getMusicList() val mediaList = MediaBeanManager.getMediaList() diff --git a/OCH/common/common/src/debug/res/drawable/common_debug.webp b/OCH/common/common/src/debug/res/drawable/common_debug.webp new file mode 100644 index 0000000000..9f79104dce Binary files /dev/null and b/OCH/common/common/src/debug/res/drawable/common_debug.webp differ diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt index 14b452a186..8d378f1ce0 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt @@ -1,6 +1,8 @@ package com.mogo.och.common.module.biz.birdge import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.och.common.module.biz.birdge.data.RoadMsg +import com.mogo.och.common.module.biz.birdge.data.VlmData interface BridgeListener { /** @@ -15,4 +17,9 @@ interface BridgeListener { fun onTrajectoryDistanceListener(distance: Double){} fun onTrajectoryPointsAndDistanceListener(trajectoryList: MutableList,distance: Double){} + + + fun onVlmDataListener(vlmData: VlmData){} + + fun onNdeDataListener(title: String, desc: String, sortedList: List) {} } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/data/RoadMsg.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/data/RoadMsg.kt new file mode 100644 index 0000000000..5551bc498f --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/data/RoadMsg.kt @@ -0,0 +1,8 @@ +package com.mogo.och.common.module.biz.birdge.data + +data class RoadMsg( + var arrowType: Int, // 车道类型,如直行201(详情参考文件:message_pad.proto) + var laneNum: Int,// 车道号 + var isRecommend: Boolean,// 是否是推荐车道 + var isCheLong: Boolean// 是否有车龙,代表拥堵、行驶缓慢 +) \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/data/VlmData.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/data/VlmData.kt new file mode 100644 index 0000000000..5c8b1e4fa7 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/data/VlmData.kt @@ -0,0 +1,28 @@ +package com.mogo.och.common.module.biz.birdge.data + +data class VlmData(val id:Int?,val message:String?,var image: ByteArray?) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as VlmData + + if (id != other.id) return false + if (message != other.message) return false + if (image != null) { + if (other.image == null) return false + if (!image.contentEquals(other.image)) return false + } else if (other.image != null) return false + + return true + } + + override fun hashCode(): Int { + return id ?: 0 + } + + override fun toString(): String { + return "VlmData(id=$id, message=$message)" + } + +} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/EnvManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/EnvManager.kt new file mode 100644 index 0000000000..89089e568a --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/EnvManager.kt @@ -0,0 +1,45 @@ +package com.mogo.och.common.module.manager + +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils + +object EnvManager { + fun isB1(): Boolean { + return AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) + } + + fun isB1Driver(): Boolean { + return isB1() && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + + fun isB1Passenger(): Boolean { + return isB1() && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + } + + fun isB2(): Boolean { + return AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) + } + + fun isB2Driver(): Boolean { + return isB2() && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + + fun isB2Passenger(): Boolean { + return isB2() && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + } + + fun isT1T2(): Boolean { + return AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) + } + + fun isT1T2Driver(): Boolean { + return isT1T2() && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + + fun isT1T2Passenger(): Boolean { + return isT1T2() && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + } + + + +} \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt index 7285f1811c..039c33d7c3 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/PM2BaseFragment.kt @@ -10,6 +10,7 @@ import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.UriUtils +import com.mogo.och.common.module.biz.birdge.data.RoadMsg import com.mogo.och.common.module.biz.media.MediaManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.transform.OchTransform @@ -126,11 +127,11 @@ class PM2BaseFragment : CallerMapRoadListenerManager.invokeCrossDevice(true) } test3.onClick { - val one = AIMessage.RoadMsg(201,1,true,false) - val two = AIMessage.RoadMsg(202,2,false,false) - val three = AIMessage.RoadMsg(203,3,false,true) + val one = RoadMsg(201,1,true,false) + val two = RoadMsg(202,2,false,false) + val three = RoadMsg(203,3,false,true) - val sortedList = ArrayList() + val sortedList = ArrayList() sortedList.add(one) sortedList.add(two) sortedList.add(three) diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AINDERoadAdapter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AINDERoadAdapter.kt index 51893534b4..9492b7f358 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AINDERoadAdapter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AINDERoadAdapter.kt @@ -10,14 +10,14 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView +import com.mogo.och.common.module.biz.birdge.data.RoadMsg import com.mogo.och.shuttle.weaknet.passenger.R -import com.mogo.och.shuttle.weaknet.passenger.ui.mind.bean.AIMessage class AINDERoadAdapter(private val context: Context): RecyclerView.Adapter() { - private var roadList: List?= null + private var roadList: List?= null - fun setData(list: List){ + fun setData(list: List){ roadList = list notifyDataSetChanged() } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/bean/AssistantMessage.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/bean/AssistantMessage.kt index bdbaaa8155..ab2dcb2585 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/bean/AssistantMessage.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/bean/AssistantMessage.kt @@ -3,6 +3,8 @@ package com.mogo.och.shuttle.weaknet.passenger.ui.mind.bean import android.os.CountDownTimer import android.util.Log import com.mogo.eagle.core.data.v2x.RoadV2NEventType +import com.mogo.och.common.module.biz.birdge.data.RoadMsg +import com.mogo.och.common.module.biz.birdge.data.VlmData import kotlin.math.floor @@ -175,11 +177,11 @@ sealed class AIMessage( var roadList: List ): AIMessage(id,title) - data class RoadMsg( - var arrowType: Int, // 车道类型,如直行201(详情参考文件:message_pad.proto) - var laneNum: Int,// 车道号 - var isRecommend: Boolean,// 是否是推荐车道 - var isCheLong: Boolean// 是否有车龙,代表拥堵、行驶缓慢 - ) + data class AiVlmData( + override val id: String, + override val title: String, + var desc: String, + var vlmData: VlmData + ):AIMessage(id,title) } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/data/NDEViewModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/data/NDEViewModel.kt index a0f18dd3ea..bb77504f17 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/data/NDEViewModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/data/NDEViewModel.kt @@ -3,85 +3,33 @@ package com.mogo.och.shuttle.weaknet.passenger.ui.mind.data import androidx.lifecycle.ViewModel import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.biz.birdge.data.RoadMsg import com.mogo.och.shuttle.weaknet.passenger.ui.mind.AIMessageManager import com.mogo.och.shuttle.weaknet.passenger.ui.mind.bean.AIMessage -import mogo.telematics.pad.MessagePad.TrackedObject /** * 车龙信息 */ -class NDEViewModel: ViewModel(), IMoGoAutopilotIdentifyListener { +class NDEViewModel: ViewModel(), BridgeListener { companion object{ private const val TAG = "NDEViewModel" } - private var lastMap2 = HashMap() - private var lastTime = 0L - fun init(){ - CallerAutopilotIdentifyListenerManager.addListener(TAG, this) + BridgeManager.addBridgeListener(TAG,this) } - override fun onAutopilotIdentifyDataUpdate(trafficData: List?){ - super.onAutopilotIdentifyDataUpdate(trafficData) - handleCheLong(trafficData) + override fun onCleared() { + super.onCleared() + BridgeManager.removeBridgeListener(TAG) } - private fun handleCheLong(trafficData: List?) { - var hasCheLong = false - var isNewData = false - val roadMsgList = ArrayList() - val curMap = HashMap() - if (lastTime > 0 && System.currentTimeMillis() - lastTime > 60000) { - lastMap2.clear()// 清除上次车龙事件的缓存 - } - var lastLocStr: String? = "" - trafficData?.forEach { obj -> - if (obj.type == 707) {// 当前方向所有车道 - if (obj.polygonCount > 1) {// 当次数据有车龙事件 - lastLocStr = lastMap2[obj.laneNum] - // 1. 上次无车龙但此次有车龙,认为是新车龙事件 - // 2. 两次都有车龙,则判断车龙的长度是否相同 - if (lastLocStr == null || lastLocStr == "0" || lastLocStr != "${obj.polygonList[0]}-${obj.polygonList[obj.polygonCount - 1]}") { - isNewData = true - } - hasCheLong = true - - // key: 车道号,value: 非0代表有车龙且首、尾两个点可计算车龙长度 - curMap[obj.laneNum] = - "${obj.polygonList[0]}-${obj.polygonList[obj.polygonCount - 1]}" - } else {// 当次没有车龙 - if (lastMap2[obj.laneNum] != null && lastMap2[obj.laneNum] != "0") {// 3. 上次有车龙,这次无车龙 - isNewData = true - } - // key: 车道号,value: 0代表无车龙 - curMap[obj.laneNum] = "0" - } - // 保存所有车道信息 - roadMsgList.add( - AIMessage.RoadMsg( - obj.arrowType, - laneNum = obj.laneNum, - isRecommend = obj.suggestedLanes, - isCheLong = obj.polygonCount > 1 - ) - ) - } - } - if (isNewData) { - // 清除上次车道信息 - lastMap2.clear() - if (hasCheLong) { - // 缓存当次车龙事件所有车道信息 - lastMap2.putAll(curMap) - lastTime = System.currentTimeMillis() - - val sortedList = roadMsgList.sortedWith(compareByDescending { it.laneNum }) - val ndeEvent = AIMessage.NDEData(System.currentTimeMillis().toString(),"路口车龙","前方路口有车龙",sortedList) - AIMessageManager.post(ndeEvent) - } - } + override fun onNdeDataListener(title: String, desc: String, sortedList: List) { + val ndeEvent = AIMessage.NDEData(System.currentTimeMillis().toString(),title,desc,sortedList) + AIMessageManager.post(ndeEvent) } } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b1/layout/shuttle_p_weak_jl_base_fragment.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b1/layout/shuttle_p_weak_jl_base_fragment.xml index 7d8eee6561..a4491c052c 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b1/layout/shuttle_p_weak_jl_base_fragment.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b1/layout/shuttle_p_weak_jl_base_fragment.xml @@ -45,6 +45,7 @@ app:layout_constraintTop_toTopOf="parent" /> + + diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt index 50d8d9a1a6..5b1e8c33da 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt @@ -26,6 +26,10 @@ import com.mogo.och.unmanned.passenger.ui.aiview.adapter.AIMessageAdapter import com.mogo.och.unmanned.passenger.ui.aiview.adapter.OnItemClickListener import com.mogo.och.unmanned.passenger.ui.aiview.adapter.PaddingItemDecoration import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.och.unmanned.passenger.ui.aiview.data.AutomaticExplorationViewModel +import com.mogo.och.unmanned.passenger.ui.aiview.data.NDEViewModel +import com.mogo.och.unmanned.passenger.ui.aiview.data.RoadCrossRoamViewModel +import com.mogo.och.unmanned.passenger.ui.aiview.data.RoadV2NEventViewModel import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxt_p_ai.view.aiMotionLayout import kotlinx.android.synthetic.main.taxt_p_ai.view.ivIcon @@ -47,11 +51,10 @@ class AiView @JvmOverloads constructor( private var viewModel:AIViewModel?=null -// private var pncActionsModel:PNCActionsViewModel ?= null - private var roadV2NEventModel:RoadV2NEventViewModel ?= null - private var roadCrossRoamModel:RoadCrossRoamViewModel ?= null - private var automaticExplorationModel:AutomaticExplorationViewModel ?= null - private var ndeViewModel: NDEViewModel ?= null + private var roadV2NEventModel: RoadV2NEventViewModel?= null + private var roadCrossRoamModel: RoadCrossRoamViewModel?= null + private var automaticExplorationModel: AutomaticExplorationViewModel?= null + private var ndeViewModel: NDEViewModel?= null private var aiAnimator: BigFrameAnimatorContainer?=null private var aiAnimatorBg: BigFrameAnimatorContainer?=null @@ -105,7 +108,6 @@ class AiView @JvmOverloads constructor( if(aiAnimator==null) { aiAnimator = BigFrameAnimatorContainer(R.array.ai_animator, 31, ivIcon) } -// aiAnimator?.start() ivIcon.onClick { viewModel?.onWakeUp() diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt index 665e2f7b04..1e833e1987 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt @@ -26,6 +26,7 @@ class AIMessageAdapter : ListAdapter(MessageDiffCa AIMessage.TYPE_AUTOMATIC_EXPLORATION -> AutomaticExplorationViewHolder(inflater.inflate(R.layout.item_ai_automatic_exploration,parent,false)) AIMessage.TYPE_EVALUATE -> EvaluateViewViewHolder(inflater.inflate(R.layout.taxi_p_evaluate,parent,false)) AIMessage.TYPE_NDE -> NDEViewHolder(inflater.inflate(R.layout.item_ai_nde_event,parent,false)) + AIMessage.TYPE_VLM -> VlmViewHolder(inflater.inflate(R.layout.item_ai_vlm_action,parent,false)) else -> throw IllegalArgumentException("Invalid view type") } } @@ -44,6 +45,7 @@ class AIMessageAdapter : ListAdapter(MessageDiffCa is AIMessage.AutomaticExploration -> AIMessage.TYPE_AUTOMATIC_EXPLORATION is AIMessage.EvaluateData -> AIMessage.TYPE_EVALUATE is AIMessage.NDEData -> AIMessage.TYPE_NDE + is AIMessage.AiVlmData -> AIMessage.TYPE_VLM else -> AIMessage.TYPE_EVENT } } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt index c248534484..1adf8c3853 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt @@ -6,7 +6,6 @@ import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.content.Context import android.graphics.Rect -import android.text.TextUtils import android.util.Log import android.view.View import android.view.animation.LinearInterpolator @@ -14,6 +13,7 @@ import android.widget.FrameLayout import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView +import androidx.appcompat.widget.AppCompatImageView import androidx.core.content.ContextCompat import androidx.core.graphics.toColorInt import androidx.recyclerview.widget.LinearLayoutManager @@ -28,7 +28,9 @@ import com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventLivePlayView import com.mogo.eagle.core.function.view.MapRoamView import com.mogo.eagle.core.function.view.RoadCrossRoamListAdapter import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp import com.mogo.eagle.core.utilcode.mogo.glide.GlideImageLoader +import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView import com.mogo.eagle.core.utilcode.util.DateTimeUtils import com.mogo.och.common.module.utils.FrameAnimatorContainer @@ -38,8 +40,6 @@ import com.mogo.och.unmanned.taxi.passenger.R import com.youth.banner.Banner import com.youth.banner.indicator.CircleIndicator import com.youth.banner.transformer.ScaleInTransformer -import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_great -import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_low import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -85,6 +85,23 @@ abstract class MessageViewHolder(view: View) : RecyclerView.ViewHolder(view) { .placeholder(R.drawable.icon_pic_holder) .error(R.drawable.icon_pic_error) // .error(R.drawable.icon_marker_window_place_holder) +// .placeholder(R.drawable.icon_marker_window_place_holder) + .into(this) + + } + } + fun ImageView.showOrHideWithByteArray(image: ByteArray?) { + if (image==null) { + visibility = View.GONE + } else { + visibility = View.VISIBLE + //optionalTransform(new GlideRoundedCornersTransform(30f, GlideRoundedCornersTransform.CornerType.LEFT)) + Glide.with(this) + .load(image) + .optionalTransform(GlideRoundedCornersTransform(18f, GlideRoundedCornersTransform.CornerType.ALL)) + .placeholder(R.drawable.icon_pic_holder) + .error(R.drawable.icon_pic_error) +// .error(R.drawable.icon_marker_window_place_holder) // .placeholder(R.drawable.icon_marker_window_place_holder) .into(this) @@ -434,6 +451,21 @@ class NDEViewHolder(binding: View) : MessageViewHolder(binding){ } +class VlmViewHolder(binding: View) : MessageViewHolder(binding){ + + private var tvNdeTitle: TextView = binding.findViewById(R.id.tvVlmMessage) + private var acivVlmImage: AppCompatImageView = binding.findViewById(R.id.acivVlmImage) + + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.AiVlmData){ + tvNdeTitle.text = item.vlmData.message + acivVlmImage.showOrHideWithByteArray(item.vlmData.image) + } + } + +} + private class NoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) { override fun canScrollVertically(): Boolean { return false diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AINDERoadAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AINDERoadAdapter.kt index 0d2ec97ca1..dbb8050c2d 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AINDERoadAdapter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AINDERoadAdapter.kt @@ -10,14 +10,14 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage +import com.mogo.och.common.module.biz.birdge.data.RoadMsg import com.mogo.och.unmanned.taxi.passenger.R class AINDERoadAdapter(private val context: Context): RecyclerView.Adapter() { - private var roadList: List?= null + private var roadList: List?= null - fun setData(list: List){ + fun setData(list: List){ roadList = list notifyDataSetChanged() } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt index 2b7ca9a3e4..b6038b0efe 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt @@ -3,6 +3,8 @@ package com.mogo.och.unmanned.passenger.ui.aiview.bean import android.os.CountDownTimer import android.util.Log import com.mogo.eagle.core.data.v2x.RoadV2NEventType +import com.mogo.och.common.module.biz.birdge.data.RoadMsg +import com.mogo.och.common.module.biz.birdge.data.VlmData import kotlin.math.floor @@ -27,6 +29,7 @@ sealed class AIMessage( const val TYPE_AUTOMATIC_EXPLORATION = 9 const val TYPE_EVALUATE = 10 const val TYPE_NDE = 11 + const val TYPE_VLM = 12 } data class Scan( @@ -177,11 +180,11 @@ sealed class AIMessage( var roadList: List ):AIMessage(id,title) - data class RoadMsg( - var arrowType: Int, // 车道类型,如直行201(详情参考文件:message_pad.proto) - var laneNum: Int,// 车道号 - var isRecommend: Boolean,// 是否是推荐车道 - var isCheLong: Boolean// 是否有车龙,代表拥堵、行驶缓慢 - ) + data class AiVlmData( + override val id: String, + override val title: String, + var desc: String, + var vlmData: VlmData + ):AIMessage(id,title) } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/AutomaticExplorationViewModel.kt similarity index 97% rename from OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt rename to OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/AutomaticExplorationViewModel.kt index 153b91e0d2..89b41098df 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/AutomaticExplorationViewModel.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.passenger.ui.aiview +package com.mogo.och.unmanned.passenger.ui.aiview.data import android.os.CountDownTimer import androidx.lifecycle.ViewModel @@ -10,11 +10,11 @@ import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.data.taxi.BaseOrderBean import com.mogo.och.data.taxi.TaxiOrderStatusEnum +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage import com.mogo.och.unmanned.taxi.utils.order.OrderListener import com.mogo.och.unmanned.taxi.utils.order.OrderModel diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/NDEViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/NDEViewModel.kt new file mode 100644 index 0000000000..ee6bf64d4d --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/NDEViewModel.kt @@ -0,0 +1,39 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.data + +import androidx.lifecycle.ViewModel +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.biz.birdge.data.RoadMsg +import com.mogo.och.common.module.biz.birdge.data.VlmData +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage + +class NDEViewModel: ViewModel(), BridgeListener { + + companion object{ + private const val TAG = "NDEViewModel" + } + + fun init(){ + BridgeManager.addBridgeListener(TAG,this) + } + + override fun onCleared() { + super.onCleared() + BridgeManager.removeBridgeListener(TAG) + } + + + override fun onVlmDataListener(vlmData: VlmData){ + val ndeEvent = AIMessage.AiVlmData(vlmData.id.toString(),"","",vlmData) + AIMessageManager.post(ndeEvent) + } + + override fun onNdeDataListener(title: String, desc: String, sortedList: List) { + val ndeEvent = AIMessage.NDEData(System.currentTimeMillis().toString(),title,desc,sortedList) + AIMessageManager.post(ndeEvent) + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/PNCActionsViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/PNCActionsViewModel.kt similarity index 98% rename from OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/PNCActionsViewModel.kt rename to OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/PNCActionsViewModel.kt index c3875ae4f7..33fc356fed 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/PNCActionsViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/PNCActionsViewModel.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.passenger.ui.aiview +package com.mogo.och.unmanned.passenger.ui.aiview.data import androidx.lifecycle.ViewModel import com.mogo.eagle.core.data.autopilot.pnc.PncActionsHelper @@ -6,10 +6,9 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsL import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage import mogo.telematics.pad.MessagePad diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/RoadCrossRoamViewModel.kt similarity index 94% rename from OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt rename to OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/RoadCrossRoamViewModel.kt index c7f836ed4d..fd6eb8a2f4 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/RoadCrossRoamViewModel.kt @@ -1,7 +1,6 @@ -package com.mogo.och.unmanned.passenger.ui.aiview +package com.mogo.och.unmanned.passenger.ui.aiview.data import android.content.Context -import android.view.View import androidx.lifecycle.ViewModel import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig @@ -14,6 +13,7 @@ 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.util.ToastUtils +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage class RoadCrossRoamViewModel: ViewModel(), IMoGoMapRoadListener { @@ -67,7 +67,7 @@ class RoadCrossRoamViewModel: ViewModel(), IMoGoMapRoadListener { AIAssist.getInstance(mContext).speakTTSVoiceWithLevel(disStr, AIAssist.NEW_LEVEL_2) } CallerServicesEventManager.updateServicesNum(CallerServicesEventManager.ServiceType.ROAD) - AIMessageManager.post(AIMessage.RoadCrossRoam(System.currentTimeMillis().toString(),"")) + AIMessageManager.post(AIMessage.RoadCrossRoam(System.currentTimeMillis().toString(), "")) } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadV2NEventViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/RoadV2NEventViewModel.kt similarity index 95% rename from OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadV2NEventViewModel.kt rename to OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/RoadV2NEventViewModel.kt index b850341ea7..bc7fc909fd 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadV2NEventViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/data/RoadV2NEventViewModel.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.passenger.ui.aiview +package com.mogo.och.unmanned.passenger.ui.aiview.data import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.ViewModel @@ -11,6 +11,7 @@ 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.ui.utils.HmiActionLog import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_vlm_action.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_vlm_action.xml new file mode 100644 index 0000000000..a38c470646 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_vlm_action.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/build.gradle b/core/function-impl/mogo-core-function-devatools-rviz/build.gradle index cd6be6e0b5..19d058e590 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/build.gradle +++ b/core/function-impl/mogo-core-function-devatools-rviz/build.gradle @@ -88,5 +88,7 @@ dependencies { implementation("org.connectbot:jbcrypt:1.0.2") //----------------SSH end--------------------- implementation 'org.conscrypt:conscrypt-android:2.5.2' + + implementation 'com.belerweb:pinyin4j:2.5.1' } diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml index 7d1e9d6a3e..d8a81d16c5 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml @@ -22,6 +22,16 @@ android:theme="@style/Theme.AppCompat.Light.NoActionBar" android:windowSoftInputMode="adjustPan" /> + + diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt index 9ae4f5d385..6407cbcabd 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt @@ -75,8 +75,8 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw val divider = DividerItemDecoration(context, linearLayoutManager.orientation) rvLineList.addItemDecoration(divider) val params: WindowManager.LayoutParams = window!!.attributes - params.width = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_280)) - params.height = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_250)) + params.width = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_1200)) + params.height = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_1000)) window?.attributes = params window?.setBackgroundDrawable(null) initEvent() @@ -108,28 +108,28 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw // 处理Taxi // 处理BUS包含:JV、KW、FT、SW -// CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode?.let { -// TrajectoryApiClient.queryTrajectoryList( -// this, -// VehicleConfigData.getCarType().name, -// it, -// object : -// NetworkCallback> { -// override fun onSuccess(data: ArrayList) { -// setSelectLineData(data) -// tvLoading.hide() -// } -// -// override fun onError(msg: String) { -// ToastUtils.showLong("获取 Bus 站点列表异常,异常原因:${msg}") -// tvLoading.show("获取 Bus 站点列表异常") -// } -// } -// ) -// } ?: let { -// ToastUtils.showLong("获取 Bus 站点列表异常,获取当前未知失败,请开启定位权限") -// tvLoading.show("获取 Bus 站点列表异常,请开启定位权限") -// } + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode?.let { + TrajectoryApiClient.queryTrajectoryList( + this, + VehicleConfigData.getCarType().name, + it, + object : + NetworkCallback> { + override fun onSuccess(data: ArrayList) { + setSelectLineData(data) + tvLoading.hide() + } + + override fun onError(msg: String) { + ToastUtils.showLong("获取 Bus 站点列表异常,异常原因:${msg}") + tvLoading.show("获取 Bus 站点列表异常") + } + } + ) + } ?: let { + ToastUtils.showLong("获取 Bus 站点列表异常,获取当前未知失败,请开启定位权限") + tvLoading.show("获取 Bus 站点列表异常,请开启定位权限") + } } //取消 @@ -186,6 +186,7 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw } override fun dismiss() { + mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED scopeQueryTrajectoryList.cancel() mActivity = null super.dismiss() @@ -198,7 +199,7 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw } override fun getLifecycle(): Lifecycle { - return lifecycle + return mLifecycleRegistry } diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt index 957293edbb..51f2142473 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt @@ -5,7 +5,7 @@ import com.mogo.eagle.core.data.EnvConfig object MisHost { private const val HOST_QA = "https://eagle-qa.zhidaozhixing.com/" - private const val HOST_RELEASE = "https://eagle-mis-v6.zhidaozhixing.com/" + private const val HOST_RELEASE = "https://eagle-mis.zhidaozhixing.com/" private const val LOGIN_HOST_QA = "https://carlife-test.zhidaohulian.com/qa/eagle/login/index.html?deviceId=" diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt index 584d18a470..38e9079bf7 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt @@ -17,119 +17,119 @@ object TrajectoryApiClient { private val apiService: TrajectoryApiService = NetworkManager.getInstance().createService(TrajectoryApiService::class.java, baseUrl) -// /** -// * 查询 Bus&Taxi 有轨迹的QA线路列表 -// */ -// fun queryTrajectoryList( -// owner: LifecycleOwner, -// carType: String, -// cityCode: String, -// callback: NetworkCallback> -// ) { -// val reqBody = TrajectoryLisReq() -// reqBody.page = 1 -// reqBody.pageSize = 1000 -// reqBody.cityCode = cityCode -// -// val observable = if (carType == "TAXI") { -// apiService.queryTaxiTrajectoryList(reqBody) -// } else { -// apiService.queryBusTrajectoryList(reqBody) -// } -// -// NetworkManager.getInstance() -// .sendRequest( -// observable, -// owner, -// object : -// NetworkManager.NetworkCallback>> { -// override fun onSuccess(response: BaseResponse>?) { -// Log.d(TAG, "查询 $carType 有轨迹的QA线路列表:$response") -// // 处理网络请求成功的响应 -// response?.result?.let { callback.onSuccess(it) } -// } -// -// override fun onError(throwable: String) { -// Log.e(TAG, "查询 $carType 有轨迹的QA线路列表:$throwable") -// // 处理网络请求失败的情况 -// callback.onError(throwable) -// } -// } -// ) -// } -// -// -// /** -// * 查询 Bus&Taxi 线路对应的站点 -// */ -// fun querySiteList( -// owner: LifecycleOwner, -// carType: String, -// lineId: Int, -// callback: NetworkCallback> -// ) { -// val observable = if (carType == "TAXI") { -// apiService.queryTaxiSiteList(lineId) -// } else { -// apiService.queryBusSiteList(lineId) -// } -// -// NetworkManager.getInstance() -// .sendRequest( -// observable, -// owner, -// object : -// NetworkManager.NetworkCallback>> { -// override fun onSuccess(response: BaseResponse>?) { -// Log.d(TAG, "查询 $carType 线路对应的站点:$response") -// // 处理网络请求成功的响应 -// response?.result?.let { callback.onSuccess(it) } -// } -// -// override fun onError(throwable: String) { -// Log.e(TAG, "查询 $carType 线路对应的站点:$throwable") -// // 处理网络请求失败的情况 -// callback.onError(throwable) -// } -// } -// ) -// } -// -// /** -// * 查询 Bus&Taxi 线路对应的轨迹 -// */ -// fun queryTrajectoryInfo( -// owner: LifecycleOwner, -// carType: String, -// reqBody: TrajectoryInfoReq, -// callback: NetworkCallback -// ) { -// -// val observable = if (carType == "TAXI") { -// apiService.queryTaxiTrajectoryInfo(reqBody) -// } else { -// apiService.queryBusTrajectoryInfo(reqBody) -// } -// -// NetworkManager.getInstance() -// .sendRequest( -// observable, -// owner, -// object : -// NetworkManager.NetworkCallback> { -// override fun onSuccess(response: BaseResponse?) { -// Log.d(TAG, "查询 $carType 线路对应的轨迹:$response") -// // 处理网络请求成功的响应 -// response?.result?.let { callback.onSuccess(it) } -// } -// -// override fun onError(throwable: String) { -// Log.e(TAG, "查询 $carType 线路对应的轨迹:$throwable") -// // 处理网络请求失败的情况 -// callback.onError(throwable) -// } -// } -// ) -// } + /** + * 查询 Bus&Taxi 有轨迹的QA线路列表 + */ + fun queryTrajectoryList( + owner: LifecycleOwner, + carType: String, + cityCode: String, + callback: NetworkCallback> + ) { + val reqBody = TrajectoryLisReq() + reqBody.page = 1 + reqBody.pageSize = 1000 + reqBody.cityCode = cityCode + + val observable = if (carType == "TAXI") { + apiService.queryTaxiTrajectoryList(reqBody) + } else { + apiService.queryBusTrajectoryList(reqBody) + } + + NetworkManager.getInstance() + .sendRequest( + observable, + owner, + object : + NetworkManager.NetworkCallback>> { + override fun onSuccess(response: BaseResponse>?) { + Log.d(TAG, "查询 $carType 有轨迹的QA线路列表:$response") + // 处理网络请求成功的响应 + response?.result?.let { callback.onSuccess(it) } + } + + override fun onError(throwable: String) { + Log.e(TAG, "查询 $carType 有轨迹的QA线路列表:$throwable") + // 处理网络请求失败的情况 + callback.onError(throwable) + } + } + ) + } + + + /** + * 查询 Bus&Taxi 线路对应的站点 + */ + fun querySiteList( + owner: LifecycleOwner, + carType: String, + lineId: Int, + callback: NetworkCallback> + ) { + val observable = if (carType == "TAXI") { + apiService.queryTaxiSiteList(lineId) + } else { + apiService.queryBusSiteList(lineId) + } + + NetworkManager.getInstance() + .sendRequest( + observable, + owner, + object : + NetworkManager.NetworkCallback>> { + override fun onSuccess(response: BaseResponse>?) { + Log.d(TAG, "查询 $carType 线路对应的站点:$response") + // 处理网络请求成功的响应 + response?.result?.let { callback.onSuccess(it) } + } + + override fun onError(throwable: String) { + Log.e(TAG, "查询 $carType 线路对应的站点:$throwable") + // 处理网络请求失败的情况 + callback.onError(throwable) + } + } + ) + } + + /** + * 查询 Bus&Taxi 线路对应的轨迹 + */ + fun queryTrajectoryInfo( + owner: LifecycleOwner, + carType: String, + reqBody: TrajectoryInfoReq, + callback: NetworkCallback + ) { + + val observable = if (carType == "TAXI") { + apiService.queryTaxiTrajectoryInfo(reqBody) + } else { + apiService.queryBusTrajectoryInfo(reqBody) + } + + NetworkManager.getInstance() + .sendRequest( + observable, + owner, + object : + NetworkManager.NetworkCallback> { + override fun onSuccess(response: BaseResponse?) { + Log.d(TAG, "查询 $carType 线路对应的轨迹:$response") + // 处理网络请求成功的响应 + response?.result?.let { callback.onSuccess(it) } + } + + override fun onError(throwable: String) { + Log.e(TAG, "查询 $carType 线路对应的轨迹:$throwable") + // 处理网络请求失败的情况 + callback.onError(throwable) + } + } + ) + } } diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt index 8539593853..51ab7c1cd3 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt @@ -1,12 +1,11 @@ package com.mogo.module.common.net.mis.trajectory.net - -import com.mogo.eagle.core.data.BaseResponse import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryInfo import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryInfoReq import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryLisReq import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryListInfo import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectorySiteInfo +import com.zhjt.mogo_core_function_devatools.rviz.net.BaseResponse import io.reactivex.Observable import retrofit2.http.Body import retrofit2.http.GET diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/activity/AutopilotCheckAct.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/activity/AutopilotCheckAct.kt new file mode 100644 index 0000000000..fd67ac96d6 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/activity/AutopilotCheckAct.kt @@ -0,0 +1,16 @@ +package com.zhjt.mogo_core_function_devatools.rviz.ui.activity + +import android.os.Bundle +import com.zhjt.mogo_core_function_devatools.rviz.R +import com.zhjt.mogo_core_function_devatools.rviz.common.base.BaseActivity +import kotlinx.android.synthetic.main.layout_autopilot_check.viewCheckAutopilot + +class AutopilotCheckAct: BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?){ + super.onCreate(savedInstanceState) + setContentView(R.layout.layout_autopilot_check) + viewCheckAutopilot.setActivity(this) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt index 71c16da4fe..cbee28f7a8 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import chassis.Chassis import chassis.VehicleStateOuterClass +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.utilcode.util.ThreadUtils @@ -39,10 +40,12 @@ import com.zhjt.mogo_core_function_devatools.rviz.dialog.SelectAutopilotLineDial import com.zhjt.mogo_core_function_devatools.rviz.dialog.adapter.ConsoleAdapter import com.zhjt.mogo_core_function_devatools.rviz.net.NetworkCallback import com.zhjt.mogo_core_function_devatools.rviz.net.TrajectoryApiClient +import com.zhjt.mogo_core_function_devatools.rviz.utils.PinYinUtil import com.zhjt.mogo_core_function_devatools.rviz.widgets.ros.TelematicsSubscriberEventKey import com.zhjt.mogo_core_function_devatools.rviz.widgets.ros.TopicSubscriberEventKey import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg import java.util.LinkedList @@ -58,430 +61,432 @@ class CheckAutopilotView @JvmOverloads constructor( } -// private val scopeUploadReportInfo = CoroutineScope(Dispatchers.Main) -// -// private val mLifecycleRegistry = LifecycleRegistry(this) -// private var reportMsgInfoSubscriber: CommSubscriber? = -// null -// private var reportMsgErrorSubscriber: CommSubscriber? = -// null -// -// // 当前选择的自动驾驶路线信息 -// var mTrajectoryListInfo: TrajectoryListInfo? = null -// var mTrajectorySiteInfo: List? = null -// var mTrajectoryInfo: TrajectoryInfo? = null -// -// private var selectAutopilotLineDialog: SelectAutopilotLineDialog? = null -// private var mActivity: Activity? = null -// -// -// /** -// * 传给自动驾驶 -// * 1、先下载轨迹信息 -// * @see TelematicsControlApi.sendTrajectoryDownloadReq -// * 2、再启动自动驾驶 -// * @see TelematicsControlApi.requestEnterAutoPilot -// */ -// val mTrajectoryLine = MessagePad.Line.newBuilder() -// -// private val consoleAdapter = -// ConsoleAdapter()//控制台适配器 -// private val consoleList = LinkedList() -// -// private var trajectoryListInfo: TrajectoryListInfo? = null -// -// private var currentAutopilotStatus: Int = 0 //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中,7:平行驾驶中 -// -// @Volatile -// private var speedLimit: Int = 1 -// -// //Warning -// // 自动驾驶效果受影响: -// // 自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 -// //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 -// private val RESULT_AUTOPILOT_INFERIOR = "RESULT_AUTOPILOT_INFERIOR" -// -// // 存在不确定因素 -// // 一般为过渡状态,存在不确定因素,有可能对自动驾驶有微弱影响,需要在pad端显示为黄色告警。 -// //如果偶尔上报该result可忽略,如果频繁上报需联系人员进行排查。 目前仅有RTK无法确认状态事件 -// private val RESULT_SHOW_WARNING = "RESULT_SHOW_WARNING" -// -// // 远程驾驶效果受影响 -// // 远程驾驶部分功能受影响。例如网络高延迟 -// private val RESULT_REMOTEPILOT_INFERIOR = "RESULT_REMOTEPILOT_INFERIOR" -// -// //Error -// // 无法启动自动驾驶 -// private val RESULT_AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE" -// -// // 自动驾驶系统启动失败 -// // 自动驾驶系统启动过程中出错,pad可能无法连接,云端监控可能无法上报 -// private val RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED" -// -// // 自动驾驶效果受影响 -// //自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 -// //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 -// private val RESULT_REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE" -// -// /** -// * 获取控制台上报数据列表 -// */ -// fun getConsoleList(): List { -// return consoleList -// } -// -// fun getTrajectoryListInfo(): TrajectoryListInfo? { -// return trajectoryListInfo -// } -// -// fun getTrackContrail(): TrackContrail? { -// return mTrajectoryInfo?.trackContrail -// } -// -// fun setActivity(activity: Activity) { -// mActivity = activity -// } -// -// // 订阅工控机日志 -// private val consoleObserver: Observer = -// Observer { mogoReportMessage: MogoReportMsg.MogoReportMessage -> -// if (consoleList.size > 1000) { -// consoleList.removeLast() -// } -// if (mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_INFERIOR) -// || mogoReportMessage.resultList.contains(RESULT_SHOW_WARNING) -// || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_INFERIOR) -// || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_DISABLE) -// || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) -// || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_DISABLE) -// ) { -// // 处理底盘超时 -//// if ( -//// !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_DISABLE) -//// || !mogoReportMessage.resultList.equals(RESULT_REMOTEPILOT_INFERIOR) -//// || !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_INFERIOR) -//// ) { -//// btnControlAutoPilot.isChecked = false -//// Log.e(TAG, "进入自动驾驶--失败") -//// } -// -// consoleList.addFirst( -// ReportEntity( -// TimeUtils.getNowString(), -// mogoReportMessage.code, -// mogoReportMessage.msg -// ) -// ) -// } -// if (consoleList.size > 0) { -// consoleAdapter.setData(consoleList) -// } -// } -// -// //订阅到站 -// private val arrivalObserver: Observer = Observer { -// it.let { -// Log.i("arrivalObserver", "CheckAuto页面收到到站回调") -// Log.i("arrivalObserver", "latitude=" + it.endLocation.latitude) -// Log.i("arrivalObserver", "longitude=" + it.endLocation.longitude) -// //取消自动驾驶 -// CallerAutoPilotControlManager.cancelAutoPilot() -// //吐司提示 -// ToastUtils.showShort("您已到达站点") -// } -// } -// -// //订阅工控机日志监控 -// private val reportObserver: Observer = Observer { -// it.let { -// //掉自驾 -// when (it.code) { -// "EMAP_EXIT_AUTOPILOT_FOR_PLANNING",//因planning掉帧强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_LOCATION",//因location掉帧强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS",//因底盘消息掉帧强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_DISTANCE",//因planning起点距离当前过远强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_BRAKE",//制动踏板干预而强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_ACCEL",//加速踏板干预而强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_STEER",//方向盘干预而强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_GEAR_SWITCH",//档位切换干预而强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_NO_RESPONSE",//底盘不响应请求而强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_UNKNOWN",//底盘退出原因未知而强退自动驾驶 -// "IRECORDER_TASK_AUTO"//自动录包任务创建 -// -> { -// //当司机或外界原因导致自动驾驶退出,需要在页面将状态同步显示出来,并将按钮设置为「启动自动驾驶」 -// ThreadUtils.runOnUiThread { -// ToastUtils.showShort("自动驾驶退出") -// btnControlAutoPilot.isEnabled = true -// btnControlAutoPilot.isChecked = false -// } + private val scopeUploadReportInfo = CoroutineScope(Dispatchers.Main) + + private val mLifecycleRegistry = LifecycleRegistry(this) + + + // 当前选择的自动驾驶路线信息 + var mTrajectoryListInfo: TrajectoryListInfo? = null + var mTrajectorySiteInfo: List? = null + var mTrajectoryInfo: TrajectoryInfo? = null + + private var selectAutopilotLineDialog: SelectAutopilotLineDialog? = null + private var mActivity: Activity? = null + + + /** + * 传给自动驾驶 + * 1、先下载轨迹信息 + * @see TelematicsControlApi.sendTrajectoryDownloadReq + * 2、再启动自动驾驶 + * @see TelematicsControlApi.requestEnterAutoPilot + */ + val mTrajectoryLine = MessagePad.Line.newBuilder() + + private val consoleAdapter = + ConsoleAdapter()//控制台适配器 + private val consoleList = LinkedList() + + private var trajectoryListInfo: TrajectoryListInfo? = null + + private var currentAutopilotStatus: Int = 0 //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中,7:平行驾驶中 + + @Volatile + private var speedLimit: Int = 1 + + //Warning + // 自动驾驶效果受影响: + // 自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 + //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 + private val RESULT_AUTOPILOT_INFERIOR = "RESULT_AUTOPILOT_INFERIOR" + + // 存在不确定因素 + // 一般为过渡状态,存在不确定因素,有可能对自动驾驶有微弱影响,需要在pad端显示为黄色告警。 + //如果偶尔上报该result可忽略,如果频繁上报需联系人员进行排查。 目前仅有RTK无法确认状态事件 + private val RESULT_SHOW_WARNING = "RESULT_SHOW_WARNING" + + // 远程驾驶效果受影响 + // 远程驾驶部分功能受影响。例如网络高延迟 + private val RESULT_REMOTEPILOT_INFERIOR = "RESULT_REMOTEPILOT_INFERIOR" + + //Error + // 无法启动自动驾驶 + private val RESULT_AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE" + + // 自动驾驶系统启动失败 + // 自动驾驶系统启动过程中出错,pad可能无法连接,云端监控可能无法上报 + private val RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED" + + // 自动驾驶效果受影响 + //自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 + //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 + private val RESULT_REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE" + + /** + * 获取控制台上报数据列表 + */ + fun getConsoleList(): List { + return consoleList + } + + fun getTrajectoryListInfo(): TrajectoryListInfo? { + return trajectoryListInfo + } + + fun getTrackContrail(): TrackContrail? { + return mTrajectoryInfo?.trackContrail + } + + fun setActivity(activity: Activity) { + mActivity = activity + } + + // 订阅工控机日志 + private val consoleObserver: Observer = + Observer { mogoReportMessage: MogoReportMsg.MogoReportMessage -> + if (consoleList.size > 1000) { + consoleList.removeLast() + } + if (mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_INFERIOR) + || mogoReportMessage.resultList.contains(RESULT_SHOW_WARNING) + || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_INFERIOR) + || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_DISABLE) + || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) + || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_DISABLE) + ) { + // 处理底盘超时 +// if ( +// !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_DISABLE) +// || !mogoReportMessage.resultList.equals(RESULT_REMOTEPILOT_INFERIOR) +// || !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_INFERIOR) +// ) { +// btnControlAutoPilot.isChecked = false +// Log.e(TAG, "进入自动驾驶--失败") // } -// } -// } -// } -// -// //自动驾驶状态 -// private val autopilotStateObserver: Observer = Observer { -// it.let { -// if (currentAutopilotStatus != it.state) { -// currentAutopilotStatus = it.state -// ThreadUtils.runOnUiThread { -// when (it.state) { -// 0 -> { -// btnAutoPilotStatus.text = "不可自驾" -// } -// -// 1 -> { -// btnAutoPilotStatus.text = "可自动驾驶" -// } -// -// 2 -> { -// btnAutoPilotStatus.text = "自动驾驶中" -// } -// -// 7 -> { -// btnAutoPilotStatus.text = "平行驾驶中" -// } -// } -// } -// } -// } -// } -// -// //车机基础信息应答 -// private val carConfigObserver: Observer = Observer { -// it.let { -// ThreadUtils.runOnUiThread { -// speedLimit = (it.speedLimit * 3.6).toInt() -// etInputSpeed.setText(speedLimit.toString()) -// } -// } -// } -// -// //自车状态(底盘),车灯、转向灯等 -// private val vehicleStateObserver: Observer = Observer { -// ThreadUtils.runOnUiThread { -// when (it.gear) { -// Chassis.GearPosition.GEAR_P -> { -// tvGearP.setTextColor(ContextCompat.getColor(context, R.color.white)) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// -// Chassis.GearPosition.GEAR_R -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor(ContextCompat.getColor(context, R.color.white)) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// -// Chassis.GearPosition.GEAR_N -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor(ContextCompat.getColor(context, R.color.white)) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// -// Chassis.GearPosition.GEAR_D -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor(ContextCompat.getColor(context, R.color.white)) -// } -// -// else -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// } -// } -// } -// -// init { -// LayoutInflater.from(context).inflate(R.layout.view_check_autopilot, this, true) -// initView(context, attrs!!) -// mLifecycleRegistry.currentState = Lifecycle.State.CREATED -// } -// -// private lateinit var tvAutoDriveLineSelect: TextView -// private lateinit var tvSpeedTitle: TextView -// private lateinit var ivSpeedReduce: ImageView -// private lateinit var etInputSpeed: AppCompatEditText -// private lateinit var ivSpeedAdd: ImageView -// private lateinit var tvSureModify: AppCompatTextView -// private lateinit var tvGearP: TextView -// private lateinit var tvGearR: TextView -// private lateinit var tvGearN: TextView -// private lateinit var tvGearD: TextView -// private lateinit var btnAutoPilotStatus: Button -// private lateinit var btnControlAutoPilot: ToggleButton -// private lateinit var rvReportConsole: RecyclerView -// -// -// private fun initView(context: Context, attrs: AttributeSet) { -// tvAutoDriveLineSelect = findViewById(R.id.tvAutoDriveLineSelect) -// tvSpeedTitle = findViewById(R.id.tvSpeedTitle) -// ivSpeedReduce = findViewById(R.id.ivSpeedReduce) -// etInputSpeed = findViewById(R.id.etInputSpeed) -// ivSpeedAdd = findViewById(R.id.ivSpeedAdd) -// tvSureModify = findViewById(R.id.tvSureModify) -// tvGearP = findViewById(R.id.tvGearP) -// tvGearR = findViewById(R.id.tvGearR) -// tvGearN = findViewById(R.id.tvGearN) -// tvGearD = findViewById(R.id.tvGearD) -// btnAutoPilotStatus = findViewById(R.id.btnAutoPilotStatus) -// btnControlAutoPilot = findViewById(R.id.btnControlAutoPilot) -// rvReportConsole = findViewById(R.id.rvReportConsole) -// -// -// -// -// initSpeedView() -// consoleAdapter.setData(consoleList) -// rvReportConsole.adapter = consoleAdapter -// initAutopilotLineData() -// -// // 启动自动驾驶 -// btnControlAutoPilot.setOnClickListener { -// if (currentAutopilotStatus != 0) { -// if (currentAutopilotStatus != 2) { -// mTrajectoryListInfo?.let { trajectoryListInfo -> -// mTrajectorySiteInfo?.let { trajectorySiteInfo -> -// if (trajectorySiteInfo.isEmpty()) { -// if (btnControlAutoPilot.isChecked) { -// ToastUtils.showShort("该路线缺少站点信息") -// } -// btnControlAutoPilot.isChecked = false -// return@setOnClickListener -// } -// val routeInfo = MessagePad.RouteInfo.newBuilder() -// routeInfo.routeID = trajectoryListInfo.lineId -// routeInfo.routeName = trajectoryListInfo.lineName -// -// routeInfo.vehicleType = -// if (VehicleConfigData.getCarType() == VehicleType.TAXI) { -// 9 -// } else { -// 10 -// } -// routeInfo.isSpeakVoice = false -// -// val startSite = trajectorySiteInfo[0] -// val endSite = trajectorySiteInfo[trajectorySiteInfo.size - 1] -// -// routeInfo.startName = -// PinYinUtil.getPinYinHeadChar(startSite.name) // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) -// routeInfo.endName = -// PinYinUtil.getPinYinHeadChar(endSite.name) // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) -// -// val startLoc = routeInfo.startLocationBuilder -// startLoc.latitude = startSite.wgs84Lat -// startLoc.longitude = startSite.wgs84Lon -// -// val endLoc = routeInfo.endLocationBuilder -// endLoc.latitude = endSite.wgs84Lat -// endLoc.longitude = endSite.wgs84Lon -// -// routeInfo.startLocation = startLoc.build() -// routeInfo.endLocation = endLoc.build() -// -// //传入站点列表 -// for(site in trajectorySiteInfo){ -// val locBuilder = MessagePad.Location.newBuilder() -// locBuilder.latitude = site.wgs84Lat -// locBuilder.longitude = site.wgs84Lon -// routeInfo.addWayPoints(locBuilder.build()) -// } -// -// // 初始化选择的自动驾驶路线信息 -// routeInfo.line = initTrajectoryLine(trajectoryListInfo) -// -// // 模拟强制进入 -// //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(true)) { -// // 启动自动驾驶 -// if (TelematicsControlApi.instance.requestEnterAutoPilot(routeInfo.build())) { + + consoleList.addFirst( + ReportEntity( + TimeUtils.getNowString(), + mogoReportMessage.src, + mogoReportMessage.level, + mogoReportMessage.msg, + mogoReportMessage.code, + mogoReportMessage.resultList, + mogoReportMessage.actionsList, + true + ) + ) + } + if (consoleList.size > 0) { + consoleAdapter.setData(consoleList) + } + } + + //订阅到站 + private val arrivalObserver: Observer = Observer { + it.let { + Log.i("arrivalObserver", "CheckAuto页面收到到站回调") + Log.i("arrivalObserver", "latitude=" + it.endLocation.latitude) + Log.i("arrivalObserver", "longitude=" + it.endLocation.longitude) + //取消自动驾驶 + CallerAutoPilotControlManager.cancelAutoPilot() + //吐司提示 + ToastUtils.showShort("您已到达站点") + } + } + + //订阅工控机日志监控 + private val reportObserver: Observer = Observer { + it.let { + //掉自驾 + when (it.code) { + "EMAP_EXIT_AUTOPILOT_FOR_PLANNING",//因planning掉帧强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_LOCATION",//因location掉帧强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS",//因底盘消息掉帧强退自动驾驶 + "EXIT_AUTOPILOT_FOR_DISTANCE",//因planning起点距离当前过远强退自动驾驶 + "EXIT_AUTOPILOT_FOR_BRAKE",//制动踏板干预而强退自动驾驶 + "EXIT_AUTOPILOT_FOR_ACCEL",//加速踏板干预而强退自动驾驶 + "EXIT_AUTOPILOT_FOR_STEER",//方向盘干预而强退自动驾驶 + "EXIT_AUTOPILOT_FOR_GEAR_SWITCH",//档位切换干预而强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_NO_RESPONSE",//底盘不响应请求而强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_UNKNOWN",//底盘退出原因未知而强退自动驾驶 + "IRECORDER_TASK_AUTO"//自动录包任务创建 + -> { + //当司机或外界原因导致自动驾驶退出,需要在页面将状态同步显示出来,并将按钮设置为「启动自动驾驶」 + ThreadUtils.runOnUiThread { + ToastUtils.showShort("自动驾驶退出") + btnControlAutoPilot.isEnabled = true + btnControlAutoPilot.isChecked = false + } + } + } + } + } + + //自动驾驶状态 + private val autopilotStateObserver: Observer = Observer { + it.let { + if (currentAutopilotStatus != it.state) { + currentAutopilotStatus = it.state + ThreadUtils.runOnUiThread { + when (it.state) { + 0 -> { + btnAutoPilotStatus.text = "不可自驾" + } + + 1 -> { + btnAutoPilotStatus.text = "可自动驾驶" + } + + 2 -> { + btnAutoPilotStatus.text = "自动驾驶中" + } + + 7 -> { + btnAutoPilotStatus.text = "平行驾驶中" + } + } + } + } + } + } + + //车机基础信息应答 + private val carConfigObserver: Observer = Observer { + it.let { + ThreadUtils.runOnUiThread { + speedLimit = (it.speedLimit * 3.6).toInt() + etInputSpeed.setText(speedLimit.toString()) + } + } + } + + //自车状态(底盘),车灯、转向灯等 + private val vehicleStateObserver: Observer = Observer { + ThreadUtils.runOnUiThread { + when (it.gear) { + Chassis.GearPosition.GEAR_P -> { + tvGearP.setTextColor(ContextCompat.getColor(context, R.color.white)) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + + Chassis.GearPosition.GEAR_R -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor(ContextCompat.getColor(context, R.color.white)) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + + Chassis.GearPosition.GEAR_N -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor(ContextCompat.getColor(context, R.color.white)) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + + Chassis.GearPosition.GEAR_D -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor(ContextCompat.getColor(context, R.color.white)) + } + + else -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + } + } + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_check_autopilot, this, true) + initView(context, attrs!!) + mLifecycleRegistry.currentState = Lifecycle.State.CREATED + } + + private lateinit var tvAutoDriveLineSelect: TextView + private lateinit var tvSpeedTitle: TextView + private lateinit var ivSpeedReduce: ImageView + private lateinit var etInputSpeed: AppCompatEditText + private lateinit var ivSpeedAdd: ImageView + private lateinit var tvSureModify: AppCompatTextView + private lateinit var tvGearP: TextView + private lateinit var tvGearR: TextView + private lateinit var tvGearN: TextView + private lateinit var tvGearD: TextView + private lateinit var btnAutoPilotStatus: Button + private lateinit var btnControlAutoPilot: ToggleButton + private lateinit var rvReportConsole: RecyclerView + + + private fun initView(context: Context, attrs: AttributeSet) { + tvAutoDriveLineSelect = findViewById(R.id.tvAutoDriveLineSelect) + tvSpeedTitle = findViewById(R.id.tvSpeedTitle) + ivSpeedReduce = findViewById(R.id.ivSpeedReduce) + etInputSpeed = findViewById(R.id.etInputSpeed) + ivSpeedAdd = findViewById(R.id.ivSpeedAdd) + tvSureModify = findViewById(R.id.tvSureModify) + tvGearP = findViewById(R.id.tvGearP) + tvGearR = findViewById(R.id.tvGearR) + tvGearN = findViewById(R.id.tvGearN) + tvGearD = findViewById(R.id.tvGearD) + btnAutoPilotStatus = findViewById(R.id.btnAutoPilotStatus) + btnControlAutoPilot = findViewById(R.id.btnControlAutoPilot) + rvReportConsole = findViewById(R.id.rvReportConsole) + + + + +// initSpeedView() TODO + consoleAdapter.setData(consoleList) + rvReportConsole.adapter = consoleAdapter + initAutopilotLineData() + + // 启动自动驾驶 + btnControlAutoPilot.setOnClickListener { + if (currentAutopilotStatus != 0) { + if (currentAutopilotStatus != 2) { + mTrajectoryListInfo?.let { trajectoryListInfo -> + mTrajectorySiteInfo?.let { trajectorySiteInfo -> + if (trajectorySiteInfo.isEmpty()) { + if (btnControlAutoPilot.isChecked) { + ToastUtils.showShort("该路线缺少站点信息") + } + btnControlAutoPilot.isChecked = false + return@setOnClickListener + } + val routeInfo = MessagePad.RouteInfo.newBuilder() + routeInfo.routeID = trajectoryListInfo.lineId + routeInfo.routeName = trajectoryListInfo.lineName + + routeInfo.vehicleType = + if (VehicleConfigData.getCarType() == VehicleType.TAXI) { + 9 + } else { + 10 + } + routeInfo.isSpeakVoice = false + + val startSite = trajectorySiteInfo[0] + val endSite = trajectorySiteInfo[trajectorySiteInfo.size - 1] + + routeInfo.startName = + PinYinUtil.getPinYinHeadChar(startSite.name) // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) + routeInfo.endName = + PinYinUtil.getPinYinHeadChar(endSite.name) // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) + + val startLoc = routeInfo.startLocationBuilder + startLoc.latitude = startSite.wgs84Lat + startLoc.longitude = startSite.wgs84Lon + + val endLoc = routeInfo.endLocationBuilder + endLoc.latitude = endSite.wgs84Lat + endLoc.longitude = endSite.wgs84Lon + + routeInfo.startLocation = startLoc.build() + routeInfo.endLocation = endLoc.build() + + //传入站点列表 + for(site in trajectorySiteInfo){ + val locBuilder = MessagePad.Location.newBuilder() + locBuilder.latitude = site.wgs84Lat + locBuilder.longitude = site.wgs84Lon + routeInfo.addWayPoints(locBuilder.build()) + } + + // 初始化选择的自动驾驶路线信息 + routeInfo.line = initTrajectoryLine(trajectoryListInfo) + + // 模拟强制进入 + //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(true)) { + // 启动自动驾驶 TODO +// if (CallerAutoPilotControlManager.startAutoPilot(currentAutopilot)) { // btnControlAutoPilot.isChecked = true // Log.d(TAG, "自动驾驶命令下发成功") // ToastUtils.showShort("自动驾驶命令下发成功") @@ -490,252 +495,215 @@ class CheckAutopilotView @JvmOverloads constructor( // Log.e(TAG, "自动驾驶命令下发失败") // ToastUtils.showShort("自动驾驶命令下发失败") // } -// } ?: let { -// btnControlAutoPilot.isChecked = false -// Log.e(TAG, "进入自动驾驶--失败") -// Log.e(TAG, "站点信息异常,请选择要测试的驾驶路线!!!") -// ToastUtils.showShort("进入自动驾驶--失败") -// } -// } ?: let { -// btnControlAutoPilot.isChecked = false -// Log.e(TAG, "进入自动驾驶--失败") -// Log.e(TAG, "未选择自动驾驶路线,请选择要测试的驾驶路线!!!") -// ToastUtils.showShort("进入自动驾驶--失败") -// } -// } else { -// // 模拟强制退出 -// //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(false)) { -// // 正常流程退出自动驾驶 -// CallerAutoPilotControlManager.cancelAutoPilot() -// } -// } else { -// btnControlAutoPilot.isChecked = false -// ToastUtils.showShort("车辆未就绪,请稍后再试") -// } -// } -// -// } -// -// /** -// * 自动驾驶车速设置 -// */ -// //TODO -// -// /** -// * 初始化轨迹信息 -// */ -// private fun initTrajectoryLine(trajectoryListInfo: TrajectoryListInfo): MessagePad.Line { -// // 给自动驾驶用于进行循迹路线加载 -// mTrajectoryInfo?.trackContrail?.let { -// mTrajectoryLine.lineId = trajectoryListInfo.lineId.toLong() -// mTrajectoryLine.lineName =trajectoryListInfo.lineName -// mTrajectoryLine.trajMd5 = it.csvFileMd5 -// mTrajectoryLine.trajUrl = it.csvFileUrl -// mTrajectoryLine.stopMd5 = it.txtFileMd5 -// mTrajectoryLine.stopUrl = it.txtFileUrl -// mTrajectoryLine.timestamp = it.contrailSaveTime -// mTrajectoryLine.vehicleModel = -// VehicleConfigData.getCarBrand() + VehicleConfigData.getCarModel() -// } ?: let { -// btnControlAutoPilot.isChecked = false -// Log.e(TAG, "循迹路线未配置! 请登录运营管理平台配置!") -// ToastUtils.showShort("循迹路线未配置!请登录运营管理平台配置!") -// } -// mTrajectoryInfo?.dbqpContrail?.let { -// mTrajectoryLine.trajUrlDpqp = it.csvFileUrl -// mTrajectoryLine.trajMd5Dpqp = it.csvFileMd5 -// mTrajectoryLine.stopUrlDpqp = it.txtFileUrl -// mTrajectoryLine.stopMd5Dpqp = it.txtFileMd5 -// mTrajectoryLine.timestampDpqp = it.contrailSaveTime -// } ?: let { -// Log.e(TAG, "dbqp路线未配置!请登录运营管理平台配置!") -// //ToastUtils.show("dbqp路线未配置!请登录运营管理平台配置!") -// } -// -// return mTrajectoryLine.build() -// } -// -// /** -// * 初始化路线选择器 -// */ -// private fun initAutopilotLineData() { -// // 循迹路线选择 -// tvAutoDriveLineSelect.setOnClickListener { -// //弹出路线选择弹窗 -// if (selectAutopilotLineDialog == null) { -// selectAutopilotLineDialog = SelectAutopilotLineDialog(context) -// } -// mActivity?.let { activity -> -// selectAutopilotLineDialog?.setListener(object : -// SelectAutopilotLineDialog.ClickListener { -// override fun onClick(info: TrajectoryListInfo) { -// Log.d(TAG, "选中路线:${info}") -// info.let { -// mTrajectoryListInfo = it -// tvAutoDriveLineSelect.text = it.lineName -// checkAutoLine(it) -// } -// } -// }) -// selectAutopilotLineDialog?.showSelectLineDialog(activity) -// } -// } -// } -// -// /** -// * 调用接口获取选中的路线信息 -// */ -// private fun checkAutoLine(trajectoryListInfo: TrajectoryListInfo) { -// val trajectoryInfoReq = TrajectoryInfoReq( -// VehicleConfigData.getCarBrand(), -// VehicleConfigData.getCarModel(), -// trajectoryListInfo.lineId -// ) -// Log.d( -// TAG, -// "调用接口获取选中的路线信息 checkAutoLine,trajectoryInfoReq:${trajectoryInfoReq}" -// ) -// // 处理Taxi -// // 处理BUS包含:JV、KW、FT、SW -// TrajectoryApiClient.querySiteList( -// this, -// VehicleConfigData.getCarType().name, -// trajectoryListInfo.lineId, -// object : NetworkCallback> { -// override fun onSuccess(data: ArrayList) { -// mTrajectorySiteInfo = data -// if (data.size > 0) { -// btnControlAutoPilot.isEnabled = true -// } else { -// btnControlAutoPilot.isEnabled = false -// ToastUtils.showShort("该路线缺少站点信息") -// } -// } -// -// override fun onError(msg: String) { -// Log.e( -// TAG, -// "获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常" + } ?: let { + btnControlAutoPilot.isChecked = false + Log.e(TAG, "进入自动驾驶--失败") + Log.e(TAG, "站点信息异常,请选择要测试的驾驶路线!!!") + ToastUtils.showShort("进入自动驾驶--失败") + } + } ?: let { + btnControlAutoPilot.isChecked = false + Log.e(TAG, "进入自动驾驶--失败") + Log.e(TAG, "未选择自动驾驶路线,请选择要测试的驾驶路线!!!") + ToastUtils.showShort("进入自动驾驶--失败") + } + } else { + // 模拟强制退出 + //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(false)) { + // 正常流程退出自动驾驶 + CallerAutoPilotControlManager.cancelAutoPilot() + } + } else { + btnControlAutoPilot.isChecked = false + ToastUtils.showShort("车辆未就绪,请稍后再试") + } + } + + } + + /** + * 自动驾驶车速设置 + */ + //TODO + + /** + * 初始化轨迹信息 + */ + private fun initTrajectoryLine(trajectoryListInfo: TrajectoryListInfo): MessagePad.Line { + // 给自动驾驶用于进行循迹路线加载 + mTrajectoryInfo?.trackContrail?.let { + mTrajectoryLine.lineId = trajectoryListInfo.lineId.toLong() + mTrajectoryLine.lineName =trajectoryListInfo.lineName + mTrajectoryLine.trajMd5 = it.csvFileMd5 + mTrajectoryLine.trajUrl = it.csvFileUrl + mTrajectoryLine.stopMd5 = it.txtFileMd5 + mTrajectoryLine.stopUrl = it.txtFileUrl + mTrajectoryLine.timestamp = it.contrailSaveTime + mTrajectoryLine.vehicleModel = + VehicleConfigData.getCarBrand() + VehicleConfigData.getCarModel() + } ?: let { + btnControlAutoPilot.isChecked = false + Log.e(TAG, "循迹路线未配置! 请登录运营管理平台配置!") + ToastUtils.showShort("循迹路线未配置!请登录运营管理平台配置!") + } + mTrajectoryInfo?.dbqpContrail?.let { + mTrajectoryLine.trajUrlDpqp = it.csvFileUrl + mTrajectoryLine.trajMd5Dpqp = it.csvFileMd5 + mTrajectoryLine.stopUrlDpqp = it.txtFileUrl + mTrajectoryLine.stopMd5Dpqp = it.txtFileMd5 + mTrajectoryLine.timestampDpqp = it.contrailSaveTime + } ?: let { + Log.e(TAG, "dbqp路线未配置!请登录运营管理平台配置!") + //ToastUtils.show("dbqp路线未配置!请登录运营管理平台配置!") + } + + return mTrajectoryLine.build() + } + + /** + * 初始化路线选择器 + */ + private fun initAutopilotLineData() { + // 循迹路线选择 + tvAutoDriveLineSelect.setOnClickListener { + //弹出路线选择弹窗 + if (selectAutopilotLineDialog == null) { + selectAutopilotLineDialog = SelectAutopilotLineDialog(context) + } + mActivity?.let { activity -> + selectAutopilotLineDialog?.setListener(object : + SelectAutopilotLineDialog.ClickListener { + override fun onClick(info: TrajectoryListInfo) { + Log.d(TAG, "选中路线:${info}") + info.let { + mTrajectoryListInfo = it + tvAutoDriveLineSelect.text = it.lineName + checkAutoLine(it) + } + } + }) + selectAutopilotLineDialog?.showSelectLineDialog(activity) + } + } + } + + /** + * 调用接口获取选中的路线信息 + */ + private fun checkAutoLine(trajectoryListInfo: TrajectoryListInfo) { + val trajectoryInfoReq = TrajectoryInfoReq( + VehicleConfigData.getCarBrand(), + VehicleConfigData.getCarModel(), + trajectoryListInfo.lineId + ) + Log.d( + TAG, + "调用接口获取选中的路线信息 checkAutoLine,trajectoryInfoReq:${trajectoryInfoReq}" + ) + // 处理Taxi + // 处理BUS包含:JV、KW、FT、SW + TrajectoryApiClient.querySiteList( + this, + VehicleConfigData.getCarType().name, + trajectoryListInfo.lineId, + object : NetworkCallback> { + override fun onSuccess(data: ArrayList) { + mTrajectorySiteInfo = data + if (data.size > 0) { + btnControlAutoPilot.isEnabled = true + } else { + btnControlAutoPilot.isEnabled = false + ToastUtils.showShort("该路线缺少站点信息") + } + } + + override fun onError(msg: String) { + Log.e( + TAG, + "获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常" + ) + ToastUtils.showShort("获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常") + } + } + ) + TrajectoryApiClient.queryTrajectoryInfo( + this, + VehicleConfigData.getCarType().name, + trajectoryInfoReq, + object : NetworkCallback { + override fun onSuccess(data: TrajectoryInfo) { + mTrajectoryInfo = data + + // 先发给自动驾驶下载路线 TODO +// CallerAutoPilotControlManager.sendTrajectoryDownloadReq( +// mAutoPilotLine // ) -// ToastUtils.showShort("获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常") -// } -// } -// ) -// TrajectoryApiClient.queryTrajectoryInfo( -// this, -// VehicleConfigData.getCarType().name, -// trajectoryInfoReq, -// object : NetworkCallback { -// override fun onSuccess(data: TrajectoryInfo) { -// mTrajectoryInfo = data -// -// // 先发给自动驾驶下载路线 -// TelematicsControlApi.instance.sendTrajectoryDownloadReq( -// initTrajectoryLine( -// trajectoryListInfo -// ) -// ) -// } -// -// override fun onError(msg: String) { -// Log.e( -// TAG, -// "查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常" -// ) -// ToastUtils.showShort("查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常") -// } -// } -// ) -// } -// -// -// override fun onAttachedToWindow() { -// super.onAttachedToWindow() -// mLifecycleRegistry.currentState = Lifecycle.State.STARTED -// postDelayed({ -// //订阅工控机异常上报 -// reportMsgInfoSubscriber = -// CommSubscriber( -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgInfo.topicPath, -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgInfo.msgType, -// MogoReportMsg.MogoReportMessage.parser(), -// TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER -// ) -// TopicSubscriberServiceManager.instance.addTopicSubscriber( -// reportMsgInfoSubscriber!!.getTopicPath(), -// reportMsgInfoSubscriber!! -// ) -// -// reportMsgErrorSubscriber = -// CommSubscriber( -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgError.topicPath, -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgError.msgType, -// MogoReportMsg.MogoReportMessage.parser(), -// TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER -// ) -// TopicSubscriberServiceManager.instance.addTopicSubscriber( -// reportMsgErrorSubscriber!!.getTopicPath(), -// reportMsgErrorSubscriber!! -// ) -// }, 2000) -// -// // 订阅数据 -// FlowBus.with(TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER) -// .register(this) { -// consoleObserver.onChanged(it) -// } -// -// //订阅到站提醒 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Arrival_Notification) -// .register(this) { -// arrivalObserver.onChanged(it) -// } -// -// //订阅工控机日志监控 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Mogo_Report_Message) -// .register(this) { -// reportObserver.onChanged(it) -// } -// -// //订阅自动驾驶状态 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Autopilot_State) -// .register(this) { -// autopilotStateObserver.onChanged(it) -// } -// -// //订阅车机基础信息 -// FlowBus.withStick(TelematicsSubscriberEventKey.Subscribe_CarConfig_Resp) -// .register(this) { -// carConfigObserver.onChanged(it) -// } -// -// //订阅自车状态(底盘),车灯、转向灯等 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Vehicle_State) -// .register(this) { -// vehicleStateObserver.onChanged(it) -// } -// } -// -// override fun onDetachedFromWindow() { -// super.onDetachedFromWindow() -// scopeUploadReportInfo.cancel() -// -// mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED -// -// reportMsgInfoSubscriber?.let { -// TopicSubscriberServiceManager.instance.removeTopicSubscriber( -// reportMsgInfoSubscriber!!.getTopicPath(), -// ) -// } -// reportMsgErrorSubscriber?.let { -// TopicSubscriberServiceManager.instance.removeTopicSubscriber( -// reportMsgErrorSubscriber!!.getTopicPath(), -// ) -// } -// } + } + + override fun onError(msg: String) { + Log.e( + TAG, + "查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常" + ) + ToastUtils.showShort("查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常") + } + } + ) + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + mLifecycleRegistry.currentState = Lifecycle.State.STARTED + //订阅工控机异常上报 TODO + + //reportMsgErrorSubscriber TODO + + // 订阅数据 + FlowBus.with(TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER) + .register(this) { + consoleObserver.onChanged(it) + } + + //订阅到站提醒 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Arrival_Notification) + .register(this) { + arrivalObserver.onChanged(it) + } + + //订阅工控机日志监控 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Mogo_Report_Message) + .register(this) { + reportObserver.onChanged(it) + } + + //订阅自动驾驶状态 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Autopilot_State) + .register(this) { + autopilotStateObserver.onChanged(it) + } + + //订阅车机基础信息 + FlowBus.withStick(TelematicsSubscriberEventKey.Subscribe_CarConfig_Resp) + .register(this) { + carConfigObserver.onChanged(it) + } + + //订阅自车状态(底盘),车灯、转向灯等 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Vehicle_State) + .register(this) { + vehicleStateObserver.onChanged(it) + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + scopeUploadReportInfo.cancel() + mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED + } override fun getLifecycle(): Lifecycle { - return lifecycle + return mLifecycleRegistry } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/utils/PinYinUtil.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/utils/PinYinUtil.java new file mode 100644 index 0000000000..264c1c28c8 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/utils/PinYinUtil.java @@ -0,0 +1,31 @@ +package com.zhjt.mogo_core_function_devatools.rviz.utils; + +import net.sourceforge.pinyin4j.PinyinHelper; + +/** + * @author: wangmingjun + * @date: 2021/11/26 + */ +public class PinYinUtil { + /** + * 得到中文字符串首字母 + * @param str 需要转化的中文字符串 + * @return 大写首字母缩写的字符串 + */ + public static String getPinYinHeadChar(String str) { + str = str.replaceAll("[\\p{P}‘’“”|+=¥$<>^~~]", ""); + StringBuilder convert = new StringBuilder(); + for (int j = 0; j < str.length(); j++) { + char word = str.charAt(j); + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); + if (pinyinArray != null) { + convert.append(pinyinArray[0].charAt(0)); + } else { + if (!"".equals(String.valueOf(word).trim())){ + convert.append(word); + } + } + } + return convert.toString().trim().toUpperCase(); + } +} diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml index 716d097698..fef58e1458 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml @@ -9,10 +9,10 @@ android:id="@+id/tvSelectLineTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="@dimen/dp_15" + android:layout_margin="@dimen/dp_30" android:text="请选择自动驾驶路线" android:textColor="#FFFFFFFF" - android:textSize="@dimen/sp_18" + android:textSize="@dimen/sp_36" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -33,8 +33,8 @@ diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml index 889bf9af4b..5ddb6a64a7 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" - android:textSize="@dimen/sp_16" + android:textSize="@dimen/sp_32" android:gravity="center_horizontal" android:padding="@dimen/dp_10" > diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml index e064003f1d..a92461ce8c 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml @@ -14,13 +14,13 @@ android:layout_marginEnd="@dimen/dp_5" android:gravity="start" android:textColor="@color/white" - android:textSize="@dimen/sp_12" + android:textSize="@dimen/sp_30" tools:text="ReportMsg" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/layout_autopilot_check.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/layout_autopilot_check.xml new file mode 100644 index 0000000000..04293193ab --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/layout_autopilot_check.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml index a25781430d..2f9b4e1eb8 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml @@ -17,12 +17,12 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toTopOf="@id/ivSpeedReduce" android:text="请选择自动驾驶路线" - android:padding="@dimen/dp_5" - android:textSize="@dimen/sp_18" + android:padding="@dimen/dp_10" + android:textSize="@dimen/sp_36" android:textColor="@color/white" android:gravity="center_horizontal" - android:layout_margin="@dimen/dp_10" + android:layout_margin="@dimen/dp_20" /> + android:layout_marginStart="@dimen/dp_20" />