[6.5.1_exam]合并Taxi考试到主分支

This commit is contained in:
xuxinchao
2024-07-30 18:44:38 +08:00
parent 2c8e80eca8
commit cca38246cc
21 changed files with 965 additions and 25 deletions

View File

@@ -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 主驾是否有人

View File

@@ -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)
}
}

View File

@@ -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) {
}
}

View File

@@ -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<String, Any>): BaseResponse<Any>
}

View File

@@ -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
}
}
}
}

View File

@@ -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<Int, Int> = ConcurrentHashMap<Int, Int>()
fun manualControl(onSuccess: (() -> Unit), onError: ((String) -> Unit)) {
request<BaseResponse<Any>> {
start {
retryMap[MANUAL_CONTROL] = retryMap[MANUAL_CONTROL] ?: 0 + 1
}
loader {
apiCall {
val map = mutableMapOf<String, Any>()
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<BaseResponse<Any>> {
start {
retryMap[OVER_TAKE] = retryMap[OVER_TAKE] ?: 0 + 1
}
loader {
apiCall {
val map = mutableMapOf<String, Any>()
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<BaseResponse<Any>> {
start {
retryMap[LINE_TO_LEFT] = retryMap[LINE_TO_LEFT] ?: 0 + 1
}
loader {
apiCall {
val map = mutableMapOf<String, Any>()
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<BaseResponse<Any>> {
start {
retryMap[LINE_TO_RIGHT] = retryMap[LINE_TO_RIGHT] ?: 0 + 1
}
loader {
apiCall {
val map = mutableMapOf<String, Any>()
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<BaseResponse<Any>> {
start {
retryMap[PULL_OVER] = retryMap[PULL_OVER] ?: 0 + 1
}
loader {
apiCall {
val map = mutableMapOf<String, Any>()
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<BaseResponse<Any>> {
start {
retryMap[EMERGENCY_STOP] = retryMap[EMERGENCY_STOP] ?: 0 + 1
}
loader {
apiCall {
val map = mutableMapOf<String, Any>()
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<BaseResponse<Any>> {
start {
retryMap[TAKE_OVER_REQUEST] = retryMap[TAKE_OVER_REQUEST] ?: 0 + 1
}
loader {
apiCall {
val map = mutableMapOf<String, Any>()
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!!)
}
}
}
}
}

View File

@@ -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)
}
}
}

View File

@@ -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)
}
}
}

View File

@@ -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
}
}
}
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#A7D3F6"
android:endColor="#8C9AFF"
/>
<corners android:radius="20px" />
</shape>

View File

@@ -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"
>
<Button
android:id="@+id/mStopCarBtn"
@@ -42,6 +43,7 @@
/>
<com.mogo.eagle.core.function.hmi.ui.setting.SeatPressureSettingView
android:id="@+id/seatPressureSettingView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/mStartCarBtn"
@@ -51,7 +53,13 @@
/>
<com.mogo.eagle.core.function.hmi.ui.vehicle.TakeOverAutopilotView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/seatPressureSettingView"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="@dimen/dp_631"
android:layout_height="@dimen/dp_1250"
>
<Button
android:id="@+id/btn_manual_control"
style="?android:attr/borderlessButtonStyle"
android:layout_width="@dimen/dp_502"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_80"
android:background="@drawable/remote_take_over_autopilot_bg"
android:gravity="center"
android:text="@string/hmi_take_over"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_34"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_over_take"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
android:gravity="center"
android:text="@string/hmi_over_take"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
app:layout_constraintStart_toStartOf="@+id/btn_manual_control"
app:layout_constraintTop_toBottomOf="@+id/btn_manual_control" />
<Button
android:id="@+id/btn_line_to_left"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
android:gravity="center"
android:text="@string/hmi_line_to_left"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
app:layout_constraintEnd_toStartOf="@+id/btn_line_to_right"
app:layout_constraintStart_toEndOf="@+id/btn_over_take"
app:layout_constraintTop_toBottomOf="@+id/btn_manual_control" />
<Button
android:id="@+id/btn_line_to_right"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
android:gravity="center"
android:text="@string/hmi_line_to_right"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
app:layout_constraintEnd_toEndOf="@+id/btn_manual_control"
app:layout_constraintTop_toBottomOf="@+id/btn_manual_control" />
<Button
android:id="@+id/btn_pull_over"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
android:gravity="center"
android:text="@string/hmi_pull_over"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
app:layout_constraintStart_toStartOf="@+id/btn_manual_control"
app:layout_constraintTop_toBottomOf="@+id/btn_over_take" />
<Button
android:id="@+id/btn_emergency_stop"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
android:gravity="center"
android:text="@string/hmi_emergency_stop"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
app:layout_constraintEnd_toStartOf="@+id/btn_line_to_right"
app:layout_constraintStart_toEndOf="@+id/btn_over_take"
app:layout_constraintTop_toBottomOf="@+id/btn_line_to_left" />
<Button
android:id="@+id/btn_take_over_request"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
android:gravity="center"
android:text="@string/hmi_take_over_request"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
app:layout_constraintEnd_toEndOf="@+id/btn_manual_control"
app:layout_constraintTop_toBottomOf="@+id/btn_line_to_right" />
<Button
android:id="@+id/btn_take_over_recover"
style="?android:attr/borderlessButtonStyle"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
android:gravity="center"
android:text="@string/hmi_take_over_recover"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
app:layout_constraintTop_toBottomOf="@+id/btn_emergency_stop"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/tb_lane_change"
/>
<ToggleButton
android:id="@+id/tb_lane_change"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/btn_emergency_stop"
app:layout_constraintLeft_toRightOf="@id/btn_take_over_recover"
app:layout_constraintRight_toRightOf="parent"
android:textOff="@string/hmi_open_lane_change"
android:textOn="@string/hmi_close_lane_change"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
android:gravity="center"
/>
<ToggleButton
android:id="@+id/tb_aeb"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/tb_lane_change"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/tb_stop_yield"
android:textOff="@string/hmi_open_aeb"
android:textOn="@string/hmi_close_aeb"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
android:gravity="center"
/>
<ToggleButton
android:id="@+id/tb_stop_yield"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/tb_lane_change"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@id/tb_aeb"
android:textOff="@string/hmi_open_stop_yield"
android:textOn="@string/hmi_close_stop_yield"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
android:gravity="center"
/>
<ToggleButton
android:id="@+id/tb_map_speed"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/tb_aeb"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/tb_ramp"
android:textOff="@string/hmi_open_map_speed"
android:textOn="@string/hmi_close_map_speed"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
android:gravity="center"
/>
<ToggleButton
android:id="@+id/tb_ramp"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_94"
android:layout_marginTop="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/tb_aeb"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@id/tb_map_speed"
android:textOff="@string/hmi_open_ramp"
android:textOn="@string/hmi_close_ramp"
android:textColor="#FF181D6D"
android:textSize="@dimen/sp_30"
android:gravity="center"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -131,6 +131,25 @@
<string name="road_cross_live_tip">蘑菇为您实时护航中,请放心驾驶!</string>
<string name="hmi_take_over">人工接管</string>
<string name="hmi_over_take">超车</string>
<string name="hmi_line_to_left">向左变道</string>
<string name="hmi_line_to_right">向右变道</string>
<string name="hmi_pull_over">靠边停车</string>
<string name="hmi_emergency_stop">应急停车</string>
<string name="hmi_take_over_request">接管请求</string>
<string name="hmi_take_over_recover">恢复自动决策</string>
<string name="hmi_open_lane_change">障碍物模式</string>
<string name="hmi_close_lane_change">障碍物模式</string>
<string name="hmi_open_aeb">制动模式</string>
<string name="hmi_close_aeb">制动模式</string>
<string name="hmi_open_stop_yield">停车</string>
<string name="hmi_close_stop_yield">停车</string>
<string name="hmi_open_map_speed">限速模式</string>
<string name="hmi_close_map_speed">限速模式</string>
<string name="hmi_open_ramp">环岛模式</string>
<string name="hmi_close_ramp">环岛模式</string>
<string name="hmi_main_driver">主驾</string>
<string name="hmi_co_driver">副驾</string>
<string name="hmi_rear_row">后排</string>

View File

@@ -0,0 +1,26 @@
package com.mogo.eagle.core.data.takeover
import androidx.annotation.IntDef
const val MANUAL_CONTROL = 0
const val OVER_TAKE = 1
const val LINE_TO_LEFT = 2
const val LINE_TO_RIGHT = 3
const val PULL_OVER = 4
const val EMERGENCY_STOP = 5
const val TAKE_OVER_REQUEST = 6
@IntDef(
MANUAL_CONTROL,
OVER_TAKE,
LINE_TO_LEFT,
LINE_TO_RIGHT,
PULL_OVER,
EMERGENCY_STOP,
TAKE_OVER_REQUEST
)
@Retention(AnnotationRetention.SOURCE)
annotation class TakeOverAnnotation(vararg val type: Int) {
}

View File

@@ -194,6 +194,46 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider {
*/
fun sendDetouringSpeed(speed: Double): Boolean
/**
* AEB开关
* isEnable = true 开启
* isEnable = false 关闭
* @return boolean
*/
fun sendAebCmd(isEnable: Boolean): Boolean
/**
* 限制绕障开关
* isEnable = true 限制绕障
* isEnable = false 正常绕障
* @return boolean
*/
fun sendLaneChangeRestrainValid(isEnable: Boolean): Boolean
/**
* 停车让行线前避让等待开关
* isEnable = true 停车让行线前需要避让等待
* isEnable = false 停车让行线前无需避让等待
* @return boolean
*/
fun sendStopYieldValid(isEnable: Boolean): Boolean
/**
* 地图限速功能开关
* isEnable = true 使用地图限速功能
* isEnable = false 不使用地图限速功能
* @return boolean
*/
fun sendHadmapSpeedLimitValid(isEnable: Boolean): Boolean
/**
* 环岛模式开关
* isEnable = true 环岛模式
* isEnable = false 普通模式
* @return boolean
*/
fun sendRampThetaValid(isEnable: Boolean): Boolean
/**
* 弱网减速停车策略开关
* isEnable = true 使用弱网减速停车策略
@@ -539,6 +579,8 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider {
fun sendPlanningLineChangeCmd(cmd: Int): Boolean
fun sendPlanningPullOverCmd(pullOverCmd: Int): Boolean
/**
* 设置座椅压力接口
* @param driver 主驾是否有人

View File

@@ -12,6 +12,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.apm.*
import com.mogo.eagle.core.function.api.devatools.block.*
import com.mogo.eagle.core.function.api.devatools.strict.*
@@ -321,4 +322,9 @@ interface IDevaToolsProvider : IProvider {
* 是否开启引导线动效
*/
fun setRouteDynamicColorEnable(enable: Boolean)
/**
* 接管
*/
fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int)
}

View File

@@ -3,8 +3,8 @@ package com.mogo.eagle.core.function.api.setting
/**
* 座椅压力事件监听回调接口
*/
interface ISeatPressureEventListener {
interface ITakeOverEventListener {
fun onUpdateBgEvent(isPress: Boolean){}
fun onTakeOverEvent(isShow: Boolean){}
}

View File

@@ -382,6 +382,56 @@ object CallerAutoPilotControlManager {
return providerApi?.sendDetouringSpeed(speed)
}
/**
* AEB开关
* isEnable = true 开启
* isEnable = false 关闭
* @return boolean
*/
fun sendAebCmd(isEnable: Boolean): Boolean?{
return providerApi?.sendAebCmd(isEnable)
}
/**
* 限制绕障开关
* isEnable = true 限制绕障
* isEnable = false 正常绕障
* @return boolean
*/
fun sendLaneChangeRestrainValid(isEnable: Boolean): Boolean?{
return providerApi?.sendLaneChangeRestrainValid(isEnable)
}
/**
* 停车让行线前避让等待开关
* isEnable = true 停车让行线前需要避让等待
* isEnable = false 停车让行线前无需避让等待
* @return boolean
*/
fun sendStopYieldValid(isEnable: Boolean): Boolean?{
return providerApi?.sendStopYieldValid(isEnable)
}
/**
* 地图限速功能开关
* isEnable = true 使用地图限速功能
* isEnable = false 不使用地图限速功能
* @return boolean
*/
fun sendHadmapSpeedLimitValid(isEnable: Boolean): Boolean?{
return providerApi?.sendHadmapSpeedLimitValid(isEnable)
}
/**
* 环岛模式开关
* isEnable = true 环岛模式
* isEnable = false 普通模式
* @return boolean
*/
fun sendRampThetaValid(isEnable: Boolean): Boolean?{
return providerApi?.sendRampThetaValid(isEnable)
}
/**
* 弱网减速停车策略开关
* isEnable = true 使用弱网减速停车策略
@@ -846,6 +896,10 @@ object CallerAutoPilotControlManager {
return providerApi?.sendPlanningLineChangeCmd(cmd) ?: false
}
fun sendPlanningPullOverCmd(pullOverCmd: Int): Boolean{
return providerApi?.sendPlanningPullOverCmd(pullOverCmd)?: false
}
/**
* 设置座椅压力接口
* @param driver 主驾是否有人

View File

@@ -13,6 +13,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.*
import com.mogo.eagle.core.function.api.devatools.download.*
@@ -400,4 +401,11 @@ object CallerDevaToolsManager {
fun setRouteDynamicColorEnable(enable: Boolean) {
devaToolsProviderApi?.setRouteDynamicColorEnable(enable)
}
/**
* 接管
*/
fun takeOver(@TakeOverAnnotation takeOverAnnotation: Int) {
devaToolsProviderApi?.takeOver(takeOverAnnotation)
}
}

View File

@@ -1,19 +1,18 @@
package com.mogo.eagle.core.function.call.setting
import com.mogo.eagle.core.function.api.setting.ISeatPressureEventListener
import com.mogo.eagle.core.function.api.setting.ITakeOverEventListener
import com.mogo.eagle.core.function.call.base.CallerBase
import java.util.concurrent.ConcurrentHashMap
/**
* 座椅压力事件监听管理
* 接管请求事件监听管理
*/
object CallerSeatPressureManager: CallerBase<ISeatPressureEventListener>() {
object CallerTakeOverManager: CallerBase<ITakeOverEventListener>() {
fun invokeUpdateBgEvent(isPress: Boolean){
fun invokeTakeOverEvent(isShow: Boolean){
M_LISTENERS.forEach {
val tag = it.key
val listener = it.value
listener.onUpdateBgEvent(isPress)
listener.onTakeOverEvent(isShow)
}
}

View File

@@ -1035,6 +1035,7 @@
<dimen name="dp_1125">1125dp</dimen>
<dimen name="dp_1170">1170dp</dimen>
<dimen name="dp_1200">1200dp</dimen>
<dimen name="dp_1250">1250dp</dimen>
<dimen name="dp_1261">1261dp</dimen>
<dimen name="dp_1300">1300dp</dimen>
<dimen name="dp_1373">1373dp</dimen>