From a9d938f093797f108af1dc62a78def21383d8c06 Mon Sep 17 00:00:00 2001 From: aibingbing Date: Wed, 14 Aug 2024 16:56:22 +0800 Subject: [PATCH] =?UTF-8?q?[6.6.0][FSM]=20feat:=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A0=8F=E5=A2=9E=E5=8A=A0=20FSM=20=E7=8A=B6=E6=80=81=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20FSM=20=E5=BC=82=E5=B8=B8=E6=97=B6=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=BC=B9=E6=A1=86=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../status/flow/fsm/FSMImpl.kt | 33 +++++-- .../status/ui/adapter/StatusAdapter.kt | 4 + .../core/function/hmi/ui/MoGoHmiProvider.kt | 16 ++++ .../hmi/ui/setting/FSMStatusDetailView.kt | 48 ++++++++++ .../setting/FSMStatusDetailWindowManager.kt | 88 +++++++++++++++++++ .../status_dialog_fsm_status_background.xml | 5 ++ .../res/layout/view_status_fsm_layout.xml | 42 +++++++++ .../api/hmi/warning/IMoGoHmiProvider.kt | 11 +++ .../function/call/hmi/CallerHmiManager.kt | 14 +++ 9 files changed, 255 insertions(+), 6 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailWindowManager.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt index 13f33e6228..2a99e155a0 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt @@ -8,6 +8,8 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerFsm2024ListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA +import com.mogo.eagle.core.utilcode.util.DateTimeUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo_core_function_devatools.status.entity.FSMStateCode import com.zhjt.mogo_core_function_devatools.status.entity.FSMStatus @@ -16,6 +18,7 @@ import fsm.Fsm2024 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.util.concurrent.atomic.AtomicReference +import kotlin.random.Random internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStatusListener, IMoGoFsm2024Listener { @@ -49,6 +52,24 @@ internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStat CallerLogger.d("$M_DEVA$TAG", "-- onCreate --") CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerFsm2024ListenerManager.addListener(TAG, this) + + //TODO + test() + test1() + } + + fun test() { + send(FSMStatus(FSMStateCode.Error, "检查到异常,不能启动自驾,time=${DateTimeUtils.getCurrentDateTime()}")) + UiThreadHandler.postDelayed({ + test() + },3000L) + } + + fun test1() { + send(FSMStatus(FSMStateCode.Normal, "状态正常")) + UiThreadHandler.postDelayed({ + test1() + }, Random.nextInt(1,10) * 1000L) } override fun onAutopilotIpcConnectStatusChanged( @@ -56,15 +77,15 @@ internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStat reason: String? ) { super.onAutopilotIpcConnectStatusChanged(status, reason) - if (!CallerAutoPilotStatusListenerManager.isConnect()) { - CallerLogger.d("$M_DEVA$TAG", "工控机断开了....") - fsmStateMsg.set(null) - send(FSMStatus(FSMStateCode.IpcNotConnected, "工控机断开了")) - } else { - CallerLogger.d("$M_DEVA$TAG", "工控机已连接....") + if (CallerAutoPilotStatusListenerManager.isConnect()) { + CallerLogger.d("$M_DEVA$TAG", "工控机已连接") launch(Dispatchers.Default) { CallerAutoPilotControlManager.sendStatusQueryReq() } + } else { + CallerLogger.d("$M_DEVA$TAG", "工控机断开了....") + fsmStateMsg.set(null) + send(FSMStatus(FSMStateCode.IpcNotConnected, "工控机断开了")) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index 31703d7969..263e98ce19 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -137,15 +137,19 @@ internal class StatusAdapter(val ctx: Context, var data: List): Recycler when (status.state) { FSMStateCode.IpcNotConnected -> { iv.setImageDrawable(null) + CallerHmiManager.dismissFSMStatusDetailWindow() } FSMStateCode.NoneExist -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_not_exist) + CallerHmiManager.dismissFSMStatusDetailWindow() } FSMStateCode.Normal -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_normal) + CallerHmiManager.dismissFSMStatusDetailWindow() } FSMStateCode.Error -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_error) + CallerHmiManager.showFSMStatusDetailWindow("FSM异常:", "#FF3B3B", status.desc) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index 7e2d5611c6..d3a34032f0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -38,6 +38,7 @@ import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog import com.mogo.eagle.core.function.hmi.ui.notice.traffic.NoticeTrafficDialog import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView +import com.mogo.eagle.core.function.hmi.ui.setting.FSMStatusDetailWindowManager import com.mogo.eagle.core.function.hmi.ui.setting.StatusView import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog @@ -341,6 +342,21 @@ class MoGoHmiProvider : IMoGoHmiProvider { override fun is360LookAroundShowing(): Boolean { return lookAround.get()?.isShowing() ?: false } + + /** + * 展示 FSM 状态详情弹框 + */ + override fun showFSMStatusDetailWindow(title: String, titleColor:String, content: String) { + context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.show(it, title, titleColor, content)} + } + + /** + * 关闭 FSM 状态详情弹框 + */ + override fun dismissFSMStatusDetailWindow() { + context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.dismiss()} + } + override fun showStatusSummaryDialog() { context?.let { StatusView.statusView.toggle(it) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailView.kt new file mode 100644 index 0000000000..3de7253a63 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailView.kt @@ -0,0 +1,48 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import android.widget.TextView +import com.mogo.eagle.core.function.hmi.R + +/** + * FSM状态展示 View + */ +class FSMStatusDetailView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout( + context, + attrs, + defStyleAttr +) { + companion object { + private const val TAG = "FSMStatusView" + } + + private var tvTitle: TextView? = null + private var tvContent: TextView? = null + + init { + LayoutInflater.from(context).inflate(R.layout.view_status_fsm_layout, this, true) + initView() + } + + private fun initView() { + tvTitle = findViewById(R.id.tvTitle) + tvContent = findViewById(R.id.tvContent) + } + + fun setFsmMsg(title: String, titleColor: String , content: String) { + tvTitle?.text = title + tvContent?.text = content + runCatching { + val c = Color.parseColor(titleColor) + tvTitle?.setTextColor(c) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailWindowManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailWindowManager.kt new file mode 100644 index 0000000000..0c52a5ae98 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/FSMStatusDetailWindowManager.kt @@ -0,0 +1,88 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.animation.Animator +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.WindowManager +import android.view.animation.OvershootInterpolator +import com.mogo.eagle.core.data.enums.SidePattern +import com.mogo.eagle.core.function.hmi.notification.WarningFloat +import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator +import me.jessyan.autosize.utils.AutoSizeUtils + +/** + * FSM 状态弹框管理类 + */ +class FSMStatusDetailWindowManager private constructor() { + + private var mFSMStatusViewFloat: WarningFloat.Builder? = null + private var mFSMStatusDetailView: FSMStatusDetailView? = null + + companion object { + val fsmStatusDetailWindowManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + FSMStatusDetailWindowManager() + } + } + + fun show( + context: Context, title: String, titleColor: String, content: String + ) { + if (mFSMStatusDetailView == null) { + mFSMStatusDetailView = FSMStatusDetailView(context) + } + if (mFSMStatusViewFloat?.isShow() == true) { + mFSMStatusDetailView?.apply { + setFsmMsg(title, titleColor, content) + } + } else { + mFSMStatusDetailView?.apply { + setFsmMsg(title, titleColor, content) + } + mFSMStatusViewFloat = WarningFloat.with(context) + .setTag("FSMStatusView") + .setLayout(mFSMStatusDetailView!!) + .setSidePattern(SidePattern.RIGHT) + .setGravity( + Gravity.RIGHT, + offsetY = AutoSizeUtils.dp2px(context, 112f), + offsetX = AutoSizeUtils.dp2px(context, (214f) * -1L) + ) + .setImmersionStatusBar(true) + .slideDel(false) + .setWindowHeight(WindowManager.LayoutParams.WRAP_CONTENT) + .setWindowWidth(AutoSizeUtils.dp2px(context, 538f)) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? { + mFSMStatusViewFloat = null + mFSMStatusDetailView = null + return super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + } + }) + .show() + } + } + + fun dismiss() { + mFSMStatusViewFloat?.let { + WarningFloat.dismiss(it.config.floatTag, false) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml new file mode 100644 index 0000000000..8cc69fc2db --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml new file mode 100644 index 0000000000..a340139fc7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml @@ -0,0 +1,42 @@ + + + + + + + + \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt index 54840daaa6..276235376d 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt @@ -156,6 +156,17 @@ interface IMoGoHmiProvider :IProvider{ * 360环视弹窗是否正在展示 */ fun is360LookAroundShowing(): Boolean + + /** + * 展示 FSM 状态详情弹框 + */ + fun showFSMStatusDetailWindow(title: String, titleColor:String, content: String) + + /** + * 关闭 FSM 状态详情弹框 + */ + fun dismissFSMStatusDetailWindow() + fun showStatusSummaryDialog() /** diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 9e2d5a04af..a18924e551 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -230,6 +230,20 @@ object CallerHmiManager { return hmiProviderApi?.is360LookAroundShowing() ?: false } + /** + * 展示 FSM 状态详情弹框 + */ + fun showFSMStatusDetailWindow(title: String, titleColor:String, content: String) { + hmiProviderApi?.showFSMStatusDetailWindow(title, titleColor, content) + } + + /** + * 关闭 FSM 状态详情弹框 + */ + fun dismissFSMStatusDetailWindow() { + hmiProviderApi?.dismissFSMStatusDetailWindow() + } + fun showStatusSummaryDialog() { hmiProviderApi?.showStatusSummaryDialog() }