From cde0d82777cdbd3d2d32dbc5d11da0a7afca9a1c Mon Sep 17 00:00:00 2001 From: lianglihui Date: Thu, 7 Apr 2022 20:32:43 +0800 Subject: [PATCH 01/18] =?UTF-8?q?265=20=E8=B0=83=E6=95=B4=E5=B0=8F?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E8=B7=AF=E7=BA=BF=E5=AE=BD=E5=BA=A6.?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E8=B5=B7=E7=BB=88=E7=82=B9icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 48 +++++++++--------- config.gradle | 2 +- .../src/main/res/layout/fragment_hmi.xml | 4 +- .../function/smp/SmallMapDirectionView.java | 2 +- .../module_small_map_view_dir_end.png | Bin 604 -> 6256 bytes .../module_small_map_view_dir_start.png | Bin 601 -> 7707 bytes .../routeoverlay/MogoRouteOverlayManager.java | 3 ++ .../apm/ApmCrashReportProvider.java | 7 +-- 8 files changed, 35 insertions(+), 31 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 68f2bc1df2..8cd6cdab96 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,7 +24,7 @@ if (!isAndroidTestBuild()) { } //if (!isAndroidTestBuild()) { -// apply plugin: 'apm-plugin' + apply plugin: 'apm-plugin' //} //if (!isAndroidTestBuild()) { @@ -263,29 +263,29 @@ dependencies { } //if (!isAndroidTestBuild()) { -// ApmPlugin { -// // 是否进行插桩 -// enable true -// // 是否在Debug包插桩,默认不插桩 -// enableInDebug true -// // DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR"); -// // INFO 级别Log会汇总所有被插桩处理的类供查看,路径 app/build/ByteX/ApmPlugin -// logLevel "DEBUG" -// // 启动分析开关:监控App启动耗时,需要同时开启pageLoadSwitch -// startSwitch = true -// // 页面响应开关:监控Activity的生命周期耗时 -// pageLoadSwitch = true -// // 网络监控开关:监控okhttp3的网络请求 -// okHttp3Switch = true -// // 白名单下的包进行插桩,需要填写要插装类所在的包名,支持前缀配置 -// whiteList = [ -// "com.mogo" -// ] -// // 黑名单包下类不进行插桩,可以配置包名和类名,没有可以填空 -// blackList = [ -// -// ] -// } + ApmPlugin { + // 是否进行插桩 + enable true + // 是否在Debug包插桩,默认不插桩 + enableInDebug true + // DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR"); + // INFO 级别Log会汇总所有被插桩处理的类供查看,路径 app/build/ByteX/ApmPlugin + logLevel "DEBUG" + // 启动分析开关:监控App启动耗时,需要同时开启pageLoadSwitch + startSwitch = true + // 页面响应开关:监控Activity的生命周期耗时 + pageLoadSwitch = true + // 网络监控开关:监控okhttp3的网络请求 + okHttp3Switch = false + // 白名单下的包进行插桩,需要填写要插装类所在的包名,支持前缀配置 + whiteList = [ + "com.mogo" + ] + // 黑名单包下类不进行插桩,可以配置包名和类名,没有可以填空 + blackList = [ + + ] + } //} android.applicationVariants.all { variant -> diff --git a/config.gradle b/config.gradle index 4965ab8c16..5edb8a051f 100644 --- a/config.gradle +++ b/config.gradle @@ -166,7 +166,7 @@ ext { crashreportapmbyte : "com.mogo.test:crashreport-apmbyte:${CRASHREPORT_APMBYTE_VERSION}", crashreportnoop : "com.mogo.test:crashreport-noop:${CRASHREPORT_NOOP_VERSION}", crashreportupgrade : "com.mogo.test:crashreport-upgrade:${CRASHREPORT_UPGRADE_VERSION}", - apm_insight : 'com.volcengine:apm_insight:1.4.4.cn', + apm_insight : 'com.volcengine:apm_insight:1.4.5.cn', apm_insight_crash : 'com.volcengine:apm_insight_crash:1.4.2', //========================= TTS语音 Maven 版本管理 ========================= diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index b24ba66e08..f2b87a5de9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -137,8 +137,8 @@ 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 aWcokxAYUm)eKd{$0000 literal 604 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 n metric = new HashMap<>(); //指标值 //metric.put("Devices_ID_metric", (double) 100); @@ -95,7 +96,7 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { //是否打印日志,注:线上release版本要配置为false builder.debugMode(true); //支持用户自定义user_id把平台数据和自己用户关联起来,可以不配置 - builder.userId(MoGoAiCloudClientConfig.getInstance().getSn()); +// builder.userId(MoGoAiCloudClientConfig.getInstance().getSn()); //私有化部署:配置数据上报的域名 (私有化部署才需要配置,内部有默认域名),测试支持设置http://www.xxx.com 默认是https协议 // builder.defaultReportDomain("www.xxx.com"); //设置渠道。1.3.16版本增加接口 From 76bed1cbcdbbe7185a45115311a6ef933995f354 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Fri, 8 Apr 2022 10:10:05 +0800 Subject: [PATCH 02/18] =?UTF-8?q?[Change]=20=E5=A2=9E=E5=8A=A0=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E5=85=A8=E5=B1=8F=E5=B9=95=E7=9A=84View=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0&=E7=A7=BB=E9=99=A4=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 OverlayViewUtils.showOverlayView(getContext(),overlayView); 移除 OverlayViewUtils.showOverlayView(getContext(),overlayView); ⚠️注意:调用添加方法后一定要在适当的位置调用移除方法,否则将导致APP无法进入HMI交互视图 Signed-off-by: donghongyu --- .../{WaringPresenter.kt => HmiPresenter.kt} | 4 +- ...oWarningContract.kt => MoGoHmiContract.kt} | 2 +- .../core/function/hmi/ui/MoGoHmiFragment.kt | 8 +- .../res/layout/module_main_activity_main.xml | 2 +- .../core/utilcode/util/OverlayViewUtils.java | 93 +++++++++++++++++++ 5 files changed, 101 insertions(+), 8 deletions(-) rename core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/{WaringPresenter.kt => HmiPresenter.kt} (58%) rename core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/{MoGoWarningContract.kt => MoGoHmiContract.kt} (93%) create mode 100644 core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/OverlayViewUtils.java diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/WaringPresenter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/HmiPresenter.kt similarity index 58% rename from core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/WaringPresenter.kt rename to core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/HmiPresenter.kt index 866cf26116..7ebe9297ac 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/WaringPresenter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/HmiPresenter.kt @@ -6,8 +6,8 @@ import com.mogo.commons.mvp.Presenter * @author xiaoyuzhou * @date 2021/8/3 3:55 下午 */ -class WaringPresenter(view: MoGoWarningContract.View?) : - Presenter(view) { +class HmiPresenter(view: MoGoHmiContract.View?) : + Presenter(view) { } \ 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/MoGoWarningContract.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiContract.kt similarity index 93% rename from core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoWarningContract.kt rename to core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiContract.kt index b9916ef0da..3cb6912670 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoWarningContract.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiContract.kt @@ -11,7 +11,7 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener *@author xiaoyuzhou *@date 2021/8/4 3:38 下午 */ -interface MoGoWarningContract { +interface MoGoHmiContract { interface View : IView { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 76628e984a..70b9dd7140 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -60,10 +60,10 @@ import java.util.* * 预警图层 */ @Route(path = MoGoFragmentPaths.PATH_FRAGMENT_HMI) -class MoGoHmiFragment : MvpFragment(), +class MoGoHmiFragment : MvpFragment(), IMoGoWaringProvider, IMoGoHmiViewProxy, - MoGoWarningContract.View, + MoGoHmiContract.View, IMoGoAutopilotRecordListener { private val TAG = "MoGoHmiFragment" @@ -347,8 +347,8 @@ class MoGoHmiFragment : MvpFragment return TAG } - override fun createPresenter(): WaringPresenter { - return WaringPresenter(this) + override fun createPresenter(): HmiPresenter { + return HmiPresenter(this) } override fun setSpeedChartViewVisibility(visibility: Int) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml index 3e39181da0..ca5882f47d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml @@ -37,7 +37,7 @@ app:layout_constraintEnd_toEndOf="parent" /> - + { + dismissOverlayView(lastOverlayView); + return true; + }); + lastOverlayView = overlayView; + windowManager.addView(overlayView, params); + isShowing = true; + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * 移除覆盖View在Activity上面 + */ + public static void dismissOverlayView(View overlayView) { + if (!isShowing) { + return; + } + try { + if (windowManager != null && overlayView != null) { + windowManager.removeView(overlayView); + } + isShowing = false; + } catch (Exception e) { + e.printStackTrace(); + } + } + + +} From 1fef34ec4707c434f119313965712fe5eb572fef Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Fri, 8 Apr 2022 10:46:52 +0800 Subject: [PATCH 03/18] opt ui --- .../core/function/hmi/ui/turnlight/BrakeViewStatus.kt | 8 ++++---- .../core/function/hmi/ui/turnlight/TurnLightViewStatus.kt | 8 ++++---- .../src/main/res/layout/view_brake_light_status.xml | 5 ++--- .../src/main/res/layout/view_turn_light_status.xml | 8 ++++---- .../mogo-core-function-hmi/src/main/res/values/dimens.xml | 2 +- 5 files changed, 15 insertions(+), 16 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt index 5324d03e61..d128c5e257 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt @@ -55,12 +55,12 @@ class BrakeViewStatus @JvmOverloads constructor( if (isBrake) { isBrake = false GlobalScope.launch(Dispatchers.Main) { - scaleImageAndTv() +// scaleImageAndTv() var disappearAnimation = AlphaAnimation(1f, 0f) - disappearAnimation.duration = 1200 + disappearAnimation.duration = 400 layout_brake.startAnimation(disappearAnimation) - image_brake.startAnimation(disappearAnimation) - tv_brake.startAnimation(disappearAnimation) +// image_brake.startAnimation(disappearAnimation) +// tv_brake.startAnimation(disappearAnimation) disappearAnimation.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationRepeat(p0: Animation?) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt index 394e463161..de079bb6b6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/TurnLightViewStatus.kt @@ -107,9 +107,9 @@ class TurnLightViewStatus @JvmOverloads constructor( //显示背景 private fun showNormalAnimation() { val appearAnimation = AlphaAnimation(0f, 1.0f) - appearAnimation.duration = 600 + appearAnimation.duration = 300 val appearAnimationImage = AlphaAnimation(0f, 1.0f) - appearAnimation.duration = 1000 + appearAnimation.duration = 500 turn_light_layout.startAnimation(appearAnimation) left_nor_image.startAnimation(appearAnimationImage) right_nor_image.startAnimation(appearAnimationImage) @@ -134,7 +134,7 @@ class TurnLightViewStatus @JvmOverloads constructor( disappearAnimationLeft.duration = 300 val disappearAnimationBg = AlphaAnimation(1.0f, 0f) - disappearAnimationBg.duration = 1200 + disappearAnimationBg.duration = 500 left_nor_image.startAnimation(disappearAnimationLeft) right_nor_image.startAnimation(disappearAnimationLeft) @@ -170,7 +170,7 @@ class TurnLightViewStatus @JvmOverloads constructor( //实现图片闪烁效果 private fun setAnimation(imageView: ImageView) { val animation = AlphaAnimation(1.0f, 0f) - animation.duration = 600 + animation.duration = 500 animation.interpolator = LinearInterpolator() animation.repeatCount = Animation.INFINITE animation.repeatMode = Animation.REVERSE diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status.xml index 1f7c0fe29e..e5d39649e5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status.xml @@ -25,7 +25,7 @@ android:id="@+id/image_brake" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="110px" + android:layout_marginLeft="115px" android:layout_gravity="center_vertical" android:src="@drawable/module_light_nor" android:visibility="gone" @@ -37,10 +37,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginLeft="20px" android:text="刹车中" android:textColor="#ffffff" - android:textSize="45px" + android:textSize="40px" android:visibility="gone" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toEndOf="@+id/image_brake" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_turn_light_status.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_turn_light_status.xml index d2dd2a6052..4127b7d4f3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_turn_light_status.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_turn_light_status.xml @@ -38,8 +38,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left|center_vertical" - android:layout_marginLeft="10px" - android:layout_marginTop="5px" + android:layout_marginLeft="13px" + android:layout_marginTop="3px" android:src="@drawable/module_arrow_left_select_nor" android:visibility="gone" /> @@ -48,8 +48,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" - android:layout_marginTop="5px" - android:layout_marginRight="10px" + android:layout_marginTop="3px" + android:layout_marginRight="13px" android:src="@drawable/module_arrow_right_select_nor" android:visibility="gone" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml index 79e0076a1b..9283e77555 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml @@ -37,7 +37,7 @@ 1066px 60px - 270px + 275px 120px 460px 120px From 3fb14b29a7ce8b41bfec11066b27313d7ca693c9 Mon Sep 17 00:00:00 2001 From: xuxinchao <13522809046@163.com> Date: Fri, 8 Apr 2022 14:01:16 +0800 Subject: [PATCH 04/18] fix bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 红绿灯改版时间不显示,改版后红绿灯只显示当前灯态时间, 故把其他时间注释,否则会覆盖当前时间,将其置空 --- .../v2x/trafficlight/TrafficLightHMIManager.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightHMIManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightHMIManager.kt index 08e0e109ee..66ce2bb505 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightHMIManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightHMIManager.kt @@ -40,20 +40,20 @@ class TrafficLightHMIManager { trafficLightStatus.isGreen() || trafficLightStatus.isFlashGreen() -> { CallerHmiManager.showWarningTrafficLight(3) CallerHmiManager.changeCountdownGreen(remain) - CallerHmiManager.changeCountdownRed(-1) - CallerHmiManager.changeCountdownYellow(-1) +// CallerHmiManager.changeCountdownRed(-1) +// CallerHmiManager.changeCountdownYellow(-1) } trafficLightStatus.isYellow() -> { CallerHmiManager.showWarningTrafficLight(2) CallerHmiManager.changeCountdownYellow(remain) - CallerHmiManager.changeCountdownGreen(-1) - CallerHmiManager.changeCountdownRed(-1) +// CallerHmiManager.changeCountdownGreen(-1) +// CallerHmiManager.changeCountdownRed(-1) } trafficLightStatus.isRed() -> { CallerHmiManager.showWarningTrafficLight(1) CallerHmiManager.changeCountdownRed(remain) - CallerHmiManager.changeCountdownGreen(-1) - CallerHmiManager.changeCountdownYellow(-1) +// CallerHmiManager.changeCountdownGreen(-1) +// CallerHmiManager.changeCountdownYellow(-1) } } } From 1b72b6c9a2c619ab57cee670abc301d0c4cdd49c Mon Sep 17 00:00:00 2001 From: zhongchao Date: Thu, 7 Apr 2022 14:38:23 +0800 Subject: [PATCH 05/18] wait to test --- .../core/function/map/IdentifyDataDrawer.java | 81 ++++++++++++------- modules/mogo-module-common/build.gradle | 1 + 2 files changed, 51 insertions(+), 31 deletions(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java index 8c989e773c..128c7aa062 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java @@ -1,11 +1,13 @@ package com.mogo.eagle.core.function.map; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; + +import android.annotation.SuppressLint; import android.content.Context; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.enums.TrafficTypeEnum; -import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMarkerManager; @@ -31,12 +33,12 @@ public class IdentifyDataDrawer { /** * 上一帧数据的缓存 */ - private static final ConcurrentHashMap mMarkersCaches = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap mMarkersCaches = new ConcurrentHashMap<>(); /** * 已经感知不到的脏数据 */ - private final ConcurrentHashMap mDirtyPositions = new ConcurrentHashMap<>(); + private final ConcurrentHashMap firstData = new ConcurrentHashMap<>(); /** * 记录每次实际绘制的交通元素UUID */ @@ -71,6 +73,7 @@ public class IdentifyDataDrawer { * * @param resultList adas感知融合数据 */ + @SuppressLint("NewApi") public void renderAdasRecognizedResult(List resultList) { if (resultList == null || resultList.isEmpty()) { clearOldMarker(); @@ -84,35 +87,26 @@ public class IdentifyDataDrawer { return; } - // 循环将集合中的数据提取记录 - - for (MessagePad.TrackedObject trafficData : resultList) { - // 过滤掉未知感知数据 - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && - trafficData.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { - //CallerLogger.INSTANCE.w(TAG, "未知感知类型数据,丢弃,不渲染"); - continue; + //清除缓存 + for (MessagePad.TrackedObject data : resultList) { + if(trafficDataUuidList.size() > 0 && trafficDataUuidList.contains("" + data.getUuid())){ + trafficDataUuidList.remove(data.getUuid()); } - trafficDataUuidList.add("" + trafficData.getUuid()); } -// // 找出上一针数据中已经不在本次数据中存在的数据 -// for (String uuid : mMarkersCaches.keySet()) { -// if (!trafficDataUuidList.contains(uuid)) { -// mDirtyPositions.put(uuid, mMarkersCaches.get(uuid)); -// } -// } -// // 移除脏数据 -// for (String uuid : mDirtyPositions.keySet()) { -// MogoApisHandler.getInstance().getApis() -// .getMapServiceApi() -// .getMarkerManager(mContext) -// .removeMarker(uuid); -// } - - // 绘制新数据 - MogoMarkerManager.getInstance(mContext) - .updateBatchMarkerPosition(filterTrafficData(resultList)); + trafficDataUuidList.forEach(uuid -> { + mMarkersCaches.remove(uuid); + }); + CallerLogger.INSTANCE.d(M_HMI + "arrow47", "origin data size : " + resultList.size()); + ArrayList filterList = filterTrafficData(resultList); + if (filterList.size() > 0) { + // 绘制新数据 + MogoMarkerManager.getInstance(mContext) + .updateBatchMarkerPosition(filterList); + } + CallerLogger.INSTANCE.d(M_HMI + "arrow47", "first data size : " + firstData.size() + " , mMarkersCaches : " + mMarkersCaches.size()); + // 首次未添加的感知物在调用完绘制方法后再塞入cache map + mMarkersCaches.putAll(firstData); } /** @@ -121,14 +115,39 @@ public class IdentifyDataDrawer { * @return 过滤后的数据集合 */ private ArrayList filterTrafficData(List trafficData) { + firstData.clear(); mFilterTrafficData.clear(); + trafficDataUuidList.clear(); for (MessagePad.TrackedObject data : trafficData) { // 过滤掉未知感知数据 - if (data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { + if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { //CallerLogger.INSTANCE.w(TAG, "未知感知类型数据,丢弃,不渲染"); continue; } - mFilterTrafficData.add(data); + + //首次过来的数据不添加,首次未添加的感知物在调用完绘制方法后再塞入cache map + MessagePad.TrackedObject cacheData = mMarkersCaches.get("" + data.getUuid()); + if (cacheData != null) { + //todo 测试航向角修正时打开 + MessagePad.TrackedObject correctData = null; + //todo 判断点是不是在当前车道线上,如果是,判断差值,进行修正 +// if (Math.abs(cacheData.getHeading() - data.getHeading()) > 90) { +// CallerLogger.INSTANCE.d(M_HMI + "arrow47","uuid修正 上一帧 : " + cacheData.getHeading() + " , 当前帧 : " + data.getHeading()); +// correctData = data.toBuilder().setHeading(cacheData.getHeading()).build(); +// } + if (correctData != null) { + mFilterTrafficData.add(correctData); + //更新已存在的感知物体数据 + mMarkersCaches.put("" + data.getUuid(), correctData); + } else { + mFilterTrafficData.add(data); + //更新已存在的感知物体数据 + mMarkersCaches.put("" + data.getUuid(), data); + } + } else { + firstData.put("" + data.getUuid(), data); + } + trafficDataUuidList.add("" + data.getUuid()); } return mFilterTrafficData; } diff --git a/modules/mogo-module-common/build.gradle b/modules/mogo-module-common/build.gradle index 68289ac3e8..af317b04ce 100644 --- a/modules/mogo-module-common/build.gradle +++ b/modules/mogo-module-common/build.gradle @@ -81,6 +81,7 @@ dependencies { } else { api project(":libraries:mogo-map") api project(":libraries:mogo-map-api") + implementation project(':libraries:mogo-adas-data') api project(":foudations:mogo-commons") api project(':services:mogo-service-api') api project(':core:mogo-core-utils') From c06b17cb82a44540f2f8e12d2e97d82eefecc86c Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 8 Apr 2022 12:27:43 +0800 Subject: [PATCH 06/18] merge --- .../core/function/map/IdentifyDataDrawer.java | 8 +- .../function/map/IdentifyDataDrawerTest.java | 203 ++++++++++++++++++ .../eagle/core/function/map/KalmanFilter.java | 34 +++ .../function/map/MapIdentifySubscriber.kt | 4 +- .../src/main/java/com/mogo/map/IMogoMap.java | 1 - .../uicontroller/IMogoMapUIController.java | 6 + .../java/com/mogo/map/AMapViewWrapper.java | 5 + .../com/mogo/map/MogoMapUIController.java | 9 + .../map/uicontroller/AMapUIController.java | 8 + 9 files changed, 274 insertions(+), 4 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/KalmanFilter.java diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java index 128c7aa062..7e63c599e8 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java @@ -87,10 +87,11 @@ public class IdentifyDataDrawer { return; } + long start = System.currentTimeMillis(); //清除缓存 for (MessagePad.TrackedObject data : resultList) { if(trafficDataUuidList.size() > 0 && trafficDataUuidList.contains("" + data.getUuid())){ - trafficDataUuidList.remove(data.getUuid()); + trafficDataUuidList.remove("" + data.getUuid()); } } trafficDataUuidList.forEach(uuid -> { @@ -99,11 +100,16 @@ public class IdentifyDataDrawer { CallerLogger.INSTANCE.d(M_HMI + "arrow47", "origin data size : " + resultList.size()); ArrayList filterList = filterTrafficData(resultList); + + long cost = System.currentTimeMillis() - start; + CallerLogger.INSTANCE.d(M_HMI + "arrow47", "cost : " + cost); + if (filterList.size() > 0) { // 绘制新数据 MogoMarkerManager.getInstance(mContext) .updateBatchMarkerPosition(filterList); } + CallerLogger.INSTANCE.d(M_HMI + "arrow47", "first data size : " + firstData.size() + " , mMarkersCaches : " + mMarkersCaches.size()); // 首次未添加的感知物在调用完绘制方法后再塞入cache map mMarkersCaches.putAll(firstData); diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java new file mode 100644 index 0000000000..85bd82d6fc --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java @@ -0,0 +1,203 @@ +package com.mogo.eagle.core.function.map; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; + +import android.annotation.SuppressLint; +import android.content.Context; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.enums.TrafficTypeEnum; +import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoMap; +import com.mogo.map.MogoMarkerManager; +import com.mogo.module.common.MogoApisHandler; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import mogo.telematics.pad.MessagePad; + +/** + * @author xiaoyuzhou + * @date 2021/10/19 10:45 上午 + * 域控制器识别信息绘制 + */ +public class IdentifyDataDrawerTest { + private static final String TAG = "IdentifyDataDrawer"; + + protected final Context mContext; + private static volatile IdentifyDataDrawerTest sInstance; + + /** + * 上一帧数据的缓存 + */ + private static final ConcurrentHashMap mMarkersCaches = new ConcurrentHashMap<>(); + + private static final ConcurrentHashMap algoCache = new ConcurrentHashMap<>(); + + /** + * 记录每次实际绘制的交通元素UUID + */ + private final ArrayList trafficDataUuidList = new ArrayList<>(); + /** + * 过滤后的数据集合 + */ + private final ArrayList mFilterTrafficData = new ArrayList<>(); + + private IdentifyDataDrawerTest() { + mContext = AbsMogoApplication.getApp(); + addPreVehicleModel(); + } + + public static IdentifyDataDrawerTest getInstance() { + if (sInstance == null) { + synchronized (IdentifyDataDrawerTest.class) { + if (sInstance == null) { + sInstance = new IdentifyDataDrawerTest(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + /** + * 渲染 adas 识别的数据 + * + * @param resultList adas感知融合数据 + */ + @SuppressLint("NewApi") + public void renderAdasRecognizedResult(List resultList) { + if (resultList == null || resultList.isEmpty()) { + clearOldMarker(); + CallerLogger.INSTANCE.w(TAG, "感知数据为空无需渲染……"); + return; + } + + if (!MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + clearOldMarker(); + CallerLogger.INSTANCE.w(TAG, "渲染 adas 识别的数据 当前不是VR模式"); + return; + } + + //清除缓存 + for (MessagePad.TrackedObject data : resultList) { + if (trafficDataUuidList.size() > 0 && trafficDataUuidList.contains("" + data.getUuid())) { + trafficDataUuidList.remove("" + data.getUuid()); + } + } + trafficDataUuidList.forEach(uuid -> { + mMarkersCaches.remove(uuid); + algoCache.remove(uuid); + }); + + ArrayList filterList = filterTrafficData(resultList); + if (filterList.size() > 0) { + // 绘制新数据 + MogoMarkerManager.getInstance(mContext) + .updateBatchMarkerPosition(filterList); + } + } + + /** + * 数据过滤器 + * + * @return 过滤后的数据集合 + */ + private ArrayList filterTrafficData(List trafficData) { + mFilterTrafficData.clear(); + trafficDataUuidList.clear(); + for (MessagePad.TrackedObject data : trafficData) { + // 过滤掉未知感知数据 + if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { + //CallerLogger.INSTANCE.w(TAG, "未知感知类型数据,丢弃,不渲染"); + continue; + } + double heading = kalmanFilter(data); + MessagePad.TrackedObject correctData = data.toBuilder().setHeading(heading).build(); + mFilterTrafficData.add(correctData); + //更新已存在的感知物体数据 + mMarkersCaches.put("" + correctData.getUuid(), correctData); + trafficDataUuidList.add("" + correctData.getUuid()); + } + return mFilterTrafficData; + } + + private double kalmanFilter(MessagePad.TrackedObject data) { + String uuid = "" + data.getUuid(); + if (algoCache.containsKey(uuid)) { + Object o = algoCache.get(uuid); + KalmanFilter kf = (KalmanFilter) o; + assert kf != null; + double[] lonLat = kf.filter(data.getLongitude(), data.getLatitude()); + algoCache.put(uuid, kf); + MessagePad.TrackedObject cacheTrackObj = mMarkersCaches.get(uuid); + assert cacheTrackObj != null; + double heading = MogoMap.getInstance().getMogoMap().getUIController().getAngle(cacheTrackObj.getLongitude(), cacheTrackObj.getLatitude(), lonLat[0], lonLat[1]); + CallerLogger.INSTANCE.d(M_HMI + "arrow47", " uuid : " + uuid + " , origin heading : " + data.getHeading() + " , correct heading : " + heading + " ---- " + (data.getHeading() - heading)); + return Math.abs((data.getHeading() - heading)) >= 180 ? heading : data.getHeading(); + } else { + algoCache.put(uuid, new KalmanFilter(data.getLongitude(), data.getLatitude(), 0.00005)); + return data.getHeading(); + } + } + + /** + * 清除旧的 marker 数据 + */ + public void clearOldMarker() { + for (String uuid : trafficDataUuidList) { + MogoMarkerManager.getInstance(mContext) + .removeMarker(uuid); + } + trafficDataUuidList.clear(); + } + + private void addPreVehicleModel() { + CallerLogger.INSTANCE.d(TAG, "添加感知模型到地图中……"); + addPreVehicleModelWeiZhi(TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI, "添加感知模型到地图中……preVehicleStrWeiZhi="); + + addPreVehicleModelWeiZhi(TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE, "添加感知模型到地图中……preVehicleStrPeople="); + + addPreVehicleModelWeiZhi(TrafficTypeEnum.TYPE_TRAFFIC_ID_BICYCLE, "添加感知模型到地图中……preVehicleStrBicycle="); + + addPreVehicleModelWeiZhi(TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE, "添加感知模型到地图中……preVehicleStrTaChe="); + + addPreVehicleModelWeiZhi(TrafficTypeEnum.TYPE_TRAFFIC_ID_MOTO, "添加感知模型到地图中……preVehicleStrMoto="); + + addPreVehicleModelWeiZhi(TrafficTypeEnum.TYPE_TRAFFIC_ID_BUS, "添加感知模型到地图中……preVehicleStrBus="); + + addPreVehicleModelWeiZhi(TrafficTypeEnum.TYPE_TRAFFIC_ID_TRUCK, "添加感知模型到地图中……preVehicleStrTruck="); + } + + /** + * 添加模型到地图中 + * + * @param typeTrafficIdWeiZhi + * @param s + */ + private void addPreVehicleModelWeiZhi(TrafficTypeEnum typeTrafficIdWeiZhi, String s) { + String preVehicleStrWeiZhi = MogoMarkerManager.getInstance(mContext) + .addPreVehicleModel(typeTrafficIdWeiZhi.getType(), + typeTrafficIdWeiZhi.getTraffic3DIconId()); + CallerLogger.INSTANCE.d(TAG, s + preVehicleStrWeiZhi); + + if (preVehicleStrWeiZhi == null) { + UiThreadHandler.postDelayed(new Runnable() { + @Override + public void run() { + CallerLogger.INSTANCE.w(TAG, "添加感知模型到地图中失败,尝试重复添加……"); + addPreVehicleModelWeiZhi(typeTrafficIdWeiZhi, s); + } + }, 1000L); + } + } + +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/KalmanFilter.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/KalmanFilter.java new file mode 100644 index 0000000000..08605437fa --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/KalmanFilter.java @@ -0,0 +1,34 @@ +package com.mogo.eagle.core.function.map; + +public class KalmanFilter { + private final double q = 1.0E-6D; + double r = 5.0E-5D; + double[][] xhat = new double[][]{{0.0D, 0.0D}, {0.0D, 0.0D}}; + double[][] p = new double[][]{{1.0D, 1.0D}, {0.0D, 0.0D}}; + double[][] xhatminus = new double[][]{{0.0D, 0.0D}, {0.0D, 0.0D}}; + double[][] pMinus = new double[][]{{0.0D, 0.0D}, {0.0D, 0.0D}}; + double[][] k = new double[][]{{0.0D, 0.0D}, {0.0D, 0.0D}}; + int idx = 1; + + public KalmanFilter(double lon, double lat, double r) { + this.xhat[0][0] = lon; + this.xhat[0][1] = lat; + this.r = r; + } + + public double[] filter(double lon, double lat) { + for(int i = 0; i < 2; ++i) { + this.xhatminus[this.idx][i] = this.xhat[1 - this.idx][i]; + this.pMinus[this.idx][i] = this.p[1 - this.idx][i] + 1.0E-6D; + this.k[this.idx][i] = this.pMinus[this.idx][i] / (this.pMinus[this.idx][i] + this.r); + double value = i == 0 ? lon : lat; + this.xhat[this.idx][i] = this.xhatminus[this.idx][i] + this.k[this.idx][i] * (value - this.xhatminus[this.idx][i]); + this.p[this.idx][i] = (1.0D - this.k[this.idx][i]) * this.pMinus[this.idx][i]; + } + + double lon1 = this.xhat[this.idx][0]; + double lat1 = this.xhat[this.idx][1]; + this.idx = 1 - this.idx; + return new double[]{lon1, lat1}; + } +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt index 5eb0df67c8..662e3c6136 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt @@ -41,9 +41,9 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, IMoGoAutopi override fun onAutopilotIdentifyDataUpdate(trafficData: List?) { try { if (FunctionBuildConfig.isDrawIdentifyData) { - ThreadUtils.getSinglePool().execute { IdentifyDataDrawer.getInstance().renderAdasRecognizedResult(trafficData) } + ThreadUtils.getSinglePool().execute { IdentifyDataDrawerTest.getInstance().renderAdasRecognizedResult(trafficData) } } else { - IdentifyDataDrawer.getInstance().clearOldMarker() + IdentifyDataDrawerTest.getInstance().clearOldMarker() } } catch (e: Exception) { e.printStackTrace() diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java index dcf235541d..11b968b840 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java @@ -1,6 +1,5 @@ package com.mogo.map; -import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.overlay.IMogoPolyline; diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index 65cb31af57..9ae3db58a1 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -352,4 +352,10 @@ public interface IMogoMapUIController { * 设置地图视线角度 */ void setMapDAngle(float angle); + + /** + * 获取行车方向 + * @return + */ + float getAngle(double startLon, double startLat, double endLon, double endLat); } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index 6881bc8434..f18918c184 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -1079,4 +1079,9 @@ public class AMapViewWrapper implements IMogoMapView, mMapView.getMapAutoViewHelper().setMapDAngle(angle); } + @Override + public float getAngle(double startLon, double startLat, double endLon, double endLat) { + return MapAutoApi.INSTANCE.getAngle(startLon,startLat,endLon,endLat); + } + } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java index d0e275cd76..0eaa831de4 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java @@ -454,4 +454,13 @@ public class MogoMapUIController implements IMogoMapUIController { mDelegate.setMapDAngle(angle); } } + + @Override + public float getAngle(double startLon, double startLat, double endLon, double endLat) { + initDelegate(); + if (mDelegate != null) { + return mDelegate.getAngle(startLon, startLat, endLon, endLat); + } + return 0.0f; + } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java index 39051ccaf9..38fc9ebdae 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java @@ -374,4 +374,12 @@ public class AMapUIController implements IMogoMapUIController { mClient.setMapDAngle(angle); } } + + @Override + public float getAngle(double startLon, double startLat, double endLon, double endLat) { + if (mClient != null) { + return mClient.getAngle(startLon,startLat,endLon,endLat); + } + return 0; + } } From c4f352d7236c1ecfdd264f92eee4c02d3be61491 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 8 Apr 2022 14:51:13 +0800 Subject: [PATCH 07/18] wait to finish --- .../core/function/map/IdentifyDataDrawer.java | 22 +++++++++++++------ .../function/map/IdentifyDataDrawerTest.java | 17 ++++++++++---- .../function/map/MapIdentifySubscriber.kt | 4 ++-- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java index 7e63c599e8..f56a931402 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java @@ -12,6 +12,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMarkerManager; import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.utils.DrivingDirectionUtils; import java.util.ArrayList; import java.util.List; @@ -90,7 +91,7 @@ public class IdentifyDataDrawer { long start = System.currentTimeMillis(); //清除缓存 for (MessagePad.TrackedObject data : resultList) { - if(trafficDataUuidList.size() > 0 && trafficDataUuidList.contains("" + data.getUuid())){ + if (trafficDataUuidList.size() > 0 && trafficDataUuidList.contains("" + data.getUuid())) { trafficDataUuidList.remove("" + data.getUuid()); } } @@ -134,13 +135,20 @@ public class IdentifyDataDrawer { //首次过来的数据不添加,首次未添加的感知物在调用完绘制方法后再塞入cache map MessagePad.TrackedObject cacheData = mMarkersCaches.get("" + data.getUuid()); if (cacheData != null) { - //todo 测试航向角修正时打开 MessagePad.TrackedObject correctData = null; - //todo 判断点是不是在当前车道线上,如果是,判断差值,进行修正 -// if (Math.abs(cacheData.getHeading() - data.getHeading()) > 90) { -// CallerLogger.INSTANCE.d(M_HMI + "arrow47","uuid修正 上一帧 : " + cacheData.getHeading() + " , 当前帧 : " + data.getHeading()); -// correctData = data.toBuilder().setHeading(cacheData.getHeading()).build(); -// } + //todo 进行修正 + if (Math.abs(cacheData.getHeading() - data.getHeading()) > 40 && Math.abs(cacheData.getHeading() - data.getHeading()) < 90) { + CallerLogger.INSTANCE.d(M_HMI + "arrow47", "uuid: " + data.getUuid() + " , 40~90差值范围 , 上一帧 : " + cacheData.getHeading() + " , 当前帧 : " + data.getHeading()); + } + if (Math.abs(cacheData.getHeading() - data.getHeading()) > 90) { + int degree = DrivingDirectionUtils.getDegreeOfCar2Poi(cacheData.getLongitude(), cacheData.getLatitude(), data.getLongitude(), data.getLatitude(), Double.valueOf(cacheData.getHeading()).intValue()); + if (degree > 90) { + CallerLogger.INSTANCE.d(M_HMI + "arrow47", "uuid: " + data.getUuid() + " , 夹角 : " + degree + " , 修正 上一帧 : " + cacheData.getHeading() + " , 当前帧 : " + data.getHeading()); + correctData = data.toBuilder().setHeading(cacheData.getHeading()).build(); + } else { + CallerLogger.INSTANCE.d(M_HMI + "arrow47", "uuid: " + data.getUuid() + " , 夹角 : " + degree + " , 未修正 上一帧 : " + cacheData.getHeading() + " , 当前帧 : " + data.getHeading()); + } + } if (correctData != null) { mFilterTrafficData.add(correctData); //更新已存在的感知物体数据 diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java index 85bd82d6fc..a5f40d4a71 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawerTest.java @@ -8,12 +8,12 @@ import android.content.Context; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.enums.TrafficTypeEnum; -import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMap; import com.mogo.map.MogoMarkerManager; import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.constants.AdasRecognizedType; import java.util.ArrayList; import java.util.List; @@ -120,7 +120,12 @@ public class IdentifyDataDrawerTest { //CallerLogger.INSTANCE.w(TAG, "未知感知类型数据,丢弃,不渲染"); continue; } - double heading = kalmanFilter(data); + + MessagePad.TrackedObject cacheData = mMarkersCaches.get("" + data.getUuid()); + double heading = MogoMap.getInstance().getMogoMap().getUIController().getAngle(cacheData.getLongitude(), cacheData.getLatitude(), data.getLongitude(), data.getLatitude()); + CallerLogger.INSTANCE.d(M_HMI + "arrow47", " uuid : " + data.getUuid() + " , origin heading : " + data.getHeading() + " , correct heading : " + heading + " ---- " + (data.getHeading() - heading)); + +// double heading = kalmanFilter(data); MessagePad.TrackedObject correctData = data.toBuilder().setHeading(heading).build(); mFilterTrafficData.add(correctData); //更新已存在的感知物体数据 @@ -142,9 +147,13 @@ public class IdentifyDataDrawerTest { assert cacheTrackObj != null; double heading = MogoMap.getInstance().getMogoMap().getUIController().getAngle(cacheTrackObj.getLongitude(), cacheTrackObj.getLatitude(), lonLat[0], lonLat[1]); CallerLogger.INSTANCE.d(M_HMI + "arrow47", " uuid : " + uuid + " , origin heading : " + data.getHeading() + " , correct heading : " + heading + " ---- " + (data.getHeading() - heading)); - return Math.abs((data.getHeading() - heading)) >= 180 ? heading : data.getHeading(); + return heading; } else { - algoCache.put(uuid, new KalmanFilter(data.getLongitude(), data.getLatitude(), 0.00005)); + double r = 0.00005; + if (AdasRecognizedType.valueFrom(data.getType()) == AdasRecognizedType.classIdTrafficBus || AdasRecognizedType.valueFrom(data.getType()) == AdasRecognizedType.classIdTrafficTruck) { + r = 0.0001; + } + algoCache.put(uuid, new KalmanFilter(data.getLongitude(), data.getLatitude(), r)); return data.getHeading(); } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt index 662e3c6136..5eb0df67c8 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapIdentifySubscriber.kt @@ -41,9 +41,9 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, IMoGoAutopi override fun onAutopilotIdentifyDataUpdate(trafficData: List?) { try { if (FunctionBuildConfig.isDrawIdentifyData) { - ThreadUtils.getSinglePool().execute { IdentifyDataDrawerTest.getInstance().renderAdasRecognizedResult(trafficData) } + ThreadUtils.getSinglePool().execute { IdentifyDataDrawer.getInstance().renderAdasRecognizedResult(trafficData) } } else { - IdentifyDataDrawerTest.getInstance().clearOldMarker() + IdentifyDataDrawer.getInstance().clearOldMarker() } } catch (e: Exception) { e.printStackTrace() From fc5f9b4bc508581c4d857a30828eac0ee58c7e4d Mon Sep 17 00:00:00 2001 From: pangfan Date: Fri, 8 Apr 2022 15:32:52 +0800 Subject: [PATCH 08/18] =?UTF-8?q?opt=EF=BC=9A=E8=87=AA=E5=8A=A8=E9=A9=BE?= =?UTF-8?q?=E9=A9=B6=E4=B8=9A=E5=8A=A1=E5=9F=8B=E7=82=B9=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?URL=EF=BC=88->https://bdlog.zhidaozhixing.com/autocar=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5390f68844..93042f91d2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,14 @@ android:name="MAP_SDK_VERSION" android:value="${MAP_SDK_VERSION}" /> + + + + From 4013e7aceef6a3692542bdca228318b53cde1a40 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 8 Apr 2022 15:39:41 +0800 Subject: [PATCH 09/18] =?UTF-8?q?[Change]=E4=BF=AE=E6=94=B9=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/adas/high/common/IPCFixationIPHelper.java | 4 ++-- .../com/zhidao/support/adas/high/socket/FpgaSocket.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/IPCFixationIPHelper.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/IPCFixationIPHelper.java index ce43c5d3a6..37d5d9358c 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/IPCFixationIPHelper.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/IPCFixationIPHelper.java @@ -124,7 +124,7 @@ public class IPCFixationIPHelper { public void run() { start(ips); } - }, 5 * 1000L);//延时 + }, 4 * 1000L);//延时 } } } @@ -135,7 +135,7 @@ public class IPCFixationIPHelper { Process p; try { //ping -c 3 -w 100 中 ,-c 是指ping的次数 3是指ping 3次 ,-w 100 以秒为单位指定超时间隔,是指超时时间为100秒 - p = Runtime.getRuntime().exec("ping -c 2 -w 5 " + str); + p = Runtime.getRuntime().exec("ping -c 2 -w 2 " + str); int status = p.waitFor(); InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(input)); diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java index 4e857e76e7..30b82afadf 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java @@ -77,9 +77,9 @@ public class FpgaSocket implements IWebSocket { } if (okBuilder == null) { okBuilder = new OkHttpClient.Builder(); - okBuilder.writeTimeout(5, TimeUnit.SECONDS) - .readTimeout(5, TimeUnit.SECONDS) - .connectTimeout(5, TimeUnit.SECONDS); + okBuilder.writeTimeout(4, TimeUnit.SECONDS) + .readTimeout(4, TimeUnit.SECONDS) + .connectTimeout(1, TimeUnit.SECONDS); } if (client == null) { client = okBuilder.build(); @@ -117,7 +117,7 @@ public class FpgaSocket implements IWebSocket { if (isReconnect) { if (!isUserCloseWebSocket) { try { - Thread.sleep(5000L); + Thread.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } From b1171724be4e390c58b1353d27139ca3b5561b44 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 8 Apr 2022 15:40:12 +0800 Subject: [PATCH 10/18] =?UTF-8?q?[Change]=E4=BF=AE=E6=94=B9=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adas/client/OnAdasClientListener.java | 154 ++++++++++++++++++ .../adas/client/bean/ArrivalNotification.java | 4 +- .../adas/client/bean/AutopilotState.java | 4 +- .../com/zhidao/adas/client/bean/Base.java | 21 --- .../com/zhidao/adas/client/bean/BaseInfo.java | 32 ++++ .../zhidao/adas/client/bean/BasicInfoReq.java | 4 +- .../adas/client/bean/CarConfigResp.java | 4 +- .../zhidao/adas/client/bean/ErrorData.java | 3 +- .../adas/client/bean/GlobalPathResp.java | 4 +- .../com/zhidao/adas/client/bean/GnssInfo.java | 4 +- .../adas/client/bean/MogoReportMessage.java | 4 +- .../zhidao/adas/client/bean/MySSHResult.java | 10 ++ .../client/bean/PerceptionTrafficLight.java | 4 +- .../zhidao/adas/client/bean/RecordPanel.java | 4 +- .../adas/client/bean/TrackedObjects.java | 4 +- .../zhidao/adas/client/bean/Trajectory.java | 4 +- .../zhidao/adas/client/bean/VehicleState.java | 4 +- .../com/zhidao/adas/client/bean/Warn.java | 4 +- .../com/zhidao/adas/client/log/LogSave.java | 80 +++++++-- .../zhidao/adas/client/ui/MainActivity.java | 36 ++-- 20 files changed, 313 insertions(+), 75 deletions(-) create mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/OnAdasClientListener.java delete mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Base.java create mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java create mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MySSHResult.java diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/OnAdasClientListener.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/OnAdasClientListener.java new file mode 100644 index 0000000000..c3de9e1ffb --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/OnAdasClientListener.java @@ -0,0 +1,154 @@ +package com.zhidao.adas.client; + +import com.zhidao.adas.client.bean.ArrivalNotification; +import com.zhidao.adas.client.bean.AutopilotState; +import com.zhidao.adas.client.bean.BasicInfoReq; +import com.zhidao.adas.client.bean.CarConfigResp; +import com.zhidao.adas.client.bean.GlobalPathResp; +import com.zhidao.adas.client.bean.GnssInfo; +import com.zhidao.adas.client.bean.MogoReportMessage; +import com.zhidao.adas.client.bean.PerceptionTrafficLight; +import com.zhidao.adas.client.bean.RecordPanel; +import com.zhidao.adas.client.bean.TrackedObjects; +import com.zhidao.adas.client.bean.Trajectory; +import com.zhidao.adas.client.bean.VehicleState; +import com.zhidao.adas.client.bean.Warn; +import com.zhidao.support.adas.high.bean.IPCUpgradeStateInfo; +import com.zhidao.support.adas.high.bean.SSHResult; +import com.zhidao.support.adas.high.common.ProtocolStatus; + +public abstract class OnAdasClientListener { + /** + * 自动驾驶局部轨迹 车前引导线 + * + * @param trajectory 数据 + */ + public void onTrajectory(Trajectory trajectory) { + } + + /** + * 障碍物 他车数据 + * + * @param trackedObjects 数据 + */ + public void onTrackedObjects(TrackedObjects trackedObjects) { + } + + /** + * 惯导信息 + * + * @param gnssInfo 数据 + */ + public void onGnssInfo(GnssInfo gnssInfo) { + } + + /** + * 底盘信息, 透传底盘状态,pb参考底盘 + * + * @param vehicleState 数据 + */ + public void onVehicleState(VehicleState vehicleState) { + } + + /** + * 自动驾驶状态 + * + * @param autopilotState 数据 + */ + public void onAutopilotState(AutopilotState autopilotState) { + } + + /** + * 监控事件报告 + * + * @param mogoReportMessage 数据 + */ + public void onReportMessage(MogoReportMessage mogoReportMessage) { + } + + /** + * 感知红绿灯 + * + * @param trafficLights 感知红绿灯 + */ + public void onPerceptionTrafficLight(PerceptionTrafficLight trafficLights) { + } + + /** + * 自动驾驶设备基础信息请求 + * + * @param basicInfoReq 数据 目前没有任何参数 + */ + public void onBasicInfoReq(BasicInfoReq basicInfoReq) { + } + + /** + * 车机基础信息应答 + * + * @param carConfigResp 数据 + */ + public void onCarConfigResp(CarConfigResp carConfigResp) { + } + + /** + * 数据采集结果 + * + * @param recordPanel 数据 + */ + public void onRecordResult(RecordPanel recordPanel) { + } + + /** + * 自动驾驶路径应答 + * + * @param globalPathResp 数据 + */ + public void onGlobalPathResp(GlobalPathResp globalPathResp) { + } + + + /** + * 报警信息 + * 暂时保留,目前没有使用 + * + * @param warn 数据 + */ + @Deprecated + public void onWarn(Warn warn) { + } + + /** + * 到站提醒 自动驾驶站点 + * + * @param arrivalNotification 数据 + */ + public void onArrivalNotification(ArrivalNotification arrivalNotification) { + } + + /** + * 升级状态 + * + * @param info + */ + @Deprecated + public void onUpgradeStateInfo(IPCUpgradeStateInfo info) { + } + + /** + * 向IPC发送命令返回结果 + * + * @param info + */ + public void onSSHResult(SSHResult info) { + } + + /** + * 数据错误 + * + * @param status 错误原因 + * @param bytes 原始数据 + */ + public void onError(ProtocolStatus status, byte[] bytes) { + + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ArrivalNotification.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ArrivalNotification.java index 787f60c6d0..64d47bc670 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ArrivalNotification.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ArrivalNotification.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class ArrivalNotification extends Base { +public class ArrivalNotification extends BaseInfo { public final MessagePad.ArrivalNotification bean; public ArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutopilotState.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutopilotState.java index 95924fa432..aaebc9ba7a 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutopilotState.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutopilotState.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class AutopilotState extends Base { +public class AutopilotState extends BaseInfo { public final MessagePad.AutopilotState bean; public AutopilotState(MessagePad.Header header, MessagePad.AutopilotState bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Base.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Base.java deleted file mode 100644 index e492bd77ef..0000000000 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Base.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.zhidao.adas.client.bean; - - -import com.google.protobuf.TextFormat; - -import mogo.telematics.pad.MessagePad; - -public abstract class Base { - public final MessagePad.Header header; - public final int len; - - public Base(int len, MessagePad.Header header) { - this.len = 8 + header.getSerializedSize() + len; - this.header = header; - } - - @Override - public String toString() { - return len + "##Header:[" + TextFormat.printer().escapingNonAscii(false).shortDebugString(header)+"]\n"; - } -} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java new file mode 100644 index 0000000000..cf2f171b1d --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BaseInfo.java @@ -0,0 +1,32 @@ +package com.zhidao.adas.client.bean; + + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public abstract class BaseInfo { + public final String action; + public final long nowTime; + public final MessagePad.Header header; + public final int len; + + public BaseInfo(String action, int len, MessagePad.Header header) { + this.action = action; + nowTime = System.currentTimeMillis(); + this.len = 8 + header.getSerializedSize() + len; + this.header = header; + } + + public BaseInfo(String action, int len) { + this.action = action; + nowTime = System.currentTimeMillis(); + this.len = len; + this.header = null; + } + + @Override + public String toString() { + return len + "##Header:[" + TextFormat.printer().escapingNonAscii(false).shortDebugString(header) + "]\n"; + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BasicInfoReq.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BasicInfoReq.java index 698bea7d2d..496d32df71 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BasicInfoReq.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BasicInfoReq.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class BasicInfoReq extends Base { +public class BasicInfoReq extends BaseInfo { public final MessagePad.BasicInfoReq bean; public BasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/CarConfigResp.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/CarConfigResp.java index 85488fe61a..0fadfaa882 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/CarConfigResp.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/CarConfigResp.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class CarConfigResp extends Base { +public class CarConfigResp extends BaseInfo { public final MessagePad.CarConfigResp bean; public CarConfigResp(MessagePad.Header header, MessagePad.CarConfigResp bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java index aded5d05cc..a9e21f6c31 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java @@ -3,11 +3,12 @@ package com.zhidao.adas.client.bean; import com.zhidao.support.adas.high.common.DigitalTrans; import com.zhidao.support.adas.high.common.ProtocolStatus; -public class ErrorData { +public class ErrorData extends BaseInfo { private final ProtocolStatus status; private final byte[] bytes; public ErrorData(ProtocolStatus status, byte[] bytes) { + super("接收", bytes.length); this.status = status; this.bytes = bytes; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GlobalPathResp.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GlobalPathResp.java index 5fb044171c..5d4d67cd6d 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GlobalPathResp.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GlobalPathResp.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class GlobalPathResp extends Base { +public class GlobalPathResp extends BaseInfo { public final MessagePad.GlobalPathResp bean; public GlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GnssInfo.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GnssInfo.java index cb762f80f8..2e37afa373 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GnssInfo.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GnssInfo.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class GnssInfo extends Base { +public class GnssInfo extends BaseInfo { public final MessagePad.GnssInfo bean; public GnssInfo(MessagePad.Header header, MessagePad.GnssInfo bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MogoReportMessage.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MogoReportMessage.java index 39a2f8e7e2..54c4eb7be9 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MogoReportMessage.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MogoReportMessage.java @@ -5,11 +5,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; import mogo_msg.MogoReportMsg; -public class MogoReportMessage extends Base { +public class MogoReportMessage extends BaseInfo { public final MogoReportMsg.MogoReportMessage bean; public MogoReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MySSHResult.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MySSHResult.java new file mode 100644 index 0000000000..0273e1713d --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MySSHResult.java @@ -0,0 +1,10 @@ +package com.zhidao.adas.client.bean; + +public class MySSHResult extends BaseInfo { + public final String info; + + public MySSHResult(String info, int len) { + super("接收", len); + this.info = info; + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PerceptionTrafficLight.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PerceptionTrafficLight.java index 5b50580c61..5587a6acd8 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PerceptionTrafficLight.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PerceptionTrafficLight.java @@ -5,11 +5,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; import perception.TrafficLightOuterClass; -public class PerceptionTrafficLight extends Base { +public class PerceptionTrafficLight extends BaseInfo { public final TrafficLightOuterClass.TrafficLights bean; public PerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/RecordPanel.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/RecordPanel.java index 3071ef7317..c00cce9217 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/RecordPanel.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/RecordPanel.java @@ -5,11 +5,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; -public class RecordPanel extends Base { +public class RecordPanel extends BaseInfo { public final RecordPanelOuterClass.RecordPanel bean; public RecordPanel(MessagePad.Header header, RecordPanelOuterClass.RecordPanel bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/TrackedObjects.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/TrackedObjects.java index caaa4d1c81..efcbcb2fef 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/TrackedObjects.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/TrackedObjects.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class TrackedObjects extends Base { +public class TrackedObjects extends BaseInfo { private MessagePad.TrackedObjects bean; public TrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Trajectory.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Trajectory.java index 047888f8f7..ac4cbe5c33 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Trajectory.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Trajectory.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class Trajectory extends Base { +public class Trajectory extends BaseInfo { public final MessagePad.Trajectory bean; public Trajectory(MessagePad.Header header, MessagePad.Trajectory bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } @Override diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/VehicleState.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/VehicleState.java index df03675788..ebdacb3c7d 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/VehicleState.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/VehicleState.java @@ -5,11 +5,11 @@ import com.google.protobuf.TextFormat; import chassis.VehicleStateOuterClass; import mogo.telematics.pad.MessagePad; -public class VehicleState extends Base { +public class VehicleState extends BaseInfo { public final VehicleStateOuterClass.VehicleState bean; public VehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Warn.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Warn.java index f438ae5b8f..fd41e8e212 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Warn.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Warn.java @@ -4,11 +4,11 @@ import com.google.protobuf.TextFormat; import mogo.telematics.pad.MessagePad; -public class Warn extends Base { +public class Warn extends BaseInfo { public final MessagePad.Warn bean; public Warn(MessagePad.Header header, MessagePad.Warn bean) { - super(bean.getSerializedSize(), header); + super("接收", bean.getSerializedSize(), header); this.bean = bean; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java index 016bfcacbc..ad3059f24d 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java @@ -4,6 +4,21 @@ import android.os.Environment; import android.text.TextUtils; import android.util.Log; +import com.zhidao.adas.client.OnAdasClientListener; +import com.zhidao.adas.client.bean.ArrivalNotification; +import com.zhidao.adas.client.bean.AutopilotState; +import com.zhidao.adas.client.bean.BaseInfo; +import com.zhidao.adas.client.bean.BasicInfoReq; +import com.zhidao.adas.client.bean.CarConfigResp; +import com.zhidao.adas.client.bean.GlobalPathResp; +import com.zhidao.adas.client.bean.GnssInfo; +import com.zhidao.adas.client.bean.MogoReportMessage; +import com.zhidao.adas.client.bean.PerceptionTrafficLight; +import com.zhidao.adas.client.bean.RecordPanel; +import com.zhidao.adas.client.bean.TrackedObjects; +import com.zhidao.adas.client.bean.Trajectory; +import com.zhidao.adas.client.bean.VehicleState; +import com.zhidao.adas.client.bean.Warn; import com.zhidao.support.adas.high.common.ThreadPoolManager; import java.io.BufferedWriter; @@ -11,7 +26,9 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; @@ -25,12 +42,13 @@ public class LogSave { private static final String LOG_FILE_NAME = "%s.log";//文件名称 private volatile static LogSave INSTANCE; private static final long MAX_CAPACITY = 20 * 1024 * 1024L;//单文件最大存储容量 kb - private final LinkedBlockingQueue queue; + private final LinkedBlockingQueue queue; private BufferedWriter buff = null; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()); private File file; private volatile long capacity = MAX_CAPACITY; private Future future; + private List listeners = new ArrayList<>(); private LogSave() { queue = new LinkedBlockingQueue<>(); @@ -47,6 +65,15 @@ public class LogSave { return INSTANCE; } + public void registerOnAdasClientListener(OnAdasClientListener listener) { + if (!listeners.contains(listener)) { + listeners.add(listener); + } + } + + public void unregisterOnAdasClientListener(OnAdasClientListener listener) { + listeners.remove(listener); + } public boolean isSdcardUse() { boolean bl = false; @@ -74,13 +101,12 @@ public class LogSave { } - public void saveLog(String action, String data) { - long nowTime = System.currentTimeMillis(); - String time = sdf.format(new Date(nowTime)); - String builder = time + " [action]:" + action + " [data]:" + data; - queue.add(builder); - } + public void saveLog(BaseInfo info) { + if (isStart()) { + queue.add(info); + } + } public boolean isStart() { return future != null; } @@ -128,9 +154,43 @@ public class LogSave { closeBufferedWriter(); getFile(); } - String data = queue.take(); - if (!TextUtils.isEmpty(data)) { - buff.write(data); + BaseInfo data = queue.take(); + if (!listeners.isEmpty()) { + for (OnAdasClientListener listener : listeners) { + if (data instanceof Trajectory) { + listener.onTrajectory((Trajectory) data); + } else if (data instanceof TrackedObjects) { + listener.onTrackedObjects((TrackedObjects) data); + }else if (data instanceof GnssInfo) { + listener.onGnssInfo((GnssInfo) data); + }else if (data instanceof VehicleState) { + listener.onVehicleState((VehicleState) data); + }else if (data instanceof AutopilotState) { + listener.onAutopilotState((AutopilotState) data); + }else if (data instanceof MogoReportMessage) { + listener.onReportMessage((MogoReportMessage) data); + }else if (data instanceof PerceptionTrafficLight) { + listener.onPerceptionTrafficLight((PerceptionTrafficLight) data); + }else if (data instanceof BasicInfoReq) { + listener.onBasicInfoReq((BasicInfoReq) data); + }else if (data instanceof CarConfigResp) { + listener.onCarConfigResp((CarConfigResp) data); + }else if (data instanceof RecordPanel) { + listener.onRecordResult((RecordPanel) data); + }else if (data instanceof GlobalPathResp) { + listener.onGlobalPathResp((GlobalPathResp) data); + }else if (data instanceof Warn) { + listener.onWarn((Warn) data); + }else if (data instanceof ArrivalNotification) { + listener.onArrivalNotification((ArrivalNotification) data); + } + } + } + + String time = sdf.format(new Date(data.nowTime)); + String builder = time + " [action]:" + data.action + " [data]:" + data.toString(); + if (!TextUtils.isEmpty(builder)) { + buff.write(builder); buff.newLine(); buff.flush(); } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index fbfb7d61ae..622e1e6fac 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -54,6 +54,7 @@ import com.zhidao.adas.client.bean.GlobalPathResp; import com.zhidao.adas.client.bean.GnssInfo; import com.zhidao.adas.client.bean.IPCConnectState; import com.zhidao.adas.client.bean.MogoReportMessage; +import com.zhidao.adas.client.bean.MySSHResult; import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.RecordPanel; import com.zhidao.adas.client.bean.TrackedObjects; @@ -632,7 +633,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onSSHResult(final SSHResult info) { - LogSave.getInstance().saveLog("接收", info.toString()); + MySSHResult result = new MySSHResult(info.toString(), 0); + LogSave.getInstance().saveLog(result); showToastCenter("IPC命令下发结果:" + info.code + " 命令:" + info.cmd + " 信息:" + info.msg); CupidLogUtils.w(TAG, "IPC命令下发结果:" + info.code + " 命令:" + info.cmd + " 信息:" + info.msg); } @@ -640,63 +642,63 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onError(ProtocolStatus status, byte[] bytes) { ErrorData base = new ErrorData(status, bytes); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) { Trajectory base = new Trajectory(header, trajectory); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onTrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects trackedObjects) { TrackedObjects base = new TrackedObjects(header, trackedObjects); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onGnssInfo(MessagePad.Header header, MessagePad.GnssInfo gnssInfo) { GnssInfo base = new GnssInfo(header, gnssInfo); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onVehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState vehicleState) { VehicleState base = new VehicleState(header, vehicleState); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onAutopilotState(MessagePad.Header header, MessagePad.AutopilotState autopilotState) { AutopilotState base = new AutopilotState(header, autopilotState); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage mogoReportMessage) { MogoReportMessage base = new MogoReportMessage(header, mogoReportMessage); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onPerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights trafficLights) { PerceptionTrafficLight base = new PerceptionTrafficLight(header, trafficLights); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq) { BasicInfoReq info = new BasicInfoReq(header, basicInfoReq); - LogSave.getInstance().saveLog("接收", info.toString()); + LogSave.getInstance().saveLog(info); AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); showToastCenter("收到车机基础信息请求:" + info.toString()); // EventBus.getDefault().post(new BasicInfoReq(header, basicInfoReq)); @@ -705,14 +707,14 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onCarConfigResp(MessagePad.Header header, MessagePad.CarConfigResp carConfigResp) { CarConfigResp base = new CarConfigResp(header, carConfigResp); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().postSticky(base); } @Override public void onRecordResult(MessagePad.Header header, RecordPanelOuterClass.RecordPanel recordPanel) { RecordPanel base = new RecordPanel(header, recordPanel); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); recordKey = recordPanel.getKey(); recordFileName = recordPanel.getFilename(); EventBus.getDefault().post(base); @@ -721,27 +723,27 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onGlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp globalPathResp) { GlobalPathResp base = new GlobalPathResp(header, globalPathResp); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onWarn(MessagePad.Header header, MessagePad.Warn warn) { Warn base = new Warn(header, warn); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification arrivalNotification) { ArrivalNotification base = new ArrivalNotification(header, arrivalNotification); - LogSave.getInstance().saveLog("接收", base.toString()); + LogSave.getInstance().saveLog(base); EventBus.getDefault().post(base); } @Override public void onUpgradeStateInfo(final IPCUpgradeStateInfo info) { - LogSave.getInstance().saveLog("接收", info.toString()); +// LogSave.getInstance().saveLog("接收", info.toString()); EventBus.getDefault().post(info); } @@ -898,7 +900,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } getHandler().sendEmptyMessage(WHAT_IPC_IP); } - LogSave.getInstance().saveLog("连接状态", status); +// LogSave.getInstance().saveLog("连接状态", status); CupidLogUtils.i(TAG, "connectStatus=" + status); } From 00a58dc0ab234a66ab98f5d002ea4303f4eef261 Mon Sep 17 00:00:00 2001 From: liujing Date: Thu, 7 Apr 2022 16:31:50 +0800 Subject: [PATCH 11/18] =?UTF-8?q?[add]=20=E6=96=B9=E5=90=91=E7=9B=98UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/hmi_steering_wheel.xml | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml new file mode 100644 index 0000000000..8c7414c51e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + \ No newline at end of file From 6982fbe72b9885c0ca591416ef3ec5a7b2ac6a08 Mon Sep 17 00:00:00 2001 From: liujing Date: Thu, 7 Apr 2022 16:39:35 +0800 Subject: [PATCH 12/18] =?UTF-8?q?[add]=20=E6=96=B9=E5=90=91=E7=9B=98UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/drawable-xxhdpi/bg_steering_outer.xml | 13 +++++++++++++ .../res/drawable-xxhdpi/bg_steering_wheel.xml | 9 +++++++++ .../drawable-xxhdpi/streeing_wheel_rotate.xml | 18 ++++++++++++++++++ .../res/drawable-xxhdpi/taxi_p_auto_nor.png | Bin 0 -> 20990 bytes .../drawable-xxhdpi/taxi_p_un_auto_nor.png | Bin 0 -> 9878 bytes .../main/res/layout/hmi_steering_wheel.xml | 11 ++++++----- 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_outer.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_wheel.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/streeing_wheel_rotate.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_auto_nor.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_un_auto_nor.png diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_outer.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_outer.xml new file mode 100644 index 0000000000..f5e1da1a55 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_outer.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_wheel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_wheel.xml new file mode 100644 index 0000000000..156cc4f0e0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_steering_wheel.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/streeing_wheel_rotate.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/streeing_wheel_rotate.xml new file mode 100644 index 0000000000..a883260939 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/streeing_wheel_rotate.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_auto_nor.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_auto_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c15a11f4e4a2aa8f6cc7e4a20184fcb66a3e19bd GIT binary patch literal 20990 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 IM6N<$g2sW&M*si- literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml index 8c7414c51e..9ae5e25253 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml @@ -1,7 +1,8 @@ - + Date: Thu, 7 Apr 2022 17:30:14 +0800 Subject: [PATCH 13/18] =?UTF-8?q?[add]=20=E6=96=B9=E5=90=91=E7=9B=98UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/widget/SteeringWheelView.java | 35 +++++++++ .../hmi/ui/widget/TapPositionView.java | 41 ++++++++++ .../taxi_steering_wheel_color_selector.xml | 12 +++ .../main/res/layout/hmi_steering_wheel.xml | 75 ++++++++++--------- .../src/main/res/layout/hmi_tap_position.xml | 68 +++++++++++++++++ 5 files changed, 196 insertions(+), 35 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_tap_position.xml diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java new file mode 100644 index 0000000000..393c733fcd --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java @@ -0,0 +1,35 @@ +package com.mogo.eagle.core.function.hmi.ui.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.mogo.eagle.core.function.hmi.R; + +/** + * @author Jing + * @description 方向盘 + * @since: 4/7/22 + */ +public class SteeringWheelView extends ConstraintLayout { + public SteeringWheelView(@NonNull Context context) { + super(context); + LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel, this); + } + + public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java new file mode 100644 index 0000000000..eb43d95c85 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java @@ -0,0 +1,41 @@ +package com.mogo.eagle.core.function.hmi.ui.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.mogo.eagle.core.function.hmi.R; + +/** + * @author Jing + * @description 档位 + * @since: 4/7/22 + */ +public class TapPositionView extends ConstraintLayout { + private TextView tabP; + private TextView tabR; + private TextView tabN; + private TextView tabD; + + public TapPositionView(Context context) { + super(context); + LayoutInflater.from(context).inflate(R.layout.hmi_tap_position, this); + } + + public TapPositionView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public TapPositionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public TapPositionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml new file mode 100644 index 0000000000..0d2bcb88d7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml index 9ae5e25253..384f1a6e54 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml @@ -1,41 +1,46 @@ - + - - + - + - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_tap_position.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_tap_position.xml new file mode 100644 index 0000000000..5020791857 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_tap_position.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + \ No newline at end of file From eda6520da70d8267ead310f540dca566833de21e Mon Sep 17 00:00:00 2001 From: liujing Date: Thu, 7 Apr 2022 18:59:26 +0800 Subject: [PATCH 14/18] =?UTF-8?q?[add]=20=E6=96=B9=E5=90=91=E7=9B=98UI,?= =?UTF-8?q?=E7=BC=BA=E5=B0=91=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-bus-passenger/build.gradle | 2 + .../main/res/layout/bus_p_base_fragment.xml | 9 +++ .../hmi/ui/widget/SteeringWheelView.java | 16 ++--- .../hmi/ui/widget/TapPositionView.java | 16 ++--- .../src/main/res/drawable-xxhdpi/bg_auto.png | Bin 0 -> 36754 bytes .../main/res/drawable-xxhdpi/bg_auto_nor.png | Bin 0 -> 37355 bytes .../res/drawable-xxhdpi/icon_in_steering.png | Bin 0 -> 1666 bytes .../res/drawable-xxhdpi/taxi_p_auto_nor.png | Bin 20990 -> 0 bytes .../drawable-xxhdpi/taxi_p_un_auto_nor.png | Bin 9878 -> 0 bytes .../main/res/layout/hmi_steering_wheel.xml | 68 +++++++++++++----- 10 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_auto.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_auto_nor.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_in_steering.png delete mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_auto_nor.png delete mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_un_auto_nor.png diff --git a/OCH/mogo-och-bus-passenger/build.gradle b/OCH/mogo-och-bus-passenger/build.gradle index b38804a63d..fc55956e11 100644 --- a/OCH/mogo-och-bus-passenger/build.gradle +++ b/OCH/mogo-och-bus-passenger/build.gradle @@ -60,6 +60,7 @@ dependencies { implementation rootProject.ext.dependencies.mogo_core_data implementation rootProject.ext.dependencies.mogo_core_function_call implementation rootProject.ext.dependencies.mogo_core_function_v2x + implementation rootProject.ext.dependencies.mogo_core_function_hmi }else { implementation project(":core:mogo-core-utils") implementation project(":foudations:mogo-commons") @@ -67,6 +68,7 @@ dependencies { implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-function-call') implementation project(':core:function-impl:mogo-core-function-v2x') + implementation project(':core:function-impl:mogo-core-function-hmi') } } diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml index 77d9ef65f8..92d0795565 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml @@ -1,6 +1,15 @@ + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java index 393c733fcd..ed6f67ba54 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget; import android.content.Context; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import androidx.annotation.NonNull; @@ -16,20 +17,11 @@ import com.mogo.eagle.core.function.hmi.R; * @since: 4/7/22 */ public class SteeringWheelView extends ConstraintLayout { - public SteeringWheelView(@NonNull Context context) { - super(context); - LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel, this); - } + private static final String TAG = "SteeringWheelView"; public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); - } - - public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); + LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel, this); + Log.d(TAG, "2"); } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java index eb43d95c85..f0717ea872 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget; import android.content.Context; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -17,25 +18,16 @@ import com.mogo.eagle.core.function.hmi.R; * @since: 4/7/22 */ public class TapPositionView extends ConstraintLayout { + private static final String TAG = "TapPositionView"; private TextView tabP; private TextView tabR; private TextView tabN; private TextView tabD; - public TapPositionView(Context context) { - super(context); - LayoutInflater.from(context).inflate(R.layout.hmi_tap_position, this); - } - public TapPositionView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); - } + Log.d(TAG, "2"); + LayoutInflater.from(context).inflate(R.layout.hmi_tap_position, this); - public TapPositionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public TapPositionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_auto.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_auto.png new file mode 100644 index 0000000000000000000000000000000000000000..748625a43c3ed6c7ea5d8cede3a2d1f555912484 GIT binary patch literal 36754 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

