diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt
index 827aa6b940..f823bf758a 100644
--- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt
+++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt
@@ -39,6 +39,7 @@ import com.tencent.matrix.trace.config.TraceConfig
import com.zhjt.mogo_core_function_devatools.apm.*
import com.mogo.eagle.core.function.api.upgrade.*
import com.mogo.weak.network.SdtManager
+import com.zhjt.mogo_core_function_devatools.adas.PowerOffManager
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.binding.*
@@ -305,6 +306,63 @@ class DevaToolsProvider : IDevaToolsProvider {
BadCaseManager.showBadCaseManagerWindow(context)
}
+ /**
+ * 启动调用SSM停服命令超时检测
+ */
+ override fun startCommandWaitCountDown() {
+ PowerOffManager.startCommandWaitCountDown()
+ }
+
+ /**
+ * 停止调用SSM停服命令超时检测
+ */
+ override fun stopCommandWaitCountDown() {
+ PowerOffManager.stopCommandWaitCountDown()
+ }
+
+ /**
+ * 开始车辆下电等待倒计时
+ */
+ override fun startPowerDownCountDown() {
+ PowerOffManager.startPowerDownCountDown()
+ }
+
+ /**
+ * 结束车辆下电等待倒计时
+ */
+ override fun stopPowerDownCountDown() {
+ PowerOffManager.stopPowerDownCountDown()
+ }
+
+ /**
+ * 状态按钮变更倒计时
+ */
+ override fun statusChangeCountDown(isSuccess: Boolean) {
+ PowerOffManager.statusChangeCountDown(isSuccess)
+ }
+
+ /**
+ * 结束状态按钮变更倒计时
+ */
+ override fun stopStatusCountDown() {
+ PowerOffManager.stopStatusCountDown()
+ }
+
+ /**
+ * 设置停服状态
+ */
+ override fun setPowerOffStatus(status: Int) {
+ PowerOffManager.setPowerOffStatus(status)
+ }
+
+ /**
+ * 获取停服状态
+ */
+ override fun getPowerOffStatus(): Int {
+ return PowerOffManager.getPowerOffStatus()
+ }
+
+
override fun showReportListWindow(context: Context, isShow: Boolean) {
iPCReportManager.showReportListWindow(context, isShow)
}
diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/adas/PowerOffManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/adas/PowerOffManager.kt
new file mode 100644
index 0000000000..a75bb2dc7c
--- /dev/null
+++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/adas/PowerOffManager.kt
@@ -0,0 +1,119 @@
+package com.zhjt.mogo_core_function_devatools.adas
+
+import android.os.CountDownTimer
+import com.mogo.eagle.core.function.call.devatools.CallerPowerOffManager
+
+/**
+ * 停止域控服务管理类
+ */
+object PowerOffManager {
+
+ private var commandWaitCountDownTimer: CountDownTimer ?= null
+ private var powerDownCountDownTimer: CountDownTimer ?= null
+ private var statusChangeCountDownTimer: CountDownTimer ?= null
+ private var powerDownNum = 60
+ /**
+ * 停止域控服务状态
+ * 0:准备停服 1:停服命令下发成功 2:停服命令下发失败 3:停服命令下发超时
+ * 4:停服中 5:停服成功 6:停服成功不可点击
+ */
+ private var powerOffStatus: Int = 0
+
+ /**
+ * 启动调用SSM停服命令超时检测
+ */
+ fun startCommandWaitCountDown(){
+ commandWaitCountDownTimer = object: CountDownTimer(10000,10000){
+ override fun onTick(millisUntilFinished: Long) {
+
+ }
+
+ override fun onFinish() {
+ CallerPowerOffManager.invokeCommandTimeout()
+ }
+ }
+ commandWaitCountDownTimer?.start()
+ }
+
+ /**
+ * 停止调用SSM停服命令超时检测
+ */
+ fun stopCommandWaitCountDown(){
+ if(commandWaitCountDownTimer != null){
+ commandWaitCountDownTimer?.cancel()
+ commandWaitCountDownTimer = null
+ }
+ }
+
+ /**
+ * 开始车辆下电等待倒计时
+ */
+ fun startPowerDownCountDown(){
+ powerDownNum = 60
+ powerDownCountDownTimer = object: CountDownTimer(60000,1000){
+ override fun onTick(millisUntilFinished: Long) {
+ if(powerDownNum > 0){
+ CallerPowerOffManager.invokePowerDownTick(powerDownNum--)
+ }
+ }
+
+ override fun onFinish() {
+ powerDownNum = 0
+ CallerPowerOffManager.invokePowerDownFinish()
+ }
+ }
+ powerDownCountDownTimer?.start()
+ }
+
+ /**
+ * 结束车辆下电等待倒计时
+ */
+ fun stopPowerDownCountDown(){
+ if(powerDownCountDownTimer != null){
+ powerDownCountDownTimer?.cancel()
+ powerDownCountDownTimer = null
+ }
+ }
+
+ /**
+ * 状态按钮变更倒计时
+ */
+ fun statusChangeCountDown(isSuccess: Boolean){
+ statusChangeCountDownTimer = object: CountDownTimer(1000,1000){
+ override fun onTick(millisUntilFinished: Long) {
+
+ }
+
+ override fun onFinish() {
+ CallerPowerOffManager.invokeStatusChange(isSuccess)
+ }
+ }
+ statusChangeCountDownTimer?.start()
+ }
+
+ /**
+ * 结束状态按钮变更倒计时
+ */
+ fun stopStatusCountDown(){
+ if(statusChangeCountDownTimer != null){
+ statusChangeCountDownTimer?.cancel()
+ statusChangeCountDownTimer = null
+ }
+ }
+
+ /**
+ * 设置停服状态
+ */
+ fun setPowerOffStatus(status: Int){
+ powerOffStatus = status
+ }
+
+ /**
+ * 获取停服状态
+ */
+ fun getPowerOffStatus(): Int{
+ return powerOffStatus
+ }
+
+
+}
\ 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/widget/CheckSystemView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CheckSystemView.kt
index 7feec03b76..4c5ea24b0d 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CheckSystemView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CheckSystemView.kt
@@ -1,37 +1,64 @@
package com.mogo.eagle.core.function.hmi.ui.widget
+import android.animation.ObjectAnimator
+import android.animation.ValueAnimator
import android.content.Context
import android.util.AttributeSet
-import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
+import android.view.animation.LinearInterpolator
import androidx.constraintlayout.widget.ConstraintLayout
-import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
+import androidx.core.content.ContextCompat
+import com.mogo.commons.voice.AIAssist
+import com.mogo.eagle.core.data.enums.EventTypeEnumNew
+import com.mogo.eagle.core.data.msgbox.MsgBoxBean
+import com.mogo.eagle.core.data.msgbox.MsgBoxType
+import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
+import com.mogo.eagle.core.function.api.autopilot.IMoGoReceiveReceivedAckListener
+import com.mogo.eagle.core.function.api.devatools.IPowerOffListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.function.call.autopilot.CallerReceiveReceivedAckListenerManager
+import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
+import com.mogo.eagle.core.function.call.devatools.CallerPowerOffManager
+import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox
import com.mogo.eagle.core.function.hmi.R
-import com.mogo.eagle.core.function.hmi.notification.WarningFloat
import com.mogo.eagle.core.function.hmi.ui.tools.DockerRebootDialog
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
+import com.zhjt.mogo.adas.common.MessageType
import com.zhjt.mogo.adas.data.AdasConstants
+import com.zhjt.mogo.adas.data.bean.ReceivedAck
import kotlinx.android.synthetic.main.view_check_system.view.*
+
class CheckSystemView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
-) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
+) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,
+ IPowerOffListener, IMoGoReceiveReceivedAckListener {
companion object {
const val TAG = "CheckSystemView"
}
+ //重启系统对话框
private var dockerRebootDialog: DockerRebootDialog? = null
- private var downloadStatus: String = "" //下载状态
- private var upgradeStatus: String = "" //升级状态
+ private var connectStatus: Boolean = false //与工控机的连接状态
+ private var isExecutingPowerOff: Boolean = false //是否正在下发一键停服命令
+ private var isPowerOffCountDown: Boolean = false //一键停服是否处于1分钟倒计时
+ private var powerOffMsgId: Long = -1 //一键停服命令下发Id
+ private var progressAnimator: ObjectAnimator ?= null //一键停服命令倒计时
+ /**
+ * 停止域控服务状态
+ * 0:准备停服 1:停服命令下发中 2:停服命令下发成功 3:停服命令下发失败
+ * 4:停服命令下发超时 5:停服中 6:停服成功 7:停服成功不可点击
+ */
+ private var powerOffStatus: Int = 0
init {
LayoutInflater.from(context).inflate(R.layout.view_check_system, this, true)
@@ -39,85 +66,386 @@ class CheckSystemView @JvmOverloads constructor(
}
private fun initView() {
+ //一键停服
viewCheckShutDown.setOnClickListener {
- //dialog
-// showSystemOperationWindow()
+ powerOff()
}
+ tvCheckShutDown.setOnClickListener {
+ powerOff()
+ }
+ //重启系统
viewCheckReboot.setOnClickListener {
- //dialog
- if (dockerRebootDialog == null) {
- dockerRebootDialog = DockerRebootDialog(context)
- dockerRebootDialog?.setClickListener(object : DockerRebootDialog.ClickListener {
- override fun confirm() {
- if (CallerAutoPilotStatusListenerManager.getState() == 2) {
- //当前处于自动驾驶状态,不可进行重启,Toast提示
- ToastUtils.showShort("请先退出自动驾驶状态")
- }
-
-// else if (AdUpgradeStateHelper.showCannotReboot(
-// downloadStatus,
-// upgradeStatus
-// )
-// ) {
-// //当工控机处于下载或者升级状态,需要先进行升级
-// ToastUtils.showShort("请先完成新自动驾驶系统的下载/升级")
-// }
-
- else {
- //确认重启
- CallerLogger.d("$M_HMI$TAG", "reboot confirm")
- CallerAutoPilotControlManager.sendIpcReboot()
- ToastUtils.showLong("重启命令已发送")
- }
- }
-
- override fun cancel() {
- //取消重启
- CallerLogger.d("$M_HMI$TAG", "reboot cancel")
- }
-
- })
- }
- dockerRebootDialog?.showUpgradeDialog()
+ showRebootDialog()
+ }
+ tvCheckReboot.setOnClickListener {
+ showRebootDialog()
+ }
+ CallerDevaToolsManager.getPowerOffStatus()?.let {
+ powerOffStatus = it
+ }
+ when(powerOffStatus){
+ //准备停服
+ 0->{
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down
+ )
+ )
+ viewCheckShutDown.isClickable = true
+ }
+ //停服命令下发中
+ 1->{
+ isExecutingPowerOff = true
+ }
+ //停服命令下发成功
+ 2->{
+ viewProgressBackground.visibility = View.VISIBLE
+ viewProgress.visibility = View.VISIBLE
+ tvCountDown.visibility = View.VISIBLE
+ tvCountDownUnit.visibility = View.VISIBLE
+ //开始旋转动画
+ if(progressAnimator == null){
+ progressAnimator = ObjectAnimator.ofFloat(viewProgress,"rotation", 0f, 360f)
+ }
+ progressAnimator?.interpolator = LinearInterpolator()
+ progressAnimator?.repeatCount = ValueAnimator.INFINITE //无限循环
+ progressAnimator?.duration = 6000 //设置持续时间
+ progressAnimator?.startDelay = 0
+ progressAnimator?.start()
+ //一键停服倒计时中
+ isPowerOffCountDown = true
+ }
+ //停服命令下发失败
+ 3->{
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_fail
+ )
+ )
+ }
+ //停服命令下发超时
+ 4->{
+ //将图标改为失败
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_fail
+ )
+ )
+ }
+ //停服中
+ 5->{
+ isPowerOffCountDown = true
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_background
+ )
+ )
+ viewProgressBackground.visibility = View.VISIBLE
+ viewProgress.visibility = View.VISIBLE
+ tvCountDown.visibility = View.VISIBLE
+ tvCountDownUnit.visibility = View.VISIBLE
+ //开始旋转动画
+ if(progressAnimator == null){
+ progressAnimator = ObjectAnimator.ofFloat(viewProgress,"rotation", 0f, 360f)
+ }
+ progressAnimator?.interpolator = LinearInterpolator()
+ progressAnimator?.repeatCount = ValueAnimator.INFINITE //无限循环
+ progressAnimator?.duration = 6000 //设置持续时间
+ progressAnimator?.startDelay = 0
+ progressAnimator?.start()
+ }
+ //停服成功
+ 6->{
+ //停止一键停服进度属性动画
+ progressAnimator?.cancel()
+ //隐藏一键停服进度视图
+ viewProgressBackground.visibility = View.GONE
+ viewProgress.visibility = View.GONE
+ tvCountDown.visibility = View.GONE
+ tvCountDownUnit.visibility = View.GONE
+ //一键停服命令倒计时结束,变为成功状态,并且发送1s倒计时
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_success
+ )
+ )
+ isPowerOffCountDown = false
+ }
+ //停服成功不可点击
+ 7->{
+ //将倒计时内容隐藏
+ viewProgressBackground.visibility = View.GONE
+ viewProgress.visibility = View.GONE
+ tvCountDown.visibility = View.GONE
+ tvCountDownUnit.visibility = View.GONE
+ //停服成功,将按钮置为不可点击状态
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_complete
+ )
+ )
+ viewCheckShutDown.isClickable = false
+ isPowerOffCountDown = false
+ }
}
}
- fun setAdUpgradeStatus(downloadStatus: String, upgradeStatus: String) {
- this.downloadStatus = downloadStatus
- this.upgradeStatus = upgradeStatus
+ /**
+ * 一键停服
+ */
+ private fun powerOff() {
+ if (!connectStatus) {
+ ToastUtils.showShort("尚未连接工控机,无法下发一键停服命令")
+ return
+ }
+ if (isExecutingPowerOff) {
+ //一键停服命令下发执行中
+ ToastUtils.showShort("一键停服命令下发中,请勿重复点击")
+ return
+ }
+ if (isPowerOffCountDown) {
+ //系统停服中
+ ToastUtils.showShort("系统停服中,请勿重复点击")
+ return
+ }
+ //将是否正在下发一键停服命令标签改为true
+ isExecutingPowerOff = true
+ CallerDevaToolsManager.setPowerOffStatus(1)
+ //系统命令请求 关机
+ powerOffMsgId = CallerAutoPilotControlManager.sendIpcPowerOff()
+ //开始执行10秒等待倒计时
+ CallerDevaToolsManager.startCommandWaitCountDown()
}
- private fun showSystemOperationWindow(view: View) {
- WarningFloat.with(context).setGravity(Gravity.CENTER).setLayout(view)
- .setImmersionStatusBar(true).show()
+ /**
+ * 展示系统重启确认窗
+ */
+ private fun showRebootDialog() {
+ if (!connectStatus) {
+ ToastUtils.showShort("尚未连接工控机,无法重启系统")
+ return
+ }
+ //dialog
+ if (dockerRebootDialog == null) {
+ dockerRebootDialog = DockerRebootDialog(context)
+ dockerRebootDialog?.setClickListener(object : DockerRebootDialog.ClickListener {
+ override fun confirm() {
+ if (CallerAutoPilotStatusListenerManager.getState() == 2) {
+ //当前处于自动驾驶状态,不可进行重启,Toast提示
+ ToastUtils.showShort("请先退出自动驾驶状态")
+ } else {
+ //确认重启
+ CallerLogger.d("$M_HMI$TAG", "reboot confirm")
+ CallerAutoPilotControlManager.sendIpcReboot()
+ ToastUtils.showLong("重启命令已发送")
+ }
+ }
+
+ override fun cancel() {
+ //取消重启
+ CallerLogger.d("$M_HMI$TAG", "reboot cancel")
+ }
+
+ })
+ }
+ dockerRebootDialog?.showUpgradeDialog()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
+ CallerPowerOffManager.addListener(TAG, this)
+ CallerReceiveReceivedAckListenerManager.addListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerAutoPilotStatusListenerManager.removeListener(TAG)
+ CallerPowerOffManager.removeListener(TAG)
+ CallerReceiveReceivedAckListenerManager.removeListener(TAG)
}
- override fun onAutopilotIpcConnectStatusChanged(status: AdasConstants.IpcConnectionStatus, reason: String?) {
+ override fun onAutopilotIpcConnectStatusChanged(
+ status: AdasConstants.IpcConnectionStatus,
+ reason: String?
+ ) {
super.onAutopilotIpcConnectStatusChanged(status, reason)
ThreadUtils.runOnUiThread {
- setViewStatus(status == AdasConstants.IpcConnectionStatus.CONNECTED)
+ setViewStatus(status == AdasConstants.IpcConnectionStatus.CONNECTED)
}
}
- private fun setViewStatus(connectInfo:Boolean) {
- if (connectInfo) {
- viewCheckShutDown.requestFocus()
+ private fun setViewStatus(connectInfo: Boolean) {
+ connectStatus = connectInfo
+ //下发一键停服命令后又和域控重新连接
+ if((powerOffStatus == 6 || powerOffStatus == 7) && connectStatus){
+ CallerDevaToolsManager.setPowerOffStatus(0)
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down
+ )
+ )
viewCheckShutDown.isClickable = true
- viewCheckReboot.requestFocus()
- viewCheckReboot.isClickable = true
- } else {
+ }
+ }
+
+ /**
+ * 一键停服调用SSM停服命令超时
+ */
+ override fun commandTimeout() {
+ //停止命令超时倒计时
+ CallerDevaToolsManager.stopCommandWaitCountDown()
+ /**
+ * 如果点击一键停服按钮10秒后,是否正在执行命令的标签仍为true,代表域控未返回执行结果
+ * 此时应该将按钮状态短暂置为失败,之后再置为常态,并将此标签置为false
+ */
+ if (isExecutingPowerOff) {
+ //更改标签状态
+ isExecutingPowerOff = false
+ CallerDevaToolsManager.setPowerOffStatus(4)
+ //将图标改为失败
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_fail
+ )
+ )
+ //执行1秒倒计时命令
+ CallerDevaToolsManager.statusChangeCountDown(false)
+ }
+ }
+
+ /**
+ * 一键停服车辆下电等待倒计时
+ */
+ override fun powerDownTick(second: Int) {
+ tvCountDown.text = second.toString()
+ CallerDevaToolsManager.setPowerOffStatus(5)
+ }
+
+ /**
+ * 一键停服车辆下电等待倒计时结束
+ */
+ override fun powerDownFinish() {
+ CallerDevaToolsManager.setPowerOffStatus(6)
+ //停止一键停服进度属性动画
+ progressAnimator?.cancel()
+ //隐藏一键停服进度视图
+ viewProgressBackground.visibility = View.GONE
+ viewProgress.visibility = View.GONE
+ tvCountDown.visibility = View.GONE
+ tvCountDownUnit.visibility = View.GONE
+ //一键停服命令倒计时结束,变为成功状态,并且发送1s倒计时
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_success
+ )
+ )
+ isPowerOffCountDown = false
+ //执行1秒倒计时命令
+ CallerDevaToolsManager.statusChangeCountDown(true)
+ }
+
+ /**
+ * 一键停服状态按钮变更通知
+ */
+ override fun statusChange(isSuccess: Boolean) {
+ CallerDevaToolsManager.stopStatusCountDown()
+ if (isSuccess) {
+ //将倒计时内容隐藏
+ viewProgressBackground.visibility = View.GONE
+ viewProgress.visibility = View.GONE
+ tvCountDown.visibility = View.GONE
+ tvCountDownUnit.visibility = View.GONE
+ //停服成功,将按钮置为不可点击状态
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_complete
+ )
+ )
viewCheckShutDown.isClickable = false
- viewCheckReboot.isClickable = false
+ CallerDevaToolsManager.setPowerOffStatus(7)
+ } else {
+ //停服命令下发失败,将按钮置为常态,可点击
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down
+ )
+ )
+ viewCheckShutDown.isClickable = true
+ }
+ }
+
+ /**
+ * 命令下发回执
+ */
+ override fun onReceiveReceivedAck(receivedAck: ReceivedAck) {
+ ThreadUtils.runOnUiThread {
+ if (receivedAck.messageType == MessageType.TYPE_SEND_SYSTEM_CMD_REQ && receivedAck.msgId == powerOffMsgId) {
+ isExecutingPowerOff = false
+ //停止命令超时倒计时
+ CallerDevaToolsManager.stopCommandWaitCountDown()
+ if ( receivedAck.status == ReceivedAck.Status.NORMAL) {
+ //一键停服命令回执成功,则正常进入停服阶段中,1分钟倒计时,并且TTS和消息盒子提示
+ CallerDevaToolsManager.setPowerOffStatus(2)
+ AIAssist.getInstance(context).speakTTSVoice("请等待1分钟再执行车辆下电")
+ saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.V2X, V2XMsg(
+ EventTypeEnumNew.TYPE_POWER_OFF_TIP.poiType,
+ EventTypeEnumNew.TYPE_POWER_OFF_TIP.content,
+ EventTypeEnumNew.TYPE_POWER_OFF_TIP.tts
+ )
+ )
+ )
+
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_background
+ )
+ )
+ viewProgressBackground.visibility = View.VISIBLE
+ viewProgress.visibility = View.VISIBLE
+ tvCountDown.visibility = View.VISIBLE
+ tvCountDownUnit.visibility = View.VISIBLE
+ //开始旋转动画
+ if(progressAnimator == null){
+ progressAnimator = ObjectAnimator.ofFloat(viewProgress,"rotation", 0f, 360f)
+ }
+ progressAnimator?.interpolator = LinearInterpolator()
+ progressAnimator?.repeatCount = ValueAnimator.INFINITE //无限循环
+ progressAnimator?.duration = 6000 //设置持续时间
+ progressAnimator?.startDelay = 0
+ progressAnimator?.start()
+ //开始60S倒计时
+ CallerDevaToolsManager.startPowerDownCountDown()
+ //一键停服倒计时中
+ isPowerOffCountDown = true
+ } else {
+ //一键停服命令回执失败,则走失败流程
+ CallerDevaToolsManager.setPowerOffStatus(3)
+ viewCheckShutDown.setImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.icon_shut_down_fail
+ )
+ )
+ //执行1秒倒计时命令
+ CallerDevaToolsManager.statusChangeCountDown(false)
+ }
+ }
+
}
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/check_shut_down.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/check_shut_down.png
deleted file mode 100644
index 2e2017cb27..0000000000
Binary files a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/check_shut_down.png and /dev/null differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down.png
new file mode 100644
index 0000000000..ffea12238b
Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_background.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_background.png
new file mode 100644
index 0000000000..b813f39700
Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_background.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_complete.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_complete.png
new file mode 100644
index 0000000000..20ae14d398
Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_complete.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_fail.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_fail.png
new file mode 100644
index 0000000000..6b778922cc
Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_fail.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_progress.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_progress.png
new file mode 100644
index 0000000000..fa9ca7fbcb
Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_progress.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_progress_background.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_progress_background.png
new file mode 100644
index 0000000000..b2d8f0af9b
Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_progress_background.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_success.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_success.png
new file mode 100644
index 0000000000..3389605387
Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_shut_down_success.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_check_system.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_check_system.xml
index 75bb525735..e5a5d715a5 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_check_system.xml
+++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_check_system.xml
@@ -7,50 +7,96 @@
+ android:contentDescription="@string/check_system_shut_down" />
+
+
+
+
+
+
+
+
+ app:layout_constraintLeft_toLeftOf="@id/viewCheckShutDown"
+ app:layout_constraintRight_toRightOf="@id/viewCheckShutDown"
+ />
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintLeft_toRightOf="@id/viewCheckShutDown"
+ android:contentDescription="@string/check_system_reboot" />
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml
index 226ea8081a..4af209bad3 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml
+++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml
@@ -28,7 +28,7 @@
车速设置
账户信息
系统运行
- 关机
+ 一键停服
重启系统
重启提示
是否重启自动驾驶系统?
diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt
index c029e44e6d..d8b7412870 100644
--- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt
+++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt
@@ -590,6 +590,13 @@ enum class EventTypeEnumNew(
"详情%s"
),
+ TYPE_POWER_OFF_TIP("POWER_OFF_TIP",
+ "一键停服",
+ "请等待1分钟再执行车辆下电",
+ R.drawable.icon_warning_take_over,
+ "请等待1分钟再执行车辆下电",
+ "请等待1分钟再执行车辆下电"),
+
TYPE_VIP_IDENTIFICATION_PASS("20022", "VIP通行", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行,已为您变为绿灯", "VIP车辆优先通行,已为您变为绿灯"),
TYPE_VIP_IDENTIFICATION_EXTEND("20023", "VIP通行", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行,已为您延长绿灯", "VIP车辆优先通行,已为您延长绿灯"),
TYPE_VIP_ERROR_IDENTIFICATION("20024", "VIP通行", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败,稍后重试"),
@@ -947,6 +954,10 @@ enum class EventTypeEnumNew(
TYPE_DEVICE_STATUS_ABNORMAL.poiType ->{
TYPE_DEVICE_STATUS_ABNORMAL.poiTypeStr
}
+ //一键停服
+ TYPE_POWER_OFF_TIP.poiType ->{
+ TYPE_POWER_OFF_TIP.poiTypeStr
+ }
//机动车
TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType ->{
TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiTypeStr
@@ -1266,6 +1277,10 @@ enum class EventTypeEnumNew(
TYPE_DEVICE_STATUS_ABNORMAL.poiType->{
R.drawable.icon_default
}
+ //一键停服
+ TYPE_POWER_OFF_TIP.poiType->{
+ R.drawable.icon_warning_take_over
+ }
//机动车
TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType -> {
R.drawable.icon_warning_v2x_motorcycle_collision
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt
index 16f2b6358d..d211d737bd 100644
--- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt
@@ -128,6 +128,46 @@ interface IDevaToolsProvider : IProvider {
*/
fun showBadCaseManagerView(context: Context)
+ /**
+ * 启动调用SSM停服命令超时检测
+ */
+ fun startCommandWaitCountDown()
+
+ /**
+ * 停止调用SSM停服命令超时检测
+ */
+ fun stopCommandWaitCountDown()
+
+ /**
+ * 开始车辆下电等待倒计时
+ */
+ fun startPowerDownCountDown()
+
+ /**
+ * 结束车辆下电等待倒计时
+ */
+ fun stopPowerDownCountDown()
+
+ /**
+ * 状态按钮变更倒计时
+ */
+ fun statusChangeCountDown(isSuccess: Boolean)
+
+ /**
+ * 结束状态按钮变更倒计时
+ */
+ fun stopStatusCountDown()
+
+ /**
+ * 设置停服状态
+ */
+ fun setPowerOffStatus(status: Int)
+
+ /**
+ * 获取停服状态
+ */
+ fun getPowerOffStatus(): Int
+
/**
* 工控机异常上报列表
*/
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IPowerOffListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IPowerOffListener.kt
new file mode 100644
index 0000000000..fe1a0fae2c
--- /dev/null
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IPowerOffListener.kt
@@ -0,0 +1,25 @@
+package com.mogo.eagle.core.function.api.devatools
+
+interface IPowerOffListener {
+
+ /**
+ * 调用SSM停服命令超时
+ */
+ fun commandTimeout()
+
+ /**
+ * 车辆下电等待倒计时
+ */
+ fun powerDownTick(second: Int)
+
+ /**
+ * 车辆下电等待倒计时结束
+ */
+ fun powerDownFinish()
+
+ /**
+ * 状态按钮变更通知
+ */
+ fun statusChange(isSuccess: Boolean)
+
+}
\ No newline at end of file
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerReceiveReceivedAckListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerReceiveReceivedAckListenerManager.kt
index 046b8796ac..3c08c650d9 100644
--- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerReceiveReceivedAckListenerManager.kt
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerReceiveReceivedAckListenerManager.kt
@@ -10,9 +10,6 @@ import com.zhjt.mogo.adas.data.bean.ReceivedAck
*/
object CallerReceiveReceivedAckListenerManager : CallerBase() {
- /**
- * 金旅M1
- */
fun invokeReceiveReceivedAck(receivedAck: ReceivedAck) {
M_LISTENERS.forEach {
val listener = it.value
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt
index c5522e6937..b8d30fed0c 100644
--- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt
@@ -170,6 +170,62 @@ object CallerDevaToolsManager {
devaToolsProviderApi?.showBadCaseManagerView(context)
}
+ /**
+ * 启动调用SSM停服命令超时检测
+ */
+ fun startCommandWaitCountDown(){
+ devaToolsProviderApi?.startCommandWaitCountDown()
+ }
+
+ /**
+ * 停止调用SSM停服命令超时检测
+ */
+ fun stopCommandWaitCountDown(){
+ devaToolsProviderApi?.stopCommandWaitCountDown()
+ }
+
+ /**
+ * 开始车辆下电等待倒计时
+ */
+ fun startPowerDownCountDown(){
+ devaToolsProviderApi?.startPowerDownCountDown()
+ }
+
+ /**
+ * 结束车辆下电等待倒计时
+ */
+ fun stopPowerDownCountDown(){
+ devaToolsProviderApi?.stopPowerDownCountDown()
+ }
+
+ /**
+ * 状态按钮变更倒计时
+ */
+ fun statusChangeCountDown(isSuccess: Boolean){
+ devaToolsProviderApi?.statusChangeCountDown(isSuccess)
+ }
+
+ /**
+ * 结束状态按钮变更倒计时
+ */
+ fun stopStatusCountDown(){
+ devaToolsProviderApi?.stopStatusCountDown()
+ }
+
+ /**
+ * 设置停服状态
+ */
+ fun setPowerOffStatus(status: Int){
+ devaToolsProviderApi?.setPowerOffStatus(status)
+ }
+
+ /**
+ * 获取停服状态
+ */
+ fun getPowerOffStatus(): Int? {
+ return devaToolsProviderApi?.getPowerOffStatus()
+ }
+
/**
* 工控机异常上报列表
*/
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerPowerOffManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerPowerOffManager.kt
new file mode 100644
index 0000000000..7551fcfe1b
--- /dev/null
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerPowerOffManager.kt
@@ -0,0 +1,48 @@
+package com.mogo.eagle.core.function.call.devatools
+
+import com.mogo.eagle.core.function.api.devatools.IPowerOffListener
+import com.mogo.eagle.core.function.call.base.CallerBase
+
+object CallerPowerOffManager : CallerBase() {
+
+ /**
+ * 一键停服调用SSM停服命令超时
+ */
+ fun invokeCommandTimeout(){
+ M_LISTENERS.forEach{
+ val listener = it.value
+ listener.commandTimeout()
+ }
+ }
+
+ /**
+ * 一键停服车辆下电等待倒计时
+ */
+ fun invokePowerDownTick(second: Int){
+ M_LISTENERS.forEach{
+ val listener = it.value
+ listener.powerDownTick(second)
+ }
+ }
+
+ /**
+ * 一键停服车辆下电等待倒计时结束
+ */
+ fun invokePowerDownFinish(){
+ M_LISTENERS.forEach{
+ val listener = it.value
+ listener.powerDownFinish()
+ }
+ }
+
+ /**
+ * 一键停服状态按钮变更通知
+ */
+ fun invokeStatusChange(isSuccess: Boolean){
+ M_LISTENERS.forEach{
+ val listener = it.value
+ listener.statusChange(isSuccess)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java
index 65d5a3b263..100b438df3 100644
--- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java
+++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java
@@ -125,19 +125,7 @@ public class ReceivedAck {
this.receivedAck = receivedAck;
}
- /**
- * 确认是否收到回执
- *
- * @param msgId 下发的消息id
- * @return 是否收到回执
- */
- public boolean isReceiptReceived(long msgId) {
- Log.i("ReceivedAck", "消息=" + msgId + " 结果=" + toString());
- if (status == Status.NORMAL) {
- return this.msgId == msgId;
- }
- return false;
- }
+
@Override
public String toString() {