diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 7d319d46b7..3ce8f98c2e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -895,6 +895,14 @@ class MoGoHmiFragment : MvpFragment downloadVersion, upgradeStatus ) + //将状态同步到调试窗 + mDebugSettingView?.setAdUpgradeInfo( + upgradeMode, + downloadStatus, + currentProgress, + totalProgress, + downloadVersion, + upgradeStatus) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index dce53f699f..d2fec88cd1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -1,11 +1,14 @@ package com.mogo.eagle.core.function.hmi.ui.setting +import android.annotation.SuppressLint import android.content.Context +import android.graphics.Color import android.text.Html import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig @@ -36,7 +39,10 @@ import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView +import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog +import com.mogo.eagle.core.function.hmi.ui.tools.DockerRebootDialog import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr @@ -90,6 +96,19 @@ class DebugSettingView @JvmOverloads constructor( // 全局路径规划点个数 private var mRouteInfoSize = 0 + //当前PAD支持的CPU架构 + private var cpuList = "CPU架构:" + + private var dockerRebootDialog: DockerRebootDialog? = null //docker重启对话框 + private var adUpgradeDialog : AdUpgradeDialog? = null //工控机升级对话框 + private var upgradeMode: Int=-1 //升级模式 + private var downloadStatus: Int=-1 //下载状态 + private var currentProgress: Int=-1 //当前已下载包体大小 + private var previousProgress: Int=-1 //前一秒的下载进度,用于计算下载剩余时间 + private var totalProgress: Int=-1 //包体总大小 + private var downloadVersion: String?=null //工控机docker版本 + private var upgradeStatus: Int=-1 //升级状态 + private val mapUiController by lazy { CallerMapUIServiceManager.getMapUIController() } @@ -127,8 +146,6 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotIdentifyListenerManager.addListener(TAG, this) // 添加 规划路径相关回调 监听 CallerAutopilotPlanningListenerManager.addListener(TAG, this) - // 添加 工控机基础信息回调 监听 - CallerAutopilotCarConfigListenerManager.addListener(TAG, this) if (logInfoView != null) { logInfoView!!.onEnterForeground() } @@ -161,14 +178,200 @@ class DebugSettingView @JvmOverloads constructor( } private fun initView() { - btnOpenDebugSettingViewControl.setOnCheckedChangeListener { buttonView, isChecked -> - if (isChecked) { - flViewControl.visibility = View.VISIBLE - } else { - flViewControl.visibility = View.GONE + val iconDown = ContextCompat.getDrawable(context,R.drawable.icon_down) + iconDown?.setBounds(0,0,iconDown.minimumWidth,iconDown.minimumHeight) + val iconRight = ContextCompat.getDrawable(context,R.drawable.icon_right) + iconRight?.setBounds(0,0,iconRight.minimumWidth,iconRight.minimumHeight) + + /** + * 设备绑定关系 + */ + tbDeviceBind.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示隐藏设备绑定关系视图 + deviceBindLayout.visibility =View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //默认隐藏设备绑定关系视图 + deviceBindLayout.visibility =View.GONE } } + /** + * 版本信息 + */ + tbAppVersionInfo.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示版本信息 + appVersionInfoLayout.visibility = View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏版本信息 + appVersionInfoLayout.visibility = View.GONE + } + } + /** + * 状态中心 + */ + tbStatusCenter.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示状态中心 + statusCenterLayout.visibility = View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏状态中心 + statusCenterLayout.visibility = View.GONE + } + } + + + for(element in DeviceUtils.getABIs()){ + cpuList = "$cpuList$element " + } + tvCPUFrameworkInfo.text =cpuList + + /** + * 控制中心 + */ + tbControlCenter.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示控制中心 + controlCenterLayout.visibility = View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏控制中心 + controlCenterLayout.visibility = View.GONE + } + } + + /** + * 域控制器 + */ + tbDomainController.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示域控制器 + domainControllerLayout.visibility = View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏域控制器 + domainControllerLayout.visibility = View.GONE + } + } + + /** + * OBU控制中心 + */ + tbObuController.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示OBU控制中心 + obuControllerLayout.visibility = View.VISIBLE + + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏OBU控制中心 + obuControllerLayout.visibility = View.GONE + } + } + + /** + * HMI控制中心 + */ + tbHmiController.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示HMI控制中心 + hmiControllerLayout.visibility = View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏HMI控制中心 + hmiControllerLayout.visibility = View.GONE + } + } + + /** + * 高精地图控制中心 + */ + tbHdMapController.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示高精地图控制中心 + hdMapControllerLayout.visibility = View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏高精地图控制中心 + hdMapControllerLayout.visibility = View.GONE + } + } + + /** + * 日志中心 + */ + tbLogcatCenter.setOnCheckedChangeListener { buttonView, isChecked -> + if(isChecked){ + buttonView.setCompoundDrawables(null,null,iconDown,null) + //展示日志中心 + logcatCenterLayout.visibility = View.VISIBLE + }else{ + buttonView.setCompoundDrawables(null,null,iconRight,null) + //隐藏日志中心 + logcatCenterLayout.visibility = View.GONE + } + } + + + + lastVisualAngleMode = mapUiController?.currentMapVisualAngle + + /** + * 切换到顶视角 + */ + changesight_top_btn.onClick { + mapUiController?.changeMapVisualAngle(MAP_STYLE_VR_ANGLE_TOP, null) + } + + /** + * 切换到后方来车视角 + */ + changesight_back_btn?.onClick { + mapUiController?.changeMapVisualAngle(MAP_STYLE_VR_ANGLE_300, null) + } + + /** + * 切换到十字路口视角 + */ + changesight_cross_btn?.onClick { + mapUiController?.changeMapVisualAngle(MAP_STYLE_VR_ANGLE_CROSS, null) + } + + /** + * 切换到远视角 + */ + changesight_far_btn?.onClick { + mapUiController?.changeMapVisualAngle(MODE_LONG_SIGHT, null) + } + + /** + * 恢复视角 + */ + reset_changesight?.onClick { + lastVisualAngleMode?.let { + mapUiController?.changeMapVisualAngle(it, null) + } + } + + + + + + /** + * 修改自车按钮(出租车、小巴车) + */ tbChangeCurrentCarIcon.setOnCheckedChangeListener { buttonView, isChecked -> if (!isChecked) { // 替换为出租车图标 @@ -179,79 +382,20 @@ class DebugSettingView @JvmOverloads constructor( } } - tbSpeedView.setOnCheckedChangeListener { buttonView, isChecked -> - if (!isChecked) { - CallerHmiManager.setSpeedChartViewVisibility(View.VISIBLE) - } else { - CallerHmiManager.setSpeedChartViewVisibility(View.GONE) - } - } + //域控制器中心事件点击监听 + setDomainControllerCheckedChangeListener() + //Hmi控制中心事件点击监听 + setHmiCheckedChangeListener() + //日志中心事件点击监听 + setLogCheckedChangeListener() - tbAutopilotStatusView.setOnCheckedChangeListener { buttonView, isChecked -> - if (!isChecked) { - CallerHmiManager.setAutopilotStatusViewVisibility(View.VISIBLE) - } else { - CallerHmiManager.setAutopilotStatusViewVisibility(View.GONE) - } - } - tbPerspectiveSwitchView.setOnCheckedChangeListener { buttonView, isChecked -> - if (!isChecked) { - CallerHmiManager.setPerspectiveSwitchViewVisibility(View.VISIBLE) - } else { - CallerHmiManager.setPerspectiveSwitchViewVisibility(View.GONE) - } - } - tbCheckStatusView.setOnCheckedChangeListener { buttonView, isChecked -> - if (!isChecked) { - CallerHmiManager.setToolsViewVisibility(View.VISIBLE) - } else { - CallerHmiManager.setToolsViewVisibility(View.GONE) - } - } - - tbOpenLight.setOnCheckedChangeListener { buttonView, isChecked -> - if (!isChecked) { - CallerHmiManager.setTurnLightFunction(true) - } else { - CallerHmiManager.setTurnLightFunction(false) - } - } - - tbOpenBrakeLight.setOnCheckedChangeListener { buttonView, isChecked -> - if (!isChecked) { - CallerHmiManager.setBrakeLightFunction(true) - } else { - CallerHmiManager.setBrakeLightFunction(false) - } - } - - lastVisualAngleMode = mapUiController?.currentMapVisualAngle - - changesight_top_btn.onClick { - mapUiController?.changeMapVisualAngle(MAP_STYLE_VR_ANGLE_TOP, null) - } - - changesight_back_btn?.onClick { - mapUiController?.changeMapVisualAngle(MAP_STYLE_VR_ANGLE_300, null) - } - - changesight_cross_btn?.onClick { - mapUiController?.changeMapVisualAngle(MAP_STYLE_VR_ANGLE_CROSS, null) - } - - changesight_far_btn?.onClick { - mapUiController?.changeMapVisualAngle(MODE_LONG_SIGHT, null) - } - - reset_changesight?.onClick { - lastVisualAngleMode?.let { - mapUiController?.changeMapVisualAngle(it, null) - } - } + //OBU配置信息 tvObuInfo.text = CallerObuListenerManager.getObuStatusInfoJsonString() + + //工控机配置信息 tvAutopilotInfo.text = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfoJsonString() @@ -274,26 +418,27 @@ class DebugSettingView @JvmOverloads constructor( } } - // 初始化工控机 IP信息 - val autoPilotIpAddress = - SharedPrefsMgr.getInstance(context) - .getString(MoGoConfig.AUTOPILOT_IP, FunctionBuildConfig.adasConnectIP) + //TODO 选中背景 - etAutopilotIP.setText(autoPilotIpAddress) - etAutopilotIP.text?.let { etAutopilotIP.setSelection(it.length) } + // 演示模式,上一次勾选的数据 + tbIsDemoMode.isChecked = FunctionBuildConfig.isDemoMode - btnSetAutopilotIP.setOnClickListener { - val autoPilotIp = etAutopilotIP.text.toString() - if (autoPilotIp.isNotEmpty()) { - CallerAutoPilotManager.resetIpAddress(autoPilotIp) - } else { - ToastUtils.showShort("请输入正确的IP地址") + // 演示模式 + tbIsDemoMode.setOnCheckedChangeListener { _, isChecked -> + CallerAutoPilotManager.setDemoMode(isChecked) + FunctionBuildConfig.isDemoMode = isChecked + tbIsDrawAutopilotTrajectoryData.isEnabled = !isChecked + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = isChecked + if (!FunctionBuildConfig.isDemoMode) { + tbIsDrawAutopilotTrajectoryData.isChecked = false } + SharedPrefsMgr.getInstance(context).putBoolean(MoGoConfig.IS_DEMO_MODE, isChecked) } - // 域控制器 - btnRecordPackage.setOnClickListener { - CallerAutoPilotManager.recordPackage() + + // 演示模式,上一次勾选的数据 + tbIsDrawAutopilotTrajectoryData.setOnCheckedChangeListener { buttonView, isChecked -> + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = isChecked } // 初始化 GSP数据源 数据 @@ -325,6 +470,8 @@ class DebugSettingView @JvmOverloads constructor( } } + + // 初始化 ADAS感知数据是否绘制 选择情况 tbIsDrawIdentifyData.isChecked = FunctionBuildConfig.isDrawIdentifyData tbIsDrawIdentifyData.setOnCheckedChangeListener { buttonView, isChecked -> @@ -337,53 +484,277 @@ class DebugSettingView @JvmOverloads constructor( FunctionBuildConfig.isDrawUnknownIdentifyData = isChecked } - // 初始化 OBU感知数据是否绘制 选择情况 - tbIsDrawOBUIdentifyData.isChecked = FunctionBuildConfig.isDrawObuIdentifyData - tbIsDrawOBUIdentifyData.setOnCheckedChangeListener { buttonView, isChecked -> - FunctionBuildConfig.isDrawObuIdentifyData = isChecked - } - - // 演示模式,上一次勾选的数据 - cbIsDrawAutopilotTrajectoryData.setOnCheckedChangeListener { buttonView, isChecked -> - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = isChecked - } - - // 演示模式,上一次勾选的数据 - tbIsDemoMode.isChecked = FunctionBuildConfig.isDemoMode - - // 演示模式 - tbIsDemoMode.setOnCheckedChangeListener { _, isChecked -> - CallerAutoPilotManager.setDemoMode(isChecked) - FunctionBuildConfig.isDemoMode = isChecked - cbIsDrawAutopilotTrajectoryData.isEnabled = !isChecked - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = isChecked - if (!FunctionBuildConfig.isDemoMode) { - cbIsDrawAutopilotTrajectoryData.isChecked = false - } - SharedPrefsMgr.getInstance(context).putBoolean(MoGoConfig.IS_DEMO_MODE, isChecked) - } +// // 初始化 OBU感知数据是否绘制 选择情况 +// tbIsDrawOBUIdentifyData.isChecked = FunctionBuildConfig.isDrawObuIdentifyData +// tbIsDrawOBUIdentifyData.setOnCheckedChangeListener { buttonView, isChecked -> +// FunctionBuildConfig.isDrawObuIdentifyData = isChecked +// } // 模拟自动驾驶中 tbChangeAutoPilotStatus.setOnCheckedChangeListener { buttonView, isChecked -> CallerAutoPilotManager.setControlAutopilotCarAuto(isChecked) } - tbSelfLog.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - Logger.init(LogLevel.OFF) - MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = false + + } + + /** + * 设置域控制器点击监听 + */ + private fun setDomainControllerCheckedChangeListener(){ + + // 初始化工控机 IP信息 + val autoPilotIpAddress = + SharedPrefsMgr.getInstance(context) + .getString(MoGoConfig.AUTOPILOT_IP, FunctionBuildConfig.adasConnectIP) + + etAutopilotIP.setText(autoPilotIpAddress) + etAutopilotIP.text?.let { etAutopilotIP.setSelection(it.length) } + //设置工控机IP + btnSetAutopilotIP.setOnClickListener { + val autoPilotIp = etAutopilotIP.text.toString() + if (autoPilotIp.isNotEmpty()) { + CallerAutoPilotManager.resetIpAddress(autoPilotIp) } else { - Logger.init(LogLevel.DEBUG) - MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = true + ToastUtils.showShort("请输入正确的IP地址") } } - tbADASLog.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CallerAutoPilotManager.setEnableLog(true) - } else { - CallerAutoPilotManager.setEnableLog(false) + + + updateSpeedSettingViews() + + /** + * 设置最大速度 + */ + btnSetAutopilotSpeed.onClick{ + if(AppConfigInfo.isConnectAutopilot){ + val speedStr = etInputSpeed.text?.toString() + try { + if(speedStr.isNullOrEmpty()){ + ToastUtils.showShort("请输入最大车速") + } + val speed = speedStr?.toInt() + if(speed!=null && speed>0 && speed<60){ + // 设置自动驾驶速度 + val isSuccess = CallerAutoPilotManager.setAutoPilotSpeed(speed) + when { + isSuccess -> { + ToastUtils.showShort("车速设置成功,立即生效") + } + else -> { + ToastUtils.showShort("设置车速失败,请启动域控制器") + } + } + }else{ + ToastUtils.showShort("最大车速应大于0且小于60") + } + }catch (e: Exception){ + ToastUtils.showShort("车速设置失败,请正确设置车速") + } + }else{ + ToastUtils.showShort("设置车速失败,请启动域控制器") } } + + /** + * 录制Bag包 + */ + btnRecordPackage.onClick{ + val recordTimeStr = etInputRecordTime.text?.toString() + try{ + if(recordTimeStr.isNullOrEmpty()){ + CallerAutoPilotManager.recordPackage() + } + val recordTime = recordTimeStr?.toInt() + if(recordTime!=null && recordTime>0){ + CallerAutoPilotManager.recordPackage(recordTime) + }else{ + CallerAutoPilotManager.recordPackage() + } + }catch (e: Exception){ + CallerAutoPilotManager.recordPackage() + } + } + + /** + * 工控机升级 + */ + btnSystemUpgrade.onClick{ + if(AppConfigInfo.isConnectAutopilot){ + Logger.i(TAG,"upgradeMode="+upgradeMode+" downloadStatus="+downloadStatus+" upgradeStatus="+upgradeStatus) + if(AdUpgradeStateHelper.isDownloading(downloadStatus)){ + //点击Toast提示:下载剩余时间 + ToastUtils.showShort("预计"+AdUpgradeStateHelper.getRemainingTime(totalProgress,previousProgress,currentProgress)+"下载完成") + }else if(AdUpgradeStateHelper.getUpgradeStatus()){ + //工控机状态为“升级中” + ToastUtils.showShort("新版本升级中,预计5分钟升级完成") + }else if(AdUpgradeStateHelper.isUpgradeFailed(upgradeStatus)){ + //如果升级失败,则Toast提示:升级失败,请联系运维人员 + ToastUtils.showShort("升级失败,请联系运维人员") + }else if(AdUpgradeStateHelper.isHintUpgradeMode(upgradeMode) && AdUpgradeStateHelper.isDownloadFinish(downloadStatus,upgradeStatus)){ + //如果升级模式为“提示升级”,并且下载状态为已经下载完成,点击弹出升级确认弹窗 + if(adUpgradeDialog == null){ + adUpgradeDialog = AdUpgradeDialog(context) + adUpgradeDialog?.setClickListener(object : AdUpgradeDialog.ClickListener{ + override fun confirm() { + if(mAutoPilotStatusInfo?.state==2){ + //当前处于自动驾驶状态,不可进行升级,Toast提示 + ToastUtils.showShort("升级前请先退出自动驾驶模式") + }else{ + //确认升级 + Logger.i(TAG,"upgrade confirm") + //设置当前状态为“升级中” + AdUpgradeStateHelper.setUpgradeStatus(true) + CallerAutoPilotManager.setIPCUpgradeAffirm() + } + } + + override fun cancel() { + //取消升级 + Logger.i(TAG,"upgrade cancel") + //取消升级命令不下发 +// CallerAutoPilotManager.setIPCUpgradeCancel() + } + + }) + } + adUpgradeDialog?.showUpgradeDialog() + }else{ + ToastUtils.showShort("当前工控机处于最新版本状态,不可升级") + } + }else{ + ToastUtils.showShort("域控制器未连接") + } + + + } + + /** + * 重启系统 + */ + btnSystemRestart.onClick{ + if(AppConfigInfo.isConnectAutopilot){ + if(dockerRebootDialog == null){ + dockerRebootDialog = DockerRebootDialog(context) + dockerRebootDialog?.setClickListener(object : DockerRebootDialog.ClickListener{ + override fun confirm() { + if(mAutoPilotStatusInfo?.state==2){ + //当前处于自动驾驶状态,不可进行重启,Toast提示 + ToastUtils.showShort("请先退出自动驾驶状态") + }else if(AdUpgradeStateHelper.showCannotReboot(downloadStatus, upgradeStatus)){ + //当工控机处于下载或者升级状态,需要先进行升级 + ToastUtils.showShort("请先完成新自动驾驶系统的下载/升级") + } else{ + //确认重启 + Logger.i(TAG,"reboot confirm") + CallerAutoPilotManager.setIPCReboot() + } + } + + override fun cancel() { + //取消重启 + Logger.i(TAG,"reboot cancel") + } + + }) + } + dockerRebootDialog?.showUpgradeDialog() + }else{ + ToastUtils.showShort("域控制器未连接") + } + + + } + + } + + /** + * Bus不可设置自动驾驶速度,而Taxi可以 + */ + private fun updateSpeedSettingViews() { + when { + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) -> { + btnSetAutopilotSpeed.visibility = View.GONE + llSpeedLayout.visibility = View.GONE + } + else -> { + btnSetAutopilotSpeed.visibility = View.VISIBLE + llSpeedLayout.visibility = View.VISIBLE + } + } + } + + /** + * 设置工控机下载、升级状态信息 + * @param upgradeMode 升级模式(提示升级、静默升级) + * @param downloadStatus 下载状态 + * @param currentProgress 当前已经下载包体大小 + * @param totalProgress 下载包体总大小 + * @param downloadVersion 下载版本 + * @param upgradeStatus 升级状态 + */ + fun setAdUpgradeInfo(upgradeMode: Int,downloadStatus: Int,currentProgress: Int,totalProgress: Int, + downloadVersion: String,upgradeStatus: Int){ + this.upgradeMode=upgradeMode + this.downloadStatus=downloadStatus + this.previousProgress=this.currentProgress + this.currentProgress=currentProgress + this.totalProgress=totalProgress + this.downloadVersion=downloadVersion + this.upgradeStatus=upgradeStatus + } + + /** + * 设置Hmi点击监听 + */ + private fun setHmiCheckedChangeListener(){ + /** + * 显示、隐藏迈速表 + */ + tbSpeedView.setOnCheckedChangeListener { buttonView, isChecked -> + if (!isChecked) { + CallerHmiManager.setSpeedChartViewVisibility(View.VISIBLE) + } else { + CallerHmiManager.setSpeedChartViewVisibility(View.GONE) + } + } + + /** + * 显示、隐藏“自动驾驶控制按钮” + */ + tbAutopilotStatusView.setOnCheckedChangeListener { buttonView, isChecked -> + if (!isChecked) { + CallerHmiManager.setAutopilotStatusViewVisibility(View.VISIBLE) + } else { + CallerHmiManager.setAutopilotStatusViewVisibility(View.GONE) + } + } + + /** + * 显示、隐藏视角切换按钮 + */ + tbPerspectiveSwitchView.setOnCheckedChangeListener { buttonView, isChecked -> + if (!isChecked) { + CallerHmiManager.setPerspectiveSwitchViewVisibility(View.VISIBLE) + } else { + CallerHmiManager.setPerspectiveSwitchViewVisibility(View.GONE) + } + } + + /** + * 显示、隐藏工具箱 + */ + tbCheckStatusView.setOnCheckedChangeListener { buttonView, isChecked -> + if (!isChecked) { + CallerHmiManager.setToolsViewVisibility(View.VISIBLE) + } else { + CallerHmiManager.setToolsViewVisibility(View.GONE) + } + } + + /** + * 隐藏、显示小地图 + */ tbControlView.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { CallerSmpManager.hidePanel() @@ -392,12 +763,69 @@ class DebugSettingView @JvmOverloads constructor( } } + + /** + * 打开、关闭转向灯控制 + */ + tbOpenLight.setOnCheckedChangeListener { buttonView, isChecked -> + if (!isChecked) { + CallerHmiManager.setTurnLightFunction(true) + } else { + CallerHmiManager.setTurnLightFunction(false) + } + } + + /** + * 打开、关闭刹车控制 + */ + tbOpenBrakeLight.setOnCheckedChangeListener { buttonView, isChecked -> + if (!isChecked) { + CallerHmiManager.setBrakeLightFunction(true) + } else { + CallerHmiManager.setBrakeLightFunction(false) + } + } + } + + /** + * 设置日志点击监听 + */ + private fun setLogCheckedChangeListener(){ + /** + * 打开、关闭鹰眼Log + */ + tbSelfLog.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + LogUtils.getConfig().isLogSwitch = false + Logger.init(LogLevel.OFF) + MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = false + } else { + LogUtils.getConfig().isLogSwitch = true + Logger.init(LogLevel.DEBUG) + MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = true + } + } + + /** + * 打开、关闭ADAS Log + */ + tbADASLog.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + CallerAutoPilotManager.setEnableLog(true) + } else { + CallerAutoPilotManager.setEnableLog(false) + } + } + + + + //开始停止抓取全量日志 tbLogCatch.isChecked = SharedPrefsMgr.getInstance(context).getBoolean(MoGoConfig.CATCH_LOG, false) tbLogCatch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { var logTimeStr = etLogCatch.text?.toString() - if (logTimeStr.isNullOrEmpty()) { + if(logTimeStr.isNullOrEmpty()){ logTimeStr = "10" } val logCatchTime = logTimeStr.toInt() @@ -430,6 +858,10 @@ class DebugSettingView @JvmOverloads constructor( //todo 模块日志 tag 发生变化,需要更新对应 UI } }) + + /** + * 展示、关闭日志过滤面板 + */ tbLogDebugView.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { logInfoView = LogInfoView() @@ -449,6 +881,10 @@ class DebugSettingView @JvmOverloads constructor( logViewDestroy() } } + + /** + * ADAS长链数据 + */ cbAdasChainLog.setOnCheckedChangeListener { _, isChecked -> val traceInfoMap = CallerDevaToolsManager.getTraceInfo() val chainLogParam = traceInfoMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_DATA] @@ -472,8 +908,8 @@ class DebugSettingView @JvmOverloads constructor( /** * 绘制应用基本 */ + @SuppressLint("SetTextI18n") private fun drawAppInfo() { - AppConfigInfo.appName = AppUtils.getAppName() AppConfigInfo.appName = AppUtils.getAppName() if (AppConfigInfo.appVersionCode == 0) { AppConfigInfo.appVersionCode = AppUtils.getAppVersionCode() @@ -488,8 +924,7 @@ class DebugSettingView @JvmOverloads constructor( AppConfigInfo.uniqueDeviceId = DeviceIdUtils.getDeviceId(AbsMogoApplication.getApp()) } if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) { - AppConfigInfo.widevineIDMd5 = - DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp()) + AppConfigInfo.widevineIDMd5 = DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp()) } AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token @@ -510,8 +945,120 @@ class DebugSettingView @JvmOverloads constructor( } } - // 将数据绘制 - tvAppInfo.text = Html.fromHtml(AppConfigInfo.toString()) + /** + * 设备绑定关系 + */ + tvPadSn.text = "PAD中台生成SN:${AppConfigInfo.mogoSN}" + tvPadCopyrightId.text = "PAD数字版权ID:${AppConfigInfo.widevineIDMd5}" + tvIPCMac.text = "工控机MAC:${AppConfigInfo.iPCMacAddress}" + tvUniqueDeviceId.text = "PAD唯一标志:${AppConfigInfo.uniqueDeviceId}" + tvPlateNumber.text = "车牌号:${AppConfigInfo.plateNumber}" + + /** + * 版本信息 + */ + tvAppVersionName.text = "鹰眼版本名:${AppUtils.getAppVersionName()}" + tvAppVersionCode.text = "鹰眼版本号:${AppUtils.getAppVersionCode()}" + tvObuAppInfo.text = "OBU程序版本:${CallerObuListenerManager.getObuStatusInfo().appInfo}" + tvObuHliInfo.text = "OBU协议版本:${CallerObuListenerManager.getObuStatusInfo().hliInfo}" + tvObuSdkVersion.text = "OBU-SDK版本:${AppConfigInfo.obuSdkVersion}" + tvAutopilotVersionInfo.text = "Autopilot版本:${AppConfigInfo.adasSdkVersion}" + tvMoGoMapVersion.text = "HD-Map版本:${MogoMap.getInstance().mogoMap.mapVersion}" + tvGitBranchInfo.text = "Git分支:${AppConfigInfo.workingBranchName}" + tvGitHashInfo.text = "Git-Hash:${AppConfigInfo.workingBranchHash}" + tvAndroidSystemVersion.text = "Android系统版本:" + DeviceUtils.getSDKVersionName() + + /** + * 状态中心 + */ + tvServerEnvironment.text = "当前服务器环境:${AppConfigInfo.netMode} -- ${ + when (AppConfigInfo.netMode) { + 2 -> { + "测试环境" + } + 3 -> { + "生产环境" + } + 4 -> { + "演示环境" + } + else -> { + "未知环境" + } + } + }" + + tvInternetEnvironment.text =Html.fromHtml("当前网络环境:${ + if(NetworkUtils.isConnected(context)){ + if(NetworkUtils.isConnectedMobile(context)){ + //已连接移动数据 + "移动数据" + }else{ + //WiFi + CommonUtils.getWifiName(context) + } + + }else{ + //未连接任何网络 + "异常" + } + }") + + + tvServerSocketStatus.text = Html.fromHtml("服务器Socket状态:${ + if(DebugConfig.isDownloadSnapshot()){ + "正常" + }else{ + "异常" + } + }") + + tvAutopilotConnectStatus.text =Html.fromHtml("Autopilot系统连接状态:${ + if(AppConfigInfo.isConnectAutopilot){ + "正常" + }else{ + "异常" + } + }") + + tvObuConnectStatus.text =Html.fromHtml("OBU连接状态:${ + if(AppConfigInfo.isConnectObu){ + "正常" + }else{ + "异常" + } + }") + + tvDriverServerStartupStatus.text = Html.fromHtml("${ + when { + AppConfigInfo.isDriver -> { + "司机端Server启动" + } + else -> { + "乘客端${ + when { + AppConfigInfo.serverIp.isNotEmpty() -> "(目标ip为:${AppConfigInfo.serverIp})" + else -> "" + } + }连接" + } + } + }是否正常:${ + if (AppConfigInfo.isConnectedNetty) { + "正常" + } else { + "异常" + } + }") + + tvLocationEnabled.text =Html.fromHtml("定位服务开启状态:${ + if(DeviceUtils.isLocationEnabled()){ + "正常" + }else{ + "异常" + } + }") + tvAutopilotInfo.text = GsonUtils.toJson(mAutoPilotStatusInfo) @@ -527,6 +1074,8 @@ class DebugSettingView @JvmOverloads constructor( tvRouteInfoSize.text = "全局路径规划点个数:${mRouteInfoSize}" + + // 用完之后重制为0,防止节点回掉突然没数据,导致页面显示还是之前的数据情况 mIdentifyDataSize = 0 mUnknownIdentifyDataSize = 0 @@ -552,6 +1101,11 @@ class DebugSettingView @JvmOverloads constructor( AppConfigInfo.adasSdkVersion = autoPilotStatusInfo.version AppConfigInfo.isConnectAutopilot = autoPilotStatusInfo.connectStatus + + if(AppConfigInfo.isConnectAutopilot && (AppConfigInfo.plateNumber.isNullOrEmpty() || AppConfigInfo.iPCMacAddress.isNullOrEmpty())){ + //查询工控机基础配置信息 + CallerAutoPilotManager.getCarConfig() + } } override fun onAutopilotCarStateData(gnssInfo: MessagePad.GnssInfo?) { @@ -580,14 +1134,49 @@ class DebugSettingView @JvmOverloads constructor( mRouteInfoSize = globalPathResp?.wayPointsList?.size ?: 0 } + /** + * 工控机基础信息回调 + */ override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { - //todo pb : 工控机基础信息回调 详见 message CarConfigResp proto + carConfigResp?.let { + AppConfigInfo.plateNumber = it.plateNumber + AppConfigInfo.iPCMacAddress = it.macAddress + } } + /** + * 工控机异常回调 + */ override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { - //todo pb : 工控机异常信息回调 + guardianInfo?.let { + reportMsgLayout.visibility = View.VISIBLE + tvReportSrc.text = it.src + tvReportLevel.text = it.level + tvReportMsg.text = it.msg + tvReportCode.text = it.code + tvReportResult.text = it.getResult(0) + tvReportActions.text = it.getActions(0) + if("error".equals(it.level)){ + //字体为红色,吐司提示 + tvReportSrc.setTextColor(Color.RED) + tvReportLevel.setTextColor(Color.RED) + tvReportMsg.setTextColor(Color.RED) + tvReportCode.setTextColor(Color.RED) + tvReportResult.setTextColor(Color.RED) + tvReportActions.setTextColor(Color.RED) + ToastUtils.showShort(it.msg) + }else{ + tvReportSrc.setTextColor(Color.BLACK) + tvReportLevel.setTextColor(Color.BLACK) + tvReportMsg.setTextColor(Color.BLACK) + tvReportCode.setTextColor(Color.BLACK) + tvReportResult.setTextColor(Color.BLACK) + tvReportActions.setTextColor(Color.BLACK) + } + + } } override fun onLocationChanged(location: MogoLocation?) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_down.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_down.png new file mode 100644 index 0000000000..f384897ebd Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_down.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_right.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_right.png new file mode 100644 index 0000000000..d1c2187e47 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_right.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/debug_setting_edit_bg.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/debug_setting_edit_bg.xml new file mode 100644 index 0000000000..6ff813b9f3 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/debug_setting_edit_bg.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index 1cfef277b6..a0314a6569 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -168,7 +168,7 @@ android:background="@color/color_FF2966EC" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/llSpeedPosition" - android:visibility="visible"/> + android:visibility="gone"/> + android:visibility="gone"/> + android:visibility="gone"/> + + android:layout_height="@dimen/dp_350" + app:layout_constraintBottom_toBottomOf="parent" + android:visibility="gone" + > - - + + + style="@style/DebugSettingText" + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + style="@style/DebugSettingText" + /> + + + style="@style/DebugSettingText" + /> + + + style="@style/DebugSettingText" + /> + + + style="@style/DebugSettingText" + /> + + + style="@style/DebugSettingText" + /> - + android:layout_height="1dp" + android:background="#F0F0F0" + /> - + android:textOff="版本信息" + android:textOn="版本信息" + android:background="@drawable/radio_button_normal_background_right" + android:drawableEnd="@drawable/icon_right" + android:padding="@dimen/dp_20" + android:layout_margin="@dimen/dp_10" + /> - - - - - - - - - - - - - - - - - - -