From cca38246cca523aefee38489fda95e7145436717 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 30 Jul 2024 18:44:38 +0800 Subject: [PATCH] =?UTF-8?q?[6.5.1=5Fexam]=E5=90=88=E5=B9=B6Taxi=E8=80=83?= =?UTF-8?q?=E8=AF=95=E5=88=B0=E4=B8=BB=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotControlProvider.kt | 74 +++++ .../DevaToolsProvider.kt | 6 + .../takeover/TakeOverManager.kt | 19 ++ .../takeover/network/TakeOverApiService.kt | 13 + .../takeover/network/TakeOverHost.kt | 22 ++ .../takeover/network/TakeOverNetWorkModel.kt | 288 ++++++++++++++++++ .../hmi/ui/setting/SeatPressureSettingView.kt | 14 - .../hmi/ui/vehicle/TakeOverAutopilotView.kt | 160 ++++++++++ .../function/hmi/ui/vehicle/TakeOverView.kt | 16 +- .../remote_take_over_autopilot_bg.xml | 8 + .../src/main/res/layout/view_exam_setting.xml | 12 +- .../view_remote_take_over_autopilot.xml | 187 ++++++++++++ .../src/main/res/values/strings.xml | 19 ++ .../core/data/takeover/TakeOverRetention.kt | 26 ++ .../IMoGoAutopilotControlProvider.kt | 42 +++ .../api/devatools/IDevaToolsProvider.kt | 6 + ...tListener.kt => ITakeOverEventListener.kt} | 4 +- .../CallerAutoPilotControlManager.kt | 54 ++++ .../call/devatools/CallerDevaToolsManager.kt | 8 + .../call/setting/CallerSeatPressureManager.kt | 11 +- .../src/main/res/values/dimens.xml | 1 + 21 files changed, 965 insertions(+), 25 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/TakeOverManager.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverApiService.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverHost.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverNetWorkModel.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverAutopilotView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/remote_take_over_autopilot_bg.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_remote_take_over_autopilot.xml create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/takeover/TakeOverRetention.kt rename core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/setting/{ISeatPressureEventListener.kt => ITakeOverEventListener.kt} (54%) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 8edb0ea159..c006184a30 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -637,6 +637,76 @@ class MoGoAutopilotControlProvider : return AdasManager.getInstance().sendDetouringSpeed(speed) > -1 } + /** + * AEB开关 + * isEnable = true 开启 + * isEnable = false 关闭 + * @return boolean + */ + override fun sendAebCmd(isEnable: Boolean): Boolean { + return if(isEnable){ + AdasManager.getInstance().sendAebCmd(1) > -1 + }else{ + AdasManager.getInstance().sendAebCmd(0) > -1 + } + } + + /** + * 限制绕障开关 + * isEnable = true 限制绕障 + * isEnable = false 正常绕障 + * @return boolean + */ + override fun sendLaneChangeRestrainValid(isEnable: Boolean): Boolean { + return if(isEnable){ + AdasManager.getInstance().sendLaneChangeRestrainValid(1) > -1 + }else{ + AdasManager.getInstance().sendLaneChangeRestrainValid(0) > -1 + } + } + + /** + * 停车让行线前避让等待开关 + * isEnable = true 停车让行线前需要避让等待 + * isEnable = false 停车让行线前无需避让等待 + * @return boolean + */ + override fun sendStopYieldValid(isEnable: Boolean): Boolean { + return if(isEnable){ + AdasManager.getInstance().sendStopYieldValid(1) > -1 + }else{ + AdasManager.getInstance().sendStopYieldValid(0) > -1 + } + } + + /** + * 地图限速功能开关 + * isEnable = true 使用地图限速功能 + * isEnable = false 不使用地图限速功能 + * @return boolean + */ + override fun sendHadmapSpeedLimitValid(isEnable: Boolean): Boolean { + return if(isEnable){ + AdasManager.getInstance().sendHadmapSpeedLimitValid(1) > -1 + }else{ + AdasManager.getInstance().sendHadmapSpeedLimitValid(0) > -1 + } + } + + /** + * 环岛模式开关 + * isEnable = true 环岛模式 + * isEnable = false 普通模式 + * @return boolean + */ + override fun sendRampThetaValid(isEnable: Boolean): Boolean { + return if(isEnable){ + AdasManager.getInstance().sendRampThetaValid(1) > -1 + }else{ + AdasManager.getInstance().sendRampThetaValid(0) > -1 + } + } + /** * 弱网减速停车策略开关 * isEnable = true 使用弱网减速停车策略 @@ -1264,6 +1334,10 @@ class MoGoAutopilotControlProvider : return AdasManager.getInstance().sendPlanningLaneChangeCmd(cmd) > -1 } + override fun sendPlanningPullOverCmd(pullOverCmd: Int): Boolean { + return AdasManager.getInstance().sendPlanningPullOverCmd(pullOverCmd) > -1 + } + /** * 设置座椅压力接口 * @param driver 主驾是否有人 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index cf72166d49..164d27a233 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -22,6 +22,7 @@ import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.takeover.TakeOverAnnotation import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.mogo.eagle.core.function.api.devatools.block.IMoGoBlockProvider import com.mogo.eagle.core.function.api.devatools.download.DownloadType @@ -73,6 +74,7 @@ import com.zhjt.mogo_core_function_devatools.status.entity.RouteDownloadStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.ui.AutoPilotLaunchBeforeView import com.zhjt.mogo_core_function_devatools.strict.StrictModeProviderImpl +import com.zhjt.mogo_core_function_devatools.takeover.TakeOverManager import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager import com.zhjt.mogo_core_function_devatools.tts.TtsManager.Companion.ttsManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager @@ -647,4 +649,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { override fun setRouteDynamicColorEnable(enable: Boolean) { mapRouteProvider?.setRouteDynamicColorEnable(enable) } + + override fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int) { + TakeOverManager.takeOverManager.takeOver(takeOverAnnotation) + } } \ 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/takeover/TakeOverManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/TakeOverManager.kt new file mode 100644 index 0000000000..c593766674 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/TakeOverManager.kt @@ -0,0 +1,19 @@ +package com.zhjt.mogo_core_function_devatools.takeover + +import com.mogo.eagle.core.data.takeover.TakeOverAnnotation +import com.zhjt.mogo_core_function_devatools.takeover.network.TakeOverNetWorkModel + +class TakeOverManager { + + companion object { + val takeOverManager: TakeOverManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + TakeOverManager() + } + } + + private val takeOverNetWorkModel = TakeOverNetWorkModel() + + fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int) { + + } +} \ 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/takeover/network/TakeOverApiService.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverApiService.kt new file mode 100644 index 0000000000..2387fb3591 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverApiService.kt @@ -0,0 +1,13 @@ +package com.zhjt.mogo_core_function_devatools.takeover.network + +import com.mogo.eagle.core.data.BaseResponse +import retrofit2.http.* + +interface TakeOverApiService { + + //云端接管 + @Headers("Content-Type:application/json;charset=UTF-8") + @POST("/paralleldriving-service/autocars") + suspend fun takeOver(@Body map: MutableMap): BaseResponse + +} \ 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/takeover/network/TakeOverHost.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverHost.kt new file mode 100644 index 0000000000..5ecff5ef65 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverHost.kt @@ -0,0 +1,22 @@ +package com.zhjt.mogo_core_function_devatools.takeover.network + +import com.mogo.commons.debug.DebugConfig + +class TakeOverHost { + + companion object{ + private const val HOST_DEV = "http://dzt-test.zhidaozhixing.com/" + private const val HOST_RELEASE = "http://dzt.zhidaozhixing.com/" + + fun get(): String{ + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV -> HOST_DEV + DebugConfig.NET_MODE_QA -> HOST_DEV + DebugConfig.NET_MODE_DEMO -> HOST_RELEASE + DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE + else -> HOST_RELEASE + } + } + } + +} \ 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/takeover/network/TakeOverNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverNetWorkModel.kt new file mode 100644 index 0000000000..6455cd4a93 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/takeover/network/TakeOverNetWorkModel.kt @@ -0,0 +1,288 @@ +package com.zhjt.mogo_core_function_devatools.takeover.network + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.takeover.* +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.request +import java.util.concurrent.ConcurrentHashMap + + +class TakeOverNetWorkModel { + + private fun getNetWorkApi(baseUrl: String = TakeOverHost.get()): TakeOverApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(TakeOverApiService::class.java) + } + + private val retryMap: ConcurrentHashMap = ConcurrentHashMap() + + fun manualControl(onSuccess: (() -> Unit), onError: ((String) -> Unit)) { + request> { + start { + retryMap[MANUAL_CONTROL] = retryMap[MANUAL_CONTROL] ?: 0 + 1 + } + loader { + apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["type"] = MANUAL_CONTROL + map["plateNumber"] = AppConfigInfo.plateNumber ?: "" + getNetWorkApi().takeOver(map) + } + } + onSuccess { + if (it.result != null) { + retryMap.remove(MANUAL_CONTROL) + onSuccess.invoke() + } else { + if (retryMap[MANUAL_CONTROL]!! <= 3) { + retryMap[MANUAL_CONTROL] = retryMap[MANUAL_CONTROL]!! + 1 + manualControl(onSuccess, onError) + } else { + onError.invoke("manualControl result is null") + } + } + } + onError { + if (retryMap[MANUAL_CONTROL]!! <= 3) { + retryMap[MANUAL_CONTROL] = retryMap[MANUAL_CONTROL]!! + 1 + manualControl(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + } + } + + fun overTake(onSuccess: (() -> Unit), onError: ((String) -> Unit)) { + request> { + start { + retryMap[OVER_TAKE] = retryMap[OVER_TAKE] ?: 0 + 1 + } + loader { + apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["type"] = OVER_TAKE + map["plateNumber"] = AppConfigInfo.plateNumber ?: "" + getNetWorkApi().takeOver(map) + } + } + onSuccess { + if (it.result != null) { + retryMap.remove(OVER_TAKE) + onSuccess.invoke() + } else { + if (retryMap[OVER_TAKE]!! <= 3) { + retryMap[OVER_TAKE] = retryMap[OVER_TAKE]!! + 1 + manualControl(onSuccess, onError) + } else { + onError.invoke("overTake result is null") + } + } + } + onError { + if (retryMap[OVER_TAKE]!! <= 3) { + retryMap[OVER_TAKE] = retryMap[OVER_TAKE]!! + 1 + manualControl(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + } + } + + fun lineToLeft(onSuccess: (() -> Unit), onError: ((String) -> Unit)) { + request> { + start { + retryMap[LINE_TO_LEFT] = retryMap[LINE_TO_LEFT] ?: 0 + 1 + } + loader { + apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["type"] = LINE_TO_LEFT + map["plateNumber"] = AppConfigInfo.plateNumber ?: "" + getNetWorkApi().takeOver(map) + } + } + onSuccess { + if (it.result != null) { + retryMap.remove(LINE_TO_LEFT) + onSuccess.invoke() + } else { + if (retryMap[LINE_TO_LEFT]!! <= 3) { + retryMap[LINE_TO_LEFT] = retryMap[LINE_TO_LEFT]!! + 1 + manualControl(onSuccess, onError) + } else { + onError.invoke("lineToLeft result is null") + } + } + } + onError { + if (retryMap[LINE_TO_LEFT]!! <= 3) { + retryMap[LINE_TO_LEFT] = retryMap[LINE_TO_LEFT]!! + 1 + manualControl(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + } + } + + fun lineToRight(onSuccess: (() -> Unit), onError: ((String) -> Unit)) { + request> { + start { + retryMap[LINE_TO_RIGHT] = retryMap[LINE_TO_RIGHT] ?: 0 + 1 + } + loader { + apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["type"] = LINE_TO_RIGHT + map["plateNumber"] = AppConfigInfo.plateNumber ?: "" + getNetWorkApi().takeOver(map) + } + } + onSuccess { + if (it.result != null) { + retryMap.remove(LINE_TO_RIGHT) + onSuccess.invoke() + } else { + if (retryMap[LINE_TO_RIGHT]!! <= 3) { + retryMap[LINE_TO_RIGHT] = retryMap[LINE_TO_RIGHT]!! + 1 + manualControl(onSuccess, onError) + } else { + onError.invoke("lineToRight result is null") + } + } + } + onError { + if (retryMap[LINE_TO_RIGHT]!! <= 3) { + retryMap[LINE_TO_RIGHT] = retryMap[LINE_TO_RIGHT]!! + 1 + manualControl(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + } + } + + fun pullOver(onSuccess: (() -> Unit), onError: ((String) -> Unit)) { + request> { + start { + retryMap[PULL_OVER] = retryMap[PULL_OVER] ?: 0 + 1 + } + loader { + apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["type"] = PULL_OVER + map["plateNumber"] = AppConfigInfo.plateNumber ?: "" + getNetWorkApi().takeOver(map) + } + } + onSuccess { + if (it.result != null) { + retryMap.remove(PULL_OVER) + onSuccess.invoke() + } else { + if (retryMap[PULL_OVER]!! <= 3) { + retryMap[PULL_OVER] = retryMap[PULL_OVER]!! + 1 + manualControl(onSuccess, onError) + } else { + onError.invoke("pullOver result is null") + } + } + } + onError { + if (retryMap[PULL_OVER]!! <= 3) { + retryMap[PULL_OVER] = retryMap[PULL_OVER]!! + 1 + manualControl(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + } + } + + fun emergencyStop(onSuccess: (() -> Unit), onError: ((String) -> Unit)) { + request> { + start { + retryMap[EMERGENCY_STOP] = retryMap[EMERGENCY_STOP] ?: 0 + 1 + } + loader { + apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["type"] = EMERGENCY_STOP + map["plateNumber"] = AppConfigInfo.plateNumber ?: "" + getNetWorkApi().takeOver(map) + } + } + onSuccess { + if (it.result != null) { + retryMap.remove(EMERGENCY_STOP) + onSuccess.invoke() + } else { + if (retryMap[EMERGENCY_STOP]!! <= 3) { + retryMap[EMERGENCY_STOP] = retryMap[EMERGENCY_STOP]!! + 1 + manualControl(onSuccess, onError) + } else { + onError.invoke("emergencyStop result is null") + } + } + } + onError { + if (retryMap[EMERGENCY_STOP]!! <= 3) { + retryMap[EMERGENCY_STOP] = retryMap[EMERGENCY_STOP]!! + 1 + manualControl(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + } + } + + fun takeOverRequest(onSuccess: (() -> Unit), onError: ((String) -> Unit)) { + request> { + start { + retryMap[TAKE_OVER_REQUEST] = retryMap[TAKE_OVER_REQUEST] ?: 0 + 1 + } + loader { + apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["type"] = TAKE_OVER_REQUEST + map["plateNumber"] = AppConfigInfo.plateNumber ?: "" + getNetWorkApi().takeOver(map) + } + } + onSuccess { + if (it.result != null) { + retryMap.remove(TAKE_OVER_REQUEST) + onSuccess.invoke() + } else { + if (retryMap[TAKE_OVER_REQUEST]!! <= 3) { + retryMap[TAKE_OVER_REQUEST] = retryMap[TAKE_OVER_REQUEST]!! + 1 + manualControl(onSuccess, onError) + } else { + onError.invoke("takeOverRequest result is null") + } + } + } + onError { + if (retryMap[TAKE_OVER_REQUEST]!! <= 3) { + retryMap[TAKE_OVER_REQUEST] = retryMap[TAKE_OVER_REQUEST]!! + 1 + manualControl(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + } + } + +} \ 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/setting/SeatPressureSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SeatPressureSettingView.kt index f11bae3308..97dc7b7854 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SeatPressureSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SeatPressureSettingView.kt @@ -5,7 +5,6 @@ import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager -import com.mogo.eagle.core.function.call.setting.CallerSeatPressureManager import com.mogo.eagle.core.function.hmi.R import kotlinx.android.synthetic.main.view_seat_pressure_setting.view.tb_co_driver import kotlinx.android.synthetic.main.view_seat_pressure_setting.view.tb_main_driver @@ -42,7 +41,6 @@ class SeatPressureSettingView @JvmOverloads constructor( } mainDriverStatus = isChecked CallerAutoPilotControlManager.sendSeatPressure(mainDriverStatus,coDriverStatus,rearRowStatus) - updateBtnBg(mainDriverStatus,coDriverStatus,rearRowStatus) } //副驾 tb_co_driver.isChecked = coDriverStatus @@ -52,7 +50,6 @@ class SeatPressureSettingView @JvmOverloads constructor( } coDriverStatus = isChecked CallerAutoPilotControlManager.sendSeatPressure(mainDriverStatus,coDriverStatus,rearRowStatus) - updateBtnBg(mainDriverStatus,coDriverStatus,rearRowStatus) } //后排 tb_rear_row.isChecked = rearRowStatus @@ -62,19 +59,8 @@ class SeatPressureSettingView @JvmOverloads constructor( } rearRowStatus = isChecked CallerAutoPilotControlManager.sendSeatPressure(mainDriverStatus,coDriverStatus,rearRowStatus) - updateBtnBg(mainDriverStatus,coDriverStatus,rearRowStatus) } } - //TODO 看是否有需要 - private fun updateBtnBg(driver: Boolean,copilot: Boolean,backRow: Boolean){ - if(driver || copilot || backRow){ - //主驾、副驾、后排只要有一个位置有人则开关按钮就显示有人状态 - CallerSeatPressureManager.invokeUpdateBgEvent(true) - }else{ - //所有座位都没有人则显示无人状态 - CallerSeatPressureManager.invokeUpdateBgEvent(false) - } - } } \ 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/vehicle/TakeOverAutopilotView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverAutopilotView.kt new file mode 100644 index 0000000000..567ad641b7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverAutopilotView.kt @@ -0,0 +1,160 @@ +package com.mogo.eagle.core.function.hmi.ui.vehicle + +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.AutopilotMsg +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.data.takeover.TAKE_OVER_REQUEST +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.SPUtils +import com.mogo.eagle.core.utilcode.util.SoundUtils +import kotlinx.android.synthetic.main.view_remote_take_over_autopilot.view.* +import kotlinx.android.synthetic.main.view_sop_setting.view.* + +class TakeOverAutopilotView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null +) : ConstraintLayout(context, attrs) { + + private var takeOverRequest: Boolean = false + + init { + LayoutInflater.from(context).inflate(R.layout.view_remote_take_over_autopilot, this, true) + initView() + } + + private fun initView() { + //人工接管 + btn_manual_control.setOnClickListener { + // 退出自驾 + CallerAutoPilotControlManager.cancelAutoPilot() +// CallerDevaToolsManager.takeOver(MANUAL_CONTROL) + } + //超车 + btn_over_take.setOnClickListener { + // 超车 + CallerAutoPilotControlManager.sendPlanningLineChangeCmd(3) +// CallerDevaToolsManager.takeOver(OVER_TAKE) + } + btn_line_to_left.setOnClickListener { + // 向左变道 + CallerAutoPilotControlManager.sendPlanningLineChangeCmd(1) +// CallerDevaToolsManager.takeOver(LINE_TO_LEFT) + } + btn_line_to_right.setOnClickListener { + // 向右变道 + CallerAutoPilotControlManager.sendPlanningLineChangeCmd(2) +// CallerDevaToolsManager.takeOver(LINE_TO_RIGHT) + } + btn_pull_over.setOnClickListener { + // 靠边停车 + CallerAutoPilotControlManager.sendPlanningPullOverCmd(1) +// CallerDevaToolsManager.takeOver(PULL_OVER) + } + btn_emergency_stop.setOnClickListener { + // 紧急停车 + CallerAutoPilotControlManager.sendPlanningPullOverCmd(3) +// CallerDevaToolsManager.takeOver(EMERGENCY_STOP) + } + //接管请求 + btn_take_over_request.setOnClickListener { + // takeOverRequest 执行时,避免多次提示 + if (takeOverRequest) { + return@setOnClickListener + } + // 接管请求提示 + CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST) + CallerHmiManager.warningV2X( + EventTypeEnumNew.TAKE_OVER_EVENT.poiType, + EventTypeEnumNew.TAKE_OVER_EVENT.content, + EventTypeEnumNew.TAKE_OVER_EVENT.tts, + object : IMoGoWarningStatusListener { + override fun onShow() { + takeOverRequest = true + CallerTakeOverManager.invokeTakeOverEvent(true) + //加入消息盒子 + CallerMsgBoxManager.saveMsgBox( + MsgBoxBean( + MsgBoxType.AUTOPILOT, AutopilotMsg( + EventTypeEnumNew.TAKE_OVER_EVENT.poiType.toInt(), + EventTypeEnumNew.TAKE_OVER_EVENT.content, + EventTypeEnumNew.TAKE_OVER_EVENT.tts, + System.currentTimeMillis() + ) + ) + ) + } + + override fun onDismiss() { + takeOverRequest = false + CallerTakeOverManager.invokeTakeOverEvent(false) + } + },expireTime =3000L, isFromObu = false + ) + SoundUtils.playRing(context) + } + //恢复自动决策 + btn_take_over_recover.setOnClickListener { + CallerAutoPilotControlManager.sendPlanningLineChangeCmd(4) + return@setOnClickListener + } + //AEB开关 + tb_aeb.isChecked = SPUtils.getInstance().getBoolean("aeb",false) + tb_aeb.setOnCheckedChangeListener{ compoundButton, isChecked -> + if(!compoundButton.isPressed){ + return@setOnCheckedChangeListener + } + CallerAutoPilotControlManager.sendAebCmd(isChecked) + SPUtils.getInstance().put("aeb",isChecked) + } + //绕障开关 + tb_lane_change.isChecked = SPUtils.getInstance().getBoolean("lane_change",false) + tb_lane_change.setOnCheckedChangeListener{ compoundButton, isChecked -> + if(!compoundButton.isPressed){ + return@setOnCheckedChangeListener + } + CallerAutoPilotControlManager.sendLaneChangeRestrainValid(isChecked) + SPUtils.getInstance().put("lane_change",isChecked) + } + //停车让行开关 + tb_stop_yield.isChecked = SPUtils.getInstance().getBoolean("stop_yield",false) + tb_stop_yield.setOnCheckedChangeListener{ compoundButton, isChecked -> + if(!compoundButton.isPressed){ + return@setOnCheckedChangeListener + } + CallerAutoPilotControlManager.sendStopYieldValid(isChecked) + SPUtils.getInstance().put("stop_yield",isChecked) + } + //地图限速开关 + tb_map_speed.isChecked = SPUtils.getInstance().getBoolean("map_speed",false) + tb_map_speed.setOnCheckedChangeListener { compoundButton, isChecked -> + if(!compoundButton.isPressed){ + return@setOnCheckedChangeListener + } + CallerAutoPilotControlManager.sendHadmapSpeedLimitValid(isChecked) + SPUtils.getInstance().put("map_speed",isChecked) + } + //环岛模式 + tb_ramp.isChecked = SPUtils.getInstance().getBoolean("ramp",false) + tb_ramp.setOnCheckedChangeListener { compoundButton, isChecked -> + if(!compoundButton.isPressed){ + return@setOnCheckedChangeListener + } + CallerAutoPilotControlManager.sendRampThetaValid(isChecked) + SPUtils.getInstance().put("ramp",isChecked) + } + } + +} \ 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/vehicle/TakeOverView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt index e8829662b7..2531708c98 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TakeOverView.kt @@ -14,10 +14,12 @@ import com.mogo.eagle.core.data.msgbox.V2XMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.autopilot.IMoGoParallelDrivingStatusListener import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.api.setting.ITakeOverEventListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerParallelDrivingListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -33,7 +35,7 @@ class TakeOverView @JvmOverloads constructor( attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener, - IMoGoParallelDrivingStatusListener { + IMoGoParallelDrivingStatusListener,ITakeOverEventListener { companion object { const val TAG = "TakeOverView" @@ -54,6 +56,7 @@ class TakeOverView @JvmOverloads constructor( super.onAttachedToWindow() CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerParallelDrivingListenerManager.addListener(TAG,this) + CallerTakeOverManager.addListener(TAG,this) } override fun onAutopilotStatusResponse(state: Int) { @@ -169,6 +172,7 @@ class TakeOverView @JvmOverloads constructor( super.onDetachedFromWindow() CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerParallelDrivingListenerManager.removeListener(TAG) + CallerTakeOverManager.removeListener(TAG) } /** @@ -300,4 +304,14 @@ class TakeOverView @JvmOverloads constructor( } } + override fun onTakeOverEvent(isShow: Boolean) { + ThreadUtils.runOnUiThread { + if(isShow){ + this@TakeOverView.visibility = View.VISIBLE + }else{ + this@TakeOverView.visibility = View.GONE + } + } + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/remote_take_over_autopilot_bg.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/remote_take_over_autopilot_bg.xml new file mode 100644 index 0000000000..327aebe0ca --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/remote_take_over_autopilot_bg.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_exam_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_exam_setting.xml index 43bdacfd09..d9ab5f9bb6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_exam_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_exam_setting.xml @@ -3,7 +3,8 @@ android:layout_width="@dimen/dp_800" android:layout_height="@dimen/dp_1100" android:background="@color/color_D4D8DC" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + >