diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt index 8810dfa68a..70f3b38975 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt @@ -214,10 +214,8 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight DataSourceType.TELEMATIC_UNION_V2N ) //当前灯态倒计时小于5S时,展示额外的提示框 - if(light.duration < 5){ - onTrafficLightPrompt(convert(light.state),light.duration,convert(light.nextState),light.nextDuration, - convert(light.nextTwoState),light.nextTwoDuration) - } + onTrafficLightPrompt(convert(light.state),light.duration,convert(light.nextState),light.nextDuration, + convert(light.nextTwoState),light.nextTwoDuration) /** * 司机端提示: * 车辆等红灯,在红/黄灯剩余5s且下一灯态为绿灯时,提示“红灯即将变绿”;并在变为绿灯时有提示起步的动效 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/TrafficLightPromptView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/TrafficLightPromptView.kt index cfb13d0718..4b789479d8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/TrafficLightPromptView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/traffic/TrafficLightPromptView.kt @@ -17,7 +17,6 @@ import com.mogo.eagle.core.function.hmi.ui.widget.TypefaceTextView import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import java.util.concurrent.TimeUnit /** * 融合红绿灯变灯提示 @@ -38,8 +37,12 @@ class TrafficLightPromptView @JvmOverloads constructor( private var tvPromptContent: TextView ?= null private var tvTrafficNum: TypefaceTextView ?= null private var tvTrafficNumDecimal: TypefaceTextView ?= null - private val LIGHT_CHECK = 6501 - private var startTime: Long = 0L + private val LIGHT_UPDATE = 6501 + private val LIGHT_HIDE = 6502 + private val LIGHT_INTERRUPT = 6503 + private var currentLightState = TrafficLightEnum.BLACK //当前灯态 + private var currentLightDuration = 0f //当前灯态倒计时 + init { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TrafficLightPromptView) @@ -53,26 +56,34 @@ class TrafficLightPromptView @JvmOverloads constructor( override fun handleMessage(msg: Message) { super.handleMessage(msg) when(msg.what){ - LIGHT_CHECK->{ - if(startTime == 0L){ - sendEmptyMessageDelayed(LIGHT_CHECK, 500L) - return - } - val endTime = System.nanoTime() - val internal = TimeUnit.NANOSECONDS.toMillis(endTime - startTime) - if(internal > 400){ - UiThreadHandler.post { + LIGHT_UPDATE->{ + ThreadUtils.runOnUiThread{ + if(currentLightDuration >= 0.1f){ + //每次收到数据减少0.1秒 + currentLightDuration -= 0.1f + tvTrafficNum?.text = "${currentLightDuration.toInt()}." + tvTrafficNumDecimal?.text = (currentLightDuration*100 - currentLightDuration.toInt()*100).toInt().toString() + sendEmptyMessageDelayed(LIGHT_UPDATE, 100L) + }else{ + //将数据置为0展示,且发送隐藏窗口命令 tvTrafficNum?.text = "0." tvTrafficNumDecimal?.text = "00" + sendEmptyMessageDelayed(LIGHT_HIDE, 100L) } } - if(internal>900){ - UiThreadHandler.post{ - this@TrafficLightPromptView.visibility = GONE - } - return + } + LIGHT_HIDE->{ + hideCurrentView() + } + LIGHT_INTERRUPT->{ + if(msg.obj == currentLightDuration){ + sendEmptyMessageDelayed(LIGHT_UPDATE, 100L) + }else{ + val msgInterrupt= Message() + msgInterrupt.what = LIGHT_INTERRUPT + msgInterrupt.obj = currentLightDuration + sendMessageDelayed(msgInterrupt,200) } - sendEmptyMessageDelayed(LIGHT_CHECK, 500L) } } } @@ -97,10 +108,11 @@ class TrafficLightPromptView @JvmOverloads constructor( CallerTrafficLightListenerManager.removeListener(TAG) } - override fun disableTrafficLight() { - super.disableTrafficLight() - UiThreadHandler.post{ - this@TrafficLightPromptView.visibility = GONE + private fun hideCurrentView(){ + ThreadUtils.runOnUiThread{ + if(this@TrafficLightPromptView.visibility == View.VISIBLE){ + this@TrafficLightPromptView.visibility = GONE + } } } @@ -114,12 +126,39 @@ class TrafficLightPromptView @JvmOverloads constructor( nextState: TrafficLightEnum, nextDuration: Float, nextTwoState: TrafficLightEnum, nextTwoDuration: Float) { super.onShowTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) + if(currentDuration < 5){ + //当前灯态倒计时时间小于5秒,展示提示窗 + updateTrafficLight(currentState, currentDuration,nextState) + if(currentLightState != currentState){ + currentLightState = currentState + } + currentLightDuration = currentDuration + }else { + //当前灯态大于等于5秒,且灯态发生变化,此时应该将倒计时渐变为0,之后关闭提示窗 + if(currentState != currentLightState){ + ThreadUtils.runOnUiThread{ + mLightHandler.sendEmptyMessage(LIGHT_UPDATE) + } + currentLightState = currentState + }else{ + hideCurrentView() + } + } + } + + /** + * 更新当前红绿灯提示框信息 + */ + private fun updateTrafficLight(currentState: TrafficLightEnum, currentDuration: Float, nextState: TrafficLightEnum){ ThreadUtils.runOnUiThread { when(currentState){ TrafficLightEnum.GREEN->{ if(this@TrafficLightPromptView.visibility == View.GONE){ - mLightHandler.sendEmptyMessageDelayed(LIGHT_CHECK, 500L) this@TrafficLightPromptView.visibility = View.VISIBLE + val msg= Message() + msg.what = LIGHT_INTERRUPT + msg.obj = currentDuration + mLightHandler.sendMessageDelayed(msg,200) } if(user == 0){ tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_green)) @@ -131,8 +170,11 @@ class TrafficLightPromptView @JvmOverloads constructor( } TrafficLightEnum.RED->{ if(this@TrafficLightPromptView.visibility == View.GONE){ - mLightHandler.sendEmptyMessageDelayed(LIGHT_CHECK, 500L) this@TrafficLightPromptView.visibility = View.VISIBLE + val msg= Message() + msg.what = LIGHT_INTERRUPT + msg.obj = currentDuration + mLightHandler.sendMessageDelayed(msg,200) } if(user == 0){ tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_red)) @@ -144,8 +186,11 @@ class TrafficLightPromptView @JvmOverloads constructor( } TrafficLightEnum.YELLOW->{ if(this@TrafficLightPromptView.visibility == View.GONE){ - mLightHandler.sendEmptyMessageDelayed(LIGHT_CHECK, 500L) this@TrafficLightPromptView.visibility = View.VISIBLE + val msg= Message() + msg.what = LIGHT_INTERRUPT + msg.obj = currentDuration + mLightHandler.sendMessageDelayed(msg,200) } if(user == 0){ tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_yellow)) @@ -157,9 +202,9 @@ class TrafficLightPromptView @JvmOverloads constructor( } TrafficLightEnum.BLACK->{ this@TrafficLightPromptView.visibility = View.GONE + mLightHandler.removeMessages(LIGHT_INTERRUPT) } } - startTime = System.nanoTime() if(currentDuration>0 && currentDuration<5){ tvTrafficNum?.text = "${currentDuration.toInt()}." tvTrafficNumDecimal?.text = (currentDuration*100 - currentDuration.toInt()*100).toInt().toString()