Merge branch 'dev_robotaxi-d_250709_8.1.4' into dev_robotaxi-d_250709_8.1.2_advideo

# Conflicts:
#	gradle.properties
This commit is contained in:
yangyakun
2025-07-17 16:29:27 +08:00
18 changed files with 263 additions and 58 deletions

View File

@@ -10,6 +10,8 @@ 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.OchCollisionRiskManager
import com.mogo.och.bridge.bridge.OchPncManager
import com.mogo.och.bridge.bridge.OchVlmManager
import com.mogo.och.bridge.trajectory.TrajectoryManager
import com.mogo.och.common.module.biz.birdge.BridgeService
@@ -35,10 +37,9 @@ class BridgeProvider : BridgeService, CallerBase<BridgeListener>() {
// 车前引导线+预测数据
OchBridgeManager.load()
// if(EnvManager.isT1T2Passenger()){
OchVlmManager.load()
// }
OchVlmManager.load()
OchPncManager.load()
OchCollisionRiskManager.load()
TrajectoryManager.load()
}
@@ -114,5 +115,17 @@ class BridgeProvider : BridgeService, CallerBase<BridgeListener>() {
}
}
fun invokePncData(pncAction:String){
M_LISTENERS.forEach {
it.value.onPncInfoListener(pncAction)
}
}
fun invokeCollisionRisk(){
M_LISTENERS.forEach {
it.value.onCollisionRisk()
}
}
}

View File

@@ -46,4 +46,12 @@ object BridgeServiceManager {
this.bridgeService?.inVokeNdeData(title,desc,sortedList)
}
fun invokePncData(pncAction:String){
this.bridgeService?.invokePncData(pncAction)
}
fun collisionRisk() {
this.bridgeService?.invokeCollisionRisk()
}
}

View File

@@ -0,0 +1,22 @@
package com.mogo.och.bridge.bridge
import com.mogo.eagle.core.function.api.devatools.ICollisionRiskListener
import com.mogo.eagle.core.function.call.devatools.CallerCollisionRiskManager
import com.mogo.och.bridge.BridgeServiceManager
object OchCollisionRiskManager : ICollisionRiskListener {
private const val TAG = "OchCollisionRiskManager"
fun load() {
CallerCollisionRiskManager.addListener(TAG, this)
}
fun release() {
CallerCollisionRiskManager.removeListener(TAG)
}
override fun onCollisionRisk() {
BridgeServiceManager.collisionRisk()
}
}

View File

@@ -0,0 +1,50 @@
package com.mogo.och.bridge.bridge
import com.mogo.eagle.core.data.autopilot.pnc.PncActionsHelper
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager
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.logchainanalytic.OchChainLogManager
import kotlin.properties.Delegates
import mogo.telematics.pad.MessagePad
object OchPncManager : IMoGoAutopilotPlanningActionsListener {
private val TAG = "${M_OCHCOMMON}OchPncManager"
private var pncAction: String by Delegates.observable("") { _, oldValue, newValue ->
if (oldValue != newValue) {
OchChainLogManager.writeCHainLogBridge("pnc消息","oldPnc:$oldValue newPnc:$newValue")
BridgeServiceManager.invokePncData(newValue)
}
}
fun load(){
CallerPlanningActionsListenerManager.addListener(TAG, this)
}
fun release(){
CallerPlanningActionsListenerManager.removeListener(TAG)
}
override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) {
planningActionMsg.actionMsg?.let {
try {
pncAction = PncActionsHelper.getAction(
it.drivingState.number,
it.drivingAction.number
)
} catch (e: Exception) {
e.printStackTrace()
}
}
planningActionMsg.v2NActionMsgList?.forEach { v2nAction ->
pncAction = PncActionsHelper.getAction(
v2nAction.drivingState.number,
v2nAction.drivingAction.number
)
}
}
}

View File

@@ -28,6 +28,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisStatesListenerMa
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.CallerCollisionRiskManager
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
@@ -80,8 +81,12 @@ object DebugDataDispatch {
const val mediaMusic = "mediaAndMusic"
const val vlmMessage = "vlmMessage"
const val vlmImage = "vlmImage"
const val pncAction = "pncAction"
const val collisionRisk = "CollisionRisk"
// 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 "pncAction"
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "CollisionRisk"
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "globalPath" --es path "sy73.json"
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "carDoor" --ei doorPostion 1 --ei doorStatus 1
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "trunAroud" --es code "IMAP_TRA_LOADED"
@@ -112,6 +117,18 @@ object DebugDataDispatch {
}
when (type) {
collisionRisk -> {
CallerCollisionRiskManager.invokeCollisionRisk()
}
pncAction -> {
val time = intent.getFloatExtra("action",0f)
val newBuilder = MessagePad.PlanningActionMsg.newBuilder()
val actionMsg = MessagePad.DrivingActionMsg.newBuilder()
actionMsg.drivingAction = MessagePad.DrivingAction.DRIVING_ACTION_STATE_ONE
actionMsg.drivingState = MessagePad.DrivingState.PULL_OVER
newBuilder.actionMsg = actionMsg.build()
CallerPlanningActionsListenerManager.invokePNCActions(newBuilder.build())
}
vlmMessage -> {
val time = intent.getFloatExtra("time",0f)
val id = intent.getIntExtra("id",0)

View File

@@ -22,4 +22,8 @@ interface BridgeListener {
fun onVlmDataListener(vlmData: VlmData){}
fun onNdeDataListener(title: String, desc: String, sortedList: List<RoadMsg>) {}
fun onPncInfoListener(pncAction: String) {}
fun onCollisionRisk() {}
}

View File

@@ -80,5 +80,7 @@ class OchCommonConst {
const val Charter_AVERAGE_SPEED = 15
//T1T2的平均里程38km/h
const val TAXI_AVERAGE_SPEED = 38
const val PNC_ACTION_ENTERSTATION = "正在进站"
}
}

View File

@@ -66,6 +66,13 @@ object OchChainLogManager {
const val EVENT_KEY_INFO_VLM = "analytics_event_och_vlm"
const val EVENT_KEY_INFO_BRIDGE = "analytics_event_och_bridge"
fun writeCHainLogBridge(title: String,info: String) {
writeChainLog(title, info, false, EVENT_KEY_INFO_BRIDGE)
}
fun writeChainLogEye(title: String, info: String) {
writeChainLog(title, info, true, EVENT_KEY_INFO_CALL_EYE)
}

View File

@@ -19,7 +19,7 @@
<string name="offline_dialog_tips">您确认要结束任务吗?</string>
<string name="m2_voice_out_arrive_station">蘑菇小巴正在进站</string>
<string name="m2_voice_out_arrive_station">欢迎乘坐蘑菇小巴</string>
<string name="m2_voice_out_autopilot_start_in15m">蘑菇小巴出发咯</string>
<string name="go_login_count_down">当前网络良好(%1$s)</string>

View File

@@ -21,6 +21,9 @@ import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation
import com.mogo.och.bridge.autopilot.line.ILineCallback
import com.mogo.och.bridge.autopilot.line.LineManager
import com.mogo.och.bridge.autopilot.location.OchLocationManager
import com.mogo.och.common.module.biz.birdge.BridgeListener
import com.mogo.och.common.module.biz.birdge.BridgeManager
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.manager.loop.LoopInfo
@@ -78,6 +81,8 @@ object OrderModel {
OchAutoPilotStatusListenerManager.addListener(TAG, ochAutopilotStatusListener)
BridgeManager.addBridgeListener(TAG,bridgeListener)
LineManager.addListener(TAG,arriveStationBySearch)
OchTransform.addListener(TAG,ochTransform)
@@ -96,11 +101,23 @@ object OrderModel {
TicketModel.release()
OchAutoPilotStatusListenerManager.removeListener(TAG)
BridgeManager.removeBridgeListener(LineModel.TAG)
LineManager.removeListener(TAG)
OchTransform.removeListener(TAG)
}
private val bridgeListener = object : BridgeListener{
override fun onPncInfoListener(pncAction: String) {
when (pncAction) {
OchCommonConst.PNC_ACTION_ENTERSTATION -> {
ShuttleVoiceManager.arrivedStationOut(ResourcesUtils.getString(R.string.m2_voice_out_arriving_station))
}
else -> {}
}
}
}
private val ochAutopilotStatusListener = object : IOchAutopilotStatusListener{
override fun onAutopilotArriveAtStation(arrivedStation: ArrivedStation?) {
e(TAG, "行程日志-onAutopilotArriveAtStation arrive")

View File

@@ -4,9 +4,14 @@ import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.StringUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.bridge.autopilot.line.LineManager
import com.mogo.och.bridge.distance.IDistanceListener
import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager
import com.mogo.och.common.module.biz.birdge.BridgeListener
import com.mogo.och.common.module.biz.birdge.BridgeManager
import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager
import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager
import com.mogo.och.common.module.manager.socket.cloud.action.OperateAction
@@ -17,6 +22,7 @@ import com.mogo.och.common.module.manager.socket.lan.bean.BusinessType
import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType
import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.voice.VoiceNotice.showNotice
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.data.bean.BusTransferData
import com.mogo.och.shuttle.weaknet.R
@@ -31,6 +37,32 @@ object ThirdDeviceData {
@JvmStatic
val busRoutesResult: BusRoutesResult = BusRoutesResult()
private val bridgeListener: BridgeListener = object : BridgeListener {
override fun onCollisionRisk() {
ShuttleVoiceManager.collisionRisk()
}
}
private val trajectoryListener: IDistanceListener = object : IDistanceListener {
override fun distanceCallback(distance: Float) {
// 小于200m 播报站点介绍
if (distance < 200) {
LineManager.getStations { start, end ->
if (!end.isPlayTts) {
end.isPlayTts = true
if (StringUtils.isEmpty(end.introduction)) {
if(!StringUtils.isEmpty(end.name)){
val message = "前方到站:${end.name},请下车的乘客做好准备"
ShuttleVoiceManager.leave200Distance(message)
}
}else{
ShuttleVoiceManager.leave200Distance(end.introduction)
}
}
}
}
}
}
fun init() {
//监听运营消息
OCHSocketMessageManager.registerSocketMessageListener(
@@ -51,6 +83,8 @@ object ThirdDeviceData {
DPMsgType.TYPE_TASK_DETAILS.type,
taskDetailsMsgListener
)
TrajectoryAndDistanceManager.addDistanceListener(TAG,trajectoryListener)
BridgeManager.addBridgeListener(TAG,bridgeListener)
}
fun release() {
@@ -61,6 +95,10 @@ object ThirdDeviceData {
AbnormalFactorsLoopManager.stopLoopAbnormalFactors()
TrajectoryAndDistanceManager.removeListener(TAG)
BridgeManager.removeBridgeListener(TAG)
//监听乘客屏发来的消息
LanSocketManager.unRegisterSocketMessageListener(
DPMsgType.TYPE_TASK_DETAILS.type,

View File

@@ -47,20 +47,11 @@ object ShuttleVoiceManager {
VoiceNotice.showNotice(list, AIAssist.LEVEL1,null)
} else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
siteNameCN?.let {
sendArrivedStationToClient(it)
sendPassengerPlay( ResourcesUtils.getString(R.string.bus_arrived_station_tip,it))
}
}
}
private fun sendArrivedStationToClient(arriveStation: String) {
val arrivedMsg = AppConnectMsg(
isViewShow = false,
isPlay = true,
msg = ResourcesUtils.getString(R.string.bus_arrived_station_tip,arriveStation),
)
LanSocketManager.sendMsgToClient(arrivedMsg)
}
fun leaveStationBus(siteNameCN: String?, siteNameKR: String?) {
val list: MutableList<LangTtsEntity> = ArrayList()
val context = AbsMogoApplication.getApp()
@@ -88,20 +79,11 @@ object ShuttleVoiceManager {
VoiceNotice.showNotice(list, AIAssist.LEVEL1,null)
} else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
siteNameCN?.let {
sendStartStationToClient(it)
sendPassengerPlay(ResourcesUtils.getString(R.string.bus_leave_station_tip,it))
}
}
}
private fun sendStartStationToClient(nextStation: String) {
val startMsg = AppConnectMsg(
isViewShow = false,
isPlay = true,
msg = ResourcesUtils.getString(R.string.bus_leave_station_tip,nextStation),
)
LanSocketManager.sendMsgToClient(startMsg)
}
fun endOrderBus() {
val context = AbsMogoApplication.getApp()
val list: MutableList<LangTtsEntity> = ArrayList()
@@ -115,40 +97,20 @@ object ShuttleVoiceManager {
if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) {
VoiceNotice.showNotice(list, AIAssist.LEVEL0,null)
} else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
sendEndTaskToClient()
sendPassengerPlay(SkinResources.getInstance().getString(R.string.bus_end_task_tip))
}
}
private fun sendEndTaskToClient() {
val endMsg = AppConnectMsg(
isViewShow = false,
isPlay = true,
msg = SkinResources.getInstance().getString(R.string.bus_end_task_tip),
)
LanSocketManager.sendMsgToClient(endMsg)
}
fun writeOffCount(successNum:Int){
if(successNum<=1){
VoiceNotice.showNotice("核验通过", AIAssist.LEVEL3)
//sendWriteOffNumToClient("核验通过")
}else{
VoiceNotice.showNotice("$successNum 人核验通过", AIAssist.LEVEL3)
//sendWriteOffNumToClient("$successNum 人核验通过")
}
}
private fun sendWriteOffNumToClient(msg: String?) {
val passengerMsg = AppConnectMsg(
isViewShow = false,
isPlay = true,
msg = msg!!,
)
LanSocketManager.sendMsgToClient(passengerMsg)
}
// 距离发车还有1分钟
fun showLeafTime(tips: String) {
@@ -160,4 +122,33 @@ object ShuttleVoiceManager {
VoiceNotice.showNotice(reaseon, AIAssist.LEVEL3)
}
fun leave200Distance(message:String){
if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) {
VoiceNotice.showNotice(message, AIAssist.LEVEL0)
} else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
sendPassengerPlay(message)
}
}
fun collisionRisk() {
val message = ResourcesUtils.getString(R.string.m2_voice_collision_risk)
if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) {
VoiceNotice.showNotice(message, AIAssist.LEVEL0)
} else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
sendPassengerPlay(message)
arrivedStationOut("车辆遇到紧急情况,正在安全处理")
}
}
private fun sendPassengerPlay(msg:String){
val passengerMsg = AppConnectMsg(
isViewShow = false,
isPlay = true,
msg = msg,
)
LanSocketManager.sendMsgToClient(passengerMsg)
}
}

View File

@@ -46,8 +46,10 @@
<string name="bus_dialog_confirm">确认</string>
<string name="bus_dialog_cancel">取消</string>
<string name="m2_voice_out_arrive_station">蘑菇小巴正在进站</string>
<string name="m2_voice_out_arrive_station">欢迎乘坐蘑菇小巴</string>
<string name="m2_voice_out_arriving_station">蘑菇小巴正在进站</string>
<string name="m2_voice_out_autopilot_start_in15m">蘑菇小巴出发咯</string>
<string name="m2_voice_collision_risk">尊敬的乘客,车辆遇到紧急情况,正在安全处理,请坐稳扶好,听从指引,感谢配合</string>

View File

@@ -174,16 +174,6 @@ object CommonModel {
}
}
}
// 小于200m 播报站点介绍
if (distance < 200) {
val stationNext = mStations[mNextStationIndex]
if (!stationNext.isPlayTts) {
if (!StringUtils.isEmpty(stationNext.introduction)) {
showNotice(stationNext.introduction)
stationNext.isPlayTts = true
}
}
}
mCommonCallbackList.forEach {
it.value.updateRemainMT(
distance.toLong(),

View File

@@ -52,6 +52,7 @@ import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel
import com.mogo.och.unmanned.taxi.ui.task.cancleorder.CancleOrderView
import com.mogo.och.unmanned.taxi.ui.task.itinerayswitch.ItinerarySwitchModel
import com.mogo.och.unmanned.taxi.utils.TaskUtils
import com.mogo.och.unmanned.taxi.utils.TaxiTrajectoryManager
//演练单标识
import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.aciv_task_type_exercise
// 距离目的地距离和剩余时间
@@ -149,6 +150,9 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi
}
private fun initViewModelObserver() {
include_empty.onClick {
TaxiTrajectoryManager.syncTrajectoryInfo()
}
viewModel?.sendUiIntent(TaskUiIntent.StartTaskWithOrderLooper)
//监听返回的数据状态

View File

@@ -7,6 +7,7 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.deva.report.ReportEntity
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerCollisionRiskManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
@@ -84,6 +85,11 @@ class IPCReportManager : IMoGoAutopilotStatusListener {
*/
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
guardianInfo?.let{
//8.1.4版本异常声光电提醒
if(it.code == MogoReport.Code.Info.IMAP.CONTROLLER_START_FM_COMMAND){
CallerCollisionRiskManager.invokeCollisionRisk()
}
if(it.resultList.contains(RESULT_AUTOPILOT_DISABLE)
|| it.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED)
|| it.resultList.contains(RESULT_REMOTEPILOT_DISABLE)
@@ -96,7 +102,7 @@ class IPCReportManager : IMoGoAutopilotStatusListener {
|| it.code == MogoReport.Code.Info.IMAP.EXIT_AUTOPILOT
|| it.code == MogoReport.Code.Info.IMAP.ENTRY_REMOTEPILOT
|| it.code == MogoReport.Code.Info.IMAP.EXIT_REMOTEPILOT
|| it.code == MogoReport.Code.Info.IMAP.CONTROLLER_START_FM_COMMAND
// || it.code == MogoReport.Code.Info.IMAP.CONTROLLER_START_FM_COMMAND
|| it.code == MogoReport.Code.Info.IMAP.CONTROLLER_FINISH_FM_COMMAND
|| it.code == MogoReport.Code.Info.IMAP.CONTROLLER_ABORT_FM_COMMAND
|| it.code == MogoReport.Code.Info.IMAP.PLANNING_START_FM_COMMAND

View File

@@ -0,0 +1,13 @@
package com.mogo.eagle.core.function.api.devatools
/**
* 814异常声光电上报提醒
*/
interface ICollisionRiskListener {
/**
* 声光电异常提醒
*/
fun onCollisionRisk(){}
}

View File

@@ -0,0 +1,21 @@
package com.mogo.eagle.core.function.call.devatools
import com.mogo.eagle.core.function.api.devatools.ICollisionRiskListener
import com.mogo.eagle.core.function.call.base.CallerBase
/**
* 814异常声光电上报提醒
*/
object CallerCollisionRiskManager: CallerBase<ICollisionRiskListener>() {
/**
* 声光电异常提醒
*/
fun invokeCollisionRisk(){
M_LISTENERS.forEach{
val listener = it.value
listener.onCollisionRisk()
}
}
}