[6.2.6]运营面板整理

This commit is contained in:
xuxinchao
2023-12-20 20:29:53 +08:00
parent 7e5c0fdf7f
commit 6900cb706c
7 changed files with 505 additions and 352 deletions

View File

@@ -3,6 +3,9 @@ package com.zhjt.mogo_core_function_devatools.badcase
import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.os.Environment
import android.os.SystemClock
import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
@@ -27,10 +30,15 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener
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.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@@ -43,14 +51,17 @@ import com.mogo.tts.base.SpeechUtils
import com.zhjt.mogo_core_function_devatools.badcase.biz.*
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord
import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils
import com.zhjt.mogo_core_function_devatools.ext.enqueuePop
import me.jessyan.autosize.utils.AutoSizeUtils
import record_cache.RecordPanelOuterClass
import java.io.File
import java.util.Random
import kotlin.math.abs
internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener,
IMoGoChassisLocationGCJ02Listener, IMsgBoxListener, IMoGoDevaToolsListener,
IMogoStatusChangedListener {
IMogoStatusChangedListener, IMoGoMapScreenListener {
const val TAG = "BadCase"
@@ -59,6 +70,8 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
@Volatile
private var record: AutoPilotRecord? = null
private var recordKey: Long = 0 //主动录制bag包key
fun init(context: Context) {
CallerAutopilotRecordListenerManager.addListener(TAG, this)
SpeechUtils.init(context)
@@ -183,15 +196,26 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
|| BadCaseConfig.dockerVersion!!.contains("2.6.0")
|| BadCaseConfig.dockerVersion!!.contains("2.8.0")
) {
val initiativeBadCaseWindow = InitiativeBadCaseWindow(activity)
initiativeBadCaseWindow.setClickListener(object :
InitiativeBadCaseWindow.ClickListener {
override fun closeWindow() {
initiativeBadCaseWindow.hideFloatWindow()
}
if(FunctionBuildConfig.isShowBagRecordWindow){
//展示录包弹窗并且录包
val initiativeBadCaseWindow = InitiativeBadCaseWindow(activity)
initiativeBadCaseWindow.setClickListener(object :
InitiativeBadCaseWindow.ClickListener {
override fun closeWindow() {
initiativeBadCaseWindow.hideFloatWindow()
}
})
initiativeBadCaseWindow.showFloatWindow(null)
})
initiativeBadCaseWindow.showFloatWindow(null)
}else{
//进行录包,但不展示录包弹窗
BadCaseConfig.notDisplayBagWindow = true
//高精地图屏幕截图
CallerMapScreenListenerManager.addListener(TAG,this)
val recordKey = Random(SystemClock.elapsedRealtime()).nextInt().toLong()
CallerAutoPilotControlManager.recordPackage(BadCaseConfig.type,recordKey.toInt(),
BadCaseConfig.totalDuration, BadCaseConfig.previousDuration)
}
} else {
val caseListDialog = CaseListDialog(activity)
caseListDialog.show()
@@ -273,6 +297,23 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
super.onAutopilotRecordResult(recordPanel)
CallerLogger.d("$M_DEVA$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}")
if(BadCaseConfig.notDisplayBagWindow){
//此时点击主动录包按钮,不能展示上报弹窗,需要在此处做主动录包弹窗中的一些逻辑
//开始录制
if(recordPanel.stat == 300){
recordKey = recordPanel.key
BadCaseConfig.recordKeyList.add(recordPanel.key)
//获取当前主动录包集合
val recordSet = BadCaseConfig.getInitiativeRecordSet()
//保存录包状态
recordSet.add(recordPanel.key.toString())
BadCaseConfig.setInitiativeRecordSet(recordSet)
//开启高精地图截图
CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot()
//将当次主动录包设置标签还原
BadCaseConfig.notDisplayBagWindow = false
}
}
if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) {
if (recordPanel.stat == 100 || recordPanel.stat == 101) {
//成功结束录制
@@ -383,5 +424,47 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
BadCaseConfig.socketStatus = "云Socket连接${if (isTrue) "正常" else "异常"}"
}
override fun onMapScreen(bitmap: Bitmap) {
super.onMapScreen(bitmap)
//在截图上保存即时信息
val time = "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}"
val lineId = "路线ID:${CallerAutoPilotStatusListenerManager.getLineId()}"
val state = when(CallerAutoPilotStatusListenerManager.getState()){
0->"自驾状态:不可自驾"
1->"自驾状态:可自驾"
2->"自驾状态:自驾中"
7->"自驾状态:平行驾驶中"
else->"自驾状态:未知"
}
val speed = "当前车速:${BadCaseConfig.currentSpeed}"
val site = if(CallerAutoPilotStatusListenerManager.getLineStartName().isNullOrEmpty() || CallerAutoPilotStatusListenerManager.getLineEndName().isNullOrEmpty()){
"路线起始点:无"
}else{
"路线起点:${CallerAutoPilotStatusListenerManager.getLineStartName()};终点:${CallerAutoPilotStatusListenerManager.getLineEndName()}"
}
val outBitmap = RecordBitmapUtils.drawTextOnBitmap(bitmap,time,lineId,state,speed,site,
BadCaseConfig.gpsStatus,BadCaseConfig.tracingStatus,BadCaseConfig.socketStatus
,BadCaseConfig.newFMInfoMsg,BadCaseConfig.newReportEntity)
//图片保存本地
val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat())
val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+
"MapScreen" + File.separator+ currentDay + File.separator
val fileName = "$recordKey.png"
val path = fileDir + fileName
if (!File(fileDir).exists()) {
File(fileDir).mkdirs()
}
if(outBitmap != null){
RecordBitmapUtils.bitmap2Path(outBitmap,path)
}else{
RecordBitmapUtils.bitmap2Path(bitmap,path)
}
//遍历是否有非当日的文件并删除
RecordBitmapUtils.deleteExpiredFile(currentDay)
//注销高精地图截图监听回调
CallerMapScreenListenerManager.removeListener(TAG)
}
}

View File

@@ -58,6 +58,8 @@ object BadCaseConfig {
@JvmField
var bagManagerList: ArrayList<BagInfoEntity> = ArrayList()
var notDisplayBagWindow: Boolean = false //主动录包不能展示弹窗
private const val resourceInitiative = "RESOURCE_INITIATIVE" //录包来源为主动录包
private const val resourceAiData = "RESOURCE_AI_DATA" //录包来源为AI数据采集
private const val recordFail = "RECORD_FAIL" //录包失败

View File

@@ -97,23 +97,24 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
}
} else if(category == MsgCategory.SYS_INFO){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
//todo 过滤MAP系统异常报警
} else if(category == MsgCategory.FM_INFO){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
//属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" //择机靠边停车
|| fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" //立刻舒适停车
|| fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP" //就地紧急停车
){
//语音提示
try {
SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips)
}catch (e: Exception){
e.printStackTrace()
if(FunctionBuildConfig.isTakeoverRemind){
//属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" //择机靠边停车
|| fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" //立刻舒适停车
|| fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP" //就地紧急停车
){
//语音提示
try {
SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips)
}catch (e: Exception){
e.printStackTrace()
}
//展示消息
showData(msgBoxBean)
}
//展示消息
showData(msgBoxBean)
}
} else{
if(msgBoxBean.sourceType == DataSourceType.SUMMARY){

View File

@@ -73,6 +73,7 @@ import kotlinx.android.synthetic.main.view_sop_setting.view.scRunRedLightSop
import kotlinx.android.synthetic.main.view_sop_setting.view.scShowBagRecordWindow
import kotlinx.android.synthetic.main.view_sop_setting.view.scSpeedLimit
import kotlinx.android.synthetic.main.view_sop_setting.view.scSweeperModeSwitch
import kotlinx.android.synthetic.main.view_sop_setting.view.scTakeOverRemind
import kotlinx.android.synthetic.main.view_sop_setting.view.scTrafficLight
import kotlinx.android.synthetic.main.view_sop_setting.view.scV2ISwitch
import kotlinx.android.synthetic.main.view_sop_setting.view.scV2NSwitch
@@ -121,7 +122,9 @@ internal class SOPSettingView @JvmOverloads constructor(
mapSetting()
//与车相关类设置
vehicleSetting()
//其他类别开关设置
//美化模式类设置
demoSetting()
//业务类别开关设置
otherSetting()
}
@@ -445,17 +448,9 @@ internal class SOPSettingView @JvmOverloads constructor(
}
/**
* 与车相关类设置
* 美化模式类设置
*/
private fun vehicleSetting() {
//绕障类功能
scObstacleAvoidance.isChecked = FunctionBuildConfig.isDetouring
scObstacleAvoidance.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 绕障类功能开关, ", isChecked)
CallerAutoPilotControlManager.sendDetouring(isChecked)
FunctionBuildConfig.isDetouring = isChecked
}
private fun demoSetting(){
// 演示模式,上一次勾选的数据
scDemoMode.isChecked = FunctionBuildConfig.isDemoMode
scDemoMode.setOnCheckedChangeListener { compoundButton, isChecked ->
@@ -480,6 +475,34 @@ internal class SOPSettingView @JvmOverloads constructor(
scDemoMode.isEnabled = false
}
//是否展示被动触发的录包弹窗(自动驾驶下出现问题触发的录包)
scShowBagRecordWindow.isChecked = FunctionBuildConfig.isShowBagRecordWindow
scShowBagRecordWindow.setOnCheckedChangeListener { _, isChecked ->
FunctionBuildConfig.isShowBagRecordWindow = isChecked
hmiAction("SOP 是否展示录包弹窗, ", isChecked)
}
//接管提醒
scTakeOverRemind.isChecked = FunctionBuildConfig.isTakeoverRemind
scTakeOverRemind.setOnCheckedChangeListener { _, isChecked ->
FunctionBuildConfig.isTakeoverRemind = isChecked
hmiAction("SOP 是否展示接管提醒, ", isChecked)
}
}
/**
* 与车相关类设置
*/
private fun vehicleSetting() {
//绕障类功能
scObstacleAvoidance.isChecked = FunctionBuildConfig.isDetouring
scObstacleAvoidance.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 绕障类功能开关, ", isChecked)
CallerAutoPilotControlManager.sendDetouring(isChecked)
FunctionBuildConfig.isDetouring = isChecked
}
// 雨天模式,上一次勾选的数据
scRainMode.isChecked = FunctionBuildConfig.isRainMode
scRainMode.setOnCheckedChangeListener { compoundButton, isChecked ->
@@ -539,10 +562,87 @@ internal class SOPSettingView @JvmOverloads constructor(
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
}
//变道绕障的目标障碍物速度阈值
tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s"
ivSpeedReduce.setOnClickListener {
if (FunctionBuildConfig.detouringSpeed <= 3) {
ToastUtils.showShort("阈值最小可为3 m/s")
} else {
FunctionBuildConfig.detouringSpeed--
tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s"
}
hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed)
}
ivSpeedAdd.setOnClickListener {
if (FunctionBuildConfig.detouringSpeed >= 7) {
ToastUtils.showShort("阈值最大可为7 m/s")
} else {
FunctionBuildConfig.detouringSpeed++
tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s"
}
hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed)
}
btnSpeedSet.setOnClickListener {
val isSuccess =
CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble())
if (isSuccess == true) {
ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置成功")
hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "成功")
} else {
ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置失败")
hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败")
}
}
ivSpeedOverTakeReduce.setOnClickListener {
if (FunctionBuildConfig.overTakeSpeed <= 3) {
ToastUtils.showShort("阈值最小可为3 m/s")
} else {
FunctionBuildConfig.overTakeSpeed -= 0.5f
tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s"
}
hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed)
}
ivSpeedOverTakeAdd.setOnClickListener {
if (FunctionBuildConfig.overTakeSpeed >= 12.5) {
ToastUtils.showShort("阈值最大可为12.5 m/s")
} else {
FunctionBuildConfig.overTakeSpeed += 0.5f
tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s"
}
hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed)
}
btnSpeedOverTakeSet.setOnClickListener {
val isSuccess =
CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble())
if (isSuccess == true) {
ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功")
hmiAction("SOP 超车目标障碍物速度阈值设置", "成功")
} else {
ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置失败")
hmiAction("SOP 超车目标障碍物速度阈值设置", "失败")
}
}
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
tvSpeedThresholdTitle.visibility = View.GONE
ivSpeedReduce.visibility = View.GONE
tvSpeed.visibility = View.GONE
ivSpeedAdd.visibility = View.GONE
btnSpeedSet.visibility = View.GONE
tvSpeedOverTakeLimit.visibility = View.GONE
ivSpeedOverTakeReduce.visibility = View.GONE
tvOverTakeLimit.visibility = View.GONE
ivSpeedOverTakeAdd.visibility = View.GONE
btnSpeedOverTakeSet.visibility = View.GONE
}
}
private var overTakeEditText: String = ""
private var overTakeEditDel = false
// private var overTakeEditText: String = ""
// private var overTakeEditDel = false
/**
* 其他类别开关设置
@@ -633,17 +733,10 @@ internal class SOPSettingView @JvmOverloads constructor(
it.isChecked = CallerHmiManager.isTaxiUnmanedDriverLineRoutingVerifyMode()
} else {
it.isEnabled = false
it.visibility = View.GONE
it.visibility = View.INVISIBLE
}
}
//是否展示被动触发的录包弹窗(自动驾驶下出现问题触发的录包)
scShowBagRecordWindow.isChecked = FunctionBuildConfig.isShowBagRecordWindow
scShowBagRecordWindow.setOnCheckedChangeListener { _, isChecked ->
FunctionBuildConfig.isShowBagRecordWindow = isChecked
hmiAction("SOP 是否展示被动触发的录包弹窗, ", isChecked)
}
// 清扫车业务模式切换
scSweeperModeSwitch?.also { switchView ->
switchView.isChecked =
@@ -686,82 +779,6 @@ internal class SOPSettingView @JvmOverloads constructor(
}
}
//变道绕障的目标障碍物速度阈值
tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s"
ivSpeedReduce.setOnClickListener {
if (FunctionBuildConfig.detouringSpeed <= 3) {
ToastUtils.showShort("阈值最小可为3 m/s")
} else {
FunctionBuildConfig.detouringSpeed--
tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s"
}
hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed)
}
ivSpeedAdd.setOnClickListener {
if (FunctionBuildConfig.detouringSpeed >= 7) {
ToastUtils.showShort("阈值最大可为7 m/s")
} else {
FunctionBuildConfig.detouringSpeed++
tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s"
}
hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed)
}
btnSpeedSet.setOnClickListener {
val isSuccess =
CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble())
if (isSuccess == true) {
ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置成功")
hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "成功")
} else {
ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置失败")
hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败")
}
}
ivSpeedOverTakeReduce.setOnClickListener {
if (FunctionBuildConfig.overTakeSpeed <= 3) {
ToastUtils.showShort("阈值最小可为3 m/s")
} else {
FunctionBuildConfig.overTakeSpeed -= 0.5f
tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s"
}
hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed)
}
ivSpeedOverTakeAdd.setOnClickListener {
if (FunctionBuildConfig.overTakeSpeed >= 12.5) {
ToastUtils.showShort("阈值最大可为12.5 m/s")
} else {
FunctionBuildConfig.overTakeSpeed += 0.5f
tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s"
}
hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed)
}
btnSpeedOverTakeSet.setOnClickListener {
val isSuccess =
CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble())
if (isSuccess == true) {
ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功")
hmiAction("SOP 超车目标障碍物速度阈值设置", "成功")
} else {
ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置失败")
hmiAction("SOP 超车目标障碍物速度阈值设置", "失败")
}
}
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
tvSpeedThresholdTitle.visibility = View.GONE
ivSpeedReduce.visibility = View.GONE
tvSpeed.visibility = View.GONE
ivSpeedAdd.visibility = View.GONE
btnSpeedSet.visibility = View.GONE
tvSpeedOverTakeLimit.visibility = View.GONE
ivSpeedOverTakeReduce.visibility = View.GONE
tvOverTakeLimit.visibility = View.GONE
ivSpeedOverTakeAdd.visibility = View.GONE
btnSpeedOverTakeSet.visibility = View.GONE
}
val virtualTaskPullTaskInterval = CallerUnmannedListenerManager.getVirtualTaskPullTaskInterval()
rbFive.isChecked = virtualTaskPullTaskInterval == 5
rbFifteen.isChecked = virtualTaskPullTaskInterval == 15

View File

@@ -240,7 +240,7 @@ class TakeOverView @JvmOverloads constructor(
*/
private fun showM1ParallelDrivingWarning(poiType: String,content: String,tts: String){
//异常提醒均在开启美化模式后不弹出、不语音提示
if(!FunctionBuildConfig.isDemoMode){
if(!FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isTakeoverRemind){
//消息盒子提示
saveMsgBox(
MsgBoxBean(
@@ -270,7 +270,7 @@ class TakeOverView @JvmOverloads constructor(
}
private fun showParallelDrivingWarning(poiType: String,content: String,tts: String){
if(!FunctionBuildConfig.isDemoMode){
if(!FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isTakeoverRemind){
//异常提醒均在开启美化模式后不弹出、不语音提示
//消息盒子提示
saveMsgBox(

View File

@@ -286,6 +286,92 @@
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="@dimen/dp_780"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:cardBackgroundColor="@color/color_FFFFFF"
app:cardCornerRadius="@dimen/dp_10"
app:cardElevation="@dimen/dp_5"
app:cardPreventCornerOverlap="true"
app:cardUseCompatPadding="true"
app:contentPadding="@dimen/dp_10"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvDemoTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:text="美化模式类"
android:textColor="@color/black"
android:textSize="@dimen/sp_36"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/demoGuideLine"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<!--美化模式-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scDemoMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="美化模式"
android:textSize="@dimen/sp_28"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/demoGuideLine"
app:layout_constraintTop_toBottomOf="@id/tvDemoTitle" />
<!--是否展示录包弹窗-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scShowBagRecordWindow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginBottom="@dimen/dp_10"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="录包弹窗"
app:layout_constraintLeft_toLeftOf="@id/demoGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvDemoTitle" />
<!--接管提醒-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scTakeOverRemind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginBottom="@dimen/dp_10"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="接管提醒"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/demoGuideLine"
app:layout_constraintTop_toBottomOf="@id/scDemoMode"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="@dimen/dp_780"
android:layout_height="wrap_content"
@@ -337,19 +423,7 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/vehicleGuideLine"
app:layout_constraintTop_toBottomOf="@id/tvVehicleTitle" />
<!--美化模式-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scDemoMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="美化模式"
android:textSize="@dimen/sp_28"
app:layout_constraintLeft_toLeftOf="@id/vehicleGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvVehicleTitle" />
<!--雨天模式-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scRainMode"
@@ -360,9 +434,9 @@
android:scaleY="1.2"
android:text="雨天模式"
android:textSize="@dimen/sp_28"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/vehicleGuideLine"
app:layout_constraintTop_toBottomOf="@id/scObstacleAvoidance" />
app:layout_constraintLeft_toLeftOf="@id/vehicleGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvVehicleTitle" />
<!--弱网减速停车-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scWeakNetSlowDown"
@@ -375,7 +449,7 @@
android:textSize="@dimen/sp_28"
app:layout_constraintLeft_toLeftOf="@id/vehicleGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/scDemoMode" />
app:layout_constraintTop_toBottomOf="@id/scRainMode" />
<!--故障减速停车-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scFaultSlowDown"
@@ -443,216 +517,6 @@
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="@dimen/dp_780"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:cardBackgroundColor="@color/color_FFFFFF"
app:cardCornerRadius="@dimen/dp_10"
app:cardElevation="@dimen/dp_5"
app:cardPreventCornerOverlap="true"
app:cardUseCompatPadding="true"
app:contentPadding="@dimen/dp_10"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvOtherTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:text="其他"
android:textColor="@color/black"
android:textSize="@dimen/sp_36"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/otherGuideLine"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"
app:layout_constraintLeft_toLeftOf="@id/tvOtherTitle"
app:layout_constraintRight_toRightOf="parent" />
<!--红绿灯标识-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scTrafficLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="红绿灯标识"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/otherGuideLine"
app:layout_constraintTop_toBottomOf="@id/tvOtherTitle" />
<!--限速标识-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scSpeedLimit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="限速标识"
app:layout_constraintLeft_toRightOf="@id/otherGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvOtherTitle" />
<!--异常上报提示-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scIPCReport"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="异常上报提示"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/otherGuideLine"
app:layout_constraintTop_toBottomOf="@id/scTrafficLight" />
<!--360环视-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scNew360LookAround"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="360环视"
app:layout_constraintLeft_toLeftOf="@id/otherGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/scSpeedLimit" />
<!--是否展示被动录包弹窗-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scShowBagRecordWindow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginBottom="@dimen/dp_10"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="录包弹窗"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/otherGuideLine"
app:layout_constraintTop_toBottomOf="@id/scIPCReport" />
<!--清扫和业务模式切换开关(开-云控,关-运营)-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scSweeperModeSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/otherGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/scNew360LookAround"
android:text="清扫云控业务"
android:scaleY="1.2"
android:scaleX="1.2"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginBottom="@dimen/dp_10"/>
<!--自主算路验证模式-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scLineRoutingVerify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="自主算路验证模式"
app:layout_constraintLeft_toRightOf="@id/otherGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/scNew360LookAround" />
<TextView
android:id="@+id/tvPullTimeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:text="@string/pull_time_title"
android:textColor="@color/black"
android:textSize="32dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/scShowBagRecordWindow" />
<RadioGroup
android:id="@+id/rgPullTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_10"
android:orientation="horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPullTimeTitle">
<RadioButton
android:id="@+id/rbFortyFive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="45s"
android:textSize="32dp" />
<RadioButton
android:id="@+id/rbThirty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="30s"
android:textSize="32dp" />
<RadioButton
android:id="@+id/rbFifteen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="15s"
android:textSize="32dp" />
<RadioButton
android:id="@+id/rbFive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="5s"
android:textSize="32dp" />
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="@dimen/dp_780"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:cardBackgroundColor="@color/color_FFFFFF"
app:cardCornerRadius="@dimen/dp_10"
app:cardElevation="@dimen/dp_5"
app:cardPreventCornerOverlap="true"
app:cardUseCompatPadding="true"
app:contentPadding="@dimen/dp_10"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvSpeedThresholdTitle"
android:layout_width="wrap_content"
@@ -662,7 +526,7 @@
android:textColor="#1A1A1A"
android:textSize="@dimen/dp_36"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toBottomOf="@id/rgFusionMode"/>
<ImageView
android:id="@+id/ivSpeedReduce"
@@ -774,6 +638,181 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/ivSpeedOverTakeAdd" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="@dimen/dp_780"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:cardBackgroundColor="@color/color_FFFFFF"
app:cardCornerRadius="@dimen/dp_10"
app:cardElevation="@dimen/dp_5"
app:cardPreventCornerOverlap="true"
app:cardUseCompatPadding="true"
app:contentPadding="@dimen/dp_10"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvOtherTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:text="业务类"
android:textColor="@color/black"
android:textSize="@dimen/sp_36"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/otherGuideLine"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"
app:layout_constraintLeft_toLeftOf="@id/tvOtherTitle"
app:layout_constraintRight_toRightOf="parent" />
<!--红绿灯标识-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scTrafficLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="红绿灯标识"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/otherGuideLine"
app:layout_constraintTop_toBottomOf="@id/tvOtherTitle" />
<!--限速标识-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scSpeedLimit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="限速标识"
app:layout_constraintLeft_toRightOf="@id/otherGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvOtherTitle" />
<!--异常上报提示-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scIPCReport"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="异常上报提示"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/otherGuideLine"
app:layout_constraintTop_toBottomOf="@id/scTrafficLight" />
<!--360环视-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scNew360LookAround"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="360环视"
app:layout_constraintLeft_toLeftOf="@id/otherGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/scSpeedLimit" />
<!--清扫和业务模式切换开关(开-云控,关-运营)-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scSweeperModeSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/otherGuideLine"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/scNew360LookAround"
android:text="清扫云控业务"
android:scaleY="1.2"
android:scaleX="1.2"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginBottom="@dimen/dp_10"/>
<!--自主算路验证模式-->
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/scLineRoutingVerify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_25"
android:scaleX="1.2"
android:scaleY="1.2"
android:text="自主算路验证模式"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/otherGuideLine"
app:layout_constraintTop_toBottomOf="@id/scNew360LookAround" />
<TextView
android:id="@+id/tvPullTimeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:text="@string/pull_time_title"
android:textColor="@color/black"
android:textSize="32dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/scLineRoutingVerify" />
<RadioGroup
android:id="@+id/rgPullTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_10"
android:orientation="horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPullTimeTitle">
<RadioButton
android:id="@+id/rbFortyFive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="45s"
android:textSize="32dp" />
<RadioButton
android:id="@+id/rbThirty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="30s"
android:textSize="32dp" />
<RadioButton
android:id="@+id/rbFifteen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="15s"
android:textSize="32dp" />
<RadioButton
android:id="@+id/rbFive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="5s"
android:textSize="32dp" />
</RadioGroup>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/llMFLayout"
android:layout_width="0dip"
@@ -786,7 +825,7 @@
android:padding="5dip"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvSpeedOverTakeLimit">
app:layout_constraintTop_toBottomOf="@+id/rgPullTime">
<com.mogo.eagle.core.function.hmi.ui.setting.StateViewLayout
android:id="@+id/mfStatusLayout"