Ulpf2-bS`}yT92F< z$YnohnhbDA#6AImTsfe0JqcKs${~Hq26AaCOP)r`B*0GQh$&YvOIu!`e;ryzc|Mwr zx|l#HA9OCctBywAxZu4haZz7Dn?*Y>U}?|8Izp`_H+uR{4B&dYy ze0-SBNg}*xz4PcDpG?ongKZC=5LU-NkbaQDNR=`cr1l;Nx)T0WXYi#$ORH_>0nBn) zoNeoo>t~gbbqjCOuC{N>pkV>JVu?HxW5n7sam%*oT<226I+ukUwi=$1GaQ+jE}c*s zXE_Q>Rce~}q+?nx&&~o+bIh=wT4*X*W?`7+@>!nF)@|*&=2^Tm4Hk+k`dA;!(Xj*Q zGfjP$r{yIXX&K)Lvx7CB)s-*DDjC;-Fe;^6&_t1CoE4rq5^z2*A=tY zn?rqoJ^LMbba0Ad1l=zzck7?8&Ay) z^A>W%+(PL~Nn1A1PgHr@?mcNrMLP^2AqAit5}NTW%PC0d=;QH!f5-t5og!SPQ^_oC zX9=`JtXe^g-WMfHIoqYu1Wh^0Fb`jo&Xk?i&4%fiubt-Nnl5=H$?=?Bd2+OxFLmeB zE!$Qesni0>1*L6igLH5NvN-1}ulafv>@26WnomBk+c|6km4RIPIF!_;u@rPk%Pcx` zq#(k=0Ys1}jo7f%P5GS;vgZt}#Z^2kf0oXCJrJZ*+8_mXo&~pTpqKD!m5H(3W&xKp zT3El2@s$&pBou^#LS306Bt0jvD8iM|@PJRHBA+B`#n}OP*$(|?txI2lY^mQCuL>>& zi3}kQi>~!&wE6Z)m5*!KbuP;YKQ4Wtu(XN%dF@Ey6PFiR@@;7Q&bPylyo|z*{ZXD! z-op!tSU7~SIM%zk`mFviwuat_dp()782QyObwzVxA2=ahFCpVjBW zwzNw}8snrX^njg3oM5gwy-4nflb_KT{UGWt6i30Hb$(EiaPQ!;$1~xel*P_=RZIo~ zl$H|$Wi(CVtd)RfzJyUH%#MVa#WXltBNvoTu|QCjf=<+_9Rx}aU1Sv`3cGrx4R$2s zLekp=D^=@eqL4#_oq)nD*5jhazJU<%s8h9m-Wm(wKI3gt2G{&`K)R#0(cfOQI zI4iGVCb^Ey^x*22bS)1Wxq>jRW$D97IhUR3 z8OG^2JhVJ*b&)6y0A>ft zWtn6MvnF~hMki@3N;=#?_)T2eCCoSpobPC}G*$wq0A*O}VmixcIrW*0`Uc7)FDs9* zf;ubDG&rqS$}UZYPU=?2Uhf-EK&Zjb*z!@FV#7Jm5 zNkOEuCqgf4E3B0fg(@emOxBik9W&XhaBQC)NDt0GcEE0T!3367e&}mh(-D_~F3vD- zwzIZ!bOU8I9e!4xX*h;~EAioWbLFz~j%LB~p!egp!6(Z^Y=T#u)`Ln!hm30;gNSQ= z^tCN1tyUW}JOL!?WS4wbcgDZtPwHUU#kF0QXCBk(7t{Kk#11ipl$<-_u=YfjHi*S6 zdC|a#9Ohkdm7iKgoHq}4obG-5$vYvC+>nZZ0!n0qO5#p93N4Dz zbd5{Cwbi8OjgZiRTojBn4mE`WWn|dNI*_lwR6Y-Tf*|bbw)4p-DVZSXG-1_`NCzt~ znU8FSr86|lxYk8JU3wlEnkMytM#^g$tuI#(=?2O>TIEA@=IAAyYgcKcyyJywBMCMx z0;76=!!%j0OS!2T#KpoQX613G1JbSLEDiHmH`frMHfD-p;Cdn{0gKQ4yo{E})z7jx zq$r9j|Mtq8rAHf*C-0PUf+6$?Fhy(`V2qBKBlc_zdjU^QW?@ZR%wIClwF0|snTufu zg^=4G%-FknKPabuw}`!QlC-;Tf6H_t*(Y1eQeg{rm`fK$UB?_Z@ zk*5}hVdgnsECoqfFMOU1Ql39>b`F`Hh(rGIisEsA0tJLemct?C$&amMfOl4`vS?U* zO-DKDe8z3Fwr=t-GT8D1;apkagKaxnR-piq3Ujns`$~hnAeqAp^tjqO`BfR<~?Ksu2B&-Z=B3^vp(tQM})4^~E&DH+=y(nCAE010a#C zVk--n6%1eSweBvqF-1J?`KEvkia3`D5^O2r;|EpYeNb$_K{}jz*s%d&oH;4B0mBA& zz8AEA&NuOoTP8pbCQ^UYbk=Q?ejqQ}A<8G?8qV`P9F}rgp4Cux9`u}?!)f{a;V=QH zY2uTQT-rcgLX1s9T2p4^=o9v;MQW&kGT~#?f89$)KjZn_Iu75ifJ*|rxrVJMy#i~( zqzBTIAVhvZO`}hd7Bdf@V@N8J#$7{9gmj@tkKps&$Ai`5N2(Y7YUEX}Wxc`|eextN z<B-!k}(NIoT5NdIpy4mH~9ueK)o! zyDFW*b{BnTtMakCRtqykeptaJXZDU{WaO7c!Fj<@NQ9@KOBayCF!+CW-J;|g=&&Nqc#Y>DARVqC%4u((wHuJG?7!64f8};yA#Db}Kg+IaG96tg^ za7HjcH6xGQZMs!_(WQ)ynAjwf9dNYMv~%+5nuj7NApcTM%1feDZ!;`ORW>+~tsoBEHwbXC?kLO1sAhP;B3CTNYD|B?2T9y~1Fa zMV@*m{Y8ADZ&(=Ys76t-oARL}CGT5*@Kp7hYxDYH-TjRC99jgD?lr_3#gac6*2b4wb!VA{?q1mC=&vl~%bkYiyN#!;~71xzuv%V`@= zM?If66Hwf@cVP@bhvGXD}+QQd~VUn?r4z`Hr!F`~B zZXOA25Ol>Uc6VT}=`3vXm6qjvd?=6ga05)%+m8IBsPVJxW9etG;zd0(`tWUF1~ri< zc=Yp!@XBnLPEYft7!zDMrO|wnGQ3c|lFq#Rk#FCXT}t`!V|NMIRW92uhZezSDL3W! zO(^=HUQVo6)$am2r9Rm&tP6Fr&+w^=w(21-zl0Z;zq26)R)85|hZrK3h$&)=7!w)f zGxz+ICY{A%ADcFHvEL;DeX+t^d!UbIgD{dk5_vPqc~B2fjgR*_emA;H1SdG$AsvrO z^Kpim4%Ll#=bg9B!&lA(paSRuzL%rG=BHj@i@ZXF3oC3=w7_BWNoNmiQZMBTa+0uK zc2L|N`3%}Tz;PxKM!#@;+LWKfNo2-0P zvM#GrKRH@_;RVXSD9`DJX?jSylb>nWO!h86>UD@2JBQvf+;5YZqMnE`S?9vYGTpL) zZs#*O#n?>?rJgWk@GJ|!2D2C_W1Nn~Bqljt|4Jq>soWvTAk+CY4WG5;l~i6F-~d1^ zpwS@!H9IE7zF^pu58((6VK6uEz~d_BdGu{LyyzzN89^G4RGlf4K6A{4^3coPMlco!v^#ei>}G24 zv8%h~!?ROQ#6hh*>d*9M3PGh%z^7}qv5&-wGpYdVYN%2zs1n@!UHZ=2wwRXE`aNffuDXic~#s<#`-`m=+0s?Z%nR>^vB#;MdFff>3X9&wfiYInJ9vC9X?4FLY_XG^@Dx(d zYNn}$5-s|L^Zd(SdKvmLPVhM!T-soPd$7=$4iM{&?*v34zE&UfpyCL#ENgmU<}FPP*0PqbP%WoY41KRzIX4R}ZYKeYQW??7>nAcv2SJ+68122+~ZpYfS> zmXkwdQp@CgNuzF@d?Kf#U$8v$NUqNrB*Fx%pJ6>&lp#OYUUlv%vw8YPS&mDC!GkEW zzImAPQBJYm)G6er9;gq|i|Ezrj5?+M@_J=h(xG$Fr%Z`pb8qyC^bPumeKj?@;}r^W z@~wTkklZR)kaoWjM#txf6=Ft41L(Y<-NVp@D`T-^ugthmF?0@lHnQa3Wei<*y2?58 z(f}j-%u%@^1!HnU8slaHR>IAv(-Ie^X1+xGE5gx-R(P<}RA5%hFqK2Uw|?Uw0Hk%?Ip#O?lyB$mdGM@jAdln*HaaLR2BK*8w)TZK}eIh|5})MKVo#6|Da zE7BQeU$9SXy*=E}CYX;|_X`Wjm+3}W>gz!Gk7vFlS8H5lh#6uhz_g;h5$&bK7BObA zrXMFz46=r$xn%&|R;-@@u{Q~J&5OMupBB|_oh;7rTpB7 zIef%4iX6Jw%Ma!^WGvW&0l{oxY?|$_uygd#4ptCII>eF=wS8uiO&foa%H+2!V}AO= z52K=A#0M>L0M2rG4WnM##Q+>*J01+15SAwlaUhN~@qL0GWzcEj<4Qq`#9@uSq~lXo ze(8ZYDZdwU?slL{e(2Cc$I3wCCmlS!8jYs&Z+kicfiRvNN2~Y1rjw={a3E z7P59tZw{+2?>FPK4}dj$)5&&hn7)UxUirP0hu0;_M>(wp#t<;4hZK6r>&fa31_XN4 z1M7Tch$uRT?%4PDYhKNZVg&qaTP7f}NPLLl=Cc z6j&mrh%I7_Sfd^kdkmk7TQbmf(68$Yvd6G)oF0}sY0%^oQi46gB?#km=rq7bw>+G! zg*{Jv0hd;JzBW$@(n-)wzOxZd3gOl1i!a#@gBDY{c>KfLo(NyU0ND8jR~+4Pgl{I< z8yMWgFbvz@OS+AWhV%qKJF1BC>?B-t1@P9=*|~X4VB)2->h0L6`aO`hZ67gNb%IVn z-aCM;!LeLG9+4x<0*nF2zjm_9!YqcRn;e~!SM{I(k-9*euS?VDdl<;4&Bw7r_jmBA znmWehxN(G1^M~(y7^alpLpdmqj>{=00dD1{!GI2-59&qqBRZr$8xi#(3Ll`1EBm0=cq%A&>$F{=lg9t^?V6=rX7B52qzC$E)qY%V=_p!Z6 zyYn?Yo9U}EBuzUQ4N*~aOz&;p@}Ibkc@O#yO-CL^qpkfS9#=}ON?@lA27W` zyG@Mcy}~Q_Rh|{REJglBHWyZlmI2wxoKM$s>f8DO@D`S-*6)KN4x@MhL%R~bdLz$# zNy;iYM#rZpMt^k}Bjj1aPJV_}7ord32d4A2@#L|+J`Ev1%m%CwGsF%tL@aT9PHYil z#M*LiM9J1NfxeSv#p&Fp&ZlF{o`hw59mLJ22Vs!#(!}Y&@X5WOM33+eQxu|#k&cHL zRFEn{d?E8MYQEyyHwQ7kYlKT%5sKzli@Q+=W0WR7NAJhga3rdgMx(eC$-!_nOro-B zVEG#?7f%3m7CVa8sfgh#uMF0@ClSY+1OeE}z}_{5UEQ?y4vcsoCSUlJ5=Jz5xfo!_ zQZ{@l5*H4vC5flLYvQ>h;2Zg_V?`dy2$!WXjC!&>h8d;In$EB*NATmbY{r}0i_`4^ z<6-*H&ddPh;KRpf%N(4f9)ut6nl*2?!>_(2m#Y`8w+u7zT?K^84&b5>gb7~iiTa}6 zs6RcZTk4p)rp~E*_5u5Xee!5{-B07hd$Gu}ko-BBL{1PwRmr%&_mji~u|bT;kOi0_ zc8H<={Q2-2^gi~S;7jtB33NMF;-$nc+2v=n*QQ~8Ra$S_OHZLxNI2%Q(~SHAC9L{) z9@^t|dN(Mr2Q0elZ01S2Qp5eEI7~2iBHtV>n^kdlH2{x?-93EPwdc>q z)uRACj^5E(e8z4~loUs!u9=N_0to2Cs=Ea9N>Bo$rKrg9z5twK*FM;3=|Qx&YbM@_ zuRDB^GjSe3?h)+#C^oG-`~=s7c;;ynO+RGP#*|6AgJXEgqlbW=9q-Zv)QnSBO@l;f z`>09ldoWCS3_}#W0R{U99t7Y7d4dxy;CB)na*+Q;^2r;|{BVWx1a8)fa#|}6WdNu= z@l)u7dZB)(C+drOqb}_cif*Z6>Y6&|7o*t+?2Ed8&RE;4yeI1~mBGm)a%ouQL_AD7 zH*Sa?+CxmpumwXFVuhIDu!R^RmWU~i&xtW&ZMoxfo(ZP}bR84v7|C8rFwJ=IEQqlW z^PPA~D#Mo%xdh2n5zcyEns~F(!{P1U_X+locCuWyi3Oyor59k3JEZZzvVhg~bIyAo z&w4%@E@D=hwegXY#U9JGM@I|i$ zE7b-}J8>TD`C$yfjv0?mGpYSS?63NiEMk&j13*V#z~_AM8P6TXli;Ud=^rr(KVsX) z(5BbI$HTf<0LZBmIF*T~7uMEDeiy6q=J4{zEN*xR@Xi#32H;by&O|#{!Urp8eTMPm z3s)F$=llDUwDRt`bnJsk-0P5E9h2ul&YO42$z@!WoAT32ccBmJh5DhMs4wcRjYod< z-f`%(DY~VOsq0p+m5A=$gu_Aay!T_>+-j96f5K{-hzyyt{zkawANaUnfq3As1sEY# z?68IFTY4Cq^Jyri6$M+IRtBjvk1f;j5^|v|@Y;>|fy7IucV~Rlu7x%6SX|-`nicv9!2l%KfzIPb_T&=>$KLJ^96J~H$ z;!z@)v&~5u^nBDr$LYPK*T%jv_9YbiXccMvS{5y_%ok?Gk><)$UYw8$0QNVc$Iy*lnEVZ9-rn@^5y zNvrLBn9AFVZ@Z#t=#M*N)!P-Xx2A}%MYsJ3kK=<7Zvf#^@>F`&Ww>j)o+==3q6){K zhQ&voIOH*2@Ow9(QMm6xO!DFynI^>$oyiHcB8IzVKPi<;39csT5u8jl^yhAT8GK?h z7IGb%Mm0NeOxpTR@%NN0`f%NPDOqgz!aL|LK#u2Ua*5)N2OmM3{rf)(V9N$j?9cq! zJ`hHp<^vmEcXai~qO;E(Cm&qZ#=COf8`Rd0CTlj1CKJu|IHq&QdZf=JweBePsoEk| zs>TUo40YJqymYhkY3XS3>{J=Q55_Os13X;I!91+xD76khO$#nJg0$wj1B(hI&IR$Z zC?0W1BRvkBmQoJ0#P+HsR$7N6mPRZ$>tPu;RH1JV)WNXi**2n}c2gJo%u$~h%7D*M zZm0$1ZV1LJ6+zDX5|OhOh}@K)dZ5*&UZ@}HX^Yt&tNtp7S}Ao(-BQQYHFZwiA4|?1 zuP3WNhQ7iY01II4HyOqV6$o?v=RlvV^7em}JQE8Xwh$Y{h|abwG;Cp;iZzCppQ!=xz-mcJQXAd!%i_2 zL=~rbR2qgbn_HV+_&=)^d~nq{j^h~QC2r4{op0SUb_`)2t(5B{*m>;8@nCCQA8W|v zn4MjW+PL!ya5?|~+dKalyN>I=-}`>QeY+%A%O$DbG%ZVt=p)MCqPluFe2D#>ZU28%7JY;l_FBHMOlhS zk&?`xB6pX&%YDCJzn?Sr+&k~>4=zPYrYzlu`)2OU+?lyE-+S(vGiT1Qv_QZY&kopw zG$sSN^v6olwW*yucRndMM4|=I65z~S`2nE;RAB~E0oj4c3n5(+)i47;e(ucxZRy39 zkgu^Suqec3u9UDsoLsi9b@1zzIZ+-}?IrXXWL`?@&%hIqJG;UFlINTfYho`ste)C| z_Mly8AKIyCzXPKeCFuxkgVa2-HdaNnd2}T`J$%O(=?m)<`i(CzE6)+Q|E!`k(5vIUaz}V$2om0_c$7KV3oHycA67BIs zqm_$jovGsWjwCQEqh3`*4@61*pjcFX=FfjiAFZHOpEXY0DE1OW4QGvLrImm2*gNn4 zw0ZNtWAX+4c*IZ#79N!H59hr@uFu{zZygE6hkEIAJPvm8s}AG^pnIeAJhv6u}FSfeK67%b|xm5-jf zqJvM0v>B7-**_aKUph1Dh!RxmTF9ekEU#(eQR1UDM$_yQ505TxU0Oq>%Gpy(!^Ne~ z_jd03myl;`B)RG|YoxqVx~8$L!3e}(X?%9^?hkyo`S|1C?#`Y|>)rhdg@^Ma3|zRH zf7+Uzy;zf@x<0UQc9_hqivPT0)a<^TtZ6rers!|r+1HY`*4(kK34OkDJxzN0Jfr!j z=g~5n(hH)*w_A=P5qX`wSh-eLOJGkGVl)oOd2ZFzm|9{yiCpgU%WzZiPn%dA_v#?| z)XMQ=2JTey3IUtJr%kNk*O!Tbw!OR=C3lb;t1|cOXnu7~6nw^jJ^%EB;(?1c6JemZ z?AV`J8!yZ!&-CwmzlMpQ%~~`(YgVVcj(}Tt=JnMDaWm=C=VvOXmL!88Nw%e+nuZ!B zu`R=4Q?m0>UqYd(K(6@VLNaQuXd(2?dn9eSSJD=;e8?;Gs@%(_=y55|zAz$&5`@X4 z`O)%hbJ&=vOCDO6C=m7~h#Gs6m-dZM54?Kw$#4I@KB|WtFy`u!a+gNaX)UMlyn)3R z3@TG!S-9(6H}uwODTAh!mFcK+0#Cc~{`{Ax>edv@fMeXVy<(uB3}`GmR~ zMRYxmdf?OHD~BV!D=d~ov{1+v)^`QCXtkTvm-cJg%zKQ#aIH%~^Tkg>9)8GDmS`d*U7yt_J@?mrH823j=iOfoNd%dCkWJ2nwj8dMt+)oFf-pJrJ!Sdvt3)H?zI;jaUmfvXdc z8y_xLeyM_~O@qq-lo!KX{B~w91{3rdumg`C(gq$~e&rq5qpVEI)~PSf3$$K2sSTvC zqjeNgvI5}QGUgyU4FhiH$)V)TGOh=CXdB<<4Qjr8V#eB%Hl=M>+PBS}>&<;bqQre; zeMDbmfc8FvdYfNy9Q5sV>9OCSujz9^JYYar025#XktJBEE^Ep^lbyS6OUR|b*f{n= z>~{WN70@R$hH9=Kl(t8WnH#j2ygx#uHA&T-SFap7{9I{meA)*D!Uqgg&^u5Zak4&l5is z+|rYWPVyyPcu5pDNRFzx1Qoz8e!SKY$eFQ}P7v~Oy{vqp_);~yO&gO0ke{8PX+}$W%Qx5mOGPD1`m)}0!=&ZKVTlP&GMe^N+i%txbi-#@1 zzGgFTt#)JBl02TzCnJA8`NfObGpY^+-Ld%6QL!FvE!Z|-8X(OtxEUA$tj;V9aQf*l zgl5ii>JEUR{xP+;Fv4M5GH~;Eq`m*EA}II9{o?(k3R*wq1c`nj=d6Fq zY46}Wo8OZ-vAiiY2OD4ntbiHURE!6qSIV~VjISE#lb?`{sd`sby=mYXr|JSv#;Y?! zHWCeL9y$CONnsWz8_^6Hso^**E_j2Va5b#>(hr{8^{%fB_uW!mJhf8V^U|3TpI;wT zZ3XrhO)R=PI=9%>;IwH}kWVQrOklS(khY%&PW`T?z|!ZmvRdT=QUOqYm&UG@FW^@mQ^Tdhuq@67^fES}KAIkA zu|)VX=?le|%B3ra4g*gP$cuqzXwCp~+Uyqb<+S0jc1!ip`JejT!7#nwKn{SjGh4Z2 zec)jRaK-xzq2c%9P4&Z{VF4(84A=uT??t?M*RTOb&TA&r6u2Uh;v_Yn#9XNR_Wo(n zD?T=->N7c22Rzj=@C5#sVX29mP8>f~J%9SwRhb~5h#Hp0Gzt%}GiqUB9xhjU9)IJ^ z-uwPr_m%@Kc+2g9J?QGdw?g%dg~J5Ms0<_}l9ry7xmC}$)>{vr5#y}lX*vxD zm{~O-V<1Sjld{=Q3)8g$RjyHOt~q1i0$!|N5oUSGul&R+n49O5fn4{ucds2i>cGia z7S$DEGPQGd(7H~PTwf@@R80JA7v!`VZFjD6p!Me~_x)Fa{8tRXbPDZGd+UrTc0h5MA3tS%t3IZ;8S|KOp7G|eS5oE3srk%nM$J`ywfYqtlW*9@R9*b9-dLBw zIC!KzG(eWhAP?%qa;n-7p7>6AZS{A&F|A=$KW|K`YGDz;0lc63#D3)5&i8!tmD_Hg z4};TY#>ND3*?P(zq($TGRxyZXNmo}B8g!1U8&?K>2~z{b#s#>rAAnPXRy*-KJ7P_2 zF9J;+(wV9NV9pfDjr#M_7}%ALmxX(jp3~SC?$s&&{Ml})(+|{K15trSL(w2H$_I5P z#0JdRY%vo*+o9wR^5@dq=U-fV&o}h~{dFTQ6K$P`(eBw{0MF79-z=~G&MmbkzC)kV zxAZZ6O`k(Jz(65sfttVcno@JBNlRXpV{@twuYMwzz@WI(Pg)w_G5VH3HK|L&9>k3( zezl%`^b0aGcSzlC)Ef$p-zZ8%%>lQCxl20vCH8*bQvdo#Pv3C&ZD(6&CfJzu1Jt0* zAJ6PEh+Z!mb#>!%=ltQ6!DLR=X+qUdVS4f9lV5S>X8xc9gY{XAaT3pqfIqwt_>C=5 zddt_+gtWwwZ@5pd#IXO2Q**7<3~WF);bMd7j*IA|$1OIXp&8=vjGMD74)Uj#@4o%q zx$7St4AS>m`_i^LW4{5NAlf?X4<|kf7Q@v$^!C|DzhKMbM9HZueN11|=kz@oC?qYs zl&>9cPMtWe8qh;_g%~eZ3oyC5I>0(&W`{{N&}Y^ns_;3J$jL-_x{}stZ|AW?pO$3! z7)i}r*yD;#CCwGt^y71ngUFpp}qOals2e!Ep zamhihFe5-&yL);O>SOz-4}H3-H5mY$KJ_mTeNCSu(P{_-8@-f1-9O2jTSs5v-xUKr zW?wd=>NPcdF4fRr$@Cg*Vy0=URBT`xu`tQ0(~DEb4}VfK&=Rf6OKl}9A($U#3m3)x8uI;2HJFafLezjEEElHPZ@U&#vDo-b% z7QMh9=!W?845YX+(q?fcsUf|<8YDDIpRp>u6vnEU8`4;QPk}@FCs12vu|huKVuQMMPbkR>a`NX=+QLEpr;G3Z2dlm5Z|Y&@^7hQy+S`~D$ zTWZMC6+eWS5SD^2wx9ffo}aTS@ZiRWE6l(wm-P7k3jpu~h!r0BJuG|)LY%aU7p`j` zJ}$dXBeee3t+9+2D+JvmHxI${AzAUspji{cJ~e&M-p9`0|8?1!`n=k>;cZH4YeTiK z%f)k06Gb~4xaE>29bMSlc&arT%F-ng+NxO5Ut{Tu6(}nxW#N++P{gYEWYD9>f9WG<)~6R@~F3$oB18!yrSmMp4aQD zH=(n;_VTCqHIF<`pE=7yU&5C=%i;r2`rgHfLG*c_$@i_I_V>`3f&Um=MVia^T@|2j zRBTMu5pVH%LK48h6#i^nw?r(Ac({sY_?U&Xk-D0R72>Uzzkjf?aOyMa0M8JItKfCASpMU0t`)B!V^ZAClbG9`bs1Zi~C>WnNOHs=g zEDY+|)=tw<)9JMnVRDOdba-9z`o-nT@8F5!34_ng!(xAS|Ku~tJj9`rOz;JeOOGqF zQOK7E8z^q@l{$szxz}bo?F*K%DhHFlvh%U?AO9`E@b^^qJZZh0ye<>v=k@or+!T(% zuIj1J>~DSlAbn*Zmz0G*q%Y~yah8SI+BL%fSO_eO%lFS-(Na0D&}J?#>Qy_m@FdUg zp@$xl|8tsNPGqO?OQNEhns3dQmTN1enT6@na?&r?q?5GTzgVfJQ{_^vEpz_$vR3(2 z^!Am7>N2jZuAmNHTDA%8 zfBNO*<(*Rclf+OUU)gs&U0aq&a-xoDKdr3QrFhbnvT;>ze^5QX=OcfjLFc@IBQKPK zvN~j8252u|u2;~*Er_&n9$ap4|E}~$AK%+M_&pYNW5Xu5Q7C1_R*B_r$j+BctO(0U z-moz5)Y+arQ2C?N@BX_QAbw6|?a9kmDlaRpgNM1B$B`+AC^;a%ZR+uFnIJ)9EH!zq zWaj$tEc)n;E)H6iDJ>{uX`>c=Fk5SC!l)!Hm|C@KCDO$A5~>0fU7TJitu}U+W~%Mdsuru)mSpNv+Z{|qL zpx?3DST3=2tX-EDcYj&?YP8C0^|pX6g8|j10sV#fU;blpem7V-mZ`FZDrc37!@WE! zAS*jm#6m({J)9u?nd|Au@4)D>zf?~yoCo0b?!|smuk=t?U~zK+^cfBGI`#z(xhKiD zjz92=Qm_4YqC=+ex>?-_x9U?q72w?9fG3AtxwU!lPyjhygpuB$$Ipw17A3q3EXznX z!&qEh)KM?v%JlHe&C)f>G$`Q!+;FHDd9~OU^1G_6%le8vWa^);Tf&2}Jd4j(OVo!2 zx2{`4gP^Oy=Z?V(y45rsIwlNoFpV(tql1T-poMio6j zug7HhRwm_UWqaMoiZH8N7Vlw}m*11!N0>I2P!p+qY0bySu4Grz?^ILjjqW%vE7SPj zJ%0aBKk~wdztJ7k|3I3DcaewZZ7-9qy*?i9ZM6l+&+M%~_iKQhJ_&=*0_5}^eMn!1 zK9#Dl^oQtc`rIe7CP6-_Z@wN&@e^OZpBMP5A2DU$n1xv_EuY(6!rb(7a#k!%Qf?>H zWhteKs<$iMq#-iim33zspVqQvZ8M@7B^Ve@vT2=9XZCH^FU-I5i_$Z>)jPyGiYJ)> zjXj*g@^tvQ^swk!lB;XwDeE#BH!N!@ zy4D!mVrOY8HZ)f;w>wGx&$$nOXgI9?Ly?FFCd;w%tw0LR%FV8=n5-;C4(1%m&rQp=BRE#!E8k;&`D4*llkYFxmToMhCcl3!?O4@ zNSXTeI37|V!D7JCWJarenp)*^CJ`^3G)~o1u?R^+W6icnq?1&dc+f3mb4f)aI)Pm? zf}x&j;8K0zg_Apn7eBGM`#t|*m{#xcCl~`efmui9fQmbo=qyjtaY(%Pf#In3fydJi zKVRC@{m<7Ae)!eWxf5N<$37Zk5AqA(Ox?9&qzOce-2jia==iAD&T21Op~Qu z7e{y$x03GrC!OT_PgIk0vX3Dt=U`0|$ELIbO6lVCPwhC-z4LGN&z2vQ$kHZ#bhq7a z*<^WH84C6nDQ_D~y!l_L)I0RH=9B+;wt9N806DXsQjp*aERgdRuFDTK*Z9Ts`%TYZ z3TDguoG(8hkcR*73XqTqV-${hx$qU^oqs9cs2 z3;6baHyfOatU6^+wX*i~jqm?tuQKy@)Z%(2ih~YyaK&J;6vSm6?|0;B3CQC03>`_! zUzB-@1$|1ZD&igDbEhpo&m&6jc@_6(A(W+qG7VVS3+ABn^dXV`TiUTYW_f7(>1-+K z{SR$>{(>n4^viRit+x-7@(1-U1{)vLjq+5Em6zRXfmuB$W$c*=*!UPVD$Bon=dSO3 zu_Eowagd9>L`nwG)6Sr}24CLj*ERSA>@p=H1+!?7ya8Vh%ko+cK;y@Wu@Q$~75`RX zN3_QT4!mR-oVGML6&s_$sSo~OWqOjt$Q)b%JFJa{?!yS|nk`Jv?|IM9bz0Z|D>eA8 z$aDV)w zSaDf-8~QCUWHMIItn3i8`M*A?i@Pc(|M`K|liy{hkui`Wuo0603AGv}3~4)(Y)U~*4(pWUDN z?SAf!&isCYDJP4|{e*9IKXHCf=H_L3cwB!E!;SLxd%SL5riI7%`#stHmdO@>B`un` zwRP}UHw3x*U?Y&*;FHDJ>ccSj1mr=Ba$LcTg2zF=MOCg!)N2a#jYiJlP5zqr^apJ~ z5>y0OsH_PD*&7LyNwT+sE{sWH0=3A&Zp+$&c?WnH#9M&9apA<7n@>LaV6C_M+v@CK zo?1Q`cwLYA{r)IVyPtG~`Tg=!590Fs zGk*?XkB{z&^UCk%KAo0V=J!c8%PSPI)&HPTUj6O6cRu>yT;;?W+SWvf@QXI^jMx< z78ip*{s-|q)#`0Z~Zo#Ole#D2tijg_ecd7PKeO|hTLEH7hQ;yCKSi8B#y`C5cU zZ|hG3&ZqWNkN=w+8$WzrYgQ#X#0rH*09w=x$N{`ja`^IyU2%{j{qe=vSXc;4_{P_% zzTPa0KltkobP6s+j>X_qk{HdLY6)CED|xmYi}wn!3*c?-8K;5kpj0h|NhS4wW>7~0 zyQFQ>1Cy&A(|$Djv%k`=&i*4QM$G~i9u{ec1I7TQFjrinZZXJWu;9<{BN+hm)34=T z@_s<8j4pM*)itX#+2-}mK%d`Fqz-!-tb!r$xUM0^=Km6_F0?8Ozj^!2V}Bs4FvbqD zL!C|QYsM38NdS(@tw~oTB12vto7Hd;XTDA~GmzvGmd*HbYV}%Eb1P%>$G^HUF;yq$ z?SOr)wl+rD`<=Q(xst{R+VnWOU;j(^itq7 zkPwOAUGs!63*wsiI6U*mVeU6KN^4&IO@`-rn`b=#$+Tm6Wa-Vxz&@GRSbd4S)FGwF zT50X!Tc)1+!p_nwrqnYz=ybg!M2DCw!L1@MmvkjqONh;C$l^dgy}u_HBmTHSPBZZ0 zzi!8sfW2F3lq$;ui5|lQj*KdowS}OhGID`9tV{-Wt=36nR)z;Wzw@qlE>~{&`-8Op z^D#J$@=XHA0m_Yrw%~4dpNCs=(mT~9V57Vh9G4pdd^0~;<#Ab^yj*8(NVDCeQtEvB zy84g)%gwdJ&u~x7s)X52R_<#~3d${tZWLSq57q|4W(+1Y5KkW1m1`H|_I%rIn5&iU z^1&W>_GYzNy12BE$=LyWQr3){R=5TBB~}1azsT;UXp`Kq0jy^1#k=zi3p01zu~gmv z_q2J>17cakg=SAC*Zn!5h|0nVbE?3=&;4=Qt?tiX7_!^|{8p5|AYP}a{QUl?o?bVS zZR-#PuOz)k=4!{jd{g7uXSoM}Yrh!VpjgdiYj<&N0GcUk!L|fV#Gs~OMoUH6k***- zFnf*|g1W}omAFm3zv8gh+<#eMj|QlnYNv#py$5v{1=j}b2Kd)l%3J^d4&+HhK~$<} zdQYr`ZV5 zo-V$}(nX-1ynhU+q@z4)k=-+PKXGw*ln(DD4q4aj{I9v{i!vtk>@iOZo5HTq3^-#d zj=C-SITX$VP+vDKc3~*y$%YbLV1c=H$2Qx)kfE-UpP!>j99*jS`@cX%a-ThHIi@(I5 zn)ysUz4*;N^&=0@*Iv{X9N`$J;$loHY7wZo7%jCKpce05(;gbKge=p1!?LFHStKLd z1MHNsro9|nrFm&1t`3)zn-0FS8qNJ=w^57^UwlASSYx%EcrMER%Rd$Bb4 zkzUexK!9t8dKT2(!HJY6mx5&A^DhARSULx;T#M72XHnU8e7_?;e+kIK)9JpkyhApd z|EDq#oVFinRnGm-{ZmgpE*>r`S@}e4O3DHbee|%q;sZ{kDy;D=Se2$IxU80$i9QUL z$`C6yDrcm-l4&AtWVCc65u#W4O$T%y{PMxx64<57Zo1-~65_`&NWCC-rY`LO>C2RB zrCxGT7Kp0?y6jVn+9P^ILq?m2h_bVrw`A@UfCuc_OjZACWBVj z87;jQL2hlZRr|djaoYnshA)FnKy+iU@X9JB#E6MVT*Sb}KK2UeS zu8p$vFY+ZfOfrSRY5;s8dym16G#SuWn$xwDy*qy9VrkdCGQjg*?U%-a9Sso*K+;YQ z);!z-`3rHxo4novEI0?Wr*X<{X|wx6%60$!O4>VIDYu_!RTiJvS9|*V)wI`vBP3;7 z(qxax!;66?6x;!h8wQ*3;*zY0iW^s+Eq!AlGm}89M>SR@+ZfFZmP&lc%6(KfnAK*+ z6LTS3i4d($s@%G#cpU?1+iT*O1bi%KX9YXU@i2giZ9vRdFpD~;O{7*QSebgeS1PFc zKnsYfCD{_!C8I7YqAND19sWyVrt4Jp}3Y^_U5_d9rvsbcikh< zAJDdLH%pC|l}0w+F{ou-y3S8a6Q?skGPn+Ki_YTlXGdRKhMka&@fRf$e4$xhI&^*c zFAmkKs~5vyQp=5UP%~5v15Dyf7ibdT8N1?aia{L{Bw^ ziJ3brfMFa7RgPj>|JoRMdc(!;H3M`ibt$mB(VZ}h`u}9sIPmS)wPg`p)EyCIXSI`4 z_rSZambE&yG${8=ft?ZLCjbx7ouzU4`*5Hw@5*9voU#Lc4PxzDz?Z!hEgluCBY#@1 zRL*v8yzyeP`{wSTaf?g|-6Zhu6lSL+3~FjMQd5f{rtDfS&#K(CA!(v>bWxeDiGYgT z7+sVa?ou`Fyj(4>zSt^XcyV{@=!tR%(~{!qB@EU4BsJ0rpdIA8&Z+oz0WPSsQM7H+ zpj8}LPZKZhR2;i2L39`lfTElg`0@LqiJ%Yakz9A>+6B3_H-FdCu{GF(=?2%2!Mt(7 z%B+=oGdHB|WdPqX-o3qiq1*%HF%-S09v3W0Dz-=l2LA0 zk3hxO1DwwkB0~n51rIJxTpMFC(B#K%6U=gA0Lj@D%*0_q3*$l<{=_7OnG%$Ie4JH@ zcghHs*^rpUI^|UP$2I7r?2V47Gd7C;@q}#*cItvv0oRXVXN!9iw>IUAnw`2s*`e@V z@$Jse^hMR--zNbN4_}pXjO)w5*1+Dtv%}sXr7>zAvoyJ%I1OYgJ}D(o!`oZav5mQd z-@F_C`CyUA{yMM+kTaae%{b1AdgS&`)7!iJ+$fW1`T}|kcvu>tL6kiVTH)IRD`NnU*czAAOoE=ep+pv__&B)j zB@l}fICxSDy$A3e=D71)WNr0xap-m<-S zW){ZTnSr)hUJrN;*=o}%HvX%yHbTXys^MQo&JpE&_B$)ty!GDSDTj#HX3v!tDwF@GHcoSi0E zoxc&A62yjq7hg}ssrPzTh0tpiZ>%htcyMnZp7tjP&;$YA;KGsw@n9iIfqfCLp0Os_Z^yKCwH-K5&4Udv;C+RA@WO1FucHAgS z6C7X*(5Z}`VuLXNTXq;Da3ev%l(e%a7)xcdS~fUfi^KDcoy9;i0(i`(P@ijcmXo?& z?(v2LIuE!x*ok#^W^2G>(aL!EPCf05tQr77TUt!xpoh8-YaM}J16A{PgR5)6 z-;iaRA;8z*m0I9W>SiWVRNsM4%=*KDjuo(yz)T7NjlV5xHx6njHdcLcq1vTx-TYAQ z7~JK`lx+&IyxJd$M-SVM*R^Ghi3;az8Y zYlBvHMhb8w>AZ+ z%3eC`NmWu5WZ~?{{AL5VH~kwL=sd(mU?+V2fOP{3Z|Vf6)du^`xF}Q}(PYSVyyCIuQ)u83lnSEmEz&cKbGbVP*g!ps0ONscAW z(|c{(aqQJ!E(NC!*Rn)~`d#W6YxqkgzLw)J7w|j_gI4T_qoq|yYR;-nZb|@sp!DMB z#ol0awBHf<4e$cK_Kro*bz#l^6|5d?PU>0@uP^dJ10Bx>V z5kQSU@Y@dT9i!xxa|!zv!FLDBJ*RXpCo%QL=o=dYV7Zn&7-Zr)4~~B$7KQLPI>31b zj=V#{Id;PTedVcC2SyI%NgW|-_DpEnc0d0r0dkl_8v`ri)Vd19B;Yz%r) zP_Z}3ZDKA=E}v0*0YAB3(>P*t_9+j*FFKj@MDeW^Wzja#(kQ+FcAfo&7orGp0DB0# zRwT(eZBr0J*mXk;S5h-j3*cf$l9Li#3fM8#PM#MNC2c~d+y!eg32yRz$TI&)r{JLl zi~q5XD1v{oe6JStv;yo6E@DdD0{DTqC#DYQEY|~O~!WCE&!s88d z16xAqL;P*ZdlUDQ!hiEDmpa~5K#v<^d!Xlz&)IDS@VR6w!$0>m*}`wJk)=>i)<$X3+a?|2K? z-V%lT7DX@GVpHFCfFIvH{u0D7+w*S+%yCX{0XuGujs0%{edBi7cIf541l!JdBH>$L mo@kJ_F5hZ_w_0F*3;chNqBjeYr`F&A0000PNg literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_auto_nor.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/bg_auto_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..a9965aaf1fd83abe5b077b9f10bd1187afbf3dc8 GIT binary patch literal 37355 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 M07*qoM6N<$f>v7pcmMzZ literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_auto_nor.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/taxi_p_auto_nor.png deleted file mode 100644 index c15a11f4e4a2aa8f6cc7e4a20184fcb66a3e19bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20990 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 IM6N<$g2sW&M*si- diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml index 384f1a6e54..c07bc7e423 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml @@ -1,18 +1,33 @@ - - + android:layout_marginLeft="@dimen/dp_60" + android:layout_marginTop="@dimen/dp_38" + android:layout_marginRight="@dimen/dp_60" + android:indeterminateDrawable="@drawable/bg_steering_outer" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + android:src="@drawable/bg_auto_nor" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + android:layout_width="@dimen/dp_240" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/dp_30" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@+id/blue_circle" /> - \ No newline at end of file + \ No newline at end of file From 8b13a991f8d8c993569475710dda5b52551a16ee Mon Sep 17 00:00:00 2001 From: liujing Date: Thu, 7 Apr 2022 20:05:04 +0800 Subject: [PATCH 15/18] =?UTF-8?q?=E6=A1=A3=E4=BD=8D+=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=A9=BE=E9=A9=B6=E7=8A=B6=E6=80=81=E4=B8=9A=E5=8A=A1=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E6=B7=BB=E5=8A=A0=20=E7=BC=BA=E5=B0=91=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=96=B9=E5=90=91=E7=9B=98=E8=BD=AC=E8=A7=92,?= =?UTF-8?q?=E6=96=B9=E5=90=91=E7=9B=98=E5=8A=A8=E7=94=BB=20=E7=BC=BA?= =?UTF-8?q?=E5=B0=91=E5=A4=96=E5=B1=82=E5=9C=86=E5=BD=A2=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E6=9D=A1=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/widget/SteeringWheelView.java | 84 +++++++++++++++++++ .../hmi/ui/widget/TapPositionView.java | 48 ++++++++++- .../main/res/layout/hmi_steering_wheel.xml | 1 + 3 files changed, 132 insertions(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java index ed6f67ba54..f6f59bfa29 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java @@ -4,12 +4,28 @@ import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; +import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; +import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotVehicleStateListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager; import com.mogo.eagle.core.function.hmi.R; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; + +import org.jetbrains.annotations.NotNull; + +import chassis.Chassis; +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; /** * @author Jing @@ -18,10 +34,78 @@ import com.mogo.eagle.core.function.hmi.R; */ public class SteeringWheelView extends ConstraintLayout { private static final String TAG = "SteeringWheelView"; + private ImageView autopilotIV; + private TextView steeringTV; + private TapPositionView tapPositionView; public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel, this); Log.d(TAG, "2"); + CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); + CallerAutopilotVehicleStateListenerManager.INSTANCE.addListener(TAG, mIMoGoAutopilotVehicleStateListener); + autopilotIV = findViewById(R.id.autopilot_iv); + steeringTV = findViewById(R.id.steering_tv); + tapPositionView = findViewById(R.id.tap_position); } + + private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { + @Override + public void onAutopilotArriveAtStation(@org.jetbrains.annotations.Nullable MessagePad.ArrivalNotification arrivalNotification) { + + } + + @Override + public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { + + } + + @Override + public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { + if (autopilotStatusInfo == null) return; + int state = autopilotStatusInfo.getState(); + CallerLogger.INSTANCE.d(M_BUS_P + TAG, "state = %s", state); + if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { + autopilotIV.setImageResource(R.drawable.bg_auto); + + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + autopilotIV.setImageResource(R.drawable.bg_auto_nor); + + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + autopilotIV.setImageResource(R.drawable.bg_auto_nor); + } + } + + @Override + public void onAutopilotSNRequest() { + + } + }; + + private final IMoGoAutopilotVehicleStateListener mIMoGoAutopilotVehicleStateListener = new IMoGoAutopilotVehicleStateListener() { + @Override + public void onAutopilotLightSwitchData(@org.jetbrains.annotations.Nullable Chassis.LightSwitch lightSwitch) { + + } + + @Override + public void onAutopilotBrakeLightData(boolean brakeLight) { + + } + + @Override + public void onAutopilotSteeringData(float steering) { + steeringTV.setText(String.valueOf(steering) + "°"); + } + + /** + * 档位 + * @param gear + */ + @Override + public void onAutopilotGearData(@NotNull Chassis.GearPosition gear) { + Log.d(TAG, "档位" + gear.toString()); + + } + }; } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java index f0717ea872..afb2ce5140 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TapPositionView.java @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget; import android.content.Context; +import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; @@ -12,9 +13,13 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.mogo.eagle.core.function.hmi.R; +import org.jetbrains.annotations.NotNull; + +import chassis.Chassis; + /** * @author Jing - * @description 档位 + * @description 方向盘下方的档位 * @since: 4/7/22 */ public class TapPositionView extends ConstraintLayout { @@ -28,6 +33,47 @@ public class TapPositionView extends ConstraintLayout { super(context, attrs); Log.d(TAG, "2"); LayoutInflater.from(context).inflate(R.layout.hmi_tap_position, this); + tabP = findViewById(R.id.tap_p); + tabR = findViewById(R.id.tap_r); + tabN = findViewById(R.id.tap_n); + tabD = findViewById(R.id.tap_d); + } + public void updateWithGear(@NotNull Chassis.GearPosition gear) { + + switch (gear) { + case GEAR_NONE: + tabP.setTextColor(Color.parseColor("#6E8EC9")); + tabR.setTextColor(Color.parseColor("#6E8EC9")); + tabN.setTextColor(Color.parseColor("#6E8EC9")); + tabD.setTextColor(Color.parseColor("#6E8EC9")); + break; + case GEAR_P: + tabP.setTextColor(Color.parseColor("#0043FF")); + tabR.setTextColor(Color.parseColor("#6E8EC9")); + tabN.setTextColor(Color.parseColor("#6E8EC9")); + tabD.setTextColor(Color.parseColor("#6E8EC9")); + break; + case GEAR_R: + tabR.setTextColor(Color.parseColor("#0043FF")); + tabP.setTextColor(Color.parseColor("#6E8EC9")); + tabN.setTextColor(Color.parseColor("#6E8EC9")); + tabD.setTextColor(Color.parseColor("#6E8EC9")); + break; + case GEAR_N: + tabN.setTextColor(Color.parseColor("#0043FF")); + tabR.setTextColor(Color.parseColor("#6E8EC9")); + tabP.setTextColor(Color.parseColor("#6E8EC9")); + tabD.setTextColor(Color.parseColor("#6E8EC9")); + break; + case GEAR_D: + tabD.setTextColor(Color.parseColor("#0043FF")); + tabN.setTextColor(Color.parseColor("#6E8EC9")); + tabR.setTextColor(Color.parseColor("#6E8EC9")); + tabP.setTextColor(Color.parseColor("#6E8EC9")); + break; + default: + break; + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml index c07bc7e423..016545b117 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml @@ -19,6 +19,7 @@ app:layout_constraintTop_toTopOf="parent" /> Date: Fri, 8 Apr 2022 11:32:06 +0800 Subject: [PATCH 16/18] =?UTF-8?q?[rm]=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E8=B5=84=E6=BA=90,=E6=A1=A3=E4=BD=8D+=E6=96=B9?= =?UTF-8?q?=E5=90=91=E7=9B=98=E8=A7=92=E5=BA=A6=E4=B8=9A=E5=8A=A1=E5=AE=B9?= =?UTF-8?q?=E9=94=99=E9=80=BB=E8=BE=91=E6=B7=BB=E5=8A=A0,=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=9D=A1UI=E9=85=8D=E7=BD=AE=E8=AE=BE=E7=BD=AE=20?= =?UTF-8?q?=E7=BC=BA=E5=B0=91=E8=BF=9B=E5=BA=A6=E6=9D=A1=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=96=B9=E5=90=91=E7=9B=98=E8=A7=92=E5=BA=A6=E8=BD=AC=E5=8A=A8?= =?UTF-8?q?+=E6=96=B9=E5=90=91=E7=9B=98=E8=BD=AC=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/widget/CircularProgressView.kt | 96 +++++++++++-------- .../hmi/ui/widget/SteeringWheelView.java | 48 +++++++--- .../taxi_steering_wheel_color_selector.xml | 12 --- .../main/res/layout/hmi_steering_wheel.xml | 4 +- .../src/main/res/values/color.xml | 3 + 5 files changed, 98 insertions(+), 65 deletions(-) delete mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt index 66be06132d..eaa0cc7885 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CircularProgressView.kt @@ -16,23 +16,27 @@ import com.mogo.eagle.core.function.hmi.R * @since: 2022/1/14 */ class CircularProgressView @JvmOverloads constructor( - context: Context, attrs: AttributeSet?, defStyleAttr : Int) - : View(context, attrs, defStyleAttr){ + context: Context, attrs: AttributeSet?, defStyleAttr: Int) + : View(context, attrs, defStyleAttr) { + + val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressView) - val typedArray : TypedArray = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressView) // 绘制画笔 - private val mBackPaint : Paint = Paint() - private val mProgPaint : Paint = Paint() + private val mBackPaint: Paint = Paint() + private val mProgPaint: Paint = Paint() + // 绘制区域 - private var mRectF : RectF? = null + private var mRectF: RectF? = null + // 圆环渐变色 - private var mColorArray : IntArray?=null + private var mColorArray: IntArray? = null + // 圆环进度(0-100) 初始化进度 - private var mProgress : Int = typedArray.getInteger(R.styleable.CircularProgressView_progress, 0) + private var mProgress: Int = typedArray.getInteger(R.styleable.CircularProgressView_progress, 0) - constructor(context : Context) : this(context,null) + constructor(context: Context) : this(context, null) - constructor(context : Context,attrs : AttributeSet?) :this(context, attrs, 0) + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) init { // 初始化背景圆环画笔 @@ -52,9 +56,9 @@ class CircularProgressView @JvmOverloads constructor( // 初始化进度圆环渐变色 val startColor = typedArray.getColor(R.styleable.CircularProgressView_progStartColor, -1) val firstColor = typedArray.getColor(R.styleable.CircularProgressView_progFirstColor, -1) - if(startColor != -1 && firstColor != -1){ - mColorArray = intArrayOf(startColor,firstColor) - }else{ + if (startColor != -1 && firstColor != -1) { + mColorArray = intArrayOf(startColor, firstColor) + } else { mColorArray = null } @@ -67,16 +71,16 @@ class CircularProgressView @JvmOverloads constructor( val viewWide = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); val viewHigh = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); val mRectLength = - ((if (viewWide > viewHigh) viewHigh else viewWide) - if (mBackPaint.strokeWidth > mProgPaint.strokeWidth) mBackPaint.strokeWidth else mProgPaint.strokeWidth).toInt() + ((if (viewWide > viewHigh) viewHigh else viewWide) - if (mBackPaint.strokeWidth > mProgPaint.strokeWidth) mBackPaint.strokeWidth else mProgPaint.strokeWidth).toInt() val mRectL = getPaddingLeft() + (viewWide - mRectLength) / 2 val mRectT = getPaddingTop() + (viewHigh - mRectLength) / 2 mRectF = RectF(mRectL.toFloat(), mRectT.toFloat(), (mRectL + mRectLength).toFloat(), - (mRectT + mRectLength).toFloat()) + (mRectT + mRectLength).toFloat()) // 设置进度圆环渐变色 mColorArray?.let { mProgPaint.shader = LinearGradient( - 0.0f, 0.0f, 0.0f, - measuredWidth.toFloat(), it, null, Shader.TileMode.MIRROR) + 0.0f, 0.0f, 0.0f, + measuredWidth.toFloat(), it, null, Shader.TileMode.MIRROR) } } @@ -84,9 +88,11 @@ class CircularProgressView @JvmOverloads constructor( override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) canvas?.let { - mRectF?.let { it1 -> it.drawArc(it1, 0.0f, 360.0f, false, mBackPaint) } - mRectF?.let { it1 -> it.drawArc(it1, 275.0f, - (360 * mProgress / 100).toFloat(), false, mProgPaint) } + mRectF?.let { it1 -> it.drawArc(it1, 0.0f, 360.0f, false, mBackPaint) } + mRectF?.let { it1 -> + it.drawArc(it1, 275.0f, + (360 * mProgress / 100).toFloat(), false, mProgPaint) + } } } @@ -95,7 +101,7 @@ class CircularProgressView @JvmOverloads constructor( * 获取当前进度 * @return 当前进度(0-100) */ - fun getProgress() : Int{ + fun getProgress(): Int { return mProgress } @@ -103,7 +109,7 @@ class CircularProgressView @JvmOverloads constructor( * 设置当前进度 * @param progress 当前进度(0-100) */ - fun setProgress(progress : Int){ + fun setProgress(progress: Int) { mProgress = progress invalidate() } @@ -113,12 +119,12 @@ class CircularProgressView @JvmOverloads constructor( * @param progress 当前进度(0-100) * @param animTime 动画时间(毫秒) */ - fun setProgress(progress : Int, animTime : Long){ - if (animTime<=0){ + fun setProgress(progress: Int, animTime: Long) { + if (animTime <= 0) { setProgress(progress) - } else{ + } else { val animator = ValueAnimator.ofInt(mProgress, progress) - animator.addUpdateListener{ + animator.addUpdateListener { mProgress = it.animatedValue as Int invalidate() } @@ -132,7 +138,7 @@ class CircularProgressView @JvmOverloads constructor( * 设置背景圆环宽度 * @param width 背景圆环宽度 */ - fun setBackWidth(width : Int){ + fun setBackWidth(width: Int) { mBackPaint.strokeWidth = width.toFloat() invalidate() } @@ -141,8 +147,8 @@ class CircularProgressView @JvmOverloads constructor( * 设置背景圆环颜色 * @param color 背景圆环颜色 */ - fun setBackColor(color : Int){ - mBackPaint.color = ContextCompat.getColor(context,color) + fun setBackColor(color: Int) { + mBackPaint.color = ContextCompat.getColor(context, color) invalidate() } @@ -150,39 +156,49 @@ class CircularProgressView @JvmOverloads constructor( * 设置进度圆环宽度 * @param width 进度圆环宽度 */ - fun setProgWidth(width : Int){ + fun setProgWidth(width: Int) { mProgPaint.strokeWidth = width.toFloat() invalidate() } /** - * 设置进度圆环颜色 + * 设置进度圆环渐变色起始色 * @param color 景圆环颜色 */ - fun setProgColor(color : Int){ - mProgPaint.color = ContextCompat.getColor(context,color) + fun setProgColor(color: Int) { + mProgPaint.color = ContextCompat.getColor(context, color) mProgPaint.shader = null invalidate() } - fun setProgColor(startColor : Int,endColor: Int){ - mColorArray = intArrayOf(ContextCompat.getColor(context,startColor),ContextCompat.getColor(context,endColor)) + + /** + * 渐变色结束色 + */ + fun setProgFirstColor(color: Int) { + mProgPaint.color = ContextCompat.getColor(context, color) + mProgPaint.shader = null + invalidate() + } + + fun setProgColor(startColor: Int, endColor: Int) { + mColorArray = intArrayOf(ContextCompat.getColor(context, startColor), ContextCompat.getColor(context, endColor)) mColorArray?.let { mProgPaint.shader = LinearGradient(0f, 0f, 0f, - getMeasuredWidth().toFloat(), it, null, Shader.TileMode.MIRROR) + getMeasuredWidth().toFloat(), it, null, Shader.TileMode.MIRROR) } } - fun setProgColor(colorArray : IntArray){ + fun setProgColor(colorArray: IntArray) { colorArray.let { - if(it.size<2){ + if (it.size < 2) { return } mColorArray = it.copyOf() - mColorArray?.let{ + mColorArray?.let { mProgPaint.shader = LinearGradient(0f, 0f, 0f, - getMeasuredWidth().toFloat(), it, null, Shader.TileMode.MIRROR) + getMeasuredWidth().toFloat(), it, null, Shader.TileMode.MIRROR) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java index f6f59bfa29..6adfdd1cca 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java @@ -37,16 +37,23 @@ public class SteeringWheelView extends ConstraintLayout { private ImageView autopilotIV; private TextView steeringTV; private TapPositionView tapPositionView; + private CircularProgressView steeringCircularV; public SteeringWheelView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.hmi_steering_wheel, this); - Log.d(TAG, "2"); CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); CallerAutopilotVehicleStateListenerManager.INSTANCE.addListener(TAG, mIMoGoAutopilotVehicleStateListener); autopilotIV = findViewById(R.id.autopilot_iv); steeringTV = findViewById(R.id.steering_tv); tapPositionView = findViewById(R.id.tap_position); + steeringCircularV = findViewById(R.id.steering_circular); + steeringCircularV.setBackWidth(8); + steeringCircularV.setBackColor(R.color.hmi_light_blue_00); + steeringCircularV.setProgColor(R.color.hmi_light_blue); + steeringCircularV.setProgFirstColor(R.color.hmi_dark_blue); + steeringCircularV.setProgress(20, 20); + tapPositionView.updateWithGear(Chassis.GearPosition.GEAR_R); } private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { @@ -65,14 +72,18 @@ public class SteeringWheelView extends ConstraintLayout { if (autopilotStatusInfo == null) return; int state = autopilotStatusInfo.getState(); CallerLogger.INSTANCE.d(M_BUS_P + TAG, "state = %s", state); - if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - autopilotIV.setImageResource(R.drawable.bg_auto); + if (autopilotIV != null) { + Log.d(TAG, "autopilotIV != null"); + if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - autopilotIV.setImageResource(R.drawable.bg_auto_nor); + autopilotIV.setImageResource(R.drawable.bg_auto); - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - autopilotIV.setImageResource(R.drawable.bg_auto_nor); + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + autopilotIV.setImageResource(R.drawable.bg_auto_nor); + + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + autopilotIV.setImageResource(R.drawable.bg_auto_nor); + } } } @@ -83,19 +94,31 @@ public class SteeringWheelView extends ConstraintLayout { }; private final IMoGoAutopilotVehicleStateListener mIMoGoAutopilotVehicleStateListener = new IMoGoAutopilotVehicleStateListener() { + /** + * 车辆转向灯 + * @param lightSwitch + */ @Override public void onAutopilotLightSwitchData(@org.jetbrains.annotations.Nullable Chassis.LightSwitch lightSwitch) { - + Log.d(TAG, "车辆转向灯:" + lightSwitch.toString()); } + /** + * 刹车灯 + * @param brakeLight + */ @Override public void onAutopilotBrakeLightData(boolean brakeLight) { - + Log.d(TAG, "刹车灯:" + String.valueOf(brakeLight)); } @Override public void onAutopilotSteeringData(float steering) { - steeringTV.setText(String.valueOf(steering) + "°"); + if (steeringTV != null && String.valueOf(steering) != null) { + steeringTV.setText(String.valueOf(steering) + "°"); + } else { + Log.d(TAG, "steering未呈现"); + } } /** @@ -105,7 +128,10 @@ public class SteeringWheelView extends ConstraintLayout { @Override public void onAutopilotGearData(@NotNull Chassis.GearPosition gear) { Log.d(TAG, "档位" + gear.toString()); - + if (tapPositionView != null) { + tapPositionView.updateWithGear(gear); + } } }; + } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml deleted file mode 100644 index 0d2bcb88d7..0000000000 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/color/taxi_steering_wheel_color_selector.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml index 016545b117..5108cbb5d9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_steering_wheel.xml @@ -31,15 +31,15 @@ app:layout_constraintTop_toTopOf="parent" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml index bd4ed43a04..5bc14b5b52 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml @@ -53,4 +53,7 @@ #FF006D43 #FFFFE198 #FFFF9B00 + #45D3FF + #1B5BFF + #0045D3FF \ No newline at end of file From 8c36b453ac88ca20a06d2a8fa2af1e63e33c2c12 Mon Sep 17 00:00:00 2001 From: liujing Date: Fri, 8 Apr 2022 16:36:20 +0800 Subject: [PATCH 17/18] =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0:=E6=96=B9=E5=90=91=E7=9B=98=E6=A0=B9?= =?UTF-8?q?=E6=8D=AECAN=E6=95=B0=E6=8D=AE=E5=81=9A=E8=BD=AC=E5=8A=A8+?= =?UTF-8?q?=E5=A4=96=E4=BE=A7=E6=B8=90=E5=8F=98=E8=89=B2=E5=91=88=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/layout/fragment_och_bus.xml | 2 +- .../hmi/ui/widget/CircularProgressView.kt | 4 ++ .../hmi/ui/widget/SteeringWheelView.java | 63 +++++++++++++++-- .../hmi/ui/widget/TapPositionView.java | 69 ++++++++++--------- .../main/res/layout/hmi_steering_wheel.xml | 9 ++- .../res/values-xhdpi-2560x1600/dimens.xml | 3 +- 6 files changed, 104 insertions(+), 46 deletions(-) diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml index 558429d9ec..1b3710568c 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml @@ -170,7 +170,7 @@ diff --git a/modules/mogo-module-common/src/main/res/values-xhdpi-2560x1600/dimens.xml b/modules/mogo-module-common/src/main/res/values-xhdpi-2560x1600/dimens.xml index 3fec33a8e2..e8a50c2de8 100644 --- a/modules/mogo-module-common/src/main/res/values-xhdpi-2560x1600/dimens.xml +++ b/modules/mogo-module-common/src/main/res/values-xhdpi-2560x1600/dimens.xml @@ -11,5 +11,6 @@ 120px 37px 27px - + 144px + 300px From 1105391ecac1aa82ed57cab1910ab80a3cc71b7a Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Fri, 8 Apr 2022 17:27:43 +0800 Subject: [PATCH 18/18] add bus brake white ui --- .../bindingcar/BindingcarProvider.java | 9 ++-- .../hmi/ui/turnlight/BrakeViewStatus.kt | 9 +++- .../drawable-xhdpi/bus_shache_nor_daytime.png | Bin 0 -> 8298 bytes .../brakelight_background_daytime.xml | 5 ++ .../view_brake_light_status_daytime.xml | 44 ++++++++++++++++++ .../src/main/res/values/color.xml | 1 + .../src/main/res/values/dimens.xml | 2 + 7 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bus_shache_nor_daytime.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/brakelight_background_daytime.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status_daytime.xml diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java index 90e5188004..4bf44658d8 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java @@ -10,6 +10,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack; import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingcarProvider; import com.mogo.eagle.core.function.bindingcar.network.BindingcarNetWorkManager; +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import org.jetbrains.annotations.NotNull; @@ -66,11 +67,13 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { private int getScreenType() { int screenType = -1; - if (FunctionBuildConfig.appIdentityMode == 0 || FunctionBuildConfig.appIdentityMode == 0xA0) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { screenType = 1; //司机屏 - } else if (FunctionBuildConfig.appIdentityMode == 1 || FunctionBuildConfig.appIdentityMode == 0xA1) { - screenType = 2; //乘客屏 } + +// if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { +// screenType = 2; //乘客屏 +// } return screenType; } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt index d128c5e257..56f19763b4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/turnlight/BrakeViewStatus.kt @@ -10,7 +10,9 @@ import android.view.animation.AlphaAnimation import android.view.animation.Animation import android.view.animation.DecelerateInterpolator import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import kotlinx.android.synthetic.main.view_brake_light_status.view.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -28,7 +30,12 @@ class BrakeViewStatus @JvmOverloads constructor( defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { init { - LayoutInflater.from(context).inflate(R.layout.view_brake_light_status, this, true) + //bus乘客端 + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + LayoutInflater.from(context).inflate(R.layout.view_brake_light_status_daytime, this, true) + } else { + LayoutInflater.from(context).inflate(R.layout.view_brake_light_status, this, true) + } } private var isBrake: Boolean = false diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bus_shache_nor_daytime.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bus_shache_nor_daytime.png new file mode 100644 index 0000000000000000000000000000000000000000..d16d1ce1418c79d78707e920b13d5122e78ce659 GIT binary patch literal 8298 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/brakelight_background_daytime.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/brakelight_background_daytime.xml new file mode 100644 index 0000000000..6c257d12d7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/brakelight_background_daytime.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status_daytime.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status_daytime.xml new file mode 100644 index 0000000000..1996b061ac --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_brake_light_status_daytime.xml @@ -0,0 +1,44 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml index 5bc14b5b52..7218d86231 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml @@ -46,6 +46,7 @@ #3B4577 #000000 + #E6FFFFFF #FFFFA28B #FFDA1100 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml index 9283e77555..3641ccb612 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml @@ -41,6 +41,8 @@ 120px 460px 120px + 220px + 120px 225px 154px