From e4de6ab743554936c4445d8dfeb9b39ef83ac9ba Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 16 Apr 2024 19:09:14 +0800 Subject: [PATCH] =?UTF-8?q?[6.4.0][=E5=90=AF=E8=87=AA=E9=A9=BE=E6=8C=87?= =?UTF-8?q?=E5=BC=95]=20=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/fragment/BaseBusTabFragment.java | 11 +- .../src/main/res/layout/bus_base_fragment.xml | 34 +++-- .../main/res/layout/charter_base_fragment.xml | 11 +- .../bus/fragment/BaseShuttleTabFragment.java | 8 +- .../main/res/layout/shuttle_base_fragment.xml | 35 +++-- .../mogo/och/taxi/ui/BaseTaxiTabFragment.java | 5 +- .../main/res/layout/taxi_base_fragment.xml | 24 ++-- .../och/taxi/ui/base/BaseTaxiTabFragment.kt | 38 +++--- .../mogo/och/taxi/ui/base/TaxiPresenter.java | 10 +- .../main/res/layout/taxi_base_fragment.xml | 24 +++- .../DevaToolsProvider.kt | 22 ++- .../status/StatusManager.kt | 48 ++++++- .../status/entity/Status.kt | 72 +++++++++- .../status/flow/autopilot/AcceleratorImpl.kt | 57 ++++++++ .../status/flow/autopilot/BrakeImpl.kt | 60 +++++++++ .../status/flow/autopilot/DoubleFlashImpl.kt | 58 ++++++++ .../status/flow/autopilot/GearImpl.kt | 57 ++++++++ .../status/flow/autopilot/SpeedImpl.kt | 44 ++++++ .../status/flow/autopilot/SteerImpl.kt | 50 +++++++ .../status/model/StatusModel.kt | 7 +- .../status/ui/AutoPilotLaunchBeforeView.kt | 112 ++++++++++++++++ .../status/ui/StatusView.kt | 8 +- .../status/ui/adapter/StatusAdapter.kt | 5 +- .../status/ui/diff/StatusDiffCallback.kt | 2 +- .../color/color_geer_position_selector.xml | 6 + .../icon_brake_or_accelerator_blue.png | Bin 0 -> 4714 bytes .../icon_brake_or_accelerator_red.png | Bin 0 -> 5009 bytes .../drawable-xhdpi/icon_double_flash_blue.png | Bin 0 -> 4750 bytes .../drawable-xhdpi/icon_double_flash_red.png | Bin 0 -> 5048 bytes .../res/drawable-xhdpi/icon_steer_blue.png | Bin 0 -> 4838 bytes .../res/drawable-xhdpi/icon_steer_red.png | Bin 0 -> 5108 bytes .../bg_autopilot_brake_or_accelerator.xml | 6 + .../drawable/bg_autopilot_double_flash.xml | 6 + .../drawable/bg_autopilot_launch_before.xml | 32 +++++ .../main/res/drawable/bg_autopilot_steer.xml | 6 + .../main/res/drawable/bg_geer_position.xml | 6 + .../src/main/res/drawable/bg_speed_chart.xml | 34 +++++ .../main/res/drawable/speed_chart_stroke.xml | 4 + .../layout/layout_autopilot_launch_before.xml | 126 ++++++++++++++++++ .../api/devatools/IDevaToolsProvider.kt | 4 + .../call/devatools/CallerDevaToolsManager.kt | 4 + 41 files changed, 948 insertions(+), 88 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/AcceleratorImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/BrakeImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/DoubleFlashImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/GearImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SpeedImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SteerImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/AutoPilotLaunchBeforeView.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/color/color_geer_position_selector.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_brake_or_accelerator_blue.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_brake_or_accelerator_red.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_double_flash_blue.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_double_flash_red.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_steer_blue.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_steer_red.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_brake_or_accelerator.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_double_flash.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_launch_before.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_steer.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_geer_position.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_speed_chart.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/speed_chart_stroke.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_autopilot_launch_before.xml diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index 7c570bd3f3..2a8a1c8d6d 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -92,6 +92,7 @@ public abstract class BaseBusTabFragment public boolean isAnimateRunning = false; + /** * 滑动按钮触发的事件 */ @@ -123,7 +124,15 @@ public abstract class BaseBusTabFragment // tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status); tvArrived = findViewById(R.id.module_mogo_och_arrived_tv); - mTrafficDataView = (TrafficDataView) findViewById(R.id.bus_arc); +// mTrafficDataView = (TrafficDataView) findViewById(R.id.bus_arc); + + + FrameLayout flSpeed = findViewById(R.id.fl_speed); + if (flSpeed != null) { + CallerDevaToolsManager.INSTANCE.attachAutopilotBeforeLaunchView(flSpeed.getContext(), flSpeed); + } + + LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener); diff --git a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml index 7268f93076..dcb176d60b 100644 --- a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml +++ b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml @@ -19,22 +19,32 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + + + + + + + + + + + + + + + - - - - + app:layout_constraintTop_toTopOf="parent"/> - diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseShuttleTabFragment.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseShuttleTabFragment.java index 5f69222cbd..231992331b 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseShuttleTabFragment.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/fragment/BaseShuttleTabFragment.java @@ -73,7 +73,7 @@ public abstract class BaseShuttleTabFragment + + + + + + + + + + + + + + + + + - - - - + app:layout_constraintTop_toTopOf="parent"/> - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintLeft_toLeftOf="@+id/taxi_speed_contain" + app:layout_constraintRight_toRightOf="@+id/taxi_speed_contain" + app:layout_constraintTop_toBottomOf="@+id/taxi_speed_contain"> > : MvpFragment> : MvpFragment> : MvpFragment implements ITaxiADASS @Override public void onCarLocationChanged(MogoLocation location) { - if (null != location) { - runOnUIThread(() -> { - mView.updateSpeedView((float) location.getGnssSpeed()); - }); - } +// if (null != location) { +// runOnUIThread(() -> { +// mView.updateSpeedView((float) location.getGnssSpeed()); +// }); +// } } @Override diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_base_fragment.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_base_fragment.xml index e6b1c1ab50..240d5f295c 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_base_fragment.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_base_fragment.xml @@ -29,7 +29,19 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - + + + app:layout_constraintLeft_toLeftOf="@+id/module_mogo_och_speed_layout" + app:layout_constraintRight_toRightOf="@+id/module_mogo_och_speed_layout" + app:layout_constraintTop_toBottomOf="@+id/module_mogo_och_speed_layout"> ? = null + override fun init(context: Context) { mContext = context } @@ -471,4 +475,20 @@ class DevaToolsProvider : IDevaToolsProvider { override fun setNetworkMode(isDebug: Boolean) { WeakNetworkStrategy.setDebug(isDebug) } + + override fun attachAutopilotStatusView(ctx: Context, group: ViewGroup) { + if (group.childCount > 0) { + if (group.visibility != View.VISIBLE) { + group.visibility = View.VISIBLE + } + return + } + this.container = WeakReference(group) + val child = AutoPilotLaunchBeforeView(ctx) + group.addView(child, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)) + } + + override fun getExceptionStatusBeforeLaunchAutopilot(): Int { + return StatusManager.getExceptionStatusBeforeLaunchAutopilot() + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt index 755b7a2012..c6f4dc18ef 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -23,6 +23,12 @@ import com.zhjt.mogo_core_function_devatools.status.entity.* import com.zhjt.mogo_core_function_devatools.status.model.StatusModel import com.zhjt.mogo_core_function_devatools.status.flow.IFlow import com.zhjt.mogo_core_function_devatools.status.flow.OverViewImpl +import com.zhjt.mogo_core_function_devatools.status.flow.autopilot.AcceleratorImpl +import com.zhjt.mogo_core_function_devatools.status.flow.autopilot.BrakeImpl +import com.zhjt.mogo_core_function_devatools.status.flow.autopilot.DoubleFlashImpl +import com.zhjt.mogo_core_function_devatools.status.flow.autopilot.GearImpl +import com.zhjt.mogo_core_function_devatools.status.flow.autopilot.SpeedImpl +import com.zhjt.mogo_core_function_devatools.status.flow.autopilot.SteerImpl import com.zhjt.mogo_core_function_devatools.status.flow.can.CanImpl import com.zhjt.mogo_core_function_devatools.status.flow.gps.GpsImpl import com.zhjt.mogo_core_function_devatools.status.flow.ipc.IpcImpl @@ -33,17 +39,21 @@ import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import java.lang.ref.* import java.util.concurrent.* +import java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy object StatusManager { - private const val TAG = "StatusManager" private lateinit var model: StatusModel private var hasInit = false - private val listeners by lazy { CopyOnWriteArrayList() } + private val listeners by lazy { ConcurrentHashMap() } private var container: WeakReference? = null + private val dispatcher by lazy { + ThreadPoolExecutor(1, 2, 1, TimeUnit.MINUTES, LinkedBlockingQueue(128), Executors.defaultThreadFactory(), DiscardOldestPolicy()).asCoroutineDispatcher() + CoroutineName("stats-manager-impl") + } + private val flows: ArrayList> by lazy { ArrayList() } @@ -77,10 +87,16 @@ object StatusManager { is TracingStatus -> TracingImpl(ctx) is RTKStatus -> RTKImpl(ctx) is OverViewStatus -> OverViewImpl(ctx) + is SteerStatus -> SteerImpl(ctx) + is AcceleratorStatus -> AcceleratorImpl(ctx) + is BrakeStatus -> BrakeImpl(ctx) + is DoubleFlashStatus -> DoubleFlashImpl(ctx) + is GearStatus -> GearImpl(ctx) + is SpeedStatus -> SpeedImpl(ctx) } }.also { flows += it } for (f in flows) { - ctx.lifeCycleScope.launch(Dispatchers.Default) { + ctx.lifeCycleScope.launch(dispatcher) { f.asFlow().collect { model.update(it) } @@ -89,7 +105,7 @@ object StatusManager { } model.status.observe(ctx.lifeCycleOwner) { - listeners.forEach { itx -> + listeners.values.forEach { itx -> itx.onStatusChanged(it.second, it.first != null) } } @@ -120,6 +136,30 @@ object StatusManager { flows.clear() } + fun addListener(tag: String, listener: IStatusListener) { + if (listeners.containsKey(tag)) { + return + } + listeners[tag] = listener + } + + fun removeListener(tag: String) { + listeners.remove(tag) + } + + fun getExceptionStatusBeforeLaunchAutopilot(): Int { + var ret = 0 + model.status.value?.second?.filter { + it is IAutopilotPreLaunchStatus + }?.forEachIndexed { index, status -> + val shl = 1 shl index + if (status.isException()) { + ret = ret or shl + } + } + return ret + } + interface IStatusListener { fun onStatusChanged(data: List, hasException: Boolean) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt index 1cff920d33..44d6ddc1ee 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt @@ -1,8 +1,5 @@ package com.zhjt.mogo_core_function_devatools.status.entity -import com.mogo.eagle.core.data.status.StatusSummaryEntity -import com.mogo.eagle.core.function.api.autopilot.* -import com.mogo.eagle.core.function.call.autopilot.* import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* @@ -250,7 +247,7 @@ class OverViewStatus(var hasException: Boolean = false): Status() { fun String.toState(msg: String?): Tracing? { val ss = msg?.split("|") var extra: Map? = null - if (ss != null && ss.isNotEmpty()) { + if (!ss.isNullOrEmpty()) { val sb = StringBuilder() for (element in ss) { sb.append(element) @@ -290,3 +287,70 @@ fun String.toState(msg: String?): Tracing? { else -> null } } + +interface IAutopilotPreLaunchStatus + +/** + * 速度 + */ +data class SpeedStatus(val speed: Float): Status(), IAutopilotPreLaunchStatus { + + + override fun isException(): Boolean { + return false + } +} + +/** + * 方向盘转角 + */ +data class SteerStatus(val angle: Float, var isError: Boolean = false): Status(), IAutopilotPreLaunchStatus { + + + override fun isException(): Boolean { + return isError + } +} + +/** + * 油门 + */ +data class AcceleratorStatus(val angle: Float, var isError: Boolean = false): Status(), IAutopilotPreLaunchStatus { + + override fun isException(): Boolean { + return isError + } +} + +/** + * 刹车 + */ +data class BrakeStatus(val angle: Float, var isError: Boolean = false): Status(), IAutopilotPreLaunchStatus { + + override fun isException(): Boolean { + return isError + } +} + + +/** + * 双闪 + */ +data class DoubleFlashStatus(val type: Int, var isError: Boolean = false): Status(), IAutopilotPreLaunchStatus { + + override fun isException(): Boolean { + return isError + } +} + +/** + * 挡位 + */ +data class GearStatus(val value: Int, var isError: Boolean = false): Status(), IAutopilotPreLaunchStatus { + + override fun isException(): Boolean { + return isError + } +} + + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/AcceleratorImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/AcceleratorImpl.kt new file mode 100644 index 0000000000..5a9d99b29d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/AcceleratorImpl.kt @@ -0,0 +1,57 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.autopilot + +import android.content.Context +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisThrottleStateListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisThrottleStateListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.zhjt.mogo.adas.data.bean.UnableLaunchData +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_THROTTLE +import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow + +internal class AcceleratorImpl(ctx: Context): IFlow(ctx), IMoGoChassisThrottleStateListener, IMoGoAutopilotActionsListener { + + + companion object { + private const val TAG = "AcceleratorImpl" + } + + @Volatile + private var last: Float? = null + + @Volatile + private var isError: Boolean = false + + override fun onCreate() { + CallerChassisThrottleStateListenerManager.addListener(TAG, this) + CallerAutopilotActionsListenerManager.addListener(TAG, this) + } + + override fun onDestroy() { + super.onDestroy() + CallerChassisThrottleStateListenerManager.removeListener(TAG) + CallerAutopilotActionsListenerManager.removeListener(TAG) + } + + override fun onAutopilotThrottle(throttle: Float) { + super.onAutopilotThrottle(throttle) + if (last != throttle) { + send(AcceleratorStatus(throttle, isError)) + last = throttle + } + } + + override fun onAutopilotAbility(isAutopilotAbility: Boolean, unableLaunchData: UnableLaunchData?, unableAutopilotReasons: ArrayList?) { + Logger.d(TAG, "onAutopilotAbility->($isAutopilotAbility, $unableLaunchData, ${unableAutopilotReasons?.joinToString(",")}") + if (!isAutopilotAbility && unableAutopilotReasons != null && unableAutopilotReasons.find { it.unableType == CHASSIS_THROTTLE } != null) { + isError = true + send(AcceleratorStatus(last ?: 0.0f, true)) + } else { + isError = false + send(AcceleratorStatus(last ?: 0.0f, false)) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/BrakeImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/BrakeImpl.kt new file mode 100644 index 0000000000..4843878981 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/BrakeImpl.kt @@ -0,0 +1,60 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.autopilot + +import android.content.Context +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisBrakeStateListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisBrakeStateListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.zhjt.mogo.adas.data.bean.UnableLaunchData +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_BRAKE +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_THROTTLE +import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus +import com.zhjt.mogo_core_function_devatools.status.entity.BrakeStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.flow.autopilot.AcceleratorImpl.Companion + +internal class BrakeImpl(ctx: Context): IFlow(ctx), IMoGoChassisBrakeStateListener, IMoGoAutopilotActionsListener { + + companion object { + private const val TAG = "BrakeImpl" + } + + @Volatile + private var last: Float = 0.0f + + @Volatile + private var isError: Boolean = false + + override fun onCreate() { + CallerChassisBrakeStateListenerManager.addListener(TAG, this) + CallerAutopilotActionsListenerManager.addListener(TAG, this) + } + + override fun onDestroy() { + super.onDestroy() + CallerChassisBrakeStateListenerManager.removeListener(TAG) + CallerAutopilotActionsListenerManager.removeListener(TAG) + } + + override fun onAutopilotBrake(brake: Float) { + super.onAutopilotBrake(brake) + + if (last != brake) { + send(BrakeStatus(brake, isError)) + last = brake + } + } + + override fun onAutopilotAbility(isAutopilotAbility: Boolean, unableLaunchData: UnableLaunchData?, unableAutopilotReasons: ArrayList?) { + Logger.d(TAG, "onAutopilotAbility->($isAutopilotAbility, $unableLaunchData, ${unableAutopilotReasons?.joinToString(",")}") + if (!isAutopilotAbility && unableAutopilotReasons != null && unableAutopilotReasons.find { it.unableType == CHASSIS_BRAKE } != null) { + isError = true + send(BrakeStatus(last, true)) + } else { + isError = false + send(BrakeStatus(last, false)) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/DoubleFlashImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/DoubleFlashImpl.kt new file mode 100644 index 0000000000..ef573ff078 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/DoubleFlashImpl.kt @@ -0,0 +1,58 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.autopilot + +import android.content.Context +import chassis.Chassis.LightSwitch +import chassis.Chassis.LightSwitch.LIGHT_FLASH +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLamplightListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLamplightListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.zhjt.mogo.adas.data.bean.UnableLaunchData +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_HAZARD_LIGHTS +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_THROTTLE +import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus +import com.zhjt.mogo_core_function_devatools.status.entity.DoubleFlashStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow + +internal class DoubleFlashImpl(ctx: Context): IFlow(ctx), IMoGoChassisLamplightListener, IMoGoAutopilotActionsListener { + + companion object { + private const val TAG = "DoubleFlashImpl" + } + + @Volatile + private var isError: Boolean = false + + override fun onCreate() { + CallerChassisLamplightListenerManager.addListener(TAG, this) + CallerAutopilotActionsListenerManager.addListener(TAG, this) + } + + override fun onDestroy() { + super.onDestroy() + CallerChassisLamplightListenerManager.removeListener(TAG) + CallerAutopilotActionsListenerManager.removeListener(TAG) + } + + override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { + super.onAutopilotLightSwitchData(lightSwitch) + Logger.d(TAG, "-- onAutopilotLightSwitchData --: $lightSwitch") + if (lightSwitch == LIGHT_FLASH) { + send(DoubleFlashStatus(lightSwitch.number, isError)) + } + + } + + override fun onAutopilotAbility(isAutopilotAbility: Boolean, unableLaunchData: UnableLaunchData?, unableAutopilotReasons: ArrayList?) { + Logger.d(TAG, "onAutopilotAbility->($isAutopilotAbility, $unableLaunchData, ${unableAutopilotReasons?.joinToString(",")}") + if (!isAutopilotAbility && unableAutopilotReasons != null && unableAutopilotReasons.find { it.unableType == CHASSIS_HAZARD_LIGHTS } != null) { + isError = true + send(DoubleFlashStatus(LIGHT_FLASH.number, true)) + } else { + isError = false + send(DoubleFlashStatus(LIGHT_FLASH.number, false)) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/GearImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/GearImpl.kt new file mode 100644 index 0000000000..75edfd15a1 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/GearImpl.kt @@ -0,0 +1,57 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.autopilot + +import android.content.Context +import chassis.Chassis.GearPosition +import chassis.Chassis.GearPosition.GEAR_NONE +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisGearStateListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisGearStateListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.zhjt.mogo.adas.data.bean.UnableLaunchData +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_GEAR +import com.zhjt.mogo_core_function_devatools.status.entity.GearStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow + +internal class GearImpl(ctx: Context): IFlow(ctx), IMoGoChassisGearStateListener, IMoGoAutopilotActionsListener { + + companion object { + private const val TAG = "GeerImpl" + } + + @Volatile + private var last: GearPosition = GEAR_NONE + + @Volatile + private var isError: Boolean = false + + override fun onCreate() { + CallerChassisGearStateListenerManager.addListener(TAG, this) + CallerAutopilotActionsListenerManager.addListener(TAG, this) + } + + override fun onDestroy() { + super.onDestroy() + CallerChassisGearStateListenerManager.removeListener(TAG) + CallerAutopilotActionsListenerManager.removeListener(TAG) + } + + override fun onAutopilotGearData(gear: GearPosition) { + if (last != gear) { + send(GearStatus(gear.number, isError)) + last = gear + } + } + + override fun onAutopilotAbility(isAutopilotAbility: Boolean, unableLaunchData: UnableLaunchData?, unableAutopilotReasons: ArrayList?) { + Logger.d(TAG, "onAutopilotAbility->($isAutopilotAbility, $unableLaunchData, ${unableAutopilotReasons?.joinToString(",")}") + if (!isAutopilotAbility && unableAutopilotReasons != null && unableAutopilotReasons.find { it.unableType == CHASSIS_GEAR } != null) { + isError = true + send(GearStatus(last.number, true)) + } else { + isError = false + send(GearStatus(last.number, false)) + } + } +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SpeedImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SpeedImpl.kt new file mode 100644 index 0000000000..9978b4ce60 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SpeedImpl.kt @@ -0,0 +1,44 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.autopilot + +import android.content.Context +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisThrottleStateListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisThrottleStateListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.zhjt.mogo.adas.data.bean.UnableLaunchData +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_THROTTLE +import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus +import com.zhjt.mogo_core_function_devatools.status.entity.SpeedStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow + +internal class SpeedImpl(ctx: Context): IFlow(ctx), IMoGoChassisLocationGCJ02Listener { + + + companion object { + private const val TAG = "SpeedImpl" + } + + @Volatile + private var last: Float? = null + + override fun onCreate() { + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this) + } + + override fun onDestroy() { + super.onDestroy() + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (last != mogoLocation?.gnssSpeed) { + send(SpeedStatus(mogoLocation?.gnssSpeed ?: 0f)) + last = mogoLocation?.gnssSpeed + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SteerImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SteerImpl.kt new file mode 100644 index 0000000000..d82f7d1e72 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/autopilot/SteerImpl.kt @@ -0,0 +1,50 @@ +package com.zhjt.mogo_core_function_devatools.status.flow.autopilot + +import android.content.Context +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisSteeringStateListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisSteeringStateListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.zhjt.mogo.adas.data.bean.UnableLaunchData +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason.UnableType.CHASSIS_STEERING +import com.zhjt.mogo_core_function_devatools.status.entity.SteerStatus +import com.zhjt.mogo_core_function_devatools.status.flow.IFlow + +internal class SteerImpl(ctx: Context): IFlow(ctx), IMoGoChassisSteeringStateListener, IMoGoAutopilotActionsListener { + + companion object { + private const val TAG = "SteerImpl" + } + + @Volatile + private var last: Float = 0f + + override fun onCreate() { + CallerChassisSteeringStateListenerManager.addListener(TAG, this) + CallerAutopilotActionsListenerManager.addListener(TAG, this) + } + + override fun onDestroy() { + super.onDestroy() + CallerChassisSteeringStateListenerManager.removeListener(TAG) + CallerAutopilotActionsListenerManager.removeListener(TAG) + } + + override fun onAutopilotSteeringData(steering: Float) { + if (last != steering) { + send(SteerStatus(steering)) + last = steering + } + } + + override fun onAutopilotAbility(isAutopilotAbility: Boolean, unableLaunchData: UnableLaunchData?, unableAutopilotReasons: ArrayList?) { + Logger.d(TAG, "onAutopilotAbility->($isAutopilotAbility, $unableLaunchData, ${unableAutopilotReasons?.joinToString(",")}") + if (!isAutopilotAbility && unableAutopilotReasons != null && unableAutopilotReasons.find { it.unableType == CHASSIS_STEERING } != null) { + send(SteerStatus(last, true)) + } else { + send(SteerStatus(last, false)) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt index b0376af234..5ff213e815 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt @@ -4,7 +4,6 @@ import androidx.lifecycle.* import com.mogo.eagle.core.function.call.autopilot.* import com.zhjt.mogo_core_function_devatools.status.entity.* //import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus -import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.UNKNOWN import java.util.concurrent.atomic.* import kotlin.Pair @@ -21,6 +20,12 @@ internal class StatusModel : ViewModel() { it += RTKStatus("", -1) // it += NetStatus(false) // it += GpsStatus(enabled = false, isGranted = false) + it += SteerStatus(0.0f) + it += AcceleratorStatus(0.0f) + it += BrakeStatus(0.0f) + it += DoubleFlashStatus(0) + it += GearStatus(0) + it += SpeedStatus(0f) }) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/AutoPilotLaunchBeforeView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/AutoPilotLaunchBeforeView.kt new file mode 100644 index 0000000000..9503b17c0f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/AutoPilotLaunchBeforeView.kt @@ -0,0 +1,112 @@ +package com.zhjt.mogo_core_function_devatools.status.ui + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import chassis.Chassis.GearPosition +import chassis.Chassis.GearPosition.GEAR_D +import chassis.Chassis.GearPosition.GEAR_N +import chassis.Chassis.GearPosition.GEAR_NONE +import chassis.Chassis.GearPosition.GEAR_P +import chassis.Chassis.GearPosition.GEAR_R +import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.status.StatusManager +import com.zhjt.mogo_core_function_devatools.status.StatusManager.IStatusListener +import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus +import com.zhjt.mogo_core_function_devatools.status.entity.BrakeStatus +import com.zhjt.mogo_core_function_devatools.status.entity.DoubleFlashStatus +import com.zhjt.mogo_core_function_devatools.status.entity.GearStatus +import com.zhjt.mogo_core_function_devatools.status.entity.IAutopilotPreLaunchStatus +import com.zhjt.mogo_core_function_devatools.status.entity.SpeedStatus +import com.zhjt.mogo_core_function_devatools.status.entity.Status +import com.zhjt.mogo_core_function_devatools.status.entity.SteerStatus +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.gear_d +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.gear_n +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.gear_p +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.gear_r +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.iv_brake_or_accelerator +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.iv_double_flash +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.iv_steer +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.speed +import kotlinx.android.synthetic.main.layout_autopilot_launch_before.view.tv_brake_or_accelerator + +class AutoPilotLaunchBeforeView: LinearLayout, IStatusListener { + + companion object { + private const val TAG = "AutoPilotLaunchBeforeView" + } + + constructor(context: Context?) : this(context, null) + constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0) + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + LayoutInflater.from(context).inflate(R.layout.layout_autopilot_launch_before, this, true) + background = ContextCompat.getDrawable(context!!, R.drawable.bg_autopilot_launch_before) + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + StatusManager.addListener(TAG, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + StatusManager.removeListener(TAG) + } + + override fun onStatusChanged(data: List, hasException: Boolean) { + data.filter { it is IAutopilotPreLaunchStatus }.forEach { status -> + when(status) { + is GearStatus -> { + val position = try { GearPosition.valueOf(status.value) } catch (ignore: Throwable) { GEAR_NONE } + gear_n?.isPressed = false + gear_n?.isSelected = false + gear_p?.isPressed = false + gear_p?.isSelected =false + gear_r?.isPressed = false + gear_r?.isSelected = false + gear_d?.isPressed = false + gear_d?.isSelected = false + if (position != GEAR_NONE) { + val isError = status.isError + when(position) { + GEAR_N -> if (isError) gear_n?.isPressed = true else gear_n?.isSelected = true + GEAR_R -> if (isError) gear_r?.isPressed = true else gear_r?.isSelected = true + GEAR_P -> if (isError) gear_p?.isPressed = true else gear_p?.isSelected = true + GEAR_D -> if (isError) gear_d?.isPressed = true else gear_d?.isSelected = true + else -> {} + } + } + } + is AcceleratorStatus -> { + val isError = status.isError + val angle = status.angle + iv_brake_or_accelerator?.isSelected = isError + tv_brake_or_accelerator?.text = "a: $angle" + } + is BrakeStatus -> { + val isError = status.isError + val angle = status.angle + iv_brake_or_accelerator?.isSelected = isError + tv_brake_or_accelerator?.text = "a: -$angle" + } + is DoubleFlashStatus -> { + val isError = status.isError + iv_double_flash?.isSelected = isError + } + is SteerStatus -> { + val isError = status.isError + iv_steer?.isSelected = isError + } + is SpeedStatus -> { + speed?.text = "${status.speed.toInt()}" + } + else -> { + throw IllegalStateException() + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt index b7c6924d50..235c2631e4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusView.kt @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.* import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.rv.divider.* import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.status.entity.IAutopilotPreLaunchStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.model.StatusModel import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter @@ -47,12 +48,13 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra .horizontalInnerSpace(10.PX) .build() ) - val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second) }?.also { adapter -> itx.adapter = adapter } + val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second.filter { it !is IAutopilotPreLaunchStatus }) }?.also { adapter -> itx.adapter = adapter } adapter?.let { _ -> model.status.observeForever(Observer>> { data -> val old = adapter.data - val result = DiffUtil.calculateDiff(StatusDiffCallback(old, data.second)) - adapter.data = data.second + val update = data.second.filter { it !is IAutopilotPreLaunchStatus } + val result = DiffUtil.calculateDiff(StatusDiffCallback(old, update)) + adapter.data = update result.dispatchUpdatesTo(adapter) }.also { observer = it }) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index acf16bed1f..a1c611de11 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -18,7 +18,7 @@ import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter.StatusViewHolder import me.jessyan.autosize.AutoSizeCompat -internal class StatusAdapter(val ctx: Context, var data: ArrayList): RecyclerView.Adapter() { +internal class StatusAdapter(val ctx: Context, var data: List): RecyclerView.Adapter() { companion object { const val TAG = "StatusAdapter" @@ -169,6 +169,9 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec is OverViewStatus -> { "" } + else -> { + throw AssertionError() + } } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt index 71d80bfa97..039f7a2731 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/diff/StatusDiffCallback.kt @@ -3,7 +3,7 @@ package com.zhjt.mogo_core_function_devatools.status.ui.diff import androidx.recyclerview.widget.* import com.zhjt.mogo_core_function_devatools.status.entity.Status -internal class StatusDiffCallback(private val old: ArrayList, private val update: ArrayList): DiffUtil.Callback() { +internal class StatusDiffCallback(private val old: List, private val update: List): DiffUtil.Callback() { override fun getOldListSize(): Int = old.size diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/color/color_geer_position_selector.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/color/color_geer_position_selector.xml new file mode 100644 index 0000000000..6809485824 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/color/color_geer_position_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_brake_or_accelerator_blue.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_brake_or_accelerator_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ace5bc5a7e44fb6754fe9b57775b98e13c6330ef GIT binary patch literal 4714 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 b_0Rtwc_B+sVh%#f00000NkvXXu0mjfpTVAD literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_double_flash_blue.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_double_flash_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f86a5ef72cc35aec7065022c15f2a7f024ff72db GIT binary patch literal 4750 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_double_flash_red.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_double_flash_red.png new file mode 100644 index 0000000000000000000000000000000000000000..47940a6365c32f60f47a6ff11d4ef2c530cfe998 GIT binary patch literal 5048 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 WBiOuu6Br5r0000 + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_double_flash.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_double_flash.xml new file mode 100644 index 0000000000..ac3f9c4786 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_double_flash.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_launch_before.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_launch_before.xml new file mode 100644 index 0000000000..677145e413 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_launch_before.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_steer.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_steer.xml new file mode 100644 index 0000000000..7d4447bef5 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_autopilot_steer.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_geer_position.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_geer_position.xml new file mode 100644 index 0000000000..57a7b0ed33 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_geer_position.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_speed_chart.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_speed_chart.xml new file mode 100644 index 0000000000..ecd8466379 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_speed_chart.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/speed_chart_stroke.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/speed_chart_stroke.xml new file mode 100644 index 0000000000..49b75e52c0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/speed_chart_stroke.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_autopilot_launch_before.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_autopilot_launch_before.xml new file mode 100644 index 0000000000..6c2c8659bf --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_autopilot_launch_before.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index d211d737bd..5e9371809a 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -291,4 +291,8 @@ interface IDevaToolsProvider : IProvider { fun usage(): IMoGoCpuUsageProvider? fun setNetworkMode(isDebug: Boolean) + + fun attachAutopilotStatusView(ctx: Context, group: ViewGroup) + + fun getExceptionStatusBeforeLaunchAutopilot(): Int } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index b8d30fed0c..cc3f580781 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -351,4 +351,8 @@ object CallerDevaToolsManager { fun setNetworkMode(isDebug: Boolean) { devaToolsProviderApi?.setNetworkMode(isDebug) } + + fun attachAutopilotBeforeLaunchView(ctx: Context, group: ViewGroup) { + devaToolsProviderApi?.attachAutopilotStatusView(ctx, group) + } } \ No newline at end of file