[fea]
[自驾View 添加debug模块]
This commit is contained in:
yangyakun
2024-10-08 11:03:44 +08:00
parent 1528367b3b
commit 8713ea5ae5
8 changed files with 246 additions and 36 deletions

View File

@@ -75,6 +75,7 @@ object DebugDataDispatch {
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "xiaozhiV2N" --es poiType "10002" --ei state 0
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "romal" --ei show 0
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "visual" --ei show 0
// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "showDebugView"
val ROOT_PATH =

View File

@@ -4,12 +4,15 @@ import android.app.Activity
import android.graphics.PixelFormat
import android.util.DisplayMetrics
import android.view.*
import android.widget.RadioGroup
import androidx.appcompat.widget.AppCompatButton
import androidx.appcompat.widget.AppCompatCheckBox
import androidx.appcompat.widget.AppCompatImageView
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.och.common.module.R
import com.mogo.och.common.module.debug.autopilot.AutopilotStateDebug
import mogo_msg.MogoReportMsg
/**
@@ -31,6 +34,8 @@ class DebugFloatWindow constructor(activity: Activity) : View.OnTouchListener{
private var mInScreenX = 0f
private var mInScreenY = 0f
private var rg_autopilot:RadioGroup?=null
init {
initFloatWindow();
}
@@ -48,6 +53,9 @@ class DebugFloatWindow constructor(activity: Activity) : View.OnTouchListener{
it.height = 1000
it.alpha = 0.9f
}
rg_autopilot = mFloatLayout.findViewById<RadioGroup>(R.id.rg_autopilot)
mFloatLayout.findViewById<AppCompatImageView>(R.id.close_window).onClick {
hideFloatWindow()
}
@@ -61,6 +69,34 @@ class DebugFloatWindow constructor(activity: Activity) : View.OnTouchListener{
newBuilder.level = ""
CallerAutoPilotStatusListenerManager.invokeAutopilotGuardian(newBuilder.build())
}
mFloatLayout.findViewById<AppCompatCheckBox>(R.id.accb_autopilot_group).setOnCheckedChangeListener { buttonView, isChecked ->
if(isChecked){
rg_autopilot?.visibility = View.VISIBLE
AutopilotStateDebug.changeDebugstatus(true)
}else{
AutopilotStateDebug.changeDebugstatus(false)
rg_autopilot?.visibility = View.GONE
}
}
rg_autopilot?.setOnCheckedChangeListener { group, checkedId ->
if(group.id==R.id.rg_autopilot){
when (checkedId) {
R.id.acrb_disenable -> {
AutopilotStateDebug.dispatchAutopilotState(0)
}
R.id.acrb_enable -> {
AutopilotStateDebug.dispatchAutopilotState(1)
}
R.id.acrb_inautopilot -> {
AutopilotStateDebug.dispatchAutopilotState(2)
}
R.id.acrb_remote -> {
AutopilotStateDebug.dispatchAutopilotState(7)
}
else -> {}
}
}
}
}
override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean {

View File

@@ -26,4 +26,52 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/accb_autopilot_group"
app:layout_constraintTop_toBottomOf="@+id/acbtn_send_15_dir"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginStart="@dimen/dp_40"
android:text="模拟自驾状态"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RadioGroup
android:id="@+id/rg_autopilot"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/accb_autopilot_group"
app:layout_constraintStart_toStartOf="@+id/accb_autopilot_group"
android:orientation="horizontal"
android:layout_marginTop="@dimen/dp_10"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/acrb_disenable"
android:text="自驾状态为就绪"
android:layout_marginEnd="@dimen/dp_10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/acrb_enable"
android:text="自驾状态就绪"
android:layout_marginEnd="@dimen/dp_10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/acrb_inautopilot"
android:text="自驾中"
android:layout_marginEnd="@dimen/dp_10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatRadioButton
android:text="平行驾驶中"
android:id="@+id/acrb_remote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,46 @@
package com.mogo.och.common.module.debug.autopilot
import com.mogo.och.common.module.utils.CallerBase
import kotlin.properties.Delegates
object AutopilotStateDebug: CallerBase<IOchDebugAutopilotStatusListener>() {
private var _debugStatus:Boolean by Delegates.observable(false) { _, oldValue, newValue ->
if (oldValue != newValue) {
M_LISTENERS.forEach {
val listener = it.value
listener.debugStatusChange(newValue)
}
if(newValue){
M_LISTENERS.forEach {
val listener = it.value
listener.debugDispatchState(debugState)
}
}
}
}
val debugStatus: Boolean
@JvmStatic
get() = _debugStatus
private var debugState:Int? by Delegates.observable(null) { _, oldValue, newValue ->
if (oldValue != newValue) {
M_LISTENERS.forEach {
val listener = it.value
listener.debugDispatchState(newValue)
}
}
}
fun changeDebugstatus(debugStatus:Boolean){
this._debugStatus = debugStatus
}
fun dispatchAutopilotState(state:Int){
if(_debugStatus){
this.debugState = state
}
}
}

View File

@@ -0,0 +1,16 @@
package com.mogo.och.common.module.debug.autopilot;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
public interface IOchDebugAutopilotStatusListener {
final String TAG = "IOchDebugAutopilotStatusListener";
default void debugStatusChange(boolean debugStatus){
CallerLogger.d(TAG,"debug状态变化:"+debugStatus);
}
default void debugDispatchState(Integer state) {
CallerLogger.d(TAG,"自驾状态变化:"+state);
}
}

View File

@@ -1,15 +1,23 @@
package com.mogo.och.common.module.wigets.autopilot
import android.animation.Animator
import android.animation.Animator.AnimatorListener
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import androidx.annotation.DrawableRes
import androidx.annotation.IntegerRes
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.R
import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener
import com.mogo.och.common.module.utils.BigFrameAnimatorContainer
@@ -34,6 +42,7 @@ class AutopilotState @JvmOverloads constructor(
private var autopilotStateAnimator: BigFrameAnimatorContainer?=null
private lateinit var autopilotLoadingAnimator: ObjectAnimator
private lateinit var autopilotChangeStateAnimator: ObjectAnimator
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.common_autopilot_view, this, true)
@@ -42,6 +51,10 @@ class AutopilotState @JvmOverloads constructor(
autopilotLoadingAnimator.interpolator = LinearInterpolator()
autopilotLoadingAnimator.repeatCount = -1 //无限循环
autopilotLoadingAnimator.duration = 1000 //无限循环
autopilotChangeStateAnimator = ObjectAnimator.ofFloat(aciv_autopilot_state, "alpha", 1f, 0f,1f);
autopilotChangeStateAnimator.interpolator = LinearInterpolator()
autopilotChangeStateAnimator.duration = 200
onClick {
startAutopilot()
}
@@ -75,7 +88,7 @@ class AutopilotState @JvmOverloads constructor(
override fun startAutopilotAnimation() {
CallerLogger.d(TAG,"播放启动自驾动画")
aciv_autopilot_state.setImageResource(R.drawable.common_autopilot_enable)
updateImageInAnimator(R.drawable.common_autopilot_starting_new)
actv_pxjs_state.visibility = GONE
actv_autopilot_head.visibility = VISIBLE
@@ -88,11 +101,15 @@ class AutopilotState @JvmOverloads constructor(
AutopilotState@this.isEnabled = false
autopilotLoadingAnimator.start()
val animatorSet = AnimatorSet()
animatorSet.playTogether(autopilotChangeStateAnimator, autopilotLoadingAnimator)
animatorSet.start()
}
override fun stopAutopilotAnimation() {
CallerLogger.d(TAG,"结束启动自驾动画")
aciv_autopilot_state.setImageResource(R.drawable.common_autopilot_enable)
updateImageInAnimator(R.drawable.common_autopilot_enable)
actv_pxjs_state.visibility = GONE
actv_autopilot_head.visibility = VISIBLE
@@ -105,11 +122,12 @@ class AutopilotState @JvmOverloads constructor(
AutopilotState@this.isEnabled = false
autopilotLoadingAnimator.cancel()
autopilotChangeStateAnimator.start()
}
override fun inAutopilot() {
CallerLogger.d(TAG,"展示自驾中UI")
aciv_autopilot_state.setImageResource(R.drawable.common_autopilot_running)
updateImageInAnimator(R.drawable.common_autopilot_starting_new)
actv_pxjs_state.visibility = GONE
actv_autopilot_head.visibility = VISIBLE
@@ -124,11 +142,12 @@ class AutopilotState @JvmOverloads constructor(
aciv_autopilot_running_ani.visibility = VISIBLE
autopilotStateAnimator?.start()
autopilotLoadingAnimator.cancel()
autopilotChangeStateAnimator.start()
}
override fun autopilotDisable() {
CallerLogger.d(TAG,"不可启动自驾")
aciv_autopilot_state.setImageResource(R.drawable.common_autopilot_unenable)
updateImageInAnimator(R.drawable.common_autopilot_unenable)
actv_pxjs_state.visibility = GONE
actv_autopilot_head.visibility = VISIBLE
@@ -144,11 +163,13 @@ class AutopilotState @JvmOverloads constructor(
aciv_autopilot_running_ani.visibility = GONE
autopilotStateAnimator?.stop()
autopilotLoadingAnimator.cancel()
autopilotChangeStateAnimator.start()
}
override fun canStartAutopilot() {
CallerLogger.d(TAG,"可以启动自驾")
aciv_autopilot_state.setImageResource(R.drawable.common_autopilot_enable)
updateImageInAnimator(R.drawable.common_autopilot_enable)
actv_pxjs_state.visibility = GONE
actv_autopilot_head.visibility = VISIBLE
@@ -163,11 +184,12 @@ class AutopilotState @JvmOverloads constructor(
aciv_autopilot_running_ani.visibility = GONE
autopilotStateAnimator?.stop()
autopilotLoadingAnimator.cancel()
autopilotChangeStateAnimator.start()
}
override fun inRemoteDriver() {
CallerLogger.d(TAG,"展示平行驾驶中UI")
aciv_autopilot_state.setImageResource(R.drawable.common_autopilot_running)
updateImageInAnimator(R.drawable.common_autopilot_running)
actv_pxjs_state.visibility = VISIBLE
actv_autopilot_head.visibility = GONE
@@ -182,6 +204,7 @@ class AutopilotState @JvmOverloads constructor(
aciv_autopilot_running_ani.visibility = VISIBLE
autopilotStateAnimator?.start()
autopilotLoadingAnimator.cancel()
autopilotChangeStateAnimator.start()
}
override fun startAutopilotSuccess() {
@@ -190,7 +213,7 @@ class AutopilotState @JvmOverloads constructor(
override fun startAutopilotFail() {
CallerLogger.d(TAG,"启动自动驾驶失败")
aciv_autopilot_state.setImageResource(R.drawable.common_autopilot_fail)
updateImageInAnimator(R.drawable.common_autopilot_fail)
actv_pxjs_state.visibility = GONE
actv_autopilot_head.visibility = VISIBLE
@@ -205,6 +228,13 @@ class AutopilotState @JvmOverloads constructor(
aciv_autopilot_running_ani.visibility = VISIBLE
autopilotStateAnimator?.stop()
autopilotLoadingAnimator.cancel()
autopilotChangeStateAnimator.start()
}
private fun updateImageInAnimator(@DrawableRes resource:Int){
UiThreadHandler.postDelayed({
aciv_autopilot_state.setImageResource(resource)
},100,UiThreadHandler.MODE.QUEUE)
}
}

View File

@@ -1,41 +1,26 @@
package com.mogo.och.common.module.wigets.autopilot
import android.text.TextUtils
import androidx.lifecycle.ViewModel
import com.elegant.network.utils.GsonUtil
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
import com.mogo.eagle.core.utilcode.util.StringUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.callback.OchAdasStartFailureCallback
import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager
import com.mogo.och.common.module.debug.autopilot.AutopilotStateDebug
import com.mogo.och.common.module.debug.autopilot.IOchDebugAutopilotStatusListener
import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager.canStartAutoPilotByDistance
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager.canStartAutoPilotSSM
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager.startAutoPilot
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutopilotAnalytics
import com.mogo.och.common.module.manager.autopilot.line.ILineCallback
import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.voice.VoiceNotice.showNotice
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicLong
/**
* @author XuXinChao
* @description BadCase录包管理页面
* @since: 2022/12/15
*/
class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCallback{
class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCallback,
IOchDebugAutopilotStatusListener {
private val TAG = AutopilotStateModel::class.java.simpleName
@@ -46,16 +31,49 @@ class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCall
override fun onCleared() {
this.viewCallback = null
AutopilotStateDebug.removeListener(TAG)
OchAutoPilotStatusListenerManager.removeListener(TAG)
LineManager.removeListener(TAG)
}
fun setViewCallback(viewCallback:AutopilotStateCallback){
this.viewCallback = viewCallback
AutopilotStateDebug.addListener(TAG,this)
OchAutoPilotStatusListenerManager.addListener(TAG,this)
LineManager.addListener(TAG,this)
}
override fun debugStatusChange(debugStatus: Boolean) {
super.debugStatusChange(debugStatus)
if(debugStatus){
OchAutoPilotStatusListenerManager.removeListener(TAG)
LineManager.removeListener(TAG)
}else{
OchAutoPilotStatusListenerManager.addListener(TAG,this)
LineManager.addListener(TAG,this)
}
}
override fun debugDispatchState(state: Int?) {
super.debugDispatchState(state)
when (state) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE-> {// 不可用 不可启动自驾
this.viewCallback?.autopilotDisable()
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE-> {
this.viewCallback?.canStartAutopilot()
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING-> {// 自驾中
this.viewCallback?.stopAutopilotAnimation()
this.viewCallback?.inAutopilot()
}
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING-> {// 平行驾驶中
this.viewCallback?.stopAutopilotAnimation()
this.viewCallback?.inRemoteDriver()
}
}
}
override fun onAutopilotStatusResponse(state: Int) {
OchChainLogManager.writeChainLog("自驾信息","自驾状态变化:${state}")
autopilotStateChange()
@@ -67,11 +85,22 @@ class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCall
}
private fun autopilotStateChange(){
// 正在起自驾过程中
// 自驾状态变化为非自驾状态
// 或者
// FSM 状态改为不能启动自驾
// 按照启动自驾失败计算
if(isPalyStartAni.get() &&
(!CallerAutoPilotControlManager.isCanStartAutopilot(false)
|| OchAutoPilotStatusListenerManager.autopilotState!=IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)){
OchChainLogManager.writeChainLog("自驾信息","正在起自驾过程中、自驾状态变化切为非自驾状态或者FSM 状态改为不能启动自驾")
startAutopilotFail()
return
}
BizLoopManager.runInMainThread{
OchChainLogManager.writeChainLog("自驾信息","自驾状态:${OchAutoPilotStatusListenerManager.autopilotState} 能否启动自驾:${CallerAutoPilotControlManager.isCanStartAutopilot(false)}")
when (OchAutoPilotStatusListenerManager.autopilotState) {
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE-> {// 不可用 不可启动自驾
this.viewCallback?.autopilotDisable()
}
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE-> {
@@ -95,9 +124,16 @@ class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCall
fun startAutopilot() {
OchChainLogManager.writeChainLog("自驾信息","启动自驾")
LineManager.startAutopilot()
if(AutopilotStateDebug.debugStatus){
startAutopilotSuccess()
}else {
LineManager.startAutopilot()
}
}
/**
* 条件过滤完成 正式进入启动自驾状态
*/
override fun startAutopilotSuccess() {
OchChainLogManager.writeChainLog("自驾信息","启动自驾成功")
BizLoopManager.runInMainThread {
@@ -108,18 +144,15 @@ class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCall
override fun startAutopilotTimeOut() {
OchChainLogManager.writeChainLog("自驾信息","启动自驾超时失败")
BizLoopManager.runInMainThread{
this.viewCallback?.stopAutopilotAnimation()
this.viewCallback?.startAutopilotFail()
this.isPalyStartAni.set(false)
UiThreadHandler.postDelayed({
autopilotStateChange()
},1000,UiThreadHandler.MODE.QUEUE)
}
startAutopilotFail()
}
override fun startAutopilotFailure(startFailedCode: String?, startFailedMessage: String?) {
OchChainLogManager.writeChainLog("自驾信息","底盘强制失败原因:${startFailedCode}_${startFailedMessage}")
startAutopilotFail()
}
private fun startAutopilotFail(){
BizLoopManager.runInMainThread{
this.viewCallback?.stopAutopilotAnimation()
this.viewCallback?.startAutopilotFail()

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB