[8.2.4][hmi][运营面板-车辆相关] 增加驾驶模式和否启用AIP选项UI

This commit is contained in:
xinfengkun
2025-09-15 17:28:47 +08:00
parent 02d94c9886
commit 6565b18108
10 changed files with 260 additions and 19 deletions

View File

@@ -10,8 +10,13 @@ import androidx.annotation.DrawableRes
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoGetParamResponseListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotGetParamResponseDispatcher
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.bridge.R
import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener
@@ -28,7 +33,7 @@ class AutopilotState @JvmOverloads constructor(
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IOchAutopilotStatusListener,
AutopilotStateModel.AutopilotStateCallback {
AutopilotStateModel.AutopilotStateCallback, IMoGoGetParamResponseListener {
private val TAG = "AutopilotState"
@@ -50,6 +55,7 @@ class AutopilotState @JvmOverloads constructor(
autopilotChangeStateAnimator = ObjectAnimator.ofFloat(aciv_autopilot_state, "alpha", 1f, 0f,1f)
autopilotChangeStateAnimator.interpolator = LinearInterpolator()
autopilotChangeStateAnimator.duration = 300
updateActvAutopilotHeadText()
onClick {
startAutopilot()
}
@@ -65,13 +71,32 @@ class AutopilotState @JvmOverloads constructor(
ViewModelProvider(it).get(AutopilotStateModel::class.java)
}
viewModel?.setViewCallback(this)
CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
autopilotStateAnimator?.release()
CallerAutopilotGetParamResponseDispatcher.removeListener(TAG)
}
private fun updateActvAutopilotHeadText() {
if ((AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) || AppIdentityModeUtils.isB2(
FunctionBuildConfig.appIdentityMode
) || AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) && AppIdentityModeUtils.isDriver(
FunctionBuildConfig.appIdentityMode
)
) {
actv_autopilot_head.text = if (FunctionBuildConfig.isActivateAip) "AIP" else "AD"
}
}
override fun onChangeAipState(isActivateAip: Boolean) {
super.onChangeAipState(isActivateAip)
ThreadUtils.runOnUiThread {
updateActvAutopilotHeadText()
}
}
init {

View File

@@ -1648,6 +1648,24 @@ class MoGoAutopilotControlProvider :
return AdasManager.getInstance().sendV2iDownPerceptionToPnc(enable) > -1
}
/**
* 驾驶模式
*
* @param style 0-正常模式 1-安全模式 2-专业模式
*/
override fun sendDrivingStyle(style: Int): Boolean {
return AdasManager.getInstance().sendDrivingStyle(style) > -1
}
/**
* 是否启用AIP选项功能
*
* @param enable false: off true:on 默认false
*/
override fun sendActivateAip(enable: Boolean): Boolean {
return AdasManager.getInstance().sendActivateAip(if (enable) 1 else 0) > -1
}
/**
* 云端配置控制
* @param type 0:蘑菇云 1:NDE云 2:基础平台云

View File

@@ -1328,8 +1328,7 @@ class MoGoAdasListenerImpl : OnAdasListener {
getParamResp: MessagePad.SetParamReq,
adasParam: AdasParam
) {
FunctionBuildConfig.fusionMode = adasParam.fusionMode
CallerAutopilotGetParamResponseDispatcher.dispatchResponse(header, getParamResp, adasParam)
CallerAutopilotGetParamResponseDispatcher.dispatchResponse(adasParam)
CallerV2XManager.invokeGetParamResp(getParamResp, adasParam)
}

View File

@@ -146,6 +146,18 @@ class MoGoAdasMsgConnectStatusListenerImpl :
CallerAutoPilotControlManager.sendV2nToPncCmd(FunctionBuildConfig.v2nTotalSwitch)
// BUS 司机端 连接成功查询AIP状态和驾驶模式
if ((AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) || AppIdentityModeUtils.isB2(
FunctionBuildConfig.appIdentityMode
) || AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) && AppIdentityModeUtils.isDriver(
FunctionBuildConfig.appIdentityMode
)
) {
CallerAutoPilotControlManager.sendGetParamReq(
AdasConstants.MapSystemParamType.ACTIVATE_AIP,
AdasConstants.MapSystemParamType.DRIVING_STYLE
)
}
//事件数据进PNC应用
if(FunctionBuildConfig.ndeEventDataToPnc){
CallerAutoPilotControlManager.sendNdeDownEventToPnc(1)

View File

@@ -158,7 +158,8 @@ internal class MoGoLookAroundProviderImpl: IMoGoLookAroundProvider, IMoGoBackCam
}
}
override fun onGetParamResp(header: Header, getParamResp: SetParamReq, adasParam: AdasParam) {
override fun onGetParamResp(adasParam: AdasParam) {
super.onGetParamResp(adasParam)
Log.d(TAG, "-- onGetParamResp -- 1 --")
val parse = adasParam.m1StitchedVideoSelfVehicleParamParse
if (parse != null) {

View File

@@ -17,6 +17,7 @@ import android.widget.Toast
import androidx.annotation.CallSuper
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.preference.CheckBoxPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceGroup
@@ -841,9 +842,10 @@ class OperatePanelLayout : LinearLayout {
*/
override fun onGetParamResp(getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) {
ThreadUtils.runOnUiThread {
Log.i("onGetParamResp","adasParam.v2nToPnc="+adasParam.v2nToPnc)
Log.i("onGetParamResp","adasParam.v2iToPnc="+adasParam.v2iToPnc)
Log.i("onGetParamResp","adasParam.perceptionToPnc="+adasParam.perceptionToPnc)
CallerLogger.i(
"V2X onGetParamResp",
"adasParam.v2nToPnc=${adasParam.v2nToPnc} adasParam.v2iToPnc=${+adasParam.v2iToPnc} adasParam.perceptionToPnc=${adasParam.perceptionToPnc}"
)
//融合v2n开关 NDE下行事件数据进pnc
if(adasParam.v2nToPnc != -1){
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(NDE_EVENT_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2nToPnc==1) }
@@ -1496,11 +1498,12 @@ class OperatePanelLayout : LinearLayout {
setPreferencesFromResource(R.xml.operate_panel_preference_details_mofang, rootKey)
}
}
// CallerAutoPilotControlManager
class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener,
ISopSettingListener, IViewControlListener, IMoGoGetParamResponseListener{
companion object {
private const val TAG = "VehiclesPreferenceFragmentCompat"
private const val IS_CHECKED_DRIVING_STYLE = "is_checked_driving_style"
private const val KEY_PNC_PARK_INTERSECTION_CAR = "pnc_park_intersection_car"
private const val KEY_PNC_PARK_OVERTAKE_CAR = "pnc_park_overtake_car"
private const val KEY_DETOUR_RETARD_PARK = "detour_retard_park"
@@ -1513,12 +1516,17 @@ class OperatePanelLayout : LinearLayout {
private const val KEY_BEYOND_VISUAL_RANGE_MODE = "beyond_visual_range_mode"
private const val KEY_TRANSPARENT_TRANSFER_MODE = "transparent_transfer_mode"
private const val KEY_PURE_OBU_MODE = "pure_obu_mode"
private const val KEY_AIP_FUNCTION = "aip_function"
private const val KEY_DRIVING_STYLE_NORMAL = "driving_style_normal"
private const val KEY_DRIVING_STYLE_SAFETY = "driving_style_safety"
private const val KEY_DRIVING_STYLE_PROFESSIONAL = "driving_style_professional"
private const val KEY_AUTO_PILOT_SPEED_THRESHOLDS = "auto_pilot_speed_thresholds"
private const val KEY_CHANGE_LANE_SPEED_THRESHOLDS = "change_lane_speed_thresholds"
private const val KEY_OVERTAKE_SPEED_THRESHOLDSS = "overtake_speed_thresholds"
}
private var prevCheckedKeyForFusionMode: String? = null
private var prevCheckedKeyForDrivingStyle: String? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
Logger.d(TAG, "--- onCreateView --- 1 ---")
@@ -1529,8 +1537,25 @@ class OperatePanelLayout : LinearLayout {
if (AppConfigInfo.isConnectAutopilot) {
Logger.d(TAG, "--- onCreateView --- 2 ---") //获取车辆配置
CallerAutoPilotControlManager.getCarConfig() //查询融合模式
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.FUSION_MODE)
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.OVERTAKE_MAX_SPEED)
CallerAutoPilotControlManager.sendGetParamReq(
AdasConstants.MapSystemParamType.FUSION_MODE,
AdasConstants.MapSystemParamType.OVERTAKE_MAX_SPEED,
AdasConstants.MapSystemParamType.ACTIVATE_AIP,
AdasConstants.MapSystemParamType.DRIVING_STYLE
)
}
//非BUS 司机端隐藏按钮
if (!(AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) || AppIdentityModeUtils.isB2(
FunctionBuildConfig.appIdentityMode
) || AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) && AppIdentityModeUtils.isDriver(
FunctionBuildConfig.appIdentityMode
)
) {
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(KEY_AIP_FUNCTION)?.isVisible= false
preferenceScreen.findPreference<Preference>("header_driving_style")?.isVisible = false
preferenceScreen.findPreferenceReal<CheckBoxPreference>(KEY_DRIVING_STYLE_NORMAL)?.isVisible= false
preferenceScreen.findPreferenceReal<CheckBoxPreference>(KEY_DRIVING_STYLE_SAFETY)?.isVisible= false
preferenceScreen.findPreferenceReal<CheckBoxPreference>( KEY_DRIVING_STYLE_PROFESSIONAL)?.isVisible= false
}
return super.onCreateView(inflater, container, savedInstanceState)
}
@@ -1553,7 +1578,8 @@ class OperatePanelLayout : LinearLayout {
}
}
override fun onGetParamResp(header: MessagePad.Header, getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) {
override fun onGetParamResp(adasParam: AdasParam) {
super.onGetParamResp(adasParam)
Logger.d(TAG, "-- onGetParamResp --: fusion-mode:${adasParam.fusionMode}, over-take-speed:${adasParam.overtakeMaxSpeed} ")
lifecycleScope.launch {
when(adasParam.fusionMode) {
@@ -1627,6 +1653,60 @@ class OperatePanelLayout : LinearLayout {
FunctionBuildConfig.overTakeSpeed = adasParam.overtakeMaxSpeed
preferenceScreen.findPreferenceReal<PreferenceWithSpeedSetting>(KEY_OVERTAKE_SPEED_THRESHOLDSS)?.update(listOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5", "m/s"))
}
CallerLogger.i(
"VEH onGetParamResp",
"adasParam.activateAip=${adasParam.activateAip} "
)
if (adasParam.activateAip != -1) {
ThreadUtils.runOnUiThread {
preferenceScreen.findPreferenceReal<SwitchPreferenceCompat>(
KEY_AIP_FUNCTION
)?.also { changeValue(it, adasParam.activateAip == 1) }
}
}
//驾驶模式
when(adasParam.drivingStyle) {
0 -> {
//正常模式
prevCheckedKeyForDrivingStyle?.takeIf { it != KEY_DRIVING_STYLE_NORMAL }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForDrivingStyle = KEY_DRIVING_STYLE_NORMAL
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_DRIVING_STYLE_NORMAL)?.also {
it.extras.putBoolean(IS_CHECKED_DRIVING_STYLE, true)
changeValue(it, true)
}
}
1 -> {
//安全模式
prevCheckedKeyForDrivingStyle?.takeIf { it != KEY_DRIVING_STYLE_SAFETY }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForDrivingStyle = KEY_DRIVING_STYLE_SAFETY
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_DRIVING_STYLE_SAFETY)?.also {
it.extras.putBoolean(IS_CHECKED_DRIVING_STYLE, true)
changeValue(it, true)
}
}
2 -> {
//专业模式
prevCheckedKeyForDrivingStyle?.takeIf { it != KEY_DRIVING_STYLE_PROFESSIONAL}?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForDrivingStyle = KEY_DRIVING_STYLE_PROFESSIONAL
preferenceScreen.findPreferenceReal<TwoStatePreference>(KEY_DRIVING_STYLE_PROFESSIONAL)?.also {
it.extras.putBoolean(IS_CHECKED_DRIVING_STYLE, true)
changeValue(it, true)
}
}
}
}
}
@@ -1698,6 +1778,18 @@ class OperatePanelLayout : LinearLayout {
KEY_PURE_OBU_MODE -> {
return false
}
KEY_AIP_FUNCTION -> {
return FunctionBuildConfig.isActivateAip
}
KEY_DRIVING_STYLE_NORMAL -> {
return FunctionBuildConfig.drivingStyle == 0
}
KEY_DRIVING_STYLE_SAFETY -> {
return FunctionBuildConfig.drivingStyle == 1
}
KEY_DRIVING_STYLE_PROFESSIONAL -> {
return FunctionBuildConfig.drivingStyle == 2
}
KEY_AUTO_PILOT_SPEED_THRESHOLDS -> {
return listOf("0.0", "60.0", "${FunctionBuildConfig.maxSpeedLimit}", "5.0", "km/h")
}
@@ -1928,6 +2020,71 @@ class OperatePanelLayout : LinearLayout {
}
return isChecked
}
KEY_AIP_FUNCTION -> {
val isChecked = newValue as? Boolean ?: false
CallerAutoPilotControlManager.sendActivateAip(isChecked)
hmiAction("SOP AIP功能, ", isChecked)
clickEventAnalytics("AIP功能", isChecked)
return true
}
KEY_DRIVING_STYLE_NORMAL -> {
if (preference.extras.containsKey(IS_CHECKED_DRIVING_STYLE)) {
preference.extras.remove(IS_CHECKED_DRIVING_STYLE)
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
prevCheckedKeyForDrivingStyle?.takeIf { it != KEY_DRIVING_STYLE_NORMAL }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForDrivingStyle = KEY_DRIVING_STYLE_NORMAL
hmiAction("SOP 驾驶模式-正常模式, ", 0)
clickEventAnalytics("驾驶模式-正常模式", true)
CallerAutoPilotControlManager.sendDrivingStyle(0)
}
return isChecked
}
KEY_DRIVING_STYLE_SAFETY -> {
if (preference.extras.containsKey(IS_CHECKED_DRIVING_STYLE)) {
preference.extras.remove(IS_CHECKED_DRIVING_STYLE)
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
prevCheckedKeyForDrivingStyle?.takeIf { it != KEY_DRIVING_STYLE_SAFETY }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForDrivingStyle = KEY_DRIVING_STYLE_SAFETY
hmiAction("SOP 驾驶模式-安全模式, ", 1)
clickEventAnalytics("驾驶模式-安全模式", true)
CallerAutoPilotControlManager.sendDrivingStyle(1)
}
return isChecked
}
KEY_DRIVING_STYLE_PROFESSIONAL -> {
if (preference.extras.containsKey(IS_CHECKED_DRIVING_STYLE)) {
preference.extras.remove(IS_CHECKED_DRIVING_STYLE)
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
prevCheckedKeyForDrivingStyle?.takeIf { it != KEY_DRIVING_STYLE_PROFESSIONAL }?.let {
preferenceScreen.findPreferenceReal<TwoStatePreference>(it)
}?.also {
changeValue(it, false)
}
prevCheckedKeyForDrivingStyle = KEY_DRIVING_STYLE_PROFESSIONAL
hmiAction("SOP 驾驶模式-专业模式, ", 2)
clickEventAnalytics("驾驶模式-专业模式", true)
CallerAutoPilotControlManager.sendDrivingStyle(2)
}
return isChecked
}
}
return super.onPreferenceChange(preference, newValue)
}

View File

@@ -1107,11 +1107,8 @@ internal class SOPSettingView @JvmOverloads constructor(
/**
* 工控机配置参数获取
*/
override fun onGetParamResp(
header: MessagePad.Header,
getParamResp: MessagePad.SetParamReq,
adasParam: AdasParam
) {
override fun onGetParamResp(adasParam: AdasParam) {
super.onGetParamResp(adasParam)
//融合模式
ThreadUtils.runOnUiThread {
updateFusionModeUI()

View File

@@ -78,6 +78,35 @@
android:title="纯路侧模式"
android:persistent="false"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<SwitchPreferenceCompat
android:key="aip_function"
android:layout="@layout/layout_operate_panel_preference_switch_compat"
android:persistent="false"
android:title="AIP功能"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_switch_compat" />
<Preference
android:key="header_driving_style"
android:layout="@layout/layout_operate_panel_preference_primary_category_title"
android:selectable="false"
android:title="驾驶模式" />
<CheckBoxPreference
android:key="driving_style_normal"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:persistent="false"
android:title="正常模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<CheckBoxPreference
android:key="driving_style_safety"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:persistent="false"
android:title="安全模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<CheckBoxPreference
android:key="driving_style_professional"
android:layout="@layout/layout_operate_panel_preference_checkbox_compat"
android:persistent="false"
android:title="专业模式"
android:widgetLayout="@layout/layout_operate_panel_preference_widget_checkbox_compat" />
<com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithSpeedSetting
android:key="auto_pilot_speed_thresholds"
android:layout="@layout/layout_operate_panel_preference_with_title_above"

View File

@@ -16,7 +16,7 @@ interface IMoGoGetParamResponseListener {
* @param getParamResp 配置参数
* @param adasParam 解析后的配置参数
*/
fun onGetParamResp(getParamResp: MessagePad.SetParamReq, adasParam: AdasParam){}
fun onGetParamResp(adasParam: AdasParam){}
/**
* AIP功能开关状态变更 只有变动才回调

View File

@@ -18,7 +18,7 @@ object CallerAutopilotGetParamResponseDispatcher: CallerBase<IMoGoGetParamRespon
}
}
fun dispatchResponse(getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) {
fun dispatchResponse(adasParam: AdasParam) {
if (adasParam.activateAip != -1) {
FunctionBuildConfig.isActivateAip = adasParam.activateAip > 0
_isActivateAip = FunctionBuildConfig.isActivateAip
@@ -26,9 +26,12 @@ object CallerAutopilotGetParamResponseDispatcher: CallerBase<IMoGoGetParamRespon
if (adasParam.drivingStyle != -1) {
FunctionBuildConfig.drivingStyle = adasParam.drivingStyle
}
if (adasParam.fusionMode != -1) {
FunctionBuildConfig.fusionMode = adasParam.fusionMode
}
M_LISTENERS.forEach {
val listener = it.value
listener.onGetParamResp(getParamResp, adasParam)
listener.onGetParamResp(adasParam)
}
}
}