From fee278b2baa3f0b263848beef37564612758c492 Mon Sep 17 00:00:00 2001 From: renwj Date: Wed, 3 Jul 2024 16:18:14 +0800 Subject: [PATCH 1/6] =?UTF-8?q?[6.5.0][=E9=81=93=E8=B7=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6]=20=E7=BB=BF=E6=B3=A2=E9=80=9A=E8=A1=8CUI=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/greenwave/GreenWaveView.kt | 161 ++++++++++++++++++ .../icon_green_wave_alpha_high.png | Bin 0 -> 4456 bytes .../icon_green_wave_alpha_low.png | Bin 0 -> 5661 bytes .../icon_green_wave_alpha_mid.png | Bin 0 -> 5014 bytes .../res/drawable/bg_green_wave_driver.xml | 6 + .../res/drawable/bg_green_wave_passenger.xml | 8 + .../res/drawable/bg_white_circle_driver.xml | 6 + .../drawable/bg_white_circle_passenger.xml | 9 + .../layout/view_green_wave_driver_layout.xml | 76 +++++++++ .../view_green_wave_passenger_layout.xml | 76 +++++++++ 10 files changed, 342 insertions(+) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_low.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_mid.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_driver.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_driver_layout.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt new file mode 100644 index 0000000000..0744769176 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt @@ -0,0 +1,161 @@ +package com.mogo.eagle.core.function.hmi.ui.greenwave + +import android.content.Context +import android.os.Looper +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.scope +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration +import com.mogo.eagle.core.utilcode.util.SizeUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.launch +import kotlin.math.abs +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.speed as passenger_speed +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.speed as driver_speed +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.wave_rv as passenger_wave_rv +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.wave_rv as driver_wave_rv +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.recommend_speed as passenger_recommend_speed +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.recommend_speed as driver_recommend_speed +import kotlinx.android.synthetic.main.view_green_wave_passenger_layout.view.recommend_cross as passenger_recommend_cross +import kotlinx.android.synthetic.main.view_green_wave_driver_layout.view.recommend_cross as driver_recommend_cross + +class GreenWaveView: LinearLayout, IMoGoChassisLocationGCJ02Listener, RecyclerView.OnItemTouchListener, Runnable { + + companion object { + private const val TAG = "GreenWaveView" + } + + private var lastSpeed: Int = Int.MIN_VALUE + + constructor(context: Context) : this(context, null) + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + LayoutInflater.from(context).inflate(if (isDriver) R.layout.view_green_wave_driver_layout else R.layout.view_green_wave_passenger_layout, this) + background = if (isDriver) ContextCompat.getDrawable(context, R.drawable.bg_green_wave_driver) else ContextCompat.getDrawable(context, R.drawable.bg_green_wave_passenger) + } + + private val isDriver by lazy { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + } + + private class WaveHolder(item: ImageView): RecyclerView.ViewHolder(item) + + private class WaveAdapter: RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WaveHolder { + val item = ImageView(parent.context) + item.layoutParams = RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT) + return WaveHolder(item) + } + + override fun getItemCount(): Int { + return 5000 + } + + override fun onBindViewHolder(holder: WaveHolder, position: Int) { + val item = holder.itemView as? ImageView ?: return + val reminder = position % 3 + when(reminder) { + 0 -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_low) + } + 1 -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_mid) + } + else -> { + item.background = ContextCompat.getDrawable(item.context, R.drawable.icon_green_wave_alpha_high) + } + } + } + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 5, this) + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.addItemDecoration(CommonDividerItemDecoration.Builder() + .spanCountTBCare(false) + .horizontalInnerSpace(SizeUtils.dp2px(10f)) + .build()) + rv?.addOnItemTouchListener(this) + rv?.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, true) + rv?.adapter = WaveAdapter() + startAutoScroll() + } + + private fun startAutoScroll() { + removeCallbacks(this) + post(this) + } + + private fun stopAutoScroll() { + removeCallbacks(this) + } + + override fun run() { + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.scrollBy(-3, 0) + postDelayed(this, 20) + } + + override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { + return true + } + + override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) { } + + override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) { } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + val rv: RecyclerView? = if (isDriver) driver_wave_rv else passenger_wave_rv + rv?.removeOnItemTouchListener(this) + stopAutoScroll() + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + var isChanged = false + val speed = (abs(mogoLocation?.gnssSpeed ?: 0f) * 3.6f).toInt() + if (lastSpeed != speed) { + isChanged = true + lastSpeed = speed + } + if (isChanged) { + UiThreadHandler.post { + if (isDriver) { + driver_speed?.text = speed.toString() + } else { + passenger_speed?.text = speed.toString() + } + } + } + } + + fun bind(minSpeed: Int, maxSpeed: Int, cross: Int) { + scope.launch { + if (isDriver) { + driver_recommend_speed?.text = "建议车速${minSpeed}-${maxSpeed}km/h" + driver_recommend_cross?.text = "可丝滑通过${cross}个路口" + } else { + passenger_recommend_speed?.text = "建议车速${minSpeed}-${maxSpeed}km/h" + passenger_recommend_cross?.text = "可丝滑通过${cross}个路口" + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_wave_alpha_high.png new file mode 100644 index 0000000000000000000000000000000000000000..01d57b1544d8889a41f468a80dd530a39f2f5012 GIT binary patch literal 4456 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 + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml new file mode 100644 index 0000000000..3bea23da6e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_green_wave_passenger.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml new file mode 100644 index 0000000000..8b6f3a410f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_driver.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml new file mode 100644 index 0000000000..84d954e2d9 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_white_circle_passenger.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_driver_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_driver_layout.xml new file mode 100644 index 0000000000..e1a921c747 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_driver_layout.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml new file mode 100644 index 0000000000..c4d12ad34f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_green_wave_passenger_layout.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2a7bc4066791e5187ecdfb682b696cff7bc125ac Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 3 Jul 2024 18:12:01 +0800 Subject: [PATCH 2/6] =?UTF-8?q?[6.5.0]=E7=BA=A2=E7=BB=BF=E7=81=AF=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datacenter/v2x/TrafficLightDispatcher.kt | 44 ++-- .../exploration/AutomaticExplorationView.kt | 13 ++ .../notice/traffic/TrafficLightPromptView.kt | 68 ++++-- .../hmi/ui/widget/FusionTrafficLightView.kt | 207 ++++++++++-------- .../hmi/ui/widget/ItinerarySummaryDialog.kt | 8 + .../layout/hmi_view_fusion_traffic_light.xml | 4 +- .../res/layout/view_traffic_light_prompt.xml | 4 - .../layout/view_traffic_light_prompt_p.xml | 3 - .../data/autopilot/AutopilotSummaryInfo.kt | 7 + .../union/IMoGoTrafficLightListener.kt | 8 +- .../v2x/CallerTrafficLightListenerManager.kt | 6 +- 11 files changed, 234 insertions(+), 138 deletions(-) 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 faeca9e548..e33751bd52 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 @@ -105,6 +105,12 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight "${SceneConstant.M_D_C}${TAG}", "onAutopilotPerceptionTrafficLight ---- hasObuLightStatus = $hasObuLightStatus ----hasAiLightStatus = $hasAiLightStatus , trafficLights : ${trafficLights?:"null"}" ) + Log.i(TAG,"source="+trafficLights?.source) + if(trafficLights?.source == 2){ + hasObuLightStatus = false + hasAiLightStatus = false + hasFusionLightStatus = true + } if (!hasObuLightStatus) { if (!hasAiLightStatus) { trafficLights?.let { @@ -130,6 +136,7 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight if (!hasAutopilotPerception) { hasAutopilotPerception = true } + if(light.nextState == null || light.nextState == FusionTrafficLightOuterClass.FusionLightState.STATE_OFF_FUSION || light.nextTwoState == null || light.nextTwoState == FusionTrafficLightOuterClass.FusionLightState.STATE_OFF_FUSION){ if (HmiBuildConfig.isShowCarSourceTrafficLightView) { @@ -147,17 +154,25 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight onTrafficLightPlusSource(convert(light.state), 0, DataSourceType.TELEMATIC) } }else{ - //有下一和下二灯态,则为融合V2N红绿灯数据 - onFusionTrafficLight(convert(light.state),light.duration.toInt(), - convert(light.nextState),light.nextDuration.toInt(), - convert(light.nextTwoState),light.nextTwoDuration.toInt(), - DataSourceType.TELEMATIC_UNION_V2N - ) - //当前灯态倒计时小于5S时,展示额外的提示框 - if(light.duration < 5){ - onTrafficLightPrompt(convert(light.state),light.duration.toInt()) + Log.i(TAG,"current state="+light.state+" current duration="+light.duration+ + " nextState="+light.nextState+" nextDuration="+light.nextDuration+ + " nextTwoState="+light.nextTwoState+" nextTwoDuration="+light.nextTwoDuration) + if(convert(light.state) == TrafficLightEnum.BLACK){ + //隐藏当前红绿灯以及额外提示框 + CallerTrafficLightListenerManager.disableTrafficLight() + }else{ + //有下一和下二灯态,则为融合V2N红绿灯数据 + onFusionTrafficLight(convert(light.state),light.duration.toInt(), + convert(light.nextState),light.nextDuration.toInt(), + convert(light.nextTwoState),light.nextTwoDuration.toInt(), + 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) + } } - //TODO 提示框的消失逻辑 } } } @@ -277,10 +292,11 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight linkCode = ChainConstant.CHAIN_SOURCE_ADAS, nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_TRAFFIC_LIGHT, paramIndexes = [0, 1]) - override fun onTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Int) { - super.onTrafficLightPrompt(currentState, currentDuration) - Log.i("xuxinchao","融合V2N红绿灯额外提示框提醒 Dis") - CallerTrafficLightListenerManager.onShowTrafficLightPrompt(currentState, currentDuration) + override fun onTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float) { + super.onTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) + CallerTrafficLightListenerManager.onShowTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt index 3ee10b2cda..bba7a7f340 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/exploration/AutomaticExplorationView.kt @@ -11,6 +11,7 @@ import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.autopilot.AutopilotSummaryInfo import com.mogo.eagle.core.data.notice.AutoExplorationEntity import com.mogo.eagle.core.function.hmi.R @@ -86,6 +87,18 @@ class AutomaticExplorationView @JvmOverloads constructor( dataList.add(AutoExplorationEntity("前方路口行人/非机动车分析",6000L)) dataList.add(AutoExplorationEntity("路侧视频分析",8000L)) automaticExplorationAdapter?.setData(dataList) + + //每出现一次自动探查,增加相应的服务次数 + //车辆服务次数 + AutopilotSummaryInfo.vehicleServiceNum += 31 + //道路信息提醒次数 + AutopilotSummaryInfo.infoTipNum += 9 + //车辆行为提醒次数 + AutopilotSummaryInfo.vehicleTipNum += 13 + //弱势参与者提醒次数 + AutopilotSummaryInfo.vulnerableTipNum += 4 + //消除安全风险隐患次数 + AutopilotSummaryInfo.dangerNum += 24 } override fun onDetachedFromWindow() { 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 11d1277f4c..2e9696dc27 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 @@ -13,6 +13,7 @@ import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.widget.TypefaceTextView import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler /** * 融合红绿灯变灯提示 @@ -33,7 +34,6 @@ class TrafficLightPromptView @JvmOverloads constructor( private var tvPromptContent: TextView ?= null private var tvTrafficNum: TypefaceTextView ?= null private var tvTrafficNumDecimal: TypefaceTextView ?= null - private val randomList = ArrayList() init { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TrafficLightPromptView) @@ -53,16 +53,6 @@ class TrafficLightPromptView @JvmOverloads constructor( tvTrafficNum = findViewById(R.id.tvTrafficNum) tvTrafficNumDecimal = findViewById(R.id.tvTrafficNumDecimal) CallerTrafficLightListenerManager.addListener(TAG, this) - - randomList.add(0.99f) - randomList.add(0.72f) - randomList.add(0.44f) - randomList.add(0.21f) - randomList.add(0.06f) - -// tvPromptContent?.text = "请准备出发" -// tvTrafficNum?.text = "12" -// tvTrafficNumDecimal?.text = ".56" } override fun onDetachedFromWindow() { @@ -70,6 +60,12 @@ class TrafficLightPromptView @JvmOverloads constructor( CallerTrafficLightListenerManager.removeListener(TAG) } + override fun disableTrafficLight() { + super.disableTrafficLight() + UiThreadHandler.post{ + this@TrafficLightPromptView.visibility = GONE + } + } /** @@ -77,8 +73,10 @@ class TrafficLightPromptView @JvmOverloads constructor( * @param currentState 当前灯态 * @param currentDuration 当前灯态倒计时 */ - override fun onShowTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Int) { - super.onShowTrafficLightPrompt(currentState, currentDuration) + override fun onShowTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float) { + super.onShowTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) ThreadUtils.runOnUiThread { when(currentState){ TrafficLightEnum.GREEN->{ @@ -115,7 +113,49 @@ class TrafficLightPromptView @JvmOverloads constructor( this@TrafficLightPromptView.visibility = View.GONE } } - tvTrafficNum?.text = currentDuration.toString() + if(currentDuration>0 && currentDuration<5){ + tvTrafficNum?.text = "${currentDuration.toInt()}." + tvTrafficNumDecimal?.text = (currentDuration*100 - currentDuration.toInt()*100).toInt().toString() + }else{ + tvTrafficNum?.text = "0." + tvTrafficNumDecimal?.text = "0" + this@TrafficLightPromptView.visibility = View.GONE + } + when(nextState){ + TrafficLightEnum.GREEN->{ + if(user == 0){ + //司机端提示 + tvPromptTitle?.text = "即将绿灯" + tvPromptContent?.text = "请准备出发" + }else{ + //乘客端提示 + tvPromptContent?.text = "即将绿灯,请准备出发" + } + } + TrafficLightEnum.RED->{ + if(user == 0){ + //司机端提示 + tvPromptTitle?.text = "即将红灯" + tvPromptContent?.text = "请减速慢行" + }else{ + //乘客端提示 + tvPromptContent?.text = "即将红灯,请减速慢行" + } + } + TrafficLightEnum.YELLOW->{ + if(user == 0){ + //司机端提示 + tvPromptTitle?.text = "即将黄灯" + tvPromptContent?.text = "请减速慢行" + }else{ + //乘客端提示 + tvPromptContent?.text = "即将红灯,请减速慢行" + } + } + TrafficLightEnum.BLACK->{ + this@TrafficLightPromptView.visibility = View.GONE + } + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt index 08dc7f67c6..5eeae227da 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt @@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.hmi.ui.widget import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout @@ -12,6 +11,7 @@ import com.mogo.eagle.core.data.enums.TrafficLightEnum import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightBg import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightNum @@ -19,6 +19,7 @@ import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionT import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightProportion import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightScale import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightState +import java.util.LinkedList /** * 融合红绿灯View @@ -69,7 +70,6 @@ class FusionTrafficLightView @JvmOverloads constructor( */ override fun disableTrafficLight() { super.disableTrafficLight() - Log.i("xuxinchao","disableTrafficLight 关闭红绿灯预警展示") UiThreadHandler.post{ mCurrentLightId = TrafficLightEnum.BLACK this@FusionTrafficLightView.visibility = GONE @@ -94,116 +94,129 @@ class FusionTrafficLightView @JvmOverloads constructor( ) { super.showFusionTrafficLight(currentState, currentDuration, nextState, nextDuration, nextTwoState, nextTwoDuration, lightSource) - //如果当前红绿灯视图为隐藏状态则设置为显示状态 - if(this@FusionTrafficLightView.visibility == View.GONE){ - this@FusionTrafficLightView.visibility = View.VISIBLE - //首次展示,需要将当前、下一、下二灯态的时间占比绘制出来,只绘制一次 - val proportionList = ArrayList() - //按照绿、黄、红的顺序将灯态时间添加到数组 - when (currentState) { + ThreadUtils.runOnUiThread { + //如果当前红绿灯视图为隐藏状态则设置为显示状态 + if(this@FusionTrafficLightView.visibility == View.GONE){ + this@FusionTrafficLightView.visibility = View.VISIBLE + //首次展示,需要将当前、下一、下二灯态的时间占比绘制出来,只绘制一次 + val proportionList = ArrayList(3) + proportionList.add(0) + proportionList.add(0) + proportionList.add(0) + //按照绿、黄、红的顺序将灯态时间添加到数组 + when (currentState) { + TrafficLightEnum.GREEN -> { + proportionList.add(0,currentDuration) + maxGreenDuration = currentDuration + } + TrafficLightEnum.YELLOW -> { + proportionList.add(1,currentDuration) + if(currentDuration < 3){ + maxYellowDuration = 3 + }else{ + maxYellowDuration = currentDuration + } + } + else -> { + proportionList.add(2,currentDuration) + maxRedDuration = currentDuration + } + } + when(nextState){ + TrafficLightEnum.GREEN -> { + proportionList.add(0,nextDuration) + maxGreenDuration = nextDuration + } + TrafficLightEnum.YELLOW -> { + proportionList.add(1,nextDuration) + if(nextDuration<3){ + maxYellowDuration = 3 + }else{ + maxYellowDuration = nextDuration + } + } + else -> { + proportionList.add(2,nextDuration) + maxRedDuration = nextDuration + } + } + when(nextTwoState){ + TrafficLightEnum.GREEN -> { + proportionList.add(0,nextTwoDuration) + maxGreenDuration = nextTwoDuration + } + TrafficLightEnum.YELLOW -> { + proportionList.add(1,nextTwoDuration) + if(nextTwoDuration<3){ + maxYellowDuration = 3 + }else{ + maxYellowDuration = nextTwoDuration + } + } + else -> { + proportionList.add(2,nextTwoDuration) + maxRedDuration = nextTwoDuration + } + } + fusionTrafficLightProportion.updateProportion(proportionList) + totalDuration = maxGreenDuration + maxYellowDuration + maxRedDuration + } + //根据当前灯态设置转盘、刻度、指针背景 + when(currentState){ TrafficLightEnum.GREEN -> { - proportionList.add(0,currentDuration) - maxGreenDuration = currentDuration + fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green)) + fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale)) + fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer)) } TrafficLightEnum.YELLOW -> { - proportionList.add(1,currentDuration) - maxYellowDuration = currentDuration + fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow)) + fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale)) + fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer)) } else -> { - proportionList.add(2,currentDuration) - maxRedDuration = currentDuration + fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red)) + fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale)) + fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer)) } } - when(nextState){ + //更新当前灯态倒计时时间 + if(currentDuration>0){ + fusionTrafficLightNum.text = currentDuration.toString() + }else{ + fusionTrafficLightNum.text = "0" + } + //当时间为1开头时时间视觉上看不是左右居中对齐,需要做便宜操作 + if(currentDuration.toString().startsWith("1")){ + val numLayoutParams = fusionTrafficLightNum.layoutParams as LayoutParams + numLayoutParams.rightMargin = 10 + fusionTrafficLightNum.layoutParams = numLayoutParams + }else{ + val numLayoutParams = fusionTrafficLightNum.layoutParams as LayoutParams + numLayoutParams.rightMargin = 0 + fusionTrafficLightNum.layoutParams = numLayoutParams + } + + //更新指针指向 + val pointerLayoutParams = fusionTrafficLightPointer.layoutParams as LayoutParams + var currentAngle = 0f + currentAngle = when (currentState) { TrafficLightEnum.GREEN -> { - proportionList.add(0,nextDuration) - maxGreenDuration = nextDuration + 360f*(maxGreenDuration-currentDuration)/totalDuration } + TrafficLightEnum.YELLOW -> { - proportionList.add(1,nextDuration) - maxYellowDuration = nextDuration + 360f*(maxGreenDuration+maxYellowDuration-currentDuration)/totalDuration } + else -> { - proportionList.add(2,nextDuration) - maxRedDuration = nextDuration + 360f*(maxGreenDuration+maxYellowDuration+maxRedDuration-currentDuration)/totalDuration } } - when(nextTwoState){ - TrafficLightEnum.GREEN -> { - proportionList.add(0,nextTwoDuration) - maxGreenDuration = nextTwoDuration - } - TrafficLightEnum.YELLOW -> { - proportionList.add(1,nextTwoDuration) - maxYellowDuration = nextTwoDuration - } - else -> { - proportionList.add(2,nextTwoDuration) - maxRedDuration = nextTwoDuration - } - } - fusionTrafficLightProportion.updateProportion(proportionList) - totalDuration = maxGreenDuration + maxYellowDuration + maxRedDuration - Log.i("xuxinchao","totalDuration="+totalDuration) - Log.i("xuxinchao","maxGreenDuration="+maxGreenDuration) - Log.i("xuxinchao","maxYellowDuration="+maxYellowDuration) - Log.i("xuxinchao","maxRedDuration="+maxRedDuration) - } - //根据当前灯态设置转盘、刻度、指针背景 - when(currentState){ - TrafficLightEnum.GREEN -> { - fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green)) - fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale)) - fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer)) - } - TrafficLightEnum.YELLOW -> { - fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow)) - fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale)) - fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer)) - } - else -> { - fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red)) - fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale)) - fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer)) - } - } - //更新当前灯态倒计时时间 - if(currentDuration>0){ - fusionTrafficLightNum.text = currentDuration.toString() - }else{ - fusionTrafficLightNum.text = "0" - } - //当时间为1开头时时间视觉上看不是左右居中对齐,需要做便宜操作 - if(currentDuration.toString().startsWith("1")){ - val numLayoutParams = fusionTrafficLightNum.layoutParams as LayoutParams - numLayoutParams.rightMargin = 10 - fusionTrafficLightNum.layoutParams = numLayoutParams - }else{ - val numLayoutParams = fusionTrafficLightNum.layoutParams as LayoutParams - numLayoutParams.rightMargin = 0 - fusionTrafficLightNum.layoutParams = numLayoutParams + pointerLayoutParams.circleAngle = currentAngle + fusionTrafficLightPointer.rotation = currentAngle + fusionTrafficLightPointer.layoutParams = pointerLayoutParams } - //更新指针指向 - val pointerLayoutParams = fusionTrafficLightPointer.layoutParams as LayoutParams - var currentAngle = 0f - currentAngle = when (currentState) { - TrafficLightEnum.GREEN -> { - 360f*(maxGreenDuration-currentDuration)/totalDuration - } - - TrafficLightEnum.YELLOW -> { - 360f*(maxGreenDuration+maxYellowDuration-currentDuration)/totalDuration - } - - else -> { - 360f*(maxGreenDuration+maxYellowDuration+maxRedDuration-currentDuration)/totalDuration - } - } - pointerLayoutParams.circleAngle = currentAngle - fusionTrafficLightPointer.rotation = currentAngle - fusionTrafficLightPointer.layoutParams = pointerLayoutParams - - } +} } \ 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/ItinerarySummaryDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ItinerarySummaryDialog.kt index 35f66a7159..ebade2c614 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ItinerarySummaryDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ItinerarySummaryDialog.kt @@ -56,6 +56,14 @@ class ItinerarySummaryDialog(context: Context, isDriver: Boolean, theme: Int) : //关闭Dialog按钮 ivSummaryClose = findViewById(R.id.ivSummaryClose) ivSummaryClose?.setOnClickListener { + //对本次服务记录清零 + AutopilotSummaryInfo.intersectionServicesNum = 0 + AutopilotSummaryInfo.lightServicesNum = 0 + AutopilotSummaryInfo.infoTipNum = 0 + AutopilotSummaryInfo.vehicleTipNum = 0 + AutopilotSummaryInfo.vulnerableTipNum = 0 + AutopilotSummaryInfo.dangerNum = 0 + //关闭弹窗 dismiss() } //小智总结 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml index 170c3e95e1..899b894680 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml @@ -3,8 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fusionTrafficLightBg" - android:layout_width="@dimen/dp_250" - android:layout_height="@dimen/dp_250" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:background="@drawable/bg_fusion_traffic_light_p" > diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml index 610468aafb..b62e693de6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml @@ -15,7 +15,6 @@ android:layout_marginLeft="@dimen/dp_150" android:textSize="@dimen/sp_30" android:textColor="@color/white" - android:text="即将绿灯" /> @@ -50,7 +47,6 @@ app:layout_constraintBottom_toBottomOf="@id/tvTrafficNumDecimal" app:layout_constraintRight_toLeftOf="@id/tvTrafficNumDecimal" android:textSize="@dimen/sp_90" - android:text="3" android:textColor="@color/light_prompt_red" app:textType="DS_DIGIB_2" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml index 87dfef8b33..1eb0ad5102 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml @@ -15,7 +15,6 @@ android:textColor="@color/light_prompt_content" android:layout_marginTop="@dimen/dp_50" android:layout_marginStart="@dimen/dp_50" - android:text="即将红灯,请减速慢行" /> @@ -37,7 +35,6 @@ app:layout_constraintBottom_toBottomOf="@id/tvTrafficNum" app:layout_constraintLeft_toRightOf="@id/tvTrafficNum" android:textSize="@dimen/sp_30" - android:text=".99" app:textType="DS_DIGIB_2" android:gravity="bottom" /> diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotSummaryInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotSummaryInfo.kt index 693723af34..d4bedfe80b 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotSummaryInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotSummaryInfo.kt @@ -5,6 +5,13 @@ package com.mogo.eagle.core.data.autopilot */ object AutopilotSummaryInfo { + /** + * 车辆服务次数 + */ + @JvmField + @Volatile + var vehicleServiceNum = 0 + /** * 全息路口服务次数 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt index 2278328f24..4c0fec1918 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/union/IMoGoTrafficLightListener.kt @@ -33,7 +33,9 @@ interface IMoGoTrafficLightListener { /** * 红绿灯额外提示框 */ - fun onTrafficLightPrompt(currentState: TrafficLightEnum,currentDuration: Int){} + fun onTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float){} /** * 融合红绿灯,带有下一灯态和下二灯态 @@ -67,7 +69,9 @@ interface IMoGoTrafficLightListener { * @param currentState 当前灯态 * @param currentDuration 当前灯态倒计时 */ - fun onShowTrafficLightPrompt(currentState: TrafficLightEnum,currentDuration: Int){} + fun onShowTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float){} /** * 展示融合带有下一下二灯态的红绿灯 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt index 40d3cc465f..fa5c3cb131 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallerTrafficLightListenerManager.kt @@ -77,10 +77,12 @@ object CallerTrafficLightListenerManager : CallerBase * @param currentState 当前灯态 * @param currentDuration 当前灯态倒计时 */ - fun onShowTrafficLightPrompt(currentState: TrafficLightEnum,currentDuration: Int){ + fun onShowTrafficLightPrompt(currentState: TrafficLightEnum, currentDuration: Float, + nextState: TrafficLightEnum, nextDuration: Float, + nextTwoState: TrafficLightEnum, nextTwoDuration: Float){ M_LISTENERS.forEach{ val listener = it.value - listener.onShowTrafficLightPrompt(currentState,currentDuration) + listener.onShowTrafficLightPrompt(currentState,currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration) } } From fd087758c937decbf51a9a52808d52cb3826789b Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 3 Jul 2024 19:32:42 +0800 Subject: [PATCH 3/6] =?UTF-8?q?[6.5.0]=20[fea]=20[=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E5=B1=8F=E8=A7=86=E8=A7=92=E5=88=87=E6=8D=A2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/layout/bus_base_fragment.xml | 21 +++--- .../main/res/layout/charter_base_fragment.xml | 19 +++-- .../common/module/debug/DebugDataDispatch.kt | 22 ++++++ .../wigets/map/switchvisual/SeekBarView.kt | 45 ++++++++---- .../map/switchvisual/VisualViewDirver.kt | 67 ++++++++++++++++++ .../drawable-nodpi/common_visual_angle.png | Bin 0 -> 2049 bytes .../drawable-nodpi/common_visual_angle_bg.png | Bin 0 -> 5531 bytes .../common_visual_angle_bg_unenable.png | Bin 0 -> 1326 bytes .../common_visual_angle_unenable.png | Bin 0 -> 2175 bytes .../drawable-nodpi/common_visual_bottom.png | Bin 0 -> 1162 bytes .../common_visual_bottom_unenable.png | Bin 0 -> 800 bytes .../drawable-nodpi/common_visualangle_bg.png | Bin 0 -> 7320 bytes .../common_visualangle_bg_unenable.png | Bin 0 -> 11666 bytes .../drawable-nodpi/commont_visual_head.png | Bin 0 -> 1834 bytes .../commont_visual_head_unable.png | Bin 0 -> 1318 bytes .../res/layout/common_visualangle_black.xml | 47 ++++++++++++ .../res/layout/taxi_p_seekbar_visualangle.xml | 4 +- .../res/layout/taxi_seekbar_visualangle.xml} | 20 +++--- .../main/res/layout/shuttle_base_fragment.xml | 21 +++--- .../cloud/model/SweeperCloudTaskModel.java | 5 ++ .../presenter/SweeperOperatePresenter.java | 5 ++ .../main/res/layout/taxi_base_fragment.xml | 20 +++--- .../passenger/ui/TaxiPassengerBaseFragment.kt | 2 +- .../och/taxi/passenger/ui/bar/LeftBarView.kt | 1 - .../src/main/res/layout/taxi_p_rightbar.xml | 12 ++-- .../src/main/res/layout/taxi_p_seekbar_.xml | 2 +- .../layout/unmanned_taxi_base_fragment.xml | 18 +++-- 27 files changed, 243 insertions(+), 88 deletions(-) create mode 100644 OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewDirver.kt create mode 100755 OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle.png create mode 100755 OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg.png create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg_unenable.png create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_unenable.png create mode 100755 OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom.png create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom_unenable.png create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg.png create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/common_visualangle_bg_unenable.png create mode 100755 OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head.png create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/commont_visual_head_unable.png create mode 100644 OCH/common/common/src/main/res/layout/common_visualangle_black.xml rename OCH/{taxi/pcommon/src/main/res/layout/taxi_p_seekbar_visualangle.xml => common/common/src/main/res/layout/taxi_seekbar_visualangle.xml} (59%) diff --git a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml index 0bab6f9d11..ab3db7be7a 100644 --- a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml +++ b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml @@ -221,6 +221,15 @@ android:layout_marginTop="-24dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@id/module_mogo_och_autopilot_status" /> + + + + - - - + app:layout_constraintLeft_toRightOf="@id/toolsView" /> + + - - - diff --git a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt index 73fdd2c46e..7aeb823941 100644 --- a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt +++ b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt @@ -11,6 +11,9 @@ import com.google.gson.reflect.TypeToken import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.angle.scenes.CrossRoad +import com.mogo.eagle.core.function.angle.scenes.Default +import com.mogo.eagle.core.function.angle.scenes.LongSight import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.V2N import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager @@ -23,6 +26,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListener import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapRomaListener +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ActivityUtils @@ -57,6 +61,7 @@ object DebugDataDispatch { const val stopSite = "stopSite" const val v2N = "xiaozhiV2N" const val romal = "romal" + const val visualView = "visual" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "location" --es path "1111/11111" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "globalPath" --es path "sy73.json" @@ -69,6 +74,7 @@ object DebugDataDispatch { // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "stopSite" --ei state 6 --ei action 1 // 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 val ROOT_PATH = @@ -170,6 +176,22 @@ object DebugDataDispatch { pncAction.parkScenarioAction = planningaction.build() CallerPlanningActionsListenerManager.invokePNCActions(pncAction.build()) } + visualView ->{ + val state = intent.getIntExtra("show", 0) + when (state) { + 0 -> { + CallerVisualAngleManager.changeScene(LongSight(0)) + } + 1 -> { + CallerVisualAngleManager.changeScene(Default(0)) + } + 2 -> { + CallerVisualAngleManager.changeScene(CrossRoad(0)) + } + else -> {} + } + + } romal ->{ val state = intent.getIntExtra("show", 0) CallerMapRomaListener.invokeMapRomaRange(state==0) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt index 20323a5fce..c27788d5d5 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/SeekBarView.kt @@ -11,12 +11,19 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.MotionEvent import android.widget.ImageView +import androidx.annotation.DrawableRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.R +import kotlinx.android.synthetic.main.taxi_p_seekbar_visualangle.view.iv_visualangle_bg +import kotlinx.android.synthetic.main.taxi_p_seekbar_visualangle.view.iv_visualangle_value +import kotlinx.android.synthetic.main.taxi_seekbar_visualangle.view.iv_visualangle_bg_dark +import kotlinx.android.synthetic.main.taxi_seekbar_visualangle.view.iv_visualangle_value_dark import kotlin.properties.Delegates @@ -53,13 +60,6 @@ class SeekBarView : ConstraintLayout, VisualViewModel.IVisualCallback { override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - - val split = (height - draggableButton.height) / 3f - canvas.drawLine(0f,split,width.toFloat(),split,p) - canvas.drawLine(0f,split*2,width.toFloat(),split*2,p) - canvas.drawLine(0f,(height - draggableButton.height).toFloat(),width.toFloat(),split*3,p) - val translationY = draggableButton.translationY - canvas.drawLine(0f,translationY,width.toFloat(),translationY,p) } private var initialX = 0f @@ -82,12 +82,12 @@ class SeekBarView : ConstraintLayout, VisualViewModel.IVisualCallback { if(draggableButton.translationY<-draggableButton.height){ tempSet.clone(this) - tempSet.setTranslationY(R.id.iv_setting_only_value,-draggableButton.height.toFloat()) + tempSet.setTranslationY(draggableButton.id,-draggableButton.height.toFloat()) tempSet.applyTo(this) return true }else if (draggableButton.translationY>(height)){ tempSet.clone(this) - tempSet.setTranslationY(R.id.iv_setting_only_value,(height).toFloat()) + tempSet.setTranslationY(draggableButton.id,(height).toFloat()) tempSet.applyTo(this) return true } @@ -98,7 +98,7 @@ class SeekBarView : ConstraintLayout, VisualViewModel.IVisualCallback { initialY = event.rawY; tempSet.clone(this) - tempSet.setTranslationY(R.id.iv_setting_only_value,draggableButton.translationY+dy) + tempSet.setTranslationY(draggableButton.id,draggableButton.translationY+dy) tempSet.applyTo(this) } MotionEvent.ACTION_UP -> { @@ -178,10 +178,31 @@ class SeekBarView : ConstraintLayout, VisualViewModel.IVisualCallback { private lateinit var draggableButton:ImageView private fun initView() { - LayoutInflater.from(context).inflate(R.layout.taxi_p_seekbar_visualangle, this, true) - draggableButton = findViewById(R.id.iv_setting_only_value) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + LayoutInflater.from(context).inflate(R.layout.taxi_seekbar_visualangle, this, true) + draggableButton = findViewById(R.id.iv_visualangle_value_dark) + }else{ + LayoutInflater.from(context).inflate(R.layout.taxi_p_seekbar_visualangle, this, true) + draggableButton = findViewById(R.id.iv_visualangle_value) + } } + fun setBgResource(@DrawableRes resource:Int){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + iv_visualangle_bg_dark.setImageResource(resource) + }else{ + iv_visualangle_bg.setImageResource(resource) + } + } + fun setHumbResource(@DrawableRes resource:Int){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + iv_visualangle_value_dark.setImageResource(resource) + }else{ + iv_visualangle_value.setImageResource(resource) + } + } + + override fun onAttachedToWindow() { super.onAttachedToWindow() viewModel = findViewTreeViewModelStoreOwner()?.let { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewDirver.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewDirver.kt new file mode 100644 index 0000000000..988b4e8e41 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/switchvisual/VisualViewDirver.kt @@ -0,0 +1,67 @@ +package com.mogo.och.common.module.wigets.map.switchvisual + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.common.module.R +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_center_location_bg +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_visual_angle_title_bottom +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_visual_angle_title_head +import kotlinx.android.synthetic.main.common_visualangle_black.view.iv_visual_angle_title_value_bg + + +class VisualViewDirver : ConstraintLayout { + + private val TAG = "LeftBarView" + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) + + init { + } + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.common_visualangle_black, this, true) + + iv_visual_angle_title_value_bg.enableCallback = object :SeekBarView.EnableCallback{ + override fun enableChangeListener(enable: Boolean) { + if(enable){ + iv_visual_angle_title_head.setImageResource(R.drawable.commont_visual_head) + iv_visual_angle_title_bottom.setImageResource(R.drawable.common_visual_bottom) + iv_visual_angle_title_value_bg.setBgResource(R.drawable.common_visual_angle_bg) + iv_visual_angle_title_value_bg.setHumbResource(R.drawable.common_visual_angle) + iv_center_location_bg.setImageResource(R.drawable.common_visualangle_bg) + }else{ + iv_visual_angle_title_head.setImageResource(R.drawable.commont_visual_head_unable) + iv_visual_angle_title_bottom.setImageResource(R.drawable.common_visual_bottom_unenable) + iv_visual_angle_title_value_bg.setBgResource(R.drawable.common_visual_angle_bg_unenable) + iv_visual_angle_title_value_bg.setHumbResource(R.drawable.common_visual_angle_unenable) + iv_center_location_bg.setImageResource(R.drawable.common_visualangle_bg_unenable) + } + } + } + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + } + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle.png new file mode 100755 index 0000000000000000000000000000000000000000..f2ea150dff6319508d077c6b23ffe7f1a6f934b5 GIT binary patch literal 2049 zcmV+c2>$npP)Px+yGcYrRA>d&StH^6a-i9)RKiF{s{$(6~wMe z3uY&}P^n!A{sDGp{{WYEp@Bk8p)QI9Q|(96PLgI4Gc(WgJLmrHz3*ejN!vwxlk?8G z=j)zx?#H_`lP2X>6BZ$LV&by)&dWNN!DvGFD+gA{@gbo&CSi-7I_a=&_gt6z>VW4Prh~RotYo!uU&85ZLhdN zAhzK^X;Uj_>XWM_HK7xMn%2wuC`Ou&30M(;F&qnG4w0-&N|TmUC3eK$N1q^ZgJ*@2 z_?@mW%#G#bLJX;anwn}QuN``E<)@1mKm6hRw?7MOOCYmoWag)*rw_dQ_RNJ#zg=nF zYp<%4hkG!n2k=rdEitz36gmC!>y_5bv6&0VRUBYdyXi=h@sppOI(PMt>&<@OEvsQe zARfjD+|!MK1H0IOivzCHVojxzHIksxH$BJRj} zL^hEpkYNFj?5yA+>e898kmLS+`;Q8_OQ4420TXF`tR;9ri#(JxLV!x?43kF;BhWlc zVm=*`7wegoX&9f{iWwF#X)2JHuoBpapr zSY2FC$y!{c_%FvB^UT&H^A0jq)qu-9_6>0mC# z)nJ4W+-f$HT@w>R+S@giMTPgi-T-ugiIV>FVia8KEkNGu+OT@$o$v1exD3hP>e^be zwtnAqbX*~cja&V+VT&?YCM-ZvIHb?4Z4zv+s;{Km?IxR>|GG;Ll9UUV95Y&i6qhm< zhV?c(c!F1d1;>=WP91oPm16RfP&ad$F9g6%m%U*0RQghC)ieiBp>mhP0LJ(R9B1npn!5tk&^}# z6f~kBco-^I8+05fUml7%K(6DMMP9K_TfsWJL*$Wa7?}FRri3XOx#dlZW=>jCiW#6~ zpDPRd9faelJMy&SWRBKZQ$q?XF#T1CU{8p|`7J;J6mw(cI+0MLqLmzgJChw_J8b#O z;ipSp4?&@|FZ%ikF~Vvs8$g$`C15nq0BiyL^<{f)B%RF-8;>!{YT%m@*7=B>s$*8k zstaItBRn~z;T?@eGO=@9lf?xS1L8cur$l}Vv;x32cs7LOE)6HWH0@Zz;S4Z&x3`sS zY}(ww6k6I`1y~5Cp&hz&46PRfi1~n0{#T!3gwl z8*lu`h!G0F@IsJbbns%JB-W)IGV)^_(?uPTaSCbc`=Tp!+=Vro-A#a!q?gI`hGfQqSEhkHN zm!+2vjGl^-kzd3XgT-B0fB~6@Onm@!4N;c-ee+iG&#gP+-wr*V1Nhuw=K&LkL~J8- zP0H(F^_B39cC+X6Hb7m}nSn3fQdsEt6Rt=U{&1>X)v8Lq(d8||H z(_#>x@(086r7B-1*sR)QarN;n={6gaAg(aij4cscEz~t03K3ROnP)R-HhwmvVU&k$ zkh=s#3e}{~6$OCze%9@+n63?GPjCWd@=>0!Ay7Z~VZxR=`Q%zj%!)Gf=+E$=lb(DO z#uv;HlF#^gv>VenjICN5fb z2kmp30Z+A>$>LuNmxc7d3*cz&%$_;@<*P3pT$S(3pjT>PeoCT*E`na_KHQ z_g-THuQv4U)uvBjRAMYj{THdTF;6U96-Mb}K4|vMy8N{9!RLKrsx_Ise)!Pp*I#{c z`s)1roQReMwh#sYg=h*qH#s@^%9+{O6VJbJ@Nli(XiA_Bd|{doLNv9Rxg`TeNSw4{ zR}dS@BxbHv5RwVWC`wwAHYT2~@3xNh;ej&s<{v3OoM>8EPc*jr-R|nbpVxn%J$v@M zcDsE|go^_B`K!kWfbli)Qv!Pg_6bZ0;Jb5Nma6xK2p;o>?cEi?a=#~VOW=+GzF5>V zfCZ4gUkUih2)~*jc@zc7v!p^kG0m2ZegmV)q6q5(*xUXd5Ep=%Az=dL#MF6Gux=;` f78t96;N$-fpffz`n{X9400000NkvXXu0mjfQs&VA literal 0 HcmV?d00001 diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..386839b12e4cfaac34a00bdc1b463bb094979e52 GIT binary patch literal 5531 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 literal 0 HcmV?d00001 diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg_unenable.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_angle_bg_unenable.png new file mode 100644 index 0000000000000000000000000000000000000000..80df6287df1cdd83baf119c01e5e60803efc470c GIT binary patch literal 1326 zcmV+}1=0G6P)Px(=t)FDRCodHozHF)F%ZU+g6I<g)iO4MbdImrQN1;q+srF+kJ3$aqpd4w3RsPF=6>;|9y)m-PimxEO9P!D@jcLN4|M49XT9MA)F z00#l&CZ7WAEq8A4p0BY!Q-IYgSUn&s_nt$#ZI1QXLcA?g<~f^IlU0z-hs^Bvaf|iI zDo8u}*yZlt`Rq-U1$4d6dcB9cko1)UWF;SnkzFA0l>HhCwD4+pB1M777;ggw;lN zv1of13KsK3CKlVPXj`IS(Fp5WcCl!?2yTP?()Y{7X8 zaUh22^gmRPO4DD`D*8nLlXhgo*%A%ctYR1xZx0#oDjQlraqeUQRW@b^s0vR)MU{=& zDX7Yygn}v?vr|x&KM4g@HkyKrio+>LB?|A`?NaWpoDGJXzoZQ@tf*GumRps27&|tg zdUCS_REH@DvwG|-6;$U@prCr}EEQDeQJ|oDY*R2$52wQ`NTmv&%Iy9A+ZG7-6lG5R ziB3z1;at5Mjbluut^q=Uu31B@PIhu=8Ph`CMGB9Wg=JRI5-!UaGoVEc%b58BTE5)a zGRCH$D_I(c_-15vnZwGm?t|J@Y0AIZ18TMnOp zF%FW0s3ejvEkPem)$y~!iFuo$(gnw-kv0CwPuG{fTexZlbauZK?Bn(~L7!xoT>(Fl zPx-IY~r8RA>d&Sx=7?MHKIu+1;517B+}W3>Tx2j2aS2G{K9A#30ME%fH>7*`4n3_j|8i)vNBFb&WBB+O2;7->dhk zy1KfjQ#4x_EbE;hHrUjDzB!XHJi^NLIBK65@!qLZ=Z?O0?)=9G7Z%RW^#@01dfh>{ z+nwojx<$9!L03q+2fWuK9b~?SOLPft zLm`}f_x%sf96x^YQold9#DQ|8-7w&+0OT?GsRckmn0T+P09u5+04ecU03=dQ#+tYl zphN+(f}j9nbnw~=z!d4v`fz)=a_iSy?_K-y@^!@DVG+30nS5_~`Sh{Zk1t=Eo10q# zoi&}OjMYvcn6y0`w7dDgxP#fj(#aDiFD);>aSSnf=$IxgK>zIdcP{kj`i|RQP=Qr*u`9{tzIbSnx$Z;9O{_cq{OsIdm)VDwYt6WI zPMx;lH~ExAt|ZGqk>jE&H%fp+Jkuh9J*vj@oPK|vxz3|Y0jN9M>&*|Dg2!o=S z2*Dy55%119sj*3V2f$+;LSTxM*PLp4^Qr3nZ5(+5p)|d&^A++cl-(Ym&l{_=y4HK3?%Mi;^tBTEfjU9Y4IV=s|7^8zyOoC(5$}5VO z4lfi34(!JgLpV7r020T+k~f>Wg1_jJmfCm_lJ$U?b{4=vM$Q3pK*GW1;re>9_V}@x zG$7rwt5?R=^(9ybBc6o73gl`9h)K|^CS++DOp*}6K!}I|u01K%A3u`=k{y&-06RfS z0T5OWS#%dXXyQB!h0`FCEhjkr;Q&-h5yD9jbP6gCY8U3jsmW3o6Y|=O`4nh2EuruY zHArT{6PEME6na4pAW52%+%{$#C8ll03Zsq2qS3zgyw9$jE#Vv9-3+o00A@wrV9!PnLw6|3me z8$D|gECvfFshg-~oK`?4uu9UM)lprl!=y~91zCOgs91l*9iN?>UxM;9fD73G3B`r_ zrhVK1IqTd6?NwOb{CYlCjzy{KlAcn47FF@7j%_6{kOj~n2xdrd zK~nWJWf=~b=~keWe`;&1L9FPE0&5O;s7WJ~BJi;X&IEy25-ErcA!_P-fFq})7SP~y z%_Q-Xcb(IgB!^WNDZ|ui1_>^LkfJw*u&{r9^d)b+xn{iv9Zr#r$9n_dfRk z-uv*#TLE8F1i@76aaewAG_TWP)>qKp3ZU6Wl1-B14!aX zUiSh(9)eg5?gdf^>Y|HDup5rHi|z4PzY{Xa zY$J5Z#}NfXc(LQI%sywGpTxo`uw(&bMT7!KTuU&dX0C)ZSq!9kWIAfMr-P8%ai-XK z^<9`r##@3jsqCN|36ZIAiiWwSiN~9soKuf#(p+Qw<9}?#tp}zRfWsa~#XTZ<3O?zk z1F1`s?FvO<@@Tl{h`BKg3e&QzLkc}lv&ZemT*X5yK!wl8zT~no(cT9NxMzt%&Y%^V zS0?V2YIs&1Eu?Cg9--kmn%I^ovjP*` zT&7w{H(~VPDGnmi5pldQN_pBxxz2D90a(i6b_jyeXp^~eLy^zoG~ao!a_`3=-xb7I zty;|_WXNU&XeiAU_gClC6b(9&pu)FVHfTz9+W3T>Vs&MOxyIiG_>QwW1X0}%%I8VFFJzr(HC?m_xd0?2H_E=W}{AJ z;T~kYBF;a@vu#6p!IQa3jx&tOU;Fy2k8c0=%MA$D(08l=Tm|J{_wKC!eDlWlFE70^ z)5k9e_)-1Uof4NqWJ5E8X==-p4F%xueX$6-TABq& zm4!Bb8Z0-rHlO}^_mAJdx%}CupWL~9i^=o%K^`e9(#bbdEqMCZ429+vEB z0rZ7xoLD~cxZL?3&CPEWeFI(g04o4!S(IE6{K<&FnlO15g~?OT>wz1@Z+Pp|D-ccAd3t>Ix@HaWaPR8TUq#OVM002ovPDHLkV1if@ B2mAm4 literal 0 HcmV?d00001 diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..13076e27b6064c6ab2207aa4735557e38632e76c GIT binary patch literal 1162 zcmV;51aX1^@s6$@ldn00001b5ch_0Itp) z=>Px(L`g(JR7efIRb6aURS=#z_wFwJ+hPeZH5f6GpQ_Pl2u9kj;)CJI2Q_UMv1*LL z7{qLABxwvTAqt38j1Oux$kQ&SF=_%4gD-7L36dbuR*{5?1{D-T=|Z91y=VN+S+BXf z?$#AePqI7b%-=UNcg`868J37}*P27ODlgY8LN^o3QWBa=%ngvuW1?DO8i(5NaB~jw zQD!>ouzR>>@rtjKN!ByChiRGhe0=aWPpFSX?kb})Bb$jcMDh_k?#3Od<{wHamjr*I z{ZLbmvO_}BV2q%YL$+hc_B+rioaexCgoGo)1d6?(#1S@o;wWtEEFkkQ;b?W!w!UQ- ziUV+q8Rneh>{|e8VCItm>0A=6IkL8IS+gbB=$2`vl;e5Tnxr3ouFqbW?1A2f zV%@)G-qkUDhe-CQQDnsr_oibX78{j2cgF`eX)PPAocR@pXxJ0ki>jQhUm9D09>@i4 zRq$Z;Lb*pR59Nw3Y5k;FKGRvWJQt9!TmE3{epK%~oL)Qe?a-=#%x(+7lSwh>4kJNH z-YbsOTFmf=@BfW2hW$ue8+%CSQ^OOM$9$Pj3&1a)7`hM5(`bZY#k+l_N@>W6v?0@X z(UfnyPPpCLiTc=37J4A@1aDL;a^=~ek3M!Y|cdtHp zgVwn;zU|$<4(|D7R;I(N(^@9`QPF!5#1+(kKa(7;Yl^+biTJ=y00$ezxAzdlDFk#} zi5%BTjlpO_Y08k2j3_swiLWr}8u9c_$Zkj2mjPk|t`g!<-jP)M4hyJKTRG7_a30LL z1%lZ*98<32u0%O@%?_TA!Y_rDvqo)CH6LSEpBpx=$4~fHpJ98^SNne`3ljVi%`{>B zg(%d&E!{F|yB(c~#|Yqx*Y$o7TNSEtu0yjtZ4HdzY8TUK_<7kSXHoB-d+tPEY&Nd6 znr<}IzU^Q-Xe<(?&KTyayIL@j=pFOxUOf=g9__=v7Qc!X8ubJ~*Vip>JrEqLLe9@b z9xjDrleOSl@>*;>v;O21HJGJHgn7yYVQm3a_GU(!p!QuUkcHI#_(&RIvwU@@n zZ}L2^(j$!AHs&R>(hBLeEo? z@YjZKGk-l5`=Tp8*n=o<#BV+(|0G7=ujD$Z62=v?T$k5+S!zc+UjrjdIXR0vJhFZF ca{HM50eX3V;#hmG^8f$<07*qoM6N<$g2&4}VgLXD literal 0 HcmV?d00001 diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom_unenable.png b/OCH/common/common/src/main/res/drawable-nodpi/common_visual_bottom_unenable.png new file mode 100644 index 0000000000000000000000000000000000000000..de0caf66ae728e19965687d76ec9e229216e5d86 GIT binary patch literal 800 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 literal 0 HcmV?d00001 diff --git a/OCH/common/common/src/main/res/layout/common_visualangle_black.xml b/OCH/common/common/src/main/res/layout/common_visualangle_black.xml new file mode 100644 index 0000000000..69a1e5df26 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/common_visualangle_black.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/taxi_p_seekbar_visualangle.xml b/OCH/common/common/src/main/res/layout/taxi_p_seekbar_visualangle.xml index 4c1bc8426c..55f173c633 100644 --- a/OCH/common/common/src/main/res/layout/taxi_p_seekbar_visualangle.xml +++ b/OCH/common/common/src/main/res/layout/taxi_p_seekbar_visualangle.xml @@ -7,7 +7,7 @@ tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> diff --git a/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml b/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml index 4e8489372e..a20568f292 100644 --- a/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml +++ b/OCH/shuttle/driver/src/main/res/layout/shuttle_base_fragment.xml @@ -198,6 +198,14 @@ app:layout_constraintTop_toBottomOf="@id/module_mogo_och_autopilot_status" app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call" /> + + + - - - - diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java index 6fcaf29aa3..d59f3ac076 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java @@ -792,4 +792,9 @@ public class SweeperCloudTaskModel implements IMoGoSweeperFutianCloudTaskListene public void onAutopilotTrajectoryDownloadReq(@NonNull AutopilotControlParameters.AutoPilotLine autoPilotLine, int downloadType) { } + + @Override + public void onFsmReceiveTimeout(boolean isTimeout) { + + } } diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/presenter/SweeperOperatePresenter.java b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/presenter/SweeperOperatePresenter.java index 130c155a68..764942e060 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/presenter/SweeperOperatePresenter.java +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/presenter/SweeperOperatePresenter.java @@ -469,4 +469,9 @@ public class SweeperOperatePresenter extends Presenter @Override public void onAutopilotTrajectoryDownloadReq(@NonNull AutopilotControlParameters.AutoPilotLine autoPilotLine, int downloadType) { } + + @Override + public void onFsmReceiveTimeout(boolean isTimeout) { + + } } diff --git a/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml b/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml index 2138637b81..1a169220bd 100644 --- a/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml +++ b/OCH/taxi/driver/src/main/res/layout/taxi_base_fragment.xml @@ -220,6 +220,14 @@ app:layout_constraintTop_toBottomOf="@+id/module_mogo_och_autopilot_status" tools:visibility="visible" /> + + + - - - + app:layout_constraintLeft_toRightOf="@id/toolsView" /> { diff --git a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt index 99618fa399..55b4ae0a25 100644 --- a/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt +++ b/OCH/taxi/pcommon/src/main/java/com/mogo/och/taxi/passenger/ui/bar/LeftBarView.kt @@ -8,7 +8,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.och.common.module.wigets.map.switchvisual.SeekBarView import com.mogo.och.taxi.passenger.common.R -import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_center_location import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_center_location_bg import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_visual_angle_title_bottom import kotlinx.android.synthetic.main.taxi_p_leftbar.view.iv_visual_angle_title_head diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml index 36e55e319b..b12099d8b8 100644 --- a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_rightbar.xml @@ -58,13 +58,13 @@ + app:layout_constraintBottom_toBottomOf="@+id/iv_visualangle_bg" + app:layout_constraintStart_toStartOf="@+id/iv_visualangle_bg" + app:layout_constraintEnd_toEndOf="@+id/iv_visualangle_bg" + app:layout_constraintTop_toTopOf="@+id/iv_visualangle_bg" /> \ No newline at end of file diff --git a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_seekbar_.xml b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_seekbar_.xml index 693d5af861..cf8aac9f7d 100644 --- a/OCH/taxi/pcommon/src/main/res/layout/taxi_p_seekbar_.xml +++ b/OCH/taxi/pcommon/src/main/res/layout/taxi_p_seekbar_.xml @@ -7,7 +7,7 @@ tools:parentTag="androidx.constraintlayout.motion.widget.MotionLayout"> + + - - From de4d758930e5d953e35e0167ccc4cbb913f52e67 Mon Sep 17 00:00:00 2001 From: renwj Date: Wed, 3 Jul 2024 19:50:49 +0800 Subject: [PATCH 4/6] =?UTF-8?q?[6.5.0][=E9=81=93=E8=B7=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6]=20=E7=BB=BF=E6=B3=A2=E9=80=9A=E8=A1=8C=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt | 101 +++++++++++++----- .../function/biz/v2x/v2n/utils/V2NUtils.kt | 24 +++++ .../core/function/hmi/ui/MoGoHmiProvider.kt | 29 +++++ .../hmi/ui/greenwave/GreenWaveView.kt | 1 - .../eagle/core/data/enums/EventTypeEnumNew.kt | 8 ++ .../api/hmi/warning/IMoGoHmiProvider.kt | 10 ++ .../function/call/hmi/CallerHmiManager.kt | 14 +++ .../src/main/java/com/mogo/map/IMogoData.kt | 8 +- .../java/com/mogo/map/entities/CrossRoad.kt | 9 ++ .../main/java/com/mogo/map/MapDataWrapper.kt | 17 +++ 10 files changed, 190 insertions(+), 31 deletions(-) create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/entities/CrossRoad.kt diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index 146c4d6bb3..73a8883432 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -3,8 +3,10 @@ package com.mogo.eagle.function.biz.v2x.v2n.pnc import android.os.Handler import android.os.HandlerThread import android.os.Message +import android.text.TextUtils import android.util.Log import androidx.core.util.Pair +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.enums.CommunicationType import com.mogo.eagle.core.data.enums.DataSourceType @@ -33,6 +35,7 @@ import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.AppStateManager import com.mogo.eagle.core.utilcode.util.CoordinateTransform import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils @@ -41,14 +44,17 @@ import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker.Marker import com.mogo.eagle.function.biz.v2x.v2n.utils.V2NUtils import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager +import com.mogo.map.MapDataWrapper import com.mogo.map.entities.Lane import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.Header import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.telematics.pad.MessagePad.V2nCrossSpeed import mogo.v2x.MogoV2X import mogo.v2x.MogoV2X.RSI_PB import mogo.v2x.MogoV2X.RTEData_PB import java.util.concurrent.TimeUnit.SECONDS +import kotlin.math.abs /** * V2N上车相关事件绘制 @@ -60,6 +66,7 @@ internal object V2NIdentifyDrawer { private const val MSG_WHAT_DRAW_SHIGONE = 0x1010 // 道路施工 private const val MSG_WHAT_DRAW_SHIGU = 0x1011 // 交通事故 private const val MSG_WHAT_DRAW_YONGDU = 0x1012 // 交通拥堵 + private const val MSG_WHAT_DRAW_GREEN_WAVE = 0x1013 // 绿波通行 private val callback = Handler.Callback { msg -> if (msg.what == MSG_WHAT_DRAW_SHIGONE || msg.what == MSG_WHAT_DRAW_SHIGU) { @@ -150,33 +157,6 @@ internal object V2NIdentifyDrawer { ) ) ) -// CallerHmiManager.warningV2X( -// poiType, -// alertContent, -// ttsContent, -// object : IMoGoWarningStatusListener { -// override fun onShow() { -// super.onShow() -// runCatching { CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), State.START) } -// CallerVisualAngleManager.changeAngle( -// RoadEvent( -// itx.longitude, -// itx.latitude, -// itx.angle -// ) -// ) -// } -// -// override fun onDismiss() { -// super.onDismiss() -// runCatching { CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), State.STOP) } -// CallerVisualAngleManager.changeAngle(Default()) -// } -// }, -// ALERT_WARNING_TOP, -// 10000, -// false -// ) if (polygon.isNotEmpty()) { val decision = V2NUtils.computeOccupyLanesInfo(Triple(car.longitude, car.latitude, car.heading.toFloat()), Triple(itx.longitude, itx.latitude, itx.heading.toFloat()), polygon.map { kotlin.Pair(it.first, it.second) }) if (decision != null) { @@ -321,6 +301,41 @@ internal object V2NIdentifyDrawer { }.receive() } } + + if (msg.what == MSG_WHAT_DRAW_GREEN_WAVE) { + val data = msg.obj as? V2nCrossSpeed ?: return@Callback true + val destX = data.lng + val destY = data.lat + val id = "${destX}_${destY}" + AiRoadMarker.aiMakers.getOrPut(id) { + AiRoadMarker().apply { + try { + val location = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() + val current = abs(location.gnssSpeed) * 3.6f.toInt() + val min = abs(data.speedStraightMin * 3.6f).toInt() + val max = abs(data.speedStraightMax * 3.6f).toInt() + marker(Marker(id, EventTypeEnumNew.TYPE_SOCKET_ROAD_GREE_WAVE.poiType, destX, destY, 0.0, null, null, null), drawMarker = false, false) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + AppStateManager.currentActivity()?.let { + val speakText = StringBuilder("保持当前车速即可通过路口,好丝滑!") + if (current < min) { + speakText.setLength(0) + speakText.append("蘑菇推荐您提升车速至${min}千米每小小, 当前车速${current}千米每小时") + } + if (current > max) { + speakText.setLength(0) + speakText.append("蘑菇推荐您降低车速至${max}千米每小时, 当前车速${current}千米每小时") + } + AIAssist.getInstance(it).speakTTSVoice(speakText.toString()) + } + } + CallerHmiManager.showGreenWave(min, max, computeCrossCountBetween(Triple(location.longitude, location.latitude, location.heading), kotlin.Pair(destX, destY))) + } finally { + receive() + } + } + } + } true } @@ -390,6 +405,21 @@ internal object V2NIdentifyDrawer { } } + private fun computeCrossCountBetween(start: kotlin.Triple, end: kotlin.Pair): Int { + val points = V2NUtils.generateIntermediatePoints(kotlin.Pair(start.first, start.second), end, 10.0 * 1e-7) + var crossId = MapDataWrapper.getCrossRoad(start.first, start.second, start.third)?.cross_id_end + val angle = start.third + var count = 1 + for (p in points) { + val crossRoad = MapDataWrapper.getCrossRoad(p.first, p.second, angle) + if (crossRoad != null && !TextUtils.isEmpty(crossRoad.cross_id) && !TextUtils.equals(crossId, crossRoad.cross_id)) { + count++ + crossId = crossRoad.cross_id + } + } + return count + } + private fun getAlertContent(poiType: String, distance: Double): String { return when (poiType) { EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType -> { @@ -474,23 +504,36 @@ internal object V2NIdentifyDrawer { } } + private fun drawGreenWave(crossSpeed: V2nCrossSpeed) { + Log.d("V2NIdentifyDrawer", "---drawGreenWave---: $crossSpeed, [${FunctionBuildConfig.v2nMainSwitch}, ${FunctionBuildConfig.isNewV2NData}]") + if (V2NCarTypeCheck.verifyCarType() && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + handler.removeMessages(MSG_WHAT_DRAW_GREEN_WAVE) + handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_GREEN_WAVE, crossSpeed)) + } + } + private val nioEventListener = object : IMoGoV2nNioEventListener { override fun onV2nNioCongestionEvent(congestion: MessagePad.V2nCongestion) { super.onV2nNioCongestionEvent(congestion) + V2XBizTrace.onAck(congestion, "onV2nNioCongestionEvent", true) } override fun onV2nNioCrossoverEvent(event: MessagePad.Event) { super.onV2nNioCrossoverEvent(event) + V2XBizTrace.onAck(event,"onV2nNioCrossoverEvent", true) + //TODO renwj } - override fun onV2nNioGreenWavePassageEvent(crossSpeed: MessagePad.V2nCrossSpeed) { + override fun onV2nNioGreenWavePassageEvent(crossSpeed: V2nCrossSpeed) { super.onV2nNioGreenWavePassageEvent(crossSpeed) + V2XBizTrace.onAck(crossSpeed, "onV2nNioGreenWavePassageEvent", true) + drawGreenWave(crossSpeed) } override fun onV2nNioOtherRetrogradeEvent(event: MessagePad.Event) { super.onV2nNioOtherRetrogradeEvent(event) CallerLogger.i(TAG, "onV2nNioOtherRetrogradeEvent --> ${event.toString()}") - + V2XBizTrace.onAck(event, "onV2nNioOtherRetrogradeEvent", true) } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/V2NUtils.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/V2NUtils.kt index e233531b36..2e52ad28ec 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/V2NUtils.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/utils/V2NUtils.kt @@ -7,8 +7,11 @@ import com.mogo.map.entities.Lane import com.zhidaoauto.map.data.road.CenterLine import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory +import org.locationtech.jts.geom.LineString +import org.locationtech.jts.linearref.LengthIndexedLine import java.util.concurrent.CountDownLatch + object V2NUtils { private const val TAG = "V2NUtils" @@ -42,4 +45,25 @@ object V2NUtils { } data class Decision(val laneId: Int? = null,val total: List, val occupy: List) + + + fun generateIntermediatePoints(head: Pair, tail: Pair, interval: Double): List> { + val geometryFactory = GeometryFactory() + val start = Coordinate(head.first, head.second) + val end = Coordinate(tail.first, tail.second) + val line: LineString = geometryFactory.createLineString(arrayOf(start, end)) + val indexedLine = LengthIndexedLine(line) + val lineLength = indexedLine.endIndex + val result: MutableList = ArrayList() + var i = 0.0 + while (i <= lineLength) { + val p = indexedLine.extractPoint(i) + result.add(p) + i += interval + } + if (result[result.size - 1].distance(end) > 0.0001) { + result.add(end) + } + return result.map { Pair(it.x, it.y) } + } } \ 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/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index cda2a7f5bf..6a9985c591 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 @@ -4,6 +4,7 @@ import android.content.Context import android.text.TextUtils import android.view.Gravity import android.view.ViewGroup +import android.view.WindowManager import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route @@ -30,6 +31,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.v2x.CallerTurnLightListenerManager import com.mogo.eagle.core.function.hmi.ui.camera.RoadVideoDialog +import com.mogo.eagle.core.function.hmi.ui.greenwave.GreenWaveView import com.mogo.eagle.core.function.hmi.ui.lookaround.M1LookAroundView import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog @@ -83,6 +85,8 @@ class MoGoHmiProvider : IMoGoHmiProvider { private val xiaozhi by lazy { XiaoZhiStateManager() } + private val greenWave by lazy { AtomicReference() } + override fun init(context: Context?) { this.context = context @@ -403,4 +407,29 @@ class MoGoHmiProvider : IMoGoHmiProvider { override fun notifyXiaoZhiStatusChanged(event: Event, state: State) { xiaozhi.notify(event, state) } + + override fun showGreenWave(min: Int, max: Int, cross: Int) { + val activity = AppStateManager.currentActivity() ?: return + greenWave.get()?.hide() + val content = GreenWaveView(activity) + MoGoPopWindow.Builder() + .contentView(content) + .width(WindowManager.LayoutParams.WRAP_CONTENT) + .height(WindowManager.LayoutParams.WRAP_CONTENT) + .attachToActivity(activity) + .gravityInActivity(Gravity.END) + .onDismissed { + greenWave.set(null) + } + .onShowed { + content.bind(min, max, cross) + } + .build().also { + greenWave.set(it) + }.show() + } + + override fun dismissGreenWave() { + greenWave.get()?.hide() + } } \ 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/greenwave/GreenWaveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt index 0744769176..77d3c1dd99 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/greenwave/GreenWaveView.kt @@ -1,7 +1,6 @@ package com.mogo.eagle.core.function.hmi.ui.greenwave import android.content.Context -import android.os.Looper import android.util.AttributeSet import android.view.LayoutInflater import android.view.MotionEvent 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 a6d812c06a..ecd8c64586 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 @@ -1,5 +1,6 @@ package com.mogo.eagle.core.data.enums +import android.view.View import com.mogo.eagle.core.data.R import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -518,6 +519,13 @@ enum class EventTypeEnumNew( content = "前方%s米有车辆异常倒车/逆行,蘑菇提醒您注意观察小心通过", tts = "前方%s米有车辆异常倒车/逆行,蘑菇提醒您注意观察小心通过" ), + TYPE_SOCKET_ROAD_GREE_WAVE( + "100063", + "绿波通行", + poiTypeSrcVr = View.NO_ID, + content = "保持当前车速即可通过路口,好丝滑!", + tts = "保持当前车速即可通过路口,好丝滑!" + ), TYPE_ERROR( 0.toString(), "未知/错误/异常", 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 fc5e2a7874..54840daaa6 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 @@ -217,4 +217,14 @@ interface IMoGoHmiProvider :IProvider{ * 通知小智形象要变化了 */ fun notifyXiaoZhiStatusChanged(event: Event, state: State) + + /** + * 展示绿波通行弹窗 + */ + fun showGreenWave(min: Int, max: Int, cross: Int) + + /** + * 隐藏绿波通弹窗 + */ + fun dismissGreenWave() } \ No newline at end of file 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 7270a55fda..9e2d5a04af 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 @@ -317,4 +317,18 @@ object CallerHmiManager { fun notifyXiaoZhiStatusChanged(event: Event, state: State) { hmiProviderApi?.notifyXiaoZhiStatusChanged(event, state) } + + /** + * 展示绿波通行弹窗 + */ + fun showGreenWave(min: Int, max: Int, cross: Int) { + hmiProviderApi?.showGreenWave(min, max, cross) + } + + /** + * 隐藏绿波通行弹窗 + */ + fun dismissGreenWave() { + hmiProviderApi?.dismissGreenWave() + } } \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt index 3e73cc5ec2..0a5de66661 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoData.kt @@ -2,6 +2,7 @@ package com.mogo.map import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.map.entities.BusStation +import com.mogo.map.entities.CrossRoad import com.mogo.map.entities.Lane import com.mogo.map.entities.RoadInfo import com.zhidaoauto.map.data.point.LonLatPoint @@ -121,4 +122,9 @@ interface IMogoData { * 获取公交站点集合 */ fun getBusStation(routeList: ArrayList): List -} \ No newline at end of file + + /** + * 获取路口数据 + */ + fun getCrossRoad(lon: Double, lat: Double, angle: Double): CrossRoad? +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/CrossRoad.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/CrossRoad.kt new file mode 100644 index 0000000000..61d44ce785 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/entities/CrossRoad.kt @@ -0,0 +1,9 @@ +package com.mogo.map.entities + +data class CrossRoad( + val status: Int, // 0: 不在路口 1: 在路口 + val tile_id: String, // 起始路口瓦片id或者当前路口的瓦片id + val cross_id: String, // 起始路口id或当前路口id + val tile_id_end: String, // + val cross_id_end: String +) diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt index c6bd7e2ac9..e319ec8514 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MapDataWrapper.kt @@ -6,11 +6,13 @@ import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP import com.mogo.map.MogoData.Companion.mogoMapData import com.mogo.map.entities.BusStation +import com.mogo.map.entities.CrossRoad import com.mogo.map.entities.Lane import com.mogo.map.location.GDLocationClient.Companion.gdLocationClient import com.mogo.map.utils.HDMapUtils.getHDCityCode import com.zhidaoauto.map.data.point.LonLatPoint import com.zhidaoauto.map.data.road.CenterLine +import com.zhidaoauto.map.data.road.RoadCross import com.zhidaoauto.map.data.road.RoadNameInfo import com.zhidaoauto.map.data.road.RoadRectInfos import com.zhidaoauto.map.data.road.RoutePath @@ -21,6 +23,7 @@ import com.zhidaoauto.map.sdk.open.abs.OnHdDataDownByCityListener import com.zhidaoauto.map.sdk.open.data.CityInfo import com.zhidaoauto.map.sdk.open.data.MapDataApi import java.util.concurrent.CountDownLatch +import java.util.concurrent.atomic.AtomicReference /** * 地图数据工具,涉及到数据调用可能会有耗时,建议IO操作 @@ -303,4 +306,18 @@ object MapDataWrapper : IMogoData { latch.await() return resultList } + + override fun getCrossRoad(lon: Double, lat: Double, angle: Double): CrossRoad? { + val latch = CountDownLatch(1) + val temp = AtomicReference() + MapDataApi.getCrossRoad(lon, lat, angle.toFloat(), object : IResult { + + override fun result(code: Int, result: RoadCross?) { + temp.set(CrossRoad(result?.status ?: 0, result?.tile_id ?: "", result?.cross_id ?: "", result?.tile_id_end ?: "", result?.cross_id_end ?: "")) + latch.countDown() + } + }) + latch.await() + return temp.get() + } } \ No newline at end of file From 3d0c70cb59cb3a6db0965854f96e44e693f1e788 Mon Sep 17 00:00:00 2001 From: EmArrow Date: Wed, 3 Jul 2024 20:18:55 +0800 Subject: [PATCH 5/6] [6.5.0] fix bug of roam --- .../mogo/och/taxi/ui/BaseTaxiTabFragment.java | 2 - .../function/hmi/ui/widget/RomaTaxiView.kt | 3 +- .../function/hmi/ui/widget/WifiStateView.kt | 4 +- .../eagle/core/function/MapBizProvider.kt | 4 +- .../business/ai/AiCloudIdentifyDataManager.kt | 14 ++--- .../core/function/business/ai/RomaManager.kt | 19 ++++--- .../eagle/core/function/view/MapRoamView.kt | 55 +++++++------------ .../function/view/RoadCrossRoamListAdapter.kt | 2 - .../core/function/view/RoadCrossRoamView.kt | 16 ++++-- .../core/function/api/map/roma/IMogoRoma.kt | 4 +- .../call/map/CallerMapAiCloudDataManager.kt | 6 +- .../call/map/CallerMapIdentifyManager.kt | 12 ++-- .../call/msgbox/CallerMsgBoxManager.kt | 4 +- .../main/java/com/autonavi/nge/map/MapView.kt | 10 +--- .../map/sdk/open/view/MapAutoViewHelper.kt | 5 ++ .../map/uicontroller/IMogoMapUIController.kt | 2 + .../main/java/com/mogo/map/AMapViewWrapper.kt | 4 ++ .../map/identify/MogoIdentifyManager.java | 6 +- 18 files changed, 81 insertions(+), 91 deletions(-) diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index f4ce741997..bb72a7c676 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -195,7 +195,6 @@ public abstract class BaseTaxiTabFragment @@ -91,19 +91,23 @@ class RoadCrossRoamView @JvmOverloads constructor( override fun onStopLineInfo(info: StopLine) { super.onStopLineInfo(info) + if(info.distance == 0.0){ + Log.i("emArrow", "showState return , distance is zero") + return + } showState = info.distance < 200 && info.distance > 100 - Log.i("emArrow", "showState $showState , distance:${info.distance}") +// Log.i("emArrow", "showState $showState , distance:${info.distance}") } private fun attachView() { // 处于漫游模式下不做处理 - if (CallerMapIdentifyManager.roma.second) { - if (CallerMapIdentifyManager.roma.first != TAG) { + if (CallerMapIdentifyManager.roam.second) { + if (CallerMapIdentifyManager.roam.first != TAG) { ToastUtils.showLong("正在漫游中,不展示路口漫游") } return } - CallerMapIdentifyManager.roma = Pair(TAG, true) + CallerMapIdentifyManager.roam = Pair(TAG, true) this.visibility = View.VISIBLE ivZhiRoadRoamView.visibility = View.VISIBLE mapRoamView.visibility = View.VISIBLE @@ -145,7 +149,7 @@ class RoadCrossRoamView @JvmOverloads constructor( } mapRoamView.closeRoam() mapRoamView.visibility = View.GONE - CallerMapIdentifyManager.roma = Pair("", false) + CallerMapIdentifyManager.roam = Pair("", false) lvRoadCrossRoamTip.adapter = null animator?.cancel() if (lightMode) { diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt index 5d402c9656..c74be6b4ea 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/roma/IMogoRoma.kt @@ -6,8 +6,8 @@ interface IMogoRoma : IProvider { /** * 触发开启/关闭漫游 - * @param romaStatus 漫游状态 + * @param roamStatus 漫游状态 */ - fun trigger(romaStatus:Boolean) + fun trigger(roamStatus:Boolean) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapAiCloudDataManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapAiCloudDataManager.kt index 4b635ff0a1..bf94597ef0 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapAiCloudDataManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapAiCloudDataManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.map +import android.util.Log import com.mogo.eagle.core.function.api.map.roma.IMoGoAiCloudIdentifyDataListener import com.mogo.eagle.core.function.call.base.CallerBase import mogo.yycp.api.proto.SocketDownData @@ -7,14 +8,15 @@ import mogo.yycp.api.proto.SocketDownData object CallerMapAiCloudDataManager : CallerBase() { fun invokeResponse(requestStatus: Boolean, errorMsg: String? = null) { - val tag = CallerMapIdentifyManager.roma.first + val tag = CallerMapIdentifyManager.roam.first + Log.i("emArrow","invokeResponse tag:$tag , status:$requestStatus , errorMsg:${errorMsg?:""}") if(tag.isNotEmpty() && M_LISTENERS.containsKey(tag)){ M_LISTENERS[tag]?.response(requestStatus, errorMsg) } } fun invokeAiIdentifyData(obj: SocketDownData.SocketDownDataProto?){ - val tag = CallerMapIdentifyManager.roma.first + val tag = CallerMapIdentifyManager.roam.first if(tag.isNotEmpty() && M_LISTENERS.containsKey(tag)){ M_LISTENERS[tag]?.onAiIdentifyData(obj) } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt index b8eae0633d..7d7faa2940 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt @@ -3,19 +3,21 @@ package com.mogo.eagle.core.function.call.map import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.map.roma.IMogoRoma -import com.mogo.eagle.core.utilcode.util.ToastUtils object CallerMapIdentifyManager { @Volatile - var roma = Pair("", false) + var roam = Pair("", false) + set(value) { + field = value + } - private val romaApi: IMogoRoma + private val roamApi: IMogoRoma get() = ARouter.getInstance().build(MogoServicePaths.PATH_MAP_BIZ) .navigation() as IMogoRoma - fun romaTrigger(romaStatus: Boolean) { - romaApi.trigger(romaStatus) + fun romaTrigger(roamStatus: Boolean) { + roamApi.trigger(roamStatus) } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt index 2124075422..0ee40a2d7e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt @@ -26,14 +26,14 @@ object CallerMsgBoxManager { */ fun saveMsgBox(bean: MsgBoxBean) { CallerTrace.write(TAG,bean) - providerApi?.saveMsg(bean) //todo emArrow test + providerApi?.saveMsg(bean) } /** * 存储含有pb的数据到消息盒子(区别与上述方法中的trace write) */ fun saveMsgBoxHasPB(bean: MsgBoxBean){ - providerApi?.saveMsg(bean) //todo emArrow test + providerApi?.saveMsg(bean) } /** diff --git a/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt b/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt index 6245dd8cee..0937ddb890 100644 --- a/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt +++ b/libraries/mapmodule/src/main/java/com/autonavi/nge/map/MapView.kt @@ -181,9 +181,6 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr } } - - - override fun getMapEngine(): MapEngine { return mMapEngine } @@ -229,7 +226,7 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr mITraffic = null } - //surfaceview截屏 + // surfaceView截屏 private fun createBitmapFromGLSurface(x: Int, y: Int, w: Int, h: Int, gl: GL10): Bitmap? { val bitmapBuffer = IntArray(w * h) val bitmapSource = IntArray(w * h) @@ -256,10 +253,6 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr return Bitmap.createBitmap(bitmapSource, w, h, Bitmap.Config.ARGB_8888) } - - - - fun setMapController(mMapController: IMapController?) { this.mMapController = mMapController } @@ -1231,7 +1224,6 @@ class MapView(context: Context, private val mMapStyleParams: IMapStyleParams, pr //设置刷新帧率 override fun setRenderFps(fps: Int) { m_FPS = fps - } //设置刷新帧率 diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt index 4c1e81750a..7b8e117fc6 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoViewHelper.kt @@ -1,6 +1,7 @@ package com.zhidaoauto.map.sdk.open.view import android.util.Log +import android.view.View import com.autonavi.nge.map.LonLat import com.zhidaoauto.map.data.point.LonLatPoint import com.zhidaoauto.map.sdk.inner.CompileConfig @@ -775,6 +776,10 @@ class MapAutoViewHelper(mapAutoView: MapAutoView) { ?.setPanel(PanelManager.PANEL_WHAT_HID, PanelManager.PANEL_BTN_LOGO) } + fun setVisible(visible:Boolean){ + mMapAutoView.getClerk()?.add() + mMapAutoView.getMapView()?.visibility = if (visible) View.VISIBLE else View.GONE + } /** * 地图截屏 diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt index e8a92d550c..da8852a7c0 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt @@ -327,4 +327,6 @@ interface IMogoMapUIController { */ fun getMapScreenShot() fun setWeatherEnable(enable: Boolean) + + fun setVisible(visible:Boolean) } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt index 78b3717fd5..05c66acba8 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt @@ -951,4 +951,8 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle override fun setWeatherEnable(enable: Boolean) { mMapView.getMapAutoViewHelper()?.setWeatherEnable(enable) } + + override fun setVisible(visible: Boolean) { + mMapView.getMapAutoViewHelper()?.setVisible(visible) + } } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java b/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java index 1ed3d51575..0f7d84edf4 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/identify/MogoIdentifyManager.java @@ -33,7 +33,7 @@ public class MogoIdentifyManager implements IMogoIdentifyManager { @Override public void removeMarker(String uuidString, String mapInstance) { try { - IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(MogoMap.DEFAULT); + IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(mapInstance); if(iMogoMap != null){ iMogoMap.removeMarker(uuidString); } @@ -48,7 +48,7 @@ public class MogoIdentifyManager implements IMogoIdentifyManager { @Override public void updateBatchMarkerPosition(HashMap optionsArrayList, String mapInstance) { try { - IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(MogoMap.DEFAULT); + IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(mapInstance); if(iMogoMap != null){ iMogoMap.updateBatchMarkerPosition(optionsArrayList); } @@ -60,7 +60,7 @@ public class MogoIdentifyManager implements IMogoIdentifyManager { @Override public void updateBatchAiMarkerPosition(HashMap optionsArrayList, String mapInstance) { try { - IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(MogoMap.DEFAULT); + IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(mapInstance); if(iMogoMap != null){ iMogoMap.updateBatchAiMarkerPosition(optionsArrayList); } From c68b1af95603c1ca2bd53ddc6b3ea1fb1f1ee8ef Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 3 Jul 2024 20:50:52 +0800 Subject: [PATCH 6/6] =?UTF-8?q?[6.5.0]=E8=9E=8D=E5=90=88=E7=BA=A2=E7=BB=BF?= =?UTF-8?q?=E7=81=AFUI=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/widget/FusionTrafficLightView.kt | 88 ++++++++++--------- .../hmi/ui/widget/ProportionChartView.java | 5 +- .../layout/hmi_view_fusion_traffic_light.xml | 14 +-- .../hmi_view_fusion_traffic_light_p.xml | 70 +++++++++++++++ .../res/layout/view_traffic_light_prompt.xml | 6 +- .../layout/view_traffic_light_prompt_p.xml | 17 ++-- .../src/main/res/values/dimens.xml | 1 + 7 files changed, 137 insertions(+), 64 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light_p.xml diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt index 5eeae227da..77a32e388a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View +import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import com.mogo.eagle.core.data.enums.DataSourceType @@ -13,14 +14,6 @@ import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightBg -import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightNum -import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightPointer -import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightProportion -import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightScale -import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightState -import java.util.LinkedList - /** * 融合红绿灯View * 鹰眼6.5.0版本需求 @@ -42,6 +35,12 @@ class FusionTrafficLightView @JvmOverloads constructor( private var maxYellowDuration = 0 //黄灯最长时间 private var maxRedDuration = 0 //红灯最长时间 + private var fusionTrafficLightNum: TypefaceTextView ?=null //融合红绿灯倒计时 + private var fusionTrafficLightState: ImageView ?= null //融合红绿灯灯态 + private var fusionTrafficLightScale: ImageView ?= null //融合红绿灯刻度 + private var fusionTrafficLightPointer: ImageView ?= null //融合红绿灯指针 + private var fusionTrafficLightProportion: ProportionChartView ?= null //占比进度条 + init { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.FusionTrafficLightView) @@ -51,13 +50,17 @@ class FusionTrafficLightView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light, this, true) - CallerTrafficLightListenerManager.addListener(TAG, this) if(user == 0){ - fusionTrafficLightBg.setBackgroundResource(R.drawable.bg_fusion_traffic_light) + LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light, this, true) }else{ - fusionTrafficLightBg.setBackgroundResource(R.drawable.bg_fusion_traffic_light_p) + LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light_p, this, true) } + CallerTrafficLightListenerManager.addListener(TAG, this) + fusionTrafficLightNum = findViewById(R.id.fusionTrafficLightNum) + fusionTrafficLightState = findViewById(R.id.fusionTrafficLightState) + fusionTrafficLightScale = findViewById(R.id.fusionTrafficLightScale) + fusionTrafficLightPointer = findViewById(R.id.fusionTrafficLightPointer) + fusionTrafficLightProportion = findViewById(R.id.fusionTrafficLightProportion) } override fun onDetachedFromWindow() { @@ -111,10 +114,10 @@ class FusionTrafficLightView @JvmOverloads constructor( } TrafficLightEnum.YELLOW -> { proportionList.add(1,currentDuration) - if(currentDuration < 3){ - maxYellowDuration = 3 + maxYellowDuration = if(currentDuration < 3){ + 3 }else{ - maxYellowDuration = currentDuration + currentDuration } } else -> { @@ -129,10 +132,10 @@ class FusionTrafficLightView @JvmOverloads constructor( } TrafficLightEnum.YELLOW -> { proportionList.add(1,nextDuration) - if(nextDuration<3){ - maxYellowDuration = 3 + maxYellowDuration = if(nextDuration<3){ + 3 }else{ - maxYellowDuration = nextDuration + nextDuration } } else -> { @@ -147,10 +150,10 @@ class FusionTrafficLightView @JvmOverloads constructor( } TrafficLightEnum.YELLOW -> { proportionList.add(1,nextTwoDuration) - if(nextTwoDuration<3){ - maxYellowDuration = 3 + maxYellowDuration = if(nextTwoDuration<3){ + 3 }else{ - maxYellowDuration = nextTwoDuration + nextTwoDuration } } else -> { @@ -158,48 +161,47 @@ class FusionTrafficLightView @JvmOverloads constructor( maxRedDuration = nextTwoDuration } } - fusionTrafficLightProportion.updateProportion(proportionList) + fusionTrafficLightProportion?.updateProportion(proportionList) totalDuration = maxGreenDuration + maxYellowDuration + maxRedDuration } //根据当前灯态设置转盘、刻度、指针背景 when(currentState){ TrafficLightEnum.GREEN -> { - fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green)) - fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale)) - fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer)) + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer)) } TrafficLightEnum.YELLOW -> { - fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow)) - fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale)) - fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer)) + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer)) } else -> { - fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red)) - fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale)) - fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer)) + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer)) } } //更新当前灯态倒计时时间 if(currentDuration>0){ - fusionTrafficLightNum.text = currentDuration.toString() + fusionTrafficLightNum?.text = currentDuration.toString() }else{ - fusionTrafficLightNum.text = "0" + fusionTrafficLightNum?.text = "0" } //当时间为1开头时时间视觉上看不是左右居中对齐,需要做便宜操作 if(currentDuration.toString().startsWith("1")){ - val numLayoutParams = fusionTrafficLightNum.layoutParams as LayoutParams - numLayoutParams.rightMargin = 10 - fusionTrafficLightNum.layoutParams = numLayoutParams + val numLayoutParams = fusionTrafficLightNum?.layoutParams as LayoutParams + numLayoutParams.rightMargin = 6 + fusionTrafficLightNum?.layoutParams = numLayoutParams }else{ - val numLayoutParams = fusionTrafficLightNum.layoutParams as LayoutParams + val numLayoutParams = fusionTrafficLightNum?.layoutParams as LayoutParams numLayoutParams.rightMargin = 0 - fusionTrafficLightNum.layoutParams = numLayoutParams + fusionTrafficLightNum?.layoutParams = numLayoutParams } //更新指针指向 - val pointerLayoutParams = fusionTrafficLightPointer.layoutParams as LayoutParams - var currentAngle = 0f - currentAngle = when (currentState) { + val pointerLayoutParams = fusionTrafficLightPointer?.layoutParams as LayoutParams + val currentAngle = when (currentState) { TrafficLightEnum.GREEN -> { 360f*(maxGreenDuration-currentDuration)/totalDuration } @@ -213,8 +215,8 @@ class FusionTrafficLightView @JvmOverloads constructor( } } pointerLayoutParams.circleAngle = currentAngle - fusionTrafficLightPointer.rotation = currentAngle - fusionTrafficLightPointer.layoutParams = pointerLayoutParams + fusionTrafficLightPointer?.rotation = currentAngle + fusionTrafficLightPointer?.layoutParams = pointerLayoutParams } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ProportionChartView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ProportionChartView.java index 56c67650ad..71facc3ca9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ProportionChartView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ProportionChartView.java @@ -9,7 +9,6 @@ import android.graphics.Paint; import android.graphics.RectF; import android.graphics.SweepGradient; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import androidx.annotation.Nullable; import com.mogo.eagle.core.function.hmi.R; @@ -132,7 +131,6 @@ public class ProportionChartView extends View { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - Log.i("xuxinchao","onDraw canvas"); drawRingView(canvas); } @@ -140,7 +138,6 @@ public class ProportionChartView extends View { * 画Ring */ private void drawRingView(Canvas canvas){ - Log.i("xuxinchao","drawRingView 画Ring"); float sweepAngle = 0f; float startAngle = -90f; //矩形坐标 @@ -176,7 +173,7 @@ public class ProportionChartView extends View { } mRingPaint.setShader(sweepGradient); //画圆环 - canvas.drawArc(mRectF, startAngle, sweepAngle - 2, false, mRingPaint); + canvas.drawArc(mRectF, startAngle, sweepAngle, false, mRingPaint); } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml index 899b894680..ec37040a26 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light.xml @@ -3,9 +3,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fusionTrafficLightBg" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="@drawable/bg_fusion_traffic_light_p" + android:layout_width="@dimen/dp_200" + android:layout_height="@dimen/dp_200" + android:background="@drawable/bg_fusion_traffic_light" > + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml index b62e693de6..ddf9505f38 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt.xml @@ -35,7 +35,7 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="@id/tvPromptContent" android:layout_marginRight="@dimen/dp_15" - android:textSize="@dimen/sp_40" + android:textSize="@dimen/sp_48" android:textColor="@color/light_prompt_red" app:textType="DS_DIGIB_2" /> @@ -44,8 +44,10 @@ android:id="@+id/tvTrafficNum" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_constraintBottom_toBottomOf="@id/tvTrafficNumDecimal" + app:layout_constraintTop_toTopOf="parent" app:layout_constraintRight_toLeftOf="@id/tvTrafficNumDecimal" + android:layout_marginTop="@dimen/dp_26" + android:layout_marginRight="@dimen/dp_2" android:textSize="@dimen/sp_90" android:textColor="@color/light_prompt_red" app:textType="DS_DIGIB_2" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml index 1eb0ad5102..b7414081e7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p.xml @@ -13,30 +13,31 @@ app:layout_constraintLeft_toLeftOf="parent" android:textSize="@dimen/sp_32" android:textColor="@color/light_prompt_content" - android:layout_marginTop="@dimen/dp_50" - android:layout_marginStart="@dimen/dp_50" + android:layout_marginTop="@dimen/dp_55" + android:layout_marginStart="@dimen/dp_70" /> \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/values/dimens.xml b/core/mogo-core-res/src/main/res/values/dimens.xml index 2bfd230ee7..47d642104f 100644 --- a/core/mogo-core-res/src/main/res/values/dimens.xml +++ b/core/mogo-core-res/src/main/res/values/dimens.xml @@ -1079,6 +1079,7 @@ 48dp 52dp 55dp + 69dp 72dp 76dp 90dp