From cac206263c214a5a5cdda7e05e928d3eefcf9894 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 16 Jun 2025 16:13:31 +0800 Subject: [PATCH 01/23] =?UTF-8?q?[8.1.0]=E4=B9=98=E5=AE=A2=E5=B1=8F?= =?UTF-8?q?=E7=BA=A2=E7=BB=BF=E7=81=AF=E6=B7=BB=E5=8A=A0id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/layout/taxt_u_p_base_fragment.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml index 1f2c632dd0..3cdbe9f38b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml @@ -42,6 +42,7 @@ Date: Mon, 16 Jun 2025 17:03:24 +0800 Subject: [PATCH 02/23] =?UTF-8?q?[8.1.0]=E5=A4=9A=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=A7=E5=88=B6=E5=88=87=E6=8D=A2=E4=B8=BB?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/operate/OperatePanelLayout.kt | 114 ++++++++++-------- 1 file changed, 61 insertions(+), 53 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index ec2a545ec9..2ae530ef25 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -639,54 +639,56 @@ class OperatePanelLayout : LinearLayout { * @param config 数据 */ override fun onCloudConfig(config: MessagePad.CloudConfig) { - //云连接地址 - config.addrsList.forEach { - when(it.type){ - //蘑菇云,暂时用不到 - 0->{ + ThreadUtils.runOnUiThread { + //云连接地址 + config.addrsList.forEach { + when(it.type){ + //蘑菇云,暂时用不到 + 0->{ - } - //NDE云 - 1->{ - when(it.direction){ - //上行和下行 - 0->{ - FunctionBuildConfig.ndeUpwardSwitch = it.enable - FunctionBuildConfig.ndeDownwardSwitch = it.enable - preferenceScreen.findPreferenceReal(NDE_UPWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeUpwardSwitch) } - preferenceScreen.findPreferenceReal(NDE_DOWNWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeDownwardSwitch) } - } - //上行 - 1->{ - FunctionBuildConfig.ndeUpwardSwitch = it.enable - preferenceScreen.findPreferenceReal(NDE_UPWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeUpwardSwitch) } - } - //下行 - 2->{ - FunctionBuildConfig.ndeDownwardSwitch = it.enable - preferenceScreen.findPreferenceReal(NDE_DOWNWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeDownwardSwitch) } + } + //NDE云 + 1->{ + when(it.direction){ + //上行和下行 + 0->{ + FunctionBuildConfig.ndeUpwardSwitch = it.enable + FunctionBuildConfig.ndeDownwardSwitch = it.enable + preferenceScreen.findPreferenceReal(NDE_UPWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeUpwardSwitch) } + preferenceScreen.findPreferenceReal(NDE_DOWNWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeDownwardSwitch) } + } + //上行 + 1->{ + FunctionBuildConfig.ndeUpwardSwitch = it.enable + preferenceScreen.findPreferenceReal(NDE_UPWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeUpwardSwitch) } + } + //下行 + 2->{ + FunctionBuildConfig.ndeDownwardSwitch = it.enable + preferenceScreen.findPreferenceReal(NDE_DOWNWARD_SWITCH)?.also { changeValue(it, FunctionBuildConfig.ndeDownwardSwitch) } + } } } - } - //基础平台云 - 2->{ - when(it.direction){ - //上行和下行 - 0->{ - FunctionBuildConfig.cloudControlUpward = it.enable - FunctionBuildConfig.cloudControlDownward = it.enable - preferenceScreen.findPreferenceReal(CLOUD_CONTROL_UPWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlUpward) } - preferenceScreen.findPreferenceReal(CLOUD_CONTROL_DOWNWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlDownward) } - } - //上行 - 1->{ - FunctionBuildConfig.cloudControlUpward = it.enable - preferenceScreen.findPreferenceReal(CLOUD_CONTROL_UPWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlUpward) } - } - //下行 - 2->{ - FunctionBuildConfig.cloudControlDownward = it.enable - preferenceScreen.findPreferenceReal(CLOUD_CONTROL_DOWNWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlDownward) } + //基础平台云 + 2->{ + when(it.direction){ + //上行和下行 + 0->{ + FunctionBuildConfig.cloudControlUpward = it.enable + FunctionBuildConfig.cloudControlDownward = it.enable + preferenceScreen.findPreferenceReal(CLOUD_CONTROL_UPWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlUpward) } + preferenceScreen.findPreferenceReal(CLOUD_CONTROL_DOWNWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlDownward) } + } + //上行 + 1->{ + FunctionBuildConfig.cloudControlUpward = it.enable + preferenceScreen.findPreferenceReal(CLOUD_CONTROL_UPWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlUpward) } + } + //下行 + 2->{ + FunctionBuildConfig.cloudControlDownward = it.enable + preferenceScreen.findPreferenceReal(CLOUD_CONTROL_DOWNWARD)?.also { changeValue(it, FunctionBuildConfig.cloudControlDownward) } + } } } } @@ -698,7 +700,9 @@ class OperatePanelLayout : LinearLayout { * 查询摄像头上传NDE云状态返回 */ override fun onImgUploadCloudStatusResp(resp: MessagePad.ImgUploadCloudStatusResp) { - preferenceScreen.findPreferenceReal(IMAGE_UPLOAD_SWITCH)?.also { changeValue(it, resp.enable) } + ThreadUtils.runOnUiThread { + preferenceScreen.findPreferenceReal(IMAGE_UPLOAD_SWITCH)?.also { changeValue(it, resp.enable) } + } } /** @@ -707,12 +711,14 @@ class OperatePanelLayout : LinearLayout { * @param adasParam 解析后的配置参数 */ override fun onGetParamResp(getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) { - //融合v2n开关 NDE下行事件数据进pnc - preferenceScreen.findPreferenceReal(NDE_EVENT_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2nToPnc==1) } - //融合v2i开关 V2I下行感知数据进pnc - preferenceScreen.findPreferenceReal(V2I_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2iToPnc==1) } - //NDE下行感知数据进pnc - preferenceScreen.findPreferenceReal(NDE_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.perceptionToPnc==1) } + ThreadUtils.runOnUiThread { + //融合v2n开关 NDE下行事件数据进pnc + preferenceScreen.findPreferenceReal(NDE_EVENT_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2nToPnc==1) } + //融合v2i开关 V2I下行感知数据进pnc + preferenceScreen.findPreferenceReal(V2I_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2iToPnc==1) } + //NDE下行感知数据进pnc + preferenceScreen.findPreferenceReal(NDE_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.perceptionToPnc==1) } + } } /** @@ -720,7 +726,9 @@ class OperatePanelLayout : LinearLayout { * @param enable 数据 */ override fun onObuUploadStatus(enable: MessagePad.SetEnableReq) { - preferenceScreen.findPreferenceReal(OBU_UPWARD_SWITCH)?.also { changeValue(it, enable.enable==1) } + ThreadUtils.runOnUiThread { + preferenceScreen.findPreferenceReal(OBU_UPWARD_SWITCH)?.also { changeValue(it, enable.enable==1) } + } } } From 9eade241a4fdeb743eb8fe35c0eea043f8f1de67 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 16 Jun 2025 17:46:43 +0800 Subject: [PATCH 03/23] =?UTF-8?q?[8.1.0]=E5=A4=9A=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=A7=E5=88=B6=E6=95=B0=E6=8D=AE=E8=BF=9B?= =?UTF-8?q?PNC=E6=B3=A8=E9=87=8A=E6=9F=A5=E8=AF=A2=EF=BC=88PNC=E6=9C=AA?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=AD=A3=E7=A1=AE=E7=8A=B6=E6=80=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/operate/OperatePanelLayout.kt | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index 2ae530ef25..903d33f0fd 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -480,15 +480,15 @@ class OperatePanelLayout : LinearLayout { //关闭事件数据进PNC应用 CallerAutoPilotControlManager.sendNdeDownEventToPnc(0) //查询事件数据进PNC应用 - UiThreadHandler.postDelayed({ - CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) - }, 500) +// UiThreadHandler.postDelayed({ +// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) +// }, 500) //关闭感知数据进PNC应用 CallerAutoPilotControlManager.sendNdeDownPerceptionToPnc(0) //查询感知数据进PNC应用 - UiThreadHandler.postDelayed({ - CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) - }, 500) +// UiThreadHandler.postDelayed({ +// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) +// }, 500) } return true } @@ -502,9 +502,9 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendNdeDownEventToPnc(0) } //查询事件数据进PNC应用 - UiThreadHandler.postDelayed({ - CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) - }, 500) +// UiThreadHandler.postDelayed({ +// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) +// }, 500) hmiAction("事件数据进PNC应用, ", isChecked) clickEventAnalytics("事件数据进PNC应用", isChecked) return true @@ -519,9 +519,9 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendNdeDownPerceptionToPnc(0) } //查询感知数据进PNC应用 - UiThreadHandler.postDelayed({ - CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) - }, 500) +// UiThreadHandler.postDelayed({ +// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) +// }, 500) hmiAction("感知数据进PNC应用, ", isChecked) clickEventAnalytics("感知数据进PNC应用", isChecked) return true @@ -711,14 +711,14 @@ class OperatePanelLayout : LinearLayout { * @param adasParam 解析后的配置参数 */ override fun onGetParamResp(getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) { - ThreadUtils.runOnUiThread { - //融合v2n开关 NDE下行事件数据进pnc - preferenceScreen.findPreferenceReal(NDE_EVENT_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2nToPnc==1) } - //融合v2i开关 V2I下行感知数据进pnc - preferenceScreen.findPreferenceReal(V2I_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2iToPnc==1) } - //NDE下行感知数据进pnc - preferenceScreen.findPreferenceReal(NDE_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.perceptionToPnc==1) } - } +// ThreadUtils.runOnUiThread { +// //融合v2n开关 NDE下行事件数据进pnc +// preferenceScreen.findPreferenceReal(NDE_EVENT_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2nToPnc==1) } +// //融合v2i开关 V2I下行感知数据进pnc +// preferenceScreen.findPreferenceReal(V2I_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2iToPnc==1) } +// //NDE下行感知数据进pnc +// preferenceScreen.findPreferenceReal(NDE_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.perceptionToPnc==1) } +// } } /** From c9efc7bc641eab500e8d727547d399b787d256e5 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 16 Jun 2025 18:20:19 +0800 Subject: [PATCH 04/23] =?UTF-8?q?[8.1.0]=E7=BA=A2=E7=BB=BF=E7=81=AFUI?= =?UTF-8?q?=E8=B0=83=E6=95=B4+=E5=AD=90=E7=BA=BF=E7=A8=8B=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=AB=98=E7=B2=BE=E5=9C=B0=E5=9B=BE=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/hmi/bone/tab/CarInfoTabView.kt | 11 +++++++++-- .../icon_green_light_passenger.png | Bin 13007 -> 10094 bytes .../icon_green_light_pointer_passenger.png | Bin 13362 -> 10423 bytes .../icon_red_light_passenger.png | Bin 10714 -> 5904 bytes .../icon_red_light_pointer_passenger.png | Bin 11277 -> 8958 bytes .../icon_yellow_light_passenger.png | Bin 11031 -> 8769 bytes .../icon_yellow_light_pointer_passenger.png | Bin 11579 -> 8939 bytes .../layout/hmi_view_traffic_light_driver.xml | 1 + .../hmi_view_traffic_light_passenger.xml | 7 +++---- .../main/res/layout/view_map_container.xml | 2 +- 10 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt index d039924888..c7e1ec2a7e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt @@ -54,6 +54,10 @@ import kotlinx.android.synthetic.main.view_car_info_tab.view.tvPADUpdate import kotlinx.android.synthetic.main.view_car_info_tab.view.tvPadVersion import kotlinx.android.synthetic.main.view_car_info_tab.view.tvSlamMapVersion import kotlinx.android.synthetic.main.view_car_info_tab.view.tvSnInfo +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import system_master.SsmInfo import system_master.SystemStatusInfo @@ -106,6 +110,7 @@ class CarInfoTabView @JvmOverloads constructor( CallerMapShowNameManager.removeListener(TAG) } + @OptIn(DelicateCoroutinesApi::class) private fun initView() { val qrCodeView = CallerOchCustomViewManager.getOchBindQRCodeView(context) @@ -182,8 +187,10 @@ class CarInfoTabView @JvmOverloads constructor( } } - MogoData.mogoMapData.get()?.isCityDataCached { - updateHDDataCacheStatus(it) + GlobalScope.launch(Dispatchers.IO){ + MogoData.mogoMapData.get()?.isCityDataCached { + updateHDDataCacheStatus(it) + } } if(FunctionBuildConfig.isOffLine){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_light_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_light_passenger.png index 491098b2f54b6212756e1cdd0bd0550474fd2c5c..1f5952a19fb7fe3254dcfc16ead733b505833dae 100644 GIT binary patch delta 10051 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 Z{{=~Hhx*=cbV>jK002ovPDHLkV1gS4GhzS$ delta 12987 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 x0M#A;9zmV&J};A8B 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 Z#OB!iR*3hJ-2Yn|l$BJHs1-8~{y$pTHs}BV literal 13362 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

jz+_$be{0}#EBCW4#X@T zuD36Mor6?UjZ@lxPy8!xN~iHGc&h-o3KW2~68MCt)o61K)-2lZt#5nmUXK5vjrNp9c*0kv~y8#EM%mh``aua#f#>hPC z9|v59$m^HxR9hq(KHafw;ZtaJnn^*7I>d9zSc))Ic{eqNaIEpNLw0n0(cyQF{m0t^%Z12JCHSLu-^W4E-Z2v=?69PVlUmLQ^dx6vQY4wKx5Sg-_x?;LfO# zZ7O!G?*85ShMGeNdzhhvBnF8qmsu>U7a?3eqw^us#Bg6l^Npvp9L-_fS*R%fiLi;3 z;mxAu!ZxE-5vgt9n8K1$0#{>{TuP$v`k@)eS2KV@eR25f`o}8Yb`Sfl!)Z5@aLWJFCpk* zR$ih_e~31_uSAj=c(F; z+T)tF%wkez0kqsbC)yoxynCj0Pf3s_0+DIlQ9mv>7fYojk+1C-c%7f<-Rv8_K(p|t+PeL#AnDa0YqOuD)R%9h%Ms?u) zUK=9vS7GGEvG-yR&QSW$ilJ1Q#Cc|za+tf1zUJOMq5D)z)unbVUe)=35b_8LM0IQs z><*-rVBl}wr4qp5D;HV9Tg0;@JQu7uW2uur1iy92himvGf!8R?i;|XeUWu?RF_lW5 z0$uoiwji0v0aI<~0?zec|SBw2a!lyT91&YJqwgcI(eoGpi(VkEpaMs8#f8>zJFAw8F3>XmHYp*JlwHZ6iw zee$*Lb=`l0kwn;lGjEq*n;}3&R9yBdj-mA2tN0`bVfU1FU&hhVv(IcFuHibGkrPD} zV_`j_3=%q8q6~ogPMY2?qAe>U*rF4NkdY?g5EbmS`Z^6O<~#HcU#(;zw2YVDyxsacfbl4infTw zQXwi^*ORdkWHeEgu5u%#$Cd;-9aZdNdH3Vczc(p!+s*p?oi$&!hp0K?SDnyv+wLw!uPFI#22xMGVpyVwOqyK z@MCw!#ML0;)Yfu{2l0~jOXGxXU>|!cmAb~-{%9n6a%^aPB}XtrNeGS-G#xm_GQMH! zNOic3OC7kaw@G*m0@KK?O1=)Btc;G2OP zMHq*1t`@T>YY&+lt?@ig3G&g4@7a4t@y-#a-FPN;U^Uhyh#%#odYJ%A^X!ubg~H(PKiFD*c|1jE1;fZXn6~9oMQt= z?cM!*ZM>IT$xjQLblI_U}n2Zt`$*$aK-x-%B1<_k`Tqtk=}1zjwCX=J4x&hB$8qm$Z`*YGZH zB4DL@@43{Hh%>43Dow%9*a*z#%sxBbd)P(?NUT%2?KeSNn$0t<7-~e6wzzH z$XXIYjgym_$Wxb<9kxt1W22*kmYKjEm`2yBF5O$*8fspd-?8A?cq(#^M{xWaLCfX< zAEJGq{af8Wp1}1Omk~Nz0xKqff{qeVp?>Ph?=4J^XIiw*^D}*K;hg#x7j(A#e75%% zO4!&Ou=*eKdkcNNxkTtpH`#;`nEtWf%sG5<=lHLF%4>UE{2o%;QQaM%xMe& zJ_K9f8=U{>Z&wBi6ko&*Qe_H0*W?d_3SX^O6@bq!s>vX_$fmX&$7dpDeE$FQ?aDlX zYdop8zA+{464c9EK9Bc@b6K}^4_hgBfX_h)X9*|e7xn$&lC;_-LKlM(u1njmy&=CU zqL0r~s^@?3_Y9%yOHoH@JFc+Y7zZ_Y75#{Dk&h#) zPajfdyNgQ%uR~^Py$?4Mz82%^g$i(aw-QV%p%o~*_CHn4CfKXlcNM}{H(JGe?f+uC z8i9V4V`dS)PM7v;EBMh?5Txyunx8pWa7oAcnV2cK@K636V8g%EY}*fgkl9Z9O!v(g z1phk1fB*Ar+YboUKjc{Vo2cs0j;L`#OYkS-2eap07*qo IM6N<$f&~fe+W-In diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_red_light_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_red_light_passenger.png index 0b90bd8c3ac5317f73f8400962c01315d2112e67..125fd2acc50e18ca750433d3a8eb625015d5639f 100644 GIT binary patch delta 5828 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 WhxH`zHvgggH&sO~g$g-H*#7|Jrbny* delta 10676 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 I{QwU6Kc&}!<^TWy literal 11277 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 DqL7NI diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_yellow_light_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_yellow_light_passenger.png index 74bd416689311db6f2187bf694c2c820d40a7b32..d69f0fb30710b8b01c46f2ff4f64c352ca020bfe 100644 GIT binary patch delta 8716 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 delta 10995 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 literal 11579 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 From 7dab0e368678e07c5a63f763a0c0133aabaf8f7b Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 4 Jun 2025 16:23:21 +0800 Subject: [PATCH 05/23] =?UTF-8?q?[8.1.0]cherry-pick=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E5=88=86=E6=94=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/ui/homepage/HomeViewModel.kt | 38 ++++++------- app/build.gradle | 2 +- .../identify/MapIdentifySubscriber.kt | 53 +++++++++++++------ .../routeoverlay/PredictionOverlayDrawer.java | 8 +-- .../core/function/view/PredictionMap2View.kt | 2 +- .../core/function/view/PredictionMap3View.kt | 2 +- .../core/function/view/PredictionMapView.kt | 2 +- 7 files changed, 63 insertions(+), 44 deletions(-) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt index 57a84256d6..355b465fd2 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt @@ -41,35 +41,35 @@ class HomeViewModel : ViewModel(), BridgeListener, OrderListener { override fun onTrajectoryHaveData(haveTrajectoryInfos: Boolean) { this.haveTrajectoryInfos = haveTrajectoryInfos -// checkScreenChange() + checkScreenChange() } override fun onPredictionHavaData(havePredictionInfos: Boolean) { this.havePredictionInfos = havePredictionInfos -// checkScreenChange() + checkScreenChange() } override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { this.order = order -// checkScreenChange() + checkScreenChange() } fun checkScreenChange(){ -// CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") -// if(order!=null&&havePredictionInfos&&havePredictionInfos){ -// FunctionBuildConfig.isDrawDecIdentifyData = true -// FunctionBuildConfig.isDrawPreIdentifyData = true -// // 展示三联屏 -// BizLoopManager.runInMainThread{ -// this.viewCallback?.showThreeScreen() -// } -// }else{ -// FunctionBuildConfig.isDrawDecIdentifyData = false -// FunctionBuildConfig.isDrawPreIdentifyData = false -// // 展示二联屏幕 -// BizLoopManager.runInMainThread{ -// this.viewCallback?.showTwoScreen() -// } -// } + CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") + if(order!=null&&havePredictionInfos&&havePredictionInfos){ + FunctionBuildConfig.isDrawDecIdentifyData = true + FunctionBuildConfig.isDrawPreIdentifyData = true + // 展示三联屏 + BizLoopManager.runInMainThread{ + this.viewCallback?.showThreeScreen() + } + }else{ + FunctionBuildConfig.isDrawDecIdentifyData = false + FunctionBuildConfig.isDrawPreIdentifyData = false + // 展示二联屏幕 + BizLoopManager.runInMainThread{ + this.viewCallback?.showTwoScreen() + } + } } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 00ee8f07cc..3043132a3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: ly.count.android.plugins.UploadSymbolsPlugin -apply from: rootProject.file('gradle/bytex/bytex.gradle') +//apply from: rootProject.file('gradle/bytex/bytex.gradle') Properties properties = new Properties() properties.load(project.rootProject.file("gradle.properties").newDataInputStream()) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt index a681a4bdc5..9cbe1714c0 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt @@ -1,6 +1,5 @@ package com.mogo.eagle.core.function.business.identify -import android.util.Log import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.data.map.MogoLocation @@ -9,8 +8,6 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.api.base.IMoGoSubscriber import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuStatusListener import com.mogo.eagle.core.function.business.routeoverlay.PredictionOverlayDrawer -import com.mogo.eagle.core.function.business.routeoverlay.PredictionOverlayDrawer2 -import com.mogo.eagle.core.function.business.routeoverlay.PredictionOverlayDrawer3 import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager.getLocationHeading import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager.getWgs84Lat @@ -19,8 +16,9 @@ import com.mogo.eagle.core.function.call.obu.CallerObuWarningListenerManager import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.map.MogoMap import com.mogo.map.MogoMap.Companion.mapInstance -import com.mogo.map.identify.MogoIdentifyManager import com.mogo.map.utils.LocationUtils +import com.zhjt.mogo.adas.data.Adas.TrackedObjectClassID +import com.zhjt.mogo.adas.data.Adas.TrackedObjectType import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject import mogo.yycp.api.proto.SocketDownData @@ -37,6 +35,21 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, private val TAG = "MapIdentifySubscriber" + private val typeMap: HashMap by lazy { + hashMapOf().apply { + put(TrackedObjectType.TYPE_PEDESTRIAN, TrackedObjectClassID.Person) + put(TrackedObjectType.TYPE_MOTOR, TrackedObjectClassID.MotorCycle) + put(TrackedObjectType.TYPE_BICYCLE, TrackedObjectClassID.Bicycle) + put(TrackedObjectType.TYPE_CAR, TrackedObjectClassID.Car) + put(TrackedObjectType.TYPE_TRUCK, TrackedObjectClassID.Truck) + put(TrackedObjectType.TYPE_BUS, TrackedObjectClassID.Bus) + put(TrackedObjectType.TYPE_WARNINGTRIANGLE, TrackedObjectClassID.WarningTriangle) + put(TrackedObjectType.TYPE_ROADWORK_OCCUPY_0501, TrackedObjectClassID.RoadWork_occupy_0501) + put(TrackedObjectType.TYPE_ROADWORK_BREAK_0502, TrackedObjectClassID.RoadWork_break_0502) + put(TrackedObjectType.TYPE_ROAD_CONGESTION, TrackedObjectClassID.ROAD_CONGESTION) + } + } + init { onCrate() } @@ -102,24 +115,24 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, probability1 = preObj.predictionTrajectoryList[0].predictionProbability probability2 = preObj.predictionTrajectoryList[1].predictionProbability CallerAutopilotIdentifyListenerManager.invokeProbabilityChanged(probability1, probability2) - if (probability1 >= probability2) { - MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP) - largeType = 2 - } else { - MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP) - largeType = 3 - } - PredictionOverlayDrawer2.getInstance().drawPredictionList(carPoiList1, getLocationHeading(), false, 2, largeType) - PredictionOverlayDrawer3.getInstance().drawPredictionList(carPoiList2, getLocationHeading(), false, 3, largeType) - MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP2) - MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP3) +// if (probability1 >= probability2) { +//// MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP) +// largeType = 2 +// } else { +//// MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP) +// largeType = 3 +// } +// PredictionOverlayDrawer2.getInstance().drawPredictionList(carPoiList1, getLocationHeading(), false, 2, largeType) +// PredictionOverlayDrawer3.getInstance().drawPredictionList(carPoiList2, getLocationHeading(), false, 3, largeType) +// MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP2) +// MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP3) } else { - if (preObj.predictionTrajectoryList.isNullOrEmpty() || mogoMap == null) return@forEach + if (preObj.predictionTrajectoryList.isNullOrEmpty() || isUnKnownType(preObj.classtype) || mogoMap == null) return@forEach point = preObj.predictionTrajectoryList[0].trajectoryPointsList[0] arr = mogoMap.switchData(point.x, point.y, false) arr?.let { lonLatArr -> val distance = com.mogo.eagle.core.utilcode.util.LocationUtils.getDistance(getWgs84Lat(), getWgs84Lon(), lonLatArr[1], lonLatArr[0]) - if (distance > 25) return@forEach + if (distance > 30) return@forEach } preObj.predictionTrajectoryList[0].trajectoryPointsList.forEachIndexed { index, point -> if (index > 9 && index % 2 == 0) {// 步长为2,减少点 @@ -140,6 +153,12 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, } } + private fun isUnKnownType(classType: Int): Boolean { + val type: TrackedObjectType = TrackedObjectType.forNumber(classType) ?: return true + var classID: TrackedObjectClassID? = typeMap[type] ?: return true + return false + } + fun renderAiCloudResult(cloudData: List, mapInstance:String = MogoMap.DEFAULT) { try { ThreadUtils.getSinglePool().execute { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java index 560f1d737f..d78b5ab784 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionOverlayDrawer.java @@ -140,15 +140,15 @@ public class PredictionOverlayDrawer { if (mPolylineOptions == null) { builder = new Polyline.Options.Builder("pred_overlay", Level.GUIDE_ROUTE_LINE) .setUseGps(true) - .setWidth(5) + .setWidth(4) .setIsGradient(true); } else { builder = mPolylineOptions.builder(); } - builder.color(Color.rgb(196, 196, 196)); - builder.setIsGradient(false); + builder.color(Color.argb(102,48,163,255)); + builder.setIsGradient(true); builder.setLightOn(false); - builder.setIsDottedLine(false); + builder.setIsDottedLine(true); builder.isShowArrow(false); builder.points(pps); builder.setVisible(true); diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap2View.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap2View.kt index f112f60456..dc643602b3 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap2View.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap2View.kt @@ -116,6 +116,6 @@ class PredictionMap2View(context: Context, attrs: AttributeSet) : MogoMapView(co override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { // 跟新地图控件 -// setExtraGPSData(gnssInfo) + setExtraGPSData(gnssInfo) } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap3View.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap3View.kt index a4496a814d..6e39429da3 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap3View.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMap3View.kt @@ -116,7 +116,7 @@ class PredictionMap3View(context: Context, attrs: AttributeSet) : MogoMapView(co override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { // 跟新地图控件 -// setExtraGPSData(gnssInfo) + setExtraGPSData(gnssInfo) } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMapView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMapView.kt index 704a9d6f1a..b79537ec11 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMapView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionMapView.kt @@ -129,7 +129,7 @@ class PredictionMapView(context: Context, attrs: AttributeSet) : MogoMapView(con override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { // 跟新地图控件 -// setExtraGPSData(gnssInfo) + setExtraGPSData(gnssInfo) if (System.currentTimeMillis() - lastTime >= 5000) { // 预测给的UTM坐标数据没有带上度带信息,根据定位计算度带 mapInstance.getMogoMap(MogoMap.DEFAULT)?.switchData(gnssInfo.longitude, gnssInfo.latitude, true) From d1af40b2c77a621f153998cae4b6c4fe573bd235 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Thu, 12 Jun 2025 17:25:37 +0800 Subject: [PATCH 06/23] =?UTF-8?q?[8.0.2]=E4=BC=98=E5=8C=96=E8=A7=84?= =?UTF-8?q?=E5=88=92=E4=B8=8E=E5=86=B3=E7=AD=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/ui/homepage/HomeView.kt | 13 +- .../src/main/res/layout/taxi_p_home.xml | 42 +- .../eagle/core/function/MapBizProvider.kt | 8 +- .../identify/MapIdentifySubscriber.kt | 16 +- .../routeoverlay/DecisionDataManager.kt | 116 +++ .../routeoverlay/PredictionDataManager.kt | 116 +++ .../function/view/CoordinateAnimationView.kt | 713 ++++++++++++++++++ .../core/function/view/DecisionLayout.kt | 21 - .../res/layout/layout_decision_container.xml | 88 +-- .../src/main/res/values/attrs.xml | 4 + .../core/data/config/FunctionBuildConfig.kt | 2 +- .../IMoGoAutopilotIdentifyListener.kt | 4 + .../CallerAutopilotIdentifyListenerManager.kt | 14 + .../res/drawable-xhdpi/decision_car_icon.png | Bin 0 -> 8488 bytes .../src/main/java/com/mogo/map/IMogoMap.kt | 8 + .../src/main/java/com/mogo/map/AMapWrapper.kt | 26 +- 16 files changed, 1043 insertions(+), 148 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/DecisionDataManager.kt create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt create mode 100644 core/mogo-core-res/src/main/res/drawable-xhdpi/decision_car_icon.png diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt index 4060c0e58e..041376229b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt @@ -24,6 +24,7 @@ import kotlinx.android.synthetic.main.taxi_p_home.view.lbv_go2_center import kotlinx.android.synthetic.main.taxi_p_home.view.leftEndGuideline import kotlinx.android.synthetic.main.taxi_p_home.view.midContainer import kotlinx.android.synthetic.main.taxi_p_home.view.midStartGuideline +import kotlinx.android.synthetic.main.taxi_p_home.view.preContainer class HomeView @JvmOverloads constructor( context: Context, @@ -87,37 +88,37 @@ class HomeView @JvmOverloads constructor( fun onCreate(savedInstanceState: Bundle?) { hdMapView.onCreate(savedInstanceState) -// preContainer.onCreate(savedInstanceState) + preContainer.onCreate(savedInstanceState) // decContainer.onCreate(savedInstanceState) } fun onSaveInstanceState(outState: Bundle) { hdMapView.onSaveInstanceState(outState) -// preContainer.onSaveInstanceState(outState) + preContainer.onSaveInstanceState(outState) // decContainer.onSaveInstanceState(outState) } fun onResume() { hdMapView.onResume() -// preContainer.onResume() + preContainer.onResume() // decContainer.onResume() } fun onLowMemory() { hdMapView.onLowMemory() -// preContainer.onLowMemory() + preContainer.onLowMemory() // decContainer.onLowMemory() } fun onPause() { hdMapView.onPause() -// preContainer.onPause() + preContainer.onPause() // decContainer.onPause() } fun onDestroy() { hdMapView.onDestroy() -// preContainer.onDestroy() + preContainer.onDestroy() // decContainer.onDestroy() } diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml index 002fb38896..840733179f 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml @@ -26,33 +26,31 @@ android:id="@+id/midContainer" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_marginBottom="@dimen/dp_10" - android:visibility="gone" - app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="-6.5dp" android:layout_marginEnd="-6.5dp" + android:layout_marginBottom="@dimen/dp_10" + android:visibility="gone" + app:layout_constraintEnd_toStartOf="@id/rightStartGuideline" app:layout_constraintStart_toEndOf="@+id/midStartGuideline" - app:layout_constraintEnd_toStartOf="@id/rightStartGuideline"> + app:layout_constraintTop_toTopOf="parent"> - - - - - - - - - - - - - - - - - - + + diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt index f8dea9cacb..44d54f6b6e 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt @@ -3,21 +3,19 @@ package com.mogo.eagle.core.function import android.content.Context import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.commons.AbsMogoApplication -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider import com.mogo.eagle.core.function.api.map.roma.IMogoRoma import com.mogo.eagle.core.function.business.MapPointCloudSubscriber -import com.mogo.eagle.core.function.business.SpeedLimitDataManager import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager -import com.mogo.eagle.core.function.business.ai.RomaManager import com.mogo.eagle.core.function.business.ai.RomaManager.Companion.romaManager import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber import com.mogo.eagle.core.function.business.roadcross.RoadCrossCameraManager +import com.mogo.eagle.core.function.business.routeoverlay.DecisionDataManager import com.mogo.eagle.core.function.business.routeoverlay.MogoRouteOverlayManager +import com.mogo.eagle.core.function.business.routeoverlay.PredictionDataManager import com.mogo.eagle.core.function.business.trajectoryoverlay.MogoTrajectoryOverlayManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.map.MapDataWrapper @@ -31,6 +29,8 @@ class MapBizProvider :IMoGoFunctionServerProvider, IMogoRoma { MapDataWrapper.init() MapIdentifySubscriber.instance MogoRouteOverlayManager.getInstance().init() + DecisionDataManager.getInstance() + PredictionDataManager.getInstance() MogoTrajectoryOverlayManager.getInstance().init() MapPointCloudSubscriber.instance RoadCrossCameraManager.instance.init(context) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt index 9cbe1714c0..6c1555cac0 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt @@ -7,6 +7,7 @@ import com.mogo.eagle.core.data.traffic.TrafficData import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.api.base.IMoGoSubscriber import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuStatusListener +import com.mogo.eagle.core.function.business.routeoverlay.PredictionDataManager import com.mogo.eagle.core.function.business.routeoverlay.PredictionOverlayDrawer import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager.getLocationHeading @@ -108,24 +109,15 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, if (preObj.predictionTrajectoryList == null || preObj.predictionTrajectoryList.size < 2) return@forEach carPoiList1 = preObj.predictionTrajectoryList[0].trajectoryPointsList carPoiList2 = preObj.predictionTrajectoryList[1].trajectoryPointsList - val largeType: Int location1 = LocationUtils.generateLocation(carPoiList1!![0].x, carPoiList1!![0].y, getLocationHeading()) location2 = LocationUtils.generateLocation(carPoiList2!![0].x, carPoiList2!![0].y, getLocationHeading()) if (location1 == null || location2 == null) return@forEach probability1 = preObj.predictionTrajectoryList[0].predictionProbability probability2 = preObj.predictionTrajectoryList[1].predictionProbability CallerAutopilotIdentifyListenerManager.invokeProbabilityChanged(probability1, probability2) -// if (probability1 >= probability2) { -//// MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP) -// largeType = 2 -// } else { -//// MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP) -// largeType = 3 -// } -// PredictionOverlayDrawer2.getInstance().drawPredictionList(carPoiList1, getLocationHeading(), false, 2, largeType) -// PredictionOverlayDrawer3.getInstance().drawPredictionList(carPoiList2, getLocationHeading(), false, 3, largeType) -// MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP2) -// MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP3) + + PredictionDataManager.getInstance()?.updateData(carPoiList1!!, 0) + PredictionDataManager.getInstance()?.updateData(carPoiList2!!, 2) } else { if (preObj.predictionTrajectoryList.isNullOrEmpty() || isUnKnownType(preObj.classtype) || mogoMap == null) return@forEach point = preObj.predictionTrajectoryList[0].trajectoryPointsList[0] diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/DecisionDataManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/DecisionDataManager.kt new file mode 100644 index 0000000000..04d64fcc27 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/DecisionDataManager.kt @@ -0,0 +1,116 @@ +package com.mogo.eagle.core.function.business.routeoverlay + +import android.os.Handler +import android.os.HandlerThread +import android.os.Looper +import android.os.Message +import android.util.Log +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningTrajectoryListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningTrajectoryListenerManager +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.map.MogoMap +import com.mogo.map.MogoMap.Companion.mapInstance +import mogo.telematics.pad.MessagePad + +class DecisionDataManager private constructor() : IMoGoPlanningTrajectoryListener { + + companion object { + private const val TAG = "DecisionDataManager" + private const val MSG_DATA_POINTS = 0 + private const val MSG_CHECK = 1 + + @Volatile + private var sInstance: DecisionDataManager? = null + fun getInstance(): DecisionDataManager? { + if (sInstance == null) { + synchronized(DecisionDataManager::class.java) { + if (sInstance == null) { + sInstance = DecisionDataManager() + } + } + } + return sInstance + } + } + + private var frequentHandler: FrequentHandler? = null + + private var lastUpdateTime = 0L + + init { + val frequentThread = HandlerThread("decision_thread") + frequentThread.start() + frequentHandler = FrequentHandler(frequentThread.looper) + frequentHandler?.sendEmptyMessageDelayed(MSG_CHECK, 1000) + CallerPlanningTrajectoryListenerManager.addListener(TAG, this) + } + + private fun updateData(data: FloatArray) { + frequentHandler?.removeMessages(MSG_DATA_POINTS) + val message = Message.obtain() + message.what = MSG_DATA_POINTS + message.obj = data + frequentHandler?.sendMessage(message) + } + + fun release() { + } + + private inner class FrequentHandler(looper: Looper) : Handler(looper) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + when (msg.what) { + MSG_DATA_POINTS -> { + lastUpdateTime = System.currentTimeMillis() + CallerAutopilotIdentifyListenerManager.invokeScreenPointsChanged(msg.obj as FloatArray) + } + MSG_CHECK -> { + val time = System.currentTimeMillis() + if (lastUpdateTime > 0 && time - lastUpdateTime >= 1000) { + CallerAutopilotIdentifyListenerManager.invokeScreenPointsChanged(floatArrayOf()) + } + sendEmptyMessageDelayed(MSG_CHECK, 1000) + } + } + } + } + + override fun onAutopilotTrajectory(trajectoryInfos: MutableList) { + ThreadUtils.getCpuPool().execute { + val mogoMap = mapInstance.getMogoMap(MogoMap.DEFAULT) + mogoMap?.let { map -> + val lonLatList = ArrayList() + trajectoryInfos.forEach { + map.toScreenLocation(it.longitude, it.latitude)?.let { point -> + lonLatList.add(point) + Log.d(TAG, "转换后的屏幕坐标为:(${point.x},${point.y})") + } + } + if (lonLatList.size > 0) { + val points = FloatArray(lonLatList.size * 2) + var x = 0f + var y = 0f + var offset = 0f + for (i in 0 until lonLatList.size) { + x = lonLatList[i].x * 238 / 808.toFloat() + points[i * 2] = x + + // TODO:需要根据UI布局而变化,成比例缩放(高精地图返回的y轴是镜像的,需要在y轴方向上翻转一下) + // float yB = heightB - (yA * (heightB / heightA)); + // yB = 480 - (yA * 480 / 1300) + y = (458 + 14 - lonLatList[i].y * 458 / 1300).toFloat() + if (i == 0) { + offset = 357 - y// carBitmapTop等于height * 0.78,offset = carBitmapTop - 1stY + } + points[i * 2 + 1] = y + offset + Log.d(TAG, "转换后的屏幕坐标为:(${x},${y})") + } + updateData(points) + } else { + updateData(floatArrayOf()) + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt new file mode 100644 index 0000000000..07b9736c4d --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt @@ -0,0 +1,116 @@ +package com.mogo.eagle.core.function.business.routeoverlay + +import android.os.Handler +import android.os.HandlerThread +import android.os.Looper +import android.os.Message +import android.util.Log +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.map.MogoMap +import com.mogo.map.MogoMap.Companion.mapInstance + +class PredictionDataManager private constructor() { + + companion object { + private const val TAG = "PredictionDataManager" + private const val MSG_CHECK = 0 + private const val MSG_DATA_POINTS_0 = 1 + private const val MSG_DATA_POINTS_1 = 2 + + @Volatile + private var sInstance: PredictionDataManager? = null + fun getInstance(): PredictionDataManager? { + if (sInstance == null) { + synchronized(PredictionDataManager::class.java) { + if (sInstance == null) { + sInstance = PredictionDataManager() + } + } + } + return sInstance + } + } + + private var frequentHandler: FrequentHandler? = null + + private var lastUpdateTime = 0L + + init { + val frequentThread = HandlerThread("prediction_thread") + frequentThread.start() + frequentHandler = FrequentHandler(frequentThread.looper) + frequentHandler?.sendEmptyMessageDelayed(MSG_CHECK, 1000) + } + + fun updateData(dataList: List, index: Int = 0) { + val type = if (index == 0) MSG_DATA_POINTS_0 else MSG_DATA_POINTS_1 + frequentHandler?.removeMessages(type) + val message = Message.obtain() + message.what = type + message.obj = dataList + frequentHandler?.sendMessage(message) + } + + fun release() { + } + + private inner class FrequentHandler(looper: Looper) : Handler(looper) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + when (msg.what) { + MSG_DATA_POINTS_0, MSG_DATA_POINTS_1 -> { + val list = getDataList(msg.obj) + lastUpdateTime = System.currentTimeMillis() + CallerAutopilotIdentifyListenerManager.invokePreScrPointsChanged(list, if (msg.what == MSG_DATA_POINTS_0) 0 else 2) + } + MSG_CHECK -> { + val time = System.currentTimeMillis() + if (lastUpdateTime > 0 && time - lastUpdateTime >= 1000) { + CallerAutopilotIdentifyListenerManager.invokePreScrPointsChanged(floatArrayOf(), 0) + CallerAutopilotIdentifyListenerManager.invokePreScrPointsChanged(floatArrayOf(), 2) + } + sendEmptyMessageDelayed(MSG_CHECK, 1000) + } + } + } + + private fun getDataList(obj: Any): FloatArray { + val mogoMap = mapInstance.getMogoMap(MogoMap.DEFAULT) ?: return floatArrayOf() + val list = obj as List + val lonLatList = ArrayList() + var arr: DoubleArray? + var point: android.graphics.Point? + list.forEach { + arr = mogoMap.switchData(it.x, it.y, false)// UTM转wgs84 + if (arr == null || arr!!.size < 2) return@forEach + point = mogoMap.toScreenLocation(arr!![0], arr!![1])// wgs84转屏幕坐标 + if (point == null) return@forEach + lonLatList.add(point!!) + Log.d(TAG, "预测数据的屏幕坐标为:(${point!!.x},${point!!.y})") + } + if (lonLatList.size > 0) { + val points = FloatArray(lonLatList.size * 2) + var x = 0f + var y = 0f + var offset = 0f + for (i in 0 until lonLatList.size) { + x = lonLatList[i].x * 238 / 808.toFloat() + points[i * 2] = x + + // TODO:需要根据UI布局而变化,成比例缩放(高精地图返回的y轴是镜像的,需要在y轴方向上翻转一下) + // float yB = heightB - (yA * (heightB / heightA)); + // yB = 480 - (yA * 480 / 1300) + y = (458 + 14 - lonLatList[i].y * 458 / 1300).toFloat() + if (i == 0) { + offset = 357 - y// carBitmapTop等于height * 0.78,offset = carBitmapTop - 1stY + } + points[i * 2 + 1] = y + offset + Log.d(TAG, "预测数据转换后的屏幕坐标为:(${x},${y})") + } + return points + } else { + return floatArrayOf() + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt new file mode 100644 index 0000000000..f1c4aad045 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt @@ -0,0 +1,713 @@ +package com.mogo.eagle.core.function.view + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.DashPathEffect +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF +import android.util.AttributeSet +import android.util.Log +import android.view.SurfaceHolder +import android.view.SurfaceView +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.map.R +import me.jessyan.autosize.utils.AutoSizeUtils +import kotlin.math.min + +class CoordinateAnimationView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null +) : + SurfaceView(context, attrs), SurfaceHolder.Callback, IMoGoAutopilotIdentifyListener { + + companion object { + private const val TAG = "CoordinateAnimationView" + + private const val UPDATE_INTERVAL = 1000 // 数据更新间隔(ms) + private const val MAX_POINTS = 500 // 最大点数 + private const val BUFFER_SIZE = MAX_POINTS * 2 // x,y坐标交替存储 + private const val FPS = 25 + } + + private var surfaceHolder: SurfaceHolder? = null + private var animationThread: AnimationThread? = null + + private var bufferA: Array? = null + private var bufferB: Array? = null + private var controlPoints: FloatArray? = null // 控制点缓冲区 + private var activePointCount = 0 + + @Volatile + private var activeBufferIndex = 0 + + @Volatile + private var drawingBufferIndex = 0 + + private var lastUpdateTime: Long = 0 + private var costTime: Long = 0 + private var fpsInterval: Int = 1000 / FPS + + @Volatile + private var dataChanged = false // 数据变化标志 + + @Volatile + private var isRunning = false + private var bezierPath: Path? = null // 贝塞尔曲线路径 + private var curvePaint: Paint? = null + private var carPaint: Paint? = null + + // private var circlePaint: Paint? = null + private var visibleRect: RectF? = null // 可见区域 + private var strokeWidth = 22f + + private var carBitmap: Bitmap? = null + + // 虚线相关参数 + private val DASH_LENGTH: Float = 46f // 虚线线段长度 + private val DASH_GAP: Float = 80f // 虚线间隔 + private val DASH_SPEED: Float = 8f // 虚线移动速度 + private var dashOffsetY = 0f // 虚线Y轴偏移量 + private var dashStrokeWidth = 3.6f + private var dashPaint: Paint? = null // 虚线画笔 + + private val leftPath by lazy { + Path() + } + + private val rightPath by lazy { + Path() + } + + private var index: Int = 1 + + init { + init(attrs) + } + + private fun init(attrs: AttributeSet?) { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CoordinateAnimationView) + index = typedArray.getInt(R.styleable.CoordinateAnimationView_map_index, 1) + typedArray.recycle() + Log.d(TAG, "初始化地图的index为:${index}") + + surfaceHolder = holder + surfaceHolder!!.addCallback(this) + + curvePaint = Paint() + carPaint = Paint() + carPaint!!.isFilterBitmap = false + carPaint!!.isAntiAlias = true + carBitmap = getOriginBitmap( + R.drawable.decision_car_icon, + AutoSizeUtils.dp2px(context, 128f), + AutoSizeUtils.dp2px(context, 280f) + ) +// circlePaint = Paint() +// circlePaint!!.color = Color.RED +// circlePaint!!.style = Paint.Style.STROKE +// circlePaint!!.isAntiAlias = true + + curvePaint!!.setARGB(102, 48, 163, 255) +// curvePaint!!.shader = LinearGradient( +// 50f, 100f, 750f, 100f, +// intArrayOf(0x0FFF0000, 0xFF00FF00.toInt(), 0x0F0000FF), +// floatArrayOf(0f, 0.5f, 1f), +// Shader.TileMode.CLAMP +// ) + curvePaint!!.style = Paint.Style.STROKE + curvePaint!!.strokeWidth = strokeWidth + // 一定要设置抗锯齿,否则画贝塞尔曲线时会出现很多白色分割线 + curvePaint!!.isAntiAlias = true + // 线段连接处为圆弧 + curvePaint!!.strokeJoin = Paint.Join.ROUND + // 设置线冒样式 + curvePaint!!.strokeCap = Paint.Cap.SQUARE + + // 初始化虚线 + dashPaint = Paint() + dashPaint!!.setColor(Color.WHITE) + dashPaint!!.style = Paint.Style.STROKE + dashPaint!!.strokeWidth = dashStrokeWidth + dashPaint!!.isAntiAlias = true + dashPaint!!.pathEffect = DashPathEffect(floatArrayOf(DASH_LENGTH, DASH_GAP), 0f) + + bufferA = arrayOfNulls(MAX_POINTS) + bufferB = arrayOfNulls(MAX_POINTS) + + for (i in 0 until MAX_POINTS) { + bufferA!![i] = Point() + bufferB!![i] = Point() + } + + bezierPath = Path() + dataChanged = false + controlPoints = FloatArray(MAX_POINTS * 4)// 按照三阶贝塞尔曲线来创建 + visibleRect = RectF() + + // 启用硬件加速 + setLayerType(LAYER_TYPE_HARDWARE, null) + } + + private fun getOriginBitmap(resId: Int, desWidth: Int, desHeight: Int): Bitmap { + val bitmap = BitmapFactory.decodeResource(resources, resId) + val scaleWidth = (bitmap.width * 1.6).toInt() + val scaleHeight = (bitmap.height * 1.6).toInt() + Log.d(TAG, "$index-Bitmap width:$scaleWidth,height:$scaleHeight") + return Bitmap.createScaledBitmap( + bitmap, scaleWidth, + scaleHeight, true + ) + +// val options = BitmapFactory.Options() +// options.inJustDecodeBounds = true +// BitmapFactory.decodeResource(resources, resId, options) +// var inSampleSize = 1 +// if (options.outHeight > desHeight || options.outWidth > desWidth) { +// while ((options.outHeight / 2 / inSampleSize) >= desHeight && (options.outWidth / inSampleSize) >= desWidth) { +// inSampleSize *= 2// 每次翻倍,保证是 2 的幂次 +// } +// } +// options.inJustDecodeBounds = false +// options.inSampleSize = inSampleSize +// return BitmapFactory.decodeResource(resources, resId, options) + } + + override fun surfaceCreated(holder: SurfaceHolder) { + animationThread = AnimationThread() + animationThread!!.start() + isRunning = true + CallerAutopilotIdentifyListenerManager.addListener("${TAG}${this.hashCode()}", this) + } + + override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { + val margin = strokeWidth * 2 + // 处理Surface尺寸变化 + visibleRect!!.set(margin, margin, width - margin, height - margin) + } + + override fun surfaceDestroyed(holder: SurfaceHolder) { + isRunning = false + var retry = true + while (retry) { + try { + animationThread!!.join() + retry = false + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + CallerAutopilotIdentifyListenerManager.removeListener("${TAG}${this.hashCode()}") + carBitmap?.recycle() + carBitmap = null + bufferA = null + bufferB = null + controlPoints = null + } + + override fun screenPointsChanged(data: FloatArray, index: Int) { + if (index == this.index) { + updatePoints(data) + } + } + + override fun preScrPointsChanged(data: FloatArray, index: Int) { + if (index == this.index) { + updatePoints(data) + } + } + + private fun updatePoints(newPoints: FloatArray) { + if (!isRunning) { + Log.d(TAG, "$index-渲染线程未启动") + return + } + if (bufferA == null || bufferB == null) { + Log.d(TAG, "$index-updatePoints->缓冲区未初始化完成!") + return + } + // 获取可用缓冲区 + val targetBuffer: Array = if ((drawingBufferIndex == 0)) bufferB!! else bufferA!! + + // 重置目标缓冲区 + for (i in 0 until MAX_POINTS) { + targetBuffer[i]?.reset() + } + + // 填充新数据(不能超过最大点数) + val count = min(newPoints.size / 2, MAX_POINTS) + var p: Point? + for (i in 0 until count) { + p = targetBuffer[i] + p?.set(newPoints[i * 2], newPoints[i * 2 + 1]) + } + + activePointCount = count + activeBufferIndex = if (drawingBufferIndex == 0) 1 else 0 + dataChanged = true + + Log.d(TAG, "$index-数据已更新!") + } + + private fun drawMovingDashedPath(canvas: Canvas?) { + if (canvas == null) { + Log.d(TAG, "$index-画布为null!") + return + } + Log.d(TAG, "$index-开始绘制虚线!") + leftPath.rewind() + rightPath.rewind() + + // 两条虚线的X坐标(左右对称) + val leftLineX = width * 0.2f + val rightLineX = width * 0.8f + + // 计算当前虚线的偏移量(取模运算确保在一个周期内) + val offset = dashOffsetY % (DASH_LENGTH + DASH_GAP) + + // 绘制多条虚线线段,确保覆盖整个屏幕 + var y = offset + var endY = 0f + while (y < height + DASH_LENGTH + DASH_GAP) { + endY = min(y + DASH_LENGTH, height.toFloat()) + + leftPath.moveTo(leftLineX, y) + leftPath.lineTo(leftLineX, endY) + rightPath.moveTo(rightLineX, y) + rightPath.lineTo(rightLineX, endY) + + y += DASH_LENGTH + DASH_GAP// 步长 + } + canvas.drawPath(leftPath, dashPaint!!) + canvas.drawPath(rightPath, dashPaint!!) + + // 更新虚线偏移量 + dashOffsetY += DASH_SPEED + if (dashOffsetY > DASH_LENGTH + DASH_GAP) { + dashOffsetY -= (DASH_LENGTH + DASH_GAP) + } + } + + private fun drawCar(canvas: Canvas?) { + if (canvas == null) { + Log.d(TAG, "$index-画布为null!") + return + } + canvas.drawBitmap(carBitmap!!, (width - carBitmap!!.width) / 2f, height * 0.78f, carPaint!!) + } + + private fun drawPath(canvas: Canvas?) { + if (canvas == null) { + Log.d(TAG, "$index-画布为null!") + return + } + // 获取当前活跃的缓冲区 + val currentBuffer = if (activeBufferIndex == 0) bufferA else bufferB + drawingBufferIndex = activeBufferIndex + + // 绘制轨迹 + if (dataChanged) { + bezierPath?.rewind() + if (activePointCount > 0) { + // 计算贝塞尔曲线的控制点(二阶贝塞尔曲线性能更好) +// calculateControlPoints(currentBuffer, activePointCount, controlPoints!!) + calculateControlPoints2ndKind(currentBuffer, activePointCount, controlPoints!!) + + // 使用可见区域裁剪的贝塞尔曲线 +// drawClippedBezierPath(currentBuffer, activePointCount, controlPoints!!) + drawClippedBezier2ndKindPath(currentBuffer, activePointCount, controlPoints!!) + } + dataChanged = false + } else { + Log.d(TAG, "$index-数据未更新:${dataChanged}或无有效的点:${activePointCount}") + } + // 绘制贝塞尔曲线 + canvas.drawPath(bezierPath!!, curvePaint!!) + Log.d(TAG, "=====$index-渲染贝塞尔曲线完成!=====") + +// if (currentBuffer == null) { +// Log.d(TAG, "currentBuffer未初始化完成!") +// return +// } +// canvas.drawCircle(currentBuffer[0]!!.x, currentBuffer[0]!!.y, 30f, circlePaint!!) + } + + // 绘制可见区域内的贝塞尔曲线 + private fun drawClippedBezierPath( + points: Array?, + count: Int, + controlPoints: FloatArray + ) { + if (points.isNullOrEmpty()) { + Log.d(TAG, "$index-贝塞尔曲线点的个数为空,返回!") + return + } + var isFirstPoint = true + var wasLastPointVisible = false + var p: Point? + var nextPoint: Point? + var currentPointVisible = false + var nextPointVisible = false + var controlIndex: Int + var x: Float + var y: Float + var nextX: Float + var nextY: Float + var intersection: FloatArray? + + for (i in 0 until count - 1) { + p = points[i] + nextPoint = points[i + 1] + if (p == null || nextPoint == null) continue + x = p.x + y = p.y + nextX = nextPoint.x + nextY = nextPoint.y + + // 检查当前点和下一个点是否在可见区域内 + currentPointVisible = isPointVisible(x, y) + nextPointVisible = isPointVisible(nextX, nextY) + controlIndex = i * 2 + // 处理可见性变化 + if (currentPointVisible || nextPointVisible) { + // 如果是第一个可见点,移动到该点 + if (isFirstPoint) { + bezierPath!!.moveTo(x, y) + isFirstPoint = false + } + // 如果当前点和下一个点都可见,直接连接 + if (currentPointVisible && nextPointVisible) { + bezierPath!!.cubicTo( + controlPoints[controlIndex], controlPoints[controlIndex + 1], + controlPoints[controlIndex + 2], controlPoints[controlIndex + 3], + nextX, nextY + ) + } else if (currentPointVisible && !nextPointVisible) { +// intersection = findIntersection(x, y, nextX, nextY) +// if (intersection != null) { +// bezierPath!!.lineTo(intersection[0], intersection[1]) +// } + bezierPath!!.cubicTo( + controlPoints[controlIndex], controlPoints[controlIndex + 1], + controlPoints[controlIndex + 2], controlPoints[controlIndex + 3], + nextX, nextY + ) + } else if (!currentPointVisible && nextPointVisible) { +// intersection = findIntersection(nextX, nextY, x, y) +// if (intersection != null) { +// bezierPath!!.moveTo(intersection[0], intersection[1]) +// bezierPath!!.cubicTo( +// controlPoints[controlIndex], controlPoints[controlIndex + 1], +// controlPoints[controlIndex + 2], controlPoints[controlIndex + 3], +// nextX, nextY +// ) +// } + bezierPath!!.cubicTo( + controlPoints[controlIndex], controlPoints[controlIndex + 1], + controlPoints[controlIndex + 2], controlPoints[controlIndex + 3], + nextX, nextY + ) + } + wasLastPointVisible = true + } else { + // 如果连续不可见点,重置路径状态 + if (wasLastPointVisible) { + isFirstPoint = true + } + wasLastPointVisible = false + } + } + } + + // 计算贝塞尔曲线的控制点 + private fun calculateControlPoints( + points: Array?, + count: Int, + controlPoints: FloatArray + ) { + if (count < 3 || points.isNullOrEmpty()) { + Log.d(TAG, "$index-点的个数小于3,无法绘制贝塞尔曲线!") + return// 至少需要3个点才能计算控制点 + } + var prev: Point? + var current: Point? + var next: Point? + var controlIndex: Int + // 使用相邻点的中点作为控制点 + for (i in 1 until count - 1) { + prev = points[i - 1] + current = points[i] + next = points[i + 1] + controlIndex = i * 2 + if (current == null || prev == null || next == null) continue + + // 第一个控制点:当前点和前一个点的中点 + controlPoints[controlIndex] = (current.x + prev.x) / 2 + controlPoints[controlIndex + 1] = (current.y + prev.y) / 2 + + // 第二个控制点:当前点和下一个点的中点 + controlPoints[controlIndex + 2] = (current.x + next.x) / 2 + controlPoints[controlIndex + 3] = (current.y + next.y) / 2 + } + if (points[0] == null || points[count - 2] == null) return + // 特殊处理第一个和最后一个控制点 + controlPoints[0] = points[0]!!.x + controlPoints[1] = points[0]!!.y + + val lastIndex = (count - 2) * 2 + controlPoints[lastIndex] = points[count - 2]!!.x + controlPoints[lastIndex + 1] = points[count - 2]!!.y + } + + // 计算二阶贝塞尔曲线的控制点 + private fun calculateControlPoints2ndKind( + points: Array?, + count: Int, + controlPoints: FloatArray + ) { + if (count < 2 || points.isNullOrEmpty()) return // 至少需要2个点才能计算控制点 + var current: Point? + var next: Point? + var controlIndex: Int + var dx: Float + var dy: Float + // 简单算法:使用相邻点的中点作为控制点 + for (i in 0 until count - 1) { + current = points[i] + next = points[i + 1] + if (current == null || next == null) continue + controlIndex = i * 2 + + // 控制点:当前点和下一个点之间的中点,增加一定偏移使曲线更平滑 + dx = next.x - current.x + dy = next.y - current.y + + // 控制点位置 = 中点 + 一定比例的方向向量(使曲线更平滑) + controlPoints[controlIndex] = current.x + dx * 0.5f + controlPoints[controlIndex + 1] = current.y + dy * 0.5f + } + } + + /** + * 绘制可见区域内的二阶贝塞尔曲线 + */ + private fun drawClippedBezier2ndKindPath( + points: Array?, + count: Int, + controlPoints: FloatArray + ) { + if (points.isNullOrEmpty()) { + Log.d(TAG, "$index-贝塞尔曲线点的个数为空,返回!") + return + } + var isFirstPoint = true + var wasLastPointVisible = false +// var hasPath = false + + var p: Point? + var nextPoint: Point? + for (i in 0 until count - 1) { + p = points[i] + nextPoint = points[i + 1] + if (p == null || nextPoint == null) continue + val x = p.x + val y = p.y + val nextX = nextPoint.x + val nextY = nextPoint.y + + // 检查当前点和下一个点是否在可见区域内 + val currentPointVisible = isPointVisible(x, y) + val nextPointVisible = isPointVisible(nextX, nextY) + + // 处理可见性变化 + if (currentPointVisible || nextPointVisible) { + // 如果是第一个可见点,移动到该点 + if (isFirstPoint) { +// bezierPath!!.moveTo(x-strokeWidth/4, y) + bezierPath!!.moveTo(x, y) + isFirstPoint = false +// hasPath = true + } + + // 如果当前点和下一个点都可见,直接连接 + if (currentPointVisible && nextPointVisible) { + // 使用二阶贝塞尔曲线:quadTo方法(控制点x, 控制点y, 终点x, 终点y) + bezierPath!!.quadTo( + controlPoints[i * 2], controlPoints[i * 2 + 1], + nextX, nextY + ) +// hasPath = true + } else if (currentPointVisible && !nextPointVisible) { +// val intersection = findIntersection(x, y, nextX, nextY) +// if (intersection != null) { +// bezierPath!!.lineTo(intersection[0], intersection[1]) +//// hasPath = true +// } + bezierPath!!.lineTo( + controlPoints[i * 2], controlPoints[i * 2 + 1], + ) + } else if (!currentPointVisible && nextPointVisible) { +// val intersection = findIntersection(nextX, nextY, x, y) +// if (intersection != null) { +// bezierPath!!.moveTo(intersection[0], intersection[1]) +// // 绘制二阶贝塞尔曲线 +// val controlIndex = i * 2 +// bezierPath!!.quadTo( +// controlPoints[controlIndex], controlPoints[controlIndex + 1], +// nextX, nextY +// ) +//// hasPath = true +// } + bezierPath!!.lineTo( + controlPoints[i * 2], controlPoints[i * 2 + 1], + ) + } + wasLastPointVisible = true + } else { + // 如果连续不可见点,重置路径状态 + if (wasLastPointVisible) { + isFirstPoint = true + } + wasLastPointVisible = false + } + } +// if (count > 1 && hasPath) { +// val lastPoint = points[count - 1] ?: return +// val endX = lastPoint.x +// val endY = lastPoint.y +// +// // 添加一个微小的延伸,确保终点形状为方形 +// if (isPointVisible(endX, endY)) { +// bezierPath!!.lineTo(endX + strokeWidth / 4, endY) +// } +// } + Log.d(TAG, "=======$index-绘制二阶贝塞尔曲线完成=======!") + } + + /** + * 绘制二阶贝塞尔曲线 + */ + private fun drawBezierPath2ndKind(count: Int) { + + Log.d(TAG, "=======$index-绘制二阶贝塞尔曲线完成=======!") + } + + // 检查点是否在可见区域内(考虑线宽) + private fun isPointVisible(x: Float, y: Float): Boolean { + val extraMargin = strokeWidth / 2 + return visibleRect!!.contains(x, y) || + visibleRect!!.let { + it.inset(-extraMargin, -extraMargin)// 扩大(使用负数)边界以考虑线宽 + it.contains(x, y) + } + } + + // 计算线段与可见区域的交点 + private fun findIntersection(x1: Float, y1: Float, x2: Float, y2: Float): FloatArray? { +// // 简化版:只检查线段与可见区域边界的交点 +// // 实际应用中可能需要更复杂的贝塞尔曲线与矩形的交点计算 +// +// // 检查与左边界的交点 +// if ((x1 < visibleRect!!.left && x2 >= visibleRect!!.left) || +// (x1 >= visibleRect!!.left && x2 < visibleRect!!.left) +// ) { +// val t = (visibleRect!!.left - x1) / (x2 - x1) +// val y = y1 + t * (y2 - y1) +// if (y >= visibleRect!!.top && y <= visibleRect!!.bottom) { +// return floatArrayOf(visibleRect!!.left, y) +// } +// } +// +// // 检查与右边界的交点 +// if ((x1 < visibleRect!!.right && x2 >= visibleRect!!.right) || +// (x1 >= visibleRect!!.right && x2 < visibleRect!!.right) +// ) { +// val t = (visibleRect!!.right - x1) / (x2 - x1) +// val y = y1 + t * (y2 - y1) +// if (y >= visibleRect!!.top && y <= visibleRect!!.bottom) { +// return floatArrayOf(visibleRect!!.right, y) +// } +// } +// +// // 检查与上边界的交点 +// if ((y1 < visibleRect!!.top && y2 >= visibleRect!!.top) || +// (y1 >= visibleRect!!.top && y2 < visibleRect!!.top) +// ) { +// val t = (visibleRect!!.top - y1) / (y2 - y1) +// val x = x1 + t * (x2 - x1) +// if (x >= visibleRect!!.left && x <= visibleRect!!.right) { +// return floatArrayOf(x, visibleRect!!.top) +// } +// } +// +// // 检查与下边界的交点 +// if ((y1 < visibleRect!!.bottom && y2 >= visibleRect!!.bottom) || +// (y1 >= visibleRect!!.bottom && y2 < visibleRect!!.bottom) +// ) { +// val t = (visibleRect!!.bottom - y1) / (y2 - y1) +// val x = x1 + t * (x2 - x1) +// if (x >= visibleRect!!.left && x <= visibleRect!!.right) { +// return floatArrayOf(x, visibleRect!!.bottom) +// } +// } + + return null // 没有交点 + } + + private inner class AnimationThread : Thread() { + override fun run() { + var canvas: Canvas? + lastUpdateTime = System.currentTimeMillis() + + while (isRunning) { + canvas = null + try { + canvas = surfaceHolder!!.lockCanvas() + synchronized(surfaceHolder!!) { + // 绘制 + Log.d(TAG, "$index-准备绘制!") + // 清屏 + canvas?.drawColor(Color.rgb(231, 235, 238)) + drawMovingDashedPath(canvas) + drawPath(canvas) + drawCar(canvas) + } + } finally { + if (canvas != null) { + surfaceHolder!!.unlockCanvasAndPost(canvas) + } + } + + try { + costTime = fpsInterval - System.currentTimeMillis() + lastUpdateTime + if (costTime > 0) { + sleep(costTime) + } + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } + } + + // 轨迹点对象(可复用) + class Point { + var x: Float = 0f + var y: Float = 0f + var isActive: Boolean = false + + fun set(x: Float, y: Float) { + this.x = x + this.y = y + this.isActive = true + } + + fun reset() { + this.isActive = false + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt index d241c16476..f62c20d56f 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt @@ -10,9 +10,6 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.map.R import com.mogo.eagle.core.utilcode.util.ThreadUtils -import kotlinx.android.synthetic.main.layout_decision_container.view.decMapView -import kotlinx.android.synthetic.main.layout_decision_container.view.preDetailView2 -import kotlinx.android.synthetic.main.layout_decision_container.view.preDetailView3 import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre1 import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre2 import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre3 @@ -39,21 +36,12 @@ class DecisionLayout @JvmOverloads constructor( } fun onCreate(savedInstanceState: Bundle?) { - decMapView.onCreate(savedInstanceState) - preDetailView2.onCreate(savedInstanceState) - preDetailView3.onCreate(savedInstanceState) } fun onSaveInstanceState(outState: Bundle) { - decMapView.onSaveInstanceState(outState) - preDetailView2.onSaveInstanceState(outState) - preDetailView3.onSaveInstanceState(outState) } fun onResume() { - decMapView.onResume() - preDetailView2.onResume() - preDetailView3.onResume() } @SuppressLint("SetTextI18n") @@ -81,20 +69,11 @@ class DecisionLayout @JvmOverloads constructor( } fun onLowMemory() { - decMapView.onLowMemory() - preDetailView2.onLowMemory() - preDetailView3.onLowMemory() } fun onPause() { - decMapView.onPause() - preDetailView2.onPause() - preDetailView3.onPause() } fun onDestroy() { - decMapView.onDestroy() - preDetailView2.onDestroy() - preDetailView3.onDestroy() } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_decision_container.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_decision_container.xml index bab05abb53..9556fd75c3 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_decision_container.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_decision_container.xml @@ -6,7 +6,7 @@ android:layout_height="match_parent" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> - + app:map_index="0" + /> - + app:map_index="1" + /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + app:map_index="2" + /> + + + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index dd1c8f58a3..09e721b832 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -236,7 +236,7 @@ object FunctionBuildConfig { */ @Volatile @JvmField - var isDrawPreIdentifyData = false + var isDrawPreIdentifyData = true /** * 地图是否绘制决策数据的Marker diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt index 444b62c551..93743b7a90 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotIdentifyListener.kt @@ -61,4 +61,8 @@ interface IMoGoAutopilotIdentifyListener { fun onAutopilotV2nCongestionEvent(header: MessagePad.Header, rsi: MogoV2X.RSI_PB) {} fun onPredictionProbabilityChanged(pro1: Float, pro2: Float) {} + + fun screenPointsChanged(data: FloatArray, index: Int = 1) {} + + fun preScrPointsChanged(data: FloatArray, index: Int = 0) {} } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt index c87b8e9974..dc10c87ca2 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotIdentifyListenerManager.kt @@ -73,4 +73,18 @@ object CallerAutopilotIdentifyListenerManager : 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: List + + fun toScreenLocation(lon: Double, lat: Double): android.graphics.Point? } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt index 381be25bcb..d3a4d4fb54 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.kt @@ -12,6 +12,7 @@ import com.mogo.map.overlay.wrapper.point.AMapPointWrapper import com.mogo.map.uicontroller.IMogoMapUIController import com.mogo.map.utils.ObjectUtils import com.zhidaoauto.map.data.point.LonLatPoint +import com.zhidaoauto.map.sdk.open.common.tools.MapTools import com.zhidaoauto.map.sdk.open.renders.marker.BatchMarkerOptions import com.zhidaoauto.map.sdk.open.renders.marker.Marker import com.zhidaoauto.map.sdk.open.renders.marker.MarkerOptions @@ -75,7 +76,8 @@ class AMapWrapper(map: MapAutoViewHelper?, mapView: MapAutoView, controller: IMo } val markerOptions = MarkerOptions(options.id, mMapView.getMapController()).setGps(true) .position(LonLatPoint(options.longitude, options.latitude, options.rotate.toDouble())) - val marker = Marker(markerOptions,mMapView.getMapController(), + val marker = Marker( + markerOptions, mMapView.getMapController(), mMapView.getMapController()?.getMarkerCall() ) marker.setDisplayAnimEnable(options.displayAnim) @@ -93,8 +95,8 @@ class AMapWrapper(map: MapAutoViewHelper?, mapView: MapAutoView, controller: IMo return null } if (options.isFilledIn) { - val delegate = mAMap?.drawPolygon(polylineOptions) - return AMapPolylineWrapper(options.id, delegate, mMapView) + val delegate = mAMap?.drawPolygon(polylineOptions) + return AMapPolylineWrapper(options.id, delegate, mMapView) } else { val delegate = (if (polylineOptions.lineWidth > 0) mAMap?.drawThickLine(polylineOptions) else mAMap?.drawLine( @@ -244,4 +246,22 @@ class AMapWrapper(map: MapAutoViewHelper?, mapView: MapAutoView, controller: IMo override fun switchData(x: Double, y: Double, isWgs84: Boolean): DoubleArray? { return mAMap?.switchData(x, y, isWgs84) } + + override fun toScreenLocations(data: List): List { + return MapTools.toScreenLocations(data, mMapView.getMapController()) + } + + override fun toScreenLocation(lon: Double, lat: Double): android.graphics.Point? { + val controller = mMapView.getMapController() + if (controller == null) { + return null + } else { + val pixel = controller.lonlatToPixels(lon, lat) + return if (pixel == null) { + null + } else { + android.graphics.Point(pixel.x.toInt(), pixel.y.toInt()) + } + } + } } \ No newline at end of file From abb4ed32992ad7a0218cec8fed2aabf8fbdc0927 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Fri, 13 Jun 2025 17:11:18 +0800 Subject: [PATCH 07/23] =?UTF-8?q?[8.0.2]=E8=A7=84=E5=88=92=E4=B8=8E?= =?UTF-8?q?=E5=86=B3=E7=AD=96=E5=8A=9F=E8=83=BD=E7=9A=84UI=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E8=BF=9B=E8=A1=8C=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/ui/homepage/HomeViewModel.kt | 2 +- .../identify/MapIdentifySubscriber.kt | 20 ++++--- .../routeoverlay/PredictionDataManager.kt | 9 ++-- .../function/view/CoordinateAnimationView.kt | 53 ++++++++++++------- .../layout/layout_prediction_container.xml | 24 --------- .../core/data/config/FunctionBuildConfig.kt | 2 +- .../java/com/mogo/map/utils/ObjectUtils.java | 33 +++++++----- 7 files changed, 76 insertions(+), 67 deletions(-) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt index 355b465fd2..fcd3470973 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt @@ -54,7 +54,7 @@ class HomeViewModel : ViewModel(), BridgeListener, OrderListener { checkScreenChange() } - fun checkScreenChange(){ + private fun checkScreenChange(){ CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") if(order!=null&&havePredictionInfos&&havePredictionInfos){ FunctionBuildConfig.isDrawDecIdentifyData = true diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt index 6c1555cac0..e5c942f89b 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt @@ -119,15 +119,15 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, PredictionDataManager.getInstance()?.updateData(carPoiList1!!, 0) PredictionDataManager.getInstance()?.updateData(carPoiList2!!, 2) } else { - if (preObj.predictionTrajectoryList.isNullOrEmpty() || isUnKnownType(preObj.classtype) || mogoMap == null) return@forEach + if (isUnKnownType(preObj.classtype) || preObj.predictionTrajectoryList.isNullOrEmpty() || mogoMap == null) return@forEach point = preObj.predictionTrajectoryList[0].trajectoryPointsList[0] arr = mogoMap.switchData(point.x, point.y, false) arr?.let { lonLatArr -> val distance = com.mogo.eagle.core.utilcode.util.LocationUtils.getDistance(getWgs84Lat(), getWgs84Lon(), lonLatArr[1], lonLatArr[0]) - if (distance > 30) return@forEach + if (distance > 28) return@forEach } preObj.predictionTrajectoryList[0].trajectoryPointsList.forEachIndexed { index, point -> - if (index > 9 && index % 2 == 0) {// 步长为2,减少点 + if (index in 0..44 && index % 2 == 0) {// 步长为2,减少点 arr = mogoMap.switchData(point.x, point.y, false) arr?.let { lonLatArr -> points.add(MogoLatLng(lonLatArr[1], lonLatArr[0])) @@ -146,9 +146,17 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, } private fun isUnKnownType(classType: Int): Boolean { - val type: TrackedObjectType = TrackedObjectType.forNumber(classType) ?: return true - var classID: TrackedObjectClassID? = typeMap[type] ?: return true - return false + val type: TrackedObjectType? = TrackedObjectType.forNumber(classType) + return when (type) { + null, TrackedObjectType.TYPE_UNKNOWN, TrackedObjectType.TYPE_UNKNOWN_SMALL, + TrackedObjectType.TYPE_UNKNOWN_BIG, TrackedObjectType.TYPE_UNKNOWN_STATIC, + TrackedObjectType.TYPE_UNKNOWN_DYNAMIC, TrackedObjectType.UNRECOGNIZED -> { + true + } + else -> { + false + } + } } fun renderAiCloudResult(cloudData: List, mapInstance:String = MogoMap.DEFAULT) { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt index 07b9736c4d..d2ebb603bf 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/PredictionDataManager.kt @@ -80,11 +80,12 @@ class PredictionDataManager private constructor() { val lonLatList = ArrayList() var arr: DoubleArray? var point: android.graphics.Point? - list.forEach { - arr = mogoMap.switchData(it.x, it.y, false)// UTM转wgs84 - if (arr == null || arr!!.size < 2) return@forEach + list.forEachIndexed { index, poi -> + if (index > 45) return@forEachIndexed + arr = mogoMap.switchData(poi.x, poi.y, false)// UTM转wgs84 + if (arr == null || arr!!.size < 2) return@forEachIndexed point = mogoMap.toScreenLocation(arr!![0], arr!![1])// wgs84转屏幕坐标 - if (point == null) return@forEach + if (point == null) return@forEachIndexed lonLatList.add(point!!) Log.d(TAG, "预测数据的屏幕坐标为:(${point!!.x},${point!!.y})") } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt index f1c4aad045..81b31ee817 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt @@ -13,6 +13,7 @@ import android.util.AttributeSet import android.util.Log import android.view.SurfaceHolder import android.view.SurfaceView +import android.view.View import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.map.R @@ -57,13 +58,15 @@ class CoordinateAnimationView @JvmOverloads constructor( @Volatile private var isRunning = false + @Volatile + private var isVisible = false private var bezierPath: Path? = null // 贝塞尔曲线路径 private var curvePaint: Paint? = null private var carPaint: Paint? = null // private var circlePaint: Paint? = null private var visibleRect: RectF? = null // 可见区域 - private var strokeWidth = 22f + private var strokeWidth = 16f private var carBitmap: Bitmap? = null @@ -155,8 +158,8 @@ class CoordinateAnimationView @JvmOverloads constructor( private fun getOriginBitmap(resId: Int, desWidth: Int, desHeight: Int): Bitmap { val bitmap = BitmapFactory.decodeResource(resources, resId) - val scaleWidth = (bitmap.width * 1.6).toInt() - val scaleHeight = (bitmap.height * 1.6).toInt() + val scaleWidth = (bitmap.width * 2) + val scaleHeight = (bitmap.height * 2) Log.d(TAG, "$index-Bitmap width:$scaleWidth,height:$scaleHeight") return Bitmap.createScaledBitmap( bitmap, scaleWidth, @@ -177,6 +180,10 @@ class CoordinateAnimationView @JvmOverloads constructor( // return BitmapFactory.decodeResource(resources, resId, options) } + fun setVisible(isVisible: Boolean) { + this.isVisible = isVisible + } + override fun surfaceCreated(holder: SurfaceHolder) { animationThread = AnimationThread() animationThread!!.start() @@ -209,6 +216,14 @@ class CoordinateAnimationView @JvmOverloads constructor( controlPoints = null } + override fun onVisibilityChanged(changedView: View, visibility: Int) { + super.onVisibilityChanged(changedView, visibility) + val name = changedView.javaClass.simpleName + if (name == TAG || name == "ConstraintLayout") { + isVisible = visibility == View.VISIBLE + } + } + override fun screenPointsChanged(data: FloatArray, index: Int) { if (index == this.index) { updatePoints(data) @@ -664,21 +679,23 @@ class CoordinateAnimationView @JvmOverloads constructor( lastUpdateTime = System.currentTimeMillis() while (isRunning) { - canvas = null - try { - canvas = surfaceHolder!!.lockCanvas() - synchronized(surfaceHolder!!) { - // 绘制 - Log.d(TAG, "$index-准备绘制!") - // 清屏 - canvas?.drawColor(Color.rgb(231, 235, 238)) - drawMovingDashedPath(canvas) - drawPath(canvas) - drawCar(canvas) - } - } finally { - if (canvas != null) { - surfaceHolder!!.unlockCanvasAndPost(canvas) + if (isVisible) { + canvas = null + try { + canvas = surfaceHolder!!.lockCanvas() + synchronized(surfaceHolder!!) { + // 绘制 + Log.d(TAG, "$index-准备绘制!") + // 清屏 + canvas?.drawColor(Color.rgb(231, 235, 238)) + drawMovingDashedPath(canvas) + drawPath(canvas) + drawCar(canvas) + } + } finally { + if (canvas != null) { + surfaceHolder!!.unlockCanvasAndPost(canvas) + } } } diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_prediction_container.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_prediction_container.xml index 9c3b13b693..e54dea85ab 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_prediction_container.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_prediction_container.xml @@ -6,30 +6,6 @@ android:layout_height="match_parent" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> - - - - - - - - - - - - - - - - - - - - - - - - sTypeMap = Map.of(//最低得JDK9,注意换成new HashMap<> -// Adas.TrackedObjectType.TYPE_PEDESTRIAN, Adas.TrackedObjectClassID.Person, -// Adas.TrackedObjectType.TYPE_MOTOR, Adas.TrackedObjectClassID.MotorCycle, -// Adas.TrackedObjectType.TYPE_BICYCLE, Adas.TrackedObjectClassID.Bicycle, -// Adas.TrackedObjectType.TYPE_CAR, Adas.TrackedObjectClassID.Car, -// Adas.TrackedObjectType.TYPE_TRUCK, Adas.TrackedObjectClassID.Truck, -// Adas.TrackedObjectType.TYPE_BUS, Adas.TrackedObjectClassID.Bus, -// Adas.TrackedObjectType.TYPE_WARNINGTRIANGLE, Adas.TrackedObjectClassID.WarningTriangle, -// Adas.TrackedObjectType.TYPE_ROADWORK_OCCUPY_0501, Adas.TrackedObjectClassID.RoadWork_occupy_0501, -// Adas.TrackedObjectType.TYPE_ROADWORK_BREAK_0502, Adas.TrackedObjectClassID.RoadWork_break_0502, -// Adas.TrackedObjectType.TYPE_ROAD_CONGESTION, Adas.TrackedObjectClassID.ROAD_CONGESTION -// ); + private static final Map sTypeMap = new HashMap<>(); + + static { + // 初始化类型映射 + sTypeMap.put(Adas.TrackedObjectType.TYPE_PEDESTRIAN, Adas.TrackedObjectClassID.Person); + sTypeMap.put(Adas.TrackedObjectType.TYPE_MOTOR, Adas.TrackedObjectClassID.MotorCycle); + sTypeMap.put(Adas.TrackedObjectType.TYPE_BICYCLE, Adas.TrackedObjectClassID.Bicycle); + sTypeMap.put(Adas.TrackedObjectType.TYPE_CAR, Adas.TrackedObjectClassID.Car); + sTypeMap.put(Adas.TrackedObjectType.TYPE_TRUCK, Adas.TrackedObjectClassID.Truck); + sTypeMap.put(Adas.TrackedObjectType.TYPE_BUS, Adas.TrackedObjectClassID.Bus); + sTypeMap.put(Adas.TrackedObjectType.TYPE_WARNINGTRIANGLE, Adas.TrackedObjectClassID.WarningTriangle); + sTypeMap.put(Adas.TrackedObjectType.TYPE_ROADWORK_OCCUPY_0501, Adas.TrackedObjectClassID.RoadWork_occupy_0501); + sTypeMap.put(Adas.TrackedObjectType.TYPE_ROADWORK_BREAK_0502, Adas.TrackedObjectClassID.RoadWork_break_0502); + sTypeMap.put(Adas.TrackedObjectType.TYPE_ROAD_CONGESTION, Adas.TrackedObjectClassID.ROAD_CONGESTION); + } public static MarkerOptions fromMogo(Point.Options opt, MapAutoView mapAutoView) { @@ -226,7 +230,10 @@ public class ObjectUtils { if (type == null) { type = Adas.TrackedObjectType.TYPE_UNKNOWN; } - Adas.TrackedObjectClassID classID = Adas.TrackedObjectClassID.Unknown; + Adas.TrackedObjectClassID classID = sTypeMap.get(type); + if (classID == null) { + classID = Adas.TrackedObjectClassID.Unknown; + } return classID.getNumber(); } From 157ab16b4d1cd16125c02771f5117fe06412d517 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 4 Jun 2025 16:23:21 +0800 Subject: [PATCH 08/23] =?UTF-8?q?[8.0.2][opt]=E6=92=A4=E9=94=80=E8=AF=AF?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3043132a3f..00ee8f07cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: ly.count.android.plugins.UploadSymbolsPlugin -//apply from: rootProject.file('gradle/bytex/bytex.gradle') +apply from: rootProject.file('gradle/bytex/bytex.gradle') Properties properties = new Properties() properties.load(project.rootProject.file("gradle.properties").newDataInputStream()) From ae836ca84710d1b8b59925ee05e2be4dde506e45 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 16 Jun 2025 20:02:27 +0800 Subject: [PATCH 09/23] =?UTF-8?q?[8.1.0][feat]=E4=BC=98=E5=8C=96=E5=86=B3?= =?UTF-8?q?=E7=AD=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/presenter/PM2ADASPresenter.kt | 18 ++++ .../b2/layout/shuttle_p_m2_hpmap_fragment.xml | 16 ++-- .../passenger/ui/homepage/HomeViewModel.kt | 2 +- .../routeoverlay/DecisionDataManager.kt | 26 ++++-- .../routeoverlay/PredictionDataManager.kt | 25 +++-- .../function/view/CoordinateAnimationView.kt | 10 ++ .../core/function/view/DecisionLayout.kt | 23 ++++- .../eagle/core/function/view/MapBizView.kt | 5 + .../core/function/view/PredictionLayout.kt | 15 ++- .../layout/layout_b2_decision_container.xml | 93 +++++++++++++++++++ .../layout/layout_b2_prediction_container.xml | 35 +++++++ .../src/main/res/values/attrs.xml | 7 ++ 12 files changed, 249 insertions(+), 26 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml create mode 100644 core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt index ae43e866a0..7781ff15d1 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt @@ -3,6 +3,7 @@ package com.mogo.och.shuttle.weaknet.passenger.presenter import androidx.lifecycle.LifecycleOwner import com.amap.api.maps.model.LatLng import com.mogo.commons.mvp.Presenter +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.common.module.biz.birdge.BridgeListener @@ -184,25 +185,30 @@ class PM2ADASPresenter(view: PM2HPMapFragment?) : if(haveLine){// 有订单 if(arrived){//展示高德地图 if(aiMessageShowmagic){ + updateMapFlag(false) // 展示高德地图+展示mogomind mView?.showAmap_mind() return@runInMainThread }else{ + updateMapFlag(false) // 展示高德地图 mView?.showAmap() return@runInMainThread } }else{// 展示高精地图 if(aiMessageShowmagic){ + updateMapFlag(false) // 展示高精地图 mView?.showHDMap_mind() return@runInMainThread }else{ if(havePredictionInfos&&haveTrajectoryInfos){ + updateMapFlag(true) // 展示高精地图+展示预测和决策 mView?.showHDMap_aip_prediction() return@runInMainThread }else{ + updateMapFlag(false) // 展示高精地图 mView?.showHDMap() return@runInMainThread @@ -212,13 +218,25 @@ class PM2ADASPresenter(view: PM2HPMapFragment?) : } }else{// 没有订单 if(aiMessageShowmagic){// 有mogomind 消息 + updateMapFlag(false) // 展示高精地图+mogoMind mView?.showHDMap_mind() }else{ + updateMapFlag(false) // 展示高精地图 mView?.showHDMap() } } } } + + private fun updateMapFlag(open: Boolean) { +// if (open) { +// FunctionBuildConfig.isDrawDecIdentifyData = true +// FunctionBuildConfig.isDrawPreIdentifyData = true +// } else { +// FunctionBuildConfig.isDrawDecIdentifyData = false +// FunctionBuildConfig.isDrawPreIdentifyData = false +// } + } } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml index 1030224196..26ddd954ef 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml @@ -51,9 +51,8 @@ android:layout_width="@dimen/dp_430" android:layout_height="@dimen/dp_650"/> - - + android:layout_height="@dimen/dp_332" + app:car_type="B2" /> - + android:layout_height="@dimen/dp_332" + app:car_type="B2" + /> LayoutInflater.from(context).inflate(R.layout.layout_decision_container, this, true) + else -> LayoutInflater.from(context).inflate(R.layout.layout_b2_decision_container, this, true) + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() CallerAutopilotIdentifyListenerManager.addListener(TAG, this) } + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerAutopilotIdentifyListenerManager.removeListener(TAG) + } + fun onCreate(savedInstanceState: Bundle?) { } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt index ccda7886ad..bb2c9ed3b9 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/MapBizView.kt @@ -3,15 +3,20 @@ package com.mogo.eagle.core.function.view import android.content.Context import android.os.Bundle import android.util.AttributeSet +import android.util.Log import androidx.lifecycle.LifecycleObserver import chassis.Chassis import com.mogo.eagle.core.data.config.FunctionBuildConfig.accThreshold import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisStatesListener +import com.mogo.eagle.core.function.business.routeoverlay.DecisionDataManager +import com.mogo.eagle.core.function.business.routeoverlay.PredictionDataManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisStatesListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.view.CoordinateAnimationView.Companion +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider import com.mogo.map.MogoMap import com.mogo.map.MogoMapView diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt index bcc2e5595a..92eb717fe6 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt @@ -12,13 +12,22 @@ class PredictionLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : ConstraintLayout(context, attrs) { + + private var carType = 0 + init { LayoutInflater.from(context).inflate(R.layout.layout_prediction_container, this, true) - initView() + initView(attrs) } - private fun initView() { - + private fun initView(attrs: AttributeSet?) { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CarMapLayout) + carType = typedArray.getInt(R.styleable.CarMapLayout_car_type, 0) + typedArray.recycle() + when (carType) { + 0 -> LayoutInflater.from(context).inflate(R.layout.layout_prediction_container, this, true) + else -> LayoutInflater.from(context).inflate(R.layout.layout_b2_prediction_container, this, true) + } } fun onCreate(savedInstanceState: Bundle?) { diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml new file mode 100644 index 0000000000..f0e085b467 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml new file mode 100644 index 0000000000..1c2106bf51 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml @@ -0,0 +1,35 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml index 245195f992..be76c98da4 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml @@ -80,4 +80,11 @@ + + + + + /> + + \ No newline at end of file From 1dd95623a5882d60f01e1bbb70e3fc1d8696be1e Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 17 Jun 2025 11:14:13 +0800 Subject: [PATCH 10/23] =?UTF-8?q?logo=20=E8=BF=9B=E5=85=A5=E8=B0=83?= =?UTF-8?q?=E8=AF=95=20=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weaknet/passenger/ui/statusbar/M2StatusBarView.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt index 2ddd3bc7c1..7c9afd8069 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt @@ -9,6 +9,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import chassis.ChassisStatesOuterClass import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisStatesListener import com.mogo.eagle.core.function.call.autopilot.CallerChassisStatesListenerManager +import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.ClickUtils @@ -47,6 +48,12 @@ class M2StatusBarView @JvmOverloads constructor( setBackgroundColor(ResourcesUtils.getColor(R.color.white)) isClickable = true isFocusable = true + iv_logon.setOnLongClickListener { + context?.let { + ToggleDebugView.toggleDebugView.toggle(it) + } + true + } } From 039ce42e4616b8cd280eb3b3ae46e69f6adf420a Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Tue, 17 Jun 2025 11:53:23 +0800 Subject: [PATCH 11/23] =?UTF-8?q?[8.1.0][opt]=E8=B0=83=E6=95=B4B2=E9=A2=84?= =?UTF-8?q?=E6=B5=8B=E5=92=8C=E5=86=B3=E7=AD=96=E7=9A=84UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/presenter/PM2ADASPresenter.kt | 14 ++--- .../business/identify/IdentifyFactory.kt | 51 ++++++++++++++++++- .../core/function/view/DecisionLayout.kt | 27 ++++++++++ .../core/function/view/PredictionLayout.kt | 1 - .../layout/layout_b2_decision_container.xml | 33 ++++++------ .../layout/layout_b2_prediction_container.xml | 13 ++--- 6 files changed, 107 insertions(+), 32 deletions(-) diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt index 7781ff15d1..29fb9842f2 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt @@ -231,12 +231,12 @@ class PM2ADASPresenter(view: PM2HPMapFragment?) : } private fun updateMapFlag(open: Boolean) { -// if (open) { -// FunctionBuildConfig.isDrawDecIdentifyData = true -// FunctionBuildConfig.isDrawPreIdentifyData = true -// } else { -// FunctionBuildConfig.isDrawDecIdentifyData = false -// FunctionBuildConfig.isDrawPreIdentifyData = false -// } + if (open) { + FunctionBuildConfig.isDrawDecIdentifyData = true + FunctionBuildConfig.isDrawPreIdentifyData = true + } else { + FunctionBuildConfig.isDrawDecIdentifyData = false + FunctionBuildConfig.isDrawPreIdentifyData = false + } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt index a63c633aa1..32f4f56a5c 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.business.identify import android.os.Handler import android.os.Message +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.traffic.TrafficData import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener @@ -9,10 +10,12 @@ import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningListenerManager import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler +import com.mogo.map.MogoMap import com.zhjt.service.chain.ChainLog import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject import mogo.yycp.api.proto.SocketDownData +import prediction2025.Prediction2025 import java.util.concurrent.TimeUnit object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConfigListener { @@ -28,9 +31,21 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf internal val aiCloudDataDrawer = IdentifyAiCloudDataDrawer() } + // 预测 + object PreDriverIdentify { + internal val preDataDrawer = IdentifyOriginDataDrawer() + } + private var identify: Identify = DriverIdentify.originDataDrawer private var aiCloudIdentify: Identify? = null + + // 预测 + private var preIdentify: Identify = PreDriverIdentify.preDataDrawer + private var startTime: Long = 0L + + // private var preStartTime: Long = 0L +// private var desStartTime: Long = 0L private var dockerVersion: String? = null fun initType() { @@ -51,6 +66,8 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf private const val MSG_DATA_OBU_WARNING_REMOVE = 4 private const val MSG_DATA_CLEAR = 5 private const val MSG_DATA_AI_CLEAR = 6 + private const val MSG_DATA_PRE_TRACK = 7 + private const val MSG_DATA_PRE_CLEAR = 8 // 维护一个线程定时轮询数据进行地图绘制 private val mDrawerHandler: Handler = @@ -68,13 +85,20 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf if (internal >= 1000) { lostFrame(internal.toString()) identify.clearOldMarker() + preIdentify.clearOldMarker() } sendEmptyMessageDelayed(MSG_CHECK, 1000L) } MSG_DATA_TRACK -> { if (msg.obj is List<*>) { - identify.renderAdasRecognizedResult(msg.obj as List?) + val objectList = msg.obj as List? + val mapInstanceList = ArrayList() + mapInstanceList.add(MogoMap.DEFAULT) + if (FunctionBuildConfig.isDrawPreIdentifyData) { + mapInstanceList.add(MogoMap.SMALL_PRED_MAP) + } + identify.renderAdasRegResults(objectList, mapInstanceList) startTime = System.nanoTime() } } @@ -88,6 +112,9 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf } } + MSG_DATA_PRE_TRACK -> { + } + MSG_DATA_WARNING -> { if (msg.obj is List<*>) { identify.renderPlanningWarningObj(msg.obj as List?) @@ -107,12 +134,19 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf } MSG_DATA_CLEAR -> { - identify.clearOldMarker() + val mapInstanceList = ArrayList() + mapInstanceList.add(MogoMap.DEFAULT) + mapInstanceList.add(MogoMap.SMALL_PRED_MAP) + identify.clearOldMarkers(mapInstanceList) } MSG_DATA_AI_CLEAR -> { aiCloudIdentify!!.clearAiMarker(msg.data.getString("mapInstance")!!) } + + MSG_DATA_PRE_CLEAR -> { + preIdentify.clearPredictionMarker(MogoMap.SMALL_PRED_MAP) + } } } } @@ -124,6 +158,13 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf mDrawerHandler.sendMessage(message) } + override fun renderPredictionResult(predictionObjectList: List?) { + val message = Message.obtain() + message.what = MSG_DATA_PRE_TRACK + message.obj = predictionObjectList + mDrawerHandler.sendMessage(message) + } + override fun renderAiCloudResult( resultList: List, mapInstance: String @@ -155,6 +196,12 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf mDrawerHandler.sendMessage(message) } + override fun clearPredictionMarker(mapInstance: String) { + val message = Message.obtain() + message.what = MSG_DATA_PRE_CLEAR + mDrawerHandler.sendMessage(message) + } + override fun updateTrackerWarningInfo(trafficData: TrafficData) { super.updateTrackerWarningInfo(trafficData) val message = Message.obtain() diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt index ecde6d6bfe..e75318fb4f 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/DecisionLayout.kt @@ -7,12 +7,16 @@ import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.business.routeoverlay.DecisionDataManager +import com.mogo.eagle.core.function.business.routeoverlay.PredictionDataManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.map.R import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre1 import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre2 import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre3 +import me.jessyan.autosize.utils.AutoSizeUtils class DecisionLayout @JvmOverloads constructor( context: Context, @@ -40,6 +44,7 @@ class DecisionLayout @JvmOverloads constructor( 0 -> LayoutInflater.from(context).inflate(R.layout.layout_decision_container, this, true) else -> LayoutInflater.from(context).inflate(R.layout.layout_b2_decision_container, this, true) } + storeWidthAndHeight() } override fun onAttachedToWindow() { @@ -93,4 +98,26 @@ class DecisionLayout @JvmOverloads constructor( fun onDestroy() { } + + private fun storeWidthAndHeight() { + UiThreadHandler.post { + when (carType) { + // 默认值为对应0,不需要赋值 + 1 -> { + val decWid = AutoSizeUtils.dp2px(context, 110f) + val decHet = AutoSizeUtils.dp2px(context, 211f) + val mapWid = AutoSizeUtils.dp2px(context, 996f) + val mapHet = AutoSizeUtils.dp2px(context, 650f) + PredictionDataManager.getInstance()?.decWidth = decWid + PredictionDataManager.getInstance()?.decHeight = decHet + PredictionDataManager.getInstance()?.mapWidth = mapWid + PredictionDataManager.getInstance()?.mapHeight = mapHet + DecisionDataManager.getInstance()?.decWidth = decWid + DecisionDataManager.getInstance()?.decHeight = decHet + DecisionDataManager.getInstance()?.mapWidth = mapWid + DecisionDataManager.getInstance()?.mapHeight = mapHet + } + } + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt index 92eb717fe6..41cfa3db5f 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt @@ -16,7 +16,6 @@ class PredictionLayout @JvmOverloads constructor( private var carType = 0 init { - LayoutInflater.from(context).inflate(R.layout.layout_prediction_container, this, true) initView(attrs) } diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml index f0e085b467..9a1f892dad 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_decision_container.xml @@ -12,8 +12,8 @@ android:layout_height="211dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginStart="@dimen/dp_27" - android:layout_marginBottom="24dp" + android:layout_marginStart="@dimen/dp_12" + android:layout_marginBottom="11dp" app:map_index="0" /> @@ -24,7 +24,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginBottom="24dp" + android:layout_marginBottom="11dp" app:map_index="1" /> @@ -34,22 +34,23 @@ android:layout_height="211dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginEnd="@dimen/dp_27" - android:layout_marginBottom="20dp" + android:layout_marginEnd="@dimen/dp_12" + android:layout_marginBottom="11dp" app:map_index="2" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml index 1c2106bf51..784fb58ea6 100644 --- a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml +++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_b2_prediction_container.xml @@ -8,24 +8,25 @@ Date: Tue, 17 Jun 2025 12:08:36 +0800 Subject: [PATCH 12/23] =?UTF-8?q?[8.1.0]=20[fix]=20[=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=94=99=E8=AF=AF]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt index 961da95497..50a2d41441 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt @@ -49,7 +49,7 @@ class StationAdapter : ListAdapter(MessageDif newDataList.add(it.first()) newDataList.add(StationBeanOmit(currentIndex-1-1)) newDataList.addAll(list.slice(currentIndex-1 .. currentIndex+1)) - newDataList.add(StationBeanOmit(list.size-currentIndex-1)) + newDataList.add(StationBeanOmit(list.size-(currentIndex+3)))// 减去+1 省略 和最后一个 newDataList.add(list.last()) }else{ if(showFuluterOmit||showPassOmit){ From aa1583a6ea6f90563acd1d3b7cdae84e69c7a527 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 17 Jun 2025 14:55:52 +0800 Subject: [PATCH 13/23] =?UTF-8?q?[8.1.0]=E7=BB=9F=E4=B8=80=E7=BA=A2?= =?UTF-8?q?=E7=BB=BF=E7=81=AFUI=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unmanned-passenger/src/main/res/layout/taxi_p_home.xml | 6 +++--- .../main/res/layout/hmi_view_traffic_light_passenger.xml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml index 840733179f..ca7b9f7dd7 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_home.xml @@ -89,9 +89,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toEndOf="parent" - android:layout_marginTop="@dimen/dp_26" - android:layout_marginEnd="@dimen/dp_21" + app:layout_constraintLeft_toLeftOf="parent" + android:layout_marginTop="@dimen/dp_30" + android:layout_marginStart="@dimen/dp_21" android:visibility="gone" app:lightUser="passenger" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_passenger.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_passenger.xml index 82c03a1cbf..faaaf490b5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_passenger.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_traffic_light_passenger.xml @@ -11,8 +11,8 @@ android:layout_height="@dimen/dp_90" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" - android:layout_marginStart="@dimen/dp_20" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginStart="@dimen/dp_16" + android:layout_marginTop="@dimen/dp_11" android:contentDescription="@string/common_traffic_light_status" /> From 531e4c05b837c716f0cfc53f4264987c3d556104 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 17 Jun 2025 15:07:33 +0800 Subject: [PATCH 14/23] =?UTF-8?q?[8.1.0]=20[fix]=20[=E6=8E=A2=E8=B7=AFUI?= =?UTF-8?q?=E5=8F=98=E6=9B=B4]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/b2/layout/item_ai_automatic_exploration.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_automatic_exploration.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_automatic_exploration.xml index 1fa06b11ab..624972121a 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_automatic_exploration.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_automatic_exploration.xml @@ -34,10 +34,10 @@ From 86bcad5987d7d7d47b10bf1dd1a16621e701d71f Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 17 Jun 2025 15:17:04 +0800 Subject: [PATCH 15/23] =?UTF-8?q?[8.1.0]=E4=BA=91=E6=8E=A7=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E5=B9=B3=E5=8F=B0=E7=BA=A2=E7=BB=BF=E7=81=AF=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=9A=90=E8=97=8F=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/datacenter/v2x/TrafficLightDispatcher.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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 e58fba21b8..e708991a4f 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 @@ -586,10 +586,16 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight hasCloudControlLight = true //展示云控基础平台信号灯信息 CallerTrafficLightListenerManager.showCloudTrafficLight(currentState, currentDuration, nextState, nextDuration) + }else{ + //隐藏云控基础信号红绿灯 + CallerTrafficLightListenerManager.disableTrafficLight() + hasCloudControlLight = false } } }else{ hasCloudControlLight = false + //隐藏云控基础信号红绿灯 + CallerTrafficLightListenerManager.disableTrafficLight() } } From da4a87877f0be9bdd5cca36f24314e7e00788016 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 17 Jun 2025 15:39:51 +0800 Subject: [PATCH 16/23] =?UTF-8?q?[8.1.0]=E7=BA=A2=E7=BB=BF=E7=81=AF?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E8=B5=84=E6=BA=90=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icon_green_light_pointer_passenger.png | Bin 10423 -> 10137 bytes .../icon_red_light_pointer_passenger.png | Bin 8958 -> 9248 bytes .../icon_yellow_light_pointer_passenger.png | Bin 8939 -> 8941 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_light_pointer_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_green_light_pointer_passenger.png index b0320f95d32742354f04b799db48d798ebcb860e..abc99b621aff02358c1f1da7161aec5f70e29130 100644 GIT binary patch literal 10137 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 Z#OB!iR*3hJ-2Yn|l$BJHs1-8~{y$pTHs}BV diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_red_light_pointer_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_red_light_pointer_passenger.png index 4a296b3c850466037e0fb58b9eb7628877174f1c..c31d9b6d457920dc5616f60d0a1e759b021e40e7 100644 GIT binary patch literal 9248 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 literal 8958 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 I{QwU6Kc&}!<^TWy diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_yellow_light_pointer_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_yellow_light_pointer_passenger.png index f4499b78eb10d038f721bdcfb1654ea457972d47..1427e929bbf77c28e238adbe43d8f666e50a4b07 100644 GIT binary patch literal 8941 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 literal 8939 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 From 9286462d191817be4139831f9bc4585123d81eab Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 17 Jun 2025 16:33:13 +0800 Subject: [PATCH 17/23] =?UTF-8?q?[8.1.0]V2I=E4=B8=8B=E8=A1=8C=E6=84=9F?= =?UTF-8?q?=E7=9F=A5=E6=95=B0=E6=8D=AE=E8=BF=9BPNC=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/hmi/ui/operate/OperatePanelLayout.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index 903d33f0fd..d6254f977f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -588,9 +588,9 @@ class OperatePanelLayout : LinearLayout { FunctionBuildConfig.v2iPerceptionDataToPnc = false CallerAutoPilotControlManager.sendV2iDownPerceptionToPnc(0) //查询V2I下行感知进PNC开关状态 - UiThreadHandler.postDelayed({ - CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) - }, 500) +// UiThreadHandler.postDelayed({ +// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) +// }, 500) } hmiAction("V2I下行, ", isChecked) clickEventAnalytics("V2I下行", isChecked) @@ -615,9 +615,9 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendV2iDownPerceptionToPnc(0) } //查询V2I下行感知进PNC开关状态 - UiThreadHandler.postDelayed({ - CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) - }, 500) +// UiThreadHandler.postDelayed({ +// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) +// }, 500) hmiAction("感知数据进PNC应用, ", isChecked) clickEventAnalytics("感知数据进PNC应用", isChecked) return true From 5988f2a7b9927b7c504f0b7af54038604cdadf1f Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 17 Jun 2025 17:10:55 +0800 Subject: [PATCH 18/23] =?UTF-8?q?[8.1.0]=20[fix]=20[UI=E5=8F=98=E6=9B=B4]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/weaknet/ui/taskrunning/TaskRunningAdapter.kt | 3 ++- .../weaknet/passenger/ui/line/arrive/ArrivedView.kt | 10 ++++++++++ .../weaknet/passenger/ui/line/lineinfo/LineView.kt | 4 +--- .../weaknet/passenger/ui/statusbar/M2StatusBarView.kt | 10 ++-------- .../src/main/res/b2/layout/m2_line_view.xml | 1 + .../main/res/b2/layout/m2_station_current_end_view.xml | 1 + .../res/b2/layout/m2_station_current_start_view.xml | 1 + .../src/main/res/b2/layout/m2_station_current_view.xml | 1 + .../main/res/b2/layout/m2_station_normal_end_view.xml | 1 + .../res/b2/layout/m2_station_normal_future_view.xml | 1 + .../main/res/b2/layout/m2_station_normal_pass_view.xml | 1 + .../res/b2/layout/m2_station_normal_start_view.xml | 1 + .../main/res/b2/layout/m2_station_omit_view_future.xml | 1 + .../main/res/b2/layout/m2_station_omit_view_pass.xml | 1 + 14 files changed, 25 insertions(+), 12 deletions(-) diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt index 09cd376e68..bc6ec819a7 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningAdapter.kt @@ -39,6 +39,7 @@ class TaskRunningAdapter( private var totalHeight = 0f fun setDataList(dataList: List) { + CallerLogger.d(TAG,"设置view-----") this.mData.clear() this.mData.addAll(dataList) if (LineModel.startStationIndex == 0) { @@ -47,7 +48,7 @@ class TaskRunningAdapter( totalHeight = (halfHeight + (dataList.size - 1 - LineModel.startStationIndex) * heightItem).toFloat() } - notifyItemRangeChanged(0, dataList.size, true) + notifyDataSetChanged() } override fun onCreateViewHolder( diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/arrive/ArrivedView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/arrive/ArrivedView.kt index da870cd203..45af7ebd21 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/arrive/ArrivedView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/arrive/ArrivedView.kt @@ -4,8 +4,10 @@ import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.content.Context +import android.graphics.drawable.AnimationDrawable import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -17,6 +19,7 @@ import kotlinx.android.synthetic.main.m2_arrive_view.view.aciv_arrow_left import kotlinx.android.synthetic.main.m2_arrive_view.view.aciv_arrow_right import kotlinx.android.synthetic.main.m2_arrive_view.view.aciv_door_left import kotlinx.android.synthetic.main.m2_arrive_view.view.aciv_door_right +import kotlinx.android.synthetic.main.m2_arrive_view.view.iv_animal_list import kotlinx.android.synthetic.main.m2_arrive_view.view.ochtv_arrive_station_value import me.jessyan.autosize.utils.AutoSizeUtils @@ -95,6 +98,9 @@ class ArrivedView : ConstraintLayout { if(!animator.isRunning){ animator.start() } + iv_animal_list.visibility = View.VISIBLE + val animationDrawable = iv_animal_list.drawable as AnimationDrawable + animationDrawable.start() }else{ animator.cancel() val paramsLeft = aciv_door_left.layoutParams as LayoutParams @@ -108,6 +114,10 @@ class ArrivedView : ConstraintLayout { aciv_arrow_left.visibility = GONE aciv_arrow_right.visibility = GONE animatorArrow.cancel() + + iv_animal_list.visibility = View.VISIBLE + val animationDrawable = iv_animal_list.drawable as AnimationDrawable + animationDrawable.stop() } } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt index 10894dc80b..87ac341704 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt @@ -49,9 +49,7 @@ class LineView : ConstraintLayout, LineViewModel.LineViewCallback { // AutoSizeUtils.dp2px(context,20f) // ) // ) - autoplit_info.onClick { - updateRemainMt("12公里","25分钟") - } + ll_station_container.setAdapter(mAdapter) ll_station_container.itemAnimator?.addDuration = 0; diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt index 7c9afd8069..2cb5390f56 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/statusbar/M2StatusBarView.kt @@ -76,19 +76,13 @@ class M2StatusBarView @JvmOverloads constructor( tv_power_cos?.also { it.text = "?" } - iv_logon.onClick { - BizLoopManager.runInMainThread{ - BleManager.scanLeDevice() - } - } + tv_power_cos.onClick { BizLoopManager.runInIoThread { BleManager.sendData2Wx("1889480", "00,${System.currentTimeMillis()}") } } - tv_status_line_name.onClick { - updateLineInfo("线路名称") - } + } override fun updateLineInfo(lineName: String?) { diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_line_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_line_view.xml index a9907a41c1..625ec87e4b 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_line_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_line_view.xml @@ -12,6 +12,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" + android:clickable="false" app:layout_constraintEnd_toStartOf="@+id/autoplit_info" android:layout_marginEnd="@dimen/dp_41" android:layout_width="0dp" diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_end_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_end_view.xml index 0246fbb21a..001279fa79 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_end_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_end_view.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:background="@color/b2_95B1D6" + android:clickable="false" android:layout_width="match_parent" android:layout_height="@dimen/dp_68" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_start_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_start_view.xml index 8746348e8b..4054da47a7 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_start_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_start_view.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:background="@color/b2_95B1D6" + android:clickable="false" android:layout_width="match_parent" android:layout_height="@dimen/dp_68" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_view.xml index 5cf12a4f24..79e57326f1 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_current_view.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:background="@color/b2_95B1D6" android:layout_width="match_parent" + android:clickable="false" android:layout_height="@dimen/dp_68" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_end_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_end_view.xml index e0b8e26ede..023c04b35b 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_end_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_end_view.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" + android:clickable="false" android:layout_width="match_parent" android:layout_height="@dimen/dp_68"> diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_future_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_future_view.xml index cc072411ed..ab454a716c 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_future_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_future_view.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" + android:clickable="false" android:layout_width="match_parent" android:layout_height="@dimen/dp_68"> diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_pass_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_pass_view.xml index 95bf367c21..f99893ab25 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_pass_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_pass_view.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" + android:clickable="false" android:layout_width="match_parent" android:layout_height="@dimen/dp_68"> diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_start_view.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_start_view.xml index 0b2cbbb17b..8fec780b20 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_start_view.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_normal_start_view.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" android:layout_width="match_parent" + android:clickable="false" android:layout_height="@dimen/dp_68"> diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_omit_view_pass.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_omit_view_pass.xml index 723b492859..62c21c870a 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_omit_view_pass.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_station_omit_view_pass.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" + android:clickable="false" android:layout_width="match_parent" android:layout_height="@dimen/dp_68"> From f566104228339568925c490552d5f7245beac29f Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 17 Jun 2025 17:20:22 +0800 Subject: [PATCH 19/23] =?UTF-8?q?[8.1.0]=E6=95=B0=E6=8D=AE=E8=BF=9BPNC?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=9C=A8=E8=BF=9E=E6=8E=A5=E4=B8=8A=E5=9F=9F?= =?UTF-8?q?=E6=8E=A7=E6=97=B6=E4=B8=BB=E5=8A=A8=E5=8F=91=E9=80=81=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E5=BD=93=E5=89=8D=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MoGoAdasMsgConnectStatusListenerImpl.kt | 22 ++++++++++++++++++- .../core/data/config/FunctionBuildConfig.kt | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index c0ff93bfab..5e9ddb8186 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -142,8 +142,28 @@ class MoGoAdasMsgConnectStatusListenerImpl : CallerAutoPilotControlManager.setRainMode(FunctionBuildConfig.isRainMode) // 6.6.2 版本默认开启,与海江确认过,默认发盲区模式 CallerAutoPilotControlManager.sendFusionMode(2) - CallerAutoPilotControlManager.sendV2iToPncCmd(FunctionBuildConfig.v2iToPNC) + CallerAutoPilotControlManager.sendV2nToPncCmd(FunctionBuildConfig.v2nTotalSwitch) + + //事件数据进PNC应用 + if(FunctionBuildConfig.ndeEventDataToPnc){ + CallerAutoPilotControlManager.sendNdeDownEventToPnc(1) + }else{ + CallerAutoPilotControlManager.sendNdeDownEventToPnc(0) + } + //感知数据进PNC应用 + if(FunctionBuildConfig.ndePerceptionDataToPnc){ + CallerAutoPilotControlManager.sendNdeDownPerceptionToPnc(1) + }else{ + CallerAutoPilotControlManager.sendNdeDownPerceptionToPnc(0) + } + //V2I下行感知进PNC开关 + if(FunctionBuildConfig.v2iPerceptionDataToPnc){ + CallerAutoPilotControlManager.sendV2iDownPerceptionToPnc(1) + }else{ + CallerAutoPilotControlManager.sendV2iDownPerceptionToPnc(0) + } + } AdasConstants.IpcConnectionStatus.CONNECTING -> { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index dd1c8f58a3..7d6b471d49 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -350,7 +350,7 @@ object FunctionBuildConfig { */ @Volatile @JvmField - var v2iToPNC = true + var v2iToPNC = false @Volatile @JvmField From 27a4c4b12501334895665a5b62c99365cde96856 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 17 Jun 2025 17:54:11 +0800 Subject: [PATCH 20/23] =?UTF-8?q?[8.1.0]=20[fix]=20[=E5=B9=B3=E5=9D=87?= =?UTF-8?q?=E9=80=9F=E5=BA=A6=E5=8F=98=E6=9B=B4]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/charter/passenger/model/CharterPassengerModel.kt | 3 ++- .../mogo/och/common/module/constant/OchCommonConst.kt | 9 +++++++++ .../och/shuttle/weaknet/passenger/model/CommonModel.kt | 3 ++- .../ui/routing/routingrunning/RoutingRunningModel.kt | 3 ++- .../com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt | 3 ++- .../och/unmanned/passenger/model/TaxiPassengerModel.kt | 3 ++- 6 files changed, 19 insertions(+), 5 deletions(-) diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt index 3e2ec0ebbe..c41d5cf874 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt @@ -52,6 +52,7 @@ import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.LedScreenManager import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.PinYinUtil import com.mogo.och.common.module.voice.VoiceNotice @@ -697,7 +698,7 @@ object CharterPassengerModel { } val lastTime: Double = - lastSumLength / CharterPassengerConst.Charter_AVERAGE_SPEED * 3.6 //秒 + lastSumLength / OchCommonConst.Charter_AVERAGE_SPEED * 3.6 //秒 d( M_BUS_P + "calculateDistance", diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt index 4bfbcd21d4..6a76f7839a 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt @@ -71,5 +71,14 @@ class OchCommonConst { const val AUTOMATIC_PLANNING_MAX_DISTANCE = 15 const val ARRIVE_AT_END_STATION_DISTANCE = 10 + + + //b1 b2 平均速度 bus的平均里程:25km/h + const val BUS_AVERAGE_SPEED = 25 + + //M1的平均里程:15km/h + const val Charter_AVERAGE_SPEED = 15 + //T1T2的平均里程:38km/h + const val TAXI_AVERAGE_SPEED = 38 } } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt index bd046843e6..d8f10eab4d 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt @@ -25,6 +25,7 @@ import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.download.DownloadManager import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener @@ -164,7 +165,7 @@ object CommonModel { private val trajectoryListener: IDistanceListener = object : IDistanceListener { override fun distanceCallback(distance: Float) { - val lastTime = distance / BusPassengerConst.BUS_AVERAGE_SPEED * 3.6 //秒 + val lastTime = distance / OchCommonConst.BUS_AVERAGE_SPEED * 3.6 //秒 d(TAG, "轨迹排查==lastSumLength = $distance") if (routesResult != null) { for (site in routesResult!!.sites) { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningModel.kt index 97ea4a7e0a..96cbb97a75 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningModel.kt @@ -16,6 +16,7 @@ import com.mogo.och.bridge.autopilot.line.ILineCallback import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.unmanned.taxi.bean.ContrailBean import com.mogo.och.unmanned.taxi.bean.EndGrayContrailTaskReq @@ -91,7 +92,7 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { override fun distanceCallback(distance: Float) { - val lastTime = distance / TaxiUnmannedConst.TAXI_AVERAGE_SPEED * 3.6 //秒 + val lastTime = distance / OchCommonConst.TAXI_AVERAGE_SPEED * 3.6 //秒 this.viewCallback?.showDistance(distance.toLong(),lastTime.toLong()) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt index 61df40c1d9..689769189c 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt @@ -56,6 +56,7 @@ import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil.coordinateConverte import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.biz.order.IOrderListener import com.mogo.och.common.module.biz.order.OrderManager +import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.OCHThreadPoolManager import com.mogo.och.common.module.utils.ResourcesUtils @@ -469,7 +470,7 @@ object TaxiTaskModel { private val localCalculateDistanceListener: IDistanceListener = object : IDistanceListener { override fun distanceCallback(distance: Float) { - val lastTime = distance / TaxiUnmannedConst.TAXI_AVERAGE_SPEED * 3.6 //秒 + val lastTime = distance / OchCommonConst.TAXI_AVERAGE_SPEED * 3.6 //秒 d( TAG, "dynamicCalculateRouteInfo: lastSumLength=$distance, lastTime=$lastTime, threadName=Thread.currentThread().name" diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt index a76facd3ae..75284c0202 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/model/TaxiPassengerModel.kt @@ -23,6 +23,7 @@ import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManage import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager @@ -314,7 +315,7 @@ object TaxiPassengerModel { override fun distanceCallback(distance: Float) { - val lastTime: Double = distance / TaxiPassengerConst.TAXI_AVERAGE_SPEED * 3.6 //秒 + val lastTime: Double = distance / OchCommonConst.TAXI_AVERAGE_SPEED * 3.6 //秒 for (callback in mOrderStatusCallbackMap.values) { callback.onCurrentOrderDistToEndChanged( From fa5ce31adc1859066ce8d8774440210f62d3183b Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Tue, 17 Jun 2025 20:19:43 +0800 Subject: [PATCH 21/23] =?UTF-8?q?[8.1.0][opt]=E4=B8=8B=E6=8E=89=E9=A2=84?= =?UTF-8?q?=E6=B5=8B=E5=92=8C=E5=86=B3=E7=AD=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/presenter/PM2ADASPresenter.kt | 28 +++++----- .../passenger/ui/map/PM2HPMapFragment.kt | 28 +++++----- .../b2/layout/shuttle_p_m2_hpmap_fragment.xml | 46 ++++++++--------- .../business/identify/IdentifyFactory.kt | 51 +------------------ .../function/view/CoordinateAnimationView.kt | 11 ---- .../core/function/view/PredictionLayout.kt | 24 +++++---- 6 files changed, 70 insertions(+), 118 deletions(-) diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt index 29fb9842f2..c830999cca 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/presenter/PM2ADASPresenter.kt @@ -202,17 +202,17 @@ class PM2ADASPresenter(view: PM2HPMapFragment?) : mView?.showHDMap_mind() return@runInMainThread }else{ - if(havePredictionInfos&&haveTrajectoryInfos){ - updateMapFlag(true) - // 展示高精地图+展示预测和决策 - mView?.showHDMap_aip_prediction() - return@runInMainThread - }else{ +// if(havePredictionInfos&&haveTrajectoryInfos){ +// updateMapFlag(true) +// // 展示高精地图+展示预测和决策 +// mView?.showHDMap_aip_prediction() +// return@runInMainThread +// }else{ updateMapFlag(false) // 展示高精地图 mView?.showHDMap() return@runInMainThread - } +// } } } @@ -231,12 +231,12 @@ class PM2ADASPresenter(view: PM2HPMapFragment?) : } private fun updateMapFlag(open: Boolean) { - if (open) { - FunctionBuildConfig.isDrawDecIdentifyData = true - FunctionBuildConfig.isDrawPreIdentifyData = true - } else { - FunctionBuildConfig.isDrawDecIdentifyData = false - FunctionBuildConfig.isDrawPreIdentifyData = false - } +// if (open) { +// FunctionBuildConfig.isDrawDecIdentifyData = true +// FunctionBuildConfig.isDrawPreIdentifyData = true +// } else { +// FunctionBuildConfig.isDrawDecIdentifyData = false +// FunctionBuildConfig.isDrawPreIdentifyData = false +// } } } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/map/PM2HPMapFragment.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/map/PM2HPMapFragment.kt index 11e16c3dd7..c893a45a11 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/map/PM2HPMapFragment.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/map/PM2HPMapFragment.kt @@ -20,8 +20,6 @@ import com.mogo.och.shuttle.weaknet.passenger.constant.M2Const.Companion.TYPE_MA import com.mogo.och.shuttle.weaknet.passenger.presenter.PM2ADASPresenter import com.mogo.och.common.module.utils.OCHThreadPoolManager import kotlinx.android.synthetic.main.shuttle_p_m2_hpmap_fragment.aciv_top_shader -import kotlinx.android.synthetic.main.shuttle_p_m2_hpmap_fragment.cl_aip_contain -import kotlinx.android.synthetic.main.shuttle_p_m2_hpmap_fragment.cl_prediction_contain import kotlinx.android.synthetic.main.shuttle_p_m2_hpmap_fragment.mHomeView import kotlinx.android.synthetic.main.shuttle_p_m2_hpmap_fragment.mindView import kotlinx.android.synthetic.main.shuttle_p_m2_hpmap_fragment.overMapView @@ -80,33 +78,39 @@ class PM2HPMapFragment : it.clipToOutline = true it.hideResetView() } +// cl_prediction_contain.onCreate(savedInstanceState) } override fun onResume() { super.onResume() mHomeView.onResume() overMapView?.onResume() +// cl_prediction_contain.onResume() } override fun onLowMemory() { super.onLowMemory() mHomeView.onLowMemory() +// cl_prediction_contain.onLowMemory() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) mHomeView.onSaveInstanceState(outState) +// cl_prediction_contain.onSaveInstanceState(outState) } override fun onPause() { super.onPause() mHomeView.onPause() overMapView?.onPause() +// cl_prediction_contain.onPause() } override fun onDestroyView() { mHomeView.onDestroy() overMapView?.onDestroy() +// cl_prediction_contain.onDestroy() super.onDestroyView() } @@ -220,8 +224,8 @@ class PM2HPMapFragment : aciv_top_shader.visibility = View.GONE - cl_aip_contain.visibility = View.GONE - cl_prediction_contain.visibility = View.GONE +// cl_aip_contain.visibility = View.GONE +// cl_prediction_contain.visibility = View.GONE mindView.visibility = View.GONE overMapView.visibility = View.GONE @@ -231,8 +235,8 @@ class PM2HPMapFragment : mHomeView.visibility = View.GONE aciv_top_shader.visibility = View.GONE - cl_aip_contain.visibility = View.GONE - cl_prediction_contain.visibility = View.GONE +// cl_aip_contain.visibility = View.GONE +// cl_prediction_contain.visibility = View.GONE mindView.visibility = View.GONE overMapView.visibility = View.VISIBLE @@ -250,8 +254,8 @@ class PM2HPMapFragment : aciv_top_shader.visibility = View.VISIBLE - cl_aip_contain.visibility = View.GONE - cl_prediction_contain.visibility = View.GONE +// cl_aip_contain.visibility = View.GONE +// cl_prediction_contain.visibility = View.GONE mindView.visibility = View.VISIBLE overMapView.visibility = View.GONE @@ -265,8 +269,8 @@ class PM2HPMapFragment : aciv_top_shader.visibility = View.VISIBLE - cl_aip_contain.visibility = View.VISIBLE - cl_prediction_contain.visibility = View.VISIBLE +// cl_aip_contain.visibility = View.VISIBLE +// cl_prediction_contain.visibility = View.VISIBLE mindView.visibility = View.GONE overMapView.visibility = View.GONE @@ -277,8 +281,8 @@ class PM2HPMapFragment : aciv_top_shader.visibility = View.VISIBLE - cl_aip_contain.visibility = View.GONE - cl_prediction_contain.visibility = View.GONE +// cl_aip_contain.visibility = View.GONE +// cl_prediction_contain.visibility = View.GONE mindView.visibility = View.VISIBLE diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml index 26ddd954ef..40b124faaf 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/shuttle_p_m2_hpmap_fragment.xml @@ -51,30 +51,30 @@ android:layout_width="@dimen/dp_430" android:layout_height="@dimen/dp_650"/> - + + + + + + + + + + + - + + + + + + + + + + + + = 1000) { lostFrame(internal.toString()) identify.clearOldMarker() - preIdentify.clearOldMarker() } sendEmptyMessageDelayed(MSG_CHECK, 1000L) } MSG_DATA_TRACK -> { if (msg.obj is List<*>) { - val objectList = msg.obj as List? - val mapInstanceList = ArrayList() - mapInstanceList.add(MogoMap.DEFAULT) - if (FunctionBuildConfig.isDrawPreIdentifyData) { - mapInstanceList.add(MogoMap.SMALL_PRED_MAP) - } - identify.renderAdasRegResults(objectList, mapInstanceList) + identify.renderAdasRecognizedResult(msg.obj as List?) startTime = System.nanoTime() } } @@ -112,9 +88,6 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf } } - MSG_DATA_PRE_TRACK -> { - } - MSG_DATA_WARNING -> { if (msg.obj is List<*>) { identify.renderPlanningWarningObj(msg.obj as List?) @@ -134,19 +107,12 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf } MSG_DATA_CLEAR -> { - val mapInstanceList = ArrayList() - mapInstanceList.add(MogoMap.DEFAULT) - mapInstanceList.add(MogoMap.SMALL_PRED_MAP) - identify.clearOldMarkers(mapInstanceList) + identify.clearOldMarker() } MSG_DATA_AI_CLEAR -> { aiCloudIdentify!!.clearAiMarker(msg.data.getString("mapInstance")!!) } - - MSG_DATA_PRE_CLEAR -> { - preIdentify.clearPredictionMarker(MogoMap.SMALL_PRED_MAP) - } } } } @@ -158,13 +124,6 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf mDrawerHandler.sendMessage(message) } - override fun renderPredictionResult(predictionObjectList: List?) { - val message = Message.obtain() - message.what = MSG_DATA_PRE_TRACK - message.obj = predictionObjectList - mDrawerHandler.sendMessage(message) - } - override fun renderAiCloudResult( resultList: List, mapInstance: String @@ -196,12 +155,6 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf mDrawerHandler.sendMessage(message) } - override fun clearPredictionMarker(mapInstance: String) { - val message = Message.obtain() - message.what = MSG_DATA_PRE_CLEAR - mDrawerHandler.sendMessage(message) - } - override fun updateTrackerWarningInfo(trafficData: TrafficData) { super.updateTrackerWarningInfo(trafficData) val message = Message.obtain() diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt index cb0ceae443..c9ab295958 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/CoordinateAnimationView.kt @@ -113,13 +113,6 @@ class CoordinateAnimationView @JvmOverloads constructor( AutoSizeUtils.dp2px(context, 128f), AutoSizeUtils.dp2px(context, 280f) ) - if (index == 1) { - storeWidthsAndHeights() - } -// circlePaint = Paint() -// circlePaint!!.color = Color.RED -// circlePaint!!.style = Paint.Style.STROKE -// circlePaint!!.isAntiAlias = true curvePaint!!.setARGB(102, 48, 163, 255) // curvePaint!!.shader = LinearGradient( @@ -162,10 +155,6 @@ class CoordinateAnimationView @JvmOverloads constructor( setLayerType(LAYER_TYPE_HARDWARE, null) } - private fun storeWidthsAndHeights() { - // TODO:("此时获得的宽高为0") - } - private fun getOriginBitmap(resId: Int, desWidth: Int, desHeight: Int): Bitmap { val bitmap = BitmapFactory.decodeResource(resources, resId) val scaleWidth = (bitmap.width * 2) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt index 41cfa3db5f..62c1a7a069 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/PredictionLayout.kt @@ -6,7 +6,6 @@ import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.function.map.R -import kotlinx.android.synthetic.main.layout_prediction_container.view.preDetailView class PredictionLayout @JvmOverloads constructor( context: Context, @@ -14,6 +13,7 @@ class PredictionLayout @JvmOverloads constructor( ) : ConstraintLayout(context, attrs) { private var carType = 0 + private var preDetailView: PredictionMapView? = null init { initView(attrs) @@ -24,32 +24,38 @@ class PredictionLayout @JvmOverloads constructor( carType = typedArray.getInt(R.styleable.CarMapLayout_car_type, 0) typedArray.recycle() when (carType) { - 0 -> LayoutInflater.from(context).inflate(R.layout.layout_prediction_container, this, true) - else -> LayoutInflater.from(context).inflate(R.layout.layout_b2_prediction_container, this, true) + 0 -> { + LayoutInflater.from(context).inflate(R.layout.layout_prediction_container, this, true) + preDetailView = findViewById(R.id.preDetailView) + } + else -> { + LayoutInflater.from(context).inflate(R.layout.layout_b2_prediction_container, this, true) + preDetailView = findViewById(R.id.preDetailView) + } } } fun onCreate(savedInstanceState: Bundle?) { - preDetailView.onCreate(savedInstanceState) + preDetailView?.onCreate(savedInstanceState) } fun onSaveInstanceState(outState: Bundle) { - preDetailView.onSaveInstanceState(outState) + preDetailView?.onSaveInstanceState(outState) } fun onResume() { - preDetailView.onResume() + preDetailView?.onResume() } fun onLowMemory() { - preDetailView.onLowMemory() + preDetailView?.onLowMemory() } fun onPause() { - preDetailView.onPause() + preDetailView?.onPause() } fun onDestroy() { - preDetailView.onDestroy() + preDetailView?.onDestroy() } } \ No newline at end of file From fc9f667a209097a6023963f39e83dc7c67c09ee3 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 18 Jun 2025 10:38:49 +0800 Subject: [PATCH 22/23] =?UTF-8?q?[8.1.0]=20[fix]=20[=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E4=BF=AE=E6=94=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/ui/mind/adapter/AIMessageAdapter.kt | 10 +++++----- .../passenger/ui/mind/adapter/AIMessageViewHolder.kt | 11 ----------- ...ation.xml => b2_item_ai_automatic_exploration.xml} | 0 ...item_ai_nde_event.xml => b2_item_ai_nde_event.xml} | 0 ...em_ai_pnc_action.xml => b2_item_ai_pnc_action.xml} | 0 ..._cross_roam.xml => b2_item_ai_road_cross_roam.xml} | 0 ...ad_v2n_event.xml => b2_item_ai_road_v2n_event.xml} | 0 7 files changed, 5 insertions(+), 16 deletions(-) rename OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/{item_ai_automatic_exploration.xml => b2_item_ai_automatic_exploration.xml} (100%) rename OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/{item_ai_nde_event.xml => b2_item_ai_nde_event.xml} (100%) rename OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/{item_ai_pnc_action.xml => b2_item_ai_pnc_action.xml} (100%) rename OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/{item_ai_road_cross_roam.xml => b2_item_ai_road_cross_roam.xml} (100%) rename OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/{item_ai_road_v2n_event.xml => b2_item_ai_road_v2n_event.xml} (100%) diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageAdapter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageAdapter.kt index 7a4c34d086..70757e8612 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageAdapter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageAdapter.kt @@ -19,11 +19,11 @@ class AIMessageAdapter : ListAdapter(MessageDiffCa override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { - AIMessage.TYPE_PNC_ACTION -> PNCActionViewHolder(inflater.inflate(R.layout.item_ai_pnc_action,parent,false)) - AIMessage.TYPE_ROAD_V2N -> RoadV2NEventViewHolder(inflater.inflate(R.layout.item_ai_road_v2n_event,parent,false)) - AIMessage.TYPE_ROAD_CROSS -> RoadCrossRoamViewHolder(inflater.inflate(R.layout.item_ai_road_cross_roam,parent,false))// 全息路口 - AIMessage.TYPE_AUTOMATIC_EXPLORATION -> AutomaticExplorationViewHolder(inflater.inflate(R.layout.item_ai_automatic_exploration,parent,false))// 探查 - AIMessage.TYPE_NDE -> NDEViewHolder(inflater.inflate(R.layout.item_ai_nde_event,parent,false))// 车龙 + AIMessage.TYPE_PNC_ACTION -> PNCActionViewHolder(inflater.inflate(R.layout.b2_item_ai_pnc_action,parent,false)) + AIMessage.TYPE_ROAD_V2N -> RoadV2NEventViewHolder(inflater.inflate(R.layout.b2_item_ai_road_v2n_event,parent,false)) + AIMessage.TYPE_ROAD_CROSS -> RoadCrossRoamViewHolder(inflater.inflate(R.layout.b2_item_ai_road_cross_roam,parent,false))// 全息路口 + AIMessage.TYPE_AUTOMATIC_EXPLORATION -> AutomaticExplorationViewHolder(inflater.inflate(R.layout.b2_item_ai_automatic_exploration,parent,false))// 探查 + AIMessage.TYPE_NDE -> NDEViewHolder(inflater.inflate(R.layout.b2_item_ai_nde_event,parent,false))// 车龙 else -> throw IllegalArgumentException("Invalid view type") } } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageViewHolder.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageViewHolder.kt index 816c674552..11bd35ccf8 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageViewHolder.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/adapter/AIMessageViewHolder.kt @@ -144,17 +144,6 @@ class RoadCrossRoamViewHolder(binding: View) : MessageViewHolder(binding){ override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { if(item is AIMessage.RoadCrossRoam){ lvRoadCrossRoamTip.layoutManager = NoScrollLayoutManager(itemView.context) -// lvRoadCrossRoamTip.addItemDecoration(object : RecyclerView.ItemDecoration() { -// override fun getItemOffsets( -// outRect: Rect, -// view: View, -// parent: RecyclerView, -// state: RecyclerView.State -// ) { -// super.getItemOffsets(outRect, view, parent, state) -// outRect.bottom = 24 -// } -// }) lvRoadCrossRoamTip.adapter = RoadCrossRoamListB2Adapter(itemView.context) tvRoadRoamTitle.setTextColor(itemView.context.getColor(R.color.color_131415)) diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_automatic_exploration.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_automatic_exploration.xml similarity index 100% rename from OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_automatic_exploration.xml rename to OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_automatic_exploration.xml diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_nde_event.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_nde_event.xml similarity index 100% rename from OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_nde_event.xml rename to OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_nde_event.xml diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_pnc_action.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_pnc_action.xml similarity index 100% rename from OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_pnc_action.xml rename to OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_pnc_action.xml diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_road_cross_roam.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_road_cross_roam.xml similarity index 100% rename from OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_road_cross_roam.xml rename to OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_road_cross_roam.xml diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_road_v2n_event.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_road_v2n_event.xml similarity index 100% rename from OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/item_ai_road_v2n_event.xml rename to OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/b2_item_ai_road_v2n_event.xml From 9177315f99639b39259c8f4c6c832ef4b3e48935 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 18 Jun 2025 10:57:56 +0800 Subject: [PATCH 23/23] =?UTF-8?q?[8.1.0]OTA=E5=8D=87=E7=BA=A7=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ota/OTAUpgradeManager.kt | 26 ++++++-- .../core/function/hmi/ui/MoGoHmiProvider.kt | 40 ++++++++++-- .../hmi/ui/tools/OTAPowerOffFinishDialog.kt | 31 +++++++++ .../hmi/ui/tools/OTAUpgradeResultDialog.kt | 10 ++- .../layout/dialog_ota_power_off_finish.xml | 64 +++++++++++++++++++ .../src/main/res/values/strings.xml | 6 +- .../api/hmi/warning/IMoGoHmiProvider.kt | 8 ++- .../function/call/hmi/CallerHmiManager.kt | 12 +++- 8 files changed, 177 insertions(+), 20 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAPowerOffFinishDialog.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_ota_power_off_finish.xml diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt index 0976b77e33..199f3f05e4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt @@ -56,8 +56,14 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, }else{ Log.i(TAG,"20分钟没有收到OTA升级推送置为失败") CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) - CallerHmiManager.showOTAResultDialog(false) + CallerHmiManager.showOTAResultDialog(isShow = true, result = false) } + }else if(msg.what == 2){ + Log.i(TAG,"司机屏弹窗提示用车人执行车辆下电操作") + //如果OTA升级弹窗没有点击关闭,则自动关闭 + CallerHmiManager.showOTAResultDialog(isShow = false, result = true) + //司机屏弹窗提示用车人执行车辆下电操作 + CallerHmiManager.showOTAPowerOffFinishDialog() } } } @@ -126,7 +132,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val token = productInfo.optString("token") val productStatus = productInfo.optInt("status") val failReason = productInfo.optString("fail_reason") - val upgradeReason = productInfo.optString("upgrade_reason") + val upgradeReason = productInfo.optString("upgrade_reason")//升级原因 val taskId = productInfo.optInt("task_id") val taskItemId = productInfo.optInt("task_item_id") val otaType = productInfo.optInt("ota_type") @@ -136,6 +142,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val curSize = productInfo.optDouble("cur_size") val totalSize = productInfo.optDouble("total_size") val taskNumber = productInfo.optInt("task_number") + val leftTime = productInfo.optInt("left_time") //剩余时间,单位秒 Log.i(TAG, "index=$index") Log.i(TAG, "token=$token") @@ -150,7 +157,8 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "is_delay=$isDelay") Log.i(TAG, "cur_size=$curSize") Log.i(TAG, "total_size=$totalSize") - Log.i(TAG,"taskNumber=$taskNumber") + Log.i(TAG,"task_number=$taskNumber") + Log.i(TAG,"left_time=$leftTime") if(index == 0){ //是否需要触发提示升级只判断第一个任务 @@ -251,7 +259,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val token = productInfo.optString("token") val productStatus = productInfo.optInt("status") val failReason = productInfo.optString("fail_reason") - val upgradeReason = productInfo.optString("upgrade_reason") + val upgradeReason = productInfo.optString("upgrade_reason")//升级原因 val taskId = productInfo.optInt("task_id") val taskItemId = productInfo.optInt("task_item_id") val otaType = productInfo.optInt("ota_type") @@ -261,6 +269,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val curSize = productInfo.optDouble("cur_size") val totalSize = productInfo.optDouble("total_size") val taskNumber = productInfo.optInt("task_number") + val leftTime = productInfo.optInt("left_time")//剩余时间,单位秒 Log.i(TAG, "index=$index") Log.i(TAG, "token=$token") @@ -276,6 +285,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "cur_size=$curSize") Log.i(TAG, "total_size=$totalSize") Log.i(TAG,"task_number=$taskNumber") + Log.i(TAG,"left_time=$leftTime") if(index == 0){ //是否需要触发提示升级只判断第一个任务 @@ -334,7 +344,13 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, OTAUpgradeConfig.isQuery = false }else{ CallerHmiManager.showOTADownloadStatusDialog(false,otaUpgradeList) - CallerHmiManager.showOTAResultDialog(upgradeResult) + CallerHmiManager.showOTAResultDialog(true,upgradeResult) + //升级成功,自动执行优雅停服 + if(upgradeResult){ + CallerAutoPilotControlManager.sendIpcPowerOff() + //当优雅停服完成、需要车辆下电的时候(比如当前是停服触发60s后),车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 + handler.sendEmptyMessageDelayed(2,60000) + } } CallerOTAManager.invokeOtaDownloadStatus(false) }else{ 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 ba66a8430a..b0573865c1 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 @@ -61,6 +61,7 @@ import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog import com.mogo.eagle.core.function.hmi.ui.tools.ModifyBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.tools.OTADownloadStatusDialog +import com.mogo.eagle.core.function.hmi.ui.tools.OTAPowerOffFinishDialog import com.mogo.eagle.core.function.hmi.ui.tools.OTAUpgradeDialog import com.mogo.eagle.core.function.hmi.ui.tools.OTAUpgradeResultDialog import com.mogo.eagle.core.function.hmi.ui.tools.ToBindingCarDialog @@ -667,6 +668,7 @@ class MoGoHmiProvider : IMoGoHmiProvider { private var otaUpgradeDialog: OTAUpgradeDialog ?= null private var otaDownloadStatusDialog: OTADownloadStatusDialog ?= null private var otaUpgradeResultDialog: OTAUpgradeResultDialog ?= null + private var otaPowerOffFinishDialog: OTAPowerOffFinishDialog ?= null /** * 展示OTA升级弹窗 @@ -720,18 +722,42 @@ class MoGoHmiProvider : IMoGoHmiProvider { /** * 展示OTA升级结果弹窗 + * @param isShow 是否展示 * @param result true升级成功 false升级失败 */ - override fun showOTAResultDialog(result: Boolean) { + override fun showOTAResultDialog(isShow: Boolean,result: Boolean) { ThreadUtils.runOnUiThread{ - context?.let{ - if(otaUpgradeResultDialog == null){ - otaUpgradeResultDialog = OTAUpgradeResultDialog(it) + if(isShow){ + context?.let{ + if(otaUpgradeResultDialog == null){ + otaUpgradeResultDialog = OTAUpgradeResultDialog(it) + } + if(otaUpgradeResultDialog?.isShowing == false){ + otaUpgradeResultDialog?.show() + } + otaUpgradeResultDialog?.showResult(result) } - if(otaUpgradeResultDialog?.isShowing == false){ - otaUpgradeResultDialog?.show() + }else{ + if(otaUpgradeResultDialog?.isShowing == true){ + otaUpgradeResultDialog?.dismiss() + } + } + + } + } + + /** + * OTA升级完成且优雅停服完成、需要车辆下电的时候车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 + */ + override fun showOTAPowerOffFinishDialog() { + ThreadUtils.runOnUiThread { + context?.let { + if(otaPowerOffFinishDialog == null){ + otaPowerOffFinishDialog = OTAPowerOffFinishDialog(it) + } + if(otaPowerOffFinishDialog?.isShowing == false){ + otaPowerOffFinishDialog?.show() } - otaUpgradeResultDialog?.showResult(result) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAPowerOffFinishDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAPowerOffFinishDialog.kt new file mode 100644 index 0000000000..8794be964a --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAPowerOffFinishDialog.kt @@ -0,0 +1,31 @@ +package com.mogo.eagle.core.function.hmi.ui.tools + +import android.content.Context +import androidx.lifecycle.LifecycleObserver +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog +import kotlinx.android.synthetic.main.dialog_ota_power_off_finish.tvPowerOffClose + +/** + * OTA升级完成且优雅停服完成、需要车辆下电的时候车端告知鹰眼, + * 司机屏弹窗提示用车人执行车辆下电操作 + */ +class OTAPowerOffFinishDialog(context: Context) : + BaseFloatDialog(context,TAG), LifecycleObserver { + + companion object { + private const val TAG = "OTAPowerOffFinishDialog" + } + + init{ + setContentView(R.layout.dialog_ota_power_off_finish) + setCanceledOnTouchOutside(false) + tvPowerOffClose.setOnClickListener { + dismiss() + } + //语音提示下电重启 + AIAssist.getInstance(context).speakTTSVoice("优雅停服完成,请操作车辆下电重启") + } + +} \ 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/tools/OTAUpgradeResultDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeResultDialog.kt index dc34c1bdc2..bcebb8df8f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeResultDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeResultDialog.kt @@ -11,6 +11,8 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog import com.mogo.eagle.core.utilcode.util.ResourceUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinSecondFormat import kotlinx.android.synthetic.main.dialog_ota_upgrade_result.ivUpgradeResult import kotlinx.android.synthetic.main.dialog_ota_upgrade_result.tvResultClose import kotlinx.android.synthetic.main.dialog_ota_upgrade_result.tvResultContent @@ -43,16 +45,18 @@ class OTAUpgradeResultDialog(context: Context) : //升级成功 ivUpgradeResult.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_ota_upgrade_success)) tvResultContent.text = context.resources.getString(R.string.ota_result_success) - tvResultTip.text = context.resources.getString(R.string.ota_result_success_tip) + tvResultTip.text = + String.format(context.resources.getString(R.string.ota_result_success_tip), + TimeUtils.millis2String(System.currentTimeMillis()+60000,getHourMinSecondFormat())) //消息盒子和语音提示升级成功结果 CallerMsgBoxManager.saveMsgBox( MsgBoxBean( MsgBoxType.OTA, OTAMsg( - "成功", "车辆部署任务执行结果", "车辆部署任务执行成功,请重启车辆") + "成功", "车辆部署任务执行结果", "任务下载完成,一分钟后操作车辆下电重启") ) ) - AIAssist.getInstance(context).speakTTSVoice("车辆部署任务执行成功,请重启车辆") + AIAssist.getInstance(context).speakTTSVoice("任务下载完成,一分钟后操作车辆下电重启") }else{ //升级失败 ivUpgradeResult.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_ota_upgrade_fail)) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_ota_power_off_finish.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_ota_power_off_finish.xml new file mode 100644 index 0000000000..d3833005b0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_ota_power_off_finish.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index e2a7d5ac30..15413fdf70 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -267,11 +267,13 @@ 稍后升级 资源下载中 OTA升级结果图片示例 - ⻋辆部署任务执⾏成功 + ⻋辆部署任务下载完成 ⻋辆部署任务执⾏失败 - 请重启⻋辆 + 已自动发起优雅停服,%s后可操作车辆下电重启 请联系管理员 关闭 + 车辆优雅停服完成 + 请操作车辆下电重启 FSM美化模式状态下异常标识 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 1a2a59ded4..93e84c86f8 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 @@ -337,9 +337,15 @@ interface IMoGoHmiProvider :IProvider{ /** * 展示OTA升级结果弹窗 + * @param isShow 是否展示 * @param result true升级成功 false升级失败 */ - fun showOTAResultDialog(result: Boolean) + fun showOTAResultDialog(isShow: Boolean,result: Boolean) + + /** + * OTA升级完成且优雅停服完成、需要车辆下电的时候车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 + */ + fun showOTAPowerOffFinishDialog() /** * 展示数据落盘拷贝成功对话框 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 15376239ce..c03078f0af 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 @@ -490,10 +490,18 @@ object CallerHmiManager { /** * 展示OTA升级结果弹窗 + * @param isShow 是否展示 * @param result true升级成功 false升级失败 */ - fun showOTAResultDialog(result: Boolean){ - hmiProviderApi?.showOTAResultDialog(result) + fun showOTAResultDialog(isShow: Boolean,result: Boolean){ + hmiProviderApi?.showOTAResultDialog(isShow,result) + } + + /** + * OTA升级完成且优雅停服完成、需要车辆下电的时候车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 + */ + fun showOTAPowerOffFinishDialog(){ + hmiProviderApi?.showOTAPowerOffFinishDialog() } /**