Merge remote-tracking branch 'origin/dev_robotaxi-d_241112_6.8.0' into dev_robotaxi-d_241112_6.8.0

# Conflicts:
#	OCH/common/common/src/main/java/com/mogo/och/common/module/manager/scnner/ScannerManager.kt
This commit is contained in:
yangyakun
2024-11-19 14:27:08 +08:00
39 changed files with 1116 additions and 86 deletions

View File

@@ -276,9 +276,9 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
AiRoadMarker.aiMakers.getOrPut(id) {
AiRoadMarker().apply {
try {
val current = abs(location.gnssSpeed) * 3.6f.toInt()
val min = abs(data.speedStraightMin * 3.6f).toInt()
val max = abs(data.speedStraightMax * 3.6f).toInt()
val current = abs(location.gnssSpeed).toInt()
val min = abs(data.speedStraightMin).toInt()
val max = abs(data.speedStraightMax).toInt()
marker(Marker(id, EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, destX, destY, 0.0, null, null, null), drawMarker = false, false)
var alertTts = ""
var alertContent = ""

View File

@@ -61,6 +61,7 @@ dependencies {
implementation project(':libraries:mogo-obu')
implementation project(':libraries:mogo-adas')
implementation project(':libraries:mogo-hardware-devices')
implementation rootProject.ext.dependencies.mogoaicloudtelematic
compileOnly project(':core:function-impl:mogo-core-function-map')
implementation project(':core:mogo-core-function-call')

View File

@@ -4,20 +4,20 @@ import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.function.api.datacenter.IDataCenterProvider
import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener
import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.datacenter.location.MoGoLocationDispatcher
import com.mogo.eagle.core.function.datacenter.v2x.SpeedLimitDispatcher
import com.mogo.eagle.core.function.datacenter.v2x.TrafficLightDispatcher
import com.mogo.eagle.core.function.datacenter.iot.IotInItManager
@Route(path = MogoServicePaths.PATH_DATA_CENTER_MODULE)
class DataCenterProvider: IDataCenterProvider {
class DataCenterProvider : IDataCenterProvider {
override val functionName: String
get() = "DataCenterProvider"
private var mContext:Context? = null
private var mContext: Context? = null
override fun init(context: Context?) {
MoGoLocationDispatcher.initListener()
@@ -27,6 +27,7 @@ class DataCenterProvider: IDataCenterProvider {
CallerMsgBoxManager.queryAllMessages(it)
TrafficLightDispatcher.INSTANCE.initServer(it)
SpeedLimitDispatcher.INSTANCE.initLimit(it)
IotInItManager.init()
}
}

View File

@@ -25,6 +25,7 @@ import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
@@ -155,6 +156,42 @@ class TeleMsgHandler : IMsgHandler {
}
return
}
if (it.protocolType == TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_REQ) {
try {
Log.d(TAG, "乘客屏收到司机屏转发的驾驶位视频流开关 --- 1 ---")
val content = String(it.body, Charset.defaultCharset())
Log.d(TAG, "乘客屏收到司机屏转发的驾驶位视频流开关 --- 2 ---:$content")
val data = GsonUtils.fromJson(content, Map::class.java)
val open = data["open"].toString().toInt() == 1
val playUrl = data["playUrl"]?.toString()
//TODO yangyakun
if (open) {
if (playUrl != null) {
// 1. 获取视频播放控件
val target = CallerDevaToolsManager.driveSeatVideoProvider()?.getDriveVideoView(playUrl) { event ->
}
if (target != null) {
// 2. 添加到一个ViewGroup上
// 11: 第1个1代表运营面板开关打开第2个1代表打开成功告之司机端
// 10: 第1个1代表运营面板开关打开第2个0代表打开成功告之司机端
CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "11".toByteArray())
}
} else {
CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "10".toByteArray())
}
} else {
//第1个0代表运营面板开关关闭第2个1代表关闭成功告之司机端; 相应的还有状态00表示关闭失败
CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "01".toByteArray())
}
} catch (t: Throwable) {
t.printStackTrace()
Log.e(TAG, "乘客屏收到司机屏转发的驾驶位视频流开关--- 3 ---", t)
}
return
}
when (it.protocolType) {
MogoProtocolMsg.NORMAL_DATA -> {
try {
@@ -349,6 +386,11 @@ class TeleMsgHandler : IMsgHandler {
)
}
TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP -> {
// 来自客户端的响应
CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, it.body)
}
else -> {
}
}

View File

@@ -0,0 +1,28 @@
package com.mogo.eagle.core.function.datacenter.iot
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener
import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager
import com.mogo.support.device.DevicesManager
object IotInItManager : IMoGoCloudListener {
private const val TAG = "IotInIt"
fun init() {
CallerCloudListenerManager.addListener(TAG, this)
hardwareDeviceBind(SharedPrefsMgr.getInstance().sn)
}
override fun tokenGot(token: String, sn: String) {
super.tokenGot(token, sn)
hardwareDeviceBind(sn)
}
private fun hardwareDeviceBind(sn: String) {
if (sn.isNotEmpty()) {
DevicesManager.init(AbsMogoApplication.getApp(), sn)
}
}
}

View File

@@ -57,6 +57,8 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager
import com.zhjt.mogo_core_function_devatools.block.MoGoBlockProviderImpl
import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartManager
import com.zhjt.mogo_core_function_devatools.driver.video.DriveSeatVideoProviderImpl
import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
import com.zhjt.mogo_core_function_devatools.exam.ExamControlManager
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter
@@ -125,6 +127,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener {
ARouter.getInstance().build(MogoServicePaths.PATH_MAP_ROUTE_GUIDE).navigation() as? IMapRouteProvider
}
private val driveSeatVideoProvider by lazy { DriveSeatVideoProviderImpl() }
@Volatile
private var lastCanAutopilotStatus: Int? = null
@@ -682,4 +686,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener {
override fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int) {
TakeOverManager.takeOverManager.takeOver(takeOverAnnotation)
}
override fun driveSeatVideoProvider(): IDriveSeatVideoProvider {
return driveSeatVideoProvider
}
}

View File

@@ -0,0 +1,155 @@
package com.zhjt.mogo_core_function_devatools.driver.video
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import android.view.View
import androidx.core.view.doOnAttach
import androidx.core.view.doOnDetach
import com.mogo.commons.constants.HostConst
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider
import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event
import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event.Failed
import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event.Loading
import com.mogo.eagle.core.function.api.driver.video.IDriveSeatVideoProvider.Event.Playing
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.util.AppStateManager
import com.tencent.liteav.basic.log.TXCLog
import com.tencent.rtmp.ITXLivePlayListener
import com.tencent.rtmp.TXLiveConstants
import com.tencent.rtmp.TXLivePlayConfig
import com.tencent.rtmp.TXLivePlayer
import com.tencent.rtmp.ui.TXCloudVideoView
import com.zhjt.mogo_core_function_devatools.driver.video.vo.VideoUrlData
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Query
import java.lang.ref.WeakReference
class DriveSeatVideoProviderImpl: IDriveSeatVideoProvider {
companion object {
private const val TAG = "DriveSeatVideoProvider"
}
@Volatile
private var target: WeakReference<TXCloudVideoView>? = null
@Volatile
private var timer: Job? = null
private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) }
private var data: VideoUrlData? = null
internal interface IVideoLiveUrlApi {
@Headers("Content-Type:application/json;charset=UTF-8")
@GET("/eagleEye-mis/camera/monitor/watch/status")
suspend fun requestVideoLiveUrl(@Query(value = "numberPlate") numberPlate: String, @Query("cameraType") cameraType: Int, @Query("protocolType") protocolType: Int): BaseResponse<VideoUrlData>
}
override suspend fun requestVideoInfo(): VideoUrlData? {
val plateNumber = AppConfigInfo.plateNumber
if (TextUtils.isEmpty(plateNumber)) {
Log.e(TAG, "-- isVideoLiveUsable -- plate number is empty.")
return null
}
val resp = getApi()?.requestVideoLiveUrl(plateNumber, 2, 2) ?: return null
Log.e(TAG, "-- isVideoLiveUsable -- receive response: {code: ${resp.code}, msg: ${resp.msg}, result: ${resp.result}}")
data = resp.result
return resp.result
}
override fun getDriveVideoView(playUrl: String, playCallback: ((Event) -> Unit)?): View? {
val activity = AppStateManager.currentActivity() ?: return null
val t = target?.get()
if (t != null) {
return t
}
val x = TXCloudVideoView(activity)
Log.d(TAG, "getDriveVideoView --> $playUrl")
x.doOnAttach {
Log.d(TAG, "onAttachToWindow --> $playUrl")
val player = TXLivePlayer(activity)
player.setPlayerView(x)
player.setMute(true)
TXCLog.setLevel(4)
val config = TXLivePlayConfig()
config.setConnectRetryCount(30)
player.setConfig(config)
player.enableHardwareDecode(true)
player.startPlay(playUrl, TXLivePlayer.PLAY_TYPE_LIVE_RTMP)
player.setPlayListener(object : ITXLivePlayListener {
override fun onPlayEvent(event: Int, bundle: Bundle?) {
Log.d(TAG, "直播信息 => event: $event, playUrl: $playUrl, bundle: $bundle")
if (event == TXLiveConstants.PLAY_EVT_PLAY_LOADING) {
Log.d(TAG, "play loading...")
playCallback?.invoke(Loading)
} else if (event == TXLiveConstants.PLAY_EVT_PLAY_BEGIN) {
Log.d(TAG, "play begin...")
start()
playCallback?.invoke(Playing)
} else {
if (event < 0) {
Log.d(TAG, "play failed...$event, bundle: $bundle")
stop()
playCallback?.invoke(Failed(bundle?.toString() ?: "播放失败"))
}
}
}
override fun onNetStatus(bundle: Bundle?) {
Log.d(TAG, "直播信息 => onNetStatus -> $bundle")
}
})
x.doOnDetach {
Log.d(TAG, "-- onDetachedFromWindow ---: $playUrl")
try {
player.stopPlay(true)
stop()
} finally {
target?.clear()
}
}
}
target = WeakReference(x)
return x
}
override fun getLastData(): VideoUrlData? {
return data
}
private fun start() {
timer?.cancel()
scope.launch {
val result = requestVideoInfo()
if (result != null) {
data = result
}
delay(5000)
}.also {
timer = it
}
}
private fun stop() {
timer?.cancel()
}
private fun getApi(): IVideoLiveUrlApi? {
return MoGoRetrofitFactory.getInstanceNoCallAdapter(HostConst.getHost()).create(IVideoLiveUrlApi::class.java)
}
}

View File

@@ -81,6 +81,8 @@ dependencies {
implementation rootProject.ext.dependencies.preference_ktx
implementation rootProject.ext.dependencies.amapsearch
// 硬件管理
compileOnly project(":libraries:mogo-hardware-devices")
implementation rootProject.ext.dependencies.thread_opt
api project(':test:crashreport-apmbyte')
compileOnly project(':core:function-impl:mogo-core-function-datacenter')

View File

@@ -216,7 +216,12 @@ class StartAutoPilotStatusView @JvmOverloads constructor(
if (isAnyOneError) R.drawable.icon_no_fsm_status_bg_error
else R.drawable.icon_no_fsm_status_bg_normal
)
notifyStatus(isAnyOneError)
if (!hasFSM.get()) {
notifyStatus(isAnyOneError)
Logger.d(TAG, "--- handleWithoutFSM --- do update")
} else {
Logger.d(TAG, "--- handleWithoutFSM --- do not update")
}
}
private fun notifyStatus(isError: Boolean) {

View File

@@ -29,6 +29,7 @@ import com.iflytek.cloud.RecognizerListener
import com.iflytek.cloud.RecognizerResult
import com.iflytek.cloud.SpeechError
import com.iflytek.cloud.SpeechRecognizer
import com.mogo.commons.env.ProjectUtils
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.deva.report.CategoryInfo
@@ -173,7 +174,9 @@ class FaultReasonView @JvmOverloads constructor(
iconDown?.setBounds(0, 0, iconDown.minimumWidth, iconDown.minimumHeight)
iconUp?.setBounds(0, 0, iconUp.minimumWidth, iconUp.minimumHeight)
//获取一级分类
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId, 1, 0, type, 0)
if(ProjectUtils.isSaas()){
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId, 1, 0, type, 0)
}
//弹窗展示时间
tvFaultTime.text =
millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())
@@ -538,7 +541,9 @@ class FaultReasonView @JvmOverloads constructor(
override fun getCategoriesError(msg: String) {
super.getCategoriesError(msg)
ToastUtils.showShort("故障列表获取失败:$msg")
if(ProjectUtils.isSaas()){
ToastUtils.showShort("故障列表获取失败:$msg")
}
}
override fun onVisibilityAggregated(isVisible: Boolean) {
@@ -546,7 +551,9 @@ class FaultReasonView @JvmOverloads constructor(
if(visibility == View.VISIBLE){
CallerDevaToolsListenerManager.addListener(TAG, this)
//获取一级分类
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId, 1, 0, type, 0)
if(ProjectUtils.isSaas()){
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId, 1, 0, type, 0)
}
//弹窗展示时间
tvFaultTime.text =
millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())

View File

@@ -191,6 +191,8 @@ class ReportTypeView @JvmOverloads constructor(
}
}
oneClickTimer?.start()
//请求一键上报故障码
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,level,0,4,1)
}
/**
@@ -296,9 +298,11 @@ class ReportTypeView @JvmOverloads constructor(
Log.i(TAG,"onAutopilotStatistics status = "+ it.status)
if(it.status == AutopilotStatistics.AUTOPILOT_START_STATUS.FAILED){
//触发一键上报
ThreadUtils.runOnUiThread {
if(!typeSelectStatus){
showOneCLickReportView()
if(ProjectUtils.isSaas()){
ThreadUtils.runOnUiThread {
if(!typeSelectStatus){
showOneCLickReportView()
}
}
}
}

View File

@@ -31,6 +31,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN
import com.mogo.eagle.core.function.api.setting.ISopSettingListener
import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager
@@ -41,6 +42,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.obu.CallerObuApiManager
import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager
import com.mogo.eagle.core.function.call.vehicle.CallerSweeperModeListenerManager
@@ -59,11 +61,13 @@ import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.vehicle.SweeperVehicleConfigUtils
import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration
import com.mogo.eagle.core.utilcode.util.AppStateManager
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.GsonUtils.*
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.zhjt.mogo.adas.data.AdasConstants
import com.zhjt.mogo.adas.data.bean.AdasParam
import kotlinx.android.synthetic.main.layout_operate_panel.view.iv_operate_panel_close
import kotlinx.android.synthetic.main.layout_operate_panel_preference_widget_switch_compat.switchWidget
import kotlinx.coroutines.launch
import me.jessyan.autosize.utils.AutoSizeUtils
import mogo.telematics.pad.MessagePad
@@ -669,9 +673,10 @@ class OperatePanelLayout : LinearLayout {
}
}
class BusinessPreferenceFragmentCompat : OperatePanelDetailBase() {
class BusinessPreferenceFragmentCompat : OperatePanelDetailBase(), IReceivedMsgListener {
companion object {
private const val TAG = "BusinessPreferenceFragmentCompat"
private const val KEY_FAULT_REPORT_TIP = "fault_report_tip"
private const val KEY_LIMIT_SPEED_MARKER = "limit_speed_marker"
private const val KEY_WEATHER_EFFECT_SWITCH = "weather_effect_switch"
@@ -680,6 +685,22 @@ class OperatePanelLayout : LinearLayout {
private const val KEY_UNMANNED_DEMO_PULL_INTERVAL = "unmanned_demo_pull_interval"
private const val KEY_SWEEPER_CLOUD_CONTROL = "sweeper_cloud_control"
private const val KEY_LOOK_AROUND_360 = "look_around_360"
private const val KEY_DRIVE_SEAT_VIDEO_STREAM = "drive_seat_video_stream"
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
CallerTelematicListenerManager.addListener(TAG, this)
lifecycleScope.launchWhenResumed {
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also {
it.isEnabled = CallerDevaToolsManager.driveSeatVideoProvider()?.requestVideoInfo()?.livePlayUrl?.isNotEmpty() ?: false
}
}
}
override fun onDestroyView() {
super.onDestroyView()
CallerTelematicListenerManager.removeListener(TAG)
}
override fun getDefaultVal(pref: Preference): Any? {
@@ -758,6 +779,30 @@ class OperatePanelLayout : LinearLayout {
return super.onPreferenceClick(preference)
}
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {
if (type == TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP) {
val s = String(byteArray)
clickEventAnalytics("视频流驾驶位开头-RSP->$s", false)
lifecycleScope.launchWhenResumed {
when(s) {
"01" -> {
//关闭成功
FunctionBuildConfig.isDriveSeatVideoStream = false
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also { changeValue(it, false) }
}
"11" -> {
//打开成功
FunctionBuildConfig.isDriveSeatVideoStream = true
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also { changeValue(it, true) }
}
else -> {
//关闭失败或打开失败
}
}
}
}
}
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
when (preference.key) {
KEY_FAULT_REPORT_TIP -> {
@@ -848,6 +893,15 @@ class OperatePanelLayout : LinearLayout {
clickEventAnalytics("清扫云控业务", isChecked)
return true
}
KEY_DRIVE_SEAT_VIDEO_STREAM -> {
val isChecked = newValue as? Boolean ?: false
clickEventAnalytics("视频流驾驶位开关", isChecked)
val map = HashMap<String, String>()
map["open"] = if (isChecked) "1" else "0"
map["playUrl"] = CallerDevaToolsManager.driveSeatVideoProvider()?.getLastData()?.livePlayUrl ?: ""
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_REQ, toJson(map).toByteArray())
return false
}
}
return super.onPreferenceChange(preference, newValue)
}

View File

@@ -21,6 +21,7 @@ import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.ListPopupWindow
import androidx.appcompat.widget.PopupMenu
import androidx.constraintlayout.widget.ConstraintLayout
@@ -135,6 +136,8 @@ import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS
import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_TOP
import com.mogo.map.uicontroller.VisualAngleMode.MODE_LONG_SIGHT
import com.mogo.tts.base.IMogoTTSCallback
import com.mogo.support.device.DevicesManager
import com.mogo.support.device.IBindStateChangeListener
import com.zhjt.mogo.adas.data.AdasConstants
import com.zhjt.service.chain.ChainLog
import kotlinx.android.synthetic.main.view_debug_setting.view.appVersionInfoLayout
@@ -276,6 +279,7 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.tvDriverServerStar
import kotlinx.android.synthetic.main.view_debug_setting.view.tvGearInfo
import kotlinx.android.synthetic.main.view_debug_setting.view.tvGitBranchInfo
import kotlinx.android.synthetic.main.view_debug_setting.view.tvHDCityCode
import kotlinx.android.synthetic.main.view_debug_setting.view.tvHardwareDeviceBindState
import kotlinx.android.synthetic.main.view_debug_setting.view.tvIPCMac
import kotlinx.android.synthetic.main.view_debug_setting.view.tvIdentifyInfo
import kotlinx.android.synthetic.main.view_debug_setting.view.tvIdentifyInfoCopy
@@ -357,7 +361,7 @@ internal class DebugSettingView @JvmOverloads constructor(
IMoGoChassisStatesListener,
IMoGoSweeperFutianCleanSystemListener,
IMoGoObuInfoListener,
ISopSettingListener, IViewControlListener, IMoGoCloudListener {
ISopSettingListener, IViewControlListener, IMoGoCloudListener, IBindStateChangeListener {
companion object {
private const val TAG = "DebugSettingView"
@@ -480,6 +484,7 @@ internal class DebugSettingView @JvmOverloads constructor(
}
CallerObuInfoListenerManager.addListener(TAG, this)
DevicesManager.addBindStateChangeListener(TAG,this)
}
override fun onDetachedFromWindow() {
@@ -509,7 +514,7 @@ internal class DebugSettingView @JvmOverloads constructor(
CallerSopSettingManager.removeListener(TAG)
CallerHmiViewControlListenerManager.removeListener(TAG)
DevicesManager.removeBindStateChangeListener(TAG)
// 移除 业务配置监听
CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(
FuncBizConfig.FOUNDATION,
@@ -1329,6 +1334,40 @@ internal class DebugSettingView @JvmOverloads constructor(
}
CallerHmiManager.toggleHdMapVisualAngleAdjust(isChecked)
}
//硬件服务绑定状态以及版本
tvHardwareDeviceBindState.setOnClickListener {
val state = when (DevicesManager.getServiceBindState()) {
0 -> {
"绑定成功"
}
1 -> {
"绑定失败未安装“硬件服务”APP"
}
2 -> {
"绑定失败:没有绑定权限或找不到服务"
}
3 -> {
"服务被异常销毁"
}
else -> {
"未知"
}
}
var msg = "客户端SDK版本${DevicesManager.getSDKVersion() ?: "未知"}\n"
msg += "客户端SDK AIDL版本${DevicesManager.getSDKAIDLVersion() ?: "未知"}\n"
msg += "硬件服务端APP版本${DevicesManager.getServerVersion() ?: "未知"}\n"
msg += "硬件服务端APP AIDL版本${DevicesManager.getServerAIDLVersion() ?: ""}"
AlertDialog.Builder(context)
.setTitle("硬件服务绑定状态: $state")
.setMessage(msg)
.setPositiveButton("确定", null)
.create().show()
}
}
/**
@@ -2725,4 +2764,31 @@ internal class DebugSettingView @JvmOverloads constructor(
private fun invokeCronetResult(json: String) {
CallerLogger.d(SceneConstant.M_HMI + "CronetNetwork", json)
}
override fun onServiceState(state: Int) {
val stateMsg = when (state) {
0 -> {
"绑定成功"
}
1 -> {
"绑定失败未安装“硬件服务”APP"
}
2 -> {
"绑定失败:没有绑定权限或找不到服务"
}
3 -> {
"服务被异常销毁"
}
else -> {
"未知"
}
}
UiThreadHandler.post {
tvHardwareDeviceBindState.text = "硬件服务绑定状态: $stateMsg"
}
}
}

View File

@@ -681,6 +681,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#F0F0F0" />
<TextView
android:id="@+id/tvHardwareDeviceBindState"
style="@style/DebugSettingText"
android:text="硬件服务绑定状态: 未知"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#F0F0F0" />
<TextView
android:id="@+id/tvBackgroundOperation"
style="@style/DebugSettingText"

View File

@@ -51,5 +51,12 @@
android:title="360环视"
android:persistent="false"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<SwitchPreferenceCompat
android:key="drive_seat_video_stream"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:title="驾驶位视频流"
android:persistent="false"
android:enabled="false"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>