Merge branch 'refs/heads/dev_robotaxi-d_240912_6.7.0' into dev_robotaxi-d_240912_6.7.2_local

This commit is contained in:
donghongyu-pc
2024-10-15 19:43:18 +08:00
29 changed files with 483 additions and 482 deletions

View File

@@ -25,6 +25,7 @@ import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.multidisplay.TelematicConstant
import com.mogo.eagle.core.data.obu.MogoObuConst
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoGetParamResponseListener
import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO
@@ -33,6 +34,7 @@ import com.mogo.eagle.core.function.api.setting.ISopSettingListener
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
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotGetParamResponseDispatcher
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.hmi.CallerHmiViewControlListenerManager
@@ -58,6 +60,8 @@ 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.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.coroutines.launch
import me.jessyan.autosize.utils.AutoSizeUtils
@@ -915,7 +919,7 @@ class OperatePanelLayout : LinearLayout {
}
}
class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener, ISopSettingListener, IViewControlListener {
class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener, ISopSettingListener, IViewControlListener, IMoGoGetParamResponseListener {
companion object {
private const val TAG = "VehiclesPreferenceFragmentCompat"
private const val KEY_PNC_PARK_INTERSECTION_CAR = "pnc_park_intersection_car"
@@ -938,15 +942,28 @@ class OperatePanelLayout : LinearLayout {
private var prevCheckedKeyForFusionMode: String? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
Logger.d(TAG, "--- onCreateView --- 1 ---")
if (AppConfigInfo.isConnectAutopilot) {
CallerAutoPilotControlManager.getCarConfig()
Logger.d(TAG, "--- onCreateView --- 2 ---") //获取车辆配置
CallerAutoPilotControlManager.getCarConfig() //查询融合模式
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.FUSION_MODE)
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.OVERTAKE_MAX_SPEED)
}
CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this)
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
CallerSopSettingManager.addListener(TAG, this)
CallerHmiViewControlListenerManager.addListener(TAG, this)
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun onDestroyView() {
CallerAutopilotGetParamResponseDispatcher.removeListener(TAG)
CallerAutopilotCarConfigListenerManager.removeListener(TAG)
CallerSopSettingManager.removeListener(TAG)
CallerHmiViewControlListenerManager.removeListener(TAG)
super.onDestroyView()
}
override fun updateFuncMode(tag: String, boolean: Boolean) {
super.updateFuncMode(tag, boolean)
if (tag == FUNC_MODE_RAIN) {
@@ -957,11 +974,86 @@ class OperatePanelLayout : LinearLayout {
}
}
override fun onDestroyView() {
CallerAutopilotCarConfigListenerManager.removeListener(TAG)
CallerSopSettingManager.removeListener(TAG)
CallerHmiViewControlListenerManager.removeListener(TAG)
super.onDestroyView()
override fun onGetParamResp(header: MessagePad.Header, getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) {
Logger.d(TAG, "-- onGetParamResp --: fusion-mode:${adasParam.fusionMode}, over-take-speed:${adasParam.overtakeMaxSpeed} ")
lifecycleScope.launch {
when(adasParam.fusionMode) {
1 -> {
//全融合模式
FunctionBuildConfig.fusionMode = 1
prevCheckedKeyForFusionMode?.takeIf { it != KEY_ALL_MERGE_MODE }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForFusionMode = KEY_ALL_MERGE_MODE
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_ALL_MERGE_MODE)?.also {
it.extras.putBoolean("is_checked", true)
changeValue(it, true)
}
}
2 -> {
//盲区模式
FunctionBuildConfig.fusionMode = 2
prevCheckedKeyForFusionMode?.takeIf { it != KEY_BLIND_AREA_MODE }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForFusionMode = KEY_BLIND_AREA_MODE
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_BLIND_AREA_MODE)?.also {
it.extras.putBoolean("is_checked", true)
changeValue(it, true)
}
}
3 -> {
//超视距模式
FunctionBuildConfig.fusionMode = 3
prevCheckedKeyForFusionMode?.takeIf { it != KEY_BEYOND_VISUAL_RANGE_MODE }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForFusionMode = KEY_BEYOND_VISUAL_RANGE_MODE
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_BEYOND_VISUAL_RANGE_MODE)?.also {
it.extras.putBoolean("is_checked", true)
changeValue(it, true)
}
}
4 -> {
//透传模式
FunctionBuildConfig.fusionMode = 4
prevCheckedKeyForFusionMode?.takeIf { it != KEY_TRANSPARENT_TRANSFER_MODE }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForFusionMode = KEY_TRANSPARENT_TRANSFER_MODE
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_TRANSPARENT_TRANSFER_MODE)?.also {
it.extras.putBoolean("is_checked", true)
changeValue(it, true)
}
}
5 -> {
//纯路侧模式
FunctionBuildConfig.fusionMode = 5
prevCheckedKeyForFusionMode?.takeIf { it != KEY_PURE_OBU_MODE }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForFusionMode = KEY_PURE_OBU_MODE
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_PURE_OBU_MODE)?.also {
it.extras.putBoolean("is_checked", true)
changeValue(it, true)
}
}
}
if (adasParam.overtakeMaxSpeed > 0) {
FunctionBuildConfig.overTakeSpeed = adasParam.overtakeMaxSpeed
preferenceScreen.findPreferenceReal<PreferenceWithSpeedSetting>(KEY_OVERTAKE_SPEED_THRESHOLDSS)?.update(listOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5", "m/s"))
}
}
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@@ -983,7 +1075,7 @@ class OperatePanelLayout : LinearLayout {
lifecycleScope.launch {
if (carConfigResp.speedLimit > 0) {
FunctionBuildConfig.maxSpeedLimit = min(carConfigResp.speedLimit * 3.6, 60.0)
preferenceScreen.findPreferenceReal<PreferenceWithSpeedSetting>(KEY_AUTO_PILOT_SPEED_THRESHOLDS)?.update(listOf("0", "60.0", "${FunctionBuildConfig.maxSpeedLimit}", "5"))
preferenceScreen.findPreferenceReal<PreferenceWithSpeedSetting>(KEY_AUTO_PILOT_SPEED_THRESHOLDS)?.update(listOf("0", "60.0", "${FunctionBuildConfig.maxSpeedLimit}", "5", "km/h"))
}
}
}
@@ -1018,48 +1110,28 @@ class OperatePanelLayout : LinearLayout {
return FunctionBuildConfig.isFaultSlowDown
}
KEY_ALL_MERGE_MODE -> {
val checked = FunctionBuildConfig.fusionMode == 1
if (checked) {
prevCheckedKeyForFusionMode = KEY_ALL_MERGE_MODE
}
return checked
return false
}
KEY_BLIND_AREA_MODE -> {
val checked = FunctionBuildConfig.fusionMode == 2
if (checked) {
prevCheckedKeyForFusionMode = KEY_BLIND_AREA_MODE
}
return checked
return false
}
KEY_BEYOND_VISUAL_RANGE_MODE -> {
val checked = FunctionBuildConfig.fusionMode == 3
if (checked) {
prevCheckedKeyForFusionMode = KEY_BEYOND_VISUAL_RANGE_MODE
}
return checked
return false
}
KEY_TRANSPARENT_TRANSFER_MODE -> {
val checked = FunctionBuildConfig.fusionMode == 4
if (checked) {
prevCheckedKeyForFusionMode = KEY_TRANSPARENT_TRANSFER_MODE
}
return checked
return false
}
KEY_PURE_OBU_MODE -> {
val checked = FunctionBuildConfig.fusionMode == 5
if (checked) {
prevCheckedKeyForFusionMode = KEY_PURE_OBU_MODE
}
return checked
return false
}
KEY_AUTO_PILOT_SPEED_THRESHOLDS -> {
return listOf("0.0", "60.0", "${FunctionBuildConfig.maxSpeedLimit}", "5.0")
return listOf("0.0", "60.0", "${FunctionBuildConfig.maxSpeedLimit}", "5.0", "km/h")
}
KEY_CHANGE_LANE_SPEED_THRESHOLDS -> {
return listOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5")
return listOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5", "m/s")
}
KEY_OVERTAKE_SPEED_THRESHOLDSS -> {
return listOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5")
return listOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5", "m/s")
}
}
return super.getDefaultVal(pref)
@@ -1181,6 +1253,10 @@ class OperatePanelLayout : LinearLayout {
return true
}
KEY_ALL_MERGE_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
FunctionBuildConfig.fusionMode = 1
@@ -1197,6 +1273,10 @@ class OperatePanelLayout : LinearLayout {
return isChecked
}
KEY_BLIND_AREA_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
FunctionBuildConfig.fusionMode = 2
@@ -1213,15 +1293,19 @@ class OperatePanelLayout : LinearLayout {
return isChecked
}
KEY_BEYOND_VISUAL_RANGE_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
FunctionBuildConfig.fusionMode = 3
prevCheckedKeyForFusionMode?.takeIf { it != KEY_BEYOND_VISUAL_RANGE_MODE }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
prevCheckedKeyForFusionMode = KEY_BEYOND_VISUAL_RANGE_MODE
changeValue(it, false)
}
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
prevCheckedKeyForFusionMode = KEY_BEYOND_VISUAL_RANGE_MODE
changeValue(it, false)
}
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
clickEventAnalytics("融合模式", true)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
@@ -1229,15 +1313,19 @@ class OperatePanelLayout : LinearLayout {
return isChecked
}
KEY_TRANSPARENT_TRANSFER_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
FunctionBuildConfig.fusionMode = 4
prevCheckedKeyForFusionMode?.takeIf { it != KEY_TRANSPARENT_TRANSFER_MODE }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
prevCheckedKeyForFusionMode = KEY_TRANSPARENT_TRANSFER_MODE
changeValue(it, false)
}
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
prevCheckedKeyForFusionMode = KEY_TRANSPARENT_TRANSFER_MODE
changeValue(it, false)
}
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
clickEventAnalytics("融合模式", true)
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
@@ -1245,6 +1333,10 @@ class OperatePanelLayout : LinearLayout {
return isChecked
}
KEY_PURE_OBU_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
FunctionBuildConfig.fusionMode = 5

View File

@@ -42,13 +42,14 @@ class PreferenceWithSpeedSetting : Preference {
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
val speedData = mSpeedData ?: return
if (speedData !is List<*> || speedData.size != 4) {
if (speedData !is List<*> || speedData.size != 5) {
throw AssertionError()
}
val min = (speedData.elementAt(0) as String).toDouble()
val max = (speedData.elementAt(1) as String).toDouble()
var cur = (speedData.elementAt(2) as String).toDouble()
val step = (speedData.elementAt(3) as String).toDouble()
val unit = speedData.elementAt(4) as String
if (min > max) {
throw AssertionError()
}
@@ -60,6 +61,8 @@ class PreferenceWithSpeedSetting : Preference {
}
val ll = holder.findViewById(R.id.ll_speed)
val btnOk = holder.findViewById(R.id.bt_ok)
val speedUnit = holder.findViewById(R.id.tv_speed_unit) as? TextView
speedUnit?.text = unit
val speedLimit = holder.findViewById(R.id.tv_speed_limit) as? TextView
if (cache.containsKey(key)) {
cur = max(cur, cache[key] ?: 0.0)
@@ -73,7 +76,7 @@ class PreferenceWithSpeedSetting : Preference {
minus.onClickWidthDuration(100) {
val minusAfter = cur - step
if (minusAfter < min) {
ToastUtils.showShort("阈值最小${BigDecimal.valueOf(min).setScale(1)}km/h")
ToastUtils.showShort("阈值最小为${BigDecimal.valueOf(min).setScale(1)}$unit")
return@onClickWidthDuration
}
cur = minusAfter
@@ -89,7 +92,7 @@ class PreferenceWithSpeedSetting : Preference {
add.onClickWidthDuration(100) {
val addAfter = cur + step
if (addAfter > max) {
ToastUtils.showShort("阈值最大${BigDecimal.valueOf(max).setScale(1)}km/h")
ToastUtils.showShort("阈值最大为${BigDecimal.valueOf(max).setScale(1)}$unit")
return@onClickWidthDuration
}
holder.itemView.isEnabled = false

View File

@@ -0,0 +1,80 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.zhjt.mogo.adas.data.AdasConstants
import system_master.SsmInfo
import system_master.SystemStatusInfo
/**
* 冷启动呈现二期
* 前置展示冷启动过程和结果
*/
class ColdStartView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
companion object {
const val TAG = "ColdStartView"
}
init {
LayoutInflater.from(context).inflate(R.layout.view_cold_start, this, true)
initView()
}
private fun initView(){
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerAutoPilotStatusListenerManager.removeListener(TAG)
}
override fun onAutopilotIpcConnectStatusChanged(
status: AdasConstants.IpcConnectionStatus,
reason: String?
){
if(status == AdasConstants.IpcConnectionStatus.CONNECTED){
//域控连接成功
}else{
//域控连接失败
}
}
/**
* 状态查询应答
* @param status 数据
* HQ、M1 MAP350开始弃用其他车型MAP360开始弃用
*/
override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {
}
/**
* 定频SSM接口
* 1hz hq m1 MAP350开始支持其他车型MAP360开始支持
* 定频SSM接入后 onStatusQueryResp 状态查询应答接口将弃用
* @param statusInf 数据
*/
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/dp_2"/>
<solid android:color="#4CFFFFFF" />
</shape>

View File

@@ -47,11 +47,12 @@
</LinearLayout>
<TextView
android:id="@+id/tv_speed_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="@dimen/dp_10"
android:text="km/h"
tools:text="km/h"
android:textColor="#ffffff"
android:textSize="@dimen/dp_30"
tools:ignore="HardcodedText,SpUsage" />

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/tvSystemStartupTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="@dimen/sp_70"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
/>
<ImageView
android:id="@+id/ivIpcConnectStatus"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/tvSystemStartupTitle"
app:layout_constraintLeft_toLeftOf="@id/tvSystemStartupTitle"
android:contentDescription="@string/ipc_connect_icon"
/>
<TextView
android:id="@+id/tvIpcConnectContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/ivIpcConnectStatus"
app:layout_constraintBottom_toBottomOf="@id/ivIpcConnectStatus"
app:layout_constraintLeft_toRightOf="@id/ivIpcConnectStatus"
android:textSize="@dimen/sp_36"
android:textColor="@color/white"
android:layout_marginStart="@dimen/dp_15"
/>
<View
android:id="@+id/viewSsmConnectDivider"
android:layout_width="@dimen/dp_4"
android:layout_height="@dimen/dp_26"
app:layout_constraintLeft_toLeftOf="@id/ivIpcConnectStatus"
app:layout_constraintRight_toRightOf="@id/ivIpcConnectStatus"
app:layout_constraintTop_toBottomOf="@id/ivIpcConnectStatus"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/bg_cold_start_divider"
/>
<ImageView
android:id="@+id/ivSsmConnectStatus"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/viewSsmConnectDivider"
app:layout_constraintLeft_toLeftOf="@id/viewSsmConnectDivider"
app:layout_constraintRight_toRightOf="@id/viewSsmConnectDivider"
android:contentDescription="@string/ssm_connect_icon"
/>
<TextView
android:id="@+id/tvSsmConnectContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/ivSsmConnectStatus"
app:layout_constraintBottom_toBottomOf="@id/ivSsmConnectStatus"
app:layout_constraintLeft_toRightOf="@id/ivSsmConnectStatus"
android:textSize="@dimen/sp_36"
android:textColor="@color/white"
android:layout_marginStart="@dimen/dp_15"
/>
<View
android:id="@+id/viewColdStartDivider"
android:layout_width="@dimen/dp_4"
android:layout_height="@dimen/dp_26"
app:layout_constraintLeft_toLeftOf="@id/ivSsmConnectStatus"
app:layout_constraintRight_toRightOf="@id/ivSsmConnectStatus"
app:layout_constraintTop_toBottomOf="@id/ivSsmConnectStatus"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/bg_cold_start_divider"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -213,4 +213,7 @@
<string name="traffic_light_source">红绿灯信号来源</string>
<string name="report_success">已发起上报</string>
<string name="ipc_connect_icon">域控连接状态图标</string>
<string name="ssm_connect_icon">SSM连接状态图标</string>
</resources